Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | 1x 1x 98x 98x 98x 98x 98x 98x 98x 98x 98x 3804x 67x 3737x 69x 3668x 281x 281x 281x 3387x 281x 281x 281x 190x 190x 91x 281x 3106x 91x 3015x 91x 91x 3804x 3804x 98x 6x 22x 92x 92x 86x 263x 86x 1x | const Regex = require('becke-ch--regex--s0-0-v1--base--pl--lib') const GroupBuilder = require('./group_builder') class TreeRegexp { constructor(regexp) { this._re = 'string' === typeof regexp ? new RegExp(regexp) : regexp this._regex = new Regex(this._re.source, this._re.flags) const stack = [new GroupBuilder()] const groupStartStack = [] let last = null let escaping = false let nonCapturingMaybe = false let charClass = false this._re.source.split('').forEach((c, n) => { if (c == '[' && !escaping) { charClass = true } else if (c == ']' && !escaping) { charClass = false } else if (c === '(' && !escaping && !charClass) { stack.push(new GroupBuilder()) groupStartStack.push(n + 1) nonCapturingMaybe = false } else if (c === ')' && !escaping && !charClass) { const gb = stack.pop() const groupStart = groupStartStack.pop() if (gb.capturing) { gb.source = this._re.source.substring(groupStart, n) stack[stack.length - 1].add(gb) } else { gb.moveChildrenTo(stack[stack.length - 1]) } nonCapturingMaybe = false } else if (c === '?' && last === '(') { nonCapturingMaybe = true } else if (c === ':' && nonCapturingMaybe) { stack[stack.length - 1].setNonCapturing() nonCapturingMaybe = false } escaping = c === '\\' && !escaping last = c }) this._groupBuilder = stack.pop() } get regexp() { return this._re } get groupBuilder() { return this._groupBuilder } match(s) { const match = this._regex.exec(s) if (!match) return null let groupIndex = 0 const nextGroupIndex = () => groupIndex++ return this._groupBuilder.build(match, nextGroupIndex) } } module.exports = TreeRegexp |