Skip to content

Commit

Permalink
Merge branch 'main' of https://github.com/wikimedia/wikipedia-ios int…
Browse files Browse the repository at this point in the history
…o native-editor-lists-actions
  • Loading branch information
mazevedofs committed Jan 10, 2024
2 parents ade32b2 + ec2e21d commit 0f4e7d5
Show file tree
Hide file tree
Showing 16 changed files with 1,046 additions and 132 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ protocol WKEditorInputViewDelegate: AnyObject {
func didTapNumberList(isSelected: Bool)
func didTapIncreaseIndent()
func didTapDecreaseIndent()
func didTapHeading(type: WKEditorInputView.HeadingButtonType)
func didTapStrikethrough(isSelected: Bool)
}

Expand Down Expand Up @@ -225,6 +226,18 @@ class WKEditorInputView: WKComponentView {
])

updateColors()

NotificationCenter.default.addObserver(self, selector: #selector(updateButtonSelectionState(_:)), name: Notification.WKSourceEditorSelectionState, object: nil)
}

// MARK: - Notifications

@objc private func updateButtonSelectionState(_ notification: NSNotification) {
guard let selectionState = notification.userInfo?[Notification.WKSourceEditorSelectionStateKey] as? WKSourceEditorSelectionState else {
return
}

configure(selectionState: selectionState)
}

// MARK: - Overrides
Expand Down Expand Up @@ -287,20 +300,40 @@ class WKEditorInputView: WKComponentView {

switch type {
case .paragraph:
paragraphButton.isSelected.toggle()
paragraphButton.isSelected = true
case .heading:
headerButton.isSelected.toggle()
headerButton.isSelected = true
case .subheading1:
subheader1Button.isSelected.toggle()
subheader1Button.isSelected = true
case .subheading2:
subheader2Button.isSelected.toggle()
subheader2Button.isSelected = true
case .subheading3:
subheader3Button.isSelected.toggle()
subheader3Button.isSelected = true
case .subheading4:
subheader4Button.isSelected.toggle()
subheader4Button.isSelected = true
}

delegate?.didTapHeading(type: type)
})

return UIButton(configuration: configuration, primaryAction: action)
}

