UNPKG

deep-utils

Version:

Bunch of utils for deepjs and related.

93 lines (92 loc) 2.44 kB
/** * @author Gilles Coomans <gilles.coomans@gmail.com> * * interpret a string with a context. (ultra-fast) * * @example * var interpreted = interpret("hello { name }", { name:"john" }); // hello john * * @example * // equivalent of first example, but through deep-chain API * var interpreted = deep.nodes("hello { name }").interpret({ name:"john" }).val(); // hello john * * * @example * var interpreted = interpret("hello { name | 'dear '+id } - { address.zip }", { id:"john", address:{ zip:1000 } }); * // hello dear john - 1000 * * * @method interpret * @category stringUtils * @static * @param {String} string the string to interpret * @param {Object} context the context to inject * @return {String} the interpreted string */ if (typeof define !== 'function') { var define = require('amdefine')(module); } define(["require", "../index"], function(require, utils) { utils.interpret = function(string, context) { var count = string.indexOf('{'); if (count == -1) return string; var parsed = string.substring(0, count); count++; var ln = string.length; while (count < ln) { var terms = []; var cur = string[count]; var toAnalyse = ""; while (count < ln && cur != '}' && cur != '|') { if (cur == "+") { terms.push(toAnalyse); toAnalyse = ""; } else if (cur == "'") { var end = string.indexOf("'", count + 1); toAnalyse = string.substring(count, end); count = end; } else if (cur != ' ') toAnalyse += cur; cur = string[++count]; } terms.push(toAnalyse); var isOr = (string[count] == '|'); if (string[count] == '}' || isOr) { var val = null; for (var i = 0; i < terms.length; ++i) { toAnalyse = terms[i]; if (toAnalyse[0] == "'") { if (i === 0) val = toAnalyse.substring(1); else val += toAnalyse.substring(1); } else { if (i === 0) val = utils.fromPath(context, toAnalyse, "."); else val += utils.fromPath(context, toAnalyse, "."); if (val && val.forEach) val = val.join(","); } if (!val) break; } if (val) { parsed += val; if (isOr) count = string.indexOf('}', count); } count++; if (!val && isOr) continue; } while (count < ln && string[count] != '{') parsed += string[count++]; if (string[count] == '{') count++; } return parsed; }; return utils; });