@longsightgroup/qti3-core 0.10.6 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. package/README.md +126 -0
  2. package/dist/adaptive-turn-materializer.js +4 -5
  3. package/dist/adaptive-turn-materializer.js.map +1 -1
  4. package/dist/adaptive-turn.d.ts.map +1 -1
  5. package/dist/adaptive-turn.js +1 -0
  6. package/dist/adaptive-turn.js.map +1 -1
  7. package/dist/attempt-state.d.ts.map +1 -1
  8. package/dist/attempt-state.js +41 -1
  9. package/dist/attempt-state.js.map +1 -1
  10. package/dist/diagnostics.d.ts +13 -0
  11. package/dist/diagnostics.d.ts.map +1 -0
  12. package/dist/diagnostics.js +28 -0
  13. package/dist/diagnostics.js.map +1 -0
  14. package/dist/index.d.ts +3 -2
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +2 -1
  17. package/dist/index.js.map +1 -1
  18. package/dist/item-submission-materialization.d.ts.map +1 -1
  19. package/dist/item-submission-materialization.js +2 -0
  20. package/dist/item-submission-materialization.js.map +1 -1
  21. package/dist/parser-processing.d.ts.map +1 -1
  22. package/dist/parser-processing.js +8 -18
  23. package/dist/parser-processing.js.map +1 -1
  24. package/dist/parser-values.d.ts.map +1 -1
  25. package/dist/parser-values.js +1 -3
  26. package/dist/parser-values.js.map +1 -1
  27. package/dist/parser.js +32 -0
  28. package/dist/parser.js.map +1 -1
  29. package/dist/processing-equality.d.ts +10 -0
  30. package/dist/processing-equality.d.ts.map +1 -0
  31. package/dist/processing-equality.js +78 -0
  32. package/dist/processing-equality.js.map +1 -0
  33. package/dist/processing-evaluator-comparison.d.ts.map +1 -1
  34. package/dist/processing-evaluator-comparison.js +14 -9
  35. package/dist/processing-evaluator-comparison.js.map +1 -1
  36. package/dist/processing-evaluator-numeric.d.ts.map +1 -1
  37. package/dist/processing-evaluator-numeric.js +2 -1
  38. package/dist/processing-evaluator-numeric.js.map +1 -1
  39. package/dist/processing-evaluator-string.d.ts.map +1 -1
  40. package/dist/processing-evaluator-string.js +26 -10
  41. package/dist/processing-evaluator-string.js.map +1 -1
  42. package/dist/processing-evaluator-variable.d.ts.map +1 -1
  43. package/dist/processing-evaluator-variable.js +9 -3
  44. package/dist/processing-evaluator-variable.js.map +1 -1
  45. package/dist/processing-evaluator.d.ts +5 -1
  46. package/dist/processing-evaluator.d.ts.map +1 -1
  47. package/dist/processing-evaluator.js +13 -4
  48. package/dist/processing-evaluator.js.map +1 -1
  49. package/dist/processing-expression-children.d.ts.map +1 -1
  50. package/dist/processing-expression-children.js +2 -3
  51. package/dist/processing-expression-children.js.map +1 -1
  52. package/dist/processing-expression-tags.d.ts +2 -1
  53. package/dist/processing-expression-tags.d.ts.map +1 -1
  54. package/dist/processing-expression-tags.js +2 -1
  55. package/dist/processing-expression-tags.js.map +1 -1
  56. package/dist/processing-mapping.d.ts.map +1 -1
  57. package/dist/processing-mapping.js +26 -16
  58. package/dist/processing-mapping.js.map +1 -1
  59. package/dist/processing-state.d.ts +2 -2
  60. package/dist/processing-state.d.ts.map +1 -1
  61. package/dist/processing-state.js +5 -2
  62. package/dist/processing-state.js.map +1 -1
  63. package/dist/processing-values.d.ts +1 -2
  64. package/dist/processing-values.d.ts.map +1 -1
  65. package/dist/processing-values.js +1 -3
  66. package/dist/processing-values.js.map +1 -1
  67. package/dist/processing-variables.d.ts.map +1 -1
  68. package/dist/processing-variables.js +10 -5
  69. package/dist/processing-variables.js.map +1 -1
  70. package/dist/qti-package-assets.d.ts.map +1 -1
  71. package/dist/qti-package-assets.js +16 -10
  72. package/dist/qti-package-assets.js.map +1 -1
  73. package/dist/qti-package-manifest.d.ts +1 -0
  74. package/dist/qti-package-manifest.d.ts.map +1 -1
  75. package/dist/qti-package-manifest.js +1 -0
  76. package/dist/qti-package-manifest.js.map +1 -1
  77. package/dist/qti-package-metadata.d.ts.map +1 -1
  78. package/dist/qti-package-metadata.js +11 -0
  79. package/dist/qti-package-metadata.js.map +1 -1
  80. package/dist/qti-package-plan.d.ts +1 -1
  81. package/dist/qti-package-plan.d.ts.map +1 -1
  82. package/dist/qti-package-types.d.ts +9 -0
  83. package/dist/qti-package-types.d.ts.map +1 -1
  84. package/dist/qti-package-xml.d.ts +6 -1
  85. package/dist/qti-package-xml.d.ts.map +1 -1
  86. package/dist/qti-package-xml.js +11 -6
  87. package/dist/qti-package-xml.js.map +1 -1
  88. package/dist/qti-package-zip.d.ts +13 -1
  89. package/dist/qti-package-zip.d.ts.map +1 -1
  90. package/dist/qti-package-zip.js +185 -54
  91. package/dist/qti-package-zip.js.map +1 -1
  92. package/dist/qti-package.d.ts +12 -5
  93. package/dist/qti-package.d.ts.map +1 -1
  94. package/dist/qti-package.js +63 -8
  95. package/dist/qti-package.js.map +1 -1
  96. package/dist/response-validation-policy.d.ts.map +1 -1
  97. package/dist/response-validation-policy.js +3 -1
  98. package/dist/response-validation-policy.js.map +1 -1
  99. package/dist/response-validation.d.ts.map +1 -1
  100. package/dist/response-validation.js +2 -1
  101. package/dist/response-validation.js.map +1 -1
  102. package/dist/serializer-processing-expressions.d.ts.map +1 -1
  103. package/dist/serializer-processing-expressions.js +2 -10
  104. package/dist/serializer-processing-expressions.js.map +1 -1
  105. package/dist/server-scoring.d.ts.map +1 -1
  106. package/dist/server-scoring.js +1 -0
  107. package/dist/server-scoring.js.map +1 -1
  108. package/dist/session-builtins.d.ts +16 -0
  109. package/dist/session-builtins.d.ts.map +1 -0
  110. package/dist/session-builtins.js +58 -0
  111. package/dist/session-builtins.js.map +1 -0
  112. package/dist/session.d.ts +5 -1
  113. package/dist/session.d.ts.map +1 -1
  114. package/dist/session.js +63 -11
  115. package/dist/session.js.map +1 -1
  116. package/dist/support-evidence.d.ts.map +1 -1
  117. package/dist/support-evidence.js +2 -0
  118. package/dist/support-evidence.js.map +1 -1
  119. package/dist/support.d.ts.map +1 -1
  120. package/dist/support.js +64 -23
  121. package/dist/support.js.map +1 -1
  122. package/dist/trusted-item-session.d.ts +4 -1
  123. package/dist/trusted-item-session.d.ts.map +1 -1
  124. package/dist/trusted-item-session.js +8 -3
  125. package/dist/trusted-item-session.js.map +1 -1
  126. package/dist/types.d.ts +21 -3
  127. package/dist/types.d.ts.map +1 -1
  128. package/dist/validation-declaration-entries.d.ts.map +1 -1
  129. package/dist/validation-declaration-entries.js +11 -1
  130. package/dist/validation-declaration-entries.js.map +1 -1
  131. package/dist/validation-item-children.d.ts +4 -0
  132. package/dist/validation-item-children.d.ts.map +1 -0
  133. package/dist/validation-item-children.js +45 -0
  134. package/dist/validation-item-children.js.map +1 -0
  135. package/dist/validation-processing.d.ts.map +1 -1
  136. package/dist/validation-processing.js +45 -12
  137. package/dist/validation-processing.js.map +1 -1
  138. package/dist/validation.d.ts.map +1 -1
  139. package/dist/validation.js +12 -0
  140. package/dist/validation.js.map +1 -1
  141. package/dist/value-guards.d.ts +4 -0
  142. package/dist/value-guards.d.ts.map +1 -0
  143. package/dist/value-guards.js +5 -0
  144. package/dist/value-guards.js.map +1 -0
  145. package/dist/xml-schema-regex-data.d.ts +48 -0
  146. package/dist/xml-schema-regex-data.d.ts.map +1 -0
  147. package/dist/xml-schema-regex-data.js +403 -0
  148. package/dist/xml-schema-regex-data.js.map +1 -0
  149. package/dist/xml-schema-regex-parser.d.ts +31 -0
  150. package/dist/xml-schema-regex-parser.d.ts.map +1 -0
  151. package/dist/xml-schema-regex-parser.js +245 -0
  152. package/dist/xml-schema-regex-parser.js.map +1 -0
  153. package/dist/xml-schema-regex.d.ts +14 -0
  154. package/dist/xml-schema-regex.d.ts.map +1 -0
  155. package/dist/xml-schema-regex.js +114 -0
  156. package/dist/xml-schema-regex.js.map +1 -0
  157. package/package.json +1 -1
  158. package/src/adaptive-turn-materializer.ts +4 -3
  159. package/src/adaptive-turn.ts +1 -0
  160. package/src/attempt-state.ts +54 -1
  161. package/src/diagnostics.ts +29 -0
  162. package/src/index.ts +9 -0
  163. package/src/item-submission-materialization.ts +2 -0
  164. package/src/parser-processing.ts +15 -18
  165. package/src/parser-values.ts +1 -5
  166. package/src/parser.ts +34 -0
  167. package/src/processing-equality.ts +104 -0
  168. package/src/processing-evaluator-comparison.ts +19 -14
  169. package/src/processing-evaluator-numeric.ts +2 -6
  170. package/src/processing-evaluator-string.ts +25 -18
  171. package/src/processing-evaluator-variable.ts +8 -3
  172. package/src/processing-evaluator.ts +20 -7
  173. package/src/processing-expression-children.ts +2 -3
  174. package/src/processing-expression-tags.ts +2 -1
  175. package/src/processing-mapping.ts +31 -25
  176. package/src/processing-state.ts +6 -1
  177. package/src/processing-values.ts +2 -11
  178. package/src/processing-variables.ts +9 -7
  179. package/src/qti-package-assets.ts +20 -13
  180. package/src/qti-package-manifest.ts +1 -0
  181. package/src/qti-package-metadata.ts +11 -0
  182. package/src/qti-package-plan.ts +1 -1
  183. package/src/qti-package-types.ts +10 -0
  184. package/src/qti-package-xml.ts +11 -6
  185. package/src/qti-package-zip.ts +330 -97
  186. package/src/qti-package.ts +106 -7
  187. package/src/response-validation-policy.ts +5 -1
  188. package/src/response-validation.ts +2 -1
  189. package/src/serializer-processing-expressions.ts +8 -25
  190. package/src/server-scoring.ts +1 -0
  191. package/src/session-builtins.ts +75 -0
  192. package/src/session.ts +64 -8
  193. package/src/support-evidence.ts +2 -0
  194. package/src/support.ts +84 -23
  195. package/src/trusted-item-session.ts +13 -2
  196. package/src/types.ts +30 -4
  197. package/src/validation-declaration-entries.ts +11 -1
  198. package/src/validation-item-children.ts +48 -0
  199. package/src/validation-processing.ts +47 -10
  200. package/src/validation.ts +14 -0
  201. package/src/value-guards.ts +6 -0
  202. package/src/xml-schema-regex-data.ts +404 -0
  203. package/src/xml-schema-regex-parser.ts +234 -0
  204. package/src/xml-schema-regex.ts +115 -0
