UNPKG

nornj

Version:

A powerful template engine that can works with React, JSX enhancement or alternative tools.

362 lines (295 loc) 12 kB
"use strict"; 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 });