Skip to content

Commit

Permalink
Merge pull request wikimedia#4694 from wikimedia/native-editor-templa…
Browse files Browse the repository at this point in the history
…te-syntax-highlight-fix

Bug fix - Native Editor template syntax highlights
  • Loading branch information
mazevedofs authored Jan 8, 2024
2 parents 141ec7f + 9b9e319 commit 3371bb9
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ - (instancetype)initWithColors:(WKSourceEditorColors *)colors fonts:(WKSourceEdi
WKSourceEditorCustomKeyVerticalTemplate: [NSNumber numberWithBool:YES]
};

_horizontalTemplateRegex = [[NSRegularExpression alloc] initWithPattern:@"\\{{2}[^\\{\\}\\n]*\\}{2}" options:0 error:nil];
_verticalStartTemplateRegex = [[NSRegularExpression alloc] initWithPattern:@"^\\{{2}[^\\{\\}\\n]*$" options:NSRegularExpressionAnchorsMatchLines error:nil];
_horizontalTemplateRegex = [[NSRegularExpression alloc] initWithPattern:@"\\{{2}[^\\{\\}\\n]*(?:\\{{2}[^\\{\\}\\n]*\\}{2})*[^\\{\\}\\n]*\\}{2}" options:0 error:nil];
_verticalStartTemplateRegex = [[NSRegularExpression alloc] initWithPattern:@"^(?:.*)(\\{{2}[^\\{\\}\\n]*)$" options:NSRegularExpressionAnchorsMatchLines error:nil];
_verticalParameterTemplateRegex = [[NSRegularExpression alloc] initWithPattern:@"^\\s*\\|.*$" options:NSRegularExpressionAnchorsMatchLines error:nil];
_verticalEndTemplateRegex = [[NSRegularExpression alloc] initWithPattern:@"^([^\\{\\}\n]*\\}{2})(?:.)*$" options:NSRegularExpressionAnchorsMatchLines error:nil];
}
Expand Down Expand Up @@ -64,11 +64,12 @@ - (void)addSyntaxHighlightingToAttributedString:(nonnull NSMutableAttributedStri
options:0
range:range
usingBlock:^(NSTextCheckingResult *_Nullable result, NSMatchingFlags flags, BOOL *_Nonnull stop) {
NSRange matchRange = [result rangeAtIndex:0];
NSRange fullMatch = [result rangeAtIndex:0];
NSRange openingTemplateRange = [result rangeAtIndex:1];

if (matchRange.location != NSNotFound) {
[attributedString addAttributes:self.verticalTemplateAttributes range:matchRange];
}
if (fullMatch.location != NSNotFound && openingTemplateRange.location != NSNotFound) {
[attributedString addAttributes:self.verticalTemplateAttributes range:openingTemplateRange];
}
}];