@@ -0,0 +1,404 @@
1
+ /** Unicode 17.0.0 blocks, generated from https://www.unicode.org/Public/17.0.0/ucd/Blocks.txt.
2
+ * Block names retain XML Schema case and hyphens; only spaces are removed.
3
+ * The data is distributed under the following license.
4
+ *
5
+ * UNICODE LICENSE V3
6
+ *
7
+ * COPYRIGHT AND PERMISSION NOTICE
8
+ *
9
+ * Copyright © 1991-2026 Unicode, Inc.
10
+ *
11
+ * NOTICE TO USER: Carefully read the following legal agreement. BY
12
+ * DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR
13
+ * SOFTWARE, YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE
14
+ * TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT
15
+ * DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE.
16
+ *
17
+ * Permission is hereby granted, free of charge, to any person obtaining a
18
+ * copy of data files and any associated documentation (the "Data Files") or
19
+ * software and any associated documentation (the "Software") to deal in the
20
+ * Data Files or Software without restriction, including without limitation
21
+ * the rights to use, copy, modify, merge, publish, distribute, and/or sell
22
+ * copies of the Data Files or Software, and to permit persons to whom the
23
+ * Data Files or Software are furnished to do so, provided that either (a)
24
+ * this copyright and permission notice appear with all copies of the Data
25
+ * Files or Software, or (b) this copyright and permission notice appear in
26
+ * associated Documentation.
27
+ *
28
+ * THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
29
+ * KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
30
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
31
+ * THIRD PARTY RIGHTS.
32
+ *
33
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE
34
+ * BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES,
35
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
36
+ * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
37
+ * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA
38
+ * FILES OR SOFTWARE.
39
+ *
40
+ * Except as contained in this notice, the name of a copyright holder shall
41
+ * not be used in advertising or otherwise to promote the sale, use or other
42
+ * dealings in these Data Files or Software without prior written
43
+ * authorization of the copyright holder.
44
+ */
45
+ export const xmlSchemaBlocks: Readonly<Record<string, string>> = {
46
+ BasicLatin: "\\u{0000}-\\u{007F}",
47
+ "Latin-1Supplement": "\\u{0080}-\\u{00FF}",
48
+ "LatinExtended-A": "\\u{0100}-\\u{017F}",
49
+ "LatinExtended-B": "\\u{0180}-\\u{024F}",
50
+ IPAExtensions: "\\u{0250}-\\u{02AF}",
51
+ SpacingModifierLetters: "\\u{02B0}-\\u{02FF}",
52
+ CombiningDiacriticalMarks: "\\u{0300}-\\u{036F}",
53
+ GreekandCoptic: "\\u{0370}-\\u{03FF}",
54
+ Cyrillic: "\\u{0400}-\\u{04FF}",
55
+ CyrillicSupplement: "\\u{0500}-\\u{052F}",
56
+ Armenian: "\\u{0530}-\\u{058F}",
57
+ Hebrew: "\\u{0590}-\\u{05FF}",
58
+ Arabic: "\\u{0600}-\\u{06FF}",
59
+ Syriac: "\\u{0700}-\\u{074F}",
60
+ ArabicSupplement: "\\u{0750}-\\u{077F}",
61
+ Thaana: "\\u{0780}-\\u{07BF}",
62
+ NKo: "\\u{07C0}-\\u{07FF}",
63
+ Samaritan: "\\u{0800}-\\u{083F}",
64
+ Mandaic: "\\u{0840}-\\u{085F}",
65
+ SyriacSupplement: "\\u{0860}-\\u{086F}",
66
+ "ArabicExtended-B": "\\u{0870}-\\u{089F}",
67
+ "ArabicExtended-A": "\\u{08A0}-\\u{08FF}",
68
+ Devanagari: "\\u{0900}-\\u{097F}",
69
+ Bengali: "\\u{0980}-\\u{09FF}",
70
+ Gurmukhi: "\\u{0A00}-\\u{0A7F}",
71
+ Gujarati: "\\u{0A80}-\\u{0AFF}",
72
+ Oriya: "\\u{0B00}-\\u{0B7F}",
73
+ Tamil: "\\u{0B80}-\\u{0BFF}",
74
+ Telugu: "\\u{0C00}-\\u{0C7F}",
75
+ Kannada: "\\u{0C80}-\\u{0CFF}",
76
+ Malayalam: "\\u{0D00}-\\u{0D7F}",
77
+ Sinhala: "\\u{0D80}-\\u{0DFF}",
78
+ Thai: "\\u{0E00}-\\u{0E7F}",
79
+ Lao: "\\u{0E80}-\\u{0EFF}",
80
+ Tibetan: "\\u{0F00}-\\u{0FFF}",
81
+ Myanmar: "\\u{1000}-\\u{109F}",
82
+ Georgian: "\\u{10A0}-\\u{10FF}",
83
+ HangulJamo: "\\u{1100}-\\u{11FF}",
84
+ Ethiopic: "\\u{1200}-\\u{137F}",
85
+ EthiopicSupplement: "\\u{1380}-\\u{139F}",
86
+ Cherokee: "\\u{13A0}-\\u{13FF}",
87
+ UnifiedCanadianAboriginalSyllabics: "\\u{1400}-\\u{167F}",
88
+ Ogham: "\\u{1680}-\\u{169F}",
89
+ Runic: "\\u{16A0}-\\u{16FF}",
90
+ Tagalog: "\\u{1700}-\\u{171F}",
91
+ Hanunoo: "\\u{1720}-\\u{173F}",
92
+ Buhid: "\\u{1740}-\\u{175F}",
93
+ Tagbanwa: "\\u{1760}-\\u{177F}",
94
+ Khmer: "\\u{1780}-\\u{17FF}",
95
+ Mongolian: "\\u{1800}-\\u{18AF}",
96
+ UnifiedCanadianAboriginalSyllabicsExtended: "\\u{18B0}-\\u{18FF}",
97
+ Limbu: "\\u{1900}-\\u{194F}",
98
+ TaiLe: "\\u{1950}-\\u{197F}",
99
+ NewTaiLue: "\\u{1980}-\\u{19DF}",
100
+ KhmerSymbols: "\\u{19E0}-\\u{19FF}",
101
+ Buginese: "\\u{1A00}-\\u{1A1F}",
102
+ TaiTham: "\\u{1A20}-\\u{1AAF}",
103
+ CombiningDiacriticalMarksExtended: "\\u{1AB0}-\\u{1AFF}",
104
+ Balinese: "\\u{1B00}-\\u{1B7F}",
105
+ Sundanese: "\\u{1B80}-\\u{1BBF}",
106
+ Batak: "\\u{1BC0}-\\u{1BFF}",
107
+ Lepcha: "\\u{1C00}-\\u{1C4F}",
108
+ OlChiki: "\\u{1C50}-\\u{1C7F}",
109
+ "CyrillicExtended-C": "\\u{1C80}-\\u{1C8F}",
110
+ GeorgianExtended: "\\u{1C90}-\\u{1CBF}",
111
+ SundaneseSupplement: "\\u{1CC0}-\\u{1CCF}",
112
+ VedicExtensions: "\\u{1CD0}-\\u{1CFF}",
113
+ PhoneticExtensions: "\\u{1D00}-\\u{1D7F}",
114
+ PhoneticExtensionsSupplement: "\\u{1D80}-\\u{1DBF}",
115
+ CombiningDiacriticalMarksSupplement: "\\u{1DC0}-\\u{1DFF}",
116
+ LatinExtendedAdditional: "\\u{1E00}-\\u{1EFF}",
117
+ GreekExtended: "\\u{1F00}-\\u{1FFF}",
118
+ GeneralPunctuation: "\\u{2000}-\\u{206F}",
119
+ SuperscriptsandSubscripts: "\\u{2070}-\\u{209F}",
120
+ CurrencySymbols: "\\u{20A0}-\\u{20CF}",
121
+ CombiningDiacriticalMarksforSymbols: "\\u{20D0}-\\u{20FF}",
122
+ LetterlikeSymbols: "\\u{2100}-\\u{214F}",
123
+ NumberForms: "\\u{2150}-\\u{218F}",
124
+ Arrows: "\\u{2190}-\\u{21FF}",
125
+ MathematicalOperators: "\\u{2200}-\\u{22FF}",
126
+ MiscellaneousTechnical: "\\u{2300}-\\u{23FF}",
127
+ ControlPictures: "\\u{2400}-\\u{243F}",
128
+ OpticalCharacterRecognition: "\\u{2440}-\\u{245F}",
129
+ EnclosedAlphanumerics: "\\u{2460}-\\u{24FF}",
130
+ BoxDrawing: "\\u{2500}-\\u{257F}",
131
+ BlockElements: "\\u{2580}-\\u{259F}",
132
+ GeometricShapes: "\\u{25A0}-\\u{25FF}",
133
+ MiscellaneousSymbols: "\\u{2600}-\\u{26FF}",
134
+ Dingbats: "\\u{2700}-\\u{27BF}",
135
+ "MiscellaneousMathematicalSymbols-A": "\\u{27C0}-\\u{27EF}",
136
+ "SupplementalArrows-A": "\\u{27F0}-\\u{27FF}",
137
+ BraillePatterns: "\\u{2800}-\\u{28FF}",
138
+ "SupplementalArrows-B": "\\u{2900}-\\u{297F}",
139
+ "MiscellaneousMathematicalSymbols-B": "\\u{2980}-\\u{29FF}",
140
+ SupplementalMathematicalOperators: "\\u{2A00}-\\u{2AFF}",
141
+ MiscellaneousSymbolsandArrows: "\\u{2B00}-\\u{2BFF}",
142
+ Glagolitic: "\\u{2C00}-\\u{2C5F}",
143
+ "LatinExtended-C": "\\u{2C60}-\\u{2C7F}",
144
+ Coptic: "\\u{2C80}-\\u{2CFF}",
145
+ GeorgianSupplement: "\\u{2D00}-\\u{2D2F}",
146
+ Tifinagh: "\\u{2D30}-\\u{2D7F}",
147
+ EthiopicExtended: "\\u{2D80}-\\u{2DDF}",
148
+ "CyrillicExtended-A": "\\u{2DE0}-\\u{2DFF}",
149
+ SupplementalPunctuation: "\\u{2E00}-\\u{2E7F}",
150
+ CJKRadicalsSupplement: "\\u{2E80}-\\u{2EFF}",
151
+ KangxiRadicals: "\\u{2F00}-\\u{2FDF}",
152
+ IdeographicDescriptionCharacters: "\\u{2FF0}-\\u{2FFF}",
153
+ CJKSymbolsandPunctuation: "\\u{3000}-\\u{303F}",
154
+ Hiragana: "\\u{3040}-\\u{309F}",
155
+ Katakana: "\\u{30A0}-\\u{30FF}",
156
+ Bopomofo: "\\u{3100}-\\u{312F}",
157
+ HangulCompatibilityJamo: "\\u{3130}-\\u{318F}",
158
+ Kanbun: "\\u{3190}-\\u{319F}",
159
+ BopomofoExtended: "\\u{31A0}-\\u{31BF}",
160
+ CJKStrokes: "\\u{31C0}-\\u{31EF}",
161
+ KatakanaPhoneticExtensions: "\\u{31F0}-\\u{31FF}",
162
+ EnclosedCJKLettersandMonths: "\\u{3200}-\\u{32FF}",
163
+ CJKCompatibility: "\\u{3300}-\\u{33FF}",
164
+ CJKUnifiedIdeographsExtensionA: "\\u{3400}-\\u{4DBF}",
165
+ YijingHexagramSymbols: "\\u{4DC0}-\\u{4DFF}",
166
+ CJKUnifiedIdeographs: "\\u{4E00}-\\u{9FFF}",
167
+ YiSyllables: "\\u{A000}-\\u{A48F}",
168
+ YiRadicals: "\\u{A490}-\\u{A4CF}",
169
+ Lisu: "\\u{A4D0}-\\u{A4FF}",
170
+ Vai: "\\u{A500}-\\u{A63F}",
171
+ "CyrillicExtended-B": "\\u{A640}-\\u{A69F}",
172
+ Bamum: "\\u{A6A0}-\\u{A6FF}",
173
+ ModifierToneLetters: "\\u{A700}-\\u{A71F}",
174
+ "LatinExtended-D": "\\u{A720}-\\u{A7FF}",
175
+ SylotiNagri: "\\u{A800}-\\u{A82F}",
176
+ CommonIndicNumberForms: "\\u{A830}-\\u{A83F}",
177
+ "Phags-pa": "\\u{A840}-\\u{A87F}",
178
+ Saurashtra: "\\u{A880}-\\u{A8DF}",
179
+ DevanagariExtended: "\\u{A8E0}-\\u{A8FF}",
180
+ KayahLi: "\\u{A900}-\\u{A92F}",
181
+ Rejang: "\\u{A930}-\\u{A95F}",
182
+ "HangulJamoExtended-A": "\\u{A960}-\\u{A97F}",
183
+ Javanese: "\\u{A980}-\\u{A9DF}",
184
+ "MyanmarExtended-B": "\\u{A9E0}-\\u{A9FF}",
185
+ Cham: "\\u{AA00}-\\u{AA5F}",
186
+ "MyanmarExtended-A": "\\u{AA60}-\\u{AA7F}",
187
+ TaiViet: "\\u{AA80}-\\u{AADF}",
188
+ MeeteiMayekExtensions: "\\u{AAE0}-\\u{AAFF}",
189
+ "EthiopicExtended-A": "\\u{AB00}-\\u{AB2F}",
190
+ "LatinExtended-E": "\\u{AB30}-\\u{AB6F}",
191
+ CherokeeSupplement: "\\u{AB70}-\\u{ABBF}",
192
+ MeeteiMayek: "\\u{ABC0}-\\u{ABFF}",
193
+ HangulSyllables: "\\u{AC00}-\\u{D7AF}",
194
+ "HangulJamoExtended-B": "\\u{D7B0}-\\u{D7FF}",
195
+ PrivateUseArea: "\\u{E000}-\\u{F8FF}",
196
+ CJKCompatibilityIdeographs: "\\u{F900}-\\u{FAFF}",
197
+ AlphabeticPresentationForms: "\\u{FB00}-\\u{FB4F}",
198
+ "ArabicPresentationForms-A": "\\u{FB50}-\\u{FDFF}",
199
+ VariationSelectors: "\\u{FE00}-\\u{FE0F}",
200
+ VerticalForms: "\\u{FE10}-\\u{FE1F}",
201
+ CombiningHalfMarks: "\\u{FE20}-\\u{FE2F}",
202
+ CJKCompatibilityForms: "\\u{FE30}-\\u{FE4F}",
203
+ SmallFormVariants: "\\u{FE50}-\\u{FE6F}",
204
+ "ArabicPresentationForms-B": "\\u{FE70}-\\u{FEFF}",
205
+ HalfwidthandFullwidthForms: "\\u{FF00}-\\u{FFEF}",
206
+ Specials: "\\u{FFF0}-\\u{FFFF}",
207
+ LinearBSyllabary: "\\u{10000}-\\u{1007F}",
208
+ LinearBIdeograms: "\\u{10080}-\\u{100FF}",
209
+ AegeanNumbers: "\\u{10100}-\\u{1013F}",
210
+ AncientGreekNumbers: "\\u{10140}-\\u{1018F}",
211
+ AncientSymbols: "\\u{10190}-\\u{101CF}",
212
+ PhaistosDisc: "\\u{101D0}-\\u{101FF}",
213
+ Lycian: "\\u{10280}-\\u{1029F}",
214
+ Carian: "\\u{102A0}-\\u{102DF}",
215
+ CopticEpactNumbers: "\\u{102E0}-\\u{102FF}",
216
+ OldItalic: "\\u{10300}-\\u{1032F}",
217
+ Gothic: "\\u{10330}-\\u{1034F}",
218
+ OldPermic: "\\u{10350}-\\u{1037F}",
219
+ Ugaritic: "\\u{10380}-\\u{1039F}",
220
+ OldPersian: "\\u{103A0}-\\u{103DF}",
221
+ Deseret: "\\u{10400}-\\u{1044F}",
222
+ Shavian: "\\u{10450}-\\u{1047F}",
223
+ Osmanya: "\\u{10480}-\\u{104AF}",
224
+ Osage: "\\u{104B0}-\\u{104FF}",
225
+ Elbasan: "\\u{10500}-\\u{1052F}",
226
+ CaucasianAlbanian: "\\u{10530}-\\u{1056F}",
227
+ Vithkuqi: "\\u{10570}-\\u{105BF}",
228
+ Todhri: "\\u{105C0}-\\u{105FF}",
229
+ LinearA: "\\u{10600}-\\u{1077F}",
230
+ "LatinExtended-F": "\\u{10780}-\\u{107BF}",
231
+ CypriotSyllabary: "\\u{10800}-\\u{1083F}",
232
+ ImperialAramaic: "\\u{10840}-\\u{1085F}",
233
+ Palmyrene: "\\u{10860}-\\u{1087F}",
234
+ Nabataean: "\\u{10880}-\\u{108AF}",
235
+ Hatran: "\\u{108E0}-\\u{108FF}",
236
+ Phoenician: "\\u{10900}-\\u{1091F}",
237
+ Lydian: "\\u{10920}-\\u{1093F}",
238
+ Sidetic: "\\u{10940}-\\u{1095F}",
239
+ MeroiticHieroglyphs: "\\u{10980}-\\u{1099F}",
240
+ MeroiticCursive: "\\u{109A0}-\\u{109FF}",
241
+ Kharoshthi: "\\u{10A00}-\\u{10A5F}",
242
+ OldSouthArabian: "\\u{10A60}-\\u{10A7F}",
243
+ OldNorthArabian: "\\u{10A80}-\\u{10A9F}",
244
+ Manichaean: "\\u{10AC0}-\\u{10AFF}",
245
+ Avestan: "\\u{10B00}-\\u{10B3F}",
246
+ InscriptionalParthian: "\\u{10B40}-\\u{10B5F}",
247
+ InscriptionalPahlavi: "\\u{10B60}-\\u{10B7F}",
248
+ PsalterPahlavi: "\\u{10B80}-\\u{10BAF}",
249
+ OldTurkic: "\\u{10C00}-\\u{10C4F}",
250
+ OldHungarian: "\\u{10C80}-\\u{10CFF}",
251
+ HanifiRohingya: "\\u{10D00}-\\u{10D3F}",
252
+ Garay: "\\u{10D40}-\\u{10D8F}",
253
+ RumiNumeralSymbols: "\\u{10E60}-\\u{10E7F}",
254
+ Yezidi: "\\u{10E80}-\\u{10EBF}",
255
+ "ArabicExtended-C": "\\u{10EC0}-\\u{10EFF}",
256
+ OldSogdian: "\\u{10F00}-\\u{10F2F}",
257
+ Sogdian: "\\u{10F30}-\\u{10F6F}",
258
+ OldUyghur: "\\u{10F70}-\\u{10FAF}",
259
+ Chorasmian: "\\u{10FB0}-\\u{10FDF}",
260
+ Elymaic: "\\u{10FE0}-\\u{10FFF}",
261
+ Brahmi: "\\u{11000}-\\u{1107F}",
262
+ Kaithi: "\\u{11080}-\\u{110CF}",
263
+ SoraSompeng: "\\u{110D0}-\\u{110FF}",
264
+ Chakma: "\\u{11100}-\\u{1114F}",
265
+ Mahajani: "\\u{11150}-\\u{1117F}",
266
+ Sharada: "\\u{11180}-\\u{111DF}",
267
+ SinhalaArchaicNumbers: "\\u{111E0}-\\u{111FF}",
268
+ Khojki: "\\u{11200}-\\u{1124F}",
269
+ Multani: "\\u{11280}-\\u{112AF}",
270
+ Khudawadi: "\\u{112B0}-\\u{112FF}",
271
+ Grantha: "\\u{11300}-\\u{1137F}",
272
+ "Tulu-Tigalari": "\\u{11380}-\\u{113FF}",
273
+ Newa: "\\u{11400}-\\u{1147F}",
274
+ Tirhuta: "\\u{11480}-\\u{114DF}",
275
+ Siddham: "\\u{11580}-\\u{115FF}",
276
+ Modi: "\\u{11600}-\\u{1165F}",
277
+ MongolianSupplement: "\\u{11660}-\\u{1167F}",
278
+ Takri: "\\u{11680}-\\u{116CF}",
279
+ "MyanmarExtended-C": "\\u{116D0}-\\u{116FF}",
280
+ Ahom: "\\u{11700}-\\u{1174F}",
281
+ Dogra: "\\u{11800}-\\u{1184F}",
282
+ WarangCiti: "\\u{118A0}-\\u{118FF}",
283
+ DivesAkuru: "\\u{11900}-\\u{1195F}",
284
+ Nandinagari: "\\u{119A0}-\\u{119FF}",
285
+ ZanabazarSquare: "\\u{11A00}-\\u{11A4F}",
286
+ Soyombo: "\\u{11A50}-\\u{11AAF}",
287
+ "UnifiedCanadianAboriginalSyllabicsExtended-A": "\\u{11AB0}-\\u{11ABF}",
288
+ PauCinHau: "\\u{11AC0}-\\u{11AFF}",
289
+ "DevanagariExtended-A": "\\u{11B00}-\\u{11B5F}",
290
+ SharadaSupplement: "\\u{11B60}-\\u{11B7F}",
291
+ Sunuwar: "\\u{11BC0}-\\u{11BFF}",
292
+ Bhaiksuki: "\\u{11C00}-\\u{11C6F}",
293
+ Marchen: "\\u{11C70}-\\u{11CBF}",
294
+ MasaramGondi: "\\u{11D00}-\\u{11D5F}",
295
+ GunjalaGondi: "\\u{11D60}-\\u{11DAF}",
296
+ TolongSiki: "\\u{11DB0}-\\u{11DEF}",
297
+ Makasar: "\\u{11EE0}-\\u{11EFF}",
298
+ Kawi: "\\u{11F00}-\\u{11F5F}",
299
+ LisuSupplement: "\\u{11FB0}-\\u{11FBF}",
300
+ TamilSupplement: "\\u{11FC0}-\\u{11FFF}",
301
+ Cuneiform: "\\u{12000}-\\u{123FF}",
302
+ CuneiformNumbersandPunctuation: "\\u{12400}-\\u{1247F}",
303
+ EarlyDynasticCuneiform: "\\u{12480}-\\u{1254F}",
304
+ "Cypro-Minoan": "\\u{12F90}-\\u{12FFF}",
305
+ EgyptianHieroglyphs: "\\u{13000}-\\u{1342F}",
306
+ EgyptianHieroglyphFormatControls: "\\u{13430}-\\u{1345F}",
307
+ "EgyptianHieroglyphsExtended-A": "\\u{13460}-\\u{143FF}",
308
+ AnatolianHieroglyphs: "\\u{14400}-\\u{1467F}",
309
+ GurungKhema: "\\u{16100}-\\u{1613F}",
310
+ BamumSupplement: "\\u{16800}-\\u{16A3F}",
311
+ Mro: "\\u{16A40}-\\u{16A6F}",
312
+ Tangsa: "\\u{16A70}-\\u{16ACF}",
313
+ BassaVah: "\\u{16AD0}-\\u{16AFF}",
314
+ PahawhHmong: "\\u{16B00}-\\u{16B8F}",
315
+ KiratRai: "\\u{16D40}-\\u{16D7F}",
316
+ Medefaidrin: "\\u{16E40}-\\u{16E9F}",
317
+ BeriaErfe: "\\u{16EA0}-\\u{16EDF}",
318
+ Miao: "\\u{16F00}-\\u{16F9F}",
319
+ IdeographicSymbolsandPunctuation: "\\u{16FE0}-\\u{16FFF}",
320
+ Tangut: "\\u{17000}-\\u{187FF}",
321
+ TangutComponents: "\\u{18800}-\\u{18AFF}",
322
+ KhitanSmallScript: "\\u{18B00}-\\u{18CFF}",
323
+ TangutSupplement: "\\u{18D00}-\\u{18D7F}",
324
+ TangutComponentsSupplement: "\\u{18D80}-\\u{18DFF}",
325
+ "KanaExtended-B": "\\u{1AFF0}-\\u{1AFFF}",
326
+ KanaSupplement: "\\u{1B000}-\\u{1B0FF}",
327
+ "KanaExtended-A": "\\u{1B100}-\\u{1B12F}",
328
+ SmallKanaExtension: "\\u{1B130}-\\u{1B16F}",
329
+ Nushu: "\\u{1B170}-\\u{1B2FF}",
330
+ Duployan: "\\u{1BC00}-\\u{1BC9F}",
331
+ ShorthandFormatControls: "\\u{1BCA0}-\\u{1BCAF}",
332
+ SymbolsforLegacyComputingSupplement: "\\u{1CC00}-\\u{1CEBF}",
333
+ MiscellaneousSymbolsSupplement: "\\u{1CEC0}-\\u{1CEFF}",
334
+ ZnamennyMusicalNotation: "\\u{1CF00}-\\u{1CFCF}",
335
+ ByzantineMusicalSymbols: "\\u{1D000}-\\u{1D0FF}",
336
+ MusicalSymbols: "\\u{1D100}-\\u{1D1FF}",
337
+ AncientGreekMusicalNotation: "\\u{1D200}-\\u{1D24F}",
338
+ KaktovikNumerals: "\\u{1D2C0}-\\u{1D2DF}",
339
+ MayanNumerals: "\\u{1D2E0}-\\u{1D2FF}",
340
+ TaiXuanJingSymbols: "\\u{1D300}-\\u{1D35F}",
341
+ CountingRodNumerals: "\\u{1D360}-\\u{1D37F}",
342
+ MathematicalAlphanumericSymbols: "\\u{1D400}-\\u{1D7FF}",
343
+ SuttonSignWriting: "\\u{1D800}-\\u{1DAAF}",
344
+ "LatinExtended-G": "\\u{1DF00}-\\u{1DFFF}",
345
+ GlagoliticSupplement: "\\u{1E000}-\\u{1E02F}",
346
+ "CyrillicExtended-D": "\\u{1E030}-\\u{1E08F}",
347
+ NyiakengPuachueHmong: "\\u{1E100}-\\u{1E14F}",
348
+ Toto: "\\u{1E290}-\\u{1E2BF}",
349
+ Wancho: "\\u{1E2C0}-\\u{1E2FF}",
350
+ NagMundari: "\\u{1E4D0}-\\u{1E4FF}",
351
+ OlOnal: "\\u{1E5D0}-\\u{1E5FF}",
352
+ TaiYo: "\\u{1E6C0}-\\u{1E6FF}",
353
+ "EthiopicExtended-B": "\\u{1E7E0}-\\u{1E7FF}",
354
+ MendeKikakui: "\\u{1E800}-\\u{1E8DF}",
355
+ Adlam: "\\u{1E900}-\\u{1E95F}",
356
+ IndicSiyaqNumbers: "\\u{1EC70}-\\u{1ECBF}",
357
+ OttomanSiyaqNumbers: "\\u{1ED00}-\\u{1ED4F}",
358
+ ArabicMathematicalAlphabeticSymbols: "\\u{1EE00}-\\u{1EEFF}",
359
+ MahjongTiles: "\\u{1F000}-\\u{1F02F}",
360
+ DominoTiles: "\\u{1F030}-\\u{1F09F}",
361
+ PlayingCards: "\\u{1F0A0}-\\u{1F0FF}",
362
+ EnclosedAlphanumericSupplement: "\\u{1F100}-\\u{1F1FF}",
363
+ EnclosedIdeographicSupplement: "\\u{1F200}-\\u{1F2FF}",
364
+ MiscellaneousSymbolsandPictographs: "\\u{1F300}-\\u{1F5FF}",
365
+ Emoticons: "\\u{1F600}-\\u{1F64F}",
366
+ OrnamentalDingbats: "\\u{1F650}-\\u{1F67F}",
367
+ TransportandMapSymbols: "\\u{1F680}-\\u{1F6FF}",
368
+ AlchemicalSymbols: "\\u{1F700}-\\u{1F77F}",
369
+ GeometricShapesExtended: "\\u{1F780}-\\u{1F7FF}",
370
+ "SupplementalArrows-C": "\\u{1F800}-\\u{1F8FF}",
371
+ SupplementalSymbolsandPictographs: "\\u{1F900}-\\u{1F9FF}",
372
+ ChessSymbols: "\\u{1FA00}-\\u{1FA6F}",
373
+ "SymbolsandPictographsExtended-A": "\\u{1FA70}-\\u{1FAFF}",
374
+ SymbolsforLegacyComputing: "\\u{1FB00}-\\u{1FBFF}",
375
+ CJKUnifiedIdeographsExtensionB: "\\u{20000}-\\u{2A6DF}",
376
+ CJKUnifiedIdeographsExtensionC: "\\u{2A700}-\\u{2B73F}",
377
+ CJKUnifiedIdeographsExtensionD: "\\u{2B740}-\\u{2B81F}",
378
+ CJKUnifiedIdeographsExtensionE: "\\u{2B820}-\\u{2CEAF}",
379
+ CJKUnifiedIdeographsExtensionF: "\\u{2CEB0}-\\u{2EBEF}",
380
+ CJKUnifiedIdeographsExtensionI: "\\u{2EBF0}-\\u{2EE5F}",
381
+ CJKCompatibilityIdeographsSupplement: "\\u{2F800}-\\u{2FA1F}",
382
+ CJKUnifiedIdeographsExtensionG: "\\u{30000}-\\u{3134F}",
383
+ CJKUnifiedIdeographsExtensionH: "\\u{31350}-\\u{323AF}",
384
+ CJKUnifiedIdeographsExtensionJ: "\\u{323B0}-\\u{3347F}",
385
+ Tags: "\\u{E0000}-\\u{E007F}",
386
+ VariationSelectorsSupplement: "\\u{E0100}-\\u{E01EF}",
387
+ "SupplementaryPrivateUseArea-A": "\\u{F0000}-\\u{FFFFF}",
388
+ "SupplementaryPrivateUseArea-B": "\\u{100000}-\\u{10FFFF}",
389
+ Greek: "\\u{0370}-\\u{03FF}",
390
+ CombiningMarksforSymbols: "\\u{20D0}-\\u{20FF}",
391
+ PrivateUse: "\\u{E000}-\\u{F8FF}",
392
+ };
393
+ // XML 1.0 (Second Edition), productions 85–89:
394
+ // https://www.w3.org/TR/2000/REC-xml-20001006#CharClasses
395
+ export const xmlNameInitial =
396
+ "_:" +
397
+ "\\u{0041}-\\u{005A}\\u{0061}-\\u{007A}\\u{00C0}-\\u{00D6}\\u{00D8}-\\u{00F6}\\u{00F8}-\\u{00FF}\\u{0100}-\\u{0131}\\u{0134}-\\u{013E}\\u{0141}-\\u{0148}\\u{014A}-\\u{017E}\\u{0180}-\\u{01C3}\\u{01CD}-\\u{01F0}\\u{01F4}-\\u{01F5}\\u{01FA}-\\u{0217}\\u{0250}-\\u{02A8}\\u{02BB}-\\u{02C1}\\u{0386}\\u{0388}-\\u{038A}\\u{038C}\\u{038E}-\\u{03A1}\\u{03A3}-\\u{03CE}\\u{03D0}-\\u{03D6}\\u{03DA}\\u{03DC}\\u{03DE}\\u{03E0}\\u{03E2}-\\u{03F3}\\u{0401}-\\u{040C}\\u{040E}-\\u{044F}\\u{0451}-\\u{045C}\\u{045E}-\\u{0481}\\u{0490}-\\u{04C4}\\u{04C7}-\\u{04C8}\\u{04CB}-\\u{04CC}\\u{04D0}-\\u{04EB}\\u{04EE}-\\u{04F5}\\u{04F8}-\\u{04F9}\\u{0531}-\\u{0556}\\u{0559}\\u{0561}-\\u{0586}\\u{05D0}-\\u{05EA}\\u{05F0}-\\u{05F2}\\u{0621}-\\u{063A}\\u{0641}-\\u{064A}\\u{0671}-\\u{06B7}\\u{06BA}-\\u{06BE}\\u{06C0}-\\u{06CE}\\u{06D0}-\\u{06D3}\\u{06D5}\\u{06E5}-\\u{06E6}\\u{0905}-\\u{0939}\\u{093D}\\u{0958}-\\u{0961}\\u{0985}-\\u{098C}\\u{098F}-\\u{0990}\\u{0993}-\\u{09A8}\\u{09AA}-\\u{09B0}\\u{09B2}\\u{09B6}-\\u{09B9}\\u{09DC}-\\u{09DD}\\u{09DF}-\\u{09E1}\\u{09F0}-\\u{09F1}\\u{0A05}-\\u{0A0A}\\u{0A0F}-\\u{0A10}\\u{0A13}-\\u{0A28}\\u{0A2A}-\\u{0A30}\\u{0A32}-\\u{0A33}\\u{0A35}-\\u{0A36}\\u{0A38}-\\u{0A39}\\u{0A59}-\\u{0A5C}\\u{0A5E}\\u{0A72}-\\u{0A74}\\u{0A85}-\\u{0A8B}\\u{0A8D}\\u{0A8F}-\\u{0A91}\\u{0A93}-\\u{0AA8}\\u{0AAA}-\\u{0AB0}\\u{0AB2}-\\u{0AB3}\\u{0AB5}-\\u{0AB9}\\u{0ABD}\\u{0AE0}\\u{0B05}-\\u{0B0C}\\u{0B0F}-\\u{0B10}\\u{0B13}-\\u{0B28}\\u{0B2A}-\\u{0B30}\\u{0B32}-\\u{0B33}\\u{0B36}-\\u{0B39}\\u{0B3D}\\u{0B5C}-\\u{0B5D}\\u{0B5F}-\\u{0B61}\\u{0B85}-\\u{0B8A}\\u{0B8E}-\\u{0B90}\\u{0B92}-\\u{0B95}\\u{0B99}-\\u{0B9A}\\u{0B9C}\\u{0B9E}-\\u{0B9F}\\u{0BA3}-\\u{0BA4}\\u{0BA8}-\\u{0BAA}\\u{0BAE}-\\u{0BB5}\\u{0BB7}-\\u{0BB9}\\u{0C05}-\\u{0C0C}\\u{0C0E}-\\u{0C10}\\u{0C12}-\\u{0C28}\\u{0C2A}-\\u{0C33}\\u{0C35}-\\u{0C39}\\u{0C60}-\\u{0C61}\\u{0C85}-\\u{0C8C}\\u{0C8E}-\\u{0C90}\\u{0C92}-\\u{0CA8}\\u{0CAA}-\\u{0CB3}\\u{0CB5}-\\u{0CB9}\\u{0CDE}\\u{0CE0}-\\u{0CE1}\\u{0D05}-\\u{0D0C}\\u{0D0E}-\\u{0D10}\\u{0D12}-\\u{0D28}\\u{0D2A}-\\u{0D39}\\u{0D60}-\\u{0D61}\\u{0E01}-\\u{0E2E}\\u{0E30}\\u{0E32}-\\u{0E33}\\u{0E40}-\\u{0E45}\\u{0E81}-\\u{0E82}\\u{0E84}\\u{0E87}-\\u{0E88}\\u{0E8A}\\u{0E8D}\\u{0E94}-\\u{0E97}\\u{0E99}-\\u{0E9F}\\u{0EA1}-\\u{0EA3}\\u{0EA5}\\u{0EA7}\\u{0EAA}-\\u{0EAB}\\u{0EAD}-\\u{0EAE}\\u{0EB0}\\u{0EB2}-\\u{0EB3}\\u{0EBD}\\u{0EC0}-\\u{0EC4}\\u{0F40}-\\u{0F47}\\u{0F49}-\\u{0F69}\\u{10A0}-\\u{10C5}\\u{10D0}-\\u{10F6}\\u{1100}\\u{1102}-\\u{1103}\\u{1105}-\\u{1107}\\u{1109}\\u{110B}-\\u{110C}\\u{110E}-\\u{1112}\\u{113C}\\u{113E}\\u{1140}\\u{114C}\\u{114E}\\u{1150}\\u{1154}-\\u{1155}\\u{1159}\\u{115F}-\\u{1161}\\u{1163}\\u{1165}\\u{1167}\\u{1169}\\u{116D}-\\u{116E}\\u{1172}-\\u{1173}\\u{1175}\\u{119E}\\u{11A8}\\u{11AB}\\u{11AE}-\\u{11AF}\\u{11B7}-\\u{11B8}\\u{11BA}\\u{11BC}-\\u{11C2}\\u{11EB}\\u{11F0}\\u{11F9}\\u{1E00}-\\u{1E9B}\\u{1EA0}-\\u{1EF9}\\u{1F00}-\\u{1F15}\\u{1F18}-\\u{1F1D}\\u{1F20}-\\u{1F45}\\u{1F48}-\\u{1F4D}\\u{1F50}-\\u{1F57}\\u{1F59}\\u{1F5B}\\u{1F5D}\\u{1F5F}-\\u{1F7D}\\u{1F80}-\\u{1FB4}\\u{1FB6}-\\u{1FBC}\\u{1FBE}\\u{1FC2}-\\u{1FC4}\\u{1FC6}-\\u{1FCC}\\u{1FD0}-\\u{1FD3}\\u{1FD6}-\\u{1FDB}\\u{1FE0}-\\u{1FEC}\\u{1FF2}-\\u{1FF4}\\u{1FF6}-\\u{1FFC}\\u{2126}\\u{212A}-\\u{212B}\\u{212E}\\u{2180}-\\u{2182}\\u{3041}-\\u{3094}\\u{30A1}-\\u{30FA}\\u{3105}-\\u{312C}\\u{AC00}-\\u{D7A3}" +
398
+ "\\u{4E00}-\\u{9FA5}\\u{3007}\\u{3021}-\\u{3029}";
399
+ export const xmlNameCharacters =
400
+ xmlNameInitial +
401
+ "\\u{2D}." +
402
+ "\\u{0030}-\\u{0039}\\u{0660}-\\u{0669}\\u{06F0}-\\u{06F9}\\u{0966}-\\u{096F}\\u{09E6}-\\u{09EF}\\u{0A66}-\\u{0A6F}\\u{0AE6}-\\u{0AEF}\\u{0B66}-\\u{0B6F}\\u{0BE7}-\\u{0BEF}\\u{0C66}-\\u{0C6F}\\u{0CE6}-\\u{0CEF}\\u{0D66}-\\u{0D6F}\\u{0E50}-\\u{0E59}\\u{0ED0}-\\u{0ED9}\\u{0F20}-\\u{0F29}" +
403
+ "\\u{0300}-\\u{0345}\\u{0360}-\\u{0361}\\u{0483}-\\u{0486}\\u{0591}-\\u{05A1}\\u{05A3}-\\u{05B9}\\u{05BB}-\\u{05BD}\\u{05BF}\\u{05C1}-\\u{05C2}\\u{05C4}\\u{064B}-\\u{0652}\\u{0670}\\u{06D6}-\\u{06DC}\\u{06DD}-\\u{06DF}\\u{06E0}-\\u{06E4}\\u{06E7}-\\u{06E8}\\u{06EA}-\\u{06ED}\\u{0901}-\\u{0903}\\u{093C}\\u{093E}-\\u{094C}\\u{094D}\\u{0951}-\\u{0954}\\u{0962}-\\u{0963}\\u{0981}-\\u{0983}\\u{09BC}\\u{09BE}\\u{09BF}\\u{09C0}-\\u{09C4}\\u{09C7}-\\u{09C8}\\u{09CB}-\\u{09CD}\\u{09D7}\\u{09E2}-\\u{09E3}\\u{0A02}\\u{0A3C}\\u{0A3E}\\u{0A3F}\\u{0A40}-\\u{0A42}\\u{0A47}-\\u{0A48}\\u{0A4B}-\\u{0A4D}\\u{0A70}-\\u{0A71}\\u{0A81}-\\u{0A83}\\u{0ABC}\\u{0ABE}-\\u{0AC5}\\u{0AC7}-\\u{0AC9}\\u{0ACB}-\\u{0ACD}\\u{0B01}-\\u{0B03}\\u{0B3C}\\u{0B3E}-\\u{0B43}\\u{0B47}-\\u{0B48}\\u{0B4B}-\\u{0B4D}\\u{0B56}-\\u{0B57}\\u{0B82}-\\u{0B83}\\u{0BBE}-\\u{0BC2}\\u{0BC6}-\\u{0BC8}\\u{0BCA}-\\u{0BCD}\\u{0BD7}\\u{0C01}-\\u{0C03}\\u{0C3E}-\\u{0C44}\\u{0C46}-\\u{0C48}\\u{0C4A}-\\u{0C4D}\\u{0C55}-\\u{0C56}\\u{0C82}-\\u{0C83}\\u{0CBE}-\\u{0CC4}\\u{0CC6}-\\u{0CC8}\\u{0CCA}-\\u{0CCD}\\u{0CD5}-\\u{0CD6}\\u{0D02}-\\u{0D03}\\u{0D3E}-\\u{0D43}\\u{0D46}-\\u{0D48}\\u{0D4A}-\\u{0D4D}\\u{0D57}\\u{0E31}\\u{0E34}-\\u{0E3A}\\u{0E47}-\\u{0E4E}\\u{0EB1}\\u{0EB4}-\\u{0EB9}\\u{0EBB}-\\u{0EBC}\\u{0EC8}-\\u{0ECD}\\u{0F18}-\\u{0F19}\\u{0F35}\\u{0F37}\\u{0F39}\\u{0F3E}\\u{0F3F}\\u{0F71}-\\u{0F84}\\u{0F86}-\\u{0F8B}\\u{0F90}-\\u{0F95}\\u{0F97}\\u{0F99}-\\u{0FAD}\\u{0FB1}-\\u{0FB7}\\u{0FB9}\\u{20D0}-\\u{20DC}\\u{20E1}\\u{302A}-\\u{302F}\\u{3099}\\u{309A}" +
404
+ "\\u{00B7}\\u{02D0}\\u{02D1}\\u{0387}\\u{0640}\\u{0E46}\\u{0EC6}\\u{3005}\\u{3031}-\\u{3035}\\u{309D}-\\u{309E}\\u{30FC}-\\u{30FE}";
@@ -0,0 +1,234 @@
1
+ import { xmlNameCharacters, xmlNameInitial, xmlSchemaBlocks } from "./xml-schema-regex-data.js";
2
+
3
+ export type XmlRegexNode =
4
+ | { type: "character"; matcher: RegExp }
5
+ | { type: "sequence" | "choice"; children: XmlRegexNode[] }
6
+ | { type: "repeat"; child: XmlRegexNode; minimum: number; maximum: number };
7
+ export interface XmlRegexProblem {
8
+ code: "syntax" | "limit";
9
+ message: string;
10
+ }
11
+ export type XmlRegexParseResult =
12
+ | { ok: true; expression: XmlRegexNode }
13
+ | { ok: false; problem: XmlRegexProblem };
14
+ interface CharacterToken {
15
+ source: string;
16
+ point?: number;
17
+ }
18
+
19
+ export const XML_REGEX_MAX_PATTERN_LENGTH = 16_384;
20
+ export const XML_REGEX_MAX_DEPTH = 64;
21
+ const categories = /^(?:L[ultmo]?|M[nce]?|N[dlo]?|P[cdseifo]?|Z[slp]?|S[mcko]?|C[cfon]?)$/;
22
+ const singleEscapes: Readonly<Record<string, string>> = { n: "\n", r: "\r", t: "\t" };
23
+ const multiEscapes: Readonly<Record<string, string>> = {
24
+ s: "[ \\t\\n\\r]",
25
+ S: "[^ \\t\\n\\r]",
26
+ d: "\\p{Nd}",
27
+ D: "\\P{Nd}",
28
+ w: "[^\\p{P}\\p{Z}\\p{C}]",
29
+ W: "[\\p{P}\\p{Z}\\p{C}]",
30
+ i: `[${xmlNameInitial}]`,
31
+ I: `[^${xmlNameInitial}]`,
32
+ c: `[${xmlNameCharacters}]`,
33
+ C: `[^${xmlNameCharacters}]`,
34
+ };
35
+
36
+ /** Parses Appendix F syntax; native regexes only classify one code point at a time. */
37
+ export function parseXmlSchemaRegex(pattern: string): XmlRegexParseResult {
38
+ if (pattern.length > XML_REGEX_MAX_PATTERN_LENGTH)
39
+ return {
40
+ ok: false,
41
+ problem: { code: "limit", message: "Pattern exceeds 16384 UTF-16 code units." },
42
+ };
43
+ let offset = 0;
44
+ let problem: XmlRegexProblem | undefined;
45
+ const peek = () => pattern[offset];
46
+ const hasProblem = () => problem !== undefined;
47
+ const fail = (message: string, code: XmlRegexProblem["code"] = "syntax"): undefined => {
48
+ problem ??= { code, message: `${message} At pattern offset ${offset}.` };
49
+ return undefined;
50
+ };
51
+ function literal(character: string): CharacterToken | undefined {
52
+ if (!isXmlRegexCharacter(character)) return fail("Pattern contains a non-XML character.");
53
+ const point = character.codePointAt(0) ?? 0;
54
+ return { source: `\\u{${point.toString(16)}}`, point };
55
+ }
56
+ function escape(): CharacterToken | undefined {
57
+ offset += 1;
58
+ const character = peek();
59
+ if (character === undefined) return fail("Incomplete escape.");
60
+ offset += 1;
61
+ if (Object.hasOwn(singleEscapes, character)) return literal(singleEscapes[character] ?? "");
62
+ if ("\\|.?*+(){}-[]^".includes(character)) return literal(character);
63
+ if (Object.hasOwn(multiEscapes, character)) return { source: multiEscapes[character] ?? "" };
64
+ if (character !== "p" && character !== "P") return fail("Unknown XML Schema escape.");
65
+ if (peek() !== "{") return fail("Expected a Unicode property in braces.");
66
+ offset += 1;
67
+ const end = pattern.indexOf("}", offset);
68
+ if (end < 0) return fail("Unclosed Unicode property.");
69
+ const property = pattern.slice(offset, end);
70
+ offset = end + 1;
71
+ if (categories.test(property)) return { source: `\\${character}{${property}}` };
72
+ const block = property.startsWith("Is") ? property.slice(2) : "";
73
+ if (!Object.hasOwn(xmlSchemaBlocks, block)) return fail("Unknown XML Schema Unicode property.");
74
+ const ranges = xmlSchemaBlocks[block];
75
+ // Preserve the Appendix F Specials block's legacy BOM member as well.
76
+ return {
77
+ source: `[${character === "P" ? "^" : ""}${ranges}${block === "Specials" ? "\\u{FEFF}" : ""}]`,
78
+ };
79
+ }
80
+ function classToken(): CharacterToken | undefined {
81
+ const character = peek();
82
+ if (character === "\\") return escape();
83
+ if (character === undefined || character === "[" || character === "]")
84
+ return fail("Expected a character in the class.");
85
+ const code = pattern.codePointAt(offset);
86
+ if (code === undefined) return fail("Expected a character.");
87
+ const value = String.fromCodePoint(code);
88
+ offset += value.length;
89
+ return literal(value);
90
+ }
91
+ function characterClass(depth: number): string | undefined {
92
+ if (depth > XML_REGEX_MAX_DEPTH) return fail("Character-class nesting exceeds 64.", "limit");
93
+ offset += 1;
94
+ const negative = peek() === "^";
95
+ if (negative) offset += 1;
96
+ const members: string[] = [];
97
+ let subtraction: string | undefined;
98
+ while (!hasProblem() && peek() !== "]") {
99
+ if (members.length > 0 && pattern.slice(offset, offset + 2) === "-[") {
100
+ offset += 1;
101
+ subtraction = characterClass(depth + 1);
102
+ if (peek() !== "]") return fail("Subtraction must end the character class.");
103
+ break;
104
+ }
105
+ const wasDash = peek() === "-";
106
+ if (wasDash && members.length > 0 && pattern[offset + 1] !== "]")
107
+ return fail("An unescaped dash must begin or end a class.");
108
+ const first = classToken();
109
+ if (!first) return undefined;
110
+ if (
111
+ !wasDash &&
112
+ peek() === "-" &&
113
+ pattern[offset + 1] !== "[" &&
114
+ pattern[offset + 1] !== "]"
115
+ ) {
116
+ offset += 1;
117
+ if (peek() === "-") return fail("Escape a dash used as a range endpoint.");
118
+ const last = classToken();
119
+ if (!last) return undefined;
120
+ if (first.point === undefined || last.point === undefined || first.point > last.point)
121
+ return fail("Invalid character range.");
122
+ members.push(`[${first.source}-${last.source}]`);
123
+ } else members.push(first.source);
124
+ }
125
+ if (problem) return undefined;
126
+ if (peek() !== "]" || members.length === 0) return fail("Unclosed or empty character class.");
127
+ offset += 1;
128
+ const union = `(?:${members.join("|")})`;
129
+ const base = negative ? `(?!${union})[\\s\\S]` : union;
130
+ return subtraction === undefined ? base : `(?!${subtraction})${base}`;
131
+ }
132
+ function characterNode(source: string): XmlRegexNode | undefined {
133
+ try {
134
+ return { type: "character", matcher: new RegExp(`^(?:${source})$`, "u") };
135
+ } catch {
136
+ return fail("Unable to compile the character class.");
137
+ }
138
+ }
139
+ function atom(depth: number): XmlRegexNode | undefined {
140
+ if (depth > XML_REGEX_MAX_DEPTH) return fail("Group nesting exceeds 64.", "limit");
141
+ const token = peek();
142
+ if (token === "(") {
143
+ offset += 1;
144
+ const expression = expressionAt(depth + 1);
145
+ if (peek() !== ")") return fail("Unclosed group.");
146
+ offset += 1;
147
+ return expression;
148
+ }
149
+ if (token === "[") {
150
+ const source = characterClass(depth + 1);
151
+ return source === undefined ? undefined : characterNode(source);
152
+ }
153
+ if (token === ".") {
154
+ offset += 1;
155
+ return characterNode("[^\\n\\r]");
156
+ }
157
+ if (token === "\\") {
158
+ const escaped = escape();
159
+ return escaped ? characterNode(escaped.source) : undefined;
160
+ }
161
+ if (token === undefined || "?*+{}]|)".includes(token)) return fail("Unexpected metacharacter.");
162
+ const value = classToken();
163
+ return value ? characterNode(value.source) : undefined;
164
+ }
165
+ function piece(depth: number): XmlRegexNode | undefined {
166
+ const child = atom(depth);
167
+ if (!child) return undefined;
168
+ const quantifier = peek();
169
+ if (quantifier === "?" || quantifier === "*" || quantifier === "+") {
170
+ offset += 1;
171
+ return {
172
+ type: "repeat",
173
+ child,
174
+ minimum: quantifier === "+" ? 1 : 0,
175
+ maximum: quantifier === "?" ? 1 : Infinity,
176
+ };
177
+ }
178
+ if (quantifier !== "{") return child;
179
+ const match = /^\{([0-9]+)(?:,([0-9]*))?\}/.exec(pattern.slice(offset));
180
+ if (!match || match[1] === undefined) return fail("Malformed quantifier.");
181
+ offset += match[0].length;
182
+ const minimum = Number(match[1]);
183
+ const maximum =
184
+ match[2] === undefined ? minimum : match[2] === "" ? Infinity : Number(match[2]);
185
+ if (!Number.isSafeInteger(minimum) || (maximum !== Infinity && !Number.isSafeInteger(maximum)))
186
+ return fail("Quantifier exceeds the safe integer range.", "limit");
187
+ if (maximum < minimum) return fail("Quantifier maximum is smaller than its minimum.");
188
+ return { type: "repeat", child, minimum, maximum };
189
+ }
190
+ function expressionAt(depth: number): XmlRegexNode | undefined {
191
+ const branches: XmlRegexNode[] = [];
192
+ while (!hasProblem()) {
193
+ const children: XmlRegexNode[] = [];
194
+ while (peek() !== undefined && peek() !== "|" && peek() !== ")" && !hasProblem()) {
195
+ const node = piece(depth);
196
+ if (!node) return undefined;
197
+ children.push(node);
198
+ }
199
+ branches.push({ type: "sequence", children });
200
+ if (peek() !== "|") break;
201
+ offset += 1;
202
+ }
203
+ return { type: "choice", children: branches };
204
+ }
205
+ const expression = expressionAt(0);
206
+ if (!problem && offset !== pattern.length) fail("Unexpected closing delimiter.");
207
+ if (problem) return { ok: false, problem };
208
+ return expression
209
+ ? { ok: true, expression }
210
+ : { ok: false, problem: { code: "syntax", message: "Invalid pattern." } };
211
+ }
212
+
213
+ /** QTI StringOrVariableRef uses braces, so bare identifiers remain literal patterns. */
214
+ export function patternVariableIdentifier(pattern: string): string | undefined {
215
+ if (!pattern.startsWith("{") || !pattern.endsWith("}")) return undefined;
216
+ const identifier = pattern.slice(1, -1);
217
+ const initial = `[${xmlNameInitial}]`;
218
+ const rest = `[${xmlNameCharacters}]`;
219
+ return !identifier.includes(":") && new RegExp(`^${initial}${rest}*$`, "u").test(identifier)
220
+ ? identifier
221
+ : undefined;
222
+ }
223
+
224
+ export function isXmlRegexCharacter(value: string): boolean {
225
+ const point = value.codePointAt(0) ?? 0;
226
+ return (
227
+ point === 9 ||
228
+ point === 10 ||
229
+ point === 13 ||
230
+ (point >= 0x20 && point <= 0xd7ff) ||
231
+ (point >= 0xe000 && point <= 0xfffd) ||
232
+ (point >= 0x10000 && point <= 0x10ffff)
233
+ );
234
+ }