@rgrove/parse-xml 4.1.0 → 4.2.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 +31 -31
- package/dist/browser.js +209 -236
- package/dist/browser.js.map +3 -3
- package/dist/global.min.js +8 -8
- package/dist/global.min.js.map +3 -3
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/Parser.d.ts +4 -0
- package/dist/lib/Parser.d.ts.map +1 -1
- package/dist/lib/Parser.js +48 -39
- package/dist/lib/Parser.js.map +1 -1
- package/dist/lib/StringScanner.d.ts +10 -16
- package/dist/lib/StringScanner.d.ts.map +1 -1
- package/dist/lib/StringScanner.js +54 -77
- package/dist/lib/StringScanner.js.map +1 -1
- package/dist/lib/XmlDeclaration.js.map +1 -1
- package/dist/lib/XmlDocument.js.map +1 -1
- package/dist/lib/XmlDocumentType.js.map +1 -1
- package/dist/lib/XmlElement.js.map +1 -1
- package/dist/lib/XmlError.js.map +1 -1
- package/dist/lib/XmlNode.js.map +1 -1
- package/dist/lib/syntax.d.ts.map +1 -1
- package/dist/lib/syntax.js +17 -22
- package/dist/lib/syntax.js.map +1 -1
- package/package.json +14 -19
- package/src/lib/Parser.ts +52 -42
- package/src/lib/StringScanner.ts +56 -93
- package/src/lib/syntax.ts +11 -17
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"XmlDocumentType.js","sourceRoot":"","sources":["../../src/lib/XmlDocumentType.ts"],"names":[],"mappings":";;;AAAA,6CAAuC;AAEvC;;;;;;;;;;GAUG;AACH,MAAa,eAAgB,SAAQ,oBAAO;IAwB1C,YACE,IAAY,EACZ,QAAiB,EACjB,QAAiB,EACjB,cAAuB;QAEvB,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,IAAI,CAAC;QACjC,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,IAAI,CAAC;QACjC,IAAI,CAAC,cAAc,GAAG,cAAc,IAAI,IAAI,CAAC;IAC/C,CAAC;IAED,IAAa,IAAI;QACf,OAAO,oBAAO,CAAC,kBAAkB,CAAC;IACpC,CAAC;IAEQ,MAAM;QACb,IAAI,IAAI,GAAG,oBAAO,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAEtB,KAAK,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,gBAAgB,CAAU,EAAE;
|
|
1
|
+
{"version":3,"file":"XmlDocumentType.js","sourceRoot":"","sources":["../../src/lib/XmlDocumentType.ts"],"names":[],"mappings":";;;AAAA,6CAAuC;AAEvC;;;;;;;;;;GAUG;AACH,MAAa,eAAgB,SAAQ,oBAAO;IAwB1C,YACE,IAAY,EACZ,QAAiB,EACjB,QAAiB,EACjB,cAAuB;QAEvB,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,IAAI,CAAC;QACjC,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,IAAI,CAAC;QACjC,IAAI,CAAC,cAAc,GAAG,cAAc,IAAI,IAAI,CAAC;IAC/C,CAAC;IAED,IAAa,IAAI;QACf,OAAO,oBAAO,CAAC,kBAAkB,CAAC;IACpC,CAAC;IAEQ,MAAM;QACb,IAAI,IAAI,GAAG,oBAAO,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAEtB,KAAK,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,gBAAgB,CAAU,EAAE,CAAC;YACpE,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;gBACvB,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AArDD,0CAqDC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"XmlElement.js","sourceRoot":"","sources":["../../src/lib/XmlElement.ts"],"names":[],"mappings":";;;AAAA,6CAAuC;AAQvC;;GAEG;AACH,MAAa,UAAW,SAAQ,oBAAO;IAgBrC,YACE,IAAY,EACZ,aAA2C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAC9D,WAA2F,EAAE;QAE7F,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,IAAa,kBAAkB;QAC7B,IAAI,IAAI,GAAmB,IAAI,CAAC,CAAC,uDAAuD;QAExF,OAAO,IAAI,YAAY,UAAU,EAAE;
|
|
1
|
+
{"version":3,"file":"XmlElement.js","sourceRoot":"","sources":["../../src/lib/XmlElement.ts"],"names":[],"mappings":";;;AAAA,6CAAuC;AAQvC;;GAEG;AACH,MAAa,UAAW,SAAQ,oBAAO;IAgBrC,YACE,IAAY,EACZ,aAA2C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAC9D,WAA2F,EAAE;QAE7F,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,IAAa,kBAAkB;QAC7B,IAAI,IAAI,GAAmB,IAAI,CAAC,CAAC,uDAAuD;QAExF,OAAO,IAAI,YAAY,UAAU,EAAE,CAAC;YAClC,IAAI,WAAW,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACnC,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,UAAU,CAAC;YACrD,CAAC;YAED,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;QACrB,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,QAAQ;aACjB,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;aAC/C,IAAI,CAAC,EAAE,CAAC,CAAC;IACd,CAAC;IAED,IAAa,IAAI;QACf,OAAO,oBAAO,CAAC,YAAY,CAAC;IAC9B,CAAC;IAEQ,MAAM;QACb,OAAO,MAAM,CAAC,MAAM,CAAC,oBAAO,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACxD,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;SACrD,CAAC,CAAC;IACL,CAAC;CACF;AArED,gCAqEC"}
|
package/dist/lib/XmlError.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"XmlError.js","sourceRoot":"","sources":["../../src/lib/XmlError.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,MAAa,QAAS,SAAQ,KAAK;IAsBjC,YACE,OAAe,EACf,SAAiB,EACjB,GAAW;QAEX,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,IAAI,GAAG,CAAC,CAAC;QAEb,qDAAqD;QACrD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,EAAE,CAAC,EAAE;
|
|
1
|
+
{"version":3,"file":"XmlError.js","sourceRoot":"","sources":["../../src/lib/XmlError.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,MAAa,QAAS,SAAQ,KAAK;IAsBjC,YACE,OAAe,EACf,SAAiB,EACjB,GAAW;QAEX,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,IAAI,GAAG,CAAC,CAAC;QAEb,qDAAqD;QACrD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC;YACnC,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YAElB,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAClB,MAAM,GAAG,CAAC,CAAC;gBACX,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,IAAI,CAAC,CAAC;YACZ,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,CAAC,CAAC;gBACZ,OAAO,IAAI,IAAI,CAAC;YAClB,CAAC;QACH,CAAC;QAED,IAAI,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAEvC,OAAO,IAAI,GAAG,KAAK,CAAC,CAAC;YACnB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC;YACtB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAE9B,IAAI,YAAY,GAAG,CAAC,CAAC;QAErB,yEAAyE;QACzE,QAAQ;QACR,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YACxB,IAAI,MAAM,GAAG,EAAE,EAAE,CAAC;gBAChB,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACN,YAAY,GAAG,MAAM,GAAG,EAAE,CAAC;gBAC3B,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;QAED,KAAK,CACH,GAAG,OAAO,UAAU,IAAI,YAAY,MAAM,KAAK;cAC3C,KAAK,OAAO,IAAI;cAChB,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,YAAY,GAAG,CAAC,CAAC,GAAG,KAAK,CAClD,CAAC;QAEF,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC;IACvB,CAAC;CACF;AA5ED,4BA4EC"}
|
package/dist/lib/XmlNode.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"XmlNode.js","sourceRoot":"","sources":["../../src/lib/XmlNode.ts"],"names":[],"mappings":";;;AAIA;;GAEG;AACH,MAAa,OAAO;IAApB;QAyCE;;WAEG;QACH,WAAM,GAAoC,IAAI,CAAC;QAE/C;;;WAGG;QACH,UAAK,GAAG,CAAC,CAAC,CAAC;QAEX;;;WAGG;QACH,QAAG,GAAG,CAAC,CAAC,CAAC;IAyEX,CAAC;IAvEC;;;OAGG;IACH,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,MAAM,EAAE,QAAQ,IAAI,IAAI,CAAC;IACvC,CAAC;IAED;;;OAGG;IACH,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,MAAM,KAAK,IAAI;eACtB,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,QAAQ;eAC7B,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,YAAY,CAAC;IAC1C,CAAC;IAED;;;;;;;;;;OAUG;IACH,IAAI,kBAAkB;QACpB,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,kBAAkB,CAAC;IAC3C,CAAC;IAED;;;;;;;;;OASG;IACH,IAAI,IAAI;QACN,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;;OAGG;IACH,MAAM;QACJ,IAAI,IAAI,GAAe;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC;QAEF,IAAI,IAAI,CAAC,UAAU,EAAE;
|
|
1
|
+
{"version":3,"file":"XmlNode.js","sourceRoot":"","sources":["../../src/lib/XmlNode.ts"],"names":[],"mappings":";;;AAIA;;GAEG;AACH,MAAa,OAAO;IAApB;QAyCE;;WAEG;QACH,WAAM,GAAoC,IAAI,CAAC;QAE/C;;;WAGG;QACH,UAAK,GAAG,CAAC,CAAC,CAAC;QAEX;;;WAGG;QACH,QAAG,GAAG,CAAC,CAAC,CAAC;IAyEX,CAAC;IAvEC;;;OAGG;IACH,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,MAAM,EAAE,QAAQ,IAAI,IAAI,CAAC;IACvC,CAAC;IAED;;;OAGG;IACH,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,MAAM,KAAK,IAAI;eACtB,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,QAAQ;eAC7B,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,YAAY,CAAC;IAC1C,CAAC;IAED;;;;;;;;;;OAUG;IACH,IAAI,kBAAkB;QACpB,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,kBAAkB,CAAC;IAC3C,CAAC;IAED;;;;;;;;;OASG;IACH,IAAI,IAAI;QACN,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;;OAGG;IACH,MAAM;QACJ,IAAI,IAAI,GAAe;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC;QAEF,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;QAED,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC5B,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACjC,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;YACxB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACtB,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;;AAhIH,0BAiIC;AAhIC;;GAEG;AACa,kBAAU,GAAG,OAAO,AAAV,CAAW;AAErC;;GAEG;AACa,oBAAY,GAAG,SAAS,AAAZ,CAAa;AAEzC;;GAEG;AACa,qBAAa,GAAG,UAAU,AAAb,CAAc;AAE3C;;GAEG;AACa,0BAAkB,GAAG,SAAS,AAAZ,CAAa;AAE/C;;GAEG;AACa,oBAAY,GAAG,SAAS,AAAZ,CAAa;AAEzC;;GAEG;AACa,mCAA2B,GAAG,IAAI,AAAP,CAAQ;AAEnD;;GAEG;AACa,iBAAS,GAAG,MAAM,AAAT,CAAU;AAEnC;;GAEG;AACa,4BAAoB,GAAG,SAAS,AAAZ,CAAa"}
|
package/dist/lib/syntax.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"syntax.d.ts","sourceRoot":"","sources":["../../src/lib/syntax.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,
|
|
1
|
+
{"version":3,"file":"syntax.d.ts","sourceRoot":"","sources":["../../src/lib/syntax.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,QAAU,CAAC;AAE/C;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,QAAU,CAAC;AAE/C;;;;;GAKG;AACH,eAAO,MAAM,4BAA4B,QAAmB,CAAC;AAE7D;;;;;GAKG;AACH,eAAO,MAAM,WAAW,QAAY,CAAC;AAErC;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC;IAAC,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CAAC,CAMhE,CAAC;AAEJ;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAehD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAA0B,MAAM,GAAG,OAAO,CAkBzF;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAErD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAOlD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAOlD"}
|
package/dist/lib/syntax.js
CHANGED
|
@@ -1,20 +1,25 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.predefinedEntities = exports.endCharData = exports.attValueNormalizedWhitespace = exports.attValueCharSingleQuote = exports.attValueCharDoubleQuote = void 0;
|
|
4
|
+
exports.isNameChar = isNameChar;
|
|
5
|
+
exports.isNameStartChar = isNameStartChar;
|
|
6
|
+
exports.isReferenceChar = isReferenceChar;
|
|
7
|
+
exports.isWhitespace = isWhitespace;
|
|
8
|
+
exports.isXmlCodePoint = isXmlCodePoint;
|
|
4
9
|
/**
|
|
5
10
|
* Regular expression that matches one or more `AttValue` characters in a
|
|
6
11
|
* double-quoted attribute value.
|
|
7
12
|
*
|
|
8
13
|
* @see https://www.w3.org/TR/2008/REC-xml-20081126/#NT-AttValue
|
|
9
14
|
*/
|
|
10
|
-
exports.attValueCharDoubleQuote = /[
|
|
15
|
+
exports.attValueCharDoubleQuote = /["&<]/;
|
|
11
16
|
/**
|
|
12
17
|
* Regular expression that matches one or more `AttValue` characters in a
|
|
13
18
|
* single-quoted attribute value.
|
|
14
19
|
*
|
|
15
20
|
* @see https://www.w3.org/TR/2008/REC-xml-20081126/#NT-AttValue
|
|
16
21
|
*/
|
|
17
|
-
exports.attValueCharSingleQuote = /[
|
|
22
|
+
exports.attValueCharSingleQuote = /['&<]/;
|
|
18
23
|
/**
|
|
19
24
|
* Regular expression that matches a whitespace character that should be
|
|
20
25
|
* normalized to a space character in an attribute value.
|
|
@@ -47,7 +52,7 @@ exports.predefinedEntities = Object.freeze(Object.assign(Object.create(null), {
|
|
|
47
52
|
* @see https://www.w3.org/TR/2008/REC-xml-20081126/#NT-NameChar
|
|
48
53
|
*/
|
|
49
54
|
function isNameChar(char) {
|
|
50
|
-
let cp =
|
|
55
|
+
let cp = char.codePointAt(0);
|
|
51
56
|
// Including the most common NameStartChars here improves performance
|
|
52
57
|
// slightly.
|
|
53
58
|
return (cp >= 0x61 && cp <= 0x7A) // a-z
|
|
@@ -57,16 +62,16 @@ function isNameChar(char) {
|
|
|
57
62
|
|| cp === 0x2E // .
|
|
58
63
|
|| cp === 0xB7
|
|
59
64
|
|| (cp >= 0x300 && cp <= 0x36F)
|
|
60
|
-
||
|
|
65
|
+
|| cp === 0x203F
|
|
66
|
+
|| cp === 0x2040
|
|
61
67
|
|| isNameStartChar(char, cp);
|
|
62
68
|
}
|
|
63
|
-
exports.isNameChar = isNameChar;
|
|
64
69
|
/**
|
|
65
70
|
* Returns `true` if _char_ is an XML `NameStartChar`, `false` if it isn't.
|
|
66
71
|
*
|
|
67
72
|
* @see https://www.w3.org/TR/2008/REC-xml-20081126/#NT-NameStartChar
|
|
68
73
|
*/
|
|
69
|
-
function isNameStartChar(char, cp =
|
|
74
|
+
function isNameStartChar(char, cp = char.codePointAt(0)) {
|
|
70
75
|
return (cp >= 0x61 && cp <= 0x7A) // a-z
|
|
71
76
|
|| (cp >= 0x41 && cp <= 0x5A) // A-Z
|
|
72
77
|
|| cp === 0x3A // :
|
|
@@ -76,7 +81,8 @@ function isNameStartChar(char, cp = getCodePoint(char)) {
|
|
|
76
81
|
|| (cp >= 0xF8 && cp <= 0x2FF)
|
|
77
82
|
|| (cp >= 0x370 && cp <= 0x37D)
|
|
78
83
|
|| (cp >= 0x37F && cp <= 0x1FFF)
|
|
79
|
-
||
|
|
84
|
+
|| cp === 0x200C
|
|
85
|
+
|| cp === 0x200D
|
|
80
86
|
|| (cp >= 0x2070 && cp <= 0x218F)
|
|
81
87
|
|| (cp >= 0x2C00 && cp <= 0x2FEF)
|
|
82
88
|
|| (cp >= 0x3001 && cp <= 0xD7FF)
|
|
@@ -84,7 +90,6 @@ function isNameStartChar(char, cp = getCodePoint(char)) {
|
|
|
84
90
|
|| (cp >= 0xFDF0 && cp <= 0xFFFD)
|
|
85
91
|
|| (cp >= 0x10000 && cp <= 0xEFFFF);
|
|
86
92
|
}
|
|
87
|
-
exports.isNameStartChar = isNameStartChar;
|
|
88
93
|
/**
|
|
89
94
|
* Returns `true` if _char_ is a valid reference character (which may appear
|
|
90
95
|
* between `&` and `;` in a reference), `false` otherwise.
|
|
@@ -94,20 +99,18 @@ exports.isNameStartChar = isNameStartChar;
|
|
|
94
99
|
function isReferenceChar(char) {
|
|
95
100
|
return char === '#' || isNameChar(char);
|
|
96
101
|
}
|
|
97
|
-
exports.isReferenceChar = isReferenceChar;
|
|
98
102
|
/**
|
|
99
103
|
* Returns `true` if _char_ is an XML whitespace character, `false` otherwise.
|
|
100
104
|
*
|
|
101
105
|
* @see https://www.w3.org/TR/2008/REC-xml-20081126/#white
|
|
102
106
|
*/
|
|
103
107
|
function isWhitespace(char) {
|
|
104
|
-
let cp =
|
|
108
|
+
let cp = char.codePointAt(0);
|
|
105
109
|
return cp === 0x20
|
|
106
110
|
|| cp === 0x9
|
|
107
111
|
|| cp === 0xA
|
|
108
112
|
|| cp === 0xD;
|
|
109
113
|
}
|
|
110
|
-
exports.isWhitespace = isWhitespace;
|
|
111
114
|
/**
|
|
112
115
|
* Returns `true` if _codepoint_ is a valid XML `Char` code point, `false`
|
|
113
116
|
* otherwise.
|
|
@@ -115,19 +118,11 @@ exports.isWhitespace = isWhitespace;
|
|
|
115
118
|
* @see https://www.w3.org/TR/2008/REC-xml-20081126/#NT-Char
|
|
116
119
|
*/
|
|
117
120
|
function isXmlCodePoint(cp) {
|
|
118
|
-
return cp
|
|
121
|
+
return (cp >= 0x20 && cp <= 0xD7FF)
|
|
119
122
|
|| cp === 0xA
|
|
123
|
+
|| cp === 0x9
|
|
120
124
|
|| cp === 0xD
|
|
121
|
-
|| (cp >= 0x20 && cp <= 0xD7FF)
|
|
122
125
|
|| (cp >= 0xE000 && cp <= 0xFFFD)
|
|
123
126
|
|| (cp >= 0x10000 && cp <= 0x10FFFF);
|
|
124
127
|
}
|
|
125
|
-
exports.isXmlCodePoint = isXmlCodePoint;
|
|
126
|
-
/**
|
|
127
|
-
* Returns the Unicode code point value of the given character, or `-1` if
|
|
128
|
-
* _char_ is empty.
|
|
129
|
-
*/
|
|
130
|
-
function getCodePoint(char) {
|
|
131
|
-
return char.codePointAt(0) || -1;
|
|
132
|
-
}
|
|
133
128
|
//# sourceMappingURL=syntax.js.map
|
package/dist/lib/syntax.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"syntax.js","sourceRoot":"","sources":["../../src/lib/syntax.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"syntax.js","sourceRoot":"","sources":["../../src/lib/syntax.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rgrove/parse-xml",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.2.0",
|
|
4
4
|
"description": "A fast, safe, compliant XML parser for Node.js and browsers.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"xml",
|
|
@@ -21,7 +21,6 @@
|
|
|
21
21
|
"engines": {
|
|
22
22
|
"node": ">=14.0.0"
|
|
23
23
|
},
|
|
24
|
-
"packageManager": "pnpm@7.26.1",
|
|
25
24
|
"files": [
|
|
26
25
|
"dist",
|
|
27
26
|
"!dist/tsconfig.tsbuildinfo",
|
|
@@ -32,35 +31,31 @@
|
|
|
32
31
|
"main": "./dist/index.js",
|
|
33
32
|
"browser": "./dist/browser.js",
|
|
34
33
|
"devDependencies": {
|
|
35
|
-
"@rgrove/eslint-config": "^5.
|
|
36
|
-
"@types/node": "^
|
|
37
|
-
"assert": "^2.
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
"
|
|
41
|
-
"
|
|
42
|
-
"
|
|
43
|
-
"
|
|
44
|
-
"nyc": "^15.1.0",
|
|
34
|
+
"@rgrove/eslint-config": "^5.1.0",
|
|
35
|
+
"@types/node": "^22.7.9",
|
|
36
|
+
"assert": "^2.1.0",
|
|
37
|
+
"concurrently": "^9.0.1",
|
|
38
|
+
"esbuild": "^0.24.0",
|
|
39
|
+
"eslint": "^8.57.1",
|
|
40
|
+
"expect-type": "^1.1.0",
|
|
41
|
+
"mocha": "^10.7.3",
|
|
42
|
+
"nyc": "^17.1.0",
|
|
45
43
|
"path-browserify": "^1.0.1",
|
|
46
44
|
"process": "^0.11.10",
|
|
47
|
-
"typedoc": "^0.
|
|
48
|
-
"typescript": "
|
|
49
|
-
"webpack": "^5.75.0",
|
|
50
|
-
"webpack-cli": "^4.10.0",
|
|
51
|
-
"webpack-dev-server": "^4.11.1"
|
|
45
|
+
"typedoc": "^0.26.10",
|
|
46
|
+
"typescript": "5.6.3"
|
|
52
47
|
},
|
|
53
48
|
"scripts": {
|
|
54
49
|
"build": "pnpm run build:js && pnpm run build:bundle && pnpm run build:docs",
|
|
55
50
|
"build:bundle": "./scripts/esbuild.js",
|
|
56
51
|
"build:docs": "typedoc src/index.ts",
|
|
57
52
|
"build:js": "tsc",
|
|
58
|
-
"clean": "rm -rf .nyc_output coverage dist",
|
|
53
|
+
"clean": "rm -rf .nyc_output coverage dist docs tests/.build",
|
|
59
54
|
"coverage": "nyc --reporter html --report-dir coverage pnpm test && open coverage/index.html",
|
|
60
55
|
"lint": "pnpm run build:js && pnpm run lint:js",
|
|
61
56
|
"lint:js": "eslint .",
|
|
62
57
|
"test": "pnpm run build:js && nyc --check-coverage --branches 100 --functions 100 --lines 100 --statements 100 mocha && pnpm run test:types",
|
|
63
|
-
"test:browser": "pnpm run build:js && pnpm run build:bundle &&
|
|
58
|
+
"test:browser": "pnpm run build:js && pnpm run build:bundle && scripts/test/browser.js",
|
|
64
59
|
"test:types": "pnpm run build:js && tsc --noEmit tests/types.expect.ts",
|
|
65
60
|
"test:watch": "pnpm run build:js && concurrently --kill-others-on-fail --names build,mocha 'pnpm run build:js --watch' 'mocha --watch'"
|
|
66
61
|
}
|
package/src/lib/Parser.ts
CHANGED
|
@@ -31,28 +31,17 @@ export class Parser {
|
|
|
31
31
|
*/
|
|
32
32
|
constructor(xml: string, options: ParserOptions = {}) {
|
|
33
33
|
let doc = this.document = new XmlDocument();
|
|
34
|
-
let scanner = this.scanner = new StringScanner(xml);
|
|
35
34
|
|
|
36
35
|
this.currentNode = doc;
|
|
37
36
|
this.options = options;
|
|
37
|
+
this.scanner = new StringScanner(xml);
|
|
38
38
|
|
|
39
39
|
if (this.options.includeOffsets) {
|
|
40
40
|
doc.start = 0;
|
|
41
41
|
doc.end = xml.length;
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
-
|
|
45
|
-
this.consumeProlog();
|
|
46
|
-
|
|
47
|
-
if (!this.consumeElement()) {
|
|
48
|
-
throw this.error('Root element is missing or invalid');
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
while (this.consumeMisc()) {} // eslint-disable-line no-empty
|
|
52
|
-
|
|
53
|
-
if (!scanner.isEnd) {
|
|
54
|
-
throw this.error('Extra content at the end of the document');
|
|
55
|
-
}
|
|
44
|
+
this.parse();
|
|
56
45
|
}
|
|
57
46
|
|
|
58
47
|
/**
|
|
@@ -182,7 +171,7 @@ export class Parser {
|
|
|
182
171
|
: syntax.attValueCharSingleQuote;
|
|
183
172
|
|
|
184
173
|
matchLoop: while (!scanner.isEnd) {
|
|
185
|
-
chars = scanner.
|
|
174
|
+
chars = scanner.consumeUntilMatch(regex);
|
|
186
175
|
|
|
187
176
|
if (chars) {
|
|
188
177
|
this.validateChars(chars);
|
|
@@ -201,7 +190,7 @@ export class Parser {
|
|
|
201
190
|
case '<':
|
|
202
191
|
throw this.error('Unescaped `<` is not allowed in an attribute value');
|
|
203
192
|
|
|
204
|
-
|
|
193
|
+
default:
|
|
205
194
|
break matchLoop;
|
|
206
195
|
}
|
|
207
196
|
}
|
|
@@ -224,14 +213,14 @@ export class Parser {
|
|
|
224
213
|
let { scanner } = this;
|
|
225
214
|
let startIndex = scanner.charIndex;
|
|
226
215
|
|
|
227
|
-
if (!scanner.
|
|
216
|
+
if (!scanner.consumeString('<![CDATA[')) {
|
|
228
217
|
return false;
|
|
229
218
|
}
|
|
230
219
|
|
|
231
220
|
let text = scanner.consumeUntilString(']]>');
|
|
232
221
|
this.validateChars(text);
|
|
233
222
|
|
|
234
|
-
if (!scanner.
|
|
223
|
+
if (!scanner.consumeString(']]>')) {
|
|
235
224
|
throw this.error('Unclosed CDATA section');
|
|
236
225
|
}
|
|
237
226
|
|
|
@@ -274,14 +263,14 @@ export class Parser {
|
|
|
274
263
|
let { scanner } = this;
|
|
275
264
|
let startIndex = scanner.charIndex;
|
|
276
265
|
|
|
277
|
-
if (!scanner.
|
|
266
|
+
if (!scanner.consumeString('<!--')) {
|
|
278
267
|
return false;
|
|
279
268
|
}
|
|
280
269
|
|
|
281
270
|
let content = scanner.consumeUntilString('--');
|
|
282
271
|
this.validateChars(content);
|
|
283
272
|
|
|
284
|
-
if (!scanner.
|
|
273
|
+
if (!scanner.consumeString('-->')) {
|
|
285
274
|
if (scanner.peek(2) === '--') {
|
|
286
275
|
throw this.error("The string `--` isn't allowed inside a comment");
|
|
287
276
|
}
|
|
@@ -325,7 +314,7 @@ export class Parser {
|
|
|
325
314
|
let { scanner } = this;
|
|
326
315
|
let startIndex = scanner.charIndex;
|
|
327
316
|
|
|
328
|
-
if (!scanner.
|
|
317
|
+
if (!scanner.consumeString('<!DOCTYPE')) {
|
|
329
318
|
return false;
|
|
330
319
|
}
|
|
331
320
|
|
|
@@ -340,7 +329,7 @@ export class Parser {
|
|
|
340
329
|
let systemId;
|
|
341
330
|
|
|
342
331
|
if (this.consumeWhitespace()) {
|
|
343
|
-
if (scanner.
|
|
332
|
+
if (scanner.consumeString('PUBLIC')) {
|
|
344
333
|
publicId = this.consumeWhitespace()
|
|
345
334
|
&& this.consumePubidLiteral();
|
|
346
335
|
|
|
@@ -351,7 +340,7 @@ export class Parser {
|
|
|
351
340
|
this.consumeWhitespace();
|
|
352
341
|
}
|
|
353
342
|
|
|
354
|
-
if (publicId !== undefined || scanner.
|
|
343
|
+
if (publicId !== undefined || scanner.consumeString('SYSTEM')) {
|
|
355
344
|
this.consumeWhitespace();
|
|
356
345
|
systemId = this.consumeSystemLiteral();
|
|
357
346
|
|
|
@@ -365,19 +354,19 @@ export class Parser {
|
|
|
365
354
|
|
|
366
355
|
let internalSubset;
|
|
367
356
|
|
|
368
|
-
if (scanner.
|
|
357
|
+
if (scanner.consumeString('[')) {
|
|
369
358
|
// The internal subset may contain comments that contain `]` characters,
|
|
370
359
|
// so we can't use `consumeUntilString()` here.
|
|
371
360
|
internalSubset = scanner.consumeUntilMatch(/\][\x20\t\r\n]*>/);
|
|
372
361
|
|
|
373
|
-
if (!scanner.
|
|
362
|
+
if (!scanner.consumeString(']')) {
|
|
374
363
|
throw this.error('Unclosed internal subset');
|
|
375
364
|
}
|
|
376
365
|
|
|
377
366
|
this.consumeWhitespace();
|
|
378
367
|
}
|
|
379
368
|
|
|
380
|
-
if (!scanner.
|
|
369
|
+
if (!scanner.consumeString('>')) {
|
|
381
370
|
throw this.error('Unclosed doctype declaration');
|
|
382
371
|
}
|
|
383
372
|
|
|
@@ -396,7 +385,7 @@ export class Parser {
|
|
|
396
385
|
let { scanner } = this;
|
|
397
386
|
let startIndex = scanner.charIndex;
|
|
398
387
|
|
|
399
|
-
if (!scanner.
|
|
388
|
+
if (!scanner.consumeString('<')) {
|
|
400
389
|
return false;
|
|
401
390
|
}
|
|
402
391
|
|
|
@@ -408,13 +397,13 @@ export class Parser {
|
|
|
408
397
|
}
|
|
409
398
|
|
|
410
399
|
let attributes = this.consumeAttributes();
|
|
411
|
-
let isEmpty = !!scanner.
|
|
400
|
+
let isEmpty = !!scanner.consumeString('/>');
|
|
412
401
|
let element = new XmlElement(name, attributes);
|
|
413
402
|
|
|
414
403
|
element.parent = this.currentNode;
|
|
415
404
|
|
|
416
405
|
if (!isEmpty) {
|
|
417
|
-
if (!scanner.
|
|
406
|
+
if (!scanner.consumeString('>')) {
|
|
418
407
|
throw this.error(`Unclosed start tag for element \`${name}\``);
|
|
419
408
|
}
|
|
420
409
|
|
|
@@ -433,7 +422,7 @@ export class Parser {
|
|
|
433
422
|
let endTagMark = scanner.charIndex;
|
|
434
423
|
let endTagName;
|
|
435
424
|
|
|
436
|
-
if (!scanner.
|
|
425
|
+
if (!scanner.consumeString('</')
|
|
437
426
|
|| !(endTagName = this.consumeName())
|
|
438
427
|
|| endTagName !== name) {
|
|
439
428
|
|
|
@@ -443,7 +432,7 @@ export class Parser {
|
|
|
443
432
|
|
|
444
433
|
this.consumeWhitespace();
|
|
445
434
|
|
|
446
|
-
if (!scanner.
|
|
435
|
+
if (!scanner.consumeString('>')) {
|
|
447
436
|
throw this.error(`Unclosed end tag for element ${name}`);
|
|
448
437
|
}
|
|
449
438
|
|
|
@@ -462,7 +451,7 @@ export class Parser {
|
|
|
462
451
|
consumeEqual(): boolean {
|
|
463
452
|
this.consumeWhitespace();
|
|
464
453
|
|
|
465
|
-
if (this.scanner.
|
|
454
|
+
if (this.scanner.consumeString('=')) {
|
|
466
455
|
this.consumeWhitespace();
|
|
467
456
|
return true;
|
|
468
457
|
}
|
|
@@ -504,7 +493,7 @@ export class Parser {
|
|
|
504
493
|
let { scanner } = this;
|
|
505
494
|
let startIndex = scanner.charIndex;
|
|
506
495
|
|
|
507
|
-
if (!scanner.
|
|
496
|
+
if (!scanner.consumeString('<?')) {
|
|
508
497
|
return false;
|
|
509
498
|
}
|
|
510
499
|
|
|
@@ -520,7 +509,7 @@ export class Parser {
|
|
|
520
509
|
}
|
|
521
510
|
|
|
522
511
|
if (!this.consumeWhitespace()) {
|
|
523
|
-
if (scanner.
|
|
512
|
+
if (scanner.consumeString('?>')) {
|
|
524
513
|
return this.addNode(new XmlProcessingInstruction(name), startIndex);
|
|
525
514
|
}
|
|
526
515
|
|
|
@@ -530,7 +519,7 @@ export class Parser {
|
|
|
530
519
|
let content = scanner.consumeUntilString('?>');
|
|
531
520
|
this.validateChars(content);
|
|
532
521
|
|
|
533
|
-
if (!scanner.
|
|
522
|
+
if (!scanner.consumeString('?>')) {
|
|
534
523
|
throw this.error('Unterminated processing instruction');
|
|
535
524
|
}
|
|
536
525
|
|
|
@@ -595,7 +584,7 @@ export class Parser {
|
|
|
595
584
|
consumeReference(): string | false {
|
|
596
585
|
let { scanner } = this;
|
|
597
586
|
|
|
598
|
-
if (!scanner.
|
|
587
|
+
if (!scanner.consumeString('&')) {
|
|
599
588
|
return false;
|
|
600
589
|
}
|
|
601
590
|
|
|
@@ -675,7 +664,7 @@ export class Parser {
|
|
|
675
664
|
*/
|
|
676
665
|
consumeSystemLiteral(): string | false {
|
|
677
666
|
let { scanner } = this;
|
|
678
|
-
let quote = scanner.
|
|
667
|
+
let quote = scanner.consumeString('"') || scanner.consumeString("'");
|
|
679
668
|
|
|
680
669
|
if (!quote) {
|
|
681
670
|
return false;
|
|
@@ -684,7 +673,7 @@ export class Parser {
|
|
|
684
673
|
let value = scanner.consumeUntilString(quote);
|
|
685
674
|
this.validateChars(value);
|
|
686
675
|
|
|
687
|
-
if (!scanner.
|
|
676
|
+
if (!scanner.consumeString(quote)) {
|
|
688
677
|
throw this.error('Missing end quote');
|
|
689
678
|
}
|
|
690
679
|
|
|
@@ -711,7 +700,7 @@ export class Parser {
|
|
|
711
700
|
let { scanner } = this;
|
|
712
701
|
let startIndex = scanner.charIndex;
|
|
713
702
|
|
|
714
|
-
if (!scanner.
|
|
703
|
+
if (!scanner.consumeString('<?xml')) {
|
|
715
704
|
return false;
|
|
716
705
|
}
|
|
717
706
|
|
|
@@ -719,7 +708,7 @@ export class Parser {
|
|
|
719
708
|
throw this.error('Invalid XML declaration');
|
|
720
709
|
}
|
|
721
710
|
|
|
722
|
-
let version = !!scanner.
|
|
711
|
+
let version = !!scanner.consumeString('version')
|
|
723
712
|
&& this.consumeEqual()
|
|
724
713
|
&& this.consumeSystemLiteral();
|
|
725
714
|
|
|
@@ -733,15 +722,18 @@ export class Parser {
|
|
|
733
722
|
let standalone;
|
|
734
723
|
|
|
735
724
|
if (this.consumeWhitespace()) {
|
|
736
|
-
encoding = !!scanner.
|
|
725
|
+
encoding = !!scanner.consumeString('encoding')
|
|
737
726
|
&& this.consumeEqual()
|
|
738
727
|
&& this.consumeSystemLiteral();
|
|
739
728
|
|
|
740
729
|
if (encoding) {
|
|
730
|
+
if (!/^[A-Za-z][\w.-]*$/.test(encoding)) {
|
|
731
|
+
throw this.error('Invalid character in encoding name');
|
|
732
|
+
}
|
|
741
733
|
this.consumeWhitespace();
|
|
742
734
|
}
|
|
743
735
|
|
|
744
|
-
standalone = !!scanner.
|
|
736
|
+
standalone = !!scanner.consumeString('standalone')
|
|
745
737
|
&& this.consumeEqual()
|
|
746
738
|
&& this.consumeSystemLiteral();
|
|
747
739
|
|
|
@@ -754,7 +746,7 @@ export class Parser {
|
|
|
754
746
|
}
|
|
755
747
|
}
|
|
756
748
|
|
|
757
|
-
if (!scanner.
|
|
749
|
+
if (!scanner.consumeString('?>')) {
|
|
758
750
|
throw this.error('Invalid or unclosed XML declaration');
|
|
759
751
|
}
|
|
760
752
|
|
|
@@ -775,6 +767,24 @@ export class Parser {
|
|
|
775
767
|
return new XmlError(message, scanner.charIndex, scanner.string);
|
|
776
768
|
}
|
|
777
769
|
|
|
770
|
+
/**
|
|
771
|
+
* Parses the XML input.
|
|
772
|
+
*/
|
|
773
|
+
parse() {
|
|
774
|
+
this.scanner.consumeString('\uFEFF'); // byte order mark
|
|
775
|
+
this.consumeProlog();
|
|
776
|
+
|
|
777
|
+
if (!this.consumeElement()) {
|
|
778
|
+
throw this.error('Root element is missing or invalid');
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
while (this.consumeMisc()) {} // eslint-disable-line no-empty
|
|
782
|
+
|
|
783
|
+
if (!this.scanner.isEnd) {
|
|
784
|
+
throw this.error('Extra content at the end of the document');
|
|
785
|
+
}
|
|
786
|
+
}
|
|
787
|
+
|
|
778
788
|
/**
|
|
779
789
|
* Throws an invalid character error if any character in the given _string_
|
|
780
790
|
* isn't a valid XML character.
|