%PDF- %PDF-
Direktori : /home/opti/workflow/node_modules/messageformat/lib/ |
Current File : /home/opti/workflow/node_modules/messageformat/lib/runtime.js |
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _utils = require("./utils"); /** A set of utility functions that are called by the compiled Javascript * functions, these are included locally in the output of {@link * MessageFormat#compile compile()}. * * @class * @private * @param {MessageFormat} mf - A MessageFormat instance */ class Runtime { /** Utility function for `#` in plural rules * * Will throw an Error if `value` has a non-numeric value and `offset` is * non-zero or {@link MessageFormat#setStrictNumberSign} is set. * * @function Runtime#number * @param {number} value - The value to operate on * @param {string} name - The name of the argument, used for error reporting * @param {number} [offset=0] - An optional offset, set by the surrounding context * @returns {number|string} The result of applying the offset to the input value */ /** @private */ constructor(mf) { this.plural = function (value, offset, lcfunc, data, isOrdinal) { if ({}.hasOwnProperty.call(data, value)) return data[value]; if (offset) value -= offset; var key = lcfunc(value, isOrdinal); return key in data ? data[key] : data.other; }; this.select = function (value, data) { return {}.hasOwnProperty.call(data, value) ? data[value] : data.other; }; this.mf = mf; this.setStrictNumber(mf.options.strictNumberSign); } /** Utility function for `{N, plural|selectordinal, ...}` * * @param {number} value - The key to use to find a pluralization rule * @param {number} offset - An offset to apply to `value` * @param {function} lcfunc - A locale function from `pluralFuncs` * @param {Object.<string,string>} data - The object from which results are looked up * @param {?boolean} isOrdinal - If true, use ordinal rather than cardinal rules * @returns {string} The result of the pluralization */ /** Set how strictly the {@link number} method parses its input. * * According to the ICU MessageFormat spec, `#` can only be used to replace a * number input of a `plural` statement. By default, messageformat does not * throw a runtime error if you use non-numeric argument with a `plural` rule, * unless rule also includes a non-zero `offset`. * * This is called by {@link MessageFormat#setStrictNumberSign} to follow the * stricter ICU MessageFormat spec. * * @private * @param {boolean} [enable=false] */ setStrictNumber(enable) { this.number = enable ? Runtime.strictNumber : Runtime.defaultNumber; } /** @private */ toString(pluralFuncs, compiler) { function _stringify(o, level) { if (typeof o != 'object') { const funcStr = o.toString().replace(/^(function )\w*/, '$1'); const funcIndent = /([ \t]*)\S.*$/.exec(funcStr); return funcIndent ? funcStr.replace(new RegExp('^' + funcIndent[1], 'mg'), '') : funcStr; } const s = []; for (let i in o) { const v = _stringify(o[i], level + 1); s.push(level === 0 ? `var ${i} = ${v};\n` : `${(0, _utils.propname)(i)}: ${v}`); } if (level === 0) return s.join(''); if (s.length === 0) return '{}'; let indent = ' '; while (--level) indent += ' '; const oc = s.join(',\n').replace(/^/gm, indent); return `{\n${oc}\n}`; } const obj = {}; const lcKeys = Object.keys(compiler.locales); for (let i = 0; i < lcKeys.length; ++i) { const lc = lcKeys[i]; obj[(0, _utils.funcname)(lc)] = pluralFuncs[lc]; } const rtKeys = Object.keys(compiler.runtime); for (let i = 0; i < rtKeys.length; ++i) { const fn = rtKeys[i]; obj[fn] = this[fn]; } const fmtKeys = Object.keys(compiler.formatters); if (fmtKeys.length > 0) { obj.fmt = {}; for (let i = 0; i < fmtKeys.length; ++i) { const fk = fmtKeys[i]; obj.fmt[fk] = this.mf.fmt[fk]; } } return _stringify(obj, 0); } } exports.default = Runtime; Runtime.defaultNumber = function (value, name, offset) { if (!offset) return value; if (isNaN(value)) throw new Error("Can't apply offset:" + offset + ' to argument `' + name + '` with non-numerical value ' + JSON.stringify(value) + '.'); return value - offset; }; Runtime.strictNumber = function (value, name, offset) { if (isNaN(value)) throw new Error('Argument `' + name + '` has non-numerical value ' + JSON.stringify(value) + '.'); return value - (offset || 0); };