diff --git a/Sources/HTMLString/HTMLString.swift b/Sources/HTMLString/HTMLString.swift
index ef1895c..4af3199 100644
--- a/Sources/HTMLString/HTMLString.swift
+++ b/Sources/HTMLString/HTMLString.swift
@@ -8,6 +8,8 @@ extension String {
/// Returns a copy of the current `String` where every character incompatible with HTML Unicode
/// encoding (UTF-16 or UTF-8) is replaced by a decimal HTML entity.
///
+ /// Pass `unsafeUnicodeCharacters` to override the default set of unsafe characters (`!"$%&'+,<=>@[]\`{}`).
+ ///
/// ### Examples
///
/// | String | Result | Format |
@@ -18,11 +20,13 @@ extension String {
/// | `a` | `a` | Not escaped (alphanumerical) |
///
- public func addingUnicodeEntities() -> String {
+ public func addingUnicodeEntities(unsafeUnicodeCharacters: Set? = nil) -> String {
var result = ""
+ let unsafeCharacters = unsafeUnicodeCharacters ?? HTMLStringMappings.unsafeUnicodeCharacters
+
for character in self {
- if HTMLStringMappings.unsafeUnicodeCharacters.contains(character) {
+ if unsafeCharacters.contains(character) {
// One of the required escapes for security reasons
result.append(contentsOf: "\(character.asciiValue!);")
} else {
diff --git a/Tests/HTMLStringTests/HTMLStringTests.swift b/Tests/HTMLStringTests/HTMLStringTests.swift
index bf21a21..54b8438 100644
--- a/Tests/HTMLStringTests/HTMLStringTests.swift
+++ b/Tests/HTMLStringTests/HTMLStringTests.swift
@@ -37,6 +37,15 @@ final class HTMLStringTests: XCTestCase {
XCTAssertEqual(doubleEmojiEscape, "Going to the 🇺🇸 next June")
}
+ /// Tests escaping a string for Unicode with a custom blocklist
+ func testStringUnicodeEscapingWithCustomUnsafeCharacters() {
+ let requiredEscape = ("Fish & Chips").addingUnicodeEntities()
+ XCTAssertEqual(requiredEscape, "Fish & Chips")
+
+ let notRequiredEscape = ("Fish & Chips").addingUnicodeEntities(unsafeUnicodeCharacters: [])
+ XCTAssertEqual(notRequiredEscape, "Fish & Chips")
+ }
+
// MARK: - Unescaping
/// Tests unescaping strings.