@blackglory/match 0.3.6 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -32
- 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 +1 -1
- package/lib/match-element.js +7 -11
- package/lib/match-element.js.map +1 -1
- package/lib/match.d.ts +1 -1
- package/lib/match.js +7 -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 +8 -11
- package/lib/matchers/child-nodes.js.map +1 -1
- package/lib/matchers/children.d.ts +1 -1
- package/lib/matchers/children.js +8 -11
- 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 +10 -14
- 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 +8 -12
- 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 +7 -11
- package/lib/matchers/xpath.js.map +1 -1
- package/lib/types.d.ts +4 -4
- package/lib/types.js +1 -2
- package/lib/utils/concat.js +1 -5
- package/lib/utils/concat.js.map +1 -1
- 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 +9 -9
- package/lib/utils/match-one-by-one.js.map +1 -1
- package/lib/utils/merge-in-place.d.ts +1 -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 +3 -3
- package/src/match.ts +3 -3
- package/src/matchers/any-of.ts +1 -1
- package/src/matchers/child-nodes.ts +4 -4
- package/src/matchers/children.ts +4 -4
- package/src/matchers/css.ts +3 -3
- package/src/matchers/element.ts +4 -4
- package/src/matchers/multiple.ts +3 -3
- package/src/matchers/node.ts +4 -4
- package/src/matchers/optional.ts +2 -2
- 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 +4 -4
- package/src/matchers/xpath.ts +4 -4
- package/src/utils/match-multiple.ts +1 -1
- package/src/utils/match-one-by-one.ts +2 -2
- package/src/utils/merge-in-place.ts +3 -3
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,21 +1,18 @@
|
|
|
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, isString } from '@blackglory/prelude';
|
|
2
|
+
import { concat } from "../utils/concat.js";
|
|
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).join('');
|
|
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
|
};
|
|
@@ -27,5 +24,4 @@ function node(...args) {
|
|
|
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,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAE,MAAM,EAAE,2BAAwB;AACzC,OAAO,EAAE,YAAY,EAAE,mCAAgC;AAavD,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,GACxB,IAA4D,CAAA;QAC9D,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAE7C,OAAO,CAAC,GAAG,QAA8D,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAC,CAAA;IACvG,CAAC;IAED,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAC,GACvB,IAAyF,CAAA;QAE3F,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,IAA2E,CAAA;IAEjG,OAAO,UAAkC,IAAU;QACjD,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"}
|
|
@@ -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,CAAiB,OAAgD;IACvF,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 "../utils/concat.js";
|
|
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).join('');
|
|
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,2BAAwB;AACzC,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,GACxB,IAA4D,CAAA;QAC9D,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAE7C,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,GACvB,IAAkE,CAAA;QAEpE,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,27 +1,23 @@
|
|
|
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 { isString } from '@blackglory/prelude';
|
|
2
|
+
import { concat } from "../utils/concat.js";
|
|
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).join('');
|
|
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;
|
|
@@ -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,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,MAAM,EAAE,2BAAwB;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAE5C,MAAM,4BAA4B,GAChC,aAAa,IAAI,UAAU;IAC3B,CAAC,CAAC,WAAW,CAAC,4BAA4B;IAC1C,CAAC,CAAC,CAAC,CAAA;AASL,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,KAAK,CAAC,EAAE,yCAAyC,CAAC,CAAA;QAE/E,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,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAEnD,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,KAAK,CAAA;IACT,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;QACjD,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,IAAI,CAAA;IACjC,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC"}
|
package/lib/types.d.ts
CHANGED
|
@@ -12,7 +12,7 @@ export interface IReadonlyContext {
|
|
|
12
12
|
readonly [name: string]: Node | Node[];
|
|
13
13
|
};
|
|
14
14
|
}
|
|
15
|
-
export
|
|
16
|
-
export
|
|
17
|
-
export
|
|
18
|
-
export
|
|
15
|
+
export type IMatcher<T extends Node> = ITerminalMatcher<T> | INestedMatcher<T> | ISkipMatcher<T> | (<T extends Node>(this: IReadonlyContext, node: T) => boolean | number | Iterable<number>);
|
|
16
|
+
export type INestedMatcher<T extends Node> = (this: IReadonlyContext, node: T) => boolean;
|
|
17
|
+
export type ISkipMatcher<T extends Node> = (this: IReadonlyContext, node: T) => number | Iterable<number> | false;
|
|
18
|
+
export type ITerminalMatcher<T extends Node> = (this: IReadonlyContext, node: T) => boolean;
|
package/lib/types.js
CHANGED
package/lib/utils/concat.js
CHANGED
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.concat = void 0;
|
|
4
|
-
function concat(strings, values) {
|
|
1
|
+
export function concat(strings, values) {
|
|
5
2
|
const result = [];
|
|
6
3
|
for (let i = 0, len = values.length; i < len; i++) {
|
|
7
4
|
result.push(strings[i]);
|
|
@@ -10,5 +7,4 @@ function concat(strings, values) {
|
|
|
10
7
|
result.push(strings[strings.length - 1]);
|
|
11
8
|
return result;
|
|
12
9
|
}
|
|
13
|
-
exports.concat = concat;
|
|
14
10
|
//# sourceMappingURL=concat.js.map
|
package/lib/utils/concat.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"concat.js","sourceRoot":"","sources":["../../src/utils/concat.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"concat.js","sourceRoot":"","sources":["../../src/utils/concat.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,MAAM,CAAC,OAA6B,EAAE,MAAgB;IACpE,MAAM,MAAM,GAAG,EAAE,CAAA;IACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;QACvB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IACxB,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAA;IACxC,OAAO,MAAM,CAAA;AACf,CAAC"}
|
|
@@ -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;
|
|
@@ -1,15 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.matchOneByOne = void 0;
|
|
4
|
-
const types_1 = require("@blackglory/types");
|
|
5
|
-
function matchOneByOne(context, source, ...matchers) {
|
|
1
|
+
import { isBoolean, isNumber, isIterable } from '@blackglory/prelude';
|
|
2
|
+
export function matchOneByOne(context, source, ...matchers) {
|
|
6
3
|
if (matchers.length === 0)
|
|
7
4
|
return true;
|
|
8
5
|
if (!source)
|
|
9
6
|
return false;
|
|
10
7
|
const [matcher, ...otherMatchers] = matchers;
|
|
11
8
|
const result = Reflect.apply(matcher, context, [source]);
|
|
12
|
-
|
|
9
|
+
// TerminalMatcher
|
|
10
|
+
if (isBoolean(result)) {
|
|
13
11
|
if (result) {
|
|
14
12
|
const nextNode = context.next(source);
|
|
15
13
|
return matchOneByOne(context, nextNode, ...otherMatchers);
|
|
@@ -18,21 +16,23 @@ function matchOneByOne(context, source, ...matchers) {
|
|
|
18
16
|
return false;
|
|
19
17
|
}
|
|
20
18
|
}
|
|
21
|
-
|
|
19
|
+
// 此处一定是成功匹配, 因为SkipMatcher在失败时会返回false.
|
|
20
|
+
if (isNumber(result)) {
|
|
22
21
|
const distance = result;
|
|
23
22
|
const nextNode = context.next(source, distance);
|
|
24
23
|
return matchOneByOne(context, nextNode, ...otherMatchers);
|
|
25
24
|
}
|
|
26
|
-
|
|
25
|
+
// SkipMatcher返回Iterable意味着存在多种可能性, 可能出现失败回溯.
|
|
26
|
+
if (isIterable(result)) {
|
|
27
27
|
for (const distance of result) {
|
|
28
28
|
const nextNode = context.next(source, distance);
|
|
29
29
|
if (matchOneByOne(context, nextNode, ...otherMatchers)) {
|
|
30
30
|
return true;
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
|
+
// 尝试了所有可能性, 未发现可以匹配的结果
|
|
33
34
|
return false;
|
|
34
35
|
}
|
|
35
36
|
throw new Error('Unknown return value');
|
|
36
37
|
}
|
|
37
|
-
exports.matchOneByOne = matchOneByOne;
|
|
38
38
|
//# sourceMappingURL=match-one-by-one.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"match-one-by-one.js","sourceRoot":"","sources":["../../src/utils/match-one-by-one.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"match-one-by-one.js","sourceRoot":"","sources":["../../src/utils/match-one-by-one.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAErE,MAAM,UAAU,aAAa,CAC3B,OAAyB,EACzB,MAAgB,EAChB,GAAG,QAA4B;IAE/B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IACtC,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IAEzB,MAAM,CAAC,OAAO,EAAE,GAAG,aAAa,CAAC,GAAG,QAAQ,CAAA;IAE5C,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,CAA+B,CAAA;IAEtF,kBAAkB;IAClB,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;QACtB,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAa,CAAA;YACjD,OAAO,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,aAAa,CAAC,CAAA;QAC3D,CAAC;aAAM,CAAC;YACN,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IAED,wCAAwC;IACxC,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACrB,MAAM,QAAQ,GAAG,MAAM,CAAA;QACvB,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAa,CAAA;QAC3D,OAAO,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,aAAa,CAAC,CAAA;IAC3D,CAAC;IAED,6CAA6C;IAC7C,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACvB,KAAK,MAAM,QAAQ,IAAI,MAAM,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAa,CAAA;YAC3D,IAAI,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,aAAa,CAAC,EAAE,CAAC;gBACvD,OAAO,IAAI,CAAA;YACb,CAAC;QACH,CAAC;QAED,uBAAuB;QACvB,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAA;AACzC,CAAC"}
|