Browse Source

Fixes more weird character combinations

Simon Fairbairn 5 years ago
parent
commit
4e2f5c234e

+ 14 - 13
Sources/SwiftyMarkdown/SwiftyScannerNonRepeating.swift

@@ -206,14 +206,15 @@ class SwiftyScannerNonRepeating {
 	}
 	
 	func closeTag( _ tag : String, withGroupID id : String ) {
-		guard var tagGroup = self.tagGroups.first(where: { $0.groupID == id }) else {
+
+		guard let tagIdx = self.tagGroups.firstIndex(where: { $0.groupID == id }) else {
 			return
 		}
-		
+
 		var metadataString = ""
 		if self.isMetadataOpen {
-			let metadataCloseRange = tagGroup.tagRanges.removeLast()
-			let metadataOpenRange = tagGroup.tagRanges.removeLast()
+			let metadataCloseRange = self.tagGroups[tagIdx].tagRanges.removeLast()
+			let metadataOpenRange = self.tagGroups[tagIdx].tagRanges.removeLast()
 			
 			if metadataOpenRange.upperBound + 1 == (metadataCloseRange.lowerBound) {
 				if self.enableLog {
@@ -237,14 +238,15 @@ class SwiftyScannerNonRepeating {
 			}
 		}
 		
-		let closeRange = tagGroup.tagRanges.removeLast()
-		let openRange = tagGroup.tagRanges.removeLast()
+		let closeRange = self.tagGroups[tagIdx].tagRanges.removeLast()
+		let openRange = self.tagGroups[tagIdx].tagRanges.removeLast()
 
 		if self.rule.balancedTags && closeRange.count != openRange.count {
+			self.tagGroups[tagIdx].tagRanges.append(openRange)
+			self.tagGroups[tagIdx].tagRanges.append(closeRange)
 			return
 		}
-		
-		
+
 		var shouldRemove = true
 		var styles : [CharacterStyling] = []
 		if openRange.upperBound + 1 == (closeRange.lowerBound) {
@@ -285,11 +287,11 @@ class SwiftyScannerNonRepeating {
 				let difference = ( openRange.upperBound - openRange.lowerBound ) - (closeRange.upperBound - closeRange.lowerBound)
 				switch difference {
 				case 1...:
-					for idx in openRange.upperBound - (difference - 1)...openRange.upperBound {
-						self.elements[idx].type = .string
-					}
+					shouldRemove = false
+					self.tagGroups[tagIdx].count = difference
+					self.tagGroups[tagIdx].tagRanges.append( openRange.upperBound - (abs(difference) - 1)...openRange.upperBound )
 				case ...(-1):
-					for idx in closeRange.upperBound - (abs(difference) - 1)...closeRange.upperBound{
+					for idx in closeRange.upperBound - (abs(difference) - 1)...closeRange.upperBound {
 						self.elements[idx].type = .string
 					}
 				default:
@@ -300,7 +302,6 @@ class SwiftyScannerNonRepeating {
 		}
 		if shouldRemove {
 			self.tagGroups.removeAll(where: { $0.groupID == id })
-			self.isMetadataOpen = false
 		}
 	}
 	

+ 1 - 1
SwiftyMarkdown.xcodeproj/xcshareddata/xcschemes/SwiftyMarkdown-Package.xcscheme

@@ -59,7 +59,7 @@
          <EnvironmentVariable
             key = "SwiftyScannerScanner"
             value = ""
-            isEnabled = "NO">
+            isEnabled = "YES">
          </EnvironmentVariable>
          <EnvironmentVariable
             key = "SwiftyScannerScannerPerformanceLogging"

+ 19 - 5
Tests/SwiftyMarkdownTests/SwiftyMarkdownCharacterTests.swift

@@ -13,10 +13,10 @@ class SwiftyMarkdownStylingTests: SwiftyMarkdownCharacterTests {
 	
 	func testIsolatedCase() {
 
-		challenge = TokenTest(input: "```code`", output: "```code`", tokens : [
-			Token(type: .string, inputString: "```code`", characterStyles: [])
+		challenge = TokenTest(input: "a ```b`", output: "a ```b`", tokens : [
+			Token(type: .string, inputString: "a ```b`", characterStyles: [])
 		])
-		results = self.attempt(challenge)
+		results = self.attempt(challenge, rules: [.backticks])
 		if results.stringTokens.count == challenge.tokens.count {
 			for (idx, token) in results.stringTokens.enumerated() {
 				XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
@@ -27,7 +27,6 @@ class SwiftyMarkdownStylingTests: SwiftyMarkdownCharacterTests {
 		}
 		XCTAssertEqual(results.foundStyles, results.expectedStyles)
 		XCTAssertEqual(results.attributedString.string, challenge.output)
-		
 		return
 		
 		challenge = TokenTest(input: """
@@ -617,7 +616,22 @@ class SwiftyMarkdownStylingTests: SwiftyMarkdownCharacterTests {
 		XCTAssertEqual(results.attributedString.string, challenge.output)
 		
 		challenge = TokenTest(input: "A string with ```code`", output: "A string with ```code`", tokens : [
-			Token(type: .string, inputString: "A string with ```code`", characterStyles: []),
+			Token(type: .string, inputString: "A string with ```code`", characterStyles: [])
+		])
+		results = self.attempt(challenge)
+		if results.stringTokens.count == challenge.tokens.count {
+			for (idx, token) in results.stringTokens.enumerated() {
+				XCTAssertEqual(token.inputString, challenge.tokens[idx].inputString)
+				XCTAssertEqual(token.characterStyles as? [CharacterStyle], challenge.tokens[idx].characterStyles as?  [CharacterStyle])
+			}
+		} else {
+			XCTAssertEqual(results.stringTokens.count, challenge.tokens.count)
+		}
+		XCTAssertEqual(results.foundStyles, results.expectedStyles)
+		XCTAssertEqual(results.attributedString.string, challenge.output)
+		
+		challenge = TokenTest(input: "A string with ```code```", output: "A string with code", tokens : [
+			Token(type: .string, inputString: "A string with ", characterStyles: []),
 			Token(type: .string, inputString: "code", characterStyles: [CharacterStyle.code])
 		])
 		results = self.attempt(challenge)