Skip to content

Commit 5dbaffe

Browse files
author
Alexis Aubry Radanovic
committed
Start refactoring escaping
1 parent 3212b36 commit 5dbaffe

2 files changed

Lines changed: 30 additions & 3 deletions

File tree

Sources/HTMLString.swift

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,33 @@ public extension String {
8181
///
8282

8383
fileprivate func escapeHTML(isEncodingUnicode: Bool) -> String {
84-
return self.characters.map {
85-
isEncodingUnicode ? $0.escapingForUnicode : $0.escapingForASCII
86-
}.joined()
84+
85+
return self.characters.reduce(String()) {
86+
87+
let character = String($1)
88+
89+
// ignore alphanumerical characters
90+
guard character < "\u{2f}" || character > "\u{7a}" else {
91+
return $0 + character
92+
}
93+
94+
var escaped: String
95+
96+
if !(isEncodingUnicode) {
97+
98+
guard let escapeSequence = HTMLTables.escapingTable[character] else {
99+
return $0 + character.unicodeScalars.map { $0.escapingForASCII }.joined()
100+
}
101+
102+
escaped = "&" + escapeSequence + ";"
103+
104+
} else {
105+
escaped = character.unicodeScalars.map { $0.escapingIfNeeded }.joined()
106+
}
107+
108+
return $0 + escaped
109+
110+
}
87111
}
88112

89113
// MARK: - Unescaping

Tests/HTMLStringTests/HTMLStringTests.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,9 @@ class HTMLStringTests: XCTestCase {
167167
let twoSequences = "a &amp;&amp; b".unescapingFromHTML
168168
XCTAssertEqual(twoSequences, "a && b")
169169

170+
let doubleEmojiEscape = ("Going to the &#127482;&#127480; next June").escapingForASCIIHTML
171+
XCTAssertEqual(doubleEmojiEscape, "Going to the 🇺🇸 next June")
172+
170173
}
171174

172175
// MARK: - Benchmark

0 commit comments

Comments
 (0)