UNPKG

incr-regex-package

Version:

An incremental regular expression parser in JavaScript; useful for input validation, RegExp

59 lines (54 loc) 2.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = makeRxInfo; var _utils = require("../utils"); var _rxtree = require("../rxtree"); function makeRxInfo(unit, addElem, merge, optional, mapper) { var addOpt = function addOpt(rxNode, prefix) { if ((0, _rxtree.zero_or_more)(rxNode)) return addElem(prefix, _rxtree.HOLDER_ZERO_OR_MORE); return prefix; }; return getRxInfo; //--- returns the function below --- function getRxInfo(rxNode, prefix, optStop) { if (!rxNode) return unit(prefix); if (optStop && rxNode === (0, _utils.n_head)(optStop)) { // if we should match stop node, then pop the stop node // (usually its because we found a loop). Remove the node from the stack {n_tail(optStrop)}, // and procees with the next element return getRxInfo(rxNode.nextNode, addOpt(rxNode, prefix), (0, _utils.n_tail)(optStop)); } if (rxNode === _rxtree.DONE) return unit(prefix); if ((0, _rxtree.dot)(rxNode)) { // this is a node that concat of two regexp /AB/ => dot(A,B) - where A and B are regexp themselves //console.log("getMaskListOLD-dot"); return getRxInfo(rxNode.left, prefix, optStop); } else if ((0, _rxtree.or)(rxNode)) { // /A|B/ => or(A,B) //console.log("getMaskListOLD - or"); var LL = getRxInfo(rxNode.left, prefix, optStop); var RL = getRxInfo(rxNode.right, prefix, optStop); return merge(LL, RL); } else if ((0, _rxtree.zero_or_one)(rxNode)) { // /A?/ => zero_or_one(A) if (optional) { return optional(rxNode, prefix, getRxInfo, optStop); } else return getRxInfo(rxNode.nextNode, addElem(prefix, _rxtree.HOLDER_ZERO_OR_ONE), optStop); } else if ((0, _rxtree.zero_or_more)(rxNode)) { // / A* / => zero_or_more(A) if (optional) { return optional(rxNode, prefix, getRxInfo, optStop); } else return getRxInfo(rxNode.nextNode, addElem(prefix, _rxtree.HOLDER_ZERO_OR_MORE), optStop); } else if ((0, _rxtree.matchable)(rxNode)) { var res = (0, _rxtree.matchable)(rxNode)(undefined); var v = res[1] || (mapper ? mapper(rxNode, _rxtree.HOLDER_ANY) : _rxtree.HOLDER_ANY); //console.log("getMaskListOLD", v); return getRxInfo(rxNode.nextNode, addElem(prefix, v), optStop); } else if ((0, _rxtree.boundary)(rxNode)) { return getRxInfo(rxNode.nextNode, prefix, optStop); } return unit(prefix); } }