xml-tokenizer 0.0.30 → 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.
- package/dist/cjs/config.js +43 -1
- package/dist/cjs/config.js.map +1 -0
- package/dist/cjs/get-q-name.js +8 -1
- package/dist/cjs/get-q-name.js.map +1 -0
- package/dist/cjs/index.js +80 -1
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/selector/TokenSelectState.js +107 -1
- package/dist/cjs/selector/TokenSelectState.js.map +1 -0
- package/dist/cjs/selector/TokenSelectStateMachine.js +151 -1
- package/dist/cjs/selector/TokenSelectStateMachine.js.map +1 -0
- package/dist/cjs/selector/TokenSelector.js +140 -1
- package/dist/cjs/selector/TokenSelector.js.map +1 -0
- package/dist/cjs/selector/match-string.js +22 -1
- package/dist/cjs/selector/match-string.js.map +1 -0
- package/dist/cjs/selector/select.js +20 -1
- package/dist/cjs/selector/select.js.map +1 -0
- package/dist/cjs/token-to-xml.js +45 -1
- package/dist/cjs/token-to-xml.js.map +1 -0
- package/dist/cjs/tokenizer/XmlError.js +97 -1
- package/dist/cjs/tokenizer/XmlError.js.map +1 -0
- package/dist/cjs/tokenizer/XmlStream.js +479 -1
- package/dist/cjs/tokenizer/XmlStream.js.map +1 -0
- package/dist/cjs/tokenizer/ascii-constants.js +70 -1
- package/dist/cjs/tokenizer/ascii-constants.js.map +1 -0
- package/dist/cjs/tokenizer/tokenize.js +420 -1
- package/dist/cjs/tokenizer/tokenize.js.map +1 -0
- package/dist/cjs/tokenizer/utils.js +48 -1
- package/dist/cjs/tokenizer/utils.js.map +1 -0
- package/dist/cjs/tokens-to-xml.js +14 -1
- package/dist/cjs/tokens-to-xml.js.map +1 -0
- package/dist/cjs/xml-to-object.js +70 -1
- package/dist/cjs/xml-to-object.js.map +1 -0
- package/dist/cjs/xml-to-simplified-object.js +87 -1
- package/dist/cjs/xml-to-simplified-object.js.map +1 -0
- package/dist/esm/config.js +39 -1
- package/dist/esm/config.js.map +1 -0
- package/dist/esm/get-q-name.js +6 -1
- package/dist/esm/get-q-name.js.map +1 -0
- package/dist/esm/index.js +16 -1
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/selector/TokenSelectState.js +103 -1
- package/dist/esm/selector/TokenSelectState.js.map +1 -0
- package/dist/esm/selector/TokenSelectStateMachine.js +149 -1
- package/dist/esm/selector/TokenSelectStateMachine.js.map +1 -0
- package/dist/esm/selector/TokenSelector.js +138 -1
- package/dist/esm/selector/TokenSelector.js.map +1 -0
- package/dist/esm/selector/match-string.js +20 -1
- package/dist/esm/selector/match-string.js.map +1 -0
- package/dist/esm/selector/select.js +18 -1
- package/dist/esm/selector/select.js.map +1 -0
- package/dist/esm/token-to-xml.js +43 -1
- package/dist/esm/token-to-xml.js.map +1 -0
- package/dist/esm/tokenizer/XmlError.js +95 -1
- package/dist/esm/tokenizer/XmlError.js.map +1 -0
- package/dist/esm/tokenizer/XmlStream.js +477 -1
- package/dist/esm/tokenizer/XmlStream.js.map +1 -0
- package/dist/esm/tokenizer/ascii-constants.js +36 -1
- package/dist/esm/tokenizer/ascii-constants.js.map +1 -0
- package/dist/esm/tokenizer/tokenize.js +417 -1
- package/dist/esm/tokenizer/tokenize.js.map +1 -0
- package/dist/esm/tokenizer/utils.js +41 -1
- package/dist/esm/tokenizer/utils.js.map +1 -0
- package/dist/esm/tokens-to-xml.js +12 -1
- package/dist/esm/tokens-to-xml.js.map +1 -0
- package/dist/esm/xml-to-object.js +67 -1
- package/dist/esm/xml-to-object.js.map +1 -0
- package/dist/esm/xml-to-simplified-object.js +84 -1
- package/dist/esm/xml-to-simplified-object.js.map +1 -0
- package/dist/types/config.d.ts +1 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/get-q-name.d.ts +1 -0
- package/dist/types/get-q-name.d.ts.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/selector/TokenSelectState.d.ts +1 -0
- package/dist/types/selector/TokenSelectState.d.ts.map +1 -0
- package/dist/types/selector/TokenSelectStateMachine.d.ts +1 -0
- package/dist/types/selector/TokenSelectStateMachine.d.ts.map +1 -0
- package/dist/types/selector/TokenSelector.d.ts +1 -0
- package/dist/types/selector/TokenSelector.d.ts.map +1 -0
- package/dist/types/selector/index.d.ts +1 -0
- package/dist/types/selector/index.d.ts.map +1 -0
- package/dist/types/selector/match-string.d.ts +1 -0
- package/dist/types/selector/match-string.d.ts.map +1 -0
- package/dist/types/selector/select.d.ts +1 -0
- package/dist/types/selector/select.d.ts.map +1 -0
- package/dist/types/selector/types.d.ts +1 -0
- package/dist/types/selector/types.d.ts.map +1 -0
- package/dist/types/token-to-xml.d.ts +1 -0
- package/dist/types/token-to-xml.d.ts.map +1 -0
- package/dist/types/tokenizer/XmlError.d.ts +1 -0
- package/dist/types/tokenizer/XmlError.d.ts.map +1 -0
- package/dist/types/tokenizer/XmlStream.d.ts +1 -0
- package/dist/types/tokenizer/XmlStream.d.ts.map +1 -0
- package/dist/types/tokenizer/ascii-constants.d.ts +1 -0
- package/dist/types/tokenizer/ascii-constants.d.ts.map +1 -0
- package/dist/types/tokenizer/index.d.ts +1 -0
- package/dist/types/tokenizer/index.d.ts.map +1 -0
- package/dist/types/tokenizer/tokenize.d.ts +1 -0
- package/dist/types/tokenizer/tokenize.d.ts.map +1 -0
- package/dist/types/tokenizer/types.d.ts +1 -0
- package/dist/types/tokenizer/types.d.ts.map +1 -0
- package/dist/types/tokenizer/utils.d.ts +1 -0
- package/dist/types/tokenizer/utils.d.ts.map +1 -0
- package/dist/types/tokens-to-xml.d.ts +1 -0
- package/dist/types/tokens-to-xml.d.ts.map +1 -0
- package/dist/types/xml-to-object.d.ts +1 -0
- package/dist/types/xml-to-object.d.ts.map +1 -0
- package/dist/types/xml-to-simplified-object.d.ts +1 -0
- package/dist/types/xml-to-simplified-object.d.ts.map +1 -0
- package/package.json +6 -5
package/dist/cjs/config.js
CHANGED
|
@@ -1 +1,43 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const xmlConfig = {
|
|
4
|
+
strictDocument: true,
|
|
5
|
+
allowDtd: true,
|
|
6
|
+
rawTextElements: null,
|
|
7
|
+
implicitSelfClosingElements: null,
|
|
8
|
+
contextSliceSize: 30
|
|
9
|
+
};
|
|
10
|
+
const htmlConfig = {
|
|
11
|
+
strictDocument: false,
|
|
12
|
+
allowDtd: true,
|
|
13
|
+
rawTextElements: ["script", "style", "title", "textarea"],
|
|
14
|
+
implicitSelfClosingElements: [
|
|
15
|
+
"area",
|
|
16
|
+
"base",
|
|
17
|
+
"br",
|
|
18
|
+
"col",
|
|
19
|
+
"embed",
|
|
20
|
+
"hr",
|
|
21
|
+
"img",
|
|
22
|
+
"input",
|
|
23
|
+
"link",
|
|
24
|
+
"meta",
|
|
25
|
+
"param",
|
|
26
|
+
"source",
|
|
27
|
+
"track",
|
|
28
|
+
"wbr"
|
|
29
|
+
],
|
|
30
|
+
contextSliceSize: 30
|
|
31
|
+
};
|
|
32
|
+
const svgConfig = {
|
|
33
|
+
strictDocument: false,
|
|
34
|
+
allowDtd: true,
|
|
35
|
+
rawTextElements: ["style"],
|
|
36
|
+
implicitSelfClosingElements: [],
|
|
37
|
+
contextSliceSize: 30
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
exports.htmlConfig = htmlConfig;
|
|
41
|
+
exports.svgConfig = svgConfig;
|
|
42
|
+
exports.xmlConfig = xmlConfig;
|
|
43
|
+
//# 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;;;;;;"}
|
package/dist/cjs/get-q-name.js
CHANGED
|
@@ -1 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function getQName(local, prefix = null) {
|
|
4
|
+
return prefix != null && prefix.length > 0 ? `${prefix}:${local}` : local;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
exports.getQName = getQName;
|
|
8
|
+
//# 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/cjs/index.js
CHANGED
|
@@ -1 +1,80 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var config = require('./config.js');
|
|
4
|
+
var getQName = require('./get-q-name.js');
|
|
5
|
+
var select = require('./selector/select.js');
|
|
6
|
+
var TokenSelector = require('./selector/TokenSelector.js');
|
|
7
|
+
var TokenSelectState = require('./selector/TokenSelectState.js');
|
|
8
|
+
var TokenSelectStateMachine = require('./selector/TokenSelectStateMachine.js');
|
|
9
|
+
var tokenToXml = require('./token-to-xml.js');
|
|
10
|
+
var asciiConstants = require('./tokenizer/ascii-constants.js');
|
|
11
|
+
var tokenize = require('./tokenizer/tokenize.js');
|
|
12
|
+
var utils = require('./tokenizer/utils.js');
|
|
13
|
+
var XmlError = require('./tokenizer/XmlError.js');
|
|
14
|
+
var XmlStream = require('./tokenizer/XmlStream.js');
|
|
15
|
+
var tokensToXml = require('./tokens-to-xml.js');
|
|
16
|
+
var xmlToObject = require('./xml-to-object.js');
|
|
17
|
+
var xmlToSimplifiedObject = require('./xml-to-simplified-object.js');
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
exports.htmlConfig = config.htmlConfig;
|
|
22
|
+
exports.svgConfig = config.svgConfig;
|
|
23
|
+
exports.xmlConfig = config.xmlConfig;
|
|
24
|
+
exports.getQName = getQName.getQName;
|
|
25
|
+
exports.select = select.select;
|
|
26
|
+
exports.TokenSelector = TokenSelector.TokenSelector;
|
|
27
|
+
exports.EToCacheNodeProps = TokenSelectState.EToCacheNodeProps;
|
|
28
|
+
exports.ETokenMatchCriteria = TokenSelectState.ETokenMatchCriteria;
|
|
29
|
+
exports.TokenSelectState = TokenSelectState.TokenSelectState;
|
|
30
|
+
exports.TokenSelectStateMachine = TokenSelectStateMachine.TokenSelectStateMachine;
|
|
31
|
+
exports.tokenToXml = tokenToXml.tokenToXml;
|
|
32
|
+
exports.AMPERSAND = asciiConstants.AMPERSAND;
|
|
33
|
+
exports.CARRIAGE_RETURN = asciiConstants.CARRIAGE_RETURN;
|
|
34
|
+
exports.CLOSE_SQUARE_BRACKET = asciiConstants.CLOSE_SQUARE_BRACKET;
|
|
35
|
+
exports.COLON = asciiConstants.COLON;
|
|
36
|
+
exports.DOUBLE_QUOTE = asciiConstants.DOUBLE_QUOTE;
|
|
37
|
+
exports.EQUALS = asciiConstants.EQUALS;
|
|
38
|
+
exports.EXCLAMATION_MARK = asciiConstants.EXCLAMATION_MARK;
|
|
39
|
+
exports.GREATER_THAN = asciiConstants.GREATER_THAN;
|
|
40
|
+
exports.HASH = asciiConstants.HASH;
|
|
41
|
+
exports.HORIZONTAL_TAB = asciiConstants.HORIZONTAL_TAB;
|
|
42
|
+
exports.HYPHEN = asciiConstants.HYPHEN;
|
|
43
|
+
exports.LESS_THAN = asciiConstants.LESS_THAN;
|
|
44
|
+
exports.LINE_FEED = asciiConstants.LINE_FEED;
|
|
45
|
+
exports.LOWERCASE_A = asciiConstants.LOWERCASE_A;
|
|
46
|
+
exports.LOWERCASE_F = asciiConstants.LOWERCASE_F;
|
|
47
|
+
exports.LOWERCASE_X = asciiConstants.LOWERCASE_X;
|
|
48
|
+
exports.LOWERCASE_Z = asciiConstants.LOWERCASE_Z;
|
|
49
|
+
exports.NINE = asciiConstants.NINE;
|
|
50
|
+
exports.OPEN_SQUARE_BRACKET = asciiConstants.OPEN_SQUARE_BRACKET;
|
|
51
|
+
exports.PERCENT = asciiConstants.PERCENT;
|
|
52
|
+
exports.PERIOD = asciiConstants.PERIOD;
|
|
53
|
+
exports.QUESTION_MARK = asciiConstants.QUESTION_MARK;
|
|
54
|
+
exports.SEMICOLON = asciiConstants.SEMICOLON;
|
|
55
|
+
exports.SINGLE_QUOTE = asciiConstants.SINGLE_QUOTE;
|
|
56
|
+
exports.SLASH = asciiConstants.SLASH;
|
|
57
|
+
exports.SPACE = asciiConstants.SPACE;
|
|
58
|
+
exports.UNDERSCORE = asciiConstants.UNDERSCORE;
|
|
59
|
+
exports.UPPERCASE_A = asciiConstants.UPPERCASE_A;
|
|
60
|
+
exports.UPPERCASE_F = asciiConstants.UPPERCASE_F;
|
|
61
|
+
exports.UPPERCASE_P = asciiConstants.UPPERCASE_P;
|
|
62
|
+
exports.UPPERCASE_S = asciiConstants.UPPERCASE_S;
|
|
63
|
+
exports.UPPERCASE_Z = asciiConstants.UPPERCASE_Z;
|
|
64
|
+
exports.ZERO = asciiConstants.ZERO;
|
|
65
|
+
exports.tokenize = tokenize.tokenize;
|
|
66
|
+
exports.tokenizeXmlStream = tokenize.tokenizeXmlStream;
|
|
67
|
+
exports.isAsciiDigit = utils.isAsciiDigit;
|
|
68
|
+
exports.isXmlChar = utils.isXmlChar;
|
|
69
|
+
exports.isXmlName = utils.isXmlName;
|
|
70
|
+
exports.isXmlNameByte = utils.isXmlNameByte;
|
|
71
|
+
exports.isXmlNameStart = utils.isXmlNameStart;
|
|
72
|
+
exports.isXmlSpaceByte = utils.isXmlSpaceByte;
|
|
73
|
+
exports.XmlError = XmlError.XmlError;
|
|
74
|
+
exports.XmlStream = XmlStream.XmlStream;
|
|
75
|
+
exports.tokensToXml = tokensToXml.tokensToXml;
|
|
76
|
+
exports.processTokenForObject = xmlToObject.processTokenForObject;
|
|
77
|
+
exports.xmlToObject = xmlToObject.xmlToObject;
|
|
78
|
+
exports.processTokenForSimplifiedObject = xmlToSimplifiedObject.processTokenForSimplifiedObject;
|
|
79
|
+
exports.xmlToSimplifiedObject = xmlToSimplifiedObject.xmlToSimplifiedObject;
|
|
80
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1 +1,107 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var matchString = require('./match-string.js');
|
|
4
|
+
|
|
5
|
+
var __defProp = Object.defineProperty;
|
|
6
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
7
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
8
|
+
class TokenSelectState {
|
|
9
|
+
constructor(segment) {
|
|
10
|
+
__publicField(this, "_segment");
|
|
11
|
+
__publicField(this, "_matchCriteria", 0 /* None */);
|
|
12
|
+
__publicField(this, "_toCacheNodeProps", 0 /* None */);
|
|
13
|
+
__publicField(this, "_enteredDepth", null);
|
|
14
|
+
this._segment = segment;
|
|
15
|
+
this.applyLevels();
|
|
16
|
+
}
|
|
17
|
+
get matchCriteria() {
|
|
18
|
+
return this._matchCriteria;
|
|
19
|
+
}
|
|
20
|
+
get toCacheNodeProps() {
|
|
21
|
+
return this._toCacheNodeProps;
|
|
22
|
+
}
|
|
23
|
+
get enteredDepth() {
|
|
24
|
+
return this._enteredDepth;
|
|
25
|
+
}
|
|
26
|
+
applyLevels() {
|
|
27
|
+
let matchCriteria = 0 /* None */;
|
|
28
|
+
let cacheProps = 0 /* None */;
|
|
29
|
+
if (this._segment.local != null || this._segment.prefix != null) {
|
|
30
|
+
matchCriteria |= 1 /* Name */;
|
|
31
|
+
}
|
|
32
|
+
if (this._segment.attributes != null) {
|
|
33
|
+
matchCriteria |= 2 /* Attributes */;
|
|
34
|
+
cacheProps |= 2 /* Attributes */;
|
|
35
|
+
}
|
|
36
|
+
if (this._segment.text != null) {
|
|
37
|
+
matchCriteria |= 4 /* Text */;
|
|
38
|
+
}
|
|
39
|
+
this._matchCriteria = matchCriteria;
|
|
40
|
+
this._toCacheNodeProps = cacheProps;
|
|
41
|
+
}
|
|
42
|
+
matchesName(local, prefix) {
|
|
43
|
+
return (
|
|
44
|
+
// Match local
|
|
45
|
+
(this._segment.local == null || matchString.matchString(local, this._segment.local)) && // Match prefix
|
|
46
|
+
(this._segment.prefix == null || matchString.matchString(prefix, this._segment.prefix))
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
matchesAttributes(attributes) {
|
|
50
|
+
if (this._segment.attributes == null) {
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
for (const attributeConfig of this._segment.attributes) {
|
|
54
|
+
let matchFound = false;
|
|
55
|
+
for (const attribute of attributes) {
|
|
56
|
+
const localMatch = attributeConfig.local == null || matchString.matchString(attribute.local, attributeConfig.local);
|
|
57
|
+
const valueMatch = attributeConfig.value == null || attribute.value != null && matchString.matchString(attribute.value, attributeConfig.value);
|
|
58
|
+
const prefixMatch = attributeConfig.prefix == null || attribute.prefix != null && matchString.matchString(attribute.prefix, attributeConfig.prefix);
|
|
59
|
+
if (localMatch && valueMatch && prefixMatch) {
|
|
60
|
+
matchFound = true;
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (!matchFound) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
matchesText(text) {
|
|
71
|
+
return this._segment.text == null || matchString.matchString(text, this._segment.text);
|
|
72
|
+
}
|
|
73
|
+
matchesDepth(depth, parentDepth) {
|
|
74
|
+
switch (this._segment.axis) {
|
|
75
|
+
case "child":
|
|
76
|
+
return depth === parentDepth + 1;
|
|
77
|
+
case "self-or-descendant":
|
|
78
|
+
return depth >= parentDepth;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
match(depth) {
|
|
82
|
+
this._enteredDepth = depth;
|
|
83
|
+
}
|
|
84
|
+
unmatch() {
|
|
85
|
+
this._enteredDepth = null;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
var EToCacheNodeProps = /* @__PURE__ */ ((EToCacheNodeProps2) => {
|
|
89
|
+
EToCacheNodeProps2[EToCacheNodeProps2["None"] = 0] = "None";
|
|
90
|
+
EToCacheNodeProps2[EToCacheNodeProps2["Name"] = 1] = "Name";
|
|
91
|
+
EToCacheNodeProps2[EToCacheNodeProps2["Attributes"] = 2] = "Attributes";
|
|
92
|
+
EToCacheNodeProps2[EToCacheNodeProps2["Text"] = 4] = "Text";
|
|
93
|
+
return EToCacheNodeProps2;
|
|
94
|
+
})(EToCacheNodeProps || {});
|
|
95
|
+
var ETokenMatchCriteria = /* @__PURE__ */ ((ETokenMatchCriteria2) => {
|
|
96
|
+
ETokenMatchCriteria2[ETokenMatchCriteria2["None"] = 0] = "None";
|
|
97
|
+
ETokenMatchCriteria2[ETokenMatchCriteria2["Name"] = 1] = "Name";
|
|
98
|
+
ETokenMatchCriteria2[ETokenMatchCriteria2["Attributes"] = 2] = "Attributes";
|
|
99
|
+
ETokenMatchCriteria2[ETokenMatchCriteria2["Text"] = 4] = "Text";
|
|
100
|
+
ETokenMatchCriteria2[ETokenMatchCriteria2["Node"] = 8] = "Node";
|
|
101
|
+
return ETokenMatchCriteria2;
|
|
102
|
+
})(ETokenMatchCriteria || {});
|
|
103
|
+
|
|
104
|
+
exports.EToCacheNodeProps = EToCacheNodeProps;
|
|
105
|
+
exports.ETokenMatchCriteria = ETokenMatchCriteria;
|
|
106
|
+
exports.TokenSelectState = TokenSelectState;
|
|
107
|
+
//# 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":["matchString"],"mappings":"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"}
|
|
@@ -1 +1,151 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var TokenSelectState = require('./TokenSelectState.js');
|
|
4
|
+
|
|
5
|
+
var __defProp = Object.defineProperty;
|
|
6
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
7
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
8
|
+
class TokenSelectStateMachine {
|
|
9
|
+
constructor(tokenSelectPath) {
|
|
10
|
+
__publicField(this, "_states");
|
|
11
|
+
// null (start state) -> index (x state)
|
|
12
|
+
__publicField(this, "_currentState", null);
|
|
13
|
+
// Current state cache
|
|
14
|
+
__publicField(this, "_cachedNodeProps", {
|
|
15
|
+
prefix: null,
|
|
16
|
+
local: null,
|
|
17
|
+
attributes: null,
|
|
18
|
+
text: null
|
|
19
|
+
});
|
|
20
|
+
__publicField(this, "_cachedTokens", []);
|
|
21
|
+
__publicField(this, "_toRecordTokens", []);
|
|
22
|
+
this._states = tokenSelectPath.map((part) => new TokenSelectState.TokenSelectState(part));
|
|
23
|
+
}
|
|
24
|
+
getNextState() {
|
|
25
|
+
var _a;
|
|
26
|
+
const nextIndex = this._currentState != null ? this._currentState + 1 : 0;
|
|
27
|
+
if (nextIndex < this._states.length) {
|
|
28
|
+
return (_a = this._states[nextIndex]) != null ? _a : null;
|
|
29
|
+
}
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
getCurrentState() {
|
|
33
|
+
var _a;
|
|
34
|
+
if (this._currentState != null && this._currentState < this._states.length) {
|
|
35
|
+
return (_a = this._states[this._currentState]) != null ? _a : null;
|
|
36
|
+
}
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
record(token) {
|
|
40
|
+
if (this.getOffsetToFinal() <= 1) {
|
|
41
|
+
this._cachedTokens.push(token);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
takeRecordedTokens() {
|
|
45
|
+
if (this._toRecordTokens.length > 0) {
|
|
46
|
+
const recordedTokens = this._toRecordTokens;
|
|
47
|
+
this._toRecordTokens = [];
|
|
48
|
+
return recordedTokens;
|
|
49
|
+
}
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
transitionIfNameMatch(local, prefix, depth) {
|
|
53
|
+
var _a;
|
|
54
|
+
const nextState = this.getNextState();
|
|
55
|
+
const currentState = this.getCurrentState();
|
|
56
|
+
if (nextState == null) {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
if (nextState.toCacheNodeProps & TokenSelectState.EToCacheNodeProps.Name) {
|
|
60
|
+
this._cachedNodeProps.local = local;
|
|
61
|
+
this._cachedNodeProps.prefix = prefix;
|
|
62
|
+
}
|
|
63
|
+
if (nextState.matchesName(local, prefix) && nextState.matchesDepth(depth, (_a = currentState == null ? void 0 : currentState.enteredDepth) != null ? _a : 0) && !(nextState.matchCriteria & (TokenSelectState.ETokenMatchCriteria.Attributes | TokenSelectState.ETokenMatchCriteria.Text | TokenSelectState.ETokenMatchCriteria.Node))) {
|
|
64
|
+
this.transitionForward(depth);
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
// Transition forward if attributes and depth match, and no additional criteria are required
|
|
70
|
+
transitionIfAttributesMatch(local, prefix, value, depth) {
|
|
71
|
+
var _a, _b;
|
|
72
|
+
const nextState = this.getNextState();
|
|
73
|
+
const currentState = this.getCurrentState();
|
|
74
|
+
if (nextState == null) {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
const attributes = (_a = this._cachedNodeProps.attributes) != null ? _a : [];
|
|
78
|
+
attributes.push({ local, prefix, value });
|
|
79
|
+
if (nextState.toCacheNodeProps & TokenSelectState.EToCacheNodeProps.Attributes) {
|
|
80
|
+
this._cachedNodeProps.attributes = attributes;
|
|
81
|
+
}
|
|
82
|
+
if (nextState.matchesAttributes(attributes) && nextState.matchesDepth(depth, (_b = currentState == null ? void 0 : currentState.enteredDepth) != null ? _b : 0) && !(nextState.matchCriteria & (TokenSelectState.ETokenMatchCriteria.Text | TokenSelectState.ETokenMatchCriteria.Node))) {
|
|
83
|
+
this.transitionForward(depth);
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
// Transition forward if text content and depth match, and no additional criteria are required
|
|
89
|
+
transitionIfTextMatch(text, depth) {
|
|
90
|
+
var _a;
|
|
91
|
+
const nextState = this.getNextState();
|
|
92
|
+
const currentState = this.getCurrentState();
|
|
93
|
+
if (nextState == null) {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
if (nextState.toCacheNodeProps & TokenSelectState.EToCacheNodeProps.Text) {
|
|
97
|
+
this._cachedNodeProps.text = text;
|
|
98
|
+
}
|
|
99
|
+
if (nextState.matchesText(text) && nextState.matchesDepth(depth, (_a = currentState == null ? void 0 : currentState.enteredDepth) != null ? _a : 0) && !(nextState.matchCriteria & TokenSelectState.ETokenMatchCriteria.Node)) {
|
|
100
|
+
this.transitionForward(depth);
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
transitionForward(depth) {
|
|
106
|
+
const previousState = this.getCurrentState();
|
|
107
|
+
if (previousState != null) {
|
|
108
|
+
previousState.unmatch();
|
|
109
|
+
}
|
|
110
|
+
this._currentState = this._currentState != null ? this._currentState + 1 : 0;
|
|
111
|
+
const currentState = this.getCurrentState();
|
|
112
|
+
if (currentState != null) {
|
|
113
|
+
currentState.match(depth);
|
|
114
|
+
}
|
|
115
|
+
if (this.isFinalState()) {
|
|
116
|
+
this._toRecordTokens = this._cachedTokens;
|
|
117
|
+
}
|
|
118
|
+
this.resetCurrentStateCache();
|
|
119
|
+
}
|
|
120
|
+
transitionBack(depth) {
|
|
121
|
+
const previousState = this.getCurrentState();
|
|
122
|
+
if (previousState != null) {
|
|
123
|
+
previousState.unmatch();
|
|
124
|
+
}
|
|
125
|
+
this._currentState = this._currentState != null ? this._currentState - 1 : 0;
|
|
126
|
+
const currentState = this.getCurrentState();
|
|
127
|
+
if (currentState != null) {
|
|
128
|
+
currentState.match(depth);
|
|
129
|
+
}
|
|
130
|
+
this.resetCurrentStateCache();
|
|
131
|
+
}
|
|
132
|
+
isFinalState() {
|
|
133
|
+
return this._currentState != null && this._currentState >= this._states.length - 1;
|
|
134
|
+
}
|
|
135
|
+
getOffsetToFinal() {
|
|
136
|
+
if (this._currentState == null) {
|
|
137
|
+
return this._states.length;
|
|
138
|
+
}
|
|
139
|
+
return this._states.length - 1 - this._currentState;
|
|
140
|
+
}
|
|
141
|
+
resetCurrentStateCache() {
|
|
142
|
+
this._cachedNodeProps.prefix = null;
|
|
143
|
+
this._cachedNodeProps.local = null;
|
|
144
|
+
this._cachedNodeProps.attributes = null;
|
|
145
|
+
this._cachedNodeProps.text = null;
|
|
146
|
+
this._cachedTokens = [];
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
exports.TokenSelectStateMachine = TokenSelectStateMachine;
|
|
151
|
+
//# 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":["TokenSelectState","EToCacheNodeProps","ETokenMatchCriteria"],"mappings":"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"}
|
|
@@ -1 +1,140 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var TokenSelectState = require('./TokenSelectState.js');
|
|
4
|
+
var TokenSelectStateMachine = require('./TokenSelectStateMachine.js');
|
|
5
|
+
|
|
6
|
+
var __defProp = Object.defineProperty;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
9
|
+
class TokenSelector {
|
|
10
|
+
constructor(tokenSelectPaths) {
|
|
11
|
+
__publicField(this, "_currentDepth", 0);
|
|
12
|
+
__publicField(this, "_tspStateMachines");
|
|
13
|
+
__publicField(this, "_isRecording", false);
|
|
14
|
+
this._tspStateMachines = tokenSelectPaths.map(
|
|
15
|
+
(tokenSelectPath) => new TokenSelectStateMachine.TokenSelectStateMachine(tokenSelectPath)
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
pipeToken(token, recorder) {
|
|
19
|
+
let startRecording = false;
|
|
20
|
+
let stopRecording = false;
|
|
21
|
+
switch (token.type) {
|
|
22
|
+
case "ElementStart":
|
|
23
|
+
startRecording = this.handleElementStart(token);
|
|
24
|
+
break;
|
|
25
|
+
case "Attribute":
|
|
26
|
+
startRecording = this.handleAttribute(token);
|
|
27
|
+
break;
|
|
28
|
+
case "Text":
|
|
29
|
+
startRecording = this.handleText(token);
|
|
30
|
+
break;
|
|
31
|
+
case "ElementEnd": {
|
|
32
|
+
stopRecording = this.handleElementEnd(token);
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (startRecording && !this._isRecording) {
|
|
37
|
+
this._isRecording = true;
|
|
38
|
+
recorder({ type: "SelectionStart" });
|
|
39
|
+
}
|
|
40
|
+
for (const stateMachine of this._tspStateMachines) {
|
|
41
|
+
stateMachine.record(token);
|
|
42
|
+
const recordedTokens = stateMachine.takeRecordedTokens();
|
|
43
|
+
if (recordedTokens != null) {
|
|
44
|
+
recordedTokens.forEach((t) => {
|
|
45
|
+
recorder(t);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (this._isRecording) {
|
|
50
|
+
recorder(token);
|
|
51
|
+
}
|
|
52
|
+
if (stopRecording && this._isRecording) {
|
|
53
|
+
recorder({ type: "SelectionEnd" });
|
|
54
|
+
this._isRecording = false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
handleElementStart(token) {
|
|
58
|
+
this._currentDepth += 1;
|
|
59
|
+
let startRecording = false;
|
|
60
|
+
for (const stateMachine of this._tspStateMachines) {
|
|
61
|
+
stateMachine.resetCurrentStateCache();
|
|
62
|
+
if (stateMachine.isFinalState()) {
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
const nextState = stateMachine.getNextState();
|
|
66
|
+
if (nextState == null || !(nextState.matchCriteria & TokenSelectState.ETokenMatchCriteria.Name)) {
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
const transitioned = stateMachine.transitionIfNameMatch(
|
|
70
|
+
token.local,
|
|
71
|
+
token.prefix,
|
|
72
|
+
this._currentDepth
|
|
73
|
+
);
|
|
74
|
+
if (transitioned && stateMachine.isFinalState()) {
|
|
75
|
+
startRecording = true;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return startRecording;
|
|
79
|
+
}
|
|
80
|
+
handleAttribute(token) {
|
|
81
|
+
let startRecording = false;
|
|
82
|
+
for (const stateMachine of this._tspStateMachines) {
|
|
83
|
+
if (stateMachine.isFinalState()) {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
const nextState = stateMachine.getNextState();
|
|
87
|
+
if (nextState == null || !(nextState.matchCriteria & TokenSelectState.ETokenMatchCriteria.Attributes)) {
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
const transitioned = stateMachine.transitionIfAttributesMatch(
|
|
91
|
+
token.local,
|
|
92
|
+
token.prefix,
|
|
93
|
+
token.value,
|
|
94
|
+
this._currentDepth
|
|
95
|
+
);
|
|
96
|
+
if (transitioned && stateMachine.isFinalState()) {
|
|
97
|
+
startRecording = true;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return startRecording;
|
|
101
|
+
}
|
|
102
|
+
handleText(token) {
|
|
103
|
+
let startRecording = false;
|
|
104
|
+
for (const stateMachine of this._tspStateMachines) {
|
|
105
|
+
if (stateMachine.isFinalState()) {
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
const nextState = stateMachine.getNextState();
|
|
109
|
+
if (nextState == null || !(nextState.matchCriteria & TokenSelectState.ETokenMatchCriteria.Text)) {
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
const transitioned = stateMachine.transitionIfTextMatch(token.text, this._currentDepth);
|
|
113
|
+
if (transitioned && stateMachine.isFinalState()) {
|
|
114
|
+
startRecording = true;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return startRecording;
|
|
118
|
+
}
|
|
119
|
+
handleElementEnd(token) {
|
|
120
|
+
if (token.end.type === "Close" || token.end.type === "Empty") {
|
|
121
|
+
this._currentDepth -= 1;
|
|
122
|
+
let isFinalState = false;
|
|
123
|
+
for (const stateMachine of this._tspStateMachines) {
|
|
124
|
+
const currentState = stateMachine.getCurrentState();
|
|
125
|
+
if (currentState == null) {
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
if (currentState.enteredDepth != null && this._currentDepth < currentState.enteredDepth) {
|
|
129
|
+
stateMachine.transitionBack(this._currentDepth);
|
|
130
|
+
}
|
|
131
|
+
isFinalState = isFinalState || stateMachine.isFinalState();
|
|
132
|
+
}
|
|
133
|
+
return !isFinalState;
|
|
134
|
+
}
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
exports.TokenSelector = TokenSelector;
|
|
140
|
+
//# sourceMappingURL=TokenSelector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TokenSelector.js","sources":["../../../src/selector/TokenSelector.ts"],"sourcesContent":["import {\n\ttype TAttributeToken,\n\ttype TElementEndToken,\n\ttype TElementStartToken,\n\ttype TTextToken,\n\ttype TXmlToken\n} from '../tokenizer';\nimport { ETokenMatchCriteria } from './TokenSelectState';\nimport { TokenSelectStateMachine } from './TokenSelectStateMachine';\nimport { type TSelectedXmlToken, type TTokenSelectPath } from './types';\n\nexport class TokenSelector {\n\tprivate _currentDepth = 0;\n\tprivate _tspStateMachines: TokenSelectStateMachine[];\n\tprivate _isRecording = false;\n\n\tconstructor(tokenSelectPaths: TTokenSelectPath[]) {\n\t\tthis._tspStateMachines = tokenSelectPaths.map(\n\t\t\t(tokenSelectPath) => new TokenSelectStateMachine(tokenSelectPath)\n\t\t);\n\t}\n\n\tpublic pipeToken(token: TXmlToken, recorder: (token: TSelectedXmlToken) => void): void {\n\t\tlet startRecording = false;\n\t\tlet stopRecording = false;\n\t\tswitch (token.type) {\n\t\t\tcase 'ElementStart':\n\t\t\t\tstartRecording = this.handleElementStart(token);\n\t\t\t\tbreak;\n\t\t\tcase 'Attribute':\n\t\t\t\tstartRecording = this.handleAttribute(token);\n\t\t\t\tbreak;\n\t\t\tcase 'Text':\n\t\t\t\tstartRecording = this.handleText(token);\n\t\t\t\tbreak;\n\t\t\tcase 'ElementEnd': {\n\t\t\t\tstopRecording = this.handleElementEnd(token);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t}\n\n\t\tif (startRecording && !this._isRecording) {\n\t\t\tthis._isRecording = true;\n\t\t\trecorder({ type: 'SelectionStart' });\n\t\t}\n\n\t\tfor (const stateMachine of this._tspStateMachines) {\n\t\t\tstateMachine.record(token);\n\t\t\tconst recordedTokens = stateMachine.takeRecordedTokens();\n\t\t\tif (recordedTokens != null) {\n\t\t\t\trecordedTokens.forEach((t) => {\n\t\t\t\t\trecorder(t);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (this._isRecording) {\n\t\t\trecorder(token);\n\t\t}\n\n\t\tif (stopRecording && this._isRecording) {\n\t\t\trecorder({ type: 'SelectionEnd' });\n\t\t\tthis._isRecording = false;\n\t\t}\n\t}\n\n\tprivate handleElementStart(token: TElementStartToken): boolean {\n\t\tthis._currentDepth += 1;\n\n\t\tlet startRecording = false;\n\n\t\tfor (const stateMachine of this._tspStateMachines) {\n\t\t\tstateMachine.resetCurrentStateCache();\n\t\t\tif (stateMachine.isFinalState()) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst nextState = stateMachine.getNextState();\n\t\t\tif (nextState == null || !(nextState.matchCriteria & ETokenMatchCriteria.Name)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst transitioned = stateMachine.transitionIfNameMatch(\n\t\t\t\ttoken.local,\n\t\t\t\ttoken.prefix,\n\t\t\t\tthis._currentDepth\n\t\t\t);\n\t\t\tif (transitioned && stateMachine.isFinalState()) {\n\t\t\t\tstartRecording = true;\n\t\t\t}\n\t\t}\n\n\t\treturn startRecording;\n\t}\n\n\tprivate handleAttribute(token: TAttributeToken): boolean {\n\t\tlet startRecording = false;\n\n\t\tfor (const stateMachine of this._tspStateMachines) {\n\t\t\tif (stateMachine.isFinalState()) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst nextState = stateMachine.getNextState();\n\t\t\tif (nextState == null || !(nextState.matchCriteria & ETokenMatchCriteria.Attributes)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst transitioned = stateMachine.transitionIfAttributesMatch(\n\t\t\t\ttoken.local,\n\t\t\t\ttoken.prefix,\n\t\t\t\ttoken.value,\n\t\t\t\tthis._currentDepth\n\t\t\t);\n\t\t\tif (transitioned && stateMachine.isFinalState()) {\n\t\t\t\tstartRecording = true;\n\t\t\t}\n\t\t}\n\n\t\treturn startRecording;\n\t}\n\n\tprivate handleText(token: TTextToken): boolean {\n\t\tlet startRecording = false;\n\n\t\tfor (const stateMachine of this._tspStateMachines) {\n\t\t\tif (stateMachine.isFinalState()) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst nextState = stateMachine.getNextState();\n\t\t\tif (nextState == null || !(nextState.matchCriteria & ETokenMatchCriteria.Text)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst transitioned = stateMachine.transitionIfTextMatch(token.text, this._currentDepth);\n\t\t\tif (transitioned && stateMachine.isFinalState()) {\n\t\t\t\tstartRecording = true;\n\t\t\t}\n\t\t}\n\n\t\treturn startRecording;\n\t}\n\n\tprivate handleElementEnd(token: TElementEndToken): boolean {\n\t\tif (token.end.type === 'Close' || token.end.type === 'Empty') {\n\t\t\tthis._currentDepth -= 1;\n\n\t\t\t// if (token.end.type === 'Close' && token.end.local === 'head') {\n\t\t\t// \tconsole.log({ token });\n\t\t\t// }\n\n\t\t\tlet isFinalState = false;\n\n\t\t\tfor (const stateMachine of this._tspStateMachines) {\n\t\t\t\tconst currentState = stateMachine.getCurrentState();\n\t\t\t\tif (currentState == null) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (currentState.enteredDepth != null && this._currentDepth < currentState.enteredDepth) {\n\t\t\t\t\tstateMachine.transitionBack(this._currentDepth);\n\t\t\t\t}\n\n\t\t\t\tisFinalState = isFinalState || stateMachine.isFinalState();\n\t\t\t}\n\n\t\t\treturn !isFinalState;\n\t\t}\n\t\treturn false;\n\t}\n}\n"],"names":["TokenSelectStateMachine","ETokenMatchCriteria"],"mappings":"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"}
|