all files / src/ index.js

100% Statements 26/26
100% Branches 8/8
100% Functions 8/8
100% Lines 26/26
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                                27×           10×           16×         16×       16×   16× 44× 44×   44×   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 = {
   '&': '&amp;',
   '<': '&lt;',
   '>': '&gt;',
   '"': '&quot;',
   "'": '&#x27;', // eslint-disable-line quotes
   '`': '&#x60;',
};
 
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);
      }, '');
   };
};