1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | 1× 1× 1× 1× 27× 1× 9× 9× 5× 10× 4× 1× 16× 16× 16× 16× 44× 44× 44× 9× 9× 35× 19× 16× 15× 69× | 'use strict'; var _ = require('./lodash'), // our local, smaller version DEFAULT_SETTINGS, ESCAPE_ENTITIES; DEFAULT_SETTINGS = { escape: /<%-([\s\S]+?)%>/g, interpolate: /<%=([\s\S]+?)%>/g, }; ESCAPE_ENTITIES = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''', // eslint-disable-line quotes '`': '`', }; function getValue(path, data) { return _.get(data, _.trim(path), ''); } function escapeHTML(str) { var pattern = '(?:' + _.keys(ESCAPE_ENTITIES).join('|') + ')', testRegExp = new RegExp(pattern), replaceRegExp = new RegExp(pattern, 'g'); if (testRegExp.test(str)) { return str.replace(replaceRegExp, function(match) { return ESCAPE_ENTITIES[match]; }); } return str; } module.exports = function(text, userSettings) { var parts = [], index = 0, settings = _.defaults({}, userSettings, DEFAULT_SETTINGS), regExpPattern, matcher; regExpPattern = [ settings.escape.source, settings.interpolate.source, ]; matcher = new RegExp(regExpPattern.join('|') + '|$', 'g'); text.replace(matcher, function(match, escape, interpolate, offset) { parts.push(text.slice(index, offset)); index = offset + match.length; if (escape) { parts.push(function(data) { return escapeHTML(getValue(escape, data)); }); } else if (interpolate) { parts.push(getValue.bind(null, interpolate)); } }); return function(data) { return _.reduce(parts, function(str, part) { return str + (_.isFunction(part) ? part(data) : part); }, ''); }; }; |