You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
226 lines
5.2 KiB
226 lines
5.2 KiB
2 years ago
|
/*
|
||
|
* 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;
|
||
|
var hasOwnProperty = Object.prototype.hasOwnProperty;
|
||
|
var hasOwn = function (obj, key) { return hasOwnProperty.apply(obj, [key]); };
|
||
|
|
||
|
/**
|
||
|
* 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 || {};
|
||
|
if ((to !== null) && (to !== undefined)) {
|
||
|
for (var p in from) {
|
||
|
if (!hasOwn(from, p)) {
|
||
|
continue;
|
||
|
}
|
||
|
if (p === '__proto__' || p === 'constructor') {
|
||
|
continue;
|
||
|
}
|
||
|
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) {
|
||
|
list = list || [];
|
||
|
from = from || {};
|
||
|
if ((to !== null) && (to !== undefined)) {
|
||
|
for (var i = 0; i < list.length; i++) {
|
||
|
var p = list[i];
|
||
|
if (typeof from[p] != 'undefined') {
|
||
|
if (!hasOwn(from, p)) {
|
||
|
continue;
|
||
|
}
|
||
|
if (p === '__proto__' || p === 'constructor') {
|
||
|
continue;
|
||
|
}
|
||
|
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(); });
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Returns a null-prototype object in runtimes that support it
|
||
|
*
|
||
|
* @return {Object} Object, prototype will be set to null where possible
|
||
|
* @static
|
||
|
* @private
|
||
|
*/
|
||
|
exports.createNullProtoObjWherePossible = (function () {
|
||
|
if (typeof Object.create == 'function') {
|
||
|
return function () {
|
||
|
return Object.create(null);
|
||
|
};
|
||
|
}
|
||
|
if (!({__proto__: null} instanceof Object)) {
|
||
|
return function () {
|
||
|
return {__proto__: null};
|
||
|
};
|
||
|
}
|
||
|
// Not possible, just pass through
|
||
|
return function () {
|
||
|
return {};
|
||
|
};
|
||
|
})();
|
||
|
|
||
|
|