From b41a66165833a2cd98829b4104721a87d9a154ef Mon Sep 17 00:00:00 2001 From: Toni Sevener Date: Wed, 6 Dec 2023 11:37:59 -0600 Subject: [PATCH 1/7] Fix selection state when template contained other formatted text --- .../ComponentsObjC/WKSourceEditorFormatterBoldItalics.m | 6 ++---- .../ComponentsObjC/WKSourceEditorFormatterTemplate.m | 3 +-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/Components/Sources/ComponentsObjC/WKSourceEditorFormatterBoldItalics.m b/Components/Sources/ComponentsObjC/WKSourceEditorFormatterBoldItalics.m index 763e2947cd0..d89ef7e9da1 100644 --- a/Components/Sources/ComponentsObjC/WKSourceEditorFormatterBoldItalics.m +++ b/Components/Sources/ComponentsObjC/WKSourceEditorFormatterBoldItalics.m @@ -291,8 +291,7 @@ - (BOOL)attributedString:(NSMutableAttributedString *)attributedString isBoldInR } else { [attributedString enumerateAttributesInRange:range options:nil usingBlock:^(NSDictionary * _Nonnull attrs, NSRange loopRange, BOOL * _Nonnull stop) { - if ((attrs[WKSourceEditorCustomKeyFontBoldItalics] != nil || attrs[WKSourceEditorCustomKeyFontBold] != nil) && - (loopRange.location == range.location && loopRange.length == range.length)) { + if (attrs[WKSourceEditorCustomKeyFontBoldItalics] != nil || attrs[WKSourceEditorCustomKeyFontBold] != nil) { isBold = YES; stop = YES; } @@ -317,8 +316,7 @@ - (BOOL)attributedString:(NSMutableAttributedString *)attributedString isItalics } else { [attributedString enumerateAttributesInRange:range options:nil usingBlock:^(NSDictionary * _Nonnull attrs, NSRange loopRange, BOOL * _Nonnull stop) { - if ((attrs[WKSourceEditorCustomKeyFontBoldItalics] != nil || attrs[WKSourceEditorCustomKeyFontItalics] != nil) && - (loopRange.location == range.location && loopRange.length == range.length)) { + if (attrs[WKSourceEditorCustomKeyFontBoldItalics] != nil || attrs[WKSourceEditorCustomKeyFontItalics] != nil) { isItalics = YES; stop = YES; } diff --git a/Components/Sources/ComponentsObjC/WKSourceEditorFormatterTemplate.m b/Components/Sources/ComponentsObjC/WKSourceEditorFormatterTemplate.m index 5d6272f4a8c..31a8080aa6a 100644 --- a/Components/Sources/ComponentsObjC/WKSourceEditorFormatterTemplate.m +++ b/Components/Sources/ComponentsObjC/WKSourceEditorFormatterTemplate.m @@ -150,8 +150,7 @@ - (BOOL)attributedString:(NSMutableAttributedString *)attributedString isHorizon } else { [attributedString enumerateAttributesInRange:range options:nil usingBlock:^(NSDictionary * _Nonnull attrs, NSRange loopRange, BOOL * _Nonnull stop) { - if ((attrs[WKSourceEditorCustomKeyHorizontalTemplate] != nil) && - (loopRange.location == range.location && loopRange.length == range.length)) { + if (attrs[WKSourceEditorCustomKeyHorizontalTemplate] != nil) { isTemplate = YES; stop = YES; } From 79058826aed689dff991b0bffdfae988a2614a54 Mon Sep 17 00:00:00 2001 From: Toni Sevener Date: Wed, 6 Dec 2023 11:42:25 -0600 Subject: [PATCH 2/7] Add tests --- .../WKSourceEditorTextFrameworkMediatorTests.swift | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Components/Tests/ComponentsTests/WKSourceEditorTextFrameworkMediatorTests.swift b/Components/Tests/ComponentsTests/WKSourceEditorTextFrameworkMediatorTests.swift index 5f01b4b4c71..f42a4d3a062 100644 --- a/Components/Tests/ComponentsTests/WKSourceEditorTextFrameworkMediatorTests.swift +++ b/Components/Tests/ComponentsTests/WKSourceEditorTextFrameworkMediatorTests.swift @@ -121,4 +121,13 @@ final class WKSourceEditorTextFrameworkMediatorTests: XCTestCase { let selectionStates1 = mediator.selectionState(selectedDocumentRange: NSRange(location: 1, length: 0)) XCTAssertFalse(selectionStates1.isHorizontalTemplate) } + + func testHorizontalTemplateButtonSelectionStateFormattedRange() throws { + let text = "Testing inner formatted {{cite web | url=https://en.wikipedia.org | title = The '''Free''' Encyclopedia}} template example." + mediator.textView.attributedText = NSAttributedString(string: text) + + // "cite web | url=https://en.wikipedia.org | title = The '''Free''' Encyclopedia" + let selectionStates = mediator.selectionState(selectedDocumentRange: NSRange(location: 26, length: 77)) + XCTAssertTrue(selectionStates.isHorizontalTemplate) + } } From bb520c5f8877e7842db61fba49fac5f927da46f7 Mon Sep 17 00:00:00 2001 From: Toni Sevener Date: Thu, 7 Dec 2023 13:51:48 -0600 Subject: [PATCH 3/7] Fix regression bug --- .../WKSourceEditorFormatterBoldItalics.m | 28 +++++++++++++++---- .../WKSourceEditorFormatterTemplate.m | 15 ++++++++-- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/Components/Sources/ComponentsObjC/WKSourceEditorFormatterBoldItalics.m b/Components/Sources/ComponentsObjC/WKSourceEditorFormatterBoldItalics.m index d89ef7e9da1..150257dce98 100644 --- a/Components/Sources/ComponentsObjC/WKSourceEditorFormatterBoldItalics.m +++ b/Components/Sources/ComponentsObjC/WKSourceEditorFormatterBoldItalics.m @@ -290,15 +290,23 @@ - (BOOL)attributedString:(NSMutableAttributedString *)attributedString isBoldInR } } else { + __block NSRange unionRange = NSMakeRange(NSNotFound, 0); [attributedString enumerateAttributesInRange:range options:nil usingBlock:^(NSDictionary * _Nonnull attrs, NSRange loopRange, BOOL * _Nonnull stop) { - if (attrs[WKSourceEditorCustomKeyFontBoldItalics] != nil || attrs[WKSourceEditorCustomKeyFontBold] != nil) { - isBold = YES; - stop = YES; + if (attrs[WKSourceEditorCustomKeyFontBoldItalics] != nil || attrs[WKSourceEditorCustomKeyFontBold] != nil) { + if (unionRange.location == NSNotFound) { + unionRange = loopRange; + } else { + unionRange = NSUnionRange(unionRange, loopRange); } + stop = YES; + } }]; + + if (NSEqualRanges(unionRange, range)) { + isBold = YES; + } } - return isBold; } - (BOOL)attributedString:(NSMutableAttributedString *)attributedString isItalicsInRange:(NSRange)range { @@ -315,12 +323,22 @@ - (BOOL)attributedString:(NSMutableAttributedString *)attributedString isItalics } } else { + + __block NSRange unionRange = NSMakeRange(NSNotFound, 0); [attributedString enumerateAttributesInRange:range options:nil usingBlock:^(NSDictionary * _Nonnull attrs, NSRange loopRange, BOOL * _Nonnull stop) { if (attrs[WKSourceEditorCustomKeyFontBoldItalics] != nil || attrs[WKSourceEditorCustomKeyFontItalics] != nil) { - isItalics = YES; + if (unionRange.location == NSNotFound) { + unionRange = loopRange; + } else { + unionRange = NSUnionRange(unionRange, loopRange); + } stop = YES; } }]; + + if (NSEqualRanges(unionRange, range)) { + isItalics = YES; + } } return isItalics; diff --git a/Components/Sources/ComponentsObjC/WKSourceEditorFormatterTemplate.m b/Components/Sources/ComponentsObjC/WKSourceEditorFormatterTemplate.m index 31a8080aa6a..375d432ebeb 100644 --- a/Components/Sources/ComponentsObjC/WKSourceEditorFormatterTemplate.m +++ b/Components/Sources/ComponentsObjC/WKSourceEditorFormatterTemplate.m @@ -149,12 +149,21 @@ - (BOOL)attributedString:(NSMutableAttributedString *)attributedString isHorizon } } else { + __block NSRange unionRange = NSMakeRange(NSNotFound, 0); [attributedString enumerateAttributesInRange:range options:nil usingBlock:^(NSDictionary * _Nonnull attrs, NSRange loopRange, BOOL * _Nonnull stop) { - if (attrs[WKSourceEditorCustomKeyHorizontalTemplate] != nil) { - isTemplate = YES; - stop = YES; + if (attrs[WKSourceEditorCustomKeyHorizontalTemplate] != nil) { + if (unionRange.location == NSNotFound) { + unionRange = loopRange; + } else { + unionRange = NSUnionRange(unionRange, loopRange); } + stop = YES; + } }]; + + if (NSEqualRanges(unionRange, range)) { + isTemplate = YES; + } } return isTemplate; From 2e28b07fb92a94861ada8d975f95703e76b2c5da Mon Sep 17 00:00:00 2001 From: Toni Sevener Date: Thu, 7 Dec 2023 14:06:17 -0600 Subject: [PATCH 4/7] Add more tests --- ...urceEditorTextFrameworkMediatorTests.swift | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/Components/Tests/ComponentsTests/WKSourceEditorTextFrameworkMediatorTests.swift b/Components/Tests/ComponentsTests/WKSourceEditorTextFrameworkMediatorTests.swift index f42a4d3a062..b78e7b99404 100644 --- a/Components/Tests/ComponentsTests/WKSourceEditorTextFrameworkMediatorTests.swift +++ b/Components/Tests/ComponentsTests/WKSourceEditorTextFrameworkMediatorTests.swift @@ -61,6 +61,26 @@ final class WKSourceEditorTextFrameworkMediatorTests: XCTestCase { XCTAssertFalse(selectionStates9.isItalics) } + func testSelectionSpanningNonFormattedState1() throws { + let text = "Testing '''bold with {{template}}''' selection that spans nonbold." + mediator.textView.attributedText = NSAttributedString(string: text) + + // "bold with {{template}}" + let selectionStates = mediator.selectionState(selectedDocumentRange: NSRange(location: 11, length: 22)) + XCTAssertTrue(selectionStates.isBold) + XCTAssertFalse(selectionStates.isHorizontalTemplate) + } + + func testSelectionSpanningNonFormattedState2() throws { + let text = "Testing {{template | '''bold'''}} selection that spans nonbold." + mediator.textView.attributedText = NSAttributedString(string: text) + + // "template | '''bold'''" + let selectionStates1 = mediator.selectionState(selectedDocumentRange: NSRange(location: 10, length: 21)) + XCTAssertFalse(selectionStates1.isBold) + XCTAssertTrue(selectionStates1.isHorizontalTemplate) + } + func testHorizontalTemplateButtonSelectionStateCursor() throws { let text = "Testing simple {{Currentdate}} template example." mediator.textView.attributedText = NSAttributedString(string: text) From 9191d2a44b51158392163f35868bbbfc49fc1fae Mon Sep 17 00:00:00 2001 From: Toni Sevener Date: Thu, 7 Dec 2023 14:09:21 -0600 Subject: [PATCH 5/7] Cleanup - Dry WKSourceEditorFormatterBoldItalics --- .../WKSourceEditorFormatterBoldItalics.m | 49 +++++-------------- 1 file changed, 13 insertions(+), 36 deletions(-) diff --git a/Components/Sources/ComponentsObjC/WKSourceEditorFormatterBoldItalics.m b/Components/Sources/ComponentsObjC/WKSourceEditorFormatterBoldItalics.m index 150257dce98..1f89bd995fc 100644 --- a/Components/Sources/ComponentsObjC/WKSourceEditorFormatterBoldItalics.m +++ b/Components/Sources/ComponentsObjC/WKSourceEditorFormatterBoldItalics.m @@ -278,47 +278,24 @@ - (void)updateFonts:(WKSourceEditorFonts *)fonts inAttributedString:(NSMutableAt #pragma mark - Public - (BOOL)attributedString:(NSMutableAttributedString *)attributedString isBoldInRange:(NSRange)range { - __block BOOL isBold = NO; - if (range.length == 0) { - - if (attributedString.length > range.location) { - NSDictionary *attrs = [attributedString attributesAtIndex:range.location effectiveRange:nil]; - - if (attrs[WKSourceEditorCustomKeyFontBoldItalics] != nil || attrs[WKSourceEditorCustomKeyFontBold] != nil) { - isBold = YES; - } - } - - } else { - __block NSRange unionRange = NSMakeRange(NSNotFound, 0); - [attributedString enumerateAttributesInRange:range options:nil usingBlock:^(NSDictionary * _Nonnull attrs, NSRange loopRange, BOOL * _Nonnull stop) { - if (attrs[WKSourceEditorCustomKeyFontBoldItalics] != nil || attrs[WKSourceEditorCustomKeyFontBold] != nil) { - if (unionRange.location == NSNotFound) { - unionRange = loopRange; - } else { - unionRange = NSUnionRange(unionRange, loopRange); - } - stop = YES; - } - }]; - - if (NSEqualRanges(unionRange, range)) { - isBold = YES; - } - } - - return isBold; + return [self attributedString:attributedString isFormattedInRange:range formattingKey:WKSourceEditorCustomKeyFontBold]; } - (BOOL)attributedString:(NSMutableAttributedString *)attributedString isItalicsInRange:(NSRange)range { - __block BOOL isItalics = NO; + return [self attributedString:attributedString isFormattedInRange:range formattingKey:WKSourceEditorCustomKeyFontItalics]; +} + +#pragma mark - Private + +- (BOOL)attributedString:(NSMutableAttributedString *)attributedString isFormattedInRange:(NSRange)range formattingKey: (NSString *)formattingKey { + __block BOOL isFormatted = NO; if (range.length == 0) { if (attributedString.length > range.location) { NSDictionary *attrs = [attributedString attributesAtIndex:range.location effectiveRange:nil]; - if (attrs[WKSourceEditorCustomKeyFontBoldItalics] != nil || attrs[WKSourceEditorCustomKeyFontItalics] != nil) { - isItalics = YES; + if (attrs[WKSourceEditorCustomKeyFontBoldItalics] != nil || attrs[formattingKey] != nil) { + isFormatted = YES; } } @@ -326,7 +303,7 @@ - (BOOL)attributedString:(NSMutableAttributedString *)attributedString isItalics __block NSRange unionRange = NSMakeRange(NSNotFound, 0); [attributedString enumerateAttributesInRange:range options:nil usingBlock:^(NSDictionary * _Nonnull attrs, NSRange loopRange, BOOL * _Nonnull stop) { - if (attrs[WKSourceEditorCustomKeyFontBoldItalics] != nil || attrs[WKSourceEditorCustomKeyFontItalics] != nil) { + if (attrs[WKSourceEditorCustomKeyFontBoldItalics] != nil || attrs[formattingKey] != nil) { if (unionRange.location == NSNotFound) { unionRange = loopRange; } else { @@ -337,11 +314,11 @@ - (BOOL)attributedString:(NSMutableAttributedString *)attributedString isItalics }]; if (NSEqualRanges(unionRange, range)) { - isItalics = YES; + isFormatted = YES; } } - return isItalics; + return isFormatted; } @end From f2841ee60c917db39eb8581ff7f2d2a8ea4d98c7 Mon Sep 17 00:00:00 2001 From: mazevedo Date: Mon, 8 Jan 2024 12:57:19 -0300 Subject: [PATCH 6/7] Fix remaining conflict --- .../WKSourceEditorTextFrameworkMediatorTests.swift | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Components/Tests/ComponentsTests/WKSourceEditorTextFrameworkMediatorTests.swift b/Components/Tests/ComponentsTests/WKSourceEditorTextFrameworkMediatorTests.swift index 18db216f3fe..5aa38f420ed 100644 --- a/Components/Tests/ComponentsTests/WKSourceEditorTextFrameworkMediatorTests.swift +++ b/Components/Tests/ComponentsTests/WKSourceEditorTextFrameworkMediatorTests.swift @@ -61,7 +61,6 @@ final class WKSourceEditorTextFrameworkMediatorTests: XCTestCase { XCTAssertFalse(selectionStates9.isItalics) } -<<<<<<< HEAD func testSelectionSpanningNonFormattedState1() throws { let text = "Testing '''bold with {{template}}''' selection that spans nonbold." mediator.textView.attributedText = NSAttributedString(string: text) @@ -80,7 +79,7 @@ final class WKSourceEditorTextFrameworkMediatorTests: XCTestCase { let selectionStates1 = mediator.selectionState(selectedDocumentRange: NSRange(location: 10, length: 21)) XCTAssertFalse(selectionStates1.isBold) XCTAssertTrue(selectionStates1.isHorizontalTemplate) -======= + } func testClosingBoldSelectionStateCursor() throws { let text = "One '''Two''' Three" mediator.textView.attributedText = NSAttributedString(string: text) @@ -95,7 +94,6 @@ final class WKSourceEditorTextFrameworkMediatorTests: XCTestCase { let selectionStates = mediator.selectionState(selectedDocumentRange: NSRange(location: 9, length: 0)) XCTAssertTrue(selectionStates.isItalics) ->>>>>>> a08b4c44f206d70dc05551b00fbede5dc6dd8faa } func testHorizontalTemplateButtonSelectionStateCursor() throws { @@ -167,7 +165,7 @@ final class WKSourceEditorTextFrameworkMediatorTests: XCTestCase { let selectionStates = mediator.selectionState(selectedDocumentRange: NSRange(location: 26, length: 77)) XCTAssertTrue(selectionStates.isHorizontalTemplate) } - + func testStrikethroughSelectionState() throws { let text = "Testing Strikethrough Testing." mediator.textView.attributedText = NSAttributedString(string: text) From 159c284f8239a98f5fbf18ae8fc1525f13849ac9 Mon Sep 17 00:00:00 2001 From: mazevedo Date: Mon, 8 Jan 2024 15:28:34 -0300 Subject: [PATCH 7/7] Fix failing test --- .../ComponentsObjC/WKSourceEditorFormatterBoldItalics.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Components/Sources/ComponentsObjC/WKSourceEditorFormatterBoldItalics.m b/Components/Sources/ComponentsObjC/WKSourceEditorFormatterBoldItalics.m index 04b855329b6..262e928431d 100644 --- a/Components/Sources/ComponentsObjC/WKSourceEditorFormatterBoldItalics.m +++ b/Components/Sources/ComponentsObjC/WKSourceEditorFormatterBoldItalics.m @@ -280,6 +280,7 @@ - (void)updateFonts:(WKSourceEditorFonts *)fonts inAttributedString:(NSMutableAt - (BOOL)attributedString:(NSMutableAttributedString *)attributedString isBoldInRange:(NSRange)range { return [self attributedString:attributedString isFormattedInRange:range formattingKey:WKSourceEditorCustomKeyFontBold]; } + - (BOOL)attributedString:(NSMutableAttributedString *)attributedString isItalicsInRange:(NSRange)range { return [self attributedString:attributedString isFormattedInRange:range formattingKey:WKSourceEditorCustomKeyFontItalics]; } @@ -300,7 +301,7 @@ - (BOOL)attributedString:(NSMutableAttributedString *)attributedString isFormatt // Edge case, check previous character if we are up against a closing bold or italic if (attrs[WKSourceEditorCustomKeyColorOrange]) { attrs = [attributedString attributesAtIndex:range.location - 1 effectiveRange:nil]; - if (attrs[WKSourceEditorCustomKeyFontBoldItalics] != nil || attrs[WKSourceEditorCustomKeyFontItalics] != nil) { + if (attrs[WKSourceEditorCustomKeyFontBold] != nil || attrs[WKSourceEditorCustomKeyFontItalics] != nil) { isFormatted = YES; } }