UNPKG

nornj

Version:

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

411 lines (355 loc) 11.3 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.registerExtension = registerExtension; exports.extensionConfig = exports.extensions = void 0; var _core = _interopRequireDefault(require("../core")); var tools = _interopRequireWildcard(require("../utils/tools")); var tranData = _interopRequireWildcard(require("../transforms/transformData")); var _interface = require("../interface"); 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 }; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } //Global extension list var extensions = { "if": function _if(value, options) { if (value && value._njOpts) { options = value; value = options.props.condition; } if (value === 'false') { value = false; } var ret; var props = options.props; if (value) { ret = (props && props.then || options.children)(); } else if (props) { var elseFn = props['else']; if (props.elseifs) { var l = props.elseifs.length; tools.each(props.elseifs, function (elseif, i) { if (elseif.value) { ret = elseif.fn(); return false; } else if (i === l - 1) { if (elseFn) { ret = elseFn(); } } }, true); } else { if (elseFn) { ret = elseFn(); } } } if (options.useString && ret == null) { return ''; } return ret; }, then: function then(options) { return options.tagProps.then = options.children; }, "else": function _else(options) { return options.tagProps['else'] = options.children; }, elseif: function elseif(value, options) { if (value && value._njOpts) { options = value; value = options.props.condition || options.props.value; } var _options = options, tagProps = _options.tagProps; if (!tagProps.elseifs) { tagProps.elseifs = []; } tagProps.elseifs.push({ value: value, fn: options.children }); }, "switch": function _switch(value, options) { if (value && value._njOpts) { options = value; value = options.props.value; } var ret; var props = options.props, elseifs = props.elseifs || [{}], l = elseifs.length; tools.each(elseifs, function (elseif, i) { if (value === elseif.value) { ret = elseif.fn(); return false; } else if (i === l - 1) { if (props['else']) { ret = props['else'](); } } }, true); return ret; }, each: function each(list, options) { if (list && list._njOpts) { options = list; list = options.props.of; } var useString = options.useString, props = options.props; var ret; if (list) { if (useString) { ret = ''; } else { ret = []; } var isArrayLike = tools.isArrayLike(list); var isArrayLoop = isArrayLike || tools.isSet(list) || tools.isWeakSet(list); tools.each(list, function (item, index, len, lenObj) { var param = { data: [item], index: isArrayLoop ? index : len, item: item, newParent: true }; var _len = isArrayLoop ? len : lenObj; var extra = { '@first': param.index === 0, '@last': param.index === _len - 1 }; if (!isArrayLoop) { extra['@key'] = index; } param.data.push(extra); var retI = options.children(param); if (useString) { ret += retI; } else { ret.push(retI); } }, isArrayLike); //Return null when not use string and result is empty. if (!useString && !ret.length) { ret = null; } if ((!ret || !ret.length) && props && props['else']) { ret = props['else'](); } } else { if (props && props['else']) { ret = props['else'](); } if (useString && ret == null) { ret = ''; } } return ret; }, //Parameter prop: function prop(name, options) { var ret = options.value(); //Get parameter value var value; if (ret !== undefined) { value = ret; } else { //Match to Similar to "checked" or "disabled" attribute. value = !options.useString ? true : name; } options.tagProps[options.outputH ? tranData.fixPropName(name) : name] = value; }, //Spread parameters spread: function spread(props, options) { var tagProps = options.tagProps; tools.each(props, function (v, k) { tagProps[k] === undefined && (options.tagProps[k] = v); }, false); }, show: function show(options) { if (!options.value()) { var tagProps = options.tagProps, useString = options.useString; if (!tagProps.style) { tagProps.style = useString ? '' : {}; } if (useString) { tagProps.style += (tagProps.style ? ';' : '') + 'display:none'; } else if (tools.isArray(tagProps.style)) { tagProps.style.push({ display: 'none' }); } else { tagProps.style.display = 'none'; } } }, obj: function obj(options) { return options.props; }, block: function block(options) { return options.children(); }, "with": function _with(originalData, options) { if (originalData && originalData._njOpts) { options = originalData; return options.children({ data: [options.props] }); } else { var _options2 = options, props = _options2.props; return options.children({ data: [props && props.as ? _defineProperty({}, props.as, originalData) : originalData] }); } }, arg: function arg(options) { var tagProps = options.tagProps; if (!tagProps.args) { tagProps.args = []; } tagProps.args.push(options.value()); }, css: function css(options) { return options.props.style; } }; exports.extensions = extensions; function _config(params, extra) { var ret = { onlyGlobal: false, useString: false, newContext: true, isSubTag: false, isDirective: false, isBindable: false, useExpressionInProps: false, hasName: true, noTagName: false, hasTagProps: true, hasTmplCtx: true, hasOutputH: false }; if (params) { ret = tools.assign(ret, params); } if (extra) { ret = tools.assign(ret, extra); } return ret; } var _defaultCfg = { onlyGlobal: true, newContext: false, hasName: false, hasTagProps: false, hasTmplCtx: false }; var _defaultCfgExpInProps = _config(_defaultCfg, { useExpressionInProps: true }); //Extension default config var extensionConfig = { "if": _config(_defaultCfgExpInProps), "else": _config(_defaultCfgExpInProps, { isSubTag: true, hasTagProps: true }), "switch": _config(_defaultCfgExpInProps, { needPrefix: _interface.ExtensionPrefixConfig.onlyLowerCase }), each: _config(_defaultCfgExpInProps, { newContext: { item: 'item', index: 'index', data: { first: ['@first', 'first'], last: ['@last', 'last'], $key: ['@key', 'key'] } } }), prop: _config(_defaultCfg, { isDirective: true, needPrefix: true, hasTagProps: true }), obj: _config(_defaultCfg, { needPrefix: true }), "with": _config(_defaultCfg, { newContext: { getDataFromProps: true } }), style: { needPrefix: true } }; exports.extensionConfig = extensionConfig; extensionConfig.then = _config(extensionConfig['else']); extensionConfig.elseif = _config(extensionConfig['else']); extensionConfig.spread = _config(extensionConfig.prop); extensionConfig.block = _config(extensionConfig.obj); extensionConfig.arg = _config(extensionConfig.prop); extensionConfig.show = _config(extensionConfig.prop, { useExpressionInProps: true, noTagName: true, hasOutputH: true }); extensionConfig.css = _config(extensionConfig.obj); //Extension alias extensions['for'] = extensions.each; extensionConfig['for'] = _config(extensionConfig.each); extensions['case'] = extensions.elseif; extensionConfig['case'] = _config(extensionConfig.elseif); extensions.empty = extensions['default'] = extensions['else']; extensionConfig.empty = _config(extensionConfig['else']); extensionConfig['default'] = _config(extensionConfig['else']); extensions.strProp = extensions.prop; extensionConfig.strProp = _config(extensionConfig.prop, { useString: true }); extensions.strArg = extensions.arg; extensionConfig.strArg = _config(extensionConfig.strProp); extensions.pre = extensions.block; extensionConfig.pre = _config(extensionConfig.block); function registerExtension(name, extension, options, mergeConfig) { var params = name; if (!tools.isObject(name)) { params = {}; params[name] = { extension: extension, options: options }; } tools.each(params, function (v, name) { if (v) { var _extension = v.extension, _options3 = v.options; if (_extension) { extensions[name] = _extension; } else if (!mergeConfig) { extensions[name] = v; } if (mergeConfig) { if (!extensionConfig[name]) { extensionConfig[name] = _config(); } if (tools.isObject(_options3)) { tools.assign(extensionConfig[name], _options3); } else { extensionConfig[name] = _config(); } } else { extensionConfig[name] = _config(_options3); } } }, false); } tools.assign(_core["default"], { extensions: extensions, extensionConfig: extensionConfig, registerExtension: registerExtension });