From b9dccdc61006aa1b4b3ab9badc228611b7be219b Mon Sep 17 00:00:00 2001 From: Pavel Sharanda Date: Thu, 28 Mar 2019 01:15:22 +0300 Subject: [PATCH] Xcode 10.2 and Swift 5 support - Fix AttributedLabel crash (fix #76) - Move special HTML symbols table to plist file in order to avoid compilation problems (fix #75) --- Atributika.podspec | 4 +- Atributika.xcodeproj/project.pbxproj | 45 +- Sources/AttributedLabel.swift | 11 +- Sources/HTMLSpecials.swift | 2153 +------------------ Sources/String+Detection.swift | 2 +- Sources/html_specials.plist | Bin 0 -> 40151 bytes Tests/AtributikaTests/AtributikaTests.swift | 4 +- 7 files changed, 72 insertions(+), 2147 deletions(-) create mode 100644 Sources/html_specials.plist diff --git a/Atributika.podspec b/Atributika.podspec index 51e3ba6..30b0fec 100644 --- a/Atributika.podspec +++ b/Atributika.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "Atributika" - s.version = "4.6.9" + s.version = "4.7.0" s.summary = "Convert text with HTML tags, hashtags, mentions, links into NSAttributedString. Make them clickable with UILabel drop-in replacement." s.description = <<-DESC `Atributika` is an easy and painless way to build NSAttributedString. It is able to detect HTML-like tags, links, phone numbers, hashtags, any regex or even standard ios data detectors and style them with various attributes like font, color, etc. `Atributika` comes with drop-in label replacement `AttributedLabel` which is able to make any detection clickable. @@ -9,7 +9,7 @@ Pod::Spec.new do |s| s.license = { :type => "MIT", :file => "LICENSE" } s.author = { "Pavel Sharanda" => "edvaef@gmail.com" } s.social_media_url = "https://twitter.com/e2f" - s.ios.deployment_target = "8.0" + s.ios.deployment_target = "9.0" s.osx.deployment_target = "10.10" s.watchos.deployment_target = "2.0" s.tvos.deployment_target = "9.0" diff --git a/Atributika.xcodeproj/project.pbxproj b/Atributika.xcodeproj/project.pbxproj index 5d4bf73..4b130b1 100644 --- a/Atributika.xcodeproj/project.pbxproj +++ b/Atributika.xcodeproj/project.pbxproj @@ -40,6 +40,10 @@ 1BB55AE41E5C73F000CE6EAD /* Style.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BB55AD01E5C73EF00CE6EAD /* Style.swift */; }; 1BDDF5691E683A8F006374F6 /* Snippet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BDDF5681E683A8F006374F6 /* Snippet.swift */; }; 1BDDF56B1E6841EA006374F6 /* AttributedLabelDemoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BDDF56A1E6841EA006374F6 /* AttributedLabelDemoViewController.swift */; }; + 1BE17B56224C14C200E1943A /* html_specials.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1BE17B55224C14C200E1943A /* html_specials.plist */; }; + 1BE17B57224C14C200E1943A /* html_specials.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1BE17B55224C14C200E1943A /* html_specials.plist */; }; + 1BE17B58224C14C200E1943A /* html_specials.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1BE17B55224C14C200E1943A /* html_specials.plist */; }; + 1BE17B59224C14C200E1943A /* html_specials.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1BE17B55224C14C200E1943A /* html_specials.plist */; }; 52D6D9871BEFF229002C0205 /* Atributika.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 52D6D97C1BEFF229002C0205 /* Atributika.framework */; }; 52D6D99B1BEFF375002C0205 /* AtributikaTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52D6D9971BEFF375002C0205 /* AtributikaTests.swift */; }; DD7502861C68FDDC006590AF /* AtributikaTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52D6D9971BEFF375002C0205 /* AtributikaTests.swift */; }; @@ -109,6 +113,7 @@ 1BB55AD01E5C73EF00CE6EAD /* Style.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Style.swift; path = Sources/Style.swift; sourceTree = ""; }; 1BDDF5681E683A8F006374F6 /* Snippet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Snippet.swift; sourceTree = ""; }; 1BDDF56A1E6841EA006374F6 /* AttributedLabelDemoViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AttributedLabelDemoViewController.swift; sourceTree = ""; }; + 1BE17B55224C14C200E1943A /* html_specials.plist */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; name = html_specials.plist; path = Sources/html_specials.plist; sourceTree = ""; }; 52D6D97C1BEFF229002C0205 /* Atributika.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Atributika.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 52D6D9861BEFF229002C0205 /* Atributika-iOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Atributika-iOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 52D6D9971BEFF375002C0205 /* AtributikaTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AtributikaTests.swift; path = Tests/AtributikaTests/AtributikaTests.swift; sourceTree = ""; }; @@ -210,6 +215,7 @@ 52D6D9721BEFF229002C0205 = { isa = PBXGroup; children = ( + 1BE17B55224C14C200E1943A /* html_specials.plist */, 1B38369F1F97C224001DB333 /* AttributedLabel.swift */, 1BB55AD01E5C73EF00CE6EAD /* Style.swift */, 1BB55ACC1E5C73EF00CE6EAD /* AttributedText.swift */, @@ -455,42 +461,43 @@ TargetAttributes = { 1B2F838C1E5C98A4009AFBCA = { CreatedOnToolsVersion = 8.2.1; - LastSwiftMigration = 1000; + DevelopmentTeam = 6UG65RB759; + LastSwiftMigration = 1020; ProvisioningStyle = Automatic; }; 52D6D97B1BEFF229002C0205 = { CreatedOnToolsVersion = 7.1; - LastSwiftMigration = 1000; + LastSwiftMigration = 1020; }; 52D6D9851BEFF229002C0205 = { CreatedOnToolsVersion = 7.1; - LastSwiftMigration = 0900; + LastSwiftMigration = 1020; }; 52D6D9E11BEFFF6E002C0205 = { CreatedOnToolsVersion = 7.1; - LastSwiftMigration = 1000; + LastSwiftMigration = 1020; }; 52D6D9EF1BEFFFBE002C0205 = { CreatedOnToolsVersion = 7.1; - LastSwiftMigration = 1000; + LastSwiftMigration = 1020; }; 52D6DA0E1BF000BD002C0205 = { CreatedOnToolsVersion = 7.1; - LastSwiftMigration = 1000; + LastSwiftMigration = 1020; }; DD7502791C68FCFC006590AF = { CreatedOnToolsVersion = 7.2.1; - LastSwiftMigration = 1000; + LastSwiftMigration = 1020; }; DD75028C1C690C7A006590AF = { CreatedOnToolsVersion = 7.2.1; - LastSwiftMigration = 1000; + LastSwiftMigration = 1020; }; }; }; buildConfigurationList = 52D6D9761BEFF229002C0205 /* Build configuration list for PBXProject "Atributika" */; compatibilityVersion = "Xcode 6.3"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -527,6 +534,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 1BE17B56224C14C200E1943A /* html_specials.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -541,6 +549,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 1BE17B58224C14C200E1943A /* html_specials.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -548,6 +557,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 1BE17B59224C14C200E1943A /* html_specials.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -555,6 +565,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 1BE17B57224C14C200E1943A /* html_specials.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -708,11 +719,11 @@ CLANG_ANALYZER_NONNULL = YES; CLANG_ENABLE_CODE_COVERAGE = NO; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = 6UG65RB759; INFOPLIST_FILE = Demo/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = org.psharanda.Demo; + PRODUCT_BUNDLE_IDENTIFIER = org.psharanda.Atributika.Demo; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_VERSION = 4.0; @@ -727,11 +738,11 @@ CLANG_ANALYZER_NONNULL = YES; CLANG_ENABLE_CODE_COVERAGE = NO; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = 6UG65RB759; INFOPLIST_FILE = Demo/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = org.psharanda.Demo; + PRODUCT_BUNDLE_IDENTIFIER = org.psharanda.Atributika.Demo; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 4.0; @@ -862,7 +873,7 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Configs/Atributika.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; ONLY_ACTIVE_ARCH = NO; PRODUCT_BUNDLE_IDENTIFIER = "com.Atributika.Atributika-iOS"; @@ -886,7 +897,7 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Configs/Atributika.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.Atributika.Atributika-iOS"; PRODUCT_NAME = Atributika; @@ -903,6 +914,7 @@ CLANG_ENABLE_CODE_COVERAGE = NO; CLANG_ENABLE_MODULES = YES; INFOPLIST_FILE = Configs/AtributikaTests.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.Atributika.Atributika-iOS-Tests"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -918,6 +930,7 @@ CLANG_ENABLE_CODE_COVERAGE = NO; CLANG_ENABLE_MODULES = YES; INFOPLIST_FILE = Configs/AtributikaTests.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.Atributika.Atributika-iOS-Tests"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1119,6 +1132,7 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CLANG_ENABLE_CODE_COVERAGE = NO; INFOPLIST_FILE = Configs/AtributikaTests.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.Atributika.Atributika-tvOS-Tests"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1134,6 +1148,7 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CLANG_ENABLE_CODE_COVERAGE = NO; INFOPLIST_FILE = Configs/AtributikaTests.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.Atributika.Atributika-tvOS-Tests"; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/Sources/AttributedLabel.swift b/Sources/AttributedLabel.swift index 0d40aec..9a7b115 100644 --- a/Sources/AttributedLabel.swift +++ b/Sources/AttributedLabel.swift @@ -96,8 +96,11 @@ open class AttributedLabel: UIView { addSubview(label) label.translatesAutoresizingMaskIntoConstraints = false - addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[label]|", options: [], metrics: nil, views: ["label": label])) - addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[label]|", options: [], metrics: nil, views: ["label": label])) + + label.topAnchor.constraint(equalTo: topAnchor).isActive = true + label.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true + label.leftAnchor.constraint(equalTo: leftAnchor).isActive = true + label.rightAnchor.constraint(equalTo: rightAnchor).isActive = true } //MARK: - overrides @@ -131,11 +134,11 @@ open class AttributedLabel: UIView { let usedRect = layoutManager.usedRect(for: textContainer) let dy = max(0, (bounds.height - usedRect.height)/2) highlightableDetections.forEach { detection in - let nsrange = NSRange(detection.range, in: inheritedString.string) + let nsrange = NSRange(detection.range, in: text.string) layoutManager.enumerateEnclosingRects(forGlyphRange: nsrange, withinSelectedGlyphRange: NSRange(location: NSNotFound, length: 0), in: textContainer, using: { (rect, stop) in var finalRect = rect finalRect.origin.y += dy - self.addDetectionAreaButton(frame: finalRect, detection: detection, text: String(inheritedString.string[detection.range])) + self.addDetectionAreaButton(frame: finalRect, detection: detection, text: String(text.string[detection.range])) }) } } diff --git a/Sources/HTMLSpecials.swift b/Sources/HTMLSpecials.swift index 28a8971..4c9f3a6 100644 --- a/Sources/HTMLSpecials.swift +++ b/Sources/HTMLSpecials.swift @@ -22,2131 +22,36 @@ extension String { } } +private final class BundleToken { } -let HTMLSpecialsMap: [String : String] = [ - "AElig":"\u{c6}", - "AMP":"\u{26}", - "Aacute":"\u{c1}", - "Abreve":"\u{102}", - "Acirc":"\u{c2}", - "Acy":"\u{410}", - "Afr":"\u{1d504}", - "Agrave":"\u{c0}", - "Alpha":"\u{391}", - "Amacr":"\u{100}", - "And":"\u{2a53}", - "Aogon":"\u{104}", - "Aopf":"\u{1d538}", - "ApplyFunction":"\u{2061}", - "Aring":"\u{c5}", - "Ascr":"\u{1d49c}", - "Assign":"\u{2254}", - "Atilde":"\u{c3}", - "Auml":"\u{c4}", - "Backslash":"\u{2216}", - "Barv":"\u{2ae7}", - "Barwed":"\u{2306}", - "Bcy":"\u{411}", - "Because":"\u{2235}", - "Bernoullis":"\u{212c}", - "Beta":"\u{392}", - "Bfr":"\u{1d505}", - "Bopf":"\u{1d539}", - "Breve":"\u{2d8}", - "Bscr":"\u{212c}", - "Bumpeq":"\u{224e}", - "CHcy":"\u{427}", - "COPY":"\u{a9}", - "Cacute":"\u{106}", - "Cap":"\u{22d2}", - "CapitalDifferentialD":"\u{2145}", - "Cayleys":"\u{212d}", - "Ccaron":"\u{10c}", - "Ccedil":"\u{c7}", - "Ccirc":"\u{108}", - "Cconint":"\u{2230}", - "Cdot":"\u{10a}", - "Cedilla":"\u{b8}", - "CenterDot":"\u{b7}", - "Cfr":"\u{212d}", - "Chi":"\u{3a7}", - "CircleDot":"\u{2299}", - "CircleMinus":"\u{2296}", - "CirclePlus":"\u{2295}", - "CircleTimes":"\u{2297}", - "ClockwiseContourIntegral":"\u{2232}", - "CloseCurlyDoubleQuote":"\u{201d}", - "CloseCurlyQuote":"\u{2019}", - "Colon":"\u{2237}", - "Colone":"\u{2a74}", - "Congruent":"\u{2261}", - "Conint":"\u{222f}", - "ContourIntegral":"\u{222e}", - "Copf":"\u{2102}", - "Coproduct":"\u{2210}", - "CounterClockwiseContourIntegral":"\u{2233}", - "Cross":"\u{2a2f}", - "Cscr":"\u{1d49e}", - "Cup":"\u{22d3}", - "CupCap":"\u{224d}", - "DD":"\u{2145}", - "DDotrahd":"\u{2911}", - "DJcy":"\u{402}", - "DScy":"\u{405}", - "DZcy":"\u{40f}", - "Dagger":"\u{2021}", - "Darr":"\u{21a1}", - "Dashv":"\u{2ae4}", - "Dcaron":"\u{10e}", - "Dcy":"\u{414}", - "Del":"\u{2207}", - "Delta":"\u{394}", - "Dfr":"\u{1d507}", - "DiacriticalAcute":"\u{b4}", - "DiacriticalDot":"\u{2d9}", - "DiacriticalDoubleAcute":"\u{2dd}", - "DiacriticalGrave":"\u{60}", - "DiacriticalTilde":"\u{2dc}", - "Diamond":"\u{22c4}", - "DifferentialD":"\u{2146}", - "Dopf":"\u{1d53b}", - "Dot":"\u{a8}", - "DotDot":"\u{20dc}", - "DotEqual":"\u{2250}", - "DoubleContourIntegral":"\u{222f}", - "DoubleDot":"\u{a8}", - "DoubleDownArrow":"\u{21d3}", - "DoubleLeftArrow":"\u{21d0}", - "DoubleLeftRightArrow":"\u{21d4}", - "DoubleLeftTee":"\u{2ae4}", - "DoubleLongLeftArrow":"\u{27f8}", - "DoubleLongLeftRightArrow":"\u{27fa}", - "DoubleLongRightArrow":"\u{27f9}", - "DoubleRightArrow":"\u{21d2}", - "DoubleRightTee":"\u{22a8}", - "DoubleUpArrow":"\u{21d1}", - "DoubleUpDownArrow":"\u{21d5}", - "DoubleVerticalBar":"\u{2225}", - "DownArrow":"\u{2193}", - "DownArrowBar":"\u{2913}", - "DownArrowUpArrow":"\u{21f5}", - "DownBreve":"\u{311}", - "DownLeftRightVector":"\u{2950}", - "DownLeftTeeVector":"\u{295e}", - "DownLeftVector":"\u{21bd}", - "DownLeftVectorBar":"\u{2956}", - "DownRightTeeVector":"\u{295f}", - "DownRightVector":"\u{21c1}", - "DownRightVectorBar":"\u{2957}", - "DownTee":"\u{22a4}", - "DownTeeArrow":"\u{21a7}", - "Downarrow":"\u{21d3}", - "Dscr":"\u{1d49f}", - "Dstrok":"\u{110}", - "ENG":"\u{14a}", - "ETH":"\u{d0}", - "Eacute":"\u{c9}", - "Ecaron":"\u{11a}", - "Ecirc":"\u{ca}", - "Ecy":"\u{42d}", - "Edot":"\u{116}", - "Efr":"\u{1d508}", - "Egrave":"\u{c8}", - "Element":"\u{2208}", - "Emacr":"\u{112}", - "EmptySmallSquare":"\u{25fb}", - "EmptyVerySmallSquare":"\u{25ab}", - "Eogon":"\u{118}", - "Eopf":"\u{1d53c}", - "Epsilon":"\u{395}", - "Equal":"\u{2a75}", - "EqualTilde":"\u{2242}", - "Equilibrium":"\u{21cc}", - "Escr":"\u{2130}", - "Esim":"\u{2a73}", - "Eta":"\u{397}", - "Euml":"\u{cb}", - "Exists":"\u{2203}", - "ExponentialE":"\u{2147}", - "Fcy":"\u{424}", - "Ffr":"\u{1d509}", - "FilledSmallSquare":"\u{25fc}", - "FilledVerySmallSquare":"\u{25aa}", - "Fopf":"\u{1d53d}", - "ForAll":"\u{2200}", - "Fouriertrf":"\u{2131}", - "Fscr":"\u{2131}", - "GJcy":"\u{403}", - "GT":"\u{3e}", - "Gamma":"\u{393}", - "Gammad":"\u{3dc}", - "Gbreve":"\u{11e}", - "Gcedil":"\u{122}", - "Gcirc":"\u{11c}", - "Gcy":"\u{413}", - "Gdot":"\u{120}", - "Gfr":"\u{1d50a}", - "Gg":"\u{22d9}", - "Gopf":"\u{1d53e}", - "GreaterEqual":"\u{2265}", - "GreaterEqualLess":"\u{22db}", - "GreaterFullEqual":"\u{2267}", - "GreaterGreater":"\u{2aa2}", - "GreaterLess":"\u{2277}", - "GreaterSlantEqual":"\u{2a7e}", - "GreaterTilde":"\u{2273}", - "Gscr":"\u{1d4a2}", - "Gt":"\u{226b}", - "HARDcy":"\u{42a}", - "Hacek":"\u{2c7}", - "Hat":"\u{5e}", - "Hcirc":"\u{124}", - "Hfr":"\u{210c}", - "HilbertSpace":"\u{210b}", - "Hopf":"\u{210d}", - "HorizontalLine":"\u{2500}", - "Hscr":"\u{210b}", - "Hstrok":"\u{126}", - "HumpDownHump":"\u{224e}", - "HumpEqual":"\u{224f}", - "IEcy":"\u{415}", - "IJlig":"\u{132}", - "IOcy":"\u{401}", - "Iacute":"\u{cd}", - "Icirc":"\u{ce}", - "Icy":"\u{418}", - "Idot":"\u{130}", - "Ifr":"\u{2111}", - "Igrave":"\u{cc}", - "Im":"\u{2111}", - "Imacr":"\u{12a}", - "ImaginaryI":"\u{2148}", - "Implies":"\u{21d2}", - "Int":"\u{222c}", - "Integral":"\u{222b}", - "Intersection":"\u{22c2}", - "InvisibleComma":"\u{2063}", - "InvisibleTimes":"\u{2062}", - "Iogon":"\u{12e}", - "Iopf":"\u{1d540}", - "Iota":"\u{399}", - "Iscr":"\u{2110}", - "Itilde":"\u{128}", - "Iukcy":"\u{406}", - "Iuml":"\u{cf}", - "Jcirc":"\u{134}", - "Jcy":"\u{419}", - "Jfr":"\u{1d50d}", - "Jopf":"\u{1d541}", - "Jscr":"\u{1d4a5}", - "Jsercy":"\u{408}", - "Jukcy":"\u{404}", - "KHcy":"\u{425}", - "KJcy":"\u{40c}", - "Kappa":"\u{39a}", - "Kcedil":"\u{136}", - "Kcy":"\u{41a}", - "Kfr":"\u{1d50e}", - "Kopf":"\u{1d542}", - "Kscr":"\u{1d4a6}", - "LJcy":"\u{409}", - "LT":"\u{3c}", - "Lacute":"\u{139}", - "Lambda":"\u{39b}", - "Lang":"\u{27ea}", - "Laplacetrf":"\u{2112}", - "Larr":"\u{219e}", - "Lcaron":"\u{13d}", - "Lcedil":"\u{13b}", - "Lcy":"\u{41b}", - "LeftAngleBracket":"\u{27e8}", - "LeftArrow":"\u{2190}", - "LeftArrowBar":"\u{21e4}", - "LeftArrowRightArrow":"\u{21c6}", - "LeftCeiling":"\u{2308}", - "LeftDoubleBracket":"\u{27e6}", - "LeftDownTeeVector":"\u{2961}", - "LeftDownVector":"\u{21c3}", - "LeftDownVectorBar":"\u{2959}", - "LeftFloor":"\u{230a}", - "LeftRightArrow":"\u{2194}", - "LeftRightVector":"\u{294e}", - "LeftTee":"\u{22a3}", - "LeftTeeArrow":"\u{21a4}", - "LeftTeeVector":"\u{295a}", - "LeftTriangle":"\u{22b2}", - "LeftTriangleBar":"\u{29cf}", - "LeftTriangleEqual":"\u{22b4}", - "LeftUpDownVector":"\u{2951}", - "LeftUpTeeVector":"\u{2960}", - "LeftUpVector":"\u{21bf}", - "LeftUpVectorBar":"\u{2958}", - "LeftVector":"\u{21bc}", - "LeftVectorBar":"\u{2952}", - "Leftarrow":"\u{21d0}", - "Leftrightarrow":"\u{21d4}", - "LessEqualGreater":"\u{22da}", - "LessFullEqual":"\u{2266}", - "LessGreater":"\u{2276}", - "LessLess":"\u{2aa1}", - "LessSlantEqual":"\u{2a7d}", - "LessTilde":"\u{2272}", - "Lfr":"\u{1d50f}", - "Ll":"\u{22d8}", - "Lleftarrow":"\u{21da}", - "Lmidot":"\u{13f}", - "LongLeftArrow":"\u{27f5}", - "LongLeftRightArrow":"\u{27f7}", - "LongRightArrow":"\u{27f6}", - "Longleftarrow":"\u{27f8}", - "Longleftrightarrow":"\u{27fa}", - "Longrightarrow":"\u{27f9}", - "Lopf":"\u{1d543}", - "LowerLeftArrow":"\u{2199}", - "LowerRightArrow":"\u{2198}", - "Lscr":"\u{2112}", - "Lsh":"\u{21b0}", - "Lstrok":"\u{141}", - "Lt":"\u{226a}", - "Map":"\u{2905}", - "Mcy":"\u{41c}", - "MediumSpace":"\u{205f}", - "Mellintrf":"\u{2133}", - "Mfr":"\u{1d510}", - "MinusPlus":"\u{2213}", - "Mopf":"\u{1d544}", - "Mscr":"\u{2133}", - "Mu":"\u{39c}", - "NJcy":"\u{40a}", - "Nacute":"\u{143}", - "Ncaron":"\u{147}", - "Ncedil":"\u{145}", - "Ncy":"\u{41d}", - "NegativeMediumSpace":"\u{200b}", - "NegativeThickSpace":"\u{200b}", - "NegativeThinSpace":"\u{200b}", - "NegativeVeryThinSpace":"\u{200b}", - "NestedGreaterGreater":"\u{226b}", - "NestedLessLess":"\u{226a}", - "NewLine":"\u{a}", - "Nfr":"\u{1d511}", - "NoBreak":"\u{2060}", - "NonBreakingSpace":"\u{a0}", - "Nopf":"\u{2115}", - "Not":"\u{2aec}", - "NotCongruent":"\u{2262}", - "NotCupCap":"\u{226d}", - "NotDoubleVerticalBar":"\u{2226}", - "NotElement":"\u{2209}", - "NotEqual":"\u{2260}", - "NotEqualTilde":"\u{2242}\u{338}", - "NotExists":"\u{2204}", - "NotGreater":"\u{226f}", - "NotGreaterEqual":"\u{2271}", - "NotGreaterFullEqual":"\u{2267}\u{338}", - "NotGreaterGreater":"\u{226b}\u{338}", - "NotGreaterLess":"\u{2279}", - "NotGreaterSlantEqual":"\u{2a7e}\u{338}", - "NotGreaterTilde":"\u{2275}", - "NotHumpDownHump":"\u{224e}\u{338}", - "NotHumpEqual":"\u{224f}\u{338}", - "NotLeftTriangle":"\u{22ea}", - "NotLeftTriangleBar":"\u{29cf}\u{338}", - "NotLeftTriangleEqual":"\u{22ec}", - "NotLess":"\u{226e}", - "NotLessEqual":"\u{2270}", - "NotLessGreater":"\u{2278}", - "NotLessLess":"\u{226a}\u{338}", - "NotLessSlantEqual":"\u{2a7d}\u{338}", - "NotLessTilde":"\u{2274}", - "NotNestedGreaterGreater":"\u{2aa2}\u{338}", - "NotNestedLessLess":"\u{2aa1}\u{338}", - "NotPrecedes":"\u{2280}", - "NotPrecedesEqual":"\u{2aaf}\u{338}", - "NotPrecedesSlantEqual":"\u{22e0}", - "NotReverseElement":"\u{220c}", - "NotRightTriangle":"\u{22eb}", - "NotRightTriangleBar":"\u{29d0}\u{338}", - "NotRightTriangleEqual":"\u{22ed}", - "NotSquareSubset":"\u{228f}\u{338}", - "NotSquareSubsetEqual":"\u{22e2}", - "NotSquareSuperset":"\u{2290}\u{338}", - "NotSquareSupersetEqual":"\u{22e3}", - "NotSubset":"\u{2282}\u{20d2}", - "NotSubsetEqual":"\u{2288}", - "NotSucceeds":"\u{2281}", - "NotSucceedsEqual":"\u{2ab0}\u{338}", - "NotSucceedsSlantEqual":"\u{22e1}", - "NotSucceedsTilde":"\u{227f}\u{338}", - "NotSuperset":"\u{2283}\u{20d2}", - "NotSupersetEqual":"\u{2289}", - "NotTilde":"\u{2241}", - "NotTildeEqual":"\u{2244}", - "NotTildeFullEqual":"\u{2247}", - "NotTildeTilde":"\u{2249}", - "NotVerticalBar":"\u{2224}", - "Nscr":"\u{1d4a9}", - "Ntilde":"\u{d1}", - "Nu":"\u{39d}", - "OElig":"\u{152}", - "Oacute":"\u{d3}", - "Ocirc":"\u{d4}", - "Ocy":"\u{41e}", - "Odblac":"\u{150}", - "Ofr":"\u{1d512}", - "Ograve":"\u{d2}", - "Omacr":"\u{14c}", - "Omega":"\u{3a9}", - "Omicron":"\u{39f}", - "Oopf":"\u{1d546}", - "OpenCurlyDoubleQuote":"\u{201c}", - "OpenCurlyQuote":"\u{2018}", - "Or":"\u{2a54}", - "Oscr":"\u{1d4aa}", - "Oslash":"\u{d8}", - "Otilde":"\u{d5}", - "Otimes":"\u{2a37}", - "Ouml":"\u{d6}", - "OverBar":"\u{203e}", - "OverBrace":"\u{23de}", - "OverBracket":"\u{23b4}", - "OverParenthesis":"\u{23dc}", - "PartialD":"\u{2202}", - "Pcy":"\u{41f}", - "Pfr":"\u{1d513}", - "Phi":"\u{3a6}", - "Pi":"\u{3a0}", - "PlusMinus":"\u{b1}", - "Poincareplane":"\u{210c}", - "Popf":"\u{2119}", - "Pr":"\u{2abb}", - "Precedes":"\u{227a}", - "PrecedesEqual":"\u{2aaf}", - "PrecedesSlantEqual":"\u{227c}", - "PrecedesTilde":"\u{227e}", - "Prime":"\u{2033}", - "Product":"\u{220f}", - "Proportion":"\u{2237}", - "Proportional":"\u{221d}", - "Pscr":"\u{1d4ab}", - "Psi":"\u{3a8}", - "QUOT":"\u{22}", - "Qfr":"\u{1d514}", - "Qopf":"\u{211a}", - "Qscr":"\u{1d4ac}", - "RBarr":"\u{2910}", - "REG":"\u{ae}", - "Racute":"\u{154}", - "Rang":"\u{27eb}", - "Rarr":"\u{21a0}", - "Rarrtl":"\u{2916}", - "Rcaron":"\u{158}", - "Rcedil":"\u{156}", - "Rcy":"\u{420}", - "Re":"\u{211c}", - "ReverseElement":"\u{220b}", - "ReverseEquilibrium":"\u{21cb}", - "ReverseUpEquilibrium":"\u{296f}", - "Rfr":"\u{211c}", - "Rho":"\u{3a1}", - "RightAngleBracket":"\u{27e9}", - "RightArrow":"\u{2192}", - "RightArrowBar":"\u{21e5}", - "RightArrowLeftArrow":"\u{21c4}", - "RightCeiling":"\u{2309}", - "RightDoubleBracket":"\u{27e7}", - "RightDownTeeVector":"\u{295d}", - "RightDownVector":"\u{21c2}", - "RightDownVectorBar":"\u{2955}", - "RightFloor":"\u{230b}", - "RightTee":"\u{22a2}", - "RightTeeArrow":"\u{21a6}", - "RightTeeVector":"\u{295b}", - "RightTriangle":"\u{22b3}", - "RightTriangleBar":"\u{29d0}", - "RightTriangleEqual":"\u{22b5}", - "RightUpDownVector":"\u{294f}", - "RightUpTeeVector":"\u{295c}", - "RightUpVector":"\u{21be}", - "RightUpVectorBar":"\u{2954}", - "RightVector":"\u{21c0}", - "RightVectorBar":"\u{2953}", - "Rightarrow":"\u{21d2}", - "Ropf":"\u{211d}", - "RoundImplies":"\u{2970}", - "Rrightarrow":"\u{21db}", - "Rscr":"\u{211b}", - "Rsh":"\u{21b1}", - "RuleDelayed":"\u{29f4}", - "SHCHcy":"\u{429}", - "SHcy":"\u{428}", - "SOFTcy":"\u{42c}", - "Sacute":"\u{15a}", - "Sc":"\u{2abc}", - "Scaron":"\u{160}", - "Scedil":"\u{15e}", - "Scirc":"\u{15c}", - "Scy":"\u{421}", - "Sfr":"\u{1d516}", - "ShortDownArrow":"\u{2193}", - "ShortLeftArrow":"\u{2190}", - "ShortRightArrow":"\u{2192}", - "ShortUpArrow":"\u{2191}", - "Sigma":"\u{3a3}", - "SmallCircle":"\u{2218}", - "Sopf":"\u{1d54a}", - "Sqrt":"\u{221a}", - "Square":"\u{25a1}", - "SquareIntersection":"\u{2293}", - "SquareSubset":"\u{228f}", - "SquareSubsetEqual":"\u{2291}", - "SquareSuperset":"\u{2290}", - "SquareSupersetEqual":"\u{2292}", - "SquareUnion":"\u{2294}", - "Sscr":"\u{1d4ae}", - "Star":"\u{22c6}", - "Sub":"\u{22d0}", - "Subset":"\u{22d0}", - "SubsetEqual":"\u{2286}", - "Succeeds":"\u{227b}", - "SucceedsEqual":"\u{2ab0}", - "SucceedsSlantEqual":"\u{227d}", - "SucceedsTilde":"\u{227f}", - "SuchThat":"\u{220b}", - "Sum":"\u{2211}", - "Sup":"\u{22d1}", - "Superset":"\u{2283}", - "SupersetEqual":"\u{2287}", - "Supset":"\u{22d1}", - "THORN":"\u{de}", - "TRADE":"\u{2122}", - "TSHcy":"\u{40b}", - "TScy":"\u{426}", - "Tab":"\u{9}", - "Tau":"\u{3a4}", - "Tcaron":"\u{164}", - "Tcedil":"\u{162}", - "Tcy":"\u{422}", - "Tfr":"\u{1d517}", - "Therefore":"\u{2234}", - "Theta":"\u{398}", - "ThickSpace":"\u{205f}\u{200a}", - "ThinSpace":"\u{2009}", - "Tilde":"\u{223c}", - "TildeEqual":"\u{2243}", - "TildeFullEqual":"\u{2245}", - "TildeTilde":"\u{2248}", - "Topf":"\u{1d54b}", - "TripleDot":"\u{20db}", - "Tscr":"\u{1d4af}", - "Tstrok":"\u{166}", - "Uacute":"\u{da}", - "Uarr":"\u{219f}", - "Uarrocir":"\u{2949}", - "Ubrcy":"\u{40e}", - "Ubreve":"\u{16c}", - "Ucirc":"\u{db}", - "Ucy":"\u{423}", - "Udblac":"\u{170}", - "Ufr":"\u{1d518}", - "Ugrave":"\u{d9}", - "Umacr":"\u{16a}", - "UnderBar":"\u{5f}", - "UnderBrace":"\u{23df}", - "UnderBracket":"\u{23b5}", - "UnderParenthesis":"\u{23dd}", - "Union":"\u{22c3}", - "UnionPlus":"\u{228e}", - "Uogon":"\u{172}", - "Uopf":"\u{1d54c}", - "UpArrow":"\u{2191}", - "UpArrowBar":"\u{2912}", - "UpArrowDownArrow":"\u{21c5}", - "UpDownArrow":"\u{2195}", - "UpEquilibrium":"\u{296e}", - "UpTee":"\u{22a5}", - "UpTeeArrow":"\u{21a5}", - "Uparrow":"\u{21d1}", - "Updownarrow":"\u{21d5}", - "UpperLeftArrow":"\u{2196}", - "UpperRightArrow":"\u{2197}", - "Upsi":"\u{3d2}", - "Upsilon":"\u{3a5}", - "Uring":"\u{16e}", - "Uscr":"\u{1d4b0}", - "Utilde":"\u{168}", - "Uuml":"\u{dc}", - "VDash":"\u{22ab}", - "Vbar":"\u{2aeb}", - "Vcy":"\u{412}", - "Vdash":"\u{22a9}", - "Vdashl":"\u{2ae6}", - "Vee":"\u{22c1}", - "Verbar":"\u{2016}", - "Vert":"\u{2016}", - "VerticalBar":"\u{2223}", - "VerticalLine":"\u{7c}", - "VerticalSeparator":"\u{2758}", - "VerticalTilde":"\u{2240}", - "VeryThinSpace":"\u{200a}", - "Vfr":"\u{1d519}", - "Vopf":"\u{1d54d}", - "Vscr":"\u{1d4b1}", - "Vvdash":"\u{22aa}", - "Wcirc":"\u{174}", - "Wedge":"\u{22c0}", - "Wfr":"\u{1d51a}", - "Wopf":"\u{1d54e}", - "Wscr":"\u{1d4b2}", - "Xfr":"\u{1d51b}", - "Xi":"\u{39e}", - "Xopf":"\u{1d54f}", - "Xscr":"\u{1d4b3}", - "YAcy":"\u{42f}", - "YIcy":"\u{407}", - "YUcy":"\u{42e}", - "Yacute":"\u{dd}", - "Ycirc":"\u{176}", - "Ycy":"\u{42b}", - "Yfr":"\u{1d51c}", - "Yopf":"\u{1d550}", - "Yscr":"\u{1d4b4}", - "Yuml":"\u{178}", - "ZHcy":"\u{416}", - "Zacute":"\u{179}", - "Zcaron":"\u{17d}", - "Zcy":"\u{417}", - "Zdot":"\u{17b}", - "ZeroWidthSpace":"\u{200b}", - "Zeta":"\u{396}", - "Zfr":"\u{2128}", - "Zopf":"\u{2124}", - "Zscr":"\u{1d4b5}", - "aacute":"\u{e1}", - "abreve":"\u{103}", - "ac":"\u{223e}", - "acE":"\u{223e}\u{333}", - "acd":"\u{223f}", - "acirc":"\u{e2}", - "acute":"\u{b4}", - "acy":"\u{430}", - "aelig":"\u{e6}", - "af":"\u{2061}", - "afr":"\u{1d51e}", - "agrave":"\u{e0}", - "alefsym":"\u{2135}", - "aleph":"\u{2135}", - "alpha":"\u{3b1}", - "amacr":"\u{101}", - "amalg":"\u{2a3f}", - "amp":"\u{26}", - "and":"\u{2227}", - "andand":"\u{2a55}", - "andd":"\u{2a5c}", - "andslope":"\u{2a58}", - "andv":"\u{2a5a}", - "ang":"\u{2220}", - "ange":"\u{29a4}", - "angle":"\u{2220}", - "angmsd":"\u{2221}", - "angmsdaa":"\u{29a8}", - "angmsdab":"\u{29a9}", - "angmsdac":"\u{29aa}", - "angmsdad":"\u{29ab}", - "angmsdae":"\u{29ac}", - "angmsdaf":"\u{29ad}", - "angmsdag":"\u{29ae}", - "angmsdah":"\u{29af}", - "angrt":"\u{221f}", - "angrtvb":"\u{22be}", - "angrtvbd":"\u{299d}", - "angsph":"\u{2222}", - "angst":"\u{c5}", - "angzarr":"\u{237c}", - "aogon":"\u{105}", - "aopf":"\u{1d552}", - "ap":"\u{2248}", - "apE":"\u{2a70}", - "apacir":"\u{2a6f}", - "ape":"\u{224a}", - "apid":"\u{224b}", - "apos":"\u{27}", - "approx":"\u{2248}", - "approxeq":"\u{224a}", - "aring":"\u{e5}", - "ascr":"\u{1d4b6}", - "ast":"\u{2a}", - "asymp":"\u{2248}", - "asympeq":"\u{224d}", - "atilde":"\u{e3}", - "auml":"\u{e4}", - "awconint":"\u{2233}", - "awint":"\u{2a11}", - "bNot":"\u{2aed}", - "backcong":"\u{224c}", - "backepsilon":"\u{3f6}", - "backprime":"\u{2035}", - "backsim":"\u{223d}", - "backsimeq":"\u{22cd}", - "barvee":"\u{22bd}", - "barwed":"\u{2305}", - "barwedge":"\u{2305}", - "bbrk":"\u{23b5}", - "bbrktbrk":"\u{23b6}", - "bcong":"\u{224c}", - "bcy":"\u{431}", - "bdquo":"\u{201e}", - "becaus":"\u{2235}", - "because":"\u{2235}", - "bemptyv":"\u{29b0}", - "bepsi":"\u{3f6}", - "bernou":"\u{212c}", - "beta":"\u{3b2}", - "beth":"\u{2136}", - "between":"\u{226c}", - "bfr":"\u{1d51f}", - "bigcap":"\u{22c2}", - "bigcirc":"\u{25ef}", - "bigcup":"\u{22c3}", - "bigodot":"\u{2a00}", - "bigoplus":"\u{2a01}", - "bigotimes":"\u{2a02}", - "bigsqcup":"\u{2a06}", - "bigstar":"\u{2605}", - "bigtriangledown":"\u{25bd}", - "bigtriangleup":"\u{25b3}", - "biguplus":"\u{2a04}", - "bigvee":"\u{22c1}", - "bigwedge":"\u{22c0}", - "bkarow":"\u{290d}", - "blacklozenge":"\u{29eb}", - "blacksquare":"\u{25aa}", - "blacktriangle":"\u{25b4}", - "blacktriangledown":"\u{25be}", - "blacktriangleleft":"\u{25c2}", - "blacktriangleright":"\u{25b8}", - "blank":"\u{2423}", - "blk12":"\u{2592}", - "blk14":"\u{2591}", - "blk34":"\u{2593}", - "block":"\u{2588}", - "bne":"\u{3d}\u{20e5}", - "bnequiv":"\u{2261}\u{20e5}", - "bnot":"\u{2310}", - "bopf":"\u{1d553}", - "bot":"\u{22a5}", - "bottom":"\u{22a5}", - "bowtie":"\u{22c8}", - "boxDL":"\u{2557}", - "boxDR":"\u{2554}", - "boxDl":"\u{2556}", - "boxDr":"\u{2553}", - "boxH":"\u{2550}", - "boxHD":"\u{2566}", - "boxHU":"\u{2569}", - "boxHd":"\u{2564}", - "boxHu":"\u{2567}", - "boxUL":"\u{255d}", - "boxUR":"\u{255a}", - "boxUl":"\u{255c}", - "boxUr":"\u{2559}", - "boxV":"\u{2551}", - "boxVH":"\u{256c}", - "boxVL":"\u{2563}", - "boxVR":"\u{2560}", - "boxVh":"\u{256b}", - "boxVl":"\u{2562}", - "boxVr":"\u{255f}", - "boxbox":"\u{29c9}", - "boxdL":"\u{2555}", - "boxdR":"\u{2552}", - "boxdl":"\u{2510}", - "boxdr":"\u{250c}", - "boxh":"\u{2500}", - "boxhD":"\u{2565}", - "boxhU":"\u{2568}", - "boxhd":"\u{252c}", - "boxhu":"\u{2534}", - "boxminus":"\u{229f}", - "boxplus":"\u{229e}", - "boxtimes":"\u{22a0}", - "boxuL":"\u{255b}", - "boxuR":"\u{2558}", - "boxul":"\u{2518}", - "boxur":"\u{2514}", - "boxv":"\u{2502}", - "boxvH":"\u{256a}", - "boxvL":"\u{2561}", - "boxvR":"\u{255e}", - "boxvh":"\u{253c}", - "boxvl":"\u{2524}", - "boxvr":"\u{251c}", - "bprime":"\u{2035}", - "breve":"\u{2d8}", - "brvbar":"\u{a6}", - "bscr":"\u{1d4b7}", - "bsemi":"\u{204f}", - "bsim":"\u{223d}", - "bsime":"\u{22cd}", - "bsol":"\u{5c}", - "bsolb":"\u{29c5}", - "bsolhsub":"\u{27c8}", - "bull":"\u{2022}", - "bullet":"\u{2022}", - "bump":"\u{224e}", - "bumpE":"\u{2aae}", - "bumpe":"\u{224f}", - "bumpeq":"\u{224f}", - "cacute":"\u{107}", - "cap":"\u{2229}", - "capand":"\u{2a44}", - "capbrcup":"\u{2a49}", - "capcap":"\u{2a4b}", - "capcup":"\u{2a47}", - "capdot":"\u{2a40}", - "caps":"\u{2229}\u{fe00}", - "caret":"\u{2041}", - "caron":"\u{2c7}", - "ccaps":"\u{2a4d}", - "ccaron":"\u{10d}", - "ccedil":"\u{e7}", - "ccirc":"\u{109}", - "ccups":"\u{2a4c}", - "ccupssm":"\u{2a50}", - "cdot":"\u{10b}", - "cedil":"\u{b8}", - "cemptyv":"\u{29b2}", - "cent":"\u{a2}", - "centerdot":"\u{b7}", - "cfr":"\u{1d520}", - "chcy":"\u{447}", - "check":"\u{2713}", - "checkmark":"\u{2713}", - "chi":"\u{3c7}", - "cir":"\u{25cb}", - "cirE":"\u{29c3}", - "circ":"\u{2c6}", - "circeq":"\u{2257}", - "circlearrowleft":"\u{21ba}", - "circlearrowright":"\u{21bb}", - "circledR":"\u{ae}", - "circledS":"\u{24c8}", - "circledast":"\u{229b}", - "circledcirc":"\u{229a}", - "circleddash":"\u{229d}", - "cire":"\u{2257}", - "cirfnint":"\u{2a10}", - "cirmid":"\u{2aef}", - "cirscir":"\u{29c2}", - "clubs":"\u{2663}", - "clubsuit":"\u{2663}", - "colon":"\u{3a}", - "colone":"\u{2254}", - "coloneq":"\u{2254}", - "comma":"\u{2c}", - "commat":"\u{40}", - "comp":"\u{2201}", - "compfn":"\u{2218}", - "complement":"\u{2201}", - "complexes":"\u{2102}", - "cong":"\u{2245}", - "congdot":"\u{2a6d}", - "conint":"\u{222e}", - "copf":"\u{1d554}", - "coprod":"\u{2210}", - "copy":"\u{a9}", - "copysr":"\u{2117}", - "crarr":"\u{21b5}", - "cross":"\u{2717}", - "cscr":"\u{1d4b8}", - "csub":"\u{2acf}", - "csube":"\u{2ad1}", - "csup":"\u{2ad0}", - "csupe":"\u{2ad2}", - "ctdot":"\u{22ef}", - "cudarrl":"\u{2938}", - "cudarrr":"\u{2935}", - "cuepr":"\u{22de}", - "cuesc":"\u{22df}", - "cularr":"\u{21b6}", - "cularrp":"\u{293d}", - "cup":"\u{222a}", - "cupbrcap":"\u{2a48}", - "cupcap":"\u{2a46}", - "cupcup":"\u{2a4a}", - "cupdot":"\u{228d}", - "cupor":"\u{2a45}", - "cups":"\u{222a}\u{fe00}", - "curarr":"\u{21b7}", - "curarrm":"\u{293c}", - "curlyeqprec":"\u{22de}", - "curlyeqsucc":"\u{22df}", - "curlyvee":"\u{22ce}", - "curlywedge":"\u{22cf}", - "curren":"\u{a4}", - "curvearrowleft":"\u{21b6}", - "curvearrowright":"\u{21b7}", - "cuvee":"\u{22ce}", - "cuwed":"\u{22cf}", - "cwconint":"\u{2232}", - "cwint":"\u{2231}", - "cylcty":"\u{232d}", - "dArr":"\u{21d3}", - "dHar":"\u{2965}", - "dagger":"\u{2020}", - "daleth":"\u{2138}", - "darr":"\u{2193}", - "dash":"\u{2010}", - "dashv":"\u{22a3}", - "dbkarow":"\u{290f}", - "dblac":"\u{2dd}", - "dcaron":"\u{10f}", - "dcy":"\u{434}", - "dd":"\u{2146}", - "ddagger":"\u{2021}", - "ddarr":"\u{21ca}", - "ddotseq":"\u{2a77}", - "deg":"\u{b0}", - "delta":"\u{3b4}", - "demptyv":"\u{29b1}", - "dfisht":"\u{297f}", - "dfr":"\u{1d521}", - "dharl":"\u{21c3}", - "dharr":"\u{21c2}", - "diam":"\u{22c4}", - "diamond":"\u{22c4}", - "diamondsuit":"\u{2666}", - "diams":"\u{2666}", - "die":"\u{a8}", - "digamma":"\u{3dd}", - "disin":"\u{22f2}", - "div":"\u{f7}", - "divide":"\u{f7}", - "divideontimes":"\u{22c7}", - "divonx":"\u{22c7}", - "djcy":"\u{452}", - "dlcorn":"\u{231e}", - "dlcrop":"\u{230d}", - "dollar":"\u{24}", - "dopf":"\u{1d555}", - "dot":"\u{2d9}", - "doteq":"\u{2250}", - "doteqdot":"\u{2251}", - "dotminus":"\u{2238}", - "dotplus":"\u{2214}", - "dotsquare":"\u{22a1}", - "doublebarwedge":"\u{2306}", - "downarrow":"\u{2193}", - "downdownarrows":"\u{21ca}", - "downharpoonleft":"\u{21c3}", - "downharpoonright":"\u{21c2}", - "drbkarow":"\u{2910}", - "drcorn":"\u{231f}", - "drcrop":"\u{230c}", - "dscr":"\u{1d4b9}", - "dscy":"\u{455}", - "dsol":"\u{29f6}", - "dstrok":"\u{111}", - "dtdot":"\u{22f1}", - "dtri":"\u{25bf}", - "dtrif":"\u{25be}", - "duarr":"\u{21f5}", - "duhar":"\u{296f}", - "dwangle":"\u{29a6}", - "dzcy":"\u{45f}", - "dzigrarr":"\u{27ff}", - "eDDot":"\u{2a77}", - "eDot":"\u{2251}", - "eacute":"\u{e9}", - "easter":"\u{2a6e}", - "ecaron":"\u{11b}", - "ecir":"\u{2256}", - "ecirc":"\u{ea}", - "ecolon":"\u{2255}", - "ecy":"\u{44d}", - "edot":"\u{117}", - "ee":"\u{2147}", - "efDot":"\u{2252}", - "efr":"\u{1d522}", - "eg":"\u{2a9a}", - "egrave":"\u{e8}", - "egs":"\u{2a96}", - "egsdot":"\u{2a98}", - "el":"\u{2a99}", - "elinters":"\u{23e7}", - "ell":"\u{2113}", - "els":"\u{2a95}", - "elsdot":"\u{2a97}", - "emacr":"\u{113}", - "empty":"\u{2205}", - "emptyset":"\u{2205}", - "emptyv":"\u{2205}", - "emsp":"\u{2003}", - "emsp13":"\u{2004}", - "emsp14":"\u{2005}", - "eng":"\u{14b}", - "ensp":"\u{2002}", - "eogon":"\u{119}", - "eopf":"\u{1d556}", - "epar":"\u{22d5}", - "eparsl":"\u{29e3}", - "eplus":"\u{2a71}", - "epsi":"\u{3b5}", - "epsilon":"\u{3b5}", - "epsiv":"\u{3f5}", - "eqcirc":"\u{2256}", - "eqcolon":"\u{2255}", - "eqsim":"\u{2242}", - "eqslantgtr":"\u{2a96}", - "eqslantless":"\u{2a95}", - "equals":"\u{3d}", - "equest":"\u{225f}", - "equiv":"\u{2261}", - "equivDD":"\u{2a78}", - "eqvparsl":"\u{29e5}", - "erDot":"\u{2253}", - "erarr":"\u{2971}", - "escr":"\u{212f}", - "esdot":"\u{2250}", - "esim":"\u{2242}", - "eta":"\u{3b7}", - "eth":"\u{f0}", - "euml":"\u{eb}", - "euro":"\u{20ac}", - "excl":"\u{21}", - "exist":"\u{2203}", - "expectation":"\u{2130}", - "exponentiale":"\u{2147}", - "fallingdotseq":"\u{2252}", - "fcy":"\u{444}", - "female":"\u{2640}", - "ffilig":"\u{fb03}", - "fflig":"\u{fb00}", - "ffllig":"\u{fb04}", - "ffr":"\u{1d523}", - "filig":"\u{fb01}", - "fjlig":"\u{66}\u{6a}", - "flat":"\u{266d}", - "fllig":"\u{fb02}", - "fltns":"\u{25b1}", - "fnof":"\u{192}", - "fopf":"\u{1d557}", - "forall":"\u{2200}", - "fork":"\u{22d4}", - "forkv":"\u{2ad9}", - "fpartint":"\u{2a0d}", - "frac12":"\u{bd}", - "frac13":"\u{2153}", - "frac14":"\u{bc}", - "frac15":"\u{2155}", - "frac16":"\u{2159}", - "frac18":"\u{215b}", - "frac23":"\u{2154}", - "frac25":"\u{2156}", - "frac34":"\u{be}", - "frac35":"\u{2157}", - "frac38":"\u{215c}", - "frac45":"\u{2158}", - "frac56":"\u{215a}", - "frac58":"\u{215d}", - "frac78":"\u{215e}", - "frasl":"\u{2044}", - "frown":"\u{2322}", - "fscr":"\u{1d4bb}", - "gE":"\u{2267}", - "gEl":"\u{2a8c}", - "gacute":"\u{1f5}", - "gamma":"\u{3b3}", - "gammad":"\u{3dd}", - "gap":"\u{2a86}", - "gbreve":"\u{11f}", - "gcirc":"\u{11d}", - "gcy":"\u{433}", - "gdot":"\u{121}", - "ge":"\u{2265}", - "gel":"\u{22db}", - "geq":"\u{2265}", - "geqq":"\u{2267}", - "geqslant":"\u{2a7e}", - "ges":"\u{2a7e}", - "gescc":"\u{2aa9}", - "gesdot":"\u{2a80}", - "gesdoto":"\u{2a82}", - "gesdotol":"\u{2a84}", - "gesl":"\u{22db}\u{fe00}", - "gesles":"\u{2a94}", - "gfr":"\u{1d524}", - "gg":"\u{226b}", - "ggg":"\u{22d9}", - "gimel":"\u{2137}", - "gjcy":"\u{453}", - "gl":"\u{2277}", - "glE":"\u{2a92}", - "gla":"\u{2aa5}", - "glj":"\u{2aa4}", - "gnE":"\u{2269}", - "gnap":"\u{2a8a}", - "gnapprox":"\u{2a8a}", - "gne":"\u{2a88}", - "gneq":"\u{2a88}", - "gneqq":"\u{2269}", - "gnsim":"\u{22e7}", - "gopf":"\u{1d558}", - "grave":"\u{60}", - "gscr":"\u{210a}", - "gsim":"\u{2273}", - "gsime":"\u{2a8e}", - "gsiml":"\u{2a90}", +func HTMLSpecial(for code: String) -> String? { + if let res = popularHTMLSpecialsMap[code] { + return res + } + + if otherHTMLSpecialsMap == nil { + let decoder = PropertyListDecoder() + + guard let url = Bundle(for: BundleToken.self).url(forResource: "html_specials", withExtension: "plist") else { + fatalError() + } + + do { + let data = try Data(contentsOf: url) + otherHTMLSpecialsMap = try decoder.decode([String: String].self, from: data) + } + catch { + fatalError(error.localizedDescription) + } + } + + return otherHTMLSpecialsMap?[code] +} + +private let popularHTMLSpecialsMap: [String : String] = [ "gt":"\u{3e}", - "gtcc":"\u{2aa7}", - "gtcir":"\u{2a7a}", - "gtdot":"\u{22d7}", - "gtlPar":"\u{2995}", - "gtquest":"\u{2a7c}", - "gtrapprox":"\u{2a86}", - "gtrarr":"\u{2978}", - "gtrdot":"\u{22d7}", - "gtreqless":"\u{22db}", - "gtreqqless":"\u{2a8c}", - "gtrless":"\u{2277}", - "gtrsim":"\u{2273}", - "gvertneqq":"\u{2269}\u{fe00}", - "gvnE":"\u{2269}\u{fe00}", - "hArr":"\u{21d4}", - "hairsp":"\u{200a}", - "half":"\u{bd}", - "hamilt":"\u{210b}", - "hardcy":"\u{44a}", - "harr":"\u{2194}", - "harrcir":"\u{2948}", - "harrw":"\u{21ad}", - "hbar":"\u{210f}", - "hcirc":"\u{125}", - "hearts":"\u{2665}", - "heartsuit":"\u{2665}", - "hellip":"\u{2026}", - "hercon":"\u{22b9}", - "hfr":"\u{1d525}", - "hksearow":"\u{2925}", - "hkswarow":"\u{2926}", - "hoarr":"\u{21ff}", - "homtht":"\u{223b}", - "hookleftarrow":"\u{21a9}", - "hookrightarrow":"\u{21aa}", - "hopf":"\u{1d559}", - "horbar":"\u{2015}", - "hscr":"\u{1d4bd}", - "hslash":"\u{210f}", - "hstrok":"\u{127}", - "hybull":"\u{2043}", - "hyphen":"\u{2010}", - "iacute":"\u{ed}", - "ic":"\u{2063}", - "icirc":"\u{ee}", - "icy":"\u{438}", - "iecy":"\u{435}", - "iexcl":"\u{a1}", - "iff":"\u{21d4}", - "ifr":"\u{1d526}", - "igrave":"\u{ec}", - "ii":"\u{2148}", - "iiiint":"\u{2a0c}", - "iiint":"\u{222d}", - "iinfin":"\u{29dc}", - "iiota":"\u{2129}", - "ijlig":"\u{133}", - "imacr":"\u{12b}", - "image":"\u{2111}", - "imagline":"\u{2110}", - "imagpart":"\u{2111}", - "imath":"\u{131}", - "imof":"\u{22b7}", - "imped":"\u{1b5}", - "in":"\u{2208}", - "incare":"\u{2105}", - "infin":"\u{221e}", - "infintie":"\u{29dd}", - "inodot":"\u{131}", - "int":"\u{222b}", - "intcal":"\u{22ba}", - "integers":"\u{2124}", - "intercal":"\u{22ba}", - "intlarhk":"\u{2a17}", - "intprod":"\u{2a3c}", - "iocy":"\u{451}", - "iogon":"\u{12f}", - "iopf":"\u{1d55a}", - "iota":"\u{3b9}", - "iprod":"\u{2a3c}", - "iquest":"\u{bf}", - "iscr":"\u{1d4be}", - "isin":"\u{2208}", - "isinE":"\u{22f9}", - "isindot":"\u{22f5}", - "isins":"\u{22f4}", - "isinsv":"\u{22f3}", - "isinv":"\u{2208}", - "it":"\u{2062}", - "itilde":"\u{129}", - "iukcy":"\u{456}", - "iuml":"\u{ef}", - "jcirc":"\u{135}", - "jcy":"\u{439}", - "jfr":"\u{1d527}", - "jmath":"\u{237}", - "jopf":"\u{1d55b}", - "jscr":"\u{1d4bf}", - "jsercy":"\u{458}", - "jukcy":"\u{454}", - "kappa":"\u{3ba}", - "kappav":"\u{3f0}", - "kcedil":"\u{137}", - "kcy":"\u{43a}", - "kfr":"\u{1d528}", - "kgreen":"\u{138}", - "khcy":"\u{445}", - "kjcy":"\u{45c}", - "kopf":"\u{1d55c}", - "kscr":"\u{1d4c0}", - "lAarr":"\u{21da}", - "lArr":"\u{21d0}", - "lAtail":"\u{291b}", - "lBarr":"\u{290e}", - "lE":"\u{2266}", - "lEg":"\u{2a8b}", - "lHar":"\u{2962}", - "lacute":"\u{13a}", - "laemptyv":"\u{29b4}", - "lagran":"\u{2112}", - "lambda":"\u{3bb}", - "lang":"\u{27e8}", - "langd":"\u{2991}", - "langle":"\u{27e8}", - "lap":"\u{2a85}", - "laquo":"\u{ab}", - "larr":"\u{2190}", - "larrb":"\u{21e4}", - "larrbfs":"\u{291f}", - "larrfs":"\u{291d}", - "larrhk":"\u{21a9}", - "larrlp":"\u{21ab}", - "larrpl":"\u{2939}", - "larrsim":"\u{2973}", - "larrtl":"\u{21a2}", - "lat":"\u{2aab}", - "latail":"\u{2919}", - "late":"\u{2aad}", - "lates":"\u{2aad}\u{fe00}", - "lbarr":"\u{290c}", - "lbbrk":"\u{2772}", - "lbrace":"\u{7b}", - "lbrack":"\u{5b}", - "lbrke":"\u{298b}", - "lbrksld":"\u{298f}", - "lbrkslu":"\u{298d}", - "lcaron":"\u{13e}", - "lcedil":"\u{13c}", - "lceil":"\u{2308}", - "lcub":"\u{7b}", - "lcy":"\u{43b}", - "ldca":"\u{2936}", - "ldquo":"\u{201c}", - "ldquor":"\u{201e}", - "ldrdhar":"\u{2967}", - "ldrushar":"\u{294b}", - "ldsh":"\u{21b2}", - "le":"\u{2264}", - "leftarrow":"\u{2190}", - "leftarrowtail":"\u{21a2}", - "leftharpoondown":"\u{21bd}", - "leftharpoonup":"\u{21bc}", - "leftleftarrows":"\u{21c7}", - "leftrightarrow":"\u{2194}", - "leftrightarrows":"\u{21c6}", - "leftrightharpoons":"\u{21cb}", - "leftrightsquigarrow":"\u{21ad}", - "leftthreetimes":"\u{22cb}", - "leg":"\u{22da}", - "leq":"\u{2264}", - "leqq":"\u{2266}", - "leqslant":"\u{2a7d}", - "les":"\u{2a7d}", - "lescc":"\u{2aa8}", - "lesdot":"\u{2a7f}", - "lesdoto":"\u{2a81}", - "lesdotor":"\u{2a83}", - "lesg":"\u{22da}\u{fe00}", - "lesges":"\u{2a93}", - "lessapprox":"\u{2a85}", - "lessdot":"\u{22d6}", - "lesseqgtr":"\u{22da}", - "lesseqqgtr":"\u{2a8b}", - "lessgtr":"\u{2276}", - "lesssim":"\u{2272}", - "lfisht":"\u{297c}", - "lfloor":"\u{230a}", - "lfr":"\u{1d529}", - "lg":"\u{2276}", - "lgE":"\u{2a91}", - "lhard":"\u{21bd}", - "lharu":"\u{21bc}", - "lharul":"\u{296a}", - "lhblk":"\u{2584}", - "ljcy":"\u{459}", - "ll":"\u{226a}", - "llarr":"\u{21c7}", - "llcorner":"\u{231e}", - "llhard":"\u{296b}", - "lltri":"\u{25fa}", - "lmidot":"\u{140}", - "lmoust":"\u{23b0}", - "lmoustache":"\u{23b0}", - "lnE":"\u{2268}", - "lnap":"\u{2a89}", - "lnapprox":"\u{2a89}", - "lne":"\u{2a87}", - "lneq":"\u{2a87}", - "lneqq":"\u{2268}", - "lnsim":"\u{22e6}", - "loang":"\u{27ec}", - "loarr":"\u{21fd}", - "lobrk":"\u{27e6}", - "longleftarrow":"\u{27f5}", - "longleftrightarrow":"\u{27f7}", - "longmapsto":"\u{27fc}", - "longrightarrow":"\u{27f6}", - "looparrowleft":"\u{21ab}", - "looparrowright":"\u{21ac}", - "lopar":"\u{2985}", - "lopf":"\u{1d55d}", - "loplus":"\u{2a2d}", - "lotimes":"\u{2a34}", - "lowast":"\u{2217}", - "lowbar":"\u{5f}", - "loz":"\u{25ca}", - "lozenge":"\u{25ca}", - "lozf":"\u{29eb}", - "lpar":"\u{28}", - "lparlt":"\u{2993}", - "lrarr":"\u{21c6}", - "lrcorner":"\u{231f}", - "lrhar":"\u{21cb}", - "lrhard":"\u{296d}", - "lrm":"\u{200e}", - "lrtri":"\u{22bf}", - "lsaquo":"\u{2039}", - "lscr":"\u{1d4c1}", - "lsh":"\u{21b0}", - "lsim":"\u{2272}", - "lsime":"\u{2a8d}", - "lsimg":"\u{2a8f}", - "lsqb":"\u{5b}", - "lsquo":"\u{2018}", - "lsquor":"\u{201a}", - "lstrok":"\u{142}", "lt":"\u{3c}", - "ltcc":"\u{2aa6}", - "ltcir":"\u{2a79}", - "ltdot":"\u{22d6}", - "lthree":"\u{22cb}", - "ltimes":"\u{22c9}", - "ltlarr":"\u{2976}", - "ltquest":"\u{2a7b}", - "ltrPar":"\u{2996}", - "ltri":"\u{25c3}", - "ltrie":"\u{22b4}", - "ltrif":"\u{25c2}", - "lurdshar":"\u{294a}", - "luruhar":"\u{2966}", - "lvertneqq":"\u{2268}\u{fe00}", - "lvnE":"\u{2268}\u{fe00}", - "mDDot":"\u{223a}", - "macr":"\u{af}", - "male":"\u{2642}", - "malt":"\u{2720}", - "maltese":"\u{2720}", - "map":"\u{21a6}", - "mapsto":"\u{21a6}", - "mapstodown":"\u{21a7}", - "mapstoleft":"\u{21a4}", - "mapstoup":"\u{21a5}", - "marker":"\u{25ae}", - "mcomma":"\u{2a29}", - "mcy":"\u{43c}", - "mdash":"\u{2014}", - "measuredangle":"\u{2221}", - "mfr":"\u{1d52a}", - "mho":"\u{2127}", - "micro":"\u{b5}", - "mid":"\u{2223}", - "midast":"\u{2a}", - "midcir":"\u{2af0}", - "middot":"\u{b7}", - "minus":"\u{2212}", - "minusb":"\u{229f}", - "minusd":"\u{2238}", - "minusdu":"\u{2a2a}", - "mlcp":"\u{2adb}", - "mldr":"\u{2026}", - "mnplus":"\u{2213}", - "models":"\u{22a7}", - "mopf":"\u{1d55e}", - "mp":"\u{2213}", - "mscr":"\u{1d4c2}", - "mstpos":"\u{223e}", - "mu":"\u{3bc}", - "multimap":"\u{22b8}", - "mumap":"\u{22b8}", - "nGg":"\u{22d9}\u{338}", - "nGt":"\u{226b}\u{20d2}", - "nGtv":"\u{226b}\u{338}", - "nLeftarrow":"\u{21cd}", - "nLeftrightarrow":"\u{21ce}", - "nLl":"\u{22d8}\u{338}", - "nLt":"\u{226a}\u{20d2}", - "nLtv":"\u{226a}\u{338}", - "nRightarrow":"\u{21cf}", - "nVDash":"\u{22af}", - "nVdash":"\u{22ae}", - "nabla":"\u{2207}", - "nacute":"\u{144}", - "nang":"\u{2220}\u{20d2}", - "nap":"\u{2249}", - "napE":"\u{2a70}\u{338}", - "napid":"\u{224b}\u{338}", - "napos":"\u{149}", - "napprox":"\u{2249}", - "natur":"\u{266e}", - "natural":"\u{266e}", - "naturals":"\u{2115}", - "nbsp":"\u{a0}", - "nbump":"\u{224e}\u{338}", - "nbumpe":"\u{224f}\u{338}", - "ncap":"\u{2a43}", - "ncaron":"\u{148}", - "ncedil":"\u{146}", - "ncong":"\u{2247}", - "ncongdot":"\u{2a6d}\u{338}", - "ncup":"\u{2a42}", - "ncy":"\u{43d}", - "ndash":"\u{2013}", - "ne":"\u{2260}", - "neArr":"\u{21d7}", - "nearhk":"\u{2924}", - "nearr":"\u{2197}", - "nearrow":"\u{2197}", - "nedot":"\u{2250}\u{338}", - "nequiv":"\u{2262}", - "nesear":"\u{2928}", - "nesim":"\u{2242}\u{338}", - "nexist":"\u{2204}", - "nexists":"\u{2204}", - "nfr":"\u{1d52b}", - "ngE":"\u{2267}\u{338}", - "nge":"\u{2271}", - "ngeq":"\u{2271}", - "ngeqq":"\u{2267}\u{338}", - "ngeqslant":"\u{2a7e}\u{338}", - "nges":"\u{2a7e}\u{338}", - "ngsim":"\u{2275}", - "ngt":"\u{226f}", - "ngtr":"\u{226f}", - "nhArr":"\u{21ce}", - "nharr":"\u{21ae}", - "nhpar":"\u{2af2}", - "ni":"\u{220b}", - "nis":"\u{22fc}", - "nisd":"\u{22fa}", - "niv":"\u{220b}", - "njcy":"\u{45a}", - "nlArr":"\u{21cd}", - "nlE":"\u{2266}\u{338}", - "nlarr":"\u{219a}", - "nldr":"\u{2025}", - "nle":"\u{2270}", - "nleftarrow":"\u{219a}", - "nleftrightarrow":"\u{21ae}", - "nleq":"\u{2270}", - "nleqq":"\u{2266}\u{338}", - "nleqslant":"\u{2a7d}\u{338}", - "nles":"\u{2a7d}\u{338}", - "nless":"\u{226e}", - "nlsim":"\u{2274}", - "nlt":"\u{226e}", - "nltri":"\u{22ea}", - "nltrie":"\u{22ec}", - "nmid":"\u{2224}", - "nopf":"\u{1d55f}", - "not":"\u{ac}", - "notin":"\u{2209}", - "notinE":"\u{22f9}\u{338}", - "notindot":"\u{22f5}\u{338}", - "notinva":"\u{2209}", - "notinvb":"\u{22f7}", - "notinvc":"\u{22f6}", - "notni":"\u{220c}", - "notniva":"\u{220c}", - "notnivb":"\u{22fe}", - "notnivc":"\u{22fd}", - "npar":"\u{2226}", - "nparallel":"\u{2226}", - "nparsl":"\u{2afd}\u{20e5}", - "npart":"\u{2202}\u{338}", - "npolint":"\u{2a14}", - "npr":"\u{2280}", - "nprcue":"\u{22e0}", - "npre":"\u{2aaf}\u{338}", - "nprec":"\u{2280}", - "npreceq":"\u{2aaf}\u{338}", - "nrArr":"\u{21cf}", - "nrarr":"\u{219b}", - "nrarrc":"\u{2933}\u{338}", - "nrarrw":"\u{219d}\u{338}", - "nrightarrow":"\u{219b}", - "nrtri":"\u{22eb}", - "nrtrie":"\u{22ed}", - "nsc":"\u{2281}", - "nsccue":"\u{22e1}", - "nsce":"\u{2ab0}\u{338}", - "nscr":"\u{1d4c3}", - "nshortmid":"\u{2224}", - "nshortparallel":"\u{2226}", - "nsim":"\u{2241}", - "nsime":"\u{2244}", - "nsimeq":"\u{2244}", - "nsmid":"\u{2224}", - "nspar":"\u{2226}", - "nsqsube":"\u{22e2}", - "nsqsupe":"\u{22e3}", - "nsub":"\u{2284}", - "nsubE":"\u{2ac5}\u{338}", - "nsube":"\u{2288}", - "nsubset":"\u{2282}\u{20d2}", - "nsubseteq":"\u{2288}", - "nsubseteqq":"\u{2ac5}\u{338}", - "nsucc":"\u{2281}", - "nsucceq":"\u{2ab0}\u{338}", - "nsup":"\u{2285}", - "nsupE":"\u{2ac6}\u{338}", - "nsupe":"\u{2289}", - "nsupset":"\u{2283}\u{20d2}", - "nsupseteq":"\u{2289}", - "nsupseteqq":"\u{2ac6}\u{338}", - "ntgl":"\u{2279}", - "ntilde":"\u{f1}", - "ntlg":"\u{2278}", - "ntriangleleft":"\u{22ea}", - "ntrianglelefteq":"\u{22ec}", - "ntriangleright":"\u{22eb}", - "ntrianglerighteq":"\u{22ed}", - "nu":"\u{3bd}", - "num":"\u{23}", - "numero":"\u{2116}", - "numsp":"\u{2007}", - "nvDash":"\u{22ad}", - "nvHarr":"\u{2904}", - "nvap":"\u{224d}\u{20d2}", - "nvdash":"\u{22ac}", - "nvge":"\u{2265}\u{20d2}", - "nvgt":"\u{3e}\u{20d2}", - "nvinfin":"\u{29de}", - "nvlArr":"\u{2902}", - "nvle":"\u{2264}\u{20d2}", - "nvlt":"\u{3c}\u{20d2}", - "nvltrie":"\u{22b4}\u{20d2}", - "nvrArr":"\u{2903}", - "nvrtrie":"\u{22b5}\u{20d2}", - "nvsim":"\u{223c}\u{20d2}", - "nwArr":"\u{21d6}", - "nwarhk":"\u{2923}", - "nwarr":"\u{2196}", - "nwarrow":"\u{2196}", - "nwnear":"\u{2927}", - "oS":"\u{24c8}", - "oacute":"\u{f3}", - "oast":"\u{229b}", - "ocir":"\u{229a}", - "ocirc":"\u{f4}", - "ocy":"\u{43e}", - "odash":"\u{229d}", - "odblac":"\u{151}", - "odiv":"\u{2a38}", - "odot":"\u{2299}", - "odsold":"\u{29bc}", - "oelig":"\u{153}", - "ofcir":"\u{29bf}", - "ofr":"\u{1d52c}", - "ogon":"\u{2db}", - "ograve":"\u{f2}", - "ogt":"\u{29c1}", - "ohbar":"\u{29b5}", - "ohm":"\u{3a9}", - "oint":"\u{222e}", - "olarr":"\u{21ba}", - "olcir":"\u{29be}", - "olcross":"\u{29bb}", - "oline":"\u{203e}", - "olt":"\u{29c0}", - "omacr":"\u{14d}", - "omega":"\u{3c9}", - "omicron":"\u{3bf}", - "omid":"\u{29b6}", - "ominus":"\u{2296}", - "oopf":"\u{1d560}", - "opar":"\u{29b7}", - "operp":"\u{29b9}", - "oplus":"\u{2295}", - "or":"\u{2228}", - "orarr":"\u{21bb}", - "ord":"\u{2a5d}", - "order":"\u{2134}", - "orderof":"\u{2134}", - "ordf":"\u{aa}", - "ordm":"\u{ba}", - "origof":"\u{22b6}", - "oror":"\u{2a56}", - "orslope":"\u{2a57}", - "orv":"\u{2a5b}", - "oscr":"\u{2134}", - "oslash":"\u{f8}", - "osol":"\u{2298}", - "otilde":"\u{f5}", - "otimes":"\u{2297}", - "otimesas":"\u{2a36}", - "ouml":"\u{f6}", - "ovbar":"\u{233d}", - "par":"\u{2225}", - "para":"\u{b6}", - "parallel":"\u{2225}", - "parsim":"\u{2af3}", - "parsl":"\u{2afd}", - "part":"\u{2202}", - "pcy":"\u{43f}", - "percnt":"\u{25}", - "period":"\u{2e}", - "permil":"\u{2030}", - "perp":"\u{22a5}", - "pertenk":"\u{2031}", - "pfr":"\u{1d52d}", - "phi":"\u{3c6}", - "phiv":"\u{3d5}", - "phmmat":"\u{2133}", - "phone":"\u{260e}", - "pi":"\u{3c0}", - "pitchfork":"\u{22d4}", - "piv":"\u{3d6}", - "planck":"\u{210f}", - "planckh":"\u{210e}", - "plankv":"\u{210f}", - "plus":"\u{2b}", - "plusacir":"\u{2a23}", - "plusb":"\u{229e}", - "pluscir":"\u{2a22}", - "plusdo":"\u{2214}", - "plusdu":"\u{2a25}", - "pluse":"\u{2a72}", - "plusmn":"\u{b1}", - "plussim":"\u{2a26}", - "plustwo":"\u{2a27}", - "pm":"\u{b1}", - "pointint":"\u{2a15}", - "popf":"\u{1d561}", - "pound":"\u{a3}", - "pr":"\u{227a}", - "prE":"\u{2ab3}", - "prap":"\u{2ab7}", - "prcue":"\u{227c}", - "pre":"\u{2aaf}", - "prec":"\u{227a}", - "precapprox":"\u{2ab7}", - "preccurlyeq":"\u{227c}", - "preceq":"\u{2aaf}", - "precnapprox":"\u{2ab9}", - "precneqq":"\u{2ab5}", - "precnsim":"\u{22e8}", - "precsim":"\u{227e}", - "prime":"\u{2032}", - "primes":"\u{2119}", - "prnE":"\u{2ab5}", - "prnap":"\u{2ab9}", - "prnsim":"\u{22e8}", - "prod":"\u{220f}", - "profalar":"\u{232e}", - "profline":"\u{2312}", - "profsurf":"\u{2313}", - "prop":"\u{221d}", - "propto":"\u{221d}", - "prsim":"\u{227e}", - "prurel":"\u{22b0}", - "pscr":"\u{1d4c5}", - "psi":"\u{3c8}", - "puncsp":"\u{2008}", - "qfr":"\u{1d52e}", - "qint":"\u{2a0c}", - "qopf":"\u{1d562}", - "qprime":"\u{2057}", - "qscr":"\u{1d4c6}", - "quaternions":"\u{210d}", - "quatint":"\u{2a16}", - "quest":"\u{3f}", - "questeq":"\u{225f}", - "quot":"\u{22}", - "rAarr":"\u{21db}", - "rArr":"\u{21d2}", - "rAtail":"\u{291c}", - "rBarr":"\u{290f}", - "rHar":"\u{2964}", - "race":"\u{223d}\u{331}", - "racute":"\u{155}", - "radic":"\u{221a}", - "raemptyv":"\u{29b3}", - "rang":"\u{27e9}", - "rangd":"\u{2992}", - "range":"\u{29a5}", - "rangle":"\u{27e9}", - "raquo":"\u{bb}", - "rarr":"\u{2192}", - "rarrap":"\u{2975}", - "rarrb":"\u{21e5}", - "rarrbfs":"\u{2920}", - "rarrc":"\u{2933}", - "rarrfs":"\u{291e}", - "rarrhk":"\u{21aa}", - "rarrlp":"\u{21ac}", - "rarrpl":"\u{2945}", - "rarrsim":"\u{2974}", - "rarrtl":"\u{21a3}", - "rarrw":"\u{219d}", - "ratail":"\u{291a}", - "ratio":"\u{2236}", - "rationals":"\u{211a}", - "rbarr":"\u{290d}", - "rbbrk":"\u{2773}", - "rbrace":"\u{7d}", - "rbrack":"\u{5d}", - "rbrke":"\u{298c}", - "rbrksld":"\u{298e}", - "rbrkslu":"\u{2990}", - "rcaron":"\u{159}", - "rcedil":"\u{157}", - "rceil":"\u{2309}", - "rcub":"\u{7d}", - "rcy":"\u{440}", - "rdca":"\u{2937}", - "rdldhar":"\u{2969}", - "rdquo":"\u{201d}", - "rdquor":"\u{201d}", - "rdsh":"\u{21b3}", - "real":"\u{211c}", - "realine":"\u{211b}", - "realpart":"\u{211c}", - "reals":"\u{211d}", - "rect":"\u{25ad}", - "reg":"\u{ae}", - "rfisht":"\u{297d}", - "rfloor":"\u{230b}", - "rfr":"\u{1d52f}", - "rhard":"\u{21c1}", - "rharu":"\u{21c0}", - "rharul":"\u{296c}", - "rho":"\u{3c1}", - "rhov":"\u{3f1}", - "rightarrow":"\u{2192}", - "rightarrowtail":"\u{21a3}", - "rightharpoondown":"\u{21c1}", - "rightharpoonup":"\u{21c0}", - "rightleftarrows":"\u{21c4}", - "rightleftharpoons":"\u{21cc}", - "rightrightarrows":"\u{21c9}", - "rightsquigarrow":"\u{219d}", - "rightthreetimes":"\u{22cc}", - "ring":"\u{2da}", - "risingdotseq":"\u{2253}", - "rlarr":"\u{21c4}", - "rlhar":"\u{21cc}", - "rlm":"\u{200f}", - "rmoust":"\u{23b1}", - "rmoustache":"\u{23b1}", - "rnmid":"\u{2aee}", - "roang":"\u{27ed}", - "roarr":"\u{21fe}", - "robrk":"\u{27e7}", - "ropar":"\u{2986}", - "ropf":"\u{1d563}", - "roplus":"\u{2a2e}", - "rotimes":"\u{2a35}", - "rpar":"\u{29}", - "rpargt":"\u{2994}", - "rppolint":"\u{2a12}", - "rrarr":"\u{21c9}", - "rsaquo":"\u{203a}", - "rscr":"\u{1d4c7}", - "rsh":"\u{21b1}", - "rsqb":"\u{5d}", - "rsquo":"\u{2019}", - "rsquor":"\u{2019}", - "rthree":"\u{22cc}", - "rtimes":"\u{22ca}", - "rtri":"\u{25b9}", - "rtrie":"\u{22b5}", - "rtrif":"\u{25b8}", - "rtriltri":"\u{29ce}", - "ruluhar":"\u{2968}", - "rx":"\u{211e}", - "sacute":"\u{15b}", - "sbquo":"\u{201a}", - "sc":"\u{227b}", - "scE":"\u{2ab4}", - "scap":"\u{2ab8}", - "scaron":"\u{161}", - "sccue":"\u{227d}", - "sce":"\u{2ab0}", - "scedil":"\u{15f}", - "scirc":"\u{15d}", - "scnE":"\u{2ab6}", - "scnap":"\u{2aba}", - "scnsim":"\u{22e9}", - "scpolint":"\u{2a13}", - "scsim":"\u{227f}", - "scy":"\u{441}", - "sdot":"\u{22c5}", - "sdotb":"\u{22a1}", - "sdote":"\u{2a66}", - "seArr":"\u{21d8}", - "searhk":"\u{2925}", - "searr":"\u{2198}", - "searrow":"\u{2198}", - "sect":"\u{a7}", - "semi":"\u{3b}", - "seswar":"\u{2929}", - "setminus":"\u{2216}", - "setmn":"\u{2216}", - "sext":"\u{2736}", - "sfr":"\u{1d530}", - "sfrown":"\u{2322}", - "sharp":"\u{266f}", - "shchcy":"\u{449}", - "shcy":"\u{448}", - "shortmid":"\u{2223}", - "shortparallel":"\u{2225}", - "shy":"\u{ad}", - "sigma":"\u{3c3}", - "sigmaf":"\u{3c2}", - "sigmav":"\u{3c2}", - "sim":"\u{223c}", - "simdot":"\u{2a6a}", - "sime":"\u{2243}", - "simeq":"\u{2243}", - "simg":"\u{2a9e}", - "simgE":"\u{2aa0}", - "siml":"\u{2a9d}", - "simlE":"\u{2a9f}", - "simne":"\u{2246}", - "simplus":"\u{2a24}", - "simrarr":"\u{2972}", - "slarr":"\u{2190}", - "smallsetminus":"\u{2216}", - "smashp":"\u{2a33}", - "smeparsl":"\u{29e4}", - "smid":"\u{2223}", - "smile":"\u{2323}", - "smt":"\u{2aaa}", - "smte":"\u{2aac}", - "smtes":"\u{2aac}\u{fe00}", - "softcy":"\u{44c}", - "sol":"\u{2f}", - "solb":"\u{29c4}", - "solbar":"\u{233f}", - "sopf":"\u{1d564}", - "spades":"\u{2660}", - "spadesuit":"\u{2660}", - "spar":"\u{2225}", - "sqcap":"\u{2293}", - "sqcaps":"\u{2293}\u{fe00}", - "sqcup":"\u{2294}", - "sqcups":"\u{2294}\u{fe00}", - "sqsub":"\u{228f}", - "sqsube":"\u{2291}", - "sqsubset":"\u{228f}", - "sqsubseteq":"\u{2291}", - "sqsup":"\u{2290}", - "sqsupe":"\u{2292}", - "sqsupset":"\u{2290}", - "sqsupseteq":"\u{2292}", - "squ":"\u{25a1}", - "square":"\u{25a1}", - "squarf":"\u{25aa}", - "squf":"\u{25aa}", - "srarr":"\u{2192}", - "sscr":"\u{1d4c8}", - "ssetmn":"\u{2216}", - "ssmile":"\u{2323}", - "sstarf":"\u{22c6}", - "star":"\u{2606}", - "starf":"\u{2605}", - "straightepsilon":"\u{3f5}", - "straightphi":"\u{3d5}", - "strns":"\u{af}", - "sub":"\u{2282}", - "subE":"\u{2ac5}", - "subdot":"\u{2abd}", - "sube":"\u{2286}", - "subedot":"\u{2ac3}", - "submult":"\u{2ac1}", - "subnE":"\u{2acb}", - "subne":"\u{228a}", - "subplus":"\u{2abf}", - "subrarr":"\u{2979}", - "subset":"\u{2282}", - "subseteq":"\u{2286}", - "subseteqq":"\u{2ac5}", - "subsetneq":"\u{228a}", - "subsetneqq":"\u{2acb}", - "subsim":"\u{2ac7}", - "subsub":"\u{2ad5}", - "subsup":"\u{2ad3}", - "succ":"\u{227b}", - "succapprox":"\u{2ab8}", - "succcurlyeq":"\u{227d}", - "succeq":"\u{2ab0}", - "succnapprox":"\u{2aba}", - "succneqq":"\u{2ab6}", - "succnsim":"\u{22e9}", - "succsim":"\u{227f}", - "sum":"\u{2211}", - "sung":"\u{266a}", - "sup":"\u{2283}", - "sup1":"\u{b9}", - "sup2":"\u{b2}", - "sup3":"\u{b3}", - "supE":"\u{2ac6}", - "supdot":"\u{2abe}", - "supdsub":"\u{2ad8}", - "supe":"\u{2287}", - "supedot":"\u{2ac4}", - "suphsol":"\u{27c9}", - "suphsub":"\u{2ad7}", - "suplarr":"\u{297b}", - "supmult":"\u{2ac2}", - "supnE":"\u{2acc}", - "supne":"\u{228b}", - "supplus":"\u{2ac0}", - "supset":"\u{2283}", - "supseteq":"\u{2287}", - "supseteqq":"\u{2ac6}", - "supsetneq":"\u{228b}", - "supsetneqq":"\u{2acc}", - "supsim":"\u{2ac8}", - "supsub":"\u{2ad4}", - "supsup":"\u{2ad6}", - "swArr":"\u{21d9}", - "swarhk":"\u{2926}", - "swarr":"\u{2199}", - "swarrow":"\u{2199}", - "swnwar":"\u{292a}", - "szlig":"\u{df}", - "target":"\u{2316}", - "tau":"\u{3c4}", - "tbrk":"\u{23b4}", - "tcaron":"\u{165}", - "tcedil":"\u{163}", - "tcy":"\u{442}", - "tdot":"\u{20db}", - "telrec":"\u{2315}", - "tfr":"\u{1d531}", - "there4":"\u{2234}", - "therefore":"\u{2234}", - "theta":"\u{3b8}", - "thetasym":"\u{3d1}", - "thetav":"\u{3d1}", - "thickapprox":"\u{2248}", - "thicksim":"\u{223c}", - "thinsp":"\u{2009}", - "thkap":"\u{2248}", - "thksim":"\u{223c}", - "thorn":"\u{fe}", - "tilde":"\u{2dc}", - "times":"\u{d7}", - "timesb":"\u{22a0}", - "timesbar":"\u{2a31}", - "timesd":"\u{2a30}", - "tint":"\u{222d}", - "toea":"\u{2928}", - "top":"\u{22a4}", - "topbot":"\u{2336}", - "topcir":"\u{2af1}", - "topf":"\u{1d565}", - "topfork":"\u{2ada}", - "tosa":"\u{2929}", - "tprime":"\u{2034}", - "trade":"\u{2122}", - "triangle":"\u{25b5}", - "triangledown":"\u{25bf}", - "triangleleft":"\u{25c3}", - "trianglelefteq":"\u{22b4}", - "triangleq":"\u{225c}", - "triangleright":"\u{25b9}", - "trianglerighteq":"\u{22b5}", - "tridot":"\u{25ec}", - "trie":"\u{225c}", - "triminus":"\u{2a3a}", - "triplus":"\u{2a39}", - "trisb":"\u{29cd}", - "tritime":"\u{2a3b}", - "trpezium":"\u{23e2}", - "tscr":"\u{1d4c9}", - "tscy":"\u{446}", - "tshcy":"\u{45b}", - "tstrok":"\u{167}", - "twixt":"\u{226c}", - "twoheadleftarrow":"\u{219e}", - "twoheadrightarrow":"\u{21a0}", - "uArr":"\u{21d1}", - "uHar":"\u{2963}", - "uacute":"\u{fa}", - "uarr":"\u{2191}", - "ubrcy":"\u{45e}", - "ubreve":"\u{16d}", - "ucirc":"\u{fb}", - "ucy":"\u{443}", - "udarr":"\u{21c5}", - "udblac":"\u{171}", - "udhar":"\u{296e}", - "ufisht":"\u{297e}", - "ufr":"\u{1d532}", - "ugrave":"\u{f9}", - "uharl":"\u{21bf}", - "uharr":"\u{21be}", - "uhblk":"\u{2580}", - "ulcorn":"\u{231c}", - "ulcorner":"\u{231c}", - "ulcrop":"\u{230f}", - "ultri":"\u{25f8}", - "umacr":"\u{16b}", - "uml":"\u{a8}", - "uogon":"\u{173}", - "uopf":"\u{1d566}", - "uparrow":"\u{2191}", - "updownarrow":"\u{2195}", - "upharpoonleft":"\u{21bf}", - "upharpoonright":"\u{21be}", - "uplus":"\u{228e}", - "upsi":"\u{3c5}", - "upsih":"\u{3d2}", - "upsilon":"\u{3c5}", - "upuparrows":"\u{21c8}", - "urcorn":"\u{231d}", - "urcorner":"\u{231d}", - "urcrop":"\u{230e}", - "uring":"\u{16f}", - "urtri":"\u{25f9}", - "uscr":"\u{1d4ca}", - "utdot":"\u{22f0}", - "utilde":"\u{169}", - "utri":"\u{25b5}", - "utrif":"\u{25b4}", - "uuarr":"\u{21c8}", - "uuml":"\u{fc}", - "uwangle":"\u{29a7}", - "vArr":"\u{21d5}", - "vBar":"\u{2ae8}", - "vBarv":"\u{2ae9}", - "vDash":"\u{22a8}", - "vangrt":"\u{299c}", - "varepsilon":"\u{3f5}", - "varkappa":"\u{3f0}", - "varnothing":"\u{2205}", - "varphi":"\u{3d5}", - "varpi":"\u{3d6}", - "varpropto":"\u{221d}", - "varr":"\u{2195}", - "varrho":"\u{3f1}", - "varsigma":"\u{3c2}", - "varsubsetneq":"\u{228a}\u{fe00}", - "varsubsetneqq":"\u{2acb}\u{fe00}", - "varsupsetneq":"\u{228b}\u{fe00}", - "varsupsetneqq":"\u{2acc}\u{fe00}", - "vartheta":"\u{3d1}", - "vartriangleleft":"\u{22b2}", - "vartriangleright":"\u{22b3}", - "vcy":"\u{432}", - "vdash":"\u{22a2}", - "vee":"\u{2228}", - "veebar":"\u{22bb}", - "veeeq":"\u{225a}", - "vellip":"\u{22ee}", - "verbar":"\u{7c}", - "vert":"\u{7c}", - "vfr":"\u{1d533}", - "vltri":"\u{22b2}", - "vnsub":"\u{2282}\u{20d2}", - "vnsup":"\u{2283}\u{20d2}", - "vopf":"\u{1d567}", - "vprop":"\u{221d}", - "vrtri":"\u{22b3}", - "vscr":"\u{1d4cb}", - "vsubnE":"\u{2acb}\u{fe00}", - "vsubne":"\u{228a}\u{fe00}", - "vsupnE":"\u{2acc}\u{fe00}", - "vsupne":"\u{228b}\u{fe00}", - "vzigzag":"\u{299a}", - "wcirc":"\u{175}", - "wedbar":"\u{2a5f}", - "wedge":"\u{2227}", - "wedgeq":"\u{2259}", - "weierp":"\u{2118}", - "wfr":"\u{1d534}", - "wopf":"\u{1d568}", - "wp":"\u{2118}", - "wr":"\u{2240}", - "wreath":"\u{2240}", - "wscr":"\u{1d4cc}", - "xcap":"\u{22c2}", - "xcirc":"\u{25ef}", - "xcup":"\u{22c3}", - "xdtri":"\u{25bd}", - "xfr":"\u{1d535}", - "xhArr":"\u{27fa}", - "xharr":"\u{27f7}", - "xi":"\u{3be}", - "xlArr":"\u{27f8}", - "xlarr":"\u{27f5}", - "xmap":"\u{27fc}", - "xnis":"\u{22fb}", - "xodot":"\u{2a00}", - "xopf":"\u{1d569}", - "xoplus":"\u{2a01}", - "xotime":"\u{2a02}", - "xrArr":"\u{27f9}", - "xrarr":"\u{27f6}", - "xscr":"\u{1d4cd}", - "xsqcup":"\u{2a06}", - "xuplus":"\u{2a04}", - "xutri":"\u{25b3}", - "xvee":"\u{22c1}", - "xwedge":"\u{22c0}", - "yacute":"\u{fd}", - "yacy":"\u{44f}", - "ycirc":"\u{177}", - "ycy":"\u{44b}", - "yen":"\u{a5}", - "yfr":"\u{1d536}", - "yicy":"\u{457}", - "yopf":"\u{1d56a}", - "yscr":"\u{1d4ce}", - "yucy":"\u{44e}", - "yuml":"\u{ff}", - "zacute":"\u{17a}", - "zcaron":"\u{17e}", - "zcy":"\u{437}", - "zdot":"\u{17c}", - "zeetrf":"\u{2128}", - "zeta":"\u{3b6}", - "zfr":"\u{1d537}", - "zhcy":"\u{436}", - "zigrarr":"\u{21dd}", - "zopf":"\u{1d56b}", - "zscr":"\u{1d4cf}", - "zwj":"\u{200d}", - "zwnj":"\u{200c}" + "amp":"\u{26}" ] + +private var otherHTMLSpecialsMap: [String : String]? diff --git a/Sources/String+Detection.swift b/Sources/String+Detection.swift index 03c95df..2645310 100644 --- a/Sources/String+Detection.swift +++ b/Sources/String+Detection.swift @@ -158,7 +158,7 @@ extension String { } else { if let potentialSpecial = scanner.scanCharacters(from: CharacterSet.letters) { if scanner.scanString(";") != nil { - resultString += HTMLSpecialsMap[potentialSpecial] ?? "&\(potentialSpecial);" + resultString += HTMLSpecial(for: potentialSpecial) ?? "&\(potentialSpecial);" } else { resultString += "&" resultString += potentialSpecial diff --git a/Sources/html_specials.plist b/Sources/html_specials.plist new file mode 100644 index 0000000000000000000000000000000000000000..d59e459acadffdc0fd39c68710e79fbf579e2318 GIT binary patch literal 40151 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 literal 0 HcmV?d00001 diff --git a/Tests/AtributikaTests/AtributikaTests.swift b/Tests/AtributikaTests/AtributikaTests.swift index 0c0795f..d2ee0fc 100644 --- a/Tests/AtributikaTests/AtributikaTests.swift +++ b/Tests/AtributikaTests/AtributikaTests.swift @@ -482,7 +482,9 @@ class AtributikaTests: XCTestCase { XCTAssertEqual(">".detectTags().string, ">") XCTAssertEqual("".detectTags().string, "") - XCTAssertEqual("< a>".detectTags().string, "< a>") + XCTAssertEqual("< a>".detectTags().string, "< a>") + XCTAssertEqual("⁄".detectTags().string, "⁄") + XCTAssertEqual("»".detectTags().string, "»") } func testSpecialCodes() {