[self.verticalParameterTemplateRegex enumerateMatchesInString:attributedString.string
Expand All @@ -86,12 +87,14 @@ - (void)addSyntaxHighlightingToAttributedString:(nonnull NSMutableAttributedStri
options:0
range:range
usingBlock:^(NSTextCheckingResult *_Nullable result, NSMatchingFlags flags, BOOL *_Nonnull stop) {

NSRange fullMatch = [result rangeAtIndex:0];
NSRange closingTemplateRange = [result rangeAtIndex:1];

if (fullMatch.location != NSNotFound && closingTemplateRange.location != NSNotFound) {
[attributedString addAttributes:self.verticalTemplateAttributes range:closingTemplateRange];
}
if (fullMatch.location != NSNotFound && closingTemplateRange.location != NSNotFound) {
[attributedString addAttributes:self.verticalTemplateAttributes range:closingTemplateRange];
}

}];
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -633,7 +633,43 @@ final class WKSourceEditorFormatterTests: XCTestCase {
XCTAssertEqual(refClosingAttributes[.foregroundColor] as! UIColor, colors.baseForegroundColor, "Incorrect ref formatting")
}

func testVerticalStartTemplate() {
func testHorizontalNestedTemplate() {
let string = "Ford Island ({{lang-haw|Poka {{okina}}Ailana}}) is an"
let mutAttributedString = NSMutableAttributedString(string: string)

for formatter in formatters {
formatter.addSyntaxHighlighting(to: mutAttributedString, in: NSRange(location: 0, length: string.count))
}

var base1Range = NSRange(location: 0, length: 0)
let base1Attributes = mutAttributedString.attributes(at: 0, effectiveRange: &base1Range)

var templateRange = NSRange(location: 0, length: 0)
let templateAttributes = mutAttributedString.attributes(at: 13, effectiveRange: &templateRange)

var base2Range = NSRange(location: 0, length: 0)
let base2Attributes = mutAttributedString.attributes(at: 46, effectiveRange: &base2Range)

// "Ford Island ("
XCTAssertEqual(base1Range.location, 0, "Incorrect base formatting")
XCTAssertEqual(base1Range.length, 13, "Incorrect base formatting")
XCTAssertEqual(base1Attributes[.font] as! UIFont, fonts.baseFont, "Incorrect base formatting")
XCTAssertEqual(base1Attributes[.foregroundColor] as! UIColor, colors.baseForegroundColor, "Incorrect base formatting")

// "{{lang-haw|Poka {{okina}}Ailana}}"
XCTAssertEqual(templateRange.location, 13, "Incorrect template formatting")
XCTAssertEqual(templateRange.length, 33, "Incorrect template formatting")
XCTAssertEqual(templateAttributes[.font] as! UIFont, fonts.baseFont, "Incorrect template formatting")
XCTAssertEqual(templateAttributes[.foregroundColor] as! UIColor, colors.purpleForegroundColor, "Incorrect template formatting")

// ") is an"
XCTAssertEqual(base2Range.location, 46, "Incorrect base formatting")
XCTAssertEqual(base2Range.length, 7, "Incorrect base formatting")
XCTAssertEqual(base2Attributes[.font] as! UIFont, fonts.baseFont, "Incorrect base formatting")
XCTAssertEqual(base2Attributes[.foregroundColor] as! UIColor, colors.baseForegroundColor, "Incorrect base formatting")
}

func testVerticalStartTemplate1() {
let string = "{{Infobox officeholder"
let mutAttributedString = NSMutableAttributedString(string: string)

Expand All @@ -651,6 +687,33 @@ final class WKSourceEditorFormatterTests: XCTestCase {
XCTAssertEqual(templateAttributes[.foregroundColor] as! UIColor, colors.purpleForegroundColor, "Incorrect template formatting")
}

func testVerticalStartTemplate2() {
let string = "ending of previous sentence. {{cite web"
let mutAttributedString = NSMutableAttributedString(string: string)

for formatter in formatters {
formatter.addSyntaxHighlighting(to: mutAttributedString, in: NSRange(location: 0, length: string.count))
}

var baseRange = NSRange(location: 0, length: 0)
let baseAttributes = mutAttributedString.attributes(at: 0, effectiveRange: &baseRange)

var templateRange = NSRange(location: 0, length: 0)
let templateAttributes = mutAttributedString.attributes(at: 29, effectiveRange: &templateRange)

// "ending of previous sentence. "
XCTAssertEqual(baseRange.location, 0, "Incorrect base formatting")
XCTAssertEqual(baseRange.length, 29, "Incorrect base formatting")
XCTAssertEqual(baseAttributes[.font] as! UIFont, fonts.baseFont, "Incorrect base formatting")
XCTAssertEqual(baseAttributes[.foregroundColor] as! UIColor, colors.baseForegroundColor, "Incorrect base formatting")

// "ending of previous sentence. "
XCTAssertEqual(templateRange.location, 29, "Incorrect template formatting")
XCTAssertEqual(templateRange.length, 10, "Incorrect template formatting")
XCTAssertEqual(templateAttributes[.font] as! UIFont, fonts.baseFont, "Incorrect template formatting")
XCTAssertEqual(templateAttributes[.foregroundColor] as! UIColor, colors.purpleForegroundColor, "Incorrect base formatting")
}

func testVerticalParameterTemplate() {
let string = "| genus = Felis"
let mutAttributedString = NSMutableAttributedString(string: string)
Expand Down

0 comments on commit 3371bb9

Please sign in to comment.