incr-regex-package
Version:
An incremental regular expression parser in JavaScript; useful for input validation, RegExp
59 lines (54 loc) • 2.7 kB
JavaScript
"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);
}
}