136 lines
3.0 KiB
JavaScript
136 lines
3.0 KiB
JavaScript
/*
|
|
* 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 = {
|
|
'&': '&'
|
|
, '<': '<'
|
|
, '>': '>'
|
|
, '"': '"'
|
|
, "'": '''
|
|
}
|
|
, _MATCH_HTML = /[&<>\'"]/g;
|
|
|
|
/**
|
|
* 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';
|
|
|
|
/**
|
|
* 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, function(m) {
|
|
return _ENCODE_HTML_RULES[m] || m;
|
|
});
|
|
};
|
|
exports.escapeXML.toString = function () {
|
|
return Function.prototype.toString.call(this) + ';\n' + escapeFuncStr
|
|
};
|
|
|
|
/**
|
|
* Copy all properties from one object to another, in a shallow fashion.
|
|
*
|
|
* @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;
|
|
};
|
|
|
|
/**
|
|
* 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];
|
|
},
|
|
reset: function () {
|
|
this._data = {};
|
|
}
|
|
};
|
|
|