| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 | /* * EJS Embedded JavaScript templates * Copyright 2112 Matthew Eernisse (mde@fleegix.org) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *         http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. **//** * Private utility functions * @module utils * @private */'use strict';var regExpChars = /[|\\{}()[\]^$+*?.]/g;/** * Escape characters reserved in regular expressions. * * If `string` is `undefined` or `null`, the empty string is returned. * * @param {String} string Input string * @return {String} Escaped string * @static * @private */exports.escapeRegExpChars = function (string) {  // istanbul ignore if  if (!string) {    return '';  }  return String(string).replace(regExpChars, '\\$&');};var _ENCODE_HTML_RULES = {  '&': '&',  '<': '<',  '>': '>',  '"': '"',  "'": '''};var _MATCH_HTML = /[&<>'"]/g;function encode_char(c) {  return _ENCODE_HTML_RULES[c] || c;}/** * Stringified version of constants used by {@link module:utils.escapeXML}. * * It is used in the process of generating {@link ClientFunction}s. * * @readonly * @type {String} */var escapeFuncStr =  'var _ENCODE_HTML_RULES = {\n'+ '      "&": "&"\n'+ '    , "<": "<"\n'+ '    , ">": ">"\n'+ '    , \'"\': """\n'+ '    , "\'": "'"\n'+ '    }\n'+ '  , _MATCH_HTML = /[&<>\'"]/g;\n'+ 'function encode_char(c) {\n'+ '  return _ENCODE_HTML_RULES[c] || c;\n'+ '};\n';/** * Escape characters reserved in XML. * * If `markup` is `undefined` or `null`, the empty string is returned. * * @implements {EscapeCallback} * @param {String} markup Input string * @return {String} Escaped string * @static * @private */exports.escapeXML = function (markup) {  return markup == undefined    ? ''    : String(markup)      .replace(_MATCH_HTML, encode_char);};exports.escapeXML.toString = function () {  return Function.prototype.toString.call(this) + ';\n' + escapeFuncStr;};/** * Naive copy of properties from one object to another. * Does not recurse into non-scalar properties * Does not check to see if the property has a value before copying * * @param  {Object} to   Destination object * @param  {Object} from Source object * @return {Object}      Destination object * @static * @private */exports.shallowCopy = function (to, from) {  from = from || {};  for (var p in from) {    to[p] = from[p];  }  return to;};/** * Naive copy of a list of key names, from one object to another. * Only copies property if it is actually defined * Does not recurse into non-scalar properties * * @param  {Object} to   Destination object * @param  {Object} from Source object * @param  {Array} list List of properties to copy * @return {Object}      Destination object * @static * @private */exports.shallowCopyFromList = function (to, from, list) {  for (var i = 0; i < list.length; i++) {    var p = list[i];    if (typeof from[p] != 'undefined') {      to[p] = from[p];    }  }  return to;};/** * Simple in-process cache implementation. Does not implement limits of any * sort. * * @implements Cache * @static * @private */exports.cache = {  _data: {},  set: function (key, val) {    this._data[key] = val;  },  get: function (key) {    return this._data[key];  },  remove: function (key) {    delete this._data[key];  },  reset: function () {    this._data = {};  }};
 |