286 lines
11 KiB
JavaScript
286 lines
11 KiB
JavaScript
|
"use strict";
|
||
|
/**
|
||
|
* Copyright (C) 2016-2019 Michael Kourlas
|
||
|
*
|
||
|
* 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.
|
||
|
*/
|
||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||
|
/**
|
||
|
* Returns true if the specified string only contains characters permitted by
|
||
|
* the XML specification.
|
||
|
*
|
||
|
* @private
|
||
|
*/
|
||
|
function validateChar(str) {
|
||
|
for (var i = 0; i < str.length; i++) {
|
||
|
var firstChar = str.charCodeAt(i);
|
||
|
if (firstChar === 0x9 || firstChar === 0xA || firstChar === 0xD
|
||
|
|| (firstChar >= 0x20 && firstChar <= 0xD7FF)
|
||
|
|| (firstChar >= 0xE000 && firstChar <= 0xFFFD)) {
|
||
|
continue;
|
||
|
}
|
||
|
if (i + 1 === str.length) {
|
||
|
return false;
|
||
|
}
|
||
|
// UTF-16 surrogate characters
|
||
|
var secondChar = str.charCodeAt(i + 1);
|
||
|
if ((firstChar >= 0xD800 && firstChar <= 0xDBFF)
|
||
|
&& (secondChar >= 0xDC00 && secondChar <= 0xDFFF)) {
|
||
|
i++;
|
||
|
continue;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
exports.validateChar = validateChar;
|
||
|
/**
|
||
|
* Returns a version of the specified string that only contains characters
|
||
|
* permitted by the XML specification, with invalid characters replaced
|
||
|
* by the replacement character U+FFFD.
|
||
|
*
|
||
|
* @private
|
||
|
*/
|
||
|
function fixChar(str) {
|
||
|
var newStr = "";
|
||
|
for (var i = 0; i < str.length; i++) {
|
||
|
var firstChar = str.charCodeAt(i);
|
||
|
if (firstChar === 0x9 || firstChar === 0xA || firstChar === 0xD
|
||
|
|| (firstChar >= 0x20 && firstChar <= 0xD7FF)
|
||
|
|| (firstChar >= 0xE000 && firstChar <= 0xFFFD)) {
|
||
|
newStr += str[i];
|
||
|
continue;
|
||
|
}
|
||
|
if (i + 1 === str.length) {
|
||
|
newStr += "\uFFFD";
|
||
|
return newStr;
|
||
|
}
|
||
|
// UTF-16 surrogate characters
|
||
|
var secondChar = str.charCodeAt(i + 1);
|
||
|
if ((firstChar >= 0xD800 && firstChar <= 0xDBFF)
|
||
|
&& (secondChar >= 0xDC00 && secondChar <= 0xDFFF)) {
|
||
|
newStr += str[i] + str[i + 1];
|
||
|
i++;
|
||
|
continue;
|
||
|
}
|
||
|
newStr += "\uFFFD";
|
||
|
}
|
||
|
return newStr;
|
||
|
}
|
||
|
exports.fixChar = fixChar;
|
||
|
/**
|
||
|
* Returns true if the specified string only contains a single character, and
|
||
|
* that this character is permitted by the XML specification.
|
||
|
*
|
||
|
* @private
|
||
|
*/
|
||
|
function validateSingleChar(str) {
|
||
|
if (str.length === 0) {
|
||
|
return false;
|
||
|
}
|
||
|
var firstChar = str.charCodeAt(0);
|
||
|
if (str.length === 1) {
|
||
|
return (firstChar === 0x9 || firstChar === 0xA || firstChar === 0xD
|
||
|
|| (firstChar >= 0x20 && firstChar <= 0xD7FF)
|
||
|
|| (firstChar >= 0xE000 && firstChar <= 0xFFFD));
|
||
|
}
|
||
|
if (str.length !== 2) {
|
||
|
return false;
|
||
|
}
|
||
|
// UTF-16 surrogate characters
|
||
|
var secondChar = str.charCodeAt(1);
|
||
|
return ((firstChar >= 0xD800 && firstChar <= 0xDBFF)
|
||
|
&& (secondChar >= 0xDC00 && secondChar <= 0xDFFF));
|
||
|
}
|
||
|
exports.validateSingleChar = validateSingleChar;
|
||
|
/**
|
||
|
* Returns true if the specified string only contains characters permitted by
|
||
|
* the XML specification for names.
|
||
|
*
|
||
|
* @private
|
||
|
*/
|
||
|
function validateName(str) {
|
||
|
if (str.length === 0) {
|
||
|
return false;
|
||
|
}
|
||
|
var initialFirstChar = str.charCodeAt(0);
|
||
|
var initialFirstCharMatch = (initialFirstChar === 0x3A
|
||
|
|| initialFirstChar === 0x5F
|
||
|
|| (initialFirstChar >= 0x41 && initialFirstChar <= 0x5A)
|
||
|
|| (initialFirstChar >= 0x61 && initialFirstChar <= 0x7A)
|
||
|
|| (initialFirstChar >= 0xC0 && initialFirstChar <= 0xD6)
|
||
|
|| (initialFirstChar >= 0xD8 && initialFirstChar <= 0xF6)
|
||
|
|| (initialFirstChar >= 0XF8 && initialFirstChar <= 0X2FF)
|
||
|
|| (initialFirstChar >= 0x370 && initialFirstChar <= 0x37D)
|
||
|
|| (initialFirstChar >= 0x37F && initialFirstChar <= 0X1FFF)
|
||
|
|| (initialFirstChar >= 0x200C && initialFirstChar <= 0x200D)
|
||
|
|| (initialFirstChar >= 0x2070 && initialFirstChar <= 0x218F)
|
||
|
|| (initialFirstChar >= 0x2C00 && initialFirstChar <= 0x2FEF)
|
||
|
|| (initialFirstChar >= 0x3001 && initialFirstChar <= 0xD7FF)
|
||
|
|| (initialFirstChar >= 0xF900 && initialFirstChar <= 0xFDCF)
|
||
|
|| (initialFirstChar >= 0xFDF0 && initialFirstChar <= 0xFFFD));
|
||
|
if (str.length === 1) {
|
||
|
return initialFirstCharMatch;
|
||
|
}
|
||
|
// UTF-16 surrogate characters
|
||
|
var initialSecondChar = str.charCodeAt(1);
|
||
|
var initialSecondCharMatch = ((initialFirstChar >= 0xD800 && initialFirstChar <= 0xDB7F)
|
||
|
&& (initialSecondChar >= 0xDC00 && initialSecondChar <= 0xDFFF));
|
||
|
if (!initialFirstCharMatch && !initialSecondCharMatch) {
|
||
|
return false;
|
||
|
}
|
||
|
var start = initialSecondCharMatch ? 2 : 1;
|
||
|
for (var i = start; i < str.length; i++) {
|
||
|
var firstChar = str.charCodeAt(i);
|
||
|
if (firstChar === 0x3A
|
||
|
|| firstChar === 0x5F
|
||
|
|| firstChar === 0x2D
|
||
|
|| firstChar === 0x2E
|
||
|
|| firstChar === 0xB7
|
||
|
|| (firstChar >= 0x30 && firstChar <= 0x39)
|
||
|
|| (firstChar >= 0x41 && firstChar <= 0x5A)
|
||
|
|| (firstChar >= 0x61 && firstChar <= 0x7A)
|
||
|
|| (firstChar >= 0xC0 && firstChar <= 0xD6)
|
||
|
|| (firstChar >= 0xD8 && firstChar <= 0xF6)
|
||
|
|| (firstChar >= 0XF8 && firstChar <= 0X2FF)
|
||
|
|| (firstChar >= 0x300 && firstChar <= 0x36F)
|
||
|
|| (firstChar >= 0x370 && firstChar <= 0x37D)
|
||
|
|| (firstChar >= 0x37F && firstChar <= 0X1FFF)
|
||
|
|| (firstChar >= 0x200C && firstChar <= 0x200D)
|
||
|
|| (firstChar >= 0x203F && firstChar <= 0x2040)
|
||
|
|| (firstChar >= 0x2070 && firstChar <= 0x218F)
|
||
|
|| (firstChar >= 0x2C00 && firstChar <= 0x2FEF)
|
||
|
|| (firstChar >= 0x3001 && firstChar <= 0xD7FF)
|
||
|
|| (firstChar >= 0xF900 && firstChar <= 0xFDCF)
|
||
|
|| (firstChar >= 0xFDF0 && firstChar <= 0xFFFD)) {
|
||
|
continue;
|
||
|
}
|
||
|
if (i + 1 === str.length) {
|
||
|
return false;
|
||
|
}
|
||
|
// UTF-16 surrogate characters
|
||
|
var secondChar = str.charCodeAt(i + 1);
|
||
|
if ((firstChar >= 0xD800 && firstChar <= 0xDB7F)
|
||
|
&& (secondChar >= 0xDC00 && secondChar <= 0xDFFF)) {
|
||
|
i++;
|
||
|
continue;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
exports.validateName = validateName;
|
||
|
/**
|
||
|
* Returns a version of the specified string that only contains characters
|
||
|
* permitted by the XML specification for names, with invalid characters
|
||
|
* replaced by the replacement character U+FFFD.
|
||
|
*
|
||
|
* @private
|
||
|
*/
|
||
|
function fixName(str) {
|
||
|
var newStr = "";
|
||
|
if (str.length === 0) {
|
||
|
return newStr;
|
||
|
}
|
||
|
var initialFirstChar = str.charCodeAt(0);
|
||
|
var initialFirstCharMatch = (initialFirstChar === 0x3A
|
||
|
|| initialFirstChar === 0x5F
|
||
|
|| (initialFirstChar >= 0x41 && initialFirstChar <= 0x5A)
|
||
|
|| (initialFirstChar >= 0x61 && initialFirstChar <= 0x7A)
|
||
|
|| (initialFirstChar >= 0xC0 && initialFirstChar <= 0xD6)
|
||
|
|| (initialFirstChar >= 0xD8 && initialFirstChar <= 0xF6)
|
||
|
|| (initialFirstChar >= 0XF8 && initialFirstChar <= 0X2FF)
|
||
|
|| (initialFirstChar >= 0x370 && initialFirstChar <= 0x37D)
|
||
|
|| (initialFirstChar >= 0x37F && initialFirstChar <= 0X1FFF)
|
||
|
|| (initialFirstChar >= 0x200C && initialFirstChar <= 0x200D)
|
||
|
|| (initialFirstChar >= 0x2070 && initialFirstChar <= 0x218F)
|
||
|
|| (initialFirstChar >= 0x2C00 && initialFirstChar <= 0x2FEF)
|
||
|
|| (initialFirstChar >= 0x3001 && initialFirstChar <= 0xD7FF)
|
||
|
|| (initialFirstChar >= 0xF900 && initialFirstChar <= 0xFDCF)
|
||
|
|| (initialFirstChar >= 0xFDF0 && initialFirstChar <= 0xFFFD));
|
||
|
if (str.length === 1) {
|
||
|
if (initialFirstCharMatch) {
|
||
|
newStr = str[0];
|
||
|
}
|
||
|
else {
|
||
|
newStr = "\uFFFD";
|
||
|
}
|
||
|
return newStr;
|
||
|
}
|
||
|
// UTF-16 surrogate characters
|
||
|
var initialSecondChar = str.charCodeAt(1);
|
||
|
var initialSecondCharMatch = ((initialFirstChar >= 0xD800 && initialFirstChar <= 0xDB7F)
|
||
|
&& (initialSecondChar >= 0xDC00 && initialSecondChar <= 0xDFFF));
|
||
|
if (initialSecondCharMatch) {
|
||
|
newStr = str[0] + str[1];
|
||
|
}
|
||
|
else if (initialFirstCharMatch) {
|
||
|
newStr = str[0];
|
||
|
}
|
||
|
else {
|
||
|
newStr = "\uFFFD";
|
||
|
}
|
||
|
var start = initialSecondCharMatch ? 2 : 1;
|
||
|
for (var i = start; i < str.length; i++) {
|
||
|
var firstChar = str.charCodeAt(i);
|
||
|
if (firstChar === 0x3A
|
||
|
|| firstChar === 0x5F
|
||
|
|| firstChar === 0x2D
|
||
|
|| firstChar === 0x2E
|
||
|
|| firstChar === 0xB7
|
||
|
|| (firstChar >= 0x30 && firstChar <= 0x39)
|
||
|
|| (firstChar >= 0x41 && firstChar <= 0x5A)
|
||
|
|| (firstChar >= 0x61 && firstChar <= 0x7A)
|
||
|
|| (firstChar >= 0xC0 && firstChar <= 0xD6)
|
||
|
|| (firstChar >= 0xD8 && firstChar <= 0xF6)
|
||
|
|| (firstChar >= 0XF8 && firstChar <= 0X2FF)
|
||
|
|| (firstChar >= 0x300 && firstChar <= 0x36F)
|
||
|
|| (firstChar >= 0x370 && firstChar <= 0x37D)
|
||
|
|| (firstChar >= 0x37F && firstChar <= 0X1FFF)
|
||
|
|| (firstChar >= 0x200C && firstChar <= 0x200D)
|
||
|
|| (firstChar >= 0x203F && firstChar <= 0x2040)
|
||
|
|| (firstChar >= 0x2070 && firstChar <= 0x218F)
|
||
|
|| (firstChar >= 0x2C00 && firstChar <= 0x2FEF)
|
||
|
|| (firstChar >= 0x3001 && firstChar <= 0xD7FF)
|
||
|
|| (firstChar >= 0xF900 && firstChar <= 0xFDCF)
|
||
|
|| (firstChar >= 0xFDF0 && firstChar <= 0xFFFD)) {
|
||
|
newStr += str[i];
|
||
|
continue;
|
||
|
}
|
||
|
if (i + 1 === str.length) {
|
||
|
newStr += "\uFFFD";
|
||
|
return newStr;
|
||
|
}
|
||
|
// UTF-16 surrogate characters
|
||
|
var secondChar = str.charCodeAt(i + 1);
|
||
|
if ((firstChar >= 0xD800 && firstChar <= 0xDB7F)
|
||
|
&& (secondChar >= 0xDC00 && secondChar <= 0xDFFF)) {
|
||
|
newStr += str[i] + str[i + 1];
|
||
|
i++;
|
||
|
continue;
|
||
|
}
|
||
|
newStr += "\uFFFD";
|
||
|
}
|
||
|
return newStr;
|
||
|
}
|
||
|
exports.fixName = fixName;
|
||
|
/**
|
||
|
* Returns true if the specified value is undefined.
|
||
|
*
|
||
|
* @private
|
||
|
*/
|
||
|
function isUndefined(val) {
|
||
|
return Object.prototype.toString.call(val) === "[object Undefined]";
|
||
|
}
|
||
|
exports.isUndefined = isUndefined;
|