@blackglory/match 0.3.6 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +86 -36
- package/lib/index.d.ts +17 -17
- package/lib/index.js +17 -37
- package/lib/index.js.map +1 -1
- package/lib/match-element.d.ts +3 -4
- package/lib/match-element.js +9 -11
- package/lib/match-element.js.map +1 -1
- package/lib/match.d.ts +3 -4
- package/lib/match.js +9 -11
- package/lib/match.js.map +1 -1
- package/lib/matchers/any-of.d.ts +1 -1
- package/lib/matchers/any-of.js +1 -5
- package/lib/matchers/any-of.js.map +1 -1
- package/lib/matchers/child-nodes.d.ts +1 -1
- package/lib/matchers/child-nodes.js +10 -12
- package/lib/matchers/child-nodes.js.map +1 -1
- package/lib/matchers/children.d.ts +1 -1
- package/lib/matchers/children.js +10 -12
- package/lib/matchers/children.js.map +1 -1
- package/lib/matchers/css.d.ts +1 -1
- package/lib/matchers/css.js +5 -9
- package/lib/matchers/css.js.map +1 -1
- package/lib/matchers/element.d.ts +1 -1
- package/lib/matchers/element.js +11 -15
- package/lib/matchers/element.js.map +1 -1
- package/lib/matchers/multiple.d.ts +1 -1
- package/lib/matchers/multiple.js +14 -17
- package/lib/matchers/multiple.js.map +1 -1
- package/lib/matchers/node.d.ts +1 -1
- package/lib/matchers/node.js +9 -13
- package/lib/matchers/node.js.map +1 -1
- package/lib/matchers/optional.d.ts +1 -1
- package/lib/matchers/optional.js +3 -7
- package/lib/matchers/optional.js.map +1 -1
- package/lib/matchers/repeat.d.ts +1 -1
- package/lib/matchers/repeat.js +6 -10
- package/lib/matchers/repeat.js.map +1 -1
- package/lib/matchers/tap.d.ts +1 -1
- package/lib/matchers/tap.js +1 -5
- package/lib/matchers/tap.js.map +1 -1
- package/lib/matchers/text-content-equals.d.ts +1 -1
- package/lib/matchers/text-content-equals.js +3 -7
- package/lib/matchers/text-content-equals.js.map +1 -1
- package/lib/matchers/text-content-includes.d.ts +1 -1
- package/lib/matchers/text-content-includes.js +3 -7
- package/lib/matchers/text-content-includes.js.map +1 -1
- package/lib/matchers/text-content-matches.d.ts +1 -1
- package/lib/matchers/text-content-matches.js +3 -7
- package/lib/matchers/text-content-matches.js.map +1 -1
- package/lib/matchers/text-node.d.ts +1 -1
- package/lib/matchers/text-node.js +10 -14
- package/lib/matchers/text-node.js.map +1 -1
- package/lib/matchers/xpath.d.ts +1 -1
- package/lib/matchers/xpath.js +8 -12
- package/lib/matchers/xpath.js.map +1 -1
- package/lib/types.d.ts +7 -6
- package/lib/types.js +1 -2
- package/lib/utils/match-multiple.d.ts +4 -1
- package/lib/utils/match-multiple.js +6 -7
- package/lib/utils/match-multiple.js.map +1 -1
- package/lib/utils/match-one-by-one.d.ts +1 -1
- package/lib/utils/match-one-by-one.js +10 -10
- package/lib/utils/match-one-by-one.js.map +1 -1
- package/lib/utils/merge-in-place.d.ts +2 -5
- package/lib/utils/merge-in-place.js +5 -9
- package/lib/utils/merge-in-place.js.map +1 -1
- package/lib/utils/next-element-sibling.js +2 -6
- package/lib/utils/next-element-sibling.js.map +1 -1
- package/lib/utils/next-sibling.js +2 -6
- package/lib/utils/next-sibling.js.map +1 -1
- package/package.json +30 -29
- package/src/index.ts +17 -17
- package/src/match-element.ts +9 -5
- package/src/match.ts +9 -5
- package/src/matchers/any-of.ts +1 -1
- package/src/matchers/child-nodes.ts +6 -5
- package/src/matchers/children.ts +6 -5
- package/src/matchers/css.ts +4 -4
- package/src/matchers/element.ts +42 -17
- package/src/matchers/multiple.ts +3 -3
- package/src/matchers/node.ts +35 -13
- package/src/matchers/optional.ts +5 -3
- package/src/matchers/repeat.ts +3 -3
- package/src/matchers/tap.ts +1 -1
- package/src/matchers/text-content-equals.ts +2 -2
- package/src/matchers/text-content-includes.ts +2 -2
- package/src/matchers/text-content-matches.ts +2 -2
- package/src/matchers/text-node.ts +13 -9
- package/src/matchers/xpath.ts +10 -10
- package/src/types.ts +7 -4
- package/src/utils/match-multiple.ts +1 -1
- package/src/utils/match-one-by-one.ts +3 -3
- package/src/utils/merge-in-place.ts +3 -3
- package/lib/utils/concat.d.ts +0 -1
- package/lib/utils/concat.js +0 -14
- package/lib/utils/concat.js.map +0 -1
- package/src/utils/concat.ts +0 -9
package/lib/matchers/css.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"css.js","sourceRoot":"","sources":["../../src/matchers/css.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"css.js","sourceRoot":"","sources":["../../src/matchers/css.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAEnC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAO9C,MAAM,UAAU,GAAG,CAAC,GAAG,IAE+B;IAEpD,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAA;QAEvB,OAAO,CAAC,OAAgB,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IACxD,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,GAAG,IAAI,CAAA;QACjC,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,CAAA;QAE3C,OAAO,GAAG,CAAC,QAAQ,CAAC,CAAA;IACtB,CAAC;AACH,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { INestedMatcher, ITerminalMatcher } from
|
|
1
|
+
import { INestedMatcher, ITerminalMatcher } from "../types.js";
|
|
2
2
|
export declare function element(strings: TemplateStringsArray, ...values: string[]): (...matchers: Array<INestedMatcher<Element> | ITerminalMatcher<Element>>) => INestedMatcher<Node>;
|
|
3
3
|
export declare function element(name: string, ...matchers: Array<INestedMatcher<Element>>): INestedMatcher<Node>;
|
|
4
4
|
export declare function element(...matchers: Array<INestedMatcher<Element>>): INestedMatcher<Node>;
|
package/lib/matchers/element.js
CHANGED
|
@@ -1,34 +1,30 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const merge_in_place_1 = require("../utils/merge-in-place");
|
|
8
|
-
function element(...args) {
|
|
9
|
-
if ((0, types_1.isArray)(args[0])) {
|
|
1
|
+
import { isntElement } from 'extra-dom';
|
|
2
|
+
import { isArray, isEmptyArray, isString } from '@blackglory/prelude';
|
|
3
|
+
import { concat } from 'extra-tags';
|
|
4
|
+
import { mergeInPlace } from "../utils/merge-in-place.js";
|
|
5
|
+
export function element(...args) {
|
|
6
|
+
if (isArray(args[0])) {
|
|
10
7
|
const [strings, ...values] = args;
|
|
11
|
-
const name =
|
|
8
|
+
const name = concat(strings, ...values);
|
|
12
9
|
return (...matchers) => element(name, ...matchers);
|
|
13
10
|
}
|
|
14
|
-
if (
|
|
11
|
+
if (isString(args[0])) {
|
|
15
12
|
const [name, ...matchers] = args;
|
|
16
13
|
return function (_element) {
|
|
17
14
|
const result = element(...matchers).call(this, _element);
|
|
18
15
|
if (result) {
|
|
19
|
-
|
|
16
|
+
mergeInPlace(this.collection, { [name]: _element });
|
|
20
17
|
}
|
|
21
18
|
return result;
|
|
22
19
|
};
|
|
23
20
|
}
|
|
24
21
|
const [...matchers] = args;
|
|
25
22
|
return function (element) {
|
|
26
|
-
if (
|
|
23
|
+
if (isntElement(element))
|
|
27
24
|
return false;
|
|
28
|
-
if (matchers
|
|
25
|
+
if (isEmptyArray(matchers))
|
|
29
26
|
return true;
|
|
30
27
|
return matchers.every(match => match.call(this, element));
|
|
31
28
|
};
|
|
32
29
|
}
|
|
33
|
-
exports.element = element;
|
|
34
30
|
//# sourceMappingURL=element.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"element.js","sourceRoot":"","sources":["../../src/matchers/element.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"element.js","sourceRoot":"","sources":["../../src/matchers/element.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAEvC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AACrE,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AACnC,OAAO,EAAE,YAAY,EAAE,mCAAgC;AAkBvD,MAAM,UAAU,OAAO,CAAC,GAAG,IAGgD;IAEzE,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACrB,MAAM,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,GAAG,IAG5B,CAAA;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,CAAA;QAEvC,OAAO,CACL,GAAG,QAGF,EACD,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAC,CAAA;IACjC,CAAC;IAED,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAC,GAAG,IAM3B,CAAA;QAED,OAAO,UAAkC,QAAiB;YACxD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;YACxD,IAAI,MAAM,EAAE,CAAC;gBACX,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAA;YACrD,CAAC;YACD,OAAO,MAAM,CAAA;QACf,CAAC,CAAA;IACH,CAAC;IAED,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,IAKrB,CAAA;IAED,OAAO,UAAkC,OAAgB;QACvD,IAAI,WAAW,CAAC,OAAO,CAAC;YAAE,OAAO,KAAK,CAAA;QACtC,IAAI,YAAY,CAAC,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAA;QAEvC,OAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAA;IAC3D,CAAC,CAAA;AACH,CAAC"}
|
package/lib/matchers/multiple.js
CHANGED
|
@@ -1,24 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const errors_1 = require("@blackglory/errors");
|
|
6
|
-
const match_multiple_1 = require("../utils/match-multiple");
|
|
7
|
-
var Range;
|
|
1
|
+
import { countup } from 'extra-generator';
|
|
2
|
+
import { assert } from '@blackglory/prelude';
|
|
3
|
+
import { matchMultiple } from "../utils/match-multiple.js";
|
|
4
|
+
export var Range;
|
|
8
5
|
(function (Range) {
|
|
9
6
|
Range[Range["Min"] = 0] = "Min";
|
|
10
7
|
Range[Range["Max"] = 1] = "Max";
|
|
11
|
-
})(Range
|
|
12
|
-
function multiple([min, max], matcher, options = { greedy: true }) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
8
|
+
})(Range || (Range = {}));
|
|
9
|
+
export function multiple([min, max], matcher, options = { greedy: true }) {
|
|
10
|
+
assert(Number.isInteger(min), 'parameter min must be an integer');
|
|
11
|
+
assert(Number.isInteger(max) || max === Infinity, 'parameter max must be an integer or Infinity');
|
|
12
|
+
assert(min >= 0, 'parameter min must be greater than or equal to 0');
|
|
13
|
+
assert(min <= max, 'parameter max must be greater than or equal to min');
|
|
17
14
|
return function* (node) {
|
|
18
15
|
if (options.greedy) {
|
|
19
16
|
let ubound = max;
|
|
20
17
|
while (true) {
|
|
21
|
-
const round =
|
|
18
|
+
const round = matchMultiple.call(this, node, ubound, matcher);
|
|
22
19
|
if (round < min)
|
|
23
20
|
break;
|
|
24
21
|
yield round;
|
|
@@ -28,8 +25,9 @@ function multiple([min, max], matcher, options = { greedy: true }) {
|
|
|
28
25
|
}
|
|
29
26
|
}
|
|
30
27
|
else {
|
|
31
|
-
for (const ubound of
|
|
32
|
-
const result =
|
|
28
|
+
for (const ubound of countup(min, max)) {
|
|
29
|
+
const result = matchMultiple.call(this, node, ubound, matcher);
|
|
30
|
+
// 如果匹配的节点数量少于ubound, 说明匹配失败, 即使尝试更长的匹配也不会成功.
|
|
33
31
|
if (result < ubound)
|
|
34
32
|
break;
|
|
35
33
|
if (result === ubound)
|
|
@@ -38,5 +36,4 @@ function multiple([min, max], matcher, options = { greedy: true }) {
|
|
|
38
36
|
}
|
|
39
37
|
};
|
|
40
38
|
}
|
|
41
|
-
exports.multiple = multiple;
|
|
42
39
|
//# sourceMappingURL=multiple.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multiple.js","sourceRoot":"","sources":["../../src/matchers/multiple.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"multiple.js","sourceRoot":"","sources":["../../src/matchers/multiple.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,mCAAgC;AAExD,MAAM,CAAN,IAAY,KAGX;AAHD,WAAY,KAAK;IACf,+BAAO,CAAA;IACP,+BAAO,CAAA;AACT,CAAC,EAHW,KAAK,KAAL,KAAK,QAGhB;AAOD,MAAM,UAAU,QAAQ,CACtB,CAAC,GAAG,EAAE,GAAG,CAA6B,EACtC,OAAgD,EAChD,UAA4B,EAAE,MAAM,EAAE,IAAI,EAAE;IAE5C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,kCAAkC,CAAC,CAAA;IACjE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,QAAQ,EAAE,8CAA8C,CAAC,CAAA;IACjG,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,kDAAkD,CAAC,CAAA;IACpE,MAAM,CAAC,GAAG,IAAI,GAAG,EAAE,oDAAoD,CAAC,CAAA;IAExE,OAAO,QAAQ,CAAC,EAA0B,IAAO;QAC/C,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,IAAI,MAAM,GAAG,GAAG,CAAA;YAChB,OAAO,IAAI,EAAE,CAAC;gBACZ,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAC9B,IAAI,EACJ,IAAI,EACJ,MAAM,EACN,OAAwD,CACzD,CAAA;gBAED,IAAI,KAAK,GAAG,GAAG;oBAAE,MAAK;gBACtB,MAAM,KAAK,CAAA;gBAEX,MAAM,GAAG,KAAK,GAAG,CAAC,CAAA;gBAClB,IAAI,MAAM,GAAG,GAAG;oBAAE,MAAK;YACzB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;gBACvC,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAC/B,IAAI,EACJ,IAAI,EACJ,MAAM,EACN,OAAsD,CACvD,CAAA;gBAED,6CAA6C;gBAC7C,IAAI,MAAM,GAAG,MAAM;oBAAE,MAAK;gBAE1B,IAAI,MAAM,KAAK,MAAM;oBAAE,MAAM,MAAM,CAAA;YACrC,CAAC;QACH,CAAC;IACH,CAAC,CAAA;AACH,CAAC"}
|
package/lib/matchers/node.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { INestedMatcher, ITerminalMatcher } from
|
|
1
|
+
import { INestedMatcher, ITerminalMatcher } from "../types.js";
|
|
2
2
|
export declare function node(strings: TemplateStringsArray, ...values: string[]): (...matchers: Array<INestedMatcher<Node> | ITerminalMatcher<Node>>) => INestedMatcher<Node>;
|
|
3
3
|
export declare function node(name: string, ...matchers: Array<INestedMatcher<Node> | ITerminalMatcher<Node>>): INestedMatcher<Node>;
|
|
4
4
|
export declare function node(...matchers: Array<INestedMatcher<Node> | ITerminalMatcher<Node>>): INestedMatcher<Node>;
|
package/lib/matchers/node.js
CHANGED
|
@@ -1,31 +1,27 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const merge_in_place_1 = require("../utils/merge-in-place");
|
|
7
|
-
function node(...args) {
|
|
8
|
-
if ((0, types_1.isArray)(args[0])) {
|
|
1
|
+
import { isArray, isEmptyArray, isString } from '@blackglory/prelude';
|
|
2
|
+
import { concat } from 'extra-tags';
|
|
3
|
+
import { mergeInPlace } from "../utils/merge-in-place.js";
|
|
4
|
+
export function node(...args) {
|
|
5
|
+
if (isArray(args[0])) {
|
|
9
6
|
const [strings, ...values] = args;
|
|
10
|
-
const name =
|
|
7
|
+
const name = concat(strings, ...values);
|
|
11
8
|
return (...matchers) => node(name, ...matchers);
|
|
12
9
|
}
|
|
13
|
-
if (
|
|
10
|
+
if (isString(args[0])) {
|
|
14
11
|
const [name, ...matchers] = args;
|
|
15
12
|
return function (_node) {
|
|
16
13
|
const result = node(...matchers).call(this, _node);
|
|
17
14
|
if (result) {
|
|
18
|
-
|
|
15
|
+
mergeInPlace(this.collection, { [name]: _node });
|
|
19
16
|
}
|
|
20
17
|
return result;
|
|
21
18
|
};
|
|
22
19
|
}
|
|
23
20
|
const [...matchers] = args;
|
|
24
21
|
return function (node) {
|
|
25
|
-
if (matchers
|
|
22
|
+
if (isEmptyArray(matchers))
|
|
26
23
|
return true;
|
|
27
24
|
return matchers.every(match => match.call(this, node));
|
|
28
25
|
};
|
|
29
26
|
}
|
|
30
|
-
exports.node = node;
|
|
31
27
|
//# sourceMappingURL=node.js.map
|
package/lib/matchers/node.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/matchers/node.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/matchers/node.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AACrE,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AACnC,OAAO,EAAE,YAAY,EAAE,mCAAgC;AAkBvD,MAAM,UAAU,IAAI,CAAC,GAAG,IAG6C;IAEnE,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACrB,MAAM,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,GAAG,IAG5B,CAAA;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,CAAA;QAEvC,OAAO,CACL,GAAG,QAGF,EACD,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAC,CAAA;IAC9B,CAAC;IAED,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAC,GAAG,IAM3B,CAAA;QAED,OAAO,UAAkC,KAAW;YAClD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;YAClD,IAAI,MAAM,EAAE,CAAC;gBACX,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;YAClD,CAAC;YACD,OAAO,MAAM,CAAA;QACf,CAAC,CAAA;IACH,CAAC;IAED,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,IAKrB,CAAA;IAED,OAAO,UAAkC,IAAU;QACjD,IAAI,YAAY,CAAC,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAA;QAEvC,OAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;IACxD,CAAC,CAAA;AACH,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { INestedMatcher, ITerminalMatcher, ISkipMatcher } from
|
|
1
|
+
import { INestedMatcher, ITerminalMatcher, ISkipMatcher } from "../types.js";
|
|
2
2
|
export declare function optional<T extends Node>(matcher: INestedMatcher<T> | ITerminalMatcher<T>): ISkipMatcher<T>;
|
package/lib/matchers/optional.js
CHANGED
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const multiple_1 = require("./multiple");
|
|
5
|
-
function optional(matcher) {
|
|
6
|
-
return (0, multiple_1.multiple)([0, 1], matcher, { greedy: true });
|
|
1
|
+
import { multiple } from './multiple.js';
|
|
2
|
+
export function optional(matcher) {
|
|
3
|
+
return multiple([0, 1], matcher, { greedy: true });
|
|
7
4
|
}
|
|
8
|
-
exports.optional = optional;
|
|
9
5
|
//# sourceMappingURL=optional.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"optional.js","sourceRoot":"","sources":["../../src/matchers/optional.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"optional.js","sourceRoot":"","sources":["../../src/matchers/optional.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,MAAM,UAAU,QAAQ,CACtB,OAAgD;IAEhD,OAAO,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;AACpD,CAAC"}
|
package/lib/matchers/repeat.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { INestedMatcher, ITerminalMatcher, ISkipMatcher } from
|
|
1
|
+
import { INestedMatcher, ITerminalMatcher, ISkipMatcher } from "../types.js";
|
|
2
2
|
export declare function repeat<T extends Node>(times: number, matcher: INestedMatcher<T> | ITerminalMatcher<T>): ISkipMatcher<T>;
|
package/lib/matchers/repeat.js
CHANGED
|
@@ -1,13 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
function repeat(times, matcher) {
|
|
7
|
-
(0, errors_1.assert)(Number.isInteger(times), 'parameter times must be an integer');
|
|
8
|
-
(0, errors_1.assert)(times >= 0, 'parameter number must be greater than or equal to 0');
|
|
1
|
+
import { assert } from '@blackglory/prelude';
|
|
2
|
+
import { matchMultiple } from "../utils/match-multiple.js";
|
|
3
|
+
export function repeat(times, matcher) {
|
|
4
|
+
assert(Number.isInteger(times), 'parameter times must be an integer');
|
|
5
|
+
assert(times >= 0, 'parameter number must be greater than or equal to 0');
|
|
9
6
|
return function (node) {
|
|
10
|
-
const result =
|
|
7
|
+
const result = matchMultiple.call(this, node, times, matcher);
|
|
11
8
|
if (result === times) {
|
|
12
9
|
return times;
|
|
13
10
|
}
|
|
@@ -16,5 +13,4 @@ function repeat(times, matcher) {
|
|
|
16
13
|
}
|
|
17
14
|
};
|
|
18
15
|
}
|
|
19
|
-
exports.repeat = repeat;
|
|
20
16
|
//# sourceMappingURL=repeat.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repeat.js","sourceRoot":"","sources":["../../src/matchers/repeat.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"repeat.js","sourceRoot":"","sources":["../../src/matchers/repeat.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,mCAAgC;AAExD,MAAM,UAAU,MAAM,CACpB,KAAa,EACb,OAAgD;IAEhD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,oCAAoC,CAAC,CAAA;IACrE,MAAM,CAAC,KAAK,IAAI,CAAC,EAAE,qDAAqD,CAAC,CAAA;IAEzE,OAAO,UAAkC,IAAO;QAC9C,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAC/B,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,OAAwD,CACzD,CAAA;QACD,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACrB,OAAO,KAAK,CAAA;QACd,CAAC;aAAM,CAAC;YACN,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC,CAAA;AACH,CAAC"}
|
package/lib/matchers/tap.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { IReadonlyContext, IMatcher } from
|
|
1
|
+
import { IReadonlyContext, IMatcher } from "../types.js";
|
|
2
2
|
export declare function tap<T extends Node, U extends ReturnType<IMatcher<any>>>(matcher: (this: IReadonlyContext, node: T) => U, callback: (value: U) => void): (this: IReadonlyContext, node: T) => U;
|
package/lib/matchers/tap.js
CHANGED
|
@@ -1,12 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.tap = void 0;
|
|
4
|
-
function tap(matcher, callback) {
|
|
1
|
+
export function tap(matcher, callback) {
|
|
5
2
|
return function (node) {
|
|
6
3
|
const result = matcher.call(this, node);
|
|
7
4
|
callback(result);
|
|
8
5
|
return result;
|
|
9
6
|
};
|
|
10
7
|
}
|
|
11
|
-
exports.tap = tap;
|
|
12
8
|
//# sourceMappingURL=tap.js.map
|
package/lib/matchers/tap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tap.js","sourceRoot":"","sources":["../../src/matchers/tap.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tap.js","sourceRoot":"","sources":["../../src/matchers/tap.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAAG,CACjB,OAA+C,EAC/C,QAA4B;IAE5B,OAAO,UAAkC,IAAO;QAC9C,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QACvC,QAAQ,CAAC,MAAM,CAAC,CAAA;QAChB,OAAO,MAAM,CAAA;IACf,CAAC,CAAA;AACH,CAAC"}
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.textContentEquals = void 0;
|
|
4
|
-
const types_1 = require("@blackglory/types");
|
|
5
|
-
function textContentEquals(text, { caseSensitive = true, trim = false } = {}) {
|
|
1
|
+
import { isNull } from '@blackglory/prelude';
|
|
2
|
+
export function textContentEquals(text, { caseSensitive = true, trim = false } = {}) {
|
|
6
3
|
return (node) => {
|
|
7
|
-
if (
|
|
4
|
+
if (isNull(node.textContent))
|
|
8
5
|
return false;
|
|
9
6
|
let textContent = node.textContent;
|
|
10
7
|
if (!caseSensitive) {
|
|
@@ -16,5 +13,4 @@ function textContentEquals(text, { caseSensitive = true, trim = false } = {}) {
|
|
|
16
13
|
return textContent === text;
|
|
17
14
|
};
|
|
18
15
|
}
|
|
19
|
-
exports.textContentEquals = textContentEquals;
|
|
20
16
|
//# sourceMappingURL=text-content-equals.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-content-equals.js","sourceRoot":"","sources":["../../src/matchers/text-content-equals.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"text-content-equals.js","sourceRoot":"","sources":["../../src/matchers/text-content-equals.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAO5C,MAAM,UAAU,iBAAiB,CAC/B,IAAY,EACZ,EACE,aAAa,GAAG,IAAI,EACpB,IAAI,GAAG,KAAK,KACiB,EAAE;IAEjC,OAAO,CAAC,IAAU,EAAE,EAAE;QACpB,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;YAAE,OAAO,KAAK,CAAA;QAE1C,IAAI,WAAW,GAAG,IAAI,CAAC,WAAW,CAAA;QAClC,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,WAAW,GAAG,WAAW,CAAC,WAAW,EAAE,CAAA;YACvC,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;QAC3B,CAAC;QACD,IAAI,IAAI;YAAE,WAAW,GAAG,WAAW,CAAC,IAAI,EAAE,CAAA;QAE1C,OAAO,WAAW,KAAK,IAAI,CAAA;IAC7B,CAAC,CAAA;AACH,CAAC"}
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.textContentIncludes = void 0;
|
|
4
|
-
const types_1 = require("@blackglory/types");
|
|
5
|
-
function textContentIncludes(searchString, { caseSensitive = true, trim = false } = {}) {
|
|
1
|
+
import { isNull } from '@blackglory/prelude';
|
|
2
|
+
export function textContentIncludes(searchString, { caseSensitive = true, trim = false } = {}) {
|
|
6
3
|
return (node) => {
|
|
7
|
-
if (
|
|
4
|
+
if (isNull(node.textContent))
|
|
8
5
|
return false;
|
|
9
6
|
let textContent = node.textContent;
|
|
10
7
|
if (!caseSensitive) {
|
|
@@ -16,5 +13,4 @@ function textContentIncludes(searchString, { caseSensitive = true, trim = false
|
|
|
16
13
|
return textContent.includes(searchString);
|
|
17
14
|
};
|
|
18
15
|
}
|
|
19
|
-
exports.textContentIncludes = textContentIncludes;
|
|
20
16
|
//# sourceMappingURL=text-content-includes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-content-includes.js","sourceRoot":"","sources":["../../src/matchers/text-content-includes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"text-content-includes.js","sourceRoot":"","sources":["../../src/matchers/text-content-includes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAO5C,MAAM,UAAU,mBAAmB,CACjC,YAAoB,EACpB,EACE,aAAa,GAAG,IAAI,EACpB,IAAI,GAAG,KAAK,KACmB,EAAE;IAEnC,OAAO,CAAC,IAAU,EAAE,EAAE;QACpB,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;YAAE,OAAO,KAAK,CAAA;QAE1C,IAAI,WAAW,GAAG,IAAI,CAAC,WAAW,CAAA;QAClC,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,WAAW,GAAG,WAAW,CAAC,WAAW,EAAE,CAAA;YACvC,YAAY,GAAG,YAAY,CAAC,WAAW,EAAE,CAAA;QAC3C,CAAC;QACD,IAAI,IAAI;YAAE,WAAW,GAAG,WAAW,CAAC,IAAI,EAAE,CAAA;QAE1C,OAAO,WAAW,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;IAC3C,CAAC,CAAA;AACH,CAAC"}
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.textContentMatches = void 0;
|
|
4
|
-
const types_1 = require("@blackglory/types");
|
|
5
|
-
function textContentMatches(pattern, { trim = false } = {}) {
|
|
1
|
+
import { isNull } from '@blackglory/prelude';
|
|
2
|
+
export function textContentMatches(pattern, { trim = false } = {}) {
|
|
6
3
|
return (node) => {
|
|
7
|
-
if (
|
|
4
|
+
if (isNull(node.textContent))
|
|
8
5
|
return false;
|
|
9
6
|
let textContent = node.textContent;
|
|
10
7
|
if (trim)
|
|
@@ -12,5 +9,4 @@ function textContentMatches(pattern, { trim = false } = {}) {
|
|
|
12
9
|
return pattern.test(textContent);
|
|
13
10
|
};
|
|
14
11
|
}
|
|
15
|
-
exports.textContentMatches = textContentMatches;
|
|
16
12
|
//# sourceMappingURL=text-content-matches.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-content-matches.js","sourceRoot":"","sources":["../../src/matchers/text-content-matches.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"text-content-matches.js","sourceRoot":"","sources":["../../src/matchers/text-content-matches.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAM5C,MAAM,UAAU,kBAAkB,CAChC,OAAe,EACf,EAAE,IAAI,GAAG,KAAK,KAAiC,EAAE;IAEjD,OAAO,CAAC,IAAU,EAAE,EAAE;QACpB,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;YAAE,OAAO,KAAK,CAAA;QAE1C,IAAI,WAAW,GAAG,IAAI,CAAC,WAAW,CAAA;QAClC,IAAI,IAAI;YAAE,WAAW,GAAG,WAAW,CAAC,IAAI,EAAE,CAAA;QAE1C,OAAO,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IAClC,CAAC,CAAA;AACH,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { INestedMatcher, ITerminalMatcher } from
|
|
1
|
+
import { INestedMatcher, ITerminalMatcher } from "../types.js";
|
|
2
2
|
export declare function textNode(strings: TemplateStringsArray, ...values: string[]): (...matchers: Array<ITerminalMatcher<Node>>) => INestedMatcher<Node>;
|
|
3
3
|
export declare function textNode(name: string, ...matchers: Array<ITerminalMatcher<Node>>): INestedMatcher<Node>;
|
|
4
4
|
export declare function textNode(...matchers: Array<ITerminalMatcher<Node>>): INestedMatcher<Node>;
|
|
@@ -1,34 +1,30 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const merge_in_place_1 = require("../utils/merge-in-place");
|
|
8
|
-
function textNode(...args) {
|
|
9
|
-
if ((0, types_1.isArray)(args[0])) {
|
|
1
|
+
import { isArray, isString } from '@blackglory/prelude';
|
|
2
|
+
import { concat } from 'extra-tags';
|
|
3
|
+
import { isntTextNode } from 'extra-dom';
|
|
4
|
+
import { mergeInPlace } from "../utils/merge-in-place.js";
|
|
5
|
+
export function textNode(...args) {
|
|
6
|
+
if (isArray(args[0])) {
|
|
10
7
|
const [strings, ...values] = args;
|
|
11
|
-
const name =
|
|
8
|
+
const name = concat(strings, ...values);
|
|
12
9
|
return (...matchers) => textNode(name, ...matchers);
|
|
13
10
|
}
|
|
14
|
-
if (
|
|
11
|
+
if (isString(args[0])) {
|
|
15
12
|
const [name, ...matchers] = args;
|
|
16
13
|
return function (node) {
|
|
17
14
|
const result = textNode(...matchers).call(this, node);
|
|
18
15
|
if (result) {
|
|
19
|
-
|
|
16
|
+
mergeInPlace(this.collection, { [name]: node });
|
|
20
17
|
}
|
|
21
18
|
return result;
|
|
22
19
|
};
|
|
23
20
|
}
|
|
24
21
|
const [...matchers] = args;
|
|
25
22
|
return function (node) {
|
|
26
|
-
if (
|
|
23
|
+
if (isntTextNode(node))
|
|
27
24
|
return false;
|
|
28
25
|
if (matchers.length === 0)
|
|
29
26
|
return true;
|
|
30
27
|
return matchers.every(match => match.call(this, node));
|
|
31
28
|
};
|
|
32
29
|
}
|
|
33
|
-
exports.textNode = textNode;
|
|
34
30
|
//# sourceMappingURL=text-node.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-node.js","sourceRoot":"","sources":["../../src/matchers/text-node.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"text-node.js","sourceRoot":"","sources":["../../src/matchers/text-node.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,mCAAgC;AAavD,MAAM,UAAU,QAAQ,CAAC,GAAG,IAGkB;IAE5C,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACrB,MAAM,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,GAAG,IAG5B,CAAA;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,CAAA;QAEvC,OAAO,CAAC,GAAG,QAAuC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAC,CAAA;IACpF,CAAC;IAED,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAC,GAAG,IAG3B,CAAA;QAED,OAAO,UAAkC,IAAU;YACjD,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;YACrD,IAAI,MAAM,EAAE,CAAC;gBACX,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAA;YACjD,CAAC;YACD,OAAO,MAAM,CAAA;QACf,CAAC,CAAA;IACH,CAAC;IAED,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,IAAoD,CAAA;IAE1E,OAAO,UAAkC,IAAU;QACjD,IAAI,YAAY,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAA;QACpC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;QAEtC,OAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;IACxD,CAAC,CAAA;AACH,CAAC"}
|
package/lib/matchers/xpath.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { ITerminalMatcher } from
|
|
1
|
+
import { ITerminalMatcher } from "../types.js";
|
|
2
2
|
export declare function xpath(strings: TemplateStringsArray, ...values: string[]): ITerminalMatcher<Node>;
|
|
3
3
|
export declare function xpath(experssion: string): ITerminalMatcher<Node>;
|
package/lib/matchers/xpath.js
CHANGED
|
@@ -1,31 +1,27 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const types_1 = require("@blackglory/types");
|
|
5
|
-
const concat_1 = require("../utils/concat");
|
|
6
|
-
const errors_1 = require("@blackglory/errors");
|
|
1
|
+
import { isntNull, isString } from '@blackglory/prelude';
|
|
2
|
+
import { concat } from 'extra-tags';
|
|
3
|
+
import { assert } from '@blackglory/prelude';
|
|
7
4
|
const UNORDERED_NODE_ITERATOR_TYPE = 'XPathResult' in globalThis
|
|
8
5
|
? XPathResult.UNORDERED_NODE_ITERATOR_TYPE
|
|
9
6
|
: 4;
|
|
10
|
-
function xpath(...args) {
|
|
11
|
-
if (
|
|
7
|
+
export function xpath(...args) {
|
|
8
|
+
if (isString(args[0])) {
|
|
12
9
|
const [expression] = args;
|
|
13
|
-
|
|
10
|
+
assert(expression.startsWith('/'), 'XPath expressions must start with "/"');
|
|
14
11
|
return function (node) {
|
|
15
12
|
return xpathMatches(this.document, expression, node);
|
|
16
13
|
};
|
|
17
14
|
}
|
|
18
15
|
else {
|
|
19
16
|
const [strings, ...values] = args;
|
|
20
|
-
const expression =
|
|
17
|
+
const expression = concat(strings, ...values);
|
|
21
18
|
return xpath(expression);
|
|
22
19
|
}
|
|
23
20
|
}
|
|
24
|
-
exports.xpath = xpath;
|
|
25
21
|
function xpathMatches(document, expression, node) {
|
|
26
22
|
const iterator = document.evaluate(expression, node, null, UNORDERED_NODE_ITERATOR_TYPE, null);
|
|
27
23
|
let value;
|
|
28
|
-
while (
|
|
24
|
+
while (value = iterator.iterateNext(), isntNull(value)) {
|
|
29
25
|
if (value === node)
|
|
30
26
|
return true;
|
|
31
27
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xpath.js","sourceRoot":"","sources":["../../src/matchers/xpath.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"xpath.js","sourceRoot":"","sources":["../../src/matchers/xpath.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAE5C,MAAM,4BAA4B,GAChC,aAAa,IAAI,UAAU;IAC7B,CAAC,CAAC,WAAW,CAAC,4BAA4B;IAC1C,CAAC,CAAC,CAAC,CAAA;AASH,MAAM,UAAU,KAAK,CAAC,GAAG,IAE6B;IAEpD,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI,CAAA;QACzB,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,uCAAuC,CAAC,CAAA;QAE3E,OAAO,UAEL,IAAU;YAEV,OAAO,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA;QACtD,CAAC,CAAA;IACH,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,GAAG,IAAI,CAAA;QACjC,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,CAAA;QAE7C,OAAO,KAAK,CAAC,UAAU,CAAC,CAAA;IAC1B,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,QAAkB,EAAE,UAAkB,EAAE,IAAU;IACtE,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAChC,UAAU,EACV,IAAI,EACJ,IAAI,EACJ,4BAA4B,EAC5B,IAAI,CACL,CAAA;IAED,IAAI,KAAkB,CAAA;IACtB,OAAO,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACvD,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,IAAI,CAAA;IACjC,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC"}
|
package/lib/types.d.ts
CHANGED
|
@@ -1,18 +1,19 @@
|
|
|
1
|
+
import { Arrayable } from '@blackglory/prelude';
|
|
1
2
|
export interface IContext {
|
|
2
3
|
readonly document: Document;
|
|
3
4
|
readonly next: (node: Node, distance?: number) => Node | undefined;
|
|
4
5
|
readonly collection: {
|
|
5
|
-
[name: string]: Node
|
|
6
|
+
[name: string]: Arrayable<Node>;
|
|
6
7
|
};
|
|
7
8
|
}
|
|
8
9
|
export interface IReadonlyContext {
|
|
9
10
|
readonly document: Document;
|
|
10
11
|
readonly next: (node: Node, distance?: number) => Node | undefined;
|
|
11
12
|
readonly collection: {
|
|
12
|
-
readonly [name: string]: Node
|
|
13
|
+
readonly [name: string]: Arrayable<Node>;
|
|
13
14
|
};
|
|
14
15
|
}
|
|
15
|
-
export
|
|
16
|
-
export
|
|
17
|
-
export
|
|
18
|
-
export
|
|
16
|
+
export type IMatcher<T extends Node> = ITerminalMatcher<T> | INestedMatcher<T> | ISkipMatcher<T> | (<T extends Node>(this: IReadonlyContext, node: T) => boolean | number | Iterable<number>);
|
|
17
|
+
export type INestedMatcher<T extends Node> = (this: IReadonlyContext, node: T) => boolean;
|
|
18
|
+
export type ISkipMatcher<T extends Node> = (this: IReadonlyContext, node: T) => number | Iterable<number> | false;
|
|
19
|
+
export type ITerminalMatcher<T extends Node> = (this: IReadonlyContext, node: T) => boolean;
|
package/lib/types.js
CHANGED
|
@@ -1,2 +1,5 @@
|
|
|
1
|
-
import { INestedMatcher, ITerminalMatcher, IReadonlyContext } from
|
|
1
|
+
import { INestedMatcher, ITerminalMatcher, IReadonlyContext } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* @returns {number} 返回值为成功匹配的元素个数, 当此值等于ubound时, 代表匹配成功.
|
|
4
|
+
*/
|
|
2
5
|
export declare function matchMultiple<T extends Node>(this: IReadonlyContext, node: T, ubound: number, matcher: INestedMatcher<T> | ITerminalMatcher<T>): number;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
function matchMultiple(node, ubound, matcher) {
|
|
1
|
+
import { countup } from 'extra-generator';
|
|
2
|
+
/**
|
|
3
|
+
* @returns {number} 返回值为成功匹配的元素个数, 当此值等于ubound时, 代表匹配成功.
|
|
4
|
+
*/
|
|
5
|
+
export function matchMultiple(node, ubound, matcher) {
|
|
6
6
|
let currentNode = node;
|
|
7
|
-
for (const round of
|
|
7
|
+
for (const round of countup(1, ubound)) {
|
|
8
8
|
if (!currentNode)
|
|
9
9
|
return round - 1;
|
|
10
10
|
const result = matcher.call(this, currentNode);
|
|
@@ -17,5 +17,4 @@ function matchMultiple(node, ubound, matcher) {
|
|
|
17
17
|
}
|
|
18
18
|
return ubound;
|
|
19
19
|
}
|
|
20
|
-
exports.matchMultiple = matchMultiple;
|
|
21
20
|
//# sourceMappingURL=match-multiple.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"match-multiple.js","sourceRoot":"","sources":["../../src/utils/match-multiple.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"match-multiple.js","sourceRoot":"","sources":["../../src/utils/match-multiple.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAGzC;;GAEG;AACH,MAAM,UAAU,aAAa,CAE3B,IAAO,EACP,MAAc,EACd,OAAgD;IAEhD,IAAI,WAAW,GAAa,IAAI,CAAA;IAEhC,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC;QACvC,IAAI,CAAC,WAAW;YAAE,OAAO,KAAK,GAAG,CAAC,CAAA;QAElC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;QAC9C,IAAI,MAAM,EAAE,CAAC;YACX,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAa,CAAA;QAClD,CAAC;aAAM,CAAC;YACN,OAAO,KAAK,GAAG,CAAC,CAAA;QAClB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { IMatcher, IReadonlyContext } from
|
|
1
|
+
import { IMatcher, IReadonlyContext } from "../types.js";
|
|
2
2
|
export declare function matchOneByOne<T extends Node>(context: IReadonlyContext, source: T | null, ...matchers: Array<IMatcher<T>>): boolean;
|