@longsightgroup/qti3-core 0.10.5 → 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.
- package/README.md +153 -4
- package/dist/adaptive-turn-materializer.js +4 -5
- package/dist/adaptive-turn-materializer.js.map +1 -1
- package/dist/adaptive-turn.d.ts.map +1 -1
- package/dist/adaptive-turn.js +1 -0
- package/dist/adaptive-turn.js.map +1 -1
- package/dist/attempt-state.d.ts.map +1 -1
- package/dist/attempt-state.js +41 -1
- package/dist/attempt-state.js.map +1 -1
- package/dist/catalog.d.ts +8 -0
- package/dist/catalog.d.ts.map +1 -1
- package/dist/catalog.js +10 -0
- package/dist/catalog.js.map +1 -1
- package/dist/diagnostics.d.ts +13 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.js +28 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/item-scoring-expectation.d.ts +2 -0
- package/dist/item-scoring-expectation.d.ts.map +1 -1
- package/dist/item-scoring-expectation.js +8 -0
- package/dist/item-scoring-expectation.js.map +1 -1
- package/dist/item-submission-materialization.d.ts.map +1 -1
- package/dist/item-submission-materialization.js +2 -0
- package/dist/item-submission-materialization.js.map +1 -1
- package/dist/parser-processing.d.ts.map +1 -1
- package/dist/parser-processing.js +8 -18
- package/dist/parser-processing.js.map +1 -1
- package/dist/parser-values.d.ts.map +1 -1
- package/dist/parser-values.js +1 -3
- package/dist/parser-values.js.map +1 -1
- package/dist/parser.js +36 -6
- package/dist/parser.js.map +1 -1
- package/dist/processing-equality.d.ts +10 -0
- package/dist/processing-equality.d.ts.map +1 -0
- package/dist/processing-equality.js +78 -0
- package/dist/processing-equality.js.map +1 -0
- package/dist/processing-evaluator-comparison.d.ts.map +1 -1
- package/dist/processing-evaluator-comparison.js +14 -9
- package/dist/processing-evaluator-comparison.js.map +1 -1
- package/dist/processing-evaluator-numeric.d.ts.map +1 -1
- package/dist/processing-evaluator-numeric.js +2 -1
- package/dist/processing-evaluator-numeric.js.map +1 -1
- package/dist/processing-evaluator-string.d.ts.map +1 -1
- package/dist/processing-evaluator-string.js +26 -10
- package/dist/processing-evaluator-string.js.map +1 -1
- package/dist/processing-evaluator-variable.d.ts.map +1 -1
- package/dist/processing-evaluator-variable.js +9 -3
- package/dist/processing-evaluator-variable.js.map +1 -1
- package/dist/processing-evaluator.d.ts +5 -1
- package/dist/processing-evaluator.d.ts.map +1 -1
- package/dist/processing-evaluator.js +13 -4
- package/dist/processing-evaluator.js.map +1 -1
- package/dist/processing-expression-children.d.ts.map +1 -1
- package/dist/processing-expression-children.js +2 -3
- package/dist/processing-expression-children.js.map +1 -1
- package/dist/processing-expression-tags.d.ts +2 -1
- package/dist/processing-expression-tags.d.ts.map +1 -1
- package/dist/processing-expression-tags.js +2 -1
- package/dist/processing-expression-tags.js.map +1 -1
- package/dist/processing-mapping.d.ts.map +1 -1
- package/dist/processing-mapping.js +26 -16
- package/dist/processing-mapping.js.map +1 -1
- package/dist/processing-state.d.ts +2 -2
- package/dist/processing-state.d.ts.map +1 -1
- package/dist/processing-state.js +5 -2
- package/dist/processing-state.js.map +1 -1
- package/dist/processing-values.d.ts +1 -2
- package/dist/processing-values.d.ts.map +1 -1
- package/dist/processing-values.js +1 -3
- package/dist/processing-values.js.map +1 -1
- package/dist/processing-variables.d.ts.map +1 -1
- package/dist/processing-variables.js +10 -5
- package/dist/processing-variables.js.map +1 -1
- package/dist/qti-package-assets.d.ts.map +1 -1
- package/dist/qti-package-assets.js +16 -10
- package/dist/qti-package-assets.js.map +1 -1
- package/dist/qti-package-manifest.d.ts +1 -0
- package/dist/qti-package-manifest.d.ts.map +1 -1
- package/dist/qti-package-manifest.js +1 -0
- package/dist/qti-package-manifest.js.map +1 -1
- package/dist/qti-package-metadata.d.ts.map +1 -1
- package/dist/qti-package-metadata.js +11 -0
- package/dist/qti-package-metadata.js.map +1 -1
- package/dist/qti-package-plan.d.ts +1 -1
- package/dist/qti-package-plan.d.ts.map +1 -1
- package/dist/qti-package-types.d.ts +9 -0
- package/dist/qti-package-types.d.ts.map +1 -1
- package/dist/qti-package-xml.d.ts +6 -1
- package/dist/qti-package-xml.d.ts.map +1 -1
- package/dist/qti-package-xml.js +11 -6
- package/dist/qti-package-xml.js.map +1 -1
- package/dist/qti-package-zip.d.ts +13 -1
- package/dist/qti-package-zip.d.ts.map +1 -1
- package/dist/qti-package-zip.js +185 -54
- package/dist/qti-package-zip.js.map +1 -1
- package/dist/qti-package.d.ts +12 -5
- package/dist/qti-package.d.ts.map +1 -1
- package/dist/qti-package.js +63 -8
- package/dist/qti-package.js.map +1 -1
- package/dist/response-validation-policy.d.ts +3 -1
- package/dist/response-validation-policy.d.ts.map +1 -1
- package/dist/response-validation-policy.js +66 -6
- package/dist/response-validation-policy.js.map +1 -1
- package/dist/response-validation.d.ts +3 -1
- package/dist/response-validation.d.ts.map +1 -1
- package/dist/response-validation.js +32 -10
- package/dist/response-validation.js.map +1 -1
- package/dist/scoring-disposition-policy.d.ts.map +1 -1
- package/dist/scoring-disposition-policy.js +6 -2
- package/dist/scoring-disposition-policy.js.map +1 -1
- package/dist/serializer-processing-expressions.d.ts.map +1 -1
- package/dist/serializer-processing-expressions.js +2 -10
- package/dist/serializer-processing-expressions.js.map +1 -1
- package/dist/server-scoring.d.ts.map +1 -1
- package/dist/server-scoring.js +1 -0
- package/dist/server-scoring.js.map +1 -1
- package/dist/session-builtins.d.ts +16 -0
- package/dist/session-builtins.d.ts.map +1 -0
- package/dist/session-builtins.js +58 -0
- package/dist/session-builtins.js.map +1 -0
- package/dist/session.d.ts +5 -1
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +63 -11
- package/dist/session.js.map +1 -1
- package/dist/support-evidence.d.ts.map +1 -1
- package/dist/support-evidence.js +16 -3
- package/dist/support-evidence.js.map +1 -1
- package/dist/support.d.ts.map +1 -1
- package/dist/support.js +72 -24
- package/dist/support.js.map +1 -1
- package/dist/text-response.d.ts +9 -0
- package/dist/text-response.d.ts.map +1 -0
- package/dist/text-response.js +102 -0
- package/dist/text-response.js.map +1 -0
- package/dist/trusted-item-session.d.ts +4 -1
- package/dist/trusted-item-session.d.ts.map +1 -1
- package/dist/trusted-item-session.js +12 -6
- package/dist/trusted-item-session.js.map +1 -1
- package/dist/types.d.ts +23 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/validation-declaration-entries.d.ts.map +1 -1
- package/dist/validation-declaration-entries.js +11 -1
- package/dist/validation-declaration-entries.js.map +1 -1
- package/dist/validation-interactions.d.ts.map +1 -1
- package/dist/validation-interactions.js +102 -12
- package/dist/validation-interactions.js.map +1 -1
- package/dist/validation-item-children.d.ts +4 -0
- package/dist/validation-item-children.d.ts.map +1 -0
- package/dist/validation-item-children.js +45 -0
- package/dist/validation-item-children.js.map +1 -0
- package/dist/validation-processing.d.ts.map +1 -1
- package/dist/validation-processing.js +45 -12
- package/dist/validation-processing.js.map +1 -1
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +12 -0
- package/dist/validation.js.map +1 -1
- package/dist/value-guards.d.ts +4 -0
- package/dist/value-guards.d.ts.map +1 -0
- package/dist/value-guards.js +5 -0
- package/dist/value-guards.js.map +1 -0
- package/dist/xml-schema-regex-data.d.ts +48 -0
- package/dist/xml-schema-regex-data.d.ts.map +1 -0
- package/dist/xml-schema-regex-data.js +403 -0
- package/dist/xml-schema-regex-data.js.map +1 -0
- package/dist/xml-schema-regex-parser.d.ts +31 -0
- package/dist/xml-schema-regex-parser.d.ts.map +1 -0
- package/dist/xml-schema-regex-parser.js +245 -0
- package/dist/xml-schema-regex-parser.js.map +1 -0
- package/dist/xml-schema-regex.d.ts +14 -0
- package/dist/xml-schema-regex.d.ts.map +1 -0
- package/dist/xml-schema-regex.js +114 -0
- package/dist/xml-schema-regex.js.map +1 -0
- package/package.json +1 -1
- package/src/adaptive-turn-materializer.ts +4 -3
- package/src/adaptive-turn.ts +1 -0
- package/src/attempt-state.ts +54 -1
- package/src/catalog.ts +29 -0
- package/src/diagnostics.ts +29 -0
- package/src/index.ts +16 -0
- package/src/item-scoring-expectation.ts +8 -0
- package/src/item-submission-materialization.ts +2 -0
- package/src/parser-processing.ts +15 -18
- package/src/parser-values.ts +1 -5
- package/src/parser.ts +38 -6
- package/src/processing-equality.ts +104 -0
- package/src/processing-evaluator-comparison.ts +19 -14
- package/src/processing-evaluator-numeric.ts +2 -6
- package/src/processing-evaluator-string.ts +25 -18
- package/src/processing-evaluator-variable.ts +8 -3
- package/src/processing-evaluator.ts +20 -7
- package/src/processing-expression-children.ts +2 -3
- package/src/processing-expression-tags.ts +2 -1
- package/src/processing-mapping.ts +31 -25
- package/src/processing-state.ts +6 -1
- package/src/processing-values.ts +2 -11
- package/src/processing-variables.ts +9 -7
- package/src/qti-package-assets.ts +20 -13
- package/src/qti-package-manifest.ts +1 -0
- package/src/qti-package-metadata.ts +11 -0
- package/src/qti-package-plan.ts +1 -1
- package/src/qti-package-types.ts +10 -0
- package/src/qti-package-xml.ts +11 -6
- package/src/qti-package-zip.ts +330 -97
- package/src/qti-package.ts +106 -7
- package/src/response-validation-policy.ts +76 -4
- package/src/response-validation.ts +51 -5
- package/src/scoring-disposition-policy.ts +7 -2
- package/src/serializer-processing-expressions.ts +8 -25
- package/src/server-scoring.ts +1 -0
- package/src/session-builtins.ts +75 -0
- package/src/session.ts +64 -8
- package/src/support-evidence.ts +16 -3
- package/src/support.ts +94 -24
- package/src/text-response.ts +106 -0
- package/src/trusted-item-session.ts +17 -5
- package/src/types.ts +32 -4
- package/src/validation-declaration-entries.ts +11 -1
- package/src/validation-interactions.ts +139 -14
- package/src/validation-item-children.ts +48 -0
- package/src/validation-processing.ts +47 -10
- package/src/validation.ts +14 -0
- package/src/value-guards.ts +6 -0
- package/src/xml-schema-regex-data.ts +404 -0
- package/src/xml-schema-regex-parser.ts +234 -0
- 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
|
+
}
|