1 | "use strict";
|
2 | var __importDefault = (this && this.__importDefault) || function (mod) {
|
3 | return (mod && mod.__esModule) ? mod : { "default": mod };
|
4 | };
|
5 | Object.defineProperty(exports, "__esModule", { value: true });
|
6 | var GroupBuilder_1 = __importDefault(require("./GroupBuilder"));
|
7 |
|
8 | var becke_ch__regex__s0_0_v1__base__pl__lib_1 = __importDefault(require("becke-ch--regex--s0-0-v1--base--pl--lib"));
|
9 | var TreeRegexp = (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 | }());
|
69 | exports.default = TreeRegexp;
|
70 |
|
\ | No newline at end of file |