clarity-pattern-parser 11.0.25 → 11.0.27
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/TODO.md +1 -4
- package/dist/index.browser.js +456 -7
- package/dist/index.browser.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.esm.js +455 -8
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +456 -7
- package/dist/index.js.map +1 -1
- package/dist/patterns/Expression.d.ts +1 -0
- package/dist/patterns/Reference.d.ts +2 -1
- package/dist/patterns/Repeat.d.ts +8 -0
- package/dist/query/query.d.ts +27 -0
- package/dist/query/selector.d.ts +21 -0
- package/dist/query/selector_parser.d.ts +1 -0
- package/package.json +1 -1
- package/src/generator/generator.test.ts +24 -0
- package/src/generator/generator.ts +108 -0
- package/src/generator/igenerator.ts +6 -0
- package/src/generator/ivisitor.ts +23 -0
- package/src/generator/typescriptVisitor.ts +158 -0
- package/src/grammar/Grammar.ts +10 -2
- package/src/index.ts +4 -0
- package/src/patterns/Expression.ts +5 -1
- package/src/patterns/Reference.ts +7 -5
- package/src/patterns/Repeat.ts +8 -0
- package/src/query/query.test.ts +34 -0
- package/src/query/query.ts +20 -0
- package/tsconfig.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -23,4 +23,6 @@ import { patterns } from "./grammar/patterns";
|
|
|
23
23
|
import { Context } from "./patterns/Context";
|
|
24
24
|
import { Expression } from "./patterns/Expression";
|
|
25
25
|
import { RightAssociated } from "./patterns/RightAssociated";
|
|
26
|
-
|
|
26
|
+
import { Selector } from "./query/selector";
|
|
27
|
+
import { Query } from "./query/query";
|
|
28
|
+
export { Node, Grammar, AutoComplete, AutoCompleteOptions, Suggestion, SuggestionOption, Sequence, Cursor, CursorHistory, Match, Context, Expression, Literal, Not, Options, Optional, ParseError, ParseResult, Pattern, Reference, RightAssociated, Regex, Repeat, Query, Selector, grammar, patterns, compact, remove };
|
package/dist/index.esm.js
CHANGED
|
@@ -846,10 +846,11 @@ class Reference {
|
|
|
846
846
|
get startedOnIndex() {
|
|
847
847
|
return this._firstIndex;
|
|
848
848
|
}
|
|
849
|
-
constructor(name) {
|
|
849
|
+
constructor(name, referencePatternName) {
|
|
850
850
|
this._id = `reference-${idIndex$7++}`;
|
|
851
851
|
this._type = "reference";
|
|
852
852
|
this._name = name;
|
|
853
|
+
this._referencePatternName = referencePatternName || name;
|
|
853
854
|
this._parent = null;
|
|
854
855
|
this._pattern = null;
|
|
855
856
|
this._cachedPattern = null;
|
|
@@ -908,7 +909,7 @@ class Reference {
|
|
|
908
909
|
pattern = this._cachedPattern;
|
|
909
910
|
}
|
|
910
911
|
if (pattern === null) {
|
|
911
|
-
throw new Error(`Couldn't find '${this.
|
|
912
|
+
throw new Error(`Couldn't find '${this._referencePatternName}' pattern within tree.`);
|
|
912
913
|
}
|
|
913
914
|
const clonedPattern = pattern.clone();
|
|
914
915
|
clonedPattern.parent = this;
|
|
@@ -924,7 +925,7 @@ class Reference {
|
|
|
924
925
|
pattern = pattern.parent;
|
|
925
926
|
continue;
|
|
926
927
|
}
|
|
927
|
-
const foundPattern = pattern.getPatternWithinContext(this.
|
|
928
|
+
const foundPattern = pattern.getPatternWithinContext(this._referencePatternName);
|
|
928
929
|
if (foundPattern != null && this._isValidPattern(foundPattern)) {
|
|
929
930
|
return foundPattern;
|
|
930
931
|
}
|
|
@@ -932,7 +933,7 @@ class Reference {
|
|
|
932
933
|
}
|
|
933
934
|
const root = this._getRoot();
|
|
934
935
|
return findPattern(root, (pattern) => {
|
|
935
|
-
return pattern.name === this.
|
|
936
|
+
return pattern.name === this._referencePatternName && this._isValidPattern(pattern);
|
|
936
937
|
});
|
|
937
938
|
}
|
|
938
939
|
_isValidPattern(pattern) {
|
|
@@ -991,7 +992,7 @@ class Reference {
|
|
|
991
992
|
return null;
|
|
992
993
|
}
|
|
993
994
|
clone(name = this._name) {
|
|
994
|
-
const clone = new Reference(name);
|
|
995
|
+
const clone = new Reference(name, this._referencePatternName);
|
|
995
996
|
clone._id = this._id;
|
|
996
997
|
// Optimize future clones, by caching the pattern we already found.
|
|
997
998
|
if (this._pattern != null) {
|
|
@@ -1613,6 +1614,12 @@ class Repeat {
|
|
|
1613
1614
|
get startedOnIndex() {
|
|
1614
1615
|
return this._repeatPattern.startedOnIndex;
|
|
1615
1616
|
}
|
|
1617
|
+
get pattern() {
|
|
1618
|
+
return this._pattern;
|
|
1619
|
+
}
|
|
1620
|
+
get options() {
|
|
1621
|
+
return this._options;
|
|
1622
|
+
}
|
|
1616
1623
|
constructor(name, pattern, options = {}) {
|
|
1617
1624
|
this._id = `repeat-${idIndex$3++}`;
|
|
1618
1625
|
this._pattern = pattern;
|
|
@@ -2674,6 +2681,9 @@ class Expression {
|
|
|
2674
2681
|
get binaryPatterns() {
|
|
2675
2682
|
return this._binaryPatterns;
|
|
2676
2683
|
}
|
|
2684
|
+
get originalPatterns() {
|
|
2685
|
+
return this._originalPatterns;
|
|
2686
|
+
}
|
|
2677
2687
|
get startedOnIndex() {
|
|
2678
2688
|
return this._firstIndex;
|
|
2679
2689
|
}
|
|
@@ -3582,8 +3592,16 @@ class Grammar {
|
|
|
3582
3592
|
const aliasNode = statementNode.find(n => n.name === "alias-literal");
|
|
3583
3593
|
const aliasName = aliasNode.value;
|
|
3584
3594
|
const name = nameNode.value;
|
|
3585
|
-
const
|
|
3586
|
-
|
|
3595
|
+
const aliasPattern = this._getPattern(aliasName);
|
|
3596
|
+
// This solves the problem for an alias pointing to a reference.
|
|
3597
|
+
if (aliasPattern.type === "reference") {
|
|
3598
|
+
const reference = new Reference(name, aliasName);
|
|
3599
|
+
this._parseContext.patternsByName.set(name, reference);
|
|
3600
|
+
}
|
|
3601
|
+
else {
|
|
3602
|
+
const alias = aliasPattern.clone(name);
|
|
3603
|
+
this._parseContext.patternsByName.set(name, alias);
|
|
3604
|
+
}
|
|
3587
3605
|
}
|
|
3588
3606
|
static parse(expression, options) {
|
|
3589
3607
|
const grammar = new Grammar(options);
|
|
@@ -3846,5 +3864,434 @@ function patterns(strings, ...values) {
|
|
|
3846
3864
|
return result;
|
|
3847
3865
|
}
|
|
3848
3866
|
|
|
3849
|
-
|
|
3867
|
+
const { expression } = patterns `
|
|
3868
|
+
number = /[+-]?(\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?/
|
|
3869
|
+
spaces = /\\s+/
|
|
3870
|
+
single-quote-string-literal = /'(?:\\\\.|[^'\\\\])*'/
|
|
3871
|
+
name = /[a-zA-Z_-]+[a-zA-Z0-9_-]*/
|
|
3872
|
+
comma = /\\s*,\\s*/
|
|
3873
|
+
wild-card = "*"
|
|
3874
|
+
equal = "="
|
|
3875
|
+
not-equal = "!="
|
|
3876
|
+
starts-with = "^="
|
|
3877
|
+
ends-with = "$="
|
|
3878
|
+
contains = "*="
|
|
3879
|
+
greater-than-or-equal = ">="
|
|
3880
|
+
less-than-or-equal = "<="
|
|
3881
|
+
greater-than = ">"
|
|
3882
|
+
less-than = "<"
|
|
3883
|
+
operators = equal |
|
|
3884
|
+
not-equal |
|
|
3885
|
+
starts-with |
|
|
3886
|
+
ends-with |
|
|
3887
|
+
contains |
|
|
3888
|
+
greater-than-or-equal |
|
|
3889
|
+
less-than-or-equal |
|
|
3890
|
+
greater-than |
|
|
3891
|
+
less-than
|
|
3892
|
+
|
|
3893
|
+
attribute-name = name
|
|
3894
|
+
value = name
|
|
3895
|
+
attribute-value = single-quote-string-literal | number | value
|
|
3896
|
+
attribute-selector = "[" + spaces? + attribute-name + spaces? + operators + spaces? + attribute-value + "]"
|
|
3897
|
+
|
|
3898
|
+
adjacent = spaces? + "+" + spaces?
|
|
3899
|
+
after = spaces? + "~" + spaces?
|
|
3900
|
+
direct-child = spaces? + ">" + spaces?
|
|
3901
|
+
descendant = spaces
|
|
3902
|
+
|
|
3903
|
+
combinators = adjacent | after | direct-child | descendant
|
|
3904
|
+
name-selector = name-selector-expression + attribute-selector
|
|
3905
|
+
name-selector-expression = name-selector | name
|
|
3906
|
+
node-selector = wild-card | attribute-selector | name-selector-expression
|
|
3907
|
+
or-selector = (node-selector, comma){2}
|
|
3908
|
+
|
|
3909
|
+
selector-expression = expression + combinators + expression
|
|
3910
|
+
expression = selector-expression | or-selector | node-selector
|
|
3911
|
+
`;
|
|
3912
|
+
const selectorParser = expression;
|
|
3913
|
+
|
|
3914
|
+
const combinatorMap = {
|
|
3915
|
+
"adjacent": true,
|
|
3916
|
+
"after": true,
|
|
3917
|
+
"descendant": true,
|
|
3918
|
+
"direct-child": true
|
|
3919
|
+
};
|
|
3920
|
+
const operatorMap = {
|
|
3921
|
+
"equal": true,
|
|
3922
|
+
"not-equal": true,
|
|
3923
|
+
"starts-with": true,
|
|
3924
|
+
"ends-with": true,
|
|
3925
|
+
"contains": true,
|
|
3926
|
+
"greater-than-or-equal": true,
|
|
3927
|
+
"less-than-or-equal": true,
|
|
3928
|
+
"greater-than": true,
|
|
3929
|
+
"less-than": true
|
|
3930
|
+
};
|
|
3931
|
+
class Selector {
|
|
3932
|
+
constructor(selector) {
|
|
3933
|
+
this._selectedNodes = [];
|
|
3934
|
+
this._combinator = null;
|
|
3935
|
+
const result = selectorParser.exec(selector);
|
|
3936
|
+
if (result.ast == null) {
|
|
3937
|
+
const message = generateErrorMessage(selectorParser, result.cursor);
|
|
3938
|
+
throw new Error(`[Invalid Selector] ${message}`);
|
|
3939
|
+
}
|
|
3940
|
+
this._selectorAst = result.ast;
|
|
3941
|
+
}
|
|
3942
|
+
find(nodes) {
|
|
3943
|
+
this._selectedNodes = nodes;
|
|
3944
|
+
const ast = this._selectorAst;
|
|
3945
|
+
ast.walkUp((node) => {
|
|
3946
|
+
this._process(node);
|
|
3947
|
+
});
|
|
3948
|
+
return this._selectedNodes;
|
|
3949
|
+
}
|
|
3950
|
+
filter(nodes) {
|
|
3951
|
+
if (nodes.length < 1) {
|
|
3952
|
+
return [];
|
|
3953
|
+
}
|
|
3954
|
+
const nodeMap = new Map();
|
|
3955
|
+
nodes.forEach(n => nodeMap.set(n, n));
|
|
3956
|
+
this._selectedNodes = [nodes[0].findRoot()];
|
|
3957
|
+
const ast = this._selectorAst;
|
|
3958
|
+
ast.walkUp((node) => {
|
|
3959
|
+
this._process(node);
|
|
3960
|
+
});
|
|
3961
|
+
return this._selectedNodes.filter(n => nodeMap.has(n));
|
|
3962
|
+
}
|
|
3963
|
+
not(nodes) {
|
|
3964
|
+
if (nodes.length < 1) {
|
|
3965
|
+
return [];
|
|
3966
|
+
}
|
|
3967
|
+
this._selectedNodes = [nodes[0].findRoot()];
|
|
3968
|
+
const ast = this._selectorAst;
|
|
3969
|
+
ast.walkUp((node) => {
|
|
3970
|
+
this._process(node);
|
|
3971
|
+
});
|
|
3972
|
+
const selectedNodeMap = new Map();
|
|
3973
|
+
this._selectedNodes.forEach(n => selectedNodeMap.set(n, n));
|
|
3974
|
+
return nodes.filter(n => !selectedNodeMap.has(n));
|
|
3975
|
+
}
|
|
3976
|
+
parents(nodes) {
|
|
3977
|
+
if (nodes.length < 1) {
|
|
3978
|
+
return [];
|
|
3979
|
+
}
|
|
3980
|
+
this._selectedNodes = [nodes[0].findRoot()];
|
|
3981
|
+
const ast = this._selectorAst;
|
|
3982
|
+
ast.walkUp((node) => {
|
|
3983
|
+
this._process(node);
|
|
3984
|
+
});
|
|
3985
|
+
const result = new Set();
|
|
3986
|
+
const ancestorMap = new Map();
|
|
3987
|
+
this._selectedNodes.forEach(n => ancestorMap.set(n, true));
|
|
3988
|
+
nodes.forEach(n => {
|
|
3989
|
+
const ancestor = n.findAncestor(a => ancestorMap.has(a));
|
|
3990
|
+
if (ancestor != null) {
|
|
3991
|
+
result.add(ancestor);
|
|
3992
|
+
}
|
|
3993
|
+
});
|
|
3994
|
+
return Array.from(result);
|
|
3995
|
+
}
|
|
3996
|
+
_process(ast) {
|
|
3997
|
+
const nodeName = ast.name;
|
|
3998
|
+
if (nodeName === "wild-card") {
|
|
3999
|
+
this._selectedNodes = this._processWildCard();
|
|
4000
|
+
}
|
|
4001
|
+
else if (nodeName === "or-selector") {
|
|
4002
|
+
this._selectedNodes = this._processOrSelector(ast);
|
|
4003
|
+
}
|
|
4004
|
+
else if (nodeName === "name-selector" || (nodeName === "name" && (ast.parent == null || ast.parent.name === "selector-expression"))) {
|
|
4005
|
+
this._selectedNodes = this._processNameSelector(ast);
|
|
4006
|
+
}
|
|
4007
|
+
else if (nodeName === "attribute-selector" && (ast.parent == null || ast.parent.name === "selector-expression")) {
|
|
4008
|
+
this._selectedNodes = this._processAttributeSelector(ast);
|
|
4009
|
+
}
|
|
4010
|
+
else if (combinatorMap[nodeName]) {
|
|
4011
|
+
this._combinator = nodeName;
|
|
4012
|
+
}
|
|
4013
|
+
else if (nodeName === "selector-expression") {
|
|
4014
|
+
this._combinator = null;
|
|
4015
|
+
}
|
|
4016
|
+
}
|
|
4017
|
+
_processWildCard() {
|
|
4018
|
+
return this._selectedNodes.map(n => {
|
|
4019
|
+
return this._selectWithCombinator(n, () => true);
|
|
4020
|
+
}).flat();
|
|
4021
|
+
}
|
|
4022
|
+
_processOrSelector(ast) {
|
|
4023
|
+
const selectorNodes = ast.children.filter(n => n.name !== "comma");
|
|
4024
|
+
const set = new Set();
|
|
4025
|
+
const selectors = selectorNodes.map(n => new Selector(n.toString()));
|
|
4026
|
+
selectors.map(s => {
|
|
4027
|
+
return s.find(this._selectedNodes.slice());
|
|
4028
|
+
}).flat().forEach((node) => {
|
|
4029
|
+
set.add(node);
|
|
4030
|
+
});
|
|
4031
|
+
return Array.from(set);
|
|
4032
|
+
}
|
|
4033
|
+
_processNameSelector(ast) {
|
|
4034
|
+
if (ast.children.length > 1) {
|
|
4035
|
+
return this._selectedNodes.map(n => {
|
|
4036
|
+
const name = ast.children[0].value;
|
|
4037
|
+
return this._selectWithCombinator(n, (node) => {
|
|
4038
|
+
return node.name === name && this._isAttributeMatch(node, ast);
|
|
4039
|
+
});
|
|
4040
|
+
}).flat();
|
|
4041
|
+
}
|
|
4042
|
+
else {
|
|
4043
|
+
return this._selectedNodes.map(n => {
|
|
4044
|
+
return this._selectWithCombinator(n, (node) => node.name === ast.value);
|
|
4045
|
+
}).flat();
|
|
4046
|
+
}
|
|
4047
|
+
}
|
|
4048
|
+
_processAttributeSelector(ast) {
|
|
4049
|
+
return this._selectedNodes.map(n => {
|
|
4050
|
+
return this._selectWithCombinator(n, (node) => {
|
|
4051
|
+
return this._isAttributeMatch(node, ast);
|
|
4052
|
+
});
|
|
4053
|
+
}).flat();
|
|
4054
|
+
}
|
|
4055
|
+
_selectWithCombinator(node, predicate) {
|
|
4056
|
+
if (this._combinator === "adjacent") {
|
|
4057
|
+
const sibling = node.nextSibling();
|
|
4058
|
+
if (sibling == null) {
|
|
4059
|
+
return [];
|
|
4060
|
+
}
|
|
4061
|
+
if (predicate(sibling)) {
|
|
4062
|
+
return [sibling];
|
|
4063
|
+
}
|
|
4064
|
+
else {
|
|
4065
|
+
return [];
|
|
4066
|
+
}
|
|
4067
|
+
}
|
|
4068
|
+
else if (this._combinator === "after") {
|
|
4069
|
+
const parent = node.parent;
|
|
4070
|
+
if (parent == null) {
|
|
4071
|
+
return [];
|
|
4072
|
+
}
|
|
4073
|
+
const index = parent.findChildIndex(node);
|
|
4074
|
+
const after = parent.children.slice(index + 1);
|
|
4075
|
+
return after.filter(predicate);
|
|
4076
|
+
}
|
|
4077
|
+
else if (this._combinator === "direct-child") {
|
|
4078
|
+
return node.children.filter(predicate);
|
|
4079
|
+
}
|
|
4080
|
+
else if (this._combinator === "descendant" || this._combinator == null) {
|
|
4081
|
+
return node.findAll(predicate);
|
|
4082
|
+
}
|
|
4083
|
+
else {
|
|
4084
|
+
return [];
|
|
4085
|
+
}
|
|
4086
|
+
}
|
|
4087
|
+
_isAttributeMatch(node, ast) {
|
|
4088
|
+
const name = this._getAttributeName(ast);
|
|
4089
|
+
const operator = this._getAttributeOperator(ast);
|
|
4090
|
+
const value = this._getAttributeValue(ast);
|
|
4091
|
+
const anyNode = node;
|
|
4092
|
+
if (anyNode[name] == null) {
|
|
4093
|
+
return false;
|
|
4094
|
+
}
|
|
4095
|
+
if (operator === "equal") {
|
|
4096
|
+
return anyNode[name] === value;
|
|
4097
|
+
}
|
|
4098
|
+
else if (operator === "not-equal") {
|
|
4099
|
+
return anyNode[name] !== value;
|
|
4100
|
+
}
|
|
4101
|
+
else if (operator === "starts-with") {
|
|
4102
|
+
return anyNode[name].toString().startsWith(value);
|
|
4103
|
+
}
|
|
4104
|
+
else if (operator === "ends-with") {
|
|
4105
|
+
return anyNode[name].toString().endsWith(value);
|
|
4106
|
+
}
|
|
4107
|
+
else if (operator === "contains") {
|
|
4108
|
+
return anyNode[name].toString().includes(value);
|
|
4109
|
+
}
|
|
4110
|
+
else if (operator === "greater-than-or-equal") {
|
|
4111
|
+
return anyNode[name] >= value;
|
|
4112
|
+
}
|
|
4113
|
+
else if (operator === "less-than-or-equal") {
|
|
4114
|
+
return anyNode[name] <= value;
|
|
4115
|
+
}
|
|
4116
|
+
else if (operator === "greater-than") {
|
|
4117
|
+
return anyNode[name] > value;
|
|
4118
|
+
}
|
|
4119
|
+
else if (operator === "less-than") {
|
|
4120
|
+
return anyNode[name] < value;
|
|
4121
|
+
}
|
|
4122
|
+
return false;
|
|
4123
|
+
}
|
|
4124
|
+
_getAttributeName(ast) {
|
|
4125
|
+
return ast.find(n => n.name === "attribute-name").value;
|
|
4126
|
+
}
|
|
4127
|
+
_getAttributeValue(ast) {
|
|
4128
|
+
let valueNode = ast.find(n => n.name === "single-quote-string-literal");
|
|
4129
|
+
if (valueNode != null) {
|
|
4130
|
+
return valueNode.value.slice(1, -1);
|
|
4131
|
+
}
|
|
4132
|
+
else {
|
|
4133
|
+
valueNode = ast.find(n => n.name === "value");
|
|
4134
|
+
}
|
|
4135
|
+
if (valueNode != null) {
|
|
4136
|
+
return valueNode.value;
|
|
4137
|
+
}
|
|
4138
|
+
else {
|
|
4139
|
+
valueNode = ast.find(n => n.name === "number");
|
|
4140
|
+
}
|
|
4141
|
+
return valueNode.value;
|
|
4142
|
+
}
|
|
4143
|
+
_getAttributeOperator(ast) {
|
|
4144
|
+
return ast.find(n => operatorMap[n.name]).name;
|
|
4145
|
+
}
|
|
4146
|
+
}
|
|
4147
|
+
|
|
4148
|
+
class Query {
|
|
4149
|
+
constructor(context, prevQuery = null) {
|
|
4150
|
+
this._context = context;
|
|
4151
|
+
this._prevQuery = prevQuery;
|
|
4152
|
+
}
|
|
4153
|
+
toArray() {
|
|
4154
|
+
return this._context.slice();
|
|
4155
|
+
}
|
|
4156
|
+
// Modifiers
|
|
4157
|
+
append(visitor) {
|
|
4158
|
+
this._context.forEach(n => {
|
|
4159
|
+
const parent = n.parent;
|
|
4160
|
+
if (parent == null) {
|
|
4161
|
+
return;
|
|
4162
|
+
}
|
|
4163
|
+
const newNode = visitor(n);
|
|
4164
|
+
n.appendChild(newNode);
|
|
4165
|
+
});
|
|
4166
|
+
return this;
|
|
4167
|
+
}
|
|
4168
|
+
prepend(visitor) {
|
|
4169
|
+
this._context.forEach(n => {
|
|
4170
|
+
const parent = n.parent;
|
|
4171
|
+
if (parent == null) {
|
|
4172
|
+
return;
|
|
4173
|
+
}
|
|
4174
|
+
const newNode = visitor(n);
|
|
4175
|
+
n.insertBefore(newNode, n.children[0]);
|
|
4176
|
+
});
|
|
4177
|
+
return this;
|
|
4178
|
+
}
|
|
4179
|
+
after(visitor) {
|
|
4180
|
+
this._context.forEach(n => {
|
|
4181
|
+
const parent = n.parent;
|
|
4182
|
+
if (parent == null) {
|
|
4183
|
+
return;
|
|
4184
|
+
}
|
|
4185
|
+
const index = parent.findChildIndex(n);
|
|
4186
|
+
const newNode = visitor(n);
|
|
4187
|
+
parent.spliceChildren(index + 1, 0, newNode);
|
|
4188
|
+
});
|
|
4189
|
+
return this;
|
|
4190
|
+
}
|
|
4191
|
+
before(visitor) {
|
|
4192
|
+
this._context.forEach(n => {
|
|
4193
|
+
const parent = n.parent;
|
|
4194
|
+
if (parent == null) {
|
|
4195
|
+
return;
|
|
4196
|
+
}
|
|
4197
|
+
const index = parent.findChildIndex(n);
|
|
4198
|
+
const newNode = visitor(n);
|
|
4199
|
+
parent.spliceChildren(index, 0, newNode);
|
|
4200
|
+
});
|
|
4201
|
+
return this;
|
|
4202
|
+
}
|
|
4203
|
+
replaceWith(visitor) {
|
|
4204
|
+
this._context.forEach(n => {
|
|
4205
|
+
const newNode = visitor(n);
|
|
4206
|
+
n.replaceWith(newNode);
|
|
4207
|
+
});
|
|
4208
|
+
return this;
|
|
4209
|
+
}
|
|
4210
|
+
compact() {
|
|
4211
|
+
this._context.forEach(n => {
|
|
4212
|
+
n.compact();
|
|
4213
|
+
});
|
|
4214
|
+
return this;
|
|
4215
|
+
}
|
|
4216
|
+
setValue(value) {
|
|
4217
|
+
this.replaceWith((n) => {
|
|
4218
|
+
return Node.createValueNode(n.type, n.name, value);
|
|
4219
|
+
});
|
|
4220
|
+
return this;
|
|
4221
|
+
}
|
|
4222
|
+
normalize() {
|
|
4223
|
+
const first = this._context[0];
|
|
4224
|
+
if (first != null) {
|
|
4225
|
+
first.findRoot().normalize();
|
|
4226
|
+
}
|
|
4227
|
+
}
|
|
4228
|
+
remove() {
|
|
4229
|
+
this._context.forEach(n => {
|
|
4230
|
+
n.remove();
|
|
4231
|
+
});
|
|
4232
|
+
return this;
|
|
4233
|
+
}
|
|
4234
|
+
// Filters from the currently matched nodes
|
|
4235
|
+
slice(start, end) {
|
|
4236
|
+
return new Query(this._context.slice(start, end));
|
|
4237
|
+
}
|
|
4238
|
+
filter(selectorString) {
|
|
4239
|
+
const selector = new Selector(selectorString);
|
|
4240
|
+
const newContext = selector.filter(this._context);
|
|
4241
|
+
return new Query(newContext, this);
|
|
4242
|
+
}
|
|
4243
|
+
// Selects out of all descedants of currently matched nodes
|
|
4244
|
+
find(selectorString) {
|
|
4245
|
+
const selector = new Selector(selectorString);
|
|
4246
|
+
const newContext = selector.find(this._context);
|
|
4247
|
+
return new Query(newContext, this);
|
|
4248
|
+
}
|
|
4249
|
+
// Remove nodes from the set of matched nodes.
|
|
4250
|
+
not(selectorString) {
|
|
4251
|
+
const selector = new Selector(selectorString);
|
|
4252
|
+
const newContext = selector.not(this._context);
|
|
4253
|
+
return new Query(newContext, this);
|
|
4254
|
+
}
|
|
4255
|
+
// Select the parent of currently matched nodes
|
|
4256
|
+
parent() {
|
|
4257
|
+
const parents = this._context.map(n => n.parent);
|
|
4258
|
+
const result = new Set();
|
|
4259
|
+
parents.forEach((n) => {
|
|
4260
|
+
if (n != null) {
|
|
4261
|
+
result.add(n);
|
|
4262
|
+
}
|
|
4263
|
+
});
|
|
4264
|
+
return new Query(Array.from(result), this);
|
|
4265
|
+
}
|
|
4266
|
+
// Select the ancestors of currently matched nodes
|
|
4267
|
+
parents(selectorString) {
|
|
4268
|
+
const selector = new Selector(selectorString);
|
|
4269
|
+
const newContext = selector.parents(this._context);
|
|
4270
|
+
const result = new Set();
|
|
4271
|
+
newContext.forEach((n) => {
|
|
4272
|
+
if (n != null) {
|
|
4273
|
+
result.add(n);
|
|
4274
|
+
}
|
|
4275
|
+
});
|
|
4276
|
+
return new Query(Array.from(result), this);
|
|
4277
|
+
}
|
|
4278
|
+
first() {
|
|
4279
|
+
return new Query(this._context.slice(0, 1), this);
|
|
4280
|
+
}
|
|
4281
|
+
last() {
|
|
4282
|
+
return new Query(this._context.slice(-1), this);
|
|
4283
|
+
}
|
|
4284
|
+
// Pop query stack
|
|
4285
|
+
end() {
|
|
4286
|
+
if (this._prevQuery) {
|
|
4287
|
+
return this._prevQuery;
|
|
4288
|
+
}
|
|
4289
|
+
return this;
|
|
4290
|
+
}
|
|
4291
|
+
length() {
|
|
4292
|
+
return this._context.length;
|
|
4293
|
+
}
|
|
4294
|
+
}
|
|
4295
|
+
|
|
4296
|
+
export { AutoComplete, Context, Cursor, CursorHistory, Expression, Grammar, Literal, Node, Not, Optional, Options, ParseError, Query, Reference, Regex, Repeat, RightAssociated, Selector, Sequence, compact, grammar, patterns, remove };
|
|
3850
4297
|
//# sourceMappingURL=index.esm.js.map
|