func configure(selectionState: WKSourceEditorSelectionState) {
headingButtons.forEach { $0.isSelected = false }

if selectionState.isHeading {
headerButton.isSelected = true
} else if selectionState.isSubheading1 {
subheader1Button.isSelected = true
} else if selectionState.isSubheading2 {
subheader2Button.isSelected = true
} else if selectionState.isSubheading3 {
subheader3Button.isSelected = true
} else if selectionState.isSubheading4 {
subheader4Button.isSelected = true
} else {
paragraphButton.isSelected = true
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ extension WKSourceEditorFormatter {

// MARK: - Expanding selected range methods

private func expandSelectedRangeUpToNearestFormattingStrings(startingFormattingString: String, endingFormattingString: String, in textView: UITextView) {
func expandSelectedRangeUpToNearestFormattingStrings(startingFormattingString: String, endingFormattingString: String, in textView: UITextView) {
if let textPositions = textPositionsCloserToNearestFormattingStrings(startingFormattingString: startingFormattingString, endingFormattingString: endingFormattingString, in: textView) {
textView.selectedTextRange = textView.textRange(from: textPositions.startPosition, to: textPositions.endPosition)
}
Expand Down Expand Up @@ -152,7 +152,7 @@ extension WKSourceEditorFormatter {

// MARK: - Nearby formatting string determination

private func selectedRangeIsSurroundedByFormattingString(formattingString: String, in textView: UITextView) -> Bool {
func selectedRangeIsSurroundedByFormattingString(formattingString: String, in textView: UITextView) -> Bool {
selectedRangeIsSurroundedByFormattingStrings(startingFormattingString: formattingString, endingFormattingString: formattingString, in: textView)
}

Expand All @@ -174,7 +174,7 @@ extension WKSourceEditorFormatter {
return startingString == formattingString
}

private func rangeIsFollowedByFormattingString(range: UITextRange?, formattingString: String, in textView: UITextView) -> Bool {
func rangeIsFollowedByFormattingString(range: UITextRange?, formattingString: String, in textView: UITextView) -> Bool {
guard let range = range,
let newEnd = textView.position(from: range.end, offset: formattingString.count) else {
return false
Expand All @@ -190,7 +190,7 @@ extension WKSourceEditorFormatter {

// MARK: Adding and removing text

private func addStringFormattingCharacters(startingFormattingString: String, endingFormattingString: String, in textView: UITextView) {
func addStringFormattingCharacters(startingFormattingString: String, endingFormattingString: String, in textView: UITextView) {

let startingCursorOffset = startingFormattingString.count
let endingCursorOffset = endingFormattingString.count
Expand All @@ -217,7 +217,7 @@ extension WKSourceEditorFormatter {
}
}

private func removeSurroundingFormattingStringsFromSelectedRange(startingFormattingString: String, endingFormattingString: String, in textView: UITextView) {
func removeSurroundingFormattingStringsFromSelectedRange(startingFormattingString: String, endingFormattingString: String, in textView: UITextView) {

guard let originalSelectedTextRange = textView.selectedTextRange,
let formattingTextStart = textView.position(from: originalSelectedTextRange.start, offset: -startingFormattingString.count),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import Foundation
import ComponentsObjC

extension WKSourceEditorFormatterHeading {
func toggleHeadingFormatting(selectedHeading: WKEditorInputView.HeadingButtonType, currentSelectionState: WKSourceEditorSelectionState, textView: UITextView) {

var currentStateIsParagraph = false
if currentSelectionState.isHeading {
expandSelectedRangeUpToNearestFormattingStrings(startingFormattingString: "==", endingFormattingString: "==", in: textView)
removeSurroundingFormattingStringsFromSelectedRange(startingFormattingString: "==", endingFormattingString: "==", in: textView)
} else if currentSelectionState.isSubheading1 {
expandSelectedRangeUpToNearestFormattingStrings(startingFormattingString: "===", endingFormattingString: "===", in: textView)
removeSurroundingFormattingStringsFromSelectedRange(startingFormattingString: "===", endingFormattingString: "===", in: textView)
} else if currentSelectionState.isSubheading2 {
expandSelectedRangeUpToNearestFormattingStrings(startingFormattingString: "====", endingFormattingString: "====", in: textView)
removeSurroundingFormattingStringsFromSelectedRange(startingFormattingString: "====", endingFormattingString: "====", in: textView)
} else if currentSelectionState.isSubheading3 {
expandSelectedRangeUpToNearestFormattingStrings(startingFormattingString: "=====", endingFormattingString: "=====", in: textView)
removeSurroundingFormattingStringsFromSelectedRange(startingFormattingString: "=====", endingFormattingString: "=====", in: textView)
} else if currentSelectionState.isSubheading4 {
expandSelectedRangeUpToNearestFormattingStrings(startingFormattingString: "======", endingFormattingString: "======", in: textView)
removeSurroundingFormattingStringsFromSelectedRange(startingFormattingString: "======", endingFormattingString: "======", in: textView)
} else {
currentStateIsParagraph = true
}

let currentlySurroundedByLineBreaks = selectedRangeIsSurroundedByFormattingString(formattingString: "\n", in: textView) || textView.selectedRange.location == 0 && rangeIsFollowedByFormattingString(range: textView.selectedTextRange, formattingString: "\n", in: textView)

let surroundingLineBreak = currentStateIsParagraph && !currentlySurroundedByLineBreaks ? "\n" : ""
let startingFormattingString: String
let endingFormattingString: String
switch selectedHeading {
case .paragraph:
return
case .heading:
startingFormattingString = surroundingLineBreak + "=="
endingFormattingString = "==" + surroundingLineBreak
case .subheading1:
startingFormattingString = surroundingLineBreak + "==="
endingFormattingString = "===" + surroundingLineBreak
case .subheading2:
startingFormattingString = surroundingLineBreak + "===="
endingFormattingString = "====" + surroundingLineBreak
case .subheading3:
startingFormattingString = surroundingLineBreak + "====="
endingFormattingString = "=====" + surroundingLineBreak
case .subheading4:
startingFormattingString = surroundingLineBreak + "======"
endingFormattingString = "======" + surroundingLineBreak
}

addStringFormattingCharacters(startingFormattingString: startingFormattingString, endingFormattingString: endingFormattingString, in: textView)
}
}
Loading

0 comments on commit 0f4e7d5

Please sign in to comment.