Skip to content

Commit 905ebd7

Browse files
committed
Create String + escapeCharacters.swift
1 parent f8823f0 commit 905ebd7

File tree

1 file changed

+64
-0
lines changed

1 file changed

+64
-0
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
//
2+
// String + escapeCharacters.swift
3+
//
4+
// Copyright (c) 2016 - 2025 Nuno Dias
5+
//
6+
// Permission is hereby granted, free of charge, to any person obtaining a copy
7+
// of this software and associated documentation files (the "Software"), to deal
8+
// in the Software without restriction, including without limitation the rights
9+
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10+
// copies of the Software, and to permit persons to whom the Software is
11+
// furnished to do so, subject to the following conditions:
12+
//
13+
// The above copyright notice and this permission notice shall be included in
14+
// all copies or substantial portions of the Software.
15+
//
16+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22+
// SOFTWARE.
23+
24+
import Foundation
25+
26+
extension String {
27+
/// Escapes characters in the string for use in XML strings.
28+
///
29+
/// Characters escaped:
30+
/// - `&` → `&`
31+
/// - `<` → `&lt;`
32+
/// - `>` → `&gt;`
33+
/// - `'` → `&apos;`
34+
/// - `"` → `&quot;`
35+
///
36+
/// - Returns: A new string with the special characters replaced by their
37+
/// corresponding escape sequences.
38+
func escapeCharacters() -> String {
39+
// Mapping of special characters to their escapes entities.
40+
let escapeMap: [Character: String] = [
41+
"&": "&amp;",
42+
"<": "&lt;",
43+
">": "&gt;",
44+
"\"": "&quot;",
45+
"'": "&apos;"
46+
]
47+
48+
// String Builder pattern to efficiently construct the result.
49+
var result = ""
50+
result.reserveCapacity(count) // Optimize memory allocation.
51+
52+
for character in self {
53+
if let escaped = escapeMap[character] {
54+
// Append escaped version if character is in the map.
55+
result.append(escaped)
56+
} else {
57+
// Append the original character if no escaping is needed.
58+
result.append(character)
59+
}
60+
}
61+
62+
return result
63+
}
64+
}

0 commit comments

Comments
 (0)