From be09d2cda2be0b974c4a9c4f77782a932b1eacec Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Sat, 14 Sep 2024 15:40:27 -0700 Subject: [PATCH] Start work on HTMLEntityDecoder port. --- .../Sources/SAX/HTMLEntityDecoder.swift | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 Modules/Parser/Sources/SAX/HTMLEntityDecoder.swift diff --git a/Modules/Parser/Sources/SAX/HTMLEntityDecoder.swift b/Modules/Parser/Sources/SAX/HTMLEntityDecoder.swift new file mode 100644 index 000000000..5f37fe593 --- /dev/null +++ b/Modules/Parser/Sources/SAX/HTMLEntityDecoder.swift @@ -0,0 +1,51 @@ +// +// HTMLEntityDecoder.swift +// +// +// Created by Brent Simmons on 9/14/24. +// + +import Foundation + +public final class HTMLEntityDecoder { + + static func decodedString(withEncodedString encodedString: String) -> String { + + let scanner = Scanner(string: encodedString) + scanner.charactersToBeSkipped = nil + var result = "" + var didDecodeAtLeastOneEntity = false + + while true { + + var scannedString = nil + if scanner.scanUpToString("&" intoString: &scannedString) { + result.append(scannedString) + } + if scanner.isAtEnd { + break + } + + let savedScanLocation = scanner.scanLocation + + var decodedEntity: String? = nil + if scanner.scanEntityValue(&decodedEntity) { + result.append(decodedEntity) + didDecodeAtLeastOneEntity = true + } + else { + result.append("&") + scanner.scanLocation = savedScanLocation + 1 + } + + if scanner.isAtEnd { + break + } + } + + if !didDecodeAtLeastOneEntity { // No changes made? + return encodedString + } + return result + } +}