xml-tokenizer 0.0.31 → 0.0.32

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 (111) hide show
  1. package/dist/cjs/config.js +43 -1
  2. package/dist/cjs/config.js.map +1 -0
  3. package/dist/cjs/get-q-name.js +8 -1
  4. package/dist/cjs/get-q-name.js.map +1 -0
  5. package/dist/cjs/index.js +80 -1
  6. package/dist/cjs/index.js.map +1 -0
  7. package/dist/cjs/selector/TokenSelectState.js +107 -1
  8. package/dist/cjs/selector/TokenSelectState.js.map +1 -0
  9. package/dist/cjs/selector/TokenSelectStateMachine.js +151 -1
  10. package/dist/cjs/selector/TokenSelectStateMachine.js.map +1 -0
  11. package/dist/cjs/selector/TokenSelector.js +140 -1
  12. package/dist/cjs/selector/TokenSelector.js.map +1 -0
  13. package/dist/cjs/selector/match-string.js +22 -1
  14. package/dist/cjs/selector/match-string.js.map +1 -0
  15. package/dist/cjs/selector/select.js +20 -1
  16. package/dist/cjs/selector/select.js.map +1 -0
  17. package/dist/cjs/token-to-xml.js +45 -1
  18. package/dist/cjs/token-to-xml.js.map +1 -0
  19. package/dist/cjs/tokenizer/XmlError.js +97 -1
  20. package/dist/cjs/tokenizer/XmlError.js.map +1 -0
  21. package/dist/cjs/tokenizer/XmlStream.js +479 -1
  22. package/dist/cjs/tokenizer/XmlStream.js.map +1 -0
  23. package/dist/cjs/tokenizer/ascii-constants.js +70 -1
  24. package/dist/cjs/tokenizer/ascii-constants.js.map +1 -0
  25. package/dist/cjs/tokenizer/tokenize.js +420 -1
  26. package/dist/cjs/tokenizer/tokenize.js.map +1 -0
  27. package/dist/cjs/tokenizer/utils.js +48 -1
  28. package/dist/cjs/tokenizer/utils.js.map +1 -0
  29. package/dist/cjs/tokens-to-xml.js +14 -1
  30. package/dist/cjs/tokens-to-xml.js.map +1 -0
  31. package/dist/cjs/xml-to-object.js +70 -1
  32. package/dist/cjs/xml-to-object.js.map +1 -0
  33. package/dist/cjs/xml-to-simplified-object.js +87 -1
  34. package/dist/cjs/xml-to-simplified-object.js.map +1 -0
  35. package/dist/esm/config.js +39 -1
  36. package/dist/esm/config.js.map +1 -0
  37. package/dist/esm/get-q-name.js +6 -1
  38. package/dist/esm/get-q-name.js.map +1 -0
  39. package/dist/esm/index.js +16 -1
  40. package/dist/esm/index.js.map +1 -0
  41. package/dist/esm/selector/TokenSelectState.js +103 -1
  42. package/dist/esm/selector/TokenSelectState.js.map +1 -0
  43. package/dist/esm/selector/TokenSelectStateMachine.js +149 -1
  44. package/dist/esm/selector/TokenSelectStateMachine.js.map +1 -0
  45. package/dist/esm/selector/TokenSelector.js +138 -1
  46. package/dist/esm/selector/TokenSelector.js.map +1 -0
  47. package/dist/esm/selector/match-string.js +20 -1
  48. package/dist/esm/selector/match-string.js.map +1 -0
  49. package/dist/esm/selector/select.js +18 -1
  50. package/dist/esm/selector/select.js.map +1 -0
  51. package/dist/esm/token-to-xml.js +43 -1
  52. package/dist/esm/token-to-xml.js.map +1 -0
  53. package/dist/esm/tokenizer/XmlError.js +95 -1
  54. package/dist/esm/tokenizer/XmlError.js.map +1 -0
  55. package/dist/esm/tokenizer/XmlStream.js +477 -1
  56. package/dist/esm/tokenizer/XmlStream.js.map +1 -0
  57. package/dist/esm/tokenizer/ascii-constants.js +36 -1
  58. package/dist/esm/tokenizer/ascii-constants.js.map +1 -0
  59. package/dist/esm/tokenizer/tokenize.js +417 -1
  60. package/dist/esm/tokenizer/tokenize.js.map +1 -0
  61. package/dist/esm/tokenizer/utils.js +41 -1
  62. package/dist/esm/tokenizer/utils.js.map +1 -0
  63. package/dist/esm/tokens-to-xml.js +12 -1
  64. package/dist/esm/tokens-to-xml.js.map +1 -0
  65. package/dist/esm/xml-to-object.js +67 -1
  66. package/dist/esm/xml-to-object.js.map +1 -0
  67. package/dist/esm/xml-to-simplified-object.js +84 -1
  68. package/dist/esm/xml-to-simplified-object.js.map +1 -0
  69. package/dist/types/config.d.ts +1 -0
  70. package/dist/types/config.d.ts.map +1 -0
  71. package/dist/types/get-q-name.d.ts +1 -0
  72. package/dist/types/get-q-name.d.ts.map +1 -0
  73. package/dist/types/index.d.ts +1 -0
  74. package/dist/types/index.d.ts.map +1 -0
  75. package/dist/types/selector/TokenSelectState.d.ts +1 -0
  76. package/dist/types/selector/TokenSelectState.d.ts.map +1 -0
  77. package/dist/types/selector/TokenSelectStateMachine.d.ts +1 -0
  78. package/dist/types/selector/TokenSelectStateMachine.d.ts.map +1 -0
  79. package/dist/types/selector/TokenSelector.d.ts +1 -0
  80. package/dist/types/selector/TokenSelector.d.ts.map +1 -0
  81. package/dist/types/selector/index.d.ts +1 -0
  82. package/dist/types/selector/index.d.ts.map +1 -0
  83. package/dist/types/selector/match-string.d.ts +1 -0
  84. package/dist/types/selector/match-string.d.ts.map +1 -0
  85. package/dist/types/selector/select.d.ts +1 -0
  86. package/dist/types/selector/select.d.ts.map +1 -0
  87. package/dist/types/selector/types.d.ts +1 -0
  88. package/dist/types/selector/types.d.ts.map +1 -0
  89. package/dist/types/token-to-xml.d.ts +1 -0
  90. package/dist/types/token-to-xml.d.ts.map +1 -0
  91. package/dist/types/tokenizer/XmlError.d.ts +1 -0
  92. package/dist/types/tokenizer/XmlError.d.ts.map +1 -0
  93. package/dist/types/tokenizer/XmlStream.d.ts +1 -0
  94. package/dist/types/tokenizer/XmlStream.d.ts.map +1 -0
  95. package/dist/types/tokenizer/ascii-constants.d.ts +1 -0
  96. package/dist/types/tokenizer/ascii-constants.d.ts.map +1 -0
  97. package/dist/types/tokenizer/index.d.ts +1 -0
  98. package/dist/types/tokenizer/index.d.ts.map +1 -0
  99. package/dist/types/tokenizer/tokenize.d.ts +1 -0
  100. package/dist/types/tokenizer/tokenize.d.ts.map +1 -0
  101. package/dist/types/tokenizer/types.d.ts +1 -0
  102. package/dist/types/tokenizer/types.d.ts.map +1 -0
  103. package/dist/types/tokenizer/utils.d.ts +1 -0
  104. package/dist/types/tokenizer/utils.d.ts.map +1 -0
  105. package/dist/types/tokens-to-xml.d.ts +1 -0
  106. package/dist/types/tokens-to-xml.d.ts.map +1 -0
  107. package/dist/types/xml-to-object.d.ts +1 -0
  108. package/dist/types/xml-to-object.d.ts.map +1 -0
  109. package/dist/types/xml-to-simplified-object.d.ts +1 -0
  110. package/dist/types/xml-to-simplified-object.d.ts.map +1 -0
  111. package/package.json +6 -5
