nornj
Version:
A powerful template engine that can works with React, JSX enhancement or alternative tools.
362 lines (295 loc) • 12 kB
JavaScript
;
function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.compiledParam = compiledParam;
var _core = _interopRequireDefault(require("../core"));
var tools = _interopRequireWildcard(require("../utils/tools"));
require("../helpers/filter");
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
//Get compiled property
var REGEX_JS_PROP = /('[^']*')|("[^"]*")|(-?[0-9][0-9]*(\.\d+)?)|true|false|null|undefined|Object|Array|Math|Date|JSON|(([a-zA-Z_$#@])([a-zA-Z_$\d]*))/;
var REGEX_REPLACE_CHAR = /_njQs(\d+)_/g;
var REGEX_REPLACE_SET = /_njSet_/;
function _replaceStr(prop, innerQuotes) {
return prop.replace(REGEX_REPLACE_CHAR, function (all, g1) {
return innerQuotes[g1];
});
}
function _compiledProp(prop, innerBrackets, innerQuotes, source) {
var ret = tools.obj();
var propO = prop; //If there are vertical lines in the property,then use filter
if (prop.indexOf('|') >= 0) {
var filters = [];
var filtersTmp;
filtersTmp = prop.split('|');
prop = filtersTmp[0].trim(); //Extract property
filtersTmp = filtersTmp.slice(1);
tools.each(filtersTmp, function (filter) {
filter = filter.trim();
if (filter === '') {
return;
}
var retF = _getFilterParam(filter),
filterObj = tools.obj(),
filterName = retF[0].trim(); //Get filter name
if (filterName) {
var paramsF = retF[1]; //Get filter param
//Multiple params are separated by commas.
if (paramsF != null) {
var params = [];
tools.each(innerBrackets[paramsF].split(','), function (p) {
if (p !== '') {
params[params.length] = _compiledProp(p.trim(), innerBrackets, innerQuotes, source);
}
}, true);
filterObj.params = params;
}
filterObj.name = filterName;
filters.push(filterObj);
}
}, true);
ret.filters = filters;
} //替换字符串值
prop = _replaceStr(prop, innerQuotes); //Extract the parent data path
if (prop.indexOf('../') === 0) {
var n = 0;
prop = prop.replace(/\.\.\//g, function () {
n++;
return '';
});
ret.parentNum = n;
} //Extract the js property
if (prop !== '') {
var matchProp = REGEX_JS_PROP.exec(prop);
var hasAccessor = matchProp[6] === '#';
ret.name = hasAccessor ? matchProp[7] : matchProp[0];
if (!matchProp[5]) {
//Sign the parameter is a basic type value.
ret.isBasicType = true;
}
if (hasAccessor) {
ret.isAccessor = true;
}
ret.name = ret.name.replace(REGEX_REPLACE_SET, function () {
ret.hasSet = true;
return '';
});
} else {
ret.isEmpty = true;
}
return ret;
} //Get filter param
function _getFilterParam(obj) {
return obj.split("'bracket_");
} //Extract replace parameters
var REGEX_LT_GT = /_nj(L|G)t_/g;
var LT_GT_LOOKUP = {
_njLt_: '<',
_njGt_: '>'
};
var REGEX_QUOTE = /"[^"]*"|'[^']*'/g;
var REGEX_OPERATORS_ESCAPE = /\*|\||\/|\.|\?|\+/g;
var SP_FILTER_LOOKUP = {
'||': 'or',
'..': 'rOpe',
'..<': 'rLt'
};
var REGEX_SP_FILTER;
function createFilterAlias(name, alias) {
if (name && alias) {
SP_FILTER_LOOKUP[name] = alias;
}
REGEX_SP_FILTER = new RegExp('[\\s]+((' + Object.keys(SP_FILTER_LOOKUP).map(function (o) {
return o.replace(REGEX_OPERATORS_ESCAPE, function (match) {
return '\\' + match;
});
}).join('|') + ')[\\s]+)', 'g');
}
createFilterAlias();
var FN_FILTER_LOOKUP = {
')': ')_(',
']': ']_('
};
var REGEX_FN_FILTER = /(\)|\]|\.([^\s'"._#()|]+))[\s]*\(/g;
var REGEX_SPACE_S_FILTER = /([(,|])[\s]+/g;
var REGEX_PROP_FILTER = /\.([a-zA-Z_$#@][a-zA-Z_$\d]*)/g;
var REGEX_ARRPROP_FILTER = /([^\s([,])(\[)/g;
var ARR_OBJ_FILTER_LOOKUP = {
'[': 'list(',
']': ')',
'{': 'obj(',
'}': ')'
};
var REGEX_ARR_OBJ_FILTER = /\[|\]|\{|\}/g; //const REGEX_OBJKEY_FILTER = /([(,][\s]*)([^\s:,'"()|]+):/g;
var REGEX_SET_FILTER = /^[\s]*set[\s]+|([(,])[\s]*set[\s]+/g;
var REGEX_BRACKET_FILTER = /^[\s]*([(]+)|([(,])[\s]*([(]+)/g;
var NOT_OPERATORS = ['../'];
var REGEX_NEGATIVE = /-[0-9]/;
var BEGIN_CHARS = ['', '(', '[', ','];
var OPERATORS = ['+=', '+', '-[0-9]', '-', '**', '*', '%%', '%', '===', '!==', '==', '!=', '<=>', '<=', '>=', '=', '..<', '<', '>', '&&', '||', '?:', '?', ':', '../', '..', '/'];
var REGEX_OPERATORS;
function createRegexOperators(operator) {
if (operator) {
var insertIndex = 0;
OPERATORS.forEach(function (o, i) {
if (o.indexOf(operator) >= 0) {
insertIndex = i + 1;
}
});
OPERATORS.splice(insertIndex, 0, operator);
}
REGEX_OPERATORS = new RegExp(OPERATORS.map(function (o) {
return o.replace(REGEX_OPERATORS_ESCAPE, function (match) {
return '\\' + match;
});
}).join('|'), 'g');
}
createRegexOperators();
function _getProp(matchArr, innerQuotes, i, addSet) {
var prop = matchArr[2].trim();
var item = [matchArr[0], matchArr[1], null, true];
if (i > 0) {
item[3] = false; //Sign not contain all of placehorder
}
if (addSet) {
prop = 'set ' + prop;
} //替换特殊过滤器名称并且为简化过滤器补全"|"符
prop = prop.replace(REGEX_LT_GT, function (match) {
return LT_GT_LOOKUP[match];
}).replace(REGEX_QUOTE, function (match) {
innerQuotes.push(match);
return '_njQs' + (innerQuotes.length - 1) + '_';
}).replace(REGEX_OPERATORS, function (match, index) {
if (REGEX_NEGATIVE.test(match)) {
if (index > 0 && BEGIN_CHARS.indexOf(prop[index - 1].trim()) < 0) {
//Example: 123-456
return match.split('-').join(' - ');
} else {
//Example: -123+456
return match;
}
} else {
return NOT_OPERATORS.indexOf(match) < 0 ? " ".concat(match, " ") : match;
}
}).replace(REGEX_SP_FILTER, function (all, g1, match) {
return ' ' + SP_FILTER_LOOKUP[match] + ' ';
}).replace(REGEX_PROP_FILTER, function (all, g1) {
var startWithHash = g1[0] === '#';
if (startWithHash) {
g1 = g1.substr(1);
}
var lastCharIndex = g1.length - 1,
endWithUnderline = lastCharIndex > 0 && g1[lastCharIndex] === '_';
return (startWithHash ? '#' : '.') + "('" + (endWithUnderline ? g1.substr(0, lastCharIndex) : g1) + "')" + (endWithUnderline ? '_' : '');
}).replace(REGEX_ARRPROP_FILTER, function (all, g1, g2) {
return g1 + '.(';
}).replace(REGEX_ARR_OBJ_FILTER, function (match) {
return ARR_OBJ_FILTER_LOOKUP[match];
}).replace(REGEX_SET_FILTER, function (all, g1) {
return (g1 ? g1 : '') + '_njSet_';
}).replace(REGEX_BRACKET_FILTER, function (all, g1, g2, g3) {
return (g2 ? g2 : '') + (g2 ? g3 : g1).replace(/[(]/g, 'bracket(');
}) //.replace(REGEX_OBJKEY_FILTER, (all, g1, g2) => g1 + ' \'' + g2 + '\' : ')
.replace(REGEX_SPACE_S_FILTER, function (all, match) {
return match;
}).replace(REGEX_FN_FILTER, function (all, match, g1) {
return !g1 ? FN_FILTER_LOOKUP[match] : ".('" + g1 + "')_(";
});
item[2] = prop.trim();
return item;
}
function _getReplaceParam(obj, tmplRule, innerQuotes, hasColon, addSet) {
var pattern = tmplRule.replaceParam;
var matchArr,
ret,
i = 0;
if (!hasColon) {
while (matchArr = pattern.exec(obj)) {
if (!ret) {
ret = [];
}
var startRuleR = matchArr[2];
ret.push(_getProp([matchArr[0], startRuleR ? startRuleR : matchArr[5], startRuleR ? matchArr[3] : matchArr[6]], innerQuotes, i, addSet));
i++;
}
} else {
matchArr = [obj, tmplRule.startRule, obj];
ret = [_getProp(matchArr, innerQuotes, i, addSet)];
}
return ret;
}
var REGEX_INNER_BRACKET = /\(([^()]*)\)/g;
var REGEX_FIX_OPERATOR_1 = /([!]+)((-?[0-9][0-9]*(\.\d+)?|[^\s,|'=]+)('bracket_\d+)?([._#]'bracket_\d+)*)/g;
var REGEX_FIX_OPERATOR = /[\s]+([^\s(),|"']+)[\s]+((-?[0-9][0-9]*(\.\d+)?|[^\s,|']+)('bracket_\d+)?([._#]'bracket_\d+)*)/g;
var REGEX_SPACE_FILTER = /[(,]/g;
var REGEX_FIX_FILTER = /(\|)?(((\.+|_|#+)'bracket_)|[\s]+([^\s._#|]+[\s]*'bracket_))/g;
function _fixOperator(prop, innerBrackets) {
prop = prop.replace(REGEX_FIX_OPERATOR_1, function () {
var args = arguments;
innerBrackets.push(_fixFilter(args[2]));
return args[1] + "'bracket_" + (innerBrackets.length - 1);
});
return _fixFilter(prop.replace(REGEX_FIX_OPERATOR, function () {
var args = arguments;
innerBrackets.push(_fixFilter(args[2]));
return ' ' + args[1] + "'bracket_" + (innerBrackets.length - 1);
}));
}
function _fixFilter(prop) {
return (' ' + prop).replace(REGEX_SPACE_FILTER, function (all) {
return all + ' ';
}).replace(REGEX_FIX_FILTER, function (all, g1, g2, g3, g4, g5) {
return g1 ? all : ' | ' + (g3 ? g3 : g5);
}).trim();
}
function _replaceInnerBrackets(prop, innerBrackets) {
var propR = prop.replace(REGEX_INNER_BRACKET, function (all, s1) {
innerBrackets.push(_fixOperator(s1, innerBrackets));
return "'bracket_" + (innerBrackets.length - 1);
});
if (propR !== prop) {
return _replaceInnerBrackets(propR, innerBrackets);
} else {
return _fixOperator(propR, innerBrackets);
}
} //Get compiled parameter
function compiledParam(value, tmplRule, hasColon, onlyKey, addSet) {
var ret = tools.obj(),
isStr = tools.isString(value);
var strs = isStr ? !hasColon ? value.split(tmplRule.replaceSplit) : ['', ''] : [value],
props = null,
isAll = false; //此处指替换符是否占满整个属性值;若无替换符时为false
if (isStr) {
//替换插值变量以外的文本中的换行符
strs = strs.map(function (str) {
return str.replace(/\n/g, '_njNl_').replace(/\r/g, '');
});
} //If have placehorder
if (strs.length > 1) {
var innerQuotes = [];
var params = _getReplaceParam(value, tmplRule, innerQuotes, hasColon, addSet);
props = [];
tools.each(params, function (param) {
var retP = tools.obj(),
innerBrackets = [];
isAll = param[3] ? param[0] === value : false; //If there are several curly braces in one property value, "isAll" must be false.
var prop = _replaceInnerBrackets(param[2], innerBrackets);
retP.prop = _compiledProp(prop, innerBrackets, innerQuotes, value); //To determine whether it is necessary to escape
retP.escape = param[1] !== tmplRule.firstChar + tmplRule.startRule;
props.push(retP);
}, true);
}
ret.props = props;
ret.strs = strs;
ret.isAll = isAll;
ret.onlyKey = onlyKey;
return ret;
}
tools.assign(_core["default"], {
createFilterAlias: createFilterAlias,
createRegexOperators: createRegexOperators
});