180 lines
4.1 KiB
JavaScript
180 lines
4.1 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 = {
|
|
'&': '&',
|
|
'<': '<',
|
|
'>': '>',
|
|
'"': '"',
|
|
"'": '''
|
|
};
|
|
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 = {};
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Transforms hyphen case variable into camel case.
|
|
*
|
|
* @param {String} string Hyphen case string
|
|
* @return {String} Camel case string
|
|
* @static
|
|
* @private
|
|
*/
|
|
exports.hyphenToCamel = function (str) {
|
|
return str.replace(/-[a-z]/g, function (match) { return match[1].toUpperCase(); });
|
|
};
|