UNPKG

2.8 kBJavaScriptView Raw
1"use strict";
2var __importDefault = (this && this.__importDefault) || function (mod) {
3 return (mod && mod.__esModule) ? mod : { "default": mod };
4};
5Object.defineProperty(exports, "__esModule", { value: true });
6var GroupBuilder_1 = __importDefault(require("./GroupBuilder"));
7// @ts-ignore
8var becke_ch__regex__s0_0_v1__base__pl__lib_1 = __importDefault(require("becke-ch--regex--s0-0-v1--base--pl--lib"));
9var TreeRegexp = /** @class */ (function () {
10 function TreeRegexp(regexp) {
11 var _this = this;
12 this.regexp = 'string' === typeof regexp ? new RegExp(regexp) : regexp;
13 this.regex = new becke_ch__regex__s0_0_v1__base__pl__lib_1.default(this.regexp.source, this.regexp.flags);
14 var stack = [new GroupBuilder_1.default()];
15 var groupStartStack = [];
16 var last = null;
17 var escaping = false;
18 var nonCapturingMaybe = false;
19 var charClass = false;
20 this.regexp.source.split('').forEach(function (c, n) {
21 if (c === '[' && !escaping) {
22 charClass = true;
23 }
24 else if (c === ']' && !escaping) {
25 charClass = false;
26 }
27 else if (c === '(' && !escaping && !charClass) {
28 stack.push(new GroupBuilder_1.default());
29 groupStartStack.push(n + 1);
30 nonCapturingMaybe = false;
31 }
32 else if (c === ')' && !escaping && !charClass) {
33 var gb = stack.pop();
34 var groupStart = groupStartStack.pop();
35 if (gb.capturing) {
36 gb.source = _this.regexp.source.substring(groupStart, n);
37 stack[stack.length - 1].add(gb);
38 }
39 else {
40 gb.moveChildrenTo(stack[stack.length - 1]);
41 }
42 nonCapturingMaybe = false;
43 }
44 else if (c === '?' && last === '(') {
45 nonCapturingMaybe = true;
46 }
47 else if ((c === ':' || c === '!' || c === '=' || c === '<') &&
48 last === '?' &&
49 nonCapturingMaybe) {
50 stack[stack.length - 1].setNonCapturing();
51 nonCapturingMaybe = false;
52 }
53 escaping = c === '\\' && !escaping;
54 last = c;
55 });
56 this.groupBuilder = stack.pop();
57 }
58 TreeRegexp.prototype.match = function (s) {
59 var match = this.regex.exec(s);
60 if (!match) {
61 return null;
62 }
63 var groupIndex = 0;
64 var nextGroupIndex = function () { return groupIndex++; };
65 return this.groupBuilder.build(match, nextGroupIndex);
66 };
67 return TreeRegexp;
68}());
69exports.default = TreeRegexp;
70//# sourceMappingURL=TreeRegexp.js.map
\No newline at end of file