From 9e8926072ccfa39fb9a7c07d35a1c8e2c1bec919 Mon Sep 17 00:00:00 2001 From: Pat Nakajima Date: Sun, 5 May 2024 22:57:17 -0700 Subject: [PATCH] add ability to ignore certain tokens --- .../xcode/package.xcworkspace/contents.xcworkspacedata | 7 +++++++ Sources/String+Typographizer.swift | 3 ++- Sources/Typographizer.swift | 5 +++++ TypographizerTests/TypographizerTests.swift | 4 ++++ 4 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 .swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata diff --git a/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata b/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Sources/String+Typographizer.swift b/Sources/String+Typographizer.swift index 74d29e9..58edfbe 100644 --- a/Sources/String+Typographizer.swift +++ b/Sources/String+Typographizer.swift @@ -9,9 +9,10 @@ import Foundation extension String { - public func typographized(language: String, isHTML: Bool = false, debug: Bool = false, measurePerformance: Bool = false) -> String { + public func typographized(language: String, isHTML: Bool = false, ignore: [UnicodeScalar] = [], debug: Bool = false, measurePerformance: Bool = false) -> String { var t = Typographizer(language: language, text: self) t.isHTML = isHTML + t.ignored = ignore t.isDebugModeEnabled = debug t.isMeasurePerformanceEnabled = measurePerformance diff --git a/Sources/Typographizer.swift b/Sources/Typographizer.swift index c977908..7d0543a 100644 --- a/Sources/Typographizer.swift +++ b/Sources/Typographizer.swift @@ -29,6 +29,7 @@ struct Typographizer { var isDebugModeEnabled = false var isMeasurePerformanceEnabled = false var isHTML = false + var ignored: [UnicodeScalar] = [] private var openingDoubleQuote: String = "·" private var closingDoubleQuote: String = "·" @@ -165,6 +166,10 @@ struct Typographizer { private mutating func nextToken() throws -> Token? { while let ch = self.nextScalar() { + if ignored.contains(ch) { + return try self.unchangedToken(ch) + } + switch ch { case "´", "`": diff --git a/TypographizerTests/TypographizerTests.swift b/TypographizerTests/TypographizerTests.swift index 7e22faa..28b4705 100644 --- a/TypographizerTests/TypographizerTests.swift +++ b/TypographizerTests/TypographizerTests.swift @@ -80,6 +80,10 @@ class TypographizerTests: XCTestCase { XCTAssertEqual("John's.".typographized(language: "en"), "John’s.") } + func testIgnore() { + XCTAssertEqual("`Hi´".typographized(language: "en", ignore: ["`", "´"]), "`Hi´") + } + func testPerformanceExample() { let string = Array(repeating: self.string, count: 1000).joined(separator: " ") self.measure {