@@ -1 +1,70 @@
1
- "use strict";var r=require("./tokenizer/tokenize.js");function s(t,o={}){const e={local:"root",attributes:[],content:[]},n=[e];return r.tokenize(t,l=>{c(l,n)},o),e.content[0]}function c(t,o){switch(t.type){case"ElementStart":{const e={local:t.local,prefix:t.prefix.length>0?t.prefix:void 0,attributes:[],content:[]},n=o[o.length-1];n!=null&&n.content.push(e),o.push(e);break}case"ElementEnd":{(t.end.type==="Close"||t.end.type==="Empty")&&o.pop();break}case"Attribute":{const e=o[o.length-1];e!=null&&e.attributes.push({local:t.local,prefix:t.prefix.length>0?t.prefix:void 0,value:t.value});break}case"Text":case"Cdata":{const e=o[o.length-1];e!=null&&t.text.trim().length>0&&e.content.push(t.text);break}}}exports.processTokenForObject=c,exports.xmlToObject=s;
1
+ 'use strict';
2
+
3
+ var tokenize = require('./tokenizer/tokenize.js');
4
+
5
+ function xmlToObject(xmlString, options = {}) {
6
+ const root = {
7
+ local: "root",
8
+ attributes: [],
9
+ content: []
10
+ };
11
+ const stack = [root];
12
+ tokenize.tokenize(
13
+ xmlString,
14
+ (token) => {
15
+ processTokenForObject(token, stack);
16
+ },
17
+ options
18
+ );
19
+ return root.content[0];
20
+ }
21
+ function processTokenForObject(token, stack) {
22
+ switch (token.type) {
23
+ case "ElementStart": {
24
+ const newNode = {
25
+ local: token.local,
26
+ prefix: token.prefix.length > 0 ? token.prefix : void 0,
27
+ attributes: [],
28
+ content: []
29
+ };
30
+ const currentNode = stack[stack.length - 1];
31
+ if (currentNode != null) {
32
+ currentNode.content.push(newNode);
33
+ }
34
+ stack.push(newNode);
35
+ break;
36
+ }
37
+ case "ElementEnd": {
38
+ if (token.end.type === "Close" || token.end.type === "Empty") {
39
+ stack.pop();
40
+ }
41
+ break;
42
+ }
43
+ case "Attribute": {
44
+ const currentNode = stack[stack.length - 1];
45
+ if (currentNode != null) {
46
+ currentNode.attributes.push({
47
+ local: token.local,
48
+ prefix: token.prefix.length > 0 ? token.prefix : void 0,
49
+ value: token.value
50
+ });
51
+ }
52
+ break;
53
+ }
54
+ case "Text":
55
+ case "Cdata": {
56
+ const currentNode = stack[stack.length - 1];
57
+ if (currentNode != null) {
58
+ const trimmedText = token.text.trim();
59
+ if (trimmedText.length > 0) {
60
+ currentNode.content.push(token.text);
61
+ }
62
+ }
63
+ break;
64
+ }
65
+ }
66
+ }
67
+
68
+ exports.processTokenForObject = processTokenForObject;
69
+ exports.xmlToObject = xmlToObject;
70
+ //# sourceMappingURL=xml-to-object.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xml-to-object.js","sources":["../../src/xml-to-object.ts"],"sourcesContent":["import { tokenize, type TXmlStreamOptions, type TXmlToken } from './tokenizer';\n\nexport function xmlToObject(xmlString: string, options: TXmlStreamOptions = {}): TXmlNode {\n\tconst root: TXmlNode = {\n\t\tlocal: 'root',\n\t\tattributes: [],\n\t\tcontent: []\n\t};\n\tconst stack: TXmlNode[] = [root];\n\n\ttokenize(\n\t\txmlString,\n\t\t(token) => {\n\t\t\tprocessTokenForObject(token, stack);\n\t\t},\n\t\toptions\n\t);\n\n\treturn root.content[0] as TXmlNode;\n}\n\nexport function processTokenForObject(token: TXmlToken, stack: TXmlNode[]): void {\n\tswitch (token.type) {\n\t\tcase 'ElementStart': {\n\t\t\tconst newNode: TXmlNode = {\n\t\t\t\tlocal: token.local,\n\t\t\t\tprefix: token.prefix.length > 0 ? token.prefix : undefined,\n\t\t\t\tattributes: [],\n\t\t\t\tcontent: []\n\t\t\t};\n\n\t\t\tconst currentNode = stack[stack.length - 1];\n\t\t\tif (currentNode != null) {\n\t\t\t\tcurrentNode.content.push(newNode);\n\t\t\t}\n\n\t\t\tstack.push(newNode);\n\t\t\tbreak;\n\t\t}\n\t\tcase 'ElementEnd': {\n\t\t\tif (token.end.type === 'Close' || token.end.type === 'Empty') {\n\t\t\t\tstack.pop();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 'Attribute': {\n\t\t\tconst currentNode = stack[stack.length - 1];\n\t\t\tif (currentNode != null) {\n\t\t\t\tcurrentNode.attributes.push({\n\t\t\t\t\tlocal: token.local,\n\t\t\t\t\tprefix: token.prefix.length > 0 ? token.prefix : undefined,\n\t\t\t\t\tvalue: token.value\n\t\t\t\t});\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 'Text':\n\t\tcase 'Cdata': {\n\t\t\tconst currentNode = stack[stack.length - 1];\n\t\t\tif (currentNode != null) {\n\t\t\t\tconst trimmedText = token.text.trim();\n\t\t\t\tif (trimmedText.length > 0) {\n\t\t\t\t\tcurrentNode.content.push(token.text);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 'Comment':\n\t\tcase 'ProcessingInstruction':\n\t\tcase 'EntityDeclaration':\n\t}\n}\n\nexport interface TXmlNode {\n\tlocal: string;\n\tprefix?: string;\n\tattributes: { local: string; prefix?: string; value: string }[];\n\tcontent: (TXmlNode | string)[];\n}\n"],"names":["tokenize"],"mappings":";;;;AAEO,SAAS,WAAW,CAAC,SAAS,EAAE,OAAO,GAAG,EAAE,EAAE;AACrD,EAAE,MAAM,IAAI,GAAG;AACf,IAAI,KAAK,EAAE,MAAM;AACjB,IAAI,UAAU,EAAE,EAAE;AAClB,IAAI,OAAO,EAAE;AACb,GAAG;AACH,EAAE,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC;AACtB,EAAEA,iBAAQ;AACV,IAAI,SAAS;AACb,IAAI,CAAC,KAAK,KAAK;AACf,MAAM,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC;AACzC,KAAK;AACL,IAAI;AACJ,GAAG;AACH,EAAE,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AACxB;AACO,SAAS,qBAAqB,CAAC,KAAK,EAAE,KAAK,EAAE;AACpD,EAAE,QAAQ,KAAK,CAAC,IAAI;AACpB,IAAI,KAAK,cAAc,EAAE;AACzB,MAAM,MAAM,OAAO,GAAG;AACtB,QAAQ,KAAK,EAAE,KAAK,CAAC,KAAK;AAC1B,QAAQ,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM;AAC/D,QAAQ,UAAU,EAAE,EAAE;AACtB,QAAQ,OAAO,EAAE;AACjB,OAAO;AACP,MAAM,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AACjD,MAAM,IAAI,WAAW,IAAI,IAAI,EAAE;AAC/B,QAAQ,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;AACzC;AACA,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;AACzB,MAAM;AACN;AACA,IAAI,KAAK,YAAY,EAAE;AACvB,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE;AACpE,QAAQ,KAAK,CAAC,GAAG,EAAE;AACnB;AACA,MAAM;AACN;AACA,IAAI,KAAK,WAAW,EAAE;AACtB,MAAM,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AACjD,MAAM,IAAI,WAAW,IAAI,IAAI,EAAE;AAC/B,QAAQ,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC;AACpC,UAAU,KAAK,EAAE,KAAK,CAAC,KAAK;AAC5B,UAAU,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM;AACjE,UAAU,KAAK,EAAE,KAAK,CAAC;AACvB,SAAS,CAAC;AACV;AACA,MAAM;AACN;AACA,IAAI,KAAK,MAAM;AACf,IAAI,KAAK,OAAO,EAAE;AAClB,MAAM,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AACjD,MAAM,IAAI,WAAW,IAAI,IAAI,EAAE;AAC/B,QAAQ,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE;AAC7C,QAAQ,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;AACpC,UAAU,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;AAC9C;AACA;AACA,MAAM;AACN;AAIA;AACA;;;;;"}
@@ -1 +1,87 @@
1
- "use strict";var c=require("./get-q-name.js"),o=require("./tokenizer/tokenize.js");function s(i,l={}){const e={},t=[e];return o.tokenize(i,r=>{a(r,t)},l),e}function a(i,l){switch(i.type){case"ElementStart":{const e=c.getQName(i.local,i.prefix),t=`_${e}`,r={},n=l[l.length-1];n!=null&&(n.content!=null?(r.tag=e,n.content.push(r)):n.text!=null?(r.tag=e,n.content=[n.text,r],delete n.text):n[t]==null?n[t]=[r]:Array.isArray(n[t])?n[t].push(r):n[t]=[n[t],r]),l.push(r);break}case"ElementEnd":{(i.end.type==="Close"||i.end.type==="Empty")&&l.pop();break}case"Attribute":{const e=l[l.length-1];if(e!=null){const t=c.getQName(i.local,i.prefix);e.attributes!=null?e.attributes[t]=i.value:e.attributes={[t]:i.value}}break}case"Text":case"Cdata":{const e=l[l.length-1];if(e!=null){const t=i.text.trim();t.length>0&&(e.content!=null?e.content.push(t):e.text!=null?(e.content=[e.text,t],delete e.text):e.text=t)}break}}}exports.processTokenForSimplifiedObject=a,exports.xmlToSimplifiedObject=s;
1
+ 'use strict';
2
+
3
+ var getQName = require('./get-q-name.js');
4
+ var tokenize = require('./tokenizer/tokenize.js');
5
+
6
+ function xmlToSimplifiedObject(xmlString, options = {}) {
7
+ const result = {};
8
+ const stack = [result];
9
+ tokenize.tokenize(
10
+ xmlString,
11
+ (token) => {
12
+ processTokenForSimplifiedObject(token, stack);
13
+ },
14
+ options
15
+ );
16
+ return result;
17
+ }
18
+ function processTokenForSimplifiedObject(token, stack) {
19
+ switch (token.type) {
20
+ case "ElementStart": {
21
+ const tagName = getQName.getQName(token.local, token.prefix);
22
+ const tagNameWithPrefix = `_${tagName}`;
23
+ const newNode = {};
24
+ const currentNode = stack[stack.length - 1];
25
+ if (currentNode != null) {
26
+ if (currentNode.content != null) {
27
+ newNode.tag = tagName;
28
+ currentNode.content.push(newNode);
29
+ } else if (currentNode.text != null) {
30
+ newNode.tag = tagName;
31
+ currentNode.content = [currentNode.text, newNode];
32
+ delete currentNode.text;
33
+ } else if (currentNode[tagNameWithPrefix] == null) {
34
+ currentNode[tagNameWithPrefix] = [newNode];
35
+ } else if (Array.isArray(currentNode[tagNameWithPrefix])) {
36
+ currentNode[tagNameWithPrefix].push(newNode);
37
+ } else {
38
+ currentNode[tagNameWithPrefix] = [currentNode[tagNameWithPrefix], newNode];
39
+ }
40
+ }
41
+ stack.push(newNode);
42
+ break;
43
+ }
44
+ case "ElementEnd": {
45
+ if (token.end.type === "Close" || token.end.type === "Empty") {
46
+ stack.pop();
47
+ }
48
+ break;
49
+ }
50
+ case "Attribute": {
51
+ const currentNode = stack[stack.length - 1];
52
+ if (currentNode != null) {
53
+ const attrName = getQName.getQName(token.local, token.prefix);
54
+ if (currentNode.attributes != null) {
55
+ currentNode.attributes[attrName] = token.value;
56
+ } else {
57
+ currentNode.attributes = {
58
+ [attrName]: token.value
59
+ };
60
+ }
61
+ }
62
+ break;
63
+ }
64
+ case "Text":
65
+ case "Cdata": {
66
+ const currentNode = stack[stack.length - 1];
67
+ if (currentNode != null) {
68
+ const trimmedText = token.text.trim();
69
+ if (trimmedText.length > 0) {
70
+ if (currentNode.content != null) {
71
+ currentNode.content.push(trimmedText);
72
+ } else if (currentNode.text != null) {
73
+ currentNode.content = [currentNode.text, trimmedText];
74
+ delete currentNode.text;
75
+ } else {
76
+ currentNode.text = trimmedText;
77
+ }
78
+ }
79
+ }
80
+ break;
81
+ }
82
+ }
83
+ }
84
+
85
+ exports.processTokenForSimplifiedObject = processTokenForSimplifiedObject;
86
+ exports.xmlToSimplifiedObject = xmlToSimplifiedObject;
87
+ //# sourceMappingURL=xml-to-simplified-object.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xml-to-simplified-object.js","sources":["../../src/xml-to-simplified-object.ts"],"sourcesContent":["import { getQName } from './get-q-name';\nimport { tokenize, type TXmlStreamOptions, type TXmlToken } from './tokenizer';\n\nexport function xmlToSimplifiedObject(\n\txmlString: string,\n\toptions: TXmlStreamOptions = {}\n): TSimplifiedXmlNode {\n\tconst result: TSimplifiedXmlNode = {};\n\tconst stack: TSimplifiedXmlNode[] = [result];\n\n\ttokenize(\n\t\txmlString,\n\t\t(token) => {\n\t\t\tprocessTokenForSimplifiedObject(token, stack);\n\t\t},\n\t\toptions\n\t);\n\n\treturn result;\n}\n\nexport function processTokenForSimplifiedObject(\n\ttoken: TXmlToken,\n\tstack: TSimplifiedXmlNode[]\n): void {\n\tswitch (token.type) {\n\t\tcase 'ElementStart': {\n\t\t\tconst tagName = getQName(token.local, token.prefix);\n\t\t\tconst tagNameWithPrefix: TSimplifiedXmlNodeTagName = `_${tagName}`;\n\t\t\tconst newNode: TSimplifiedXmlNode = {};\n\n\t\t\tconst currentNode = stack[stack.length - 1];\n\t\t\tif (currentNode != null) {\n\t\t\t\tif (currentNode.content != null) {\n\t\t\t\t\tnewNode.tag = tagName;\n\t\t\t\t\tcurrentNode.content.push(newNode);\n\t\t\t\t} else if (currentNode.text != null) {\n\t\t\t\t\tnewNode.tag = tagName;\n\t\t\t\t\tcurrentNode.content = [currentNode.text, newNode];\n\t\t\t\t\tdelete currentNode.text;\n\t\t\t\t} else if (currentNode[tagNameWithPrefix] == null) {\n\t\t\t\t\tcurrentNode[tagNameWithPrefix] = [newNode];\n\t\t\t\t} else if (Array.isArray(currentNode[tagNameWithPrefix])) {\n\t\t\t\t\tcurrentNode[tagNameWithPrefix].push(newNode);\n\t\t\t\t} else {\n\t\t\t\t\tcurrentNode[tagNameWithPrefix] = [currentNode[tagNameWithPrefix], newNode];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tstack.push(newNode);\n\t\t\tbreak;\n\t\t}\n\t\tcase 'ElementEnd': {\n\t\t\tif (token.end.type === 'Close' || token.end.type === 'Empty') {\n\t\t\t\tstack.pop();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 'Attribute': {\n\t\t\tconst currentNode = stack[stack.length - 1];\n\t\t\tif (currentNode != null) {\n\t\t\t\tconst attrName = getQName(token.local, token.prefix);\n\t\t\t\tif (currentNode.attributes != null) {\n\t\t\t\t\tcurrentNode.attributes[attrName] = token.value;\n\t\t\t\t} else {\n\t\t\t\t\tcurrentNode.attributes = {\n\t\t\t\t\t\t[attrName]: token.value\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 'Text':\n\t\tcase 'Cdata': {\n\t\t\tconst currentNode = stack[stack.length - 1];\n\t\t\tif (currentNode != null) {\n\t\t\t\tconst trimmedText = token.text.trim();\n\t\t\t\tif (trimmedText.length > 0) {\n\t\t\t\t\tif (currentNode.content != null) {\n\t\t\t\t\t\tcurrentNode.content.push(trimmedText);\n\t\t\t\t\t} else if (currentNode.text != null) {\n\t\t\t\t\t\tcurrentNode.content = [currentNode.text, trimmedText];\n\t\t\t\t\t\tdelete currentNode.text;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcurrentNode.text = trimmedText;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 'Comment':\n\t\tcase 'ProcessingInstruction':\n\t\tcase 'EntityDeclaration':\n\t}\n}\n\nexport interface TSimplifiedXmlNode {\n\ttag?: string;\n\tattributes?: Record<string, string>;\n\ttext?: string;\n\tcontent?: (string | TSimplifiedXmlNode)[];\n\t// TODO: Do we need a prefix to make it typesafe?\n\t[key: TSimplifiedXmlNodeTagName]: TSimplifiedXmlNode[];\n}\n\nexport type TSimplifiedXmlNodeTagName = `_${string}`;\n"],"names":["tokenize","getQName"],"mappings":"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"}
@@ -1 +1,39 @@
1
- const e={strictDocument:!0,allowDtd:!0,rawTextElements:null,implicitSelfClosingElements:null,contextSliceSize:30},t={strictDocument:!1,allowDtd:!0,rawTextElements:["script","style","title","textarea"],implicitSelfClosingElements:["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"],contextSliceSize:30},l={strictDocument:!1,allowDtd:!0,rawTextElements:["style"],implicitSelfClosingElements:[],contextSliceSize:30};export{t as htmlConfig,l as svgConfig,e as xmlConfig};
1
+ const xmlConfig = {
2
+ strictDocument: true,
3
+ allowDtd: true,
4
+ rawTextElements: null,
5
+ implicitSelfClosingElements: null,
6
+ contextSliceSize: 30
7
+ };
8
+ const htmlConfig = {
9
+ strictDocument: false,
10
+ allowDtd: true,
11
+ rawTextElements: ["script", "style", "title", "textarea"],
12
+ implicitSelfClosingElements: [
13
+ "area",
14
+ "base",
15
+ "br",
16
+ "col",
17
+ "embed",
18
+ "hr",
19
+ "img",
20
+ "input",
21
+ "link",
22
+ "meta",
23
+ "param",
24
+ "source",
25
+ "track",
26
+ "wbr"
27
+ ],
28
+ contextSliceSize: 30
29
+ };
30
+ const svgConfig = {
31
+ strictDocument: false,
32
+ allowDtd: true,
33
+ rawTextElements: ["style"],
34
+ implicitSelfClosingElements: [],
35
+ contextSliceSize: 30
36
+ };
37
+
38
+ export { htmlConfig, svgConfig, xmlConfig };
39
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sources":["../../src/config.ts"],"sourcesContent":["import { TXmlStreamOptions } from './tokenizer';\n\n/**\n * Default XML configuration with strict XML compliance.\n */\nexport const xmlConfig: TXmlStreamOptions = {\n\tstrictDocument: true,\n\tallowDtd: true,\n\trawTextElements: null,\n\timplicitSelfClosingElements: null,\n\tcontextSliceSize: 30\n};\n\n/**\n * HTML configuration with HTML-specific settings.\n * - Non-strict document structure\n * - Raw text elements like script and style\n * - Implicit self-closing elements (void elements in HTML)\n */\nexport const htmlConfig: TXmlStreamOptions = {\n\tstrictDocument: false,\n\tallowDtd: true,\n\trawTextElements: ['script', 'style', 'title', 'textarea'],\n\timplicitSelfClosingElements: [\n\t\t'area',\n\t\t'base',\n\t\t'br',\n\t\t'col',\n\t\t'embed',\n\t\t'hr',\n\t\t'img',\n\t\t'input',\n\t\t'link',\n\t\t'meta',\n\t\t'param',\n\t\t'source',\n\t\t'track',\n\t\t'wbr'\n\t],\n\tcontextSliceSize: 30\n};\n\n/**\n * SVG configuration with SVG-specific settings.\n */\nexport const svgConfig: TXmlStreamOptions = {\n\tstrictDocument: false,\n\tallowDtd: true,\n\trawTextElements: ['style'],\n\timplicitSelfClosingElements: [],\n\tcontextSliceSize: 30\n};\n"],"names":[],"mappings":"AACY,MAAC,SAAS,GAAG;AACzB,EAAE,cAAc,EAAE,IAAI;AACtB,EAAE,QAAQ,EAAE,IAAI;AAChB,EAAE,eAAe,EAAE,IAAI;AACvB,EAAE,2BAA2B,EAAE,IAAI;AACnC,EAAE,gBAAgB,EAAE;AACpB;AACY,MAAC,UAAU,GAAG;AAC1B,EAAE,cAAc,EAAE,KAAK;AACvB,EAAE,QAAQ,EAAE,IAAI;AAChB,EAAE,eAAe,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC;AAC3D,EAAE,2BAA2B,EAAE;AAC/B,IAAI,MAAM;AACV,IAAI,MAAM;AACV,IAAI,IAAI;AACR,IAAI,KAAK;AACT,IAAI,OAAO;AACX,IAAI,IAAI;AACR,IAAI,KAAK;AACT,IAAI,OAAO;AACX,IAAI,MAAM;AACV,IAAI,MAAM;AACV,IAAI,OAAO;AACX,IAAI,QAAQ;AACZ,IAAI,OAAO;AACX,IAAI;AACJ,GAAG;AACH,EAAE,gBAAgB,EAAE;AACpB;AACY,MAAC,SAAS,GAAG;AACzB,EAAE,cAAc,EAAE,KAAK;AACvB,EAAE,QAAQ,EAAE,IAAI;AAChB,EAAE,eAAe,EAAE,CAAC,OAAO,CAAC;AAC5B,EAAE,2BAA2B,EAAE,EAAE;AACjC,EAAE,gBAAgB,EAAE;AACpB;;;;"}
@@ -1 +1,6 @@
1
- function n(l,e=null){return e!=null&&e.length>0?`${e}:${l}`:l}export{n as getQName};
1
+ function getQName(local, prefix = null) {
2
+ return prefix != null && prefix.length > 0 ? `${prefix}:${local}` : local;
3
+ }
4
+
5
+ export { getQName };
6
+ //# sourceMappingURL=get-q-name.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-q-name.js","sources":["../../src/get-q-name.ts"],"sourcesContent":["/**\n * Constructs a qualified name (QName) from a local name and an optional namespace prefix.\n *\n * https://www.w3.org/2001/tag/doc/qnameids.html\n */\nexport function getQName(local: string, prefix: string | null = null): string {\n\treturn prefix != null && prefix.length > 0 ? `${prefix}:${local}` : local;\n}\n"],"names":[],"mappings":"AACO,SAAS,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE;AAC/C,EAAE,OAAO,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,KAAK;AAC3E;;;;"}
package/dist/esm/index.js CHANGED
@@ -1 +1,16 @@
1
- import{htmlConfig as E,svgConfig as r,xmlConfig as t}from"./config.js";import{getQName as S}from"./get-q-name.js";import{select as R}from"./selector/select.js";import{TokenSelector as i}from"./selector/TokenSelector.js";import{EToCacheNodeProps as T,ETokenMatchCriteria as N,TokenSelectState as _}from"./selector/TokenSelectState.js";import{TokenSelectStateMachine as f}from"./selector/TokenSelectStateMachine.js";import{tokenToXml as x}from"./token-to-xml.js";import{AMPERSAND as a,CARRIAGE_RETURN as c,CLOSE_SQUARE_BRACKET as s,COLON as L,DOUBLE_QUOTE as n,EQUALS as U,EXCLAMATION_MARK as X,GREATER_THAN as k,HASH as I,HORIZONTAL_TAB as H,HYPHEN as M,LESS_THAN as Q,LINE_FEED as g,LOWERCASE_A as B,LOWERCASE_F as D,LOWERCASE_X as h,LOWERCASE_Z as F,NINE as b,OPEN_SQUARE_BRACKET as j,PERCENT as K,PERIOD as W,QUESTION_MARK as Z,SEMICOLON as d,SINGLE_QUOTE as G,SLASH as y,SPACE as z,UNDERSCORE as v,UPPERCASE_A as Y,UPPERCASE_F as q,UPPERCASE_P as u,UPPERCASE_S as w,UPPERCASE_Z as J,ZERO as V}from"./tokenizer/ascii-constants.js";import{tokenize as ee,tokenizeXmlStream as oe}from"./tokenizer/tokenize.js";import{isAsciiDigit as re,isXmlChar as te,isXmlName as me,isXmlNameByte as Se,isXmlNameStart as Ae,isXmlSpaceByte as Re}from"./tokenizer/utils.js";import{XmlError as ie}from"./tokenizer/XmlError.js";import{XmlStream as Te}from"./tokenizer/XmlStream.js";import{tokensToXml as _e}from"./tokens-to-xml.js";import{processTokenForObject as fe,xmlToObject as le}from"./xml-to-object.js";import{processTokenForSimplifiedObject as Pe,xmlToSimplifiedObject as ae}from"./xml-to-simplified-object.js";export{a as AMPERSAND,c as CARRIAGE_RETURN,s as CLOSE_SQUARE_BRACKET,L as COLON,n as DOUBLE_QUOTE,U as EQUALS,T as EToCacheNodeProps,N as ETokenMatchCriteria,X as EXCLAMATION_MARK,k as GREATER_THAN,I as HASH,H as HORIZONTAL_TAB,M as HYPHEN,Q as LESS_THAN,g as LINE_FEED,B as LOWERCASE_A,D as LOWERCASE_F,h as LOWERCASE_X,F as LOWERCASE_Z,b as NINE,j as OPEN_SQUARE_BRACKET,K as PERCENT,W as PERIOD,Z as QUESTION_MARK,d as SEMICOLON,G as SINGLE_QUOTE,y as SLASH,z as SPACE,_ as TokenSelectState,f as TokenSelectStateMachine,i as TokenSelector,v as UNDERSCORE,Y as UPPERCASE_A,q as UPPERCASE_F,u as UPPERCASE_P,w as UPPERCASE_S,J as UPPERCASE_Z,ie as XmlError,Te as XmlStream,V as ZERO,S as getQName,E as htmlConfig,re as isAsciiDigit,te as isXmlChar,me as isXmlName,Se as isXmlNameByte,Ae as isXmlNameStart,Re as isXmlSpaceByte,fe as processTokenForObject,Pe as processTokenForSimplifiedObject,R as select,r as svgConfig,x as tokenToXml,ee as tokenize,oe as tokenizeXmlStream,_e as tokensToXml,t as xmlConfig,le as xmlToObject,ae as xmlToSimplifiedObject};
1
+ export { htmlConfig, svgConfig, xmlConfig } from './config.js';
2
+ export { getQName } from './get-q-name.js';
3
+ export { select } from './selector/select.js';
4
+ export { TokenSelector } from './selector/TokenSelector.js';
5
+ export { EToCacheNodeProps, ETokenMatchCriteria, TokenSelectState } from './selector/TokenSelectState.js';
6
+ export { TokenSelectStateMachine } from './selector/TokenSelectStateMachine.js';
7
+ export { tokenToXml } from './token-to-xml.js';
8
+ export { AMPERSAND, CARRIAGE_RETURN, CLOSE_SQUARE_BRACKET, COLON, DOUBLE_QUOTE, EQUALS, EXCLAMATION_MARK, GREATER_THAN, HASH, HORIZONTAL_TAB, HYPHEN, LESS_THAN, LINE_FEED, LOWERCASE_A, LOWERCASE_F, LOWERCASE_X, LOWERCASE_Z, NINE, OPEN_SQUARE_BRACKET, PERCENT, PERIOD, QUESTION_MARK, SEMICOLON, SINGLE_QUOTE, SLASH, SPACE, UNDERSCORE, UPPERCASE_A, UPPERCASE_F, UPPERCASE_P, UPPERCASE_S, UPPERCASE_Z, ZERO } from './tokenizer/ascii-constants.js';
9
+ export { tokenize, tokenizeXmlStream } from './tokenizer/tokenize.js';
10
+ export { isAsciiDigit, isXmlChar, isXmlName, isXmlNameByte, isXmlNameStart, isXmlSpaceByte } from './tokenizer/utils.js';
11
+ export { XmlError } from './tokenizer/XmlError.js';
12
+ export { XmlStream } from './tokenizer/XmlStream.js';
13
+ export { tokensToXml } from './tokens-to-xml.js';
14
+ export { processTokenForObject, xmlToObject } from './xml-to-object.js';
15
+ export { processTokenForSimplifiedObject, xmlToSimplifiedObject } from './xml-to-simplified-object.js';
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;"}
@@ -1 +1,103 @@
1
- import{matchString as s}from"./match-string.js";var m=Object.defineProperty,p=(e,t,r)=>t in e?m(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,a=(e,t,r)=>p(e,typeof t!="symbol"?t+"":t,r);class _{constructor(t){a(this,"_segment"),a(this,"_matchCriteria",0),a(this,"_toCacheNodeProps",0),a(this,"_enteredDepth",null),this._segment=t,this.applyLevels()}get matchCriteria(){return this._matchCriteria}get toCacheNodeProps(){return this._toCacheNodeProps}get enteredDepth(){return this._enteredDepth}applyLevels(){let t=0,r=0;(this._segment.local!=null||this._segment.prefix!=null)&&(t|=1),this._segment.attributes!=null&&(t|=2,r|=2),this._segment.text!=null&&(t|=4),this._matchCriteria=t,this._toCacheNodeProps=r}matchesName(t,r){return(this._segment.local==null||s(t,this._segment.local))&&(this._segment.prefix==null||s(r,this._segment.prefix))}matchesAttributes(t){if(this._segment.attributes==null)return!0;for(const r of this._segment.attributes){let n=!1;for(const i of t){const u=r.local==null||s(i.local,r.local),o=r.value==null||i.value!=null&&s(i.value,r.value),c=r.prefix==null||i.prefix!=null&&s(i.prefix,r.prefix);if(u&&o&&c){n=!0;break}}if(!n)return!1}return!0}matchesText(t){return this._segment.text==null||s(t,this._segment.text)}matchesDepth(t,r){switch(this._segment.axis){case"child":return t===r+1;case"self-or-descendant":return t>=r}}match(t){this._enteredDepth=t}unmatch(){this._enteredDepth=null}}var l=(e=>(e[e.None=0]="None",e[e.Name=1]="Name",e[e.Attributes=2]="Attributes",e[e.Text=4]="Text",e))(l||{}),h=(e=>(e[e.None=0]="None",e[e.Name=1]="Name",e[e.Attributes=2]="Attributes",e[e.Text=4]="Text",e[e.Node=8]="Node",e))(h||{});export{l as EToCacheNodeProps,h as ETokenMatchCriteria,_ as TokenSelectState};
1
+ import { matchString } from './match-string.js';
2
+
3
+ var __defProp = Object.defineProperty;
4
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
5
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
6
+ class TokenSelectState {
7
+ constructor(segment) {
8
+ __publicField(this, "_segment");
9
+ __publicField(this, "_matchCriteria", 0 /* None */);
10
+ __publicField(this, "_toCacheNodeProps", 0 /* None */);
11
+ __publicField(this, "_enteredDepth", null);
12
+ this._segment = segment;
13
+ this.applyLevels();
14
+ }
15
+ get matchCriteria() {
16
+ return this._matchCriteria;
17
+ }
18
+ get toCacheNodeProps() {
19
+ return this._toCacheNodeProps;
20
+ }
21
+ get enteredDepth() {
22
+ return this._enteredDepth;
23
+ }
24
+ applyLevels() {
25
+ let matchCriteria = 0 /* None */;
26
+ let cacheProps = 0 /* None */;
27
+ if (this._segment.local != null || this._segment.prefix != null) {
28
+ matchCriteria |= 1 /* Name */;
29
+ }
30
+ if (this._segment.attributes != null) {
31
+ matchCriteria |= 2 /* Attributes */;
32
+ cacheProps |= 2 /* Attributes */;
33
+ }
34
+ if (this._segment.text != null) {
35
+ matchCriteria |= 4 /* Text */;
36
+ }
37
+ this._matchCriteria = matchCriteria;
38
+ this._toCacheNodeProps = cacheProps;
39
+ }
40
+ matchesName(local, prefix) {
41
+ return (
42
+ // Match local
43
+ (this._segment.local == null || matchString(local, this._segment.local)) && // Match prefix
44
+ (this._segment.prefix == null || matchString(prefix, this._segment.prefix))
45
+ );
46
+ }
47
+ matchesAttributes(attributes) {
48
+ if (this._segment.attributes == null) {
49
+ return true;
50
+ }
51
+ for (const attributeConfig of this._segment.attributes) {
52
+ let matchFound = false;
53
+ for (const attribute of attributes) {
54
+ const localMatch = attributeConfig.local == null || matchString(attribute.local, attributeConfig.local);
55
+ const valueMatch = attributeConfig.value == null || attribute.value != null && matchString(attribute.value, attributeConfig.value);
56
+ const prefixMatch = attributeConfig.prefix == null || attribute.prefix != null && matchString(attribute.prefix, attributeConfig.prefix);
57
+ if (localMatch && valueMatch && prefixMatch) {
58
+ matchFound = true;
59
+ break;
60
+ }
61
+ }
62
+ if (!matchFound) {
63
+ return false;
64
+ }
65
+ }
66
+ return true;
67
+ }
68
+ matchesText(text) {
69
+ return this._segment.text == null || matchString(text, this._segment.text);
70
+ }
71
+ matchesDepth(depth, parentDepth) {
72
+ switch (this._segment.axis) {
73
+ case "child":
74
+ return depth === parentDepth + 1;
75
+ case "self-or-descendant":
76
+ return depth >= parentDepth;
77
+ }
78
+ }
79
+ match(depth) {
80
+ this._enteredDepth = depth;
81
+ }
82
+ unmatch() {
83
+ this._enteredDepth = null;
84
+ }
85
+ }
86
+ var EToCacheNodeProps = /* @__PURE__ */ ((EToCacheNodeProps2) => {
87
+ EToCacheNodeProps2[EToCacheNodeProps2["None"] = 0] = "None";
88
+ EToCacheNodeProps2[EToCacheNodeProps2["Name"] = 1] = "Name";
89
+ EToCacheNodeProps2[EToCacheNodeProps2["Attributes"] = 2] = "Attributes";
90
+ EToCacheNodeProps2[EToCacheNodeProps2["Text"] = 4] = "Text";
91
+ return EToCacheNodeProps2;
92
+ })(EToCacheNodeProps || {});
93
+ var ETokenMatchCriteria = /* @__PURE__ */ ((ETokenMatchCriteria2) => {
94
+ ETokenMatchCriteria2[ETokenMatchCriteria2["None"] = 0] = "None";
95
+ ETokenMatchCriteria2[ETokenMatchCriteria2["Name"] = 1] = "Name";
96
+ ETokenMatchCriteria2[ETokenMatchCriteria2["Attributes"] = 2] = "Attributes";
97
+ ETokenMatchCriteria2[ETokenMatchCriteria2["Text"] = 4] = "Text";
98
+ ETokenMatchCriteria2[ETokenMatchCriteria2["Node"] = 8] = "Node";
99
+ return ETokenMatchCriteria2;
100
+ })(ETokenMatchCriteria || {});
101
+
102
+ export { EToCacheNodeProps, ETokenMatchCriteria, TokenSelectState };
103
+ //# sourceMappingURL=TokenSelectState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TokenSelectState.js","sources":["../../../src/selector/TokenSelectState.ts"],"sourcesContent":["import { matchString } from './match-string';\nimport { type TCachedAttribute } from './TokenSelectStateMachine';\nimport { type TTokenSelectPathSegment } from './types';\n\nexport class TokenSelectState {\n\tprivate _segment: TTokenSelectPathSegment;\n\tprivate _matchCriteria: ETokenMatchCriteria = ETokenMatchCriteria.None;\n\tprivate _toCacheNodeProps: EToCacheNodeProps = EToCacheNodeProps.None;\n\tprivate _enteredDepth: number | null = null;\n\n\tconstructor(segment: TTokenSelectPathSegment) {\n\t\tthis._segment = segment;\n\t\tthis.applyLevels();\n\t}\n\n\tpublic get matchCriteria(): ETokenMatchCriteria {\n\t\treturn this._matchCriteria;\n\t}\n\n\tpublic get toCacheNodeProps(): EToCacheNodeProps {\n\t\treturn this._toCacheNodeProps;\n\t}\n\n\tpublic get enteredDepth(): number | null {\n\t\treturn this._enteredDepth;\n\t}\n\n\tprivate applyLevels(): void {\n\t\tlet matchCriteria = ETokenMatchCriteria.None;\n\t\tlet cacheProps = EToCacheNodeProps.None;\n\n\t\tif (this._segment.local != null || this._segment.prefix != null) {\n\t\t\tmatchCriteria |= ETokenMatchCriteria.Name;\n\t\t}\n\t\tif (this._segment.attributes != null) {\n\t\t\tmatchCriteria |= ETokenMatchCriteria.Attributes;\n\t\t\tcacheProps |= EToCacheNodeProps.Attributes;\n\t\t}\n\t\tif (this._segment.text != null) {\n\t\t\tmatchCriteria |= ETokenMatchCriteria.Text;\n\t\t}\n\t\t// if (this._segment.predicate != null) {\n\t\t// \tmatchCriteria |= ETokenMatchCriteria.Node;\n\t\t// \tcacheProps |= EToCacheNodeProps.Name | EToCacheNodeProps.Attributes | EToCacheNodeProps.Text;\n\t\t// }\n\n\t\tthis._matchCriteria = matchCriteria;\n\t\tthis._toCacheNodeProps = cacheProps;\n\t}\n\n\tpublic matchesName(local: string, prefix: string): boolean {\n\t\treturn (\n\t\t\t// Match local\n\t\t\t(this._segment.local == null || matchString(local, this._segment.local)) &&\n\t\t\t// Match prefix\n\t\t\t(this._segment.prefix == null || matchString(prefix, this._segment.prefix))\n\t\t);\n\t}\n\n\tpublic matchesAttributes(attributes: TCachedAttribute[]): boolean {\n\t\tif (this._segment.attributes == null) {\n\t\t\treturn true;\n\t\t}\n\n\t\tfor (const attributeConfig of this._segment.attributes) {\n\t\t\tlet matchFound = false;\n\n\t\t\tfor (const attribute of attributes) {\n\t\t\t\tconst localMatch =\n\t\t\t\t\tattributeConfig.local == null || matchString(attribute.local, attributeConfig.local);\n\t\t\t\tconst valueMatch =\n\t\t\t\t\tattributeConfig.value == null ||\n\t\t\t\t\t(attribute.value != null && matchString(attribute.value, attributeConfig.value));\n\t\t\t\tconst prefixMatch =\n\t\t\t\t\tattributeConfig.prefix == null ||\n\t\t\t\t\t(attribute.prefix != null && matchString(attribute.prefix, attributeConfig.prefix));\n\n\t\t\t\tif (localMatch && valueMatch && prefixMatch) {\n\t\t\t\t\tmatchFound = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!matchFound) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tpublic matchesText(text: string): boolean {\n\t\treturn this._segment.text == null || matchString(text, this._segment.text);\n\t}\n\n\tpublic matchesDepth(depth: number, parentDepth: number): boolean {\n\t\tswitch (this._segment.axis) {\n\t\t\tcase 'child':\n\t\t\t\treturn depth === parentDepth + 1;\n\t\t\tcase 'self-or-descendant':\n\t\t\t\treturn depth >= parentDepth;\n\t\t}\n\t}\n\n\tpublic match(depth: number): void {\n\t\tthis._enteredDepth = depth;\n\t}\n\n\tpublic unmatch(): void {\n\t\tthis._enteredDepth = null;\n\t}\n}\n\nexport const enum EToCacheNodeProps {\n\tNone = 0, // Cache none\n\tName = 1 << 0, // Cache local and prefix <prefix:local\n\tAttributes = 1 << 1, // Cache attributes <prefix:local attribute=\"x\"\n\tText = 1 << 2 // Cache text content <prefix:local attribute=\"x\">text\n}\n\nexport const enum ETokenMatchCriteria {\n\tNone = 0, // Match none\n\tName = 1 << 0, // Match local and prefix <prefix:local\n\tAttributes = 1 << 1, // Match attributes <prefix:local attribute=\"x\"\n\tText = 1 << 2, // Match text content <prefix:local attribute=\"x\">text\n\tNode = 1 << 3 // Match node\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1,149 @@
1
- import{TokenSelectState as _,EToCacheNodeProps as u,ETokenMatchCriteria as h}from"./TokenSelectState.js";var S=Object.defineProperty,p=(n,t,e)=>t in n?S(n,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[t]=e,o=(n,t,e)=>p(n,typeof t!="symbol"?t+"":t,e);class N{constructor(t){o(this,"_states"),o(this,"_currentState",null),o(this,"_cachedNodeProps",{prefix:null,local:null,attributes:null,text:null}),o(this,"_cachedTokens",[]),o(this,"_toRecordTokens",[]),this._states=t.map(e=>new _(e))}getNextState(){var t;const e=this._currentState!=null?this._currentState+1:0;return e<this._states.length&&(t=this._states[e])!=null?t:null}getCurrentState(){var t;return this._currentState!=null&&this._currentState<this._states.length&&(t=this._states[this._currentState])!=null?t:null}record(t){this.getOffsetToFinal()<=1&&this._cachedTokens.push(t)}takeRecordedTokens(){if(this._toRecordTokens.length>0){const t=this._toRecordTokens;return this._toRecordTokens=[],t}return null}transitionIfNameMatch(t,e,r){var s;const a=this.getNextState(),i=this.getCurrentState();return a==null?!1:(a.toCacheNodeProps&u.Name&&(this._cachedNodeProps.local=t,this._cachedNodeProps.prefix=e),a.matchesName(t,e)&&a.matchesDepth(r,(s=i==null?void 0:i.enteredDepth)!=null?s:0)&&!(a.matchCriteria&(h.Attributes|h.Text|h.Node))?(this.transitionForward(r),!0):!1)}transitionIfAttributesMatch(t,e,r,s){var a,i;const l=this.getNextState(),d=this.getCurrentState();if(l==null)return!1;const c=(a=this._cachedNodeProps.attributes)!=null?a:[];return c.push({local:t,prefix:e,value:r}),l.toCacheNodeProps&u.Attributes&&(this._cachedNodeProps.attributes=c),l.matchesAttributes(c)&&l.matchesDepth(s,(i=d==null?void 0:d.enteredDepth)!=null?i:0)&&!(l.matchCriteria&(h.Text|h.Node))?(this.transitionForward(s),!0):!1}transitionIfTextMatch(t,e){var r;const s=this.getNextState(),a=this.getCurrentState();return s==null?!1:(s.toCacheNodeProps&u.Text&&(this._cachedNodeProps.text=t),s.matchesText(t)&&s.matchesDepth(e,(r=a==null?void 0:a.enteredDepth)!=null?r:0)&&!(s.matchCriteria&h.Node)?(this.transitionForward(e),!0):!1)}transitionForward(t){const e=this.getCurrentState();e!=null&&e.unmatch(),this._currentState=this._currentState!=null?this._currentState+1:0;const r=this.getCurrentState();r!=null&&r.match(t),this.isFinalState()&&(this._toRecordTokens=this._cachedTokens),this.resetCurrentStateCache()}transitionBack(t){const e=this.getCurrentState();e!=null&&e.unmatch(),this._currentState=this._currentState!=null?this._currentState-1:0;const r=this.getCurrentState();r!=null&&r.match(t),this.resetCurrentStateCache()}isFinalState(){return this._currentState!=null&&this._currentState>=this._states.length-1}getOffsetToFinal(){return this._currentState==null?this._states.length:this._states.length-1-this._currentState}resetCurrentStateCache(){this._cachedNodeProps.prefix=null,this._cachedNodeProps.local=null,this._cachedNodeProps.attributes=null,this._cachedNodeProps.text=null,this._cachedTokens=[]}}export{N as TokenSelectStateMachine};
1
+ import { TokenSelectState, EToCacheNodeProps, ETokenMatchCriteria } from './TokenSelectState.js';
2
+
3
+ var __defProp = Object.defineProperty;
4
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
5
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
6
+ class TokenSelectStateMachine {
7
+ constructor(tokenSelectPath) {
8
+ __publicField(this, "_states");
9
+ // null (start state) -> index (x state)
10
+ __publicField(this, "_currentState", null);
11
+ // Current state cache
12
+ __publicField(this, "_cachedNodeProps", {
13
+ prefix: null,
14
+ local: null,
15
+ attributes: null,
16
+ text: null
17
+ });
18
+ __publicField(this, "_cachedTokens", []);
19
+ __publicField(this, "_toRecordTokens", []);
20
+ this._states = tokenSelectPath.map((part) => new TokenSelectState(part));
21
+ }
22
+ getNextState() {
23
+ var _a;
24
+ const nextIndex = this._currentState != null ? this._currentState + 1 : 0;
25
+ if (nextIndex < this._states.length) {
26
+ return (_a = this._states[nextIndex]) != null ? _a : null;
27
+ }
28
+ return null;
29
+ }
30
+ getCurrentState() {
31
+ var _a;
32
+ if (this._currentState != null && this._currentState < this._states.length) {
33
+ return (_a = this._states[this._currentState]) != null ? _a : null;
34
+ }
35
+ return null;
36
+ }
37
+ record(token) {
38
+ if (this.getOffsetToFinal() <= 1) {
39
+ this._cachedTokens.push(token);
40
+ }
41
+ }
42
+ takeRecordedTokens() {
43
+ if (this._toRecordTokens.length > 0) {
44
+ const recordedTokens = this._toRecordTokens;
45
+ this._toRecordTokens = [];
46
+ return recordedTokens;
47
+ }
48
+ return null;
49
+ }
50
+ transitionIfNameMatch(local, prefix, depth) {
51
+ var _a;
52
+ const nextState = this.getNextState();
53
+ const currentState = this.getCurrentState();
54
+ if (nextState == null) {
55
+ return false;
56
+ }
57
+ if (nextState.toCacheNodeProps & EToCacheNodeProps.Name) {
58
+ this._cachedNodeProps.local = local;
59
+ this._cachedNodeProps.prefix = prefix;
60
+ }
61
+ if (nextState.matchesName(local, prefix) && nextState.matchesDepth(depth, (_a = currentState == null ? void 0 : currentState.enteredDepth) != null ? _a : 0) && !(nextState.matchCriteria & (ETokenMatchCriteria.Attributes | ETokenMatchCriteria.Text | ETokenMatchCriteria.Node))) {
62
+ this.transitionForward(depth);
63
+ return true;
64
+ }
65
+ return false;
66
+ }
67
+ // Transition forward if attributes and depth match, and no additional criteria are required
68
+ transitionIfAttributesMatch(local, prefix, value, depth) {
69
+ var _a, _b;
70
+ const nextState = this.getNextState();
71
+ const currentState = this.getCurrentState();
72
+ if (nextState == null) {
73
+ return false;
74
+ }
75
+ const attributes = (_a = this._cachedNodeProps.attributes) != null ? _a : [];
76
+ attributes.push({ local, prefix, value });
77
+ if (nextState.toCacheNodeProps & EToCacheNodeProps.Attributes) {
78
+ this._cachedNodeProps.attributes = attributes;
79
+ }
80
+ if (nextState.matchesAttributes(attributes) && nextState.matchesDepth(depth, (_b = currentState == null ? void 0 : currentState.enteredDepth) != null ? _b : 0) && !(nextState.matchCriteria & (ETokenMatchCriteria.Text | ETokenMatchCriteria.Node))) {
81
+ this.transitionForward(depth);
82
+ return true;
83
+ }
84
+ return false;
85
+ }
86
+ // Transition forward if text content and depth match, and no additional criteria are required
87
+ transitionIfTextMatch(text, depth) {
88
+ var _a;
89
+ const nextState = this.getNextState();
90
+ const currentState = this.getCurrentState();
91
+ if (nextState == null) {
92
+ return false;
93
+ }
94
+ if (nextState.toCacheNodeProps & EToCacheNodeProps.Text) {
95
+ this._cachedNodeProps.text = text;
96
+ }
97
+ if (nextState.matchesText(text) && nextState.matchesDepth(depth, (_a = currentState == null ? void 0 : currentState.enteredDepth) != null ? _a : 0) && !(nextState.matchCriteria & ETokenMatchCriteria.Node)) {
98
+ this.transitionForward(depth);
99
+ return true;
100
+ }
101
+ return false;
102
+ }
103
+ transitionForward(depth) {
104
+ const previousState = this.getCurrentState();
105
+ if (previousState != null) {
106
+ previousState.unmatch();
107
+ }
108
+ this._currentState = this._currentState != null ? this._currentState + 1 : 0;
109
+ const currentState = this.getCurrentState();
110
+ if (currentState != null) {
111
+ currentState.match(depth);
112
+ }
113
+ if (this.isFinalState()) {
114
+ this._toRecordTokens = this._cachedTokens;
115
+ }
116
+ this.resetCurrentStateCache();
117
+ }
118
+ transitionBack(depth) {
119
+ const previousState = this.getCurrentState();
120
+ if (previousState != null) {
121
+ previousState.unmatch();
122
+ }
123
+ this._currentState = this._currentState != null ? this._currentState - 1 : 0;
124
+ const currentState = this.getCurrentState();
125
+ if (currentState != null) {
126
+ currentState.match(depth);
127
+ }
128
+ this.resetCurrentStateCache();
129
+ }
130
+ isFinalState() {
131
+ return this._currentState != null && this._currentState >= this._states.length - 1;
132
+ }
133
+ getOffsetToFinal() {
134
+ if (this._currentState == null) {
135
+ return this._states.length;
136
+ }
137
+ return this._states.length - 1 - this._currentState;
138
+ }
139
+ resetCurrentStateCache() {
140
+ this._cachedNodeProps.prefix = null;
141
+ this._cachedNodeProps.local = null;
142
+ this._cachedNodeProps.attributes = null;
143
+ this._cachedNodeProps.text = null;
144
+ this._cachedTokens = [];
145
+ }
146
+ }
147
+
148
+ export { TokenSelectStateMachine };
149
+ //# sourceMappingURL=TokenSelectStateMachine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TokenSelectStateMachine.js","sources":["../../../src/selector/TokenSelectStateMachine.ts"],"sourcesContent":["import { type TXmlToken } from '../tokenizer';\nimport { EToCacheNodeProps, ETokenMatchCriteria, TokenSelectState } from './TokenSelectState';\nimport { type TTokenSelectPath } from './types';\n\nexport class TokenSelectStateMachine {\n\tprivate _states: TokenSelectState[];\n\n\t// null (start state) -> index (x state)\n\tprivate _currentState: number | null = null;\n\n\t// Current state cache\n\tprivate _cachedNodeProps: TCachedNodeProps = {\n\t\tprefix: null,\n\t\tlocal: null,\n\t\tattributes: null,\n\t\ttext: null\n\t};\n\tprivate _cachedTokens: TXmlToken[] = [];\n\tprivate _toRecordTokens: TXmlToken[] = [];\n\n\tconstructor(tokenSelectPath: TTokenSelectPath) {\n\t\tthis._states = tokenSelectPath.map((part) => new TokenSelectState(part));\n\t}\n\n\tpublic getNextState(): TokenSelectState | null {\n\t\tconst nextIndex = this._currentState != null ? this._currentState + 1 : 0;\n\t\tif (nextIndex < this._states.length) {\n\t\t\treturn this._states[nextIndex] ?? null;\n\t\t}\n\t\treturn null;\n\t}\n\n\tpublic getCurrentState(): TokenSelectState | null {\n\t\tif (this._currentState != null && this._currentState < this._states.length) {\n\t\t\treturn this._states[this._currentState] ?? null;\n\t\t}\n\t\treturn null;\n\t}\n\n\tpublic record(token: TXmlToken): void {\n\t\tif (this.getOffsetToFinal() <= 1) {\n\t\t\tthis._cachedTokens.push(token);\n\t\t}\n\t}\n\n\tpublic takeRecordedTokens(): TXmlToken[] | null {\n\t\tif (this._toRecordTokens.length > 0) {\n\t\t\tconst recordedTokens = this._toRecordTokens;\n\t\t\tthis._toRecordTokens = [];\n\t\t\treturn recordedTokens;\n\t\t}\n\t\treturn null;\n\t}\n\n\tpublic transitionIfNameMatch(local: string, prefix: string, depth: number): boolean {\n\t\tconst nextState = this.getNextState();\n\t\tconst currentState = this.getCurrentState();\n\t\tif (nextState == null) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Cache name\n\t\tif (nextState.toCacheNodeProps & EToCacheNodeProps.Name) {\n\t\t\tthis._cachedNodeProps.local = local;\n\t\t\tthis._cachedNodeProps.prefix = prefix;\n\t\t}\n\n\t\t// Transition forward if name and depth match, and no additional criteria are required\n\t\tif (\n\t\t\tnextState.matchesName(local, prefix) &&\n\t\t\tnextState.matchesDepth(depth, currentState?.enteredDepth ?? 0) &&\n\t\t\t!(\n\t\t\t\tnextState.matchCriteria &\n\t\t\t\t(ETokenMatchCriteria.Attributes | ETokenMatchCriteria.Text | ETokenMatchCriteria.Node)\n\t\t\t)\n\t\t) {\n\t\t\tthis.transitionForward(depth);\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t// Transition forward if attributes and depth match, and no additional criteria are required\n\tpublic transitionIfAttributesMatch(\n\t\tlocal: string,\n\t\tprefix: string,\n\t\tvalue: string,\n\t\tdepth: number\n\t): boolean {\n\t\tconst nextState = this.getNextState();\n\t\tconst currentState = this.getCurrentState();\n\t\tif (nextState == null) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst attributes = this._cachedNodeProps.attributes ?? [];\n\t\tattributes.push({ local, prefix, value });\n\n\t\t// Cache attributes\n\t\tif (nextState.toCacheNodeProps & EToCacheNodeProps.Attributes) {\n\t\t\tthis._cachedNodeProps.attributes = attributes;\n\t\t}\n\n\t\tif (\n\t\t\tnextState.matchesAttributes(attributes) &&\n\t\t\tnextState.matchesDepth(depth, currentState?.enteredDepth ?? 0) &&\n\t\t\t!(nextState.matchCriteria & (ETokenMatchCriteria.Text | ETokenMatchCriteria.Node))\n\t\t) {\n\t\t\tthis.transitionForward(depth);\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t// Transition forward if text content and depth match, and no additional criteria are required\n\tpublic transitionIfTextMatch(text: string, depth: number): boolean {\n\t\tconst nextState = this.getNextState();\n\t\tconst currentState = this.getCurrentState();\n\t\tif (nextState == null) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Cache text\n\t\tif (nextState.toCacheNodeProps & EToCacheNodeProps.Text) {\n\t\t\tthis._cachedNodeProps.text = text;\n\t\t}\n\n\t\tif (\n\t\t\tnextState.matchesText(text) &&\n\t\t\tnextState.matchesDepth(depth, currentState?.enteredDepth ?? 0) &&\n\t\t\t!(nextState.matchCriteria & ETokenMatchCriteria.Node)\n\t\t) {\n\t\t\tthis.transitionForward(depth);\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tprivate transitionForward(depth: number): void {\n\t\tconst previousState = this.getCurrentState();\n\t\tif (previousState != null) {\n\t\t\tpreviousState.unmatch();\n\t\t}\n\n\t\tthis._currentState = this._currentState != null ? this._currentState + 1 : 0;\n\n\t\tconst currentState = this.getCurrentState();\n\t\tif (currentState != null) {\n\t\t\tcurrentState.match(depth);\n\t\t}\n\n\t\tif (this.isFinalState()) {\n\t\t\tthis._toRecordTokens = this._cachedTokens;\n\t\t}\n\t\tthis.resetCurrentStateCache();\n\t}\n\n\tpublic transitionBack(depth: number): void {\n\t\tconst previousState = this.getCurrentState();\n\t\tif (previousState != null) {\n\t\t\tpreviousState.unmatch();\n\t\t}\n\n\t\tthis._currentState = this._currentState != null ? this._currentState - 1 : 0;\n\n\t\tconst currentState = this.getCurrentState();\n\t\tif (currentState != null) {\n\t\t\tcurrentState.match(depth);\n\t\t}\n\n\t\tthis.resetCurrentStateCache();\n\t}\n\n\tpublic isFinalState(): boolean {\n\t\treturn this._currentState != null && this._currentState >= this._states.length - 1;\n\t}\n\n\tpublic getOffsetToFinal(): number {\n\t\tif (this._currentState == null) {\n\t\t\treturn this._states.length;\n\t\t}\n\t\treturn this._states.length - 1 - this._currentState;\n\t}\n\n\tpublic resetCurrentStateCache(): void {\n\t\tthis._cachedNodeProps.prefix = null;\n\t\tthis._cachedNodeProps.local = null;\n\t\tthis._cachedNodeProps.attributes = null;\n\t\tthis._cachedNodeProps.text = null;\n\t\tthis._cachedTokens = [];\n\t}\n}\n\nexport interface TCachedNodeProps {\n\tprefix: string | null;\n\tlocal: string | null;\n\tattributes: TCachedAttribute[] | null;\n\ttext: string | null;\n}\n\nexport interface TCachedAttribute {\n\tlocal: string;\n\tprefix?: string;\n\tvalue?: string;\n}\n"],"names":[],"mappings":"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"}