| /* | 
|  * 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 = {}; | 
|   } | 
| }; |