mirror of
https://gitee.com/myxzgzs/boyue_jnpf.git
synced 2025-08-11 16:52:42 +08:00
7457 lines
196 KiB
JavaScript
7457 lines
196 KiB
JavaScript
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.plist = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
|
||
(function (Buffer){(function (){
|
||
/**
|
||
* Module dependencies.
|
||
*/
|
||
|
||
const { DOMParser } = require('@xmldom/xmldom');
|
||
|
||
/**
|
||
* Module exports.
|
||
*/
|
||
|
||
exports.parse = parse;
|
||
|
||
var TEXT_NODE = 3;
|
||
var CDATA_NODE = 4;
|
||
var COMMENT_NODE = 8;
|
||
|
||
|
||
/**
|
||
* We ignore raw text (usually whitespace), <!-- xml comments -->,
|
||
* and raw CDATA nodes.
|
||
*
|
||
* @param {Element} node
|
||
* @returns {Boolean}
|
||
* @api private
|
||
*/
|
||
|
||
function shouldIgnoreNode (node) {
|
||
return node.nodeType === TEXT_NODE
|
||
|| node.nodeType === COMMENT_NODE
|
||
|| node.nodeType === CDATA_NODE;
|
||
}
|
||
|
||
/**
|
||
* Check if the node is empty. Some plist file has such node:
|
||
* <key />
|
||
* this node shoud be ignored.
|
||
*
|
||
* @see https://github.com/TooTallNate/plist.js/issues/66
|
||
* @param {Element} node
|
||
* @returns {Boolean}
|
||
* @api private
|
||
*/
|
||
function isEmptyNode(node){
|
||
if(!node.childNodes || node.childNodes.length === 0) {
|
||
return true;
|
||
} else {
|
||
return false;
|
||
}
|
||
}
|
||
|
||
function invariant(test, message) {
|
||
if (!test) {
|
||
throw new Error(message);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Parses a Plist XML string. Returns an Object.
|
||
*
|
||
* @param {String} xml - the XML String to decode
|
||
* @returns {Mixed} the decoded value from the Plist XML
|
||
* @api public
|
||
*/
|
||
|
||
function parse (xml) {
|
||
var doc = new DOMParser().parseFromString(xml);
|
||
invariant(
|
||
doc.documentElement.nodeName === 'plist',
|
||
'malformed document. First element should be <plist>'
|
||
);
|
||
var plist = parsePlistXML(doc.documentElement);
|
||
|
||
// the root <plist> node gets interpreted as an Array,
|
||
// so pull out the inner data first
|
||
if (plist.length == 1) plist = plist[0];
|
||
|
||
return plist;
|
||
}
|
||
|
||
/**
|
||
* Convert an XML based plist document into a JSON representation.
|
||
*
|
||
* @param {Object} xml_node - current XML node in the plist
|
||
* @returns {Mixed} built up JSON object
|
||
* @api private
|
||
*/
|
||
|
||
function parsePlistXML (node) {
|
||
var i, new_obj, key, val, new_arr, res, counter, type;
|
||
|
||
if (!node)
|
||
return null;
|
||
|
||
if (node.nodeName === 'plist') {
|
||
new_arr = [];
|
||
if (isEmptyNode(node)) {
|
||
return new_arr;
|
||
}
|
||
for (i=0; i < node.childNodes.length; i++) {
|
||
if (!shouldIgnoreNode(node.childNodes[i])) {
|
||
new_arr.push( parsePlistXML(node.childNodes[i]));
|
||
}
|
||
}
|
||
return new_arr;
|
||
} else if (node.nodeName === 'dict') {
|
||
new_obj = {};
|
||
key = null;
|
||
counter = 0;
|
||
if (isEmptyNode(node)) {
|
||
return new_obj;
|
||
}
|
||
for (i=0; i < node.childNodes.length; i++) {
|
||
if (shouldIgnoreNode(node.childNodes[i])) continue;
|
||
if (counter % 2 === 0) {
|
||
invariant(
|
||
node.childNodes[i].nodeName === 'key',
|
||
'Missing key while parsing <dict/>.'
|
||
);
|
||
key = parsePlistXML(node.childNodes[i]);
|
||
} else {
|
||
invariant(
|
||
node.childNodes[i].nodeName !== 'key',
|
||
'Unexpected key "'
|
||
+ parsePlistXML(node.childNodes[i])
|
||
+ '" while parsing <dict/>.'
|
||
);
|
||
new_obj[key] = parsePlistXML(node.childNodes[i]);
|
||
}
|
||
counter += 1;
|
||
}
|
||
if (counter % 2 === 1) {
|
||
new_obj[key] = '';
|
||
}
|
||
|
||
return new_obj;
|
||
|
||
} else if (node.nodeName === 'array') {
|
||
new_arr = [];
|
||
if (isEmptyNode(node)) {
|
||
return new_arr;
|
||
}
|
||
for (i=0; i < node.childNodes.length; i++) {
|
||
if (!shouldIgnoreNode(node.childNodes[i])) {
|
||
res = parsePlistXML(node.childNodes[i]);
|
||
if (null != res) new_arr.push(res);
|
||
}
|
||
}
|
||
return new_arr;
|
||
|
||
} else if (node.nodeName === '#text') {
|
||
// TODO: what should we do with text types? (CDATA sections)
|
||
|
||
} else if (node.nodeName === 'key') {
|
||
if (isEmptyNode(node)) {
|
||
return '';
|
||
}
|
||
|
||
invariant(
|
||
node.childNodes[0].nodeValue !== '__proto__',
|
||
'__proto__ keys can lead to prototype pollution. More details on CVE-2022-22912'
|
||
);
|
||
|
||
return node.childNodes[0].nodeValue;
|
||
} else if (node.nodeName === 'string') {
|
||
res = '';
|
||
if (isEmptyNode(node)) {
|
||
return res;
|
||
}
|
||
for (i=0; i < node.childNodes.length; i++) {
|
||
var type = node.childNodes[i].nodeType;
|
||
if (type === TEXT_NODE || type === CDATA_NODE) {
|
||
res += node.childNodes[i].nodeValue;
|
||
}
|
||
}
|
||
return res;
|
||
|
||
} else if (node.nodeName === 'integer') {
|
||
invariant(
|
||
!isEmptyNode(node),
|
||
'Cannot parse "" as integer.'
|
||
);
|
||
return parseInt(node.childNodes[0].nodeValue, 10);
|
||
|
||
} else if (node.nodeName === 'real') {
|
||
invariant(
|
||
!isEmptyNode(node),
|
||
'Cannot parse "" as real.'
|
||
);
|
||
res = '';
|
||
for (i=0; i < node.childNodes.length; i++) {
|
||
if (node.childNodes[i].nodeType === TEXT_NODE) {
|
||
res += node.childNodes[i].nodeValue;
|
||
}
|
||
}
|
||
return parseFloat(res);
|
||
|
||
} else if (node.nodeName === 'data') {
|
||
res = '';
|
||
if (isEmptyNode(node)) {
|
||
return Buffer.from(res, 'base64');
|
||
}
|
||
for (i=0; i < node.childNodes.length; i++) {
|
||
if (node.childNodes[i].nodeType === TEXT_NODE) {
|
||
res += node.childNodes[i].nodeValue.replace(/\s+/g, '');
|
||
}
|
||
}
|
||
return Buffer.from(res, 'base64');
|
||
|
||
} else if (node.nodeName === 'date') {
|
||
invariant(
|
||
!isEmptyNode(node),
|
||
'Cannot parse "" as Date.'
|
||
)
|
||
return new Date(node.childNodes[0].nodeValue);
|
||
|
||
} else if (node.nodeName === 'null') {
|
||
return null;
|
||
|
||
} else if (node.nodeName === 'true') {
|
||
return true;
|
||
|
||
} else if (node.nodeName === 'false') {
|
||
return false;
|
||
} else {
|
||
throw new Error('Invalid PLIST tag ' + node.nodeName);
|
||
}
|
||
}
|
||
|
||
}).call(this)}).call(this,require("buffer").Buffer)
|
||
},{"@xmldom/xmldom":6,"buffer":9}],2:[function(require,module,exports){
|
||
'use strict'
|
||
|
||
/**
|
||
* Ponyfill for `Array.prototype.find` which is only available in ES6 runtimes.
|
||
*
|
||
* Works with anything that has a `length` property and index access properties, including NodeList.
|
||
*
|
||
* @template {unknown} T
|
||
* @param {Array<T> | ({length:number, [number]: T})} list
|
||
* @param {function (item: T, index: number, list:Array<T> | ({length:number, [number]: T})):boolean} predicate
|
||
* @param {Partial<Pick<ArrayConstructor['prototype'], 'find'>>?} ac `Array.prototype` by default,
|
||
* allows injecting a custom implementation in tests
|
||
* @returns {T | undefined}
|
||
*
|
||
* @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find
|
||
* @see https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.find
|
||
*/
|
||
function find(list, predicate, ac) {
|
||
if (ac === undefined) {
|
||
ac = Array.prototype;
|
||
}
|
||
if (list && typeof ac.find === 'function') {
|
||
return ac.find.call(list, predicate);
|
||
}
|
||
for (var i = 0; i < list.length; i++) {
|
||
if (Object.prototype.hasOwnProperty.call(list, i)) {
|
||
var item = list[i];
|
||
if (predicate.call(undefined, item, i, list)) {
|
||
return item;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* "Shallow freezes" an object to render it immutable.
|
||
* Uses `Object.freeze` if available,
|
||
* otherwise the immutability is only in the type.
|
||
*
|
||
* Is used to create "enum like" objects.
|
||
*
|
||
* @template T
|
||
* @param {T} object the object to freeze
|
||
* @param {Pick<ObjectConstructor, 'freeze'> = Object} oc `Object` by default,
|
||
* allows to inject custom object constructor for tests
|
||
* @returns {Readonly<T>}
|
||
*
|
||
* @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze
|
||
*/
|
||
function freeze(object, oc) {
|
||
if (oc === undefined) {
|
||
oc = Object
|
||
}
|
||
return oc && typeof oc.freeze === 'function' ? oc.freeze(object) : object
|
||
}
|
||
|
||
/**
|
||
* Since we can not rely on `Object.assign` we provide a simplified version
|
||
* that is sufficient for our needs.
|
||
*
|
||
* @param {Object} target
|
||
* @param {Object | null | undefined} source
|
||
*
|
||
* @returns {Object} target
|
||
* @throws TypeError if target is not an object
|
||
*
|
||
* @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
|
||
* @see https://tc39.es/ecma262/multipage/fundamental-objects.html#sec-object.assign
|
||
*/
|
||
function assign(target, source) {
|
||
if (target === null || typeof target !== 'object') {
|
||
throw new TypeError('target is not an object')
|
||
}
|
||
for (var key in source) {
|
||
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
||
target[key] = source[key]
|
||
}
|
||
}
|
||
return target
|
||
}
|
||
|
||
/**
|
||
* All mime types that are allowed as input to `DOMParser.parseFromString`
|
||
*
|
||
* @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString#Argument02 MDN
|
||
* @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#domparsersupportedtype WHATWG HTML Spec
|
||
* @see DOMParser.prototype.parseFromString
|
||
*/
|
||
var MIME_TYPE = freeze({
|
||
/**
|
||
* `text/html`, the only mime type that triggers treating an XML document as HTML.
|
||
*
|
||
* @see DOMParser.SupportedType.isHTML
|
||
* @see https://www.iana.org/assignments/media-types/text/html IANA MimeType registration
|
||
* @see https://en.wikipedia.org/wiki/HTML Wikipedia
|
||
* @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString MDN
|
||
* @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#dom-domparser-parsefromstring WHATWG HTML Spec
|
||
*/
|
||
HTML: 'text/html',
|
||
|
||
/**
|
||
* Helper method to check a mime type if it indicates an HTML document
|
||
*
|
||
* @param {string} [value]
|
||
* @returns {boolean}
|
||
*
|
||
* @see https://www.iana.org/assignments/media-types/text/html IANA MimeType registration
|
||
* @see https://en.wikipedia.org/wiki/HTML Wikipedia
|
||
* @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString MDN
|
||
* @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#dom-domparser-parsefromstring */
|
||
isHTML: function (value) {
|
||
return value === MIME_TYPE.HTML
|
||
},
|
||
|
||
/**
|
||
* `application/xml`, the standard mime type for XML documents.
|
||
*
|
||
* @see https://www.iana.org/assignments/media-types/application/xml IANA MimeType registration
|
||
* @see https://tools.ietf.org/html/rfc7303#section-9.1 RFC 7303
|
||
* @see https://en.wikipedia.org/wiki/XML_and_MIME Wikipedia
|
||
*/
|
||
XML_APPLICATION: 'application/xml',
|
||
|
||
/**
|
||
* `text/html`, an alias for `application/xml`.
|
||
*
|
||
* @see https://tools.ietf.org/html/rfc7303#section-9.2 RFC 7303
|
||
* @see https://www.iana.org/assignments/media-types/text/xml IANA MimeType registration
|
||
* @see https://en.wikipedia.org/wiki/XML_and_MIME Wikipedia
|
||
*/
|
||
XML_TEXT: 'text/xml',
|
||
|
||
/**
|
||
* `application/xhtml+xml`, indicates an XML document that has the default HTML namespace,
|
||
* but is parsed as an XML document.
|
||
*
|
||
* @see https://www.iana.org/assignments/media-types/application/xhtml+xml IANA MimeType registration
|
||
* @see https://dom.spec.whatwg.org/#dom-domimplementation-createdocument WHATWG DOM Spec
|
||
* @see https://en.wikipedia.org/wiki/XHTML Wikipedia
|
||
*/
|
||
XML_XHTML_APPLICATION: 'application/xhtml+xml',
|
||
|
||
/**
|
||
* `image/svg+xml`,
|
||
*
|
||
* @see https://www.iana.org/assignments/media-types/image/svg+xml IANA MimeType registration
|
||
* @see https://www.w3.org/TR/SVG11/ W3C SVG 1.1
|
||
* @see https://en.wikipedia.org/wiki/Scalable_Vector_Graphics Wikipedia
|
||
*/
|
||
XML_SVG_IMAGE: 'image/svg+xml',
|
||
})
|
||
|
||
/**
|
||
* Namespaces that are used in this code base.
|
||
*
|
||
* @see http://www.w3.org/TR/REC-xml-names
|
||
*/
|
||
var NAMESPACE = freeze({
|
||
/**
|
||
* The XHTML namespace.
|
||
*
|
||
* @see http://www.w3.org/1999/xhtml
|
||
*/
|
||
HTML: 'http://www.w3.org/1999/xhtml',
|
||
|
||
/**
|
||
* Checks if `uri` equals `NAMESPACE.HTML`.
|
||
*
|
||
* @param {string} [uri]
|
||
*
|
||
* @see NAMESPACE.HTML
|
||
*/
|
||
isHTML: function (uri) {
|
||
return uri === NAMESPACE.HTML
|
||
},
|
||
|
||
/**
|
||
* The SVG namespace.
|
||
*
|
||
* @see http://www.w3.org/2000/svg
|
||
*/
|
||
SVG: 'http://www.w3.org/2000/svg',
|
||
|
||
/**
|
||
* The `xml:` namespace.
|
||
*
|
||
* @see http://www.w3.org/XML/1998/namespace
|
||
*/
|
||
XML: 'http://www.w3.org/XML/1998/namespace',
|
||
|
||
/**
|
||
* The `xmlns:` namespace
|
||
*
|
||
* @see https://www.w3.org/2000/xmlns/
|
||
*/
|
||
XMLNS: 'http://www.w3.org/2000/xmlns/',
|
||
})
|
||
|
||
exports.assign = assign;
|
||
exports.find = find;
|
||
exports.freeze = freeze;
|
||
exports.MIME_TYPE = MIME_TYPE;
|
||
exports.NAMESPACE = NAMESPACE;
|
||
|
||
},{}],3:[function(require,module,exports){
|
||
var conventions = require("./conventions");
|
||
var dom = require('./dom')
|
||
var entities = require('./entities');
|
||
var sax = require('./sax');
|
||
|
||
var DOMImplementation = dom.DOMImplementation;
|
||
|
||
var NAMESPACE = conventions.NAMESPACE;
|
||
|
||
var ParseError = sax.ParseError;
|
||
var XMLReader = sax.XMLReader;
|
||
|
||
/**
|
||
* Normalizes line ending according to https://www.w3.org/TR/xml11/#sec-line-ends:
|
||
*
|
||
* > XML parsed entities are often stored in computer files which,
|
||
* > for editing convenience, are organized into lines.
|
||
* > These lines are typically separated by some combination
|
||
* > of the characters CARRIAGE RETURN (#xD) and LINE FEED (#xA).
|
||
* >
|
||
* > To simplify the tasks of applications, the XML processor must behave
|
||
* > as if it normalized all line breaks in external parsed entities (including the document entity)
|
||
* > on input, before parsing, by translating all of the following to a single #xA character:
|
||
* >
|
||
* > 1. the two-character sequence #xD #xA
|
||
* > 2. the two-character sequence #xD #x85
|
||
* > 3. the single character #x85
|
||
* > 4. the single character #x2028
|
||
* > 5. any #xD character that is not immediately followed by #xA or #x85.
|
||
*
|
||
* @param {string} input
|
||
* @returns {string}
|
||
*/
|
||
function normalizeLineEndings(input) {
|
||
return input
|
||
.replace(/\r[\n\u0085]/g, '\n')
|
||
.replace(/[\r\u0085\u2028]/g, '\n')
|
||
}
|
||
|
||
/**
|
||
* @typedef Locator
|
||
* @property {number} [columnNumber]
|
||
* @property {number} [lineNumber]
|
||
*/
|
||
|
||
/**
|
||
* @typedef DOMParserOptions
|
||
* @property {DOMHandler} [domBuilder]
|
||
* @property {Function} [errorHandler]
|
||
* @property {(string) => string} [normalizeLineEndings] used to replace line endings before parsing
|
||
* defaults to `normalizeLineEndings`
|
||
* @property {Locator} [locator]
|
||
* @property {Record<string, string>} [xmlns]
|
||
*
|
||
* @see normalizeLineEndings
|
||
*/
|
||
|
||
/**
|
||
* The DOMParser interface provides the ability to parse XML or HTML source code
|
||
* from a string into a DOM `Document`.
|
||
*
|
||
* _xmldom is different from the spec in that it allows an `options` parameter,
|
||
* to override the default behavior._
|
||
*
|
||
* @param {DOMParserOptions} [options]
|
||
* @constructor
|
||
*
|
||
* @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser
|
||
* @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#dom-parsing-and-serialization
|
||
*/
|
||
function DOMParser(options){
|
||
this.options = options ||{locator:{}};
|
||
}
|
||
|
||
DOMParser.prototype.parseFromString = function(source,mimeType){
|
||
var options = this.options;
|
||
var sax = new XMLReader();
|
||
var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler
|
||
var errorHandler = options.errorHandler;
|
||
var locator = options.locator;
|
||
var defaultNSMap = options.xmlns||{};
|
||
var isHTML = /\/x?html?$/.test(mimeType);//mimeType.toLowerCase().indexOf('html') > -1;
|
||
var entityMap = isHTML ? entities.HTML_ENTITIES : entities.XML_ENTITIES;
|
||
if(locator){
|
||
domBuilder.setDocumentLocator(locator)
|
||
}
|
||
|
||
sax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);
|
||
sax.domBuilder = options.domBuilder || domBuilder;
|
||
if(isHTML){
|
||
defaultNSMap[''] = NAMESPACE.HTML;
|
||
}
|
||
defaultNSMap.xml = defaultNSMap.xml || NAMESPACE.XML;
|
||
var normalize = options.normalizeLineEndings || normalizeLineEndings;
|
||
if (source && typeof source === 'string') {
|
||
sax.parse(
|
||
normalize(source),
|
||
defaultNSMap,
|
||
entityMap
|
||
)
|
||
} else {
|
||
sax.errorHandler.error('invalid doc source')
|
||
}
|
||
return domBuilder.doc;
|
||
}
|
||
function buildErrorHandler(errorImpl,domBuilder,locator){
|
||
if(!errorImpl){
|
||
if(domBuilder instanceof DOMHandler){
|
||
return domBuilder;
|
||
}
|
||
errorImpl = domBuilder ;
|
||
}
|
||
var errorHandler = {}
|
||
var isCallback = errorImpl instanceof Function;
|
||
locator = locator||{}
|
||
function build(key){
|
||
var fn = errorImpl[key];
|
||
if(!fn && isCallback){
|
||
fn = errorImpl.length == 2?function(msg){errorImpl(key,msg)}:errorImpl;
|
||
}
|
||
errorHandler[key] = fn && function(msg){
|
||
fn('[xmldom '+key+']\t'+msg+_locator(locator));
|
||
}||function(){};
|
||
}
|
||
build('warning');
|
||
build('error');
|
||
build('fatalError');
|
||
return errorHandler;
|
||
}
|
||
|
||
//console.log('#\n\n\n\n\n\n\n####')
|
||
/**
|
||
* +ContentHandler+ErrorHandler
|
||
* +LexicalHandler+EntityResolver2
|
||
* -DeclHandler-DTDHandler
|
||
*
|
||
* DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler
|
||
* DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2
|
||
* @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html
|
||
*/
|
||
function DOMHandler() {
|
||
this.cdata = false;
|
||
}
|
||
function position(locator,node){
|
||
node.lineNumber = locator.lineNumber;
|
||
node.columnNumber = locator.columnNumber;
|
||
}
|
||
/**
|
||
* @see org.xml.sax.ContentHandler#startDocument
|
||
* @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
|
||
*/
|
||
DOMHandler.prototype = {
|
||
startDocument : function() {
|
||
this.doc = new DOMImplementation().createDocument(null, null, null);
|
||
if (this.locator) {
|
||
this.doc.documentURI = this.locator.systemId;
|
||
}
|
||
},
|
||
startElement:function(namespaceURI, localName, qName, attrs) {
|
||
var doc = this.doc;
|
||
var el = doc.createElementNS(namespaceURI, qName||localName);
|
||
var len = attrs.length;
|
||
appendElement(this, el);
|
||
this.currentElement = el;
|
||
|
||
this.locator && position(this.locator,el)
|
||
for (var i = 0 ; i < len; i++) {
|
||
var namespaceURI = attrs.getURI(i);
|
||
var value = attrs.getValue(i);
|
||
var qName = attrs.getQName(i);
|
||
var attr = doc.createAttributeNS(namespaceURI, qName);
|
||
this.locator &&position(attrs.getLocator(i),attr);
|
||
attr.value = attr.nodeValue = value;
|
||
el.setAttributeNode(attr)
|
||
}
|
||
},
|
||
endElement:function(namespaceURI, localName, qName) {
|
||
var current = this.currentElement
|
||
var tagName = current.tagName;
|
||
this.currentElement = current.parentNode;
|
||
},
|
||
startPrefixMapping:function(prefix, uri) {
|
||
},
|
||
endPrefixMapping:function(prefix) {
|
||
},
|
||
processingInstruction:function(target, data) {
|
||
var ins = this.doc.createProcessingInstruction(target, data);
|
||
this.locator && position(this.locator,ins)
|
||
appendElement(this, ins);
|
||
},
|
||
ignorableWhitespace:function(ch, start, length) {
|
||
},
|
||
characters:function(chars, start, length) {
|
||
chars = _toString.apply(this,arguments)
|
||
//console.log(chars)
|
||
if(chars){
|
||
if (this.cdata) {
|
||
var charNode = this.doc.createCDATASection(chars);
|
||
} else {
|
||
var charNode = this.doc.createTextNode(chars);
|
||
}
|
||
if(this.currentElement){
|
||
this.currentElement.appendChild(charNode);
|
||
}else if(/^\s*$/.test(chars)){
|
||
this.doc.appendChild(charNode);
|
||
//process xml
|
||
}
|
||
this.locator && position(this.locator,charNode)
|
||
}
|
||
},
|
||
skippedEntity:function(name) {
|
||
},
|
||
endDocument:function() {
|
||
this.doc.normalize();
|
||
},
|
||
setDocumentLocator:function (locator) {
|
||
if(this.locator = locator){// && !('lineNumber' in locator)){
|
||
locator.lineNumber = 0;
|
||
}
|
||
},
|
||
//LexicalHandler
|
||
comment:function(chars, start, length) {
|
||
chars = _toString.apply(this,arguments)
|
||
var comm = this.doc.createComment(chars);
|
||
this.locator && position(this.locator,comm)
|
||
appendElement(this, comm);
|
||
},
|
||
|
||
startCDATA:function() {
|
||
//used in characters() methods
|
||
this.cdata = true;
|
||
},
|
||
endCDATA:function() {
|
||
this.cdata = false;
|
||
},
|
||
|
||
startDTD:function(name, publicId, systemId) {
|
||
var impl = this.doc.implementation;
|
||
if (impl && impl.createDocumentType) {
|
||
var dt = impl.createDocumentType(name, publicId, systemId);
|
||
this.locator && position(this.locator,dt)
|
||
appendElement(this, dt);
|
||
this.doc.doctype = dt;
|
||
}
|
||
},
|
||
/**
|
||
* @see org.xml.sax.ErrorHandler
|
||
* @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
|
||
*/
|
||
warning:function(error) {
|
||
console.warn('[xmldom warning]\t'+error,_locator(this.locator));
|
||
},
|
||
error:function(error) {
|
||
console.error('[xmldom error]\t'+error,_locator(this.locator));
|
||
},
|
||
fatalError:function(error) {
|
||
throw new ParseError(error, this.locator);
|
||
}
|
||
}
|
||
function _locator(l){
|
||
if(l){
|
||
return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'
|
||
}
|
||
}
|
||
function _toString(chars,start,length){
|
||
if(typeof chars == 'string'){
|
||
return chars.substr(start,length)
|
||
}else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)")
|
||
if(chars.length >= start+length || start){
|
||
return new java.lang.String(chars,start,length)+'';
|
||
}
|
||
return chars;
|
||
}
|
||
}
|
||
|
||
/*
|
||
* @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html
|
||
* used method of org.xml.sax.ext.LexicalHandler:
|
||
* #comment(chars, start, length)
|
||
* #startCDATA()
|
||
* #endCDATA()
|
||
* #startDTD(name, publicId, systemId)
|
||
*
|
||
*
|
||
* IGNORED method of org.xml.sax.ext.LexicalHandler:
|
||
* #endDTD()
|
||
* #startEntity(name)
|
||
* #endEntity(name)
|
||
*
|
||
*
|
||
* @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html
|
||
* IGNORED method of org.xml.sax.ext.DeclHandler
|
||
* #attributeDecl(eName, aName, type, mode, value)
|
||
* #elementDecl(name, model)
|
||
* #externalEntityDecl(name, publicId, systemId)
|
||
* #internalEntityDecl(name, value)
|
||
* @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html
|
||
* IGNORED method of org.xml.sax.EntityResolver2
|
||
* #resolveEntity(String name,String publicId,String baseURI,String systemId)
|
||
* #resolveEntity(publicId, systemId)
|
||
* #getExternalSubset(name, baseURI)
|
||
* @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html
|
||
* IGNORED method of org.xml.sax.DTDHandler
|
||
* #notationDecl(name, publicId, systemId) {};
|
||
* #unparsedEntityDecl(name, publicId, systemId, notationName) {};
|
||
*/
|
||
"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){
|
||
DOMHandler.prototype[key] = function(){return null}
|
||
})
|
||
|
||
/* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */
|
||
function appendElement (hander,node) {
|
||
if (!hander.currentElement) {
|
||
hander.doc.appendChild(node);
|
||
} else {
|
||
hander.currentElement.appendChild(node);
|
||
}
|
||
}//appendChild and setAttributeNS are preformance key
|
||
|
||
exports.__DOMHandler = DOMHandler;
|
||
exports.normalizeLineEndings = normalizeLineEndings;
|
||
exports.DOMParser = DOMParser;
|
||
|
||
},{"./conventions":2,"./dom":4,"./entities":5,"./sax":7}],4:[function(require,module,exports){
|
||
var conventions = require("./conventions");
|
||
|
||
var find = conventions.find;
|
||
var NAMESPACE = conventions.NAMESPACE;
|
||
|
||
/**
|
||
* A prerequisite for `[].filter`, to drop elements that are empty
|
||
* @param {string} input
|
||
* @returns {boolean}
|
||
*/
|
||
function notEmptyString (input) {
|
||
return input !== ''
|
||
}
|
||
/**
|
||
* @see https://infra.spec.whatwg.org/#split-on-ascii-whitespace
|
||
* @see https://infra.spec.whatwg.org/#ascii-whitespace
|
||
*
|
||
* @param {string} input
|
||
* @returns {string[]} (can be empty)
|
||
*/
|
||
function splitOnASCIIWhitespace(input) {
|
||
// U+0009 TAB, U+000A LF, U+000C FF, U+000D CR, U+0020 SPACE
|
||
return input ? input.split(/[\t\n\f\r ]+/).filter(notEmptyString) : []
|
||
}
|
||
|
||
/**
|
||
* Adds element as a key to current if it is not already present.
|
||
*
|
||
* @param {Record<string, boolean | undefined>} current
|
||
* @param {string} element
|
||
* @returns {Record<string, boolean | undefined>}
|
||
*/
|
||
function orderedSetReducer (current, element) {
|
||
if (!current.hasOwnProperty(element)) {
|
||
current[element] = true;
|
||
}
|
||
return current;
|
||
}
|
||
|
||
/**
|
||
* @see https://infra.spec.whatwg.org/#ordered-set
|
||
* @param {string} input
|
||
* @returns {string[]}
|
||
*/
|
||
function toOrderedSet(input) {
|
||
if (!input) return [];
|
||
var list = splitOnASCIIWhitespace(input);
|
||
return Object.keys(list.reduce(orderedSetReducer, {}))
|
||
}
|
||
|
||
/**
|
||
* Uses `list.indexOf` to implement something like `Array.prototype.includes`,
|
||
* which we can not rely on being available.
|
||
*
|
||
* @param {any[]} list
|
||
* @returns {function(any): boolean}
|
||
*/
|
||
function arrayIncludes (list) {
|
||
return function(element) {
|
||
return list && list.indexOf(element) !== -1;
|
||
}
|
||
}
|
||
|
||
function copy(src,dest){
|
||
for(var p in src){
|
||
if (Object.prototype.hasOwnProperty.call(src, p)) {
|
||
dest[p] = src[p];
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));?
|
||
^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));?
|
||
*/
|
||
function _extends(Class,Super){
|
||
var pt = Class.prototype;
|
||
if(!(pt instanceof Super)){
|
||
function t(){};
|
||
t.prototype = Super.prototype;
|
||
t = new t();
|
||
copy(pt,t);
|
||
Class.prototype = pt = t;
|
||
}
|
||
if(pt.constructor != Class){
|
||
if(typeof Class != 'function'){
|
||
console.error("unknown Class:"+Class)
|
||
}
|
||
pt.constructor = Class
|
||
}
|
||
}
|
||
|
||
// Node Types
|
||
var NodeType = {}
|
||
var ELEMENT_NODE = NodeType.ELEMENT_NODE = 1;
|
||
var ATTRIBUTE_NODE = NodeType.ATTRIBUTE_NODE = 2;
|
||
var TEXT_NODE = NodeType.TEXT_NODE = 3;
|
||
var CDATA_SECTION_NODE = NodeType.CDATA_SECTION_NODE = 4;
|
||
var ENTITY_REFERENCE_NODE = NodeType.ENTITY_REFERENCE_NODE = 5;
|
||
var ENTITY_NODE = NodeType.ENTITY_NODE = 6;
|
||
var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;
|
||
var COMMENT_NODE = NodeType.COMMENT_NODE = 8;
|
||
var DOCUMENT_NODE = NodeType.DOCUMENT_NODE = 9;
|
||
var DOCUMENT_TYPE_NODE = NodeType.DOCUMENT_TYPE_NODE = 10;
|
||
var DOCUMENT_FRAGMENT_NODE = NodeType.DOCUMENT_FRAGMENT_NODE = 11;
|
||
var NOTATION_NODE = NodeType.NOTATION_NODE = 12;
|
||
|
||
// ExceptionCode
|
||
var ExceptionCode = {}
|
||
var ExceptionMessage = {};
|
||
var INDEX_SIZE_ERR = ExceptionCode.INDEX_SIZE_ERR = ((ExceptionMessage[1]="Index size error"),1);
|
||
var DOMSTRING_SIZE_ERR = ExceptionCode.DOMSTRING_SIZE_ERR = ((ExceptionMessage[2]="DOMString size error"),2);
|
||
var HIERARCHY_REQUEST_ERR = ExceptionCode.HIERARCHY_REQUEST_ERR = ((ExceptionMessage[3]="Hierarchy request error"),3);
|
||
var WRONG_DOCUMENT_ERR = ExceptionCode.WRONG_DOCUMENT_ERR = ((ExceptionMessage[4]="Wrong document"),4);
|
||
var INVALID_CHARACTER_ERR = ExceptionCode.INVALID_CHARACTER_ERR = ((ExceptionMessage[5]="Invalid character"),5);
|
||
var NO_DATA_ALLOWED_ERR = ExceptionCode.NO_DATA_ALLOWED_ERR = ((ExceptionMessage[6]="No data allowed"),6);
|
||
var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]="No modification allowed"),7);
|
||
var NOT_FOUND_ERR = ExceptionCode.NOT_FOUND_ERR = ((ExceptionMessage[8]="Not found"),8);
|
||
var NOT_SUPPORTED_ERR = ExceptionCode.NOT_SUPPORTED_ERR = ((ExceptionMessage[9]="Not supported"),9);
|
||
var INUSE_ATTRIBUTE_ERR = ExceptionCode.INUSE_ATTRIBUTE_ERR = ((ExceptionMessage[10]="Attribute in use"),10);
|
||
//level2
|
||
var INVALID_STATE_ERR = ExceptionCode.INVALID_STATE_ERR = ((ExceptionMessage[11]="Invalid state"),11);
|
||
var SYNTAX_ERR = ExceptionCode.SYNTAX_ERR = ((ExceptionMessage[12]="Syntax error"),12);
|
||
var INVALID_MODIFICATION_ERR = ExceptionCode.INVALID_MODIFICATION_ERR = ((ExceptionMessage[13]="Invalid modification"),13);
|
||
var NAMESPACE_ERR = ExceptionCode.NAMESPACE_ERR = ((ExceptionMessage[14]="Invalid namespace"),14);
|
||
var INVALID_ACCESS_ERR = ExceptionCode.INVALID_ACCESS_ERR = ((ExceptionMessage[15]="Invalid access"),15);
|
||
|
||
/**
|
||
* DOM Level 2
|
||
* Object DOMException
|
||
* @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html
|
||
* @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html
|
||
*/
|
||
function DOMException(code, message) {
|
||
if(message instanceof Error){
|
||
var error = message;
|
||
}else{
|
||
error = this;
|
||
Error.call(this, ExceptionMessage[code]);
|
||
this.message = ExceptionMessage[code];
|
||
if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);
|
||
}
|
||
error.code = code;
|
||
if(message) this.message = this.message + ": " + message;
|
||
return error;
|
||
};
|
||
DOMException.prototype = Error.prototype;
|
||
copy(ExceptionCode,DOMException)
|
||
|
||
/**
|
||
* @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177
|
||
* The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live.
|
||
* The items in the NodeList are accessible via an integral index, starting from 0.
|
||
*/
|
||
function NodeList() {
|
||
};
|
||
NodeList.prototype = {
|
||
/**
|
||
* The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.
|
||
* @standard level1
|
||
*/
|
||
length:0,
|
||
/**
|
||
* Returns the indexth item in the collection. If index is greater than or equal to the number of nodes in the list, this returns null.
|
||
* @standard level1
|
||
* @param index unsigned long
|
||
* Index into the collection.
|
||
* @return Node
|
||
* The node at the indexth position in the NodeList, or null if that is not a valid index.
|
||
*/
|
||
item: function(index) {
|
||
return this[index] || null;
|
||
},
|
||
toString:function(isHTML,nodeFilter){
|
||
for(var buf = [], i = 0;i<this.length;i++){
|
||
serializeToString(this[i],buf,isHTML,nodeFilter);
|
||
}
|
||
return buf.join('');
|
||
},
|
||
/**
|
||
* @private
|
||
* @param {function (Node):boolean} predicate
|
||
* @returns {Node[]}
|
||
*/
|
||
filter: function (predicate) {
|
||
return Array.prototype.filter.call(this, predicate);
|
||
},
|
||
/**
|
||
* @private
|
||
* @param {Node} item
|
||
* @returns {number}
|
||
*/
|
||
indexOf: function (item) {
|
||
return Array.prototype.indexOf.call(this, item);
|
||
},
|
||
};
|
||
|
||
function LiveNodeList(node,refresh){
|
||
this._node = node;
|
||
this._refresh = refresh
|
||
_updateLiveList(this);
|
||
}
|
||
function _updateLiveList(list){
|
||
var inc = list._node._inc || list._node.ownerDocument._inc;
|
||
if(list._inc != inc){
|
||
var ls = list._refresh(list._node);
|
||
//console.log(ls.length)
|
||
__set__(list,'length',ls.length);
|
||
copy(ls,list);
|
||
list._inc = inc;
|
||
}
|
||
}
|
||
LiveNodeList.prototype.item = function(i){
|
||
_updateLiveList(this);
|
||
return this[i];
|
||
}
|
||
|
||
_extends(LiveNodeList,NodeList);
|
||
|
||
/**
|
||
* Objects implementing the NamedNodeMap interface are used
|
||
* to represent collections of nodes that can be accessed by name.
|
||
* Note that NamedNodeMap does not inherit from NodeList;
|
||
* NamedNodeMaps are not maintained in any particular order.
|
||
* Objects contained in an object implementing NamedNodeMap may also be accessed by an ordinal index,
|
||
* but this is simply to allow convenient enumeration of the contents of a NamedNodeMap,
|
||
* and does not imply that the DOM specifies an order to these Nodes.
|
||
* NamedNodeMap objects in the DOM are live.
|
||
* used for attributes or DocumentType entities
|
||
*/
|
||
function NamedNodeMap() {
|
||
};
|
||
|
||
function _findNodeIndex(list,node){
|
||
var i = list.length;
|
||
while(i--){
|
||
if(list[i] === node){return i}
|
||
}
|
||
}
|
||
|
||
function _addNamedNode(el,list,newAttr,oldAttr){
|
||
if(oldAttr){
|
||
list[_findNodeIndex(list,oldAttr)] = newAttr;
|
||
}else{
|
||
list[list.length++] = newAttr;
|
||
}
|
||
if(el){
|
||
newAttr.ownerElement = el;
|
||
var doc = el.ownerDocument;
|
||
if(doc){
|
||
oldAttr && _onRemoveAttribute(doc,el,oldAttr);
|
||
_onAddAttribute(doc,el,newAttr);
|
||
}
|
||
}
|
||
}
|
||
function _removeNamedNode(el,list,attr){
|
||
//console.log('remove attr:'+attr)
|
||
var i = _findNodeIndex(list,attr);
|
||
if(i>=0){
|
||
var lastIndex = list.length-1
|
||
while(i<lastIndex){
|
||
list[i] = list[++i]
|
||
}
|
||
list.length = lastIndex;
|
||
if(el){
|
||
var doc = el.ownerDocument;
|
||
if(doc){
|
||
_onRemoveAttribute(doc,el,attr);
|
||
attr.ownerElement = null;
|
||
}
|
||
}
|
||
}else{
|
||
throw new DOMException(NOT_FOUND_ERR,new Error(el.tagName+'@'+attr))
|
||
}
|
||
}
|
||
NamedNodeMap.prototype = {
|
||
length:0,
|
||
item:NodeList.prototype.item,
|
||
getNamedItem: function(key) {
|
||
// if(key.indexOf(':')>0 || key == 'xmlns'){
|
||
// return null;
|
||
// }
|
||
//console.log()
|
||
var i = this.length;
|
||
while(i--){
|
||
var attr = this[i];
|
||
//console.log(attr.nodeName,key)
|
||
if(attr.nodeName == key){
|
||
return attr;
|
||
}
|
||
}
|
||
},
|
||
setNamedItem: function(attr) {
|
||
var el = attr.ownerElement;
|
||
if(el && el!=this._ownerElement){
|
||
throw new DOMException(INUSE_ATTRIBUTE_ERR);
|
||
}
|
||
var oldAttr = this.getNamedItem(attr.nodeName);
|
||
_addNamedNode(this._ownerElement,this,attr,oldAttr);
|
||
return oldAttr;
|
||
},
|
||
/* returns Node */
|
||
setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR
|
||
var el = attr.ownerElement, oldAttr;
|
||
if(el && el!=this._ownerElement){
|
||
throw new DOMException(INUSE_ATTRIBUTE_ERR);
|
||
}
|
||
oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);
|
||
_addNamedNode(this._ownerElement,this,attr,oldAttr);
|
||
return oldAttr;
|
||
},
|
||
|
||
/* returns Node */
|
||
removeNamedItem: function(key) {
|
||
var attr = this.getNamedItem(key);
|
||
_removeNamedNode(this._ownerElement,this,attr);
|
||
return attr;
|
||
|
||
|
||
},// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR
|
||
|
||
//for level2
|
||
removeNamedItemNS:function(namespaceURI,localName){
|
||
var attr = this.getNamedItemNS(namespaceURI,localName);
|
||
_removeNamedNode(this._ownerElement,this,attr);
|
||
return attr;
|
||
},
|
||
getNamedItemNS: function(namespaceURI, localName) {
|
||
var i = this.length;
|
||
while(i--){
|
||
var node = this[i];
|
||
if(node.localName == localName && node.namespaceURI == namespaceURI){
|
||
return node;
|
||
}
|
||
}
|
||
return null;
|
||
}
|
||
};
|
||
|
||
/**
|
||
* The DOMImplementation interface represents an object providing methods
|
||
* which are not dependent on any particular document.
|
||
* Such an object is returned by the `Document.implementation` property.
|
||
*
|
||
* __The individual methods describe the differences compared to the specs.__
|
||
*
|
||
* @constructor
|
||
*
|
||
* @see https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation MDN
|
||
* @see https://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490 DOM Level 1 Core (Initial)
|
||
* @see https://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-102161490 DOM Level 2 Core
|
||
* @see https://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-102161490 DOM Level 3 Core
|
||
* @see https://dom.spec.whatwg.org/#domimplementation DOM Living Standard
|
||
*/
|
||
function DOMImplementation() {
|
||
}
|
||
|
||
DOMImplementation.prototype = {
|
||
/**
|
||
* The DOMImplementation.hasFeature() method returns a Boolean flag indicating if a given feature is supported.
|
||
* The different implementations fairly diverged in what kind of features were reported.
|
||
* The latest version of the spec settled to force this method to always return true, where the functionality was accurate and in use.
|
||
*
|
||
* @deprecated It is deprecated and modern browsers return true in all cases.
|
||
*
|
||
* @param {string} feature
|
||
* @param {string} [version]
|
||
* @returns {boolean} always true
|
||
*
|
||
* @see https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation/hasFeature MDN
|
||
* @see https://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-5CED94D7 DOM Level 1 Core
|
||
* @see https://dom.spec.whatwg.org/#dom-domimplementation-hasfeature DOM Living Standard
|
||
*/
|
||
hasFeature: function(feature, version) {
|
||
return true;
|
||
},
|
||
/**
|
||
* Creates an XML Document object of the specified type with its document element.
|
||
*
|
||
* __It behaves slightly different from the description in the living standard__:
|
||
* - There is no interface/class `XMLDocument`, it returns a `Document` instance.
|
||
* - `contentType`, `encoding`, `mode`, `origin`, `url` fields are currently not declared.
|
||
* - this implementation is not validating names or qualified names
|
||
* (when parsing XML strings, the SAX parser takes care of that)
|
||
*
|
||
* @param {string|null} namespaceURI
|
||
* @param {string} qualifiedName
|
||
* @param {DocumentType=null} doctype
|
||
* @returns {Document}
|
||
*
|
||
* @see https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation/createDocument MDN
|
||
* @see https://www.w3.org/TR/DOM-Level-2-Core/core.html#Level-2-Core-DOM-createDocument DOM Level 2 Core (initial)
|
||
* @see https://dom.spec.whatwg.org/#dom-domimplementation-createdocument DOM Level 2 Core
|
||
*
|
||
* @see https://dom.spec.whatwg.org/#validate-and-extract DOM: Validate and extract
|
||
* @see https://www.w3.org/TR/xml/#NT-NameStartChar XML Spec: Names
|
||
* @see https://www.w3.org/TR/xml-names/#ns-qualnames XML Namespaces: Qualified names
|
||
*/
|
||
createDocument: function(namespaceURI, qualifiedName, doctype){
|
||
var doc = new Document();
|
||
doc.implementation = this;
|
||
doc.childNodes = new NodeList();
|
||
doc.doctype = doctype || null;
|
||
if (doctype){
|
||
doc.appendChild(doctype);
|
||
}
|
||
if (qualifiedName){
|
||
var root = doc.createElementNS(namespaceURI, qualifiedName);
|
||
doc.appendChild(root);
|
||
}
|
||
return doc;
|
||
},
|
||
/**
|
||
* Returns a doctype, with the given `qualifiedName`, `publicId`, and `systemId`.
|
||
*
|
||
* __This behavior is slightly different from the in the specs__:
|
||
* - this implementation is not validating names or qualified names
|
||
* (when parsing XML strings, the SAX parser takes care of that)
|
||
*
|
||
* @param {string} qualifiedName
|
||
* @param {string} [publicId]
|
||
* @param {string} [systemId]
|
||
* @returns {DocumentType} which can either be used with `DOMImplementation.createDocument` upon document creation
|
||
* or can be put into the document via methods like `Node.insertBefore()` or `Node.replaceChild()`
|
||
*
|
||
* @see https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation/createDocumentType MDN
|
||
* @see https://www.w3.org/TR/DOM-Level-2-Core/core.html#Level-2-Core-DOM-createDocType DOM Level 2 Core
|
||
* @see https://dom.spec.whatwg.org/#dom-domimplementation-createdocumenttype DOM Living Standard
|
||
*
|
||
* @see https://dom.spec.whatwg.org/#validate-and-extract DOM: Validate and extract
|
||
* @see https://www.w3.org/TR/xml/#NT-NameStartChar XML Spec: Names
|
||
* @see https://www.w3.org/TR/xml-names/#ns-qualnames XML Namespaces: Qualified names
|
||
*/
|
||
createDocumentType: function(qualifiedName, publicId, systemId){
|
||
var node = new DocumentType();
|
||
node.name = qualifiedName;
|
||
node.nodeName = qualifiedName;
|
||
node.publicId = publicId || '';
|
||
node.systemId = systemId || '';
|
||
|
||
return node;
|
||
}
|
||
};
|
||
|
||
|
||
/**
|
||
* @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247
|
||
*/
|
||
|
||
function Node() {
|
||
};
|
||
|
||
Node.prototype = {
|
||
firstChild : null,
|
||
lastChild : null,
|
||
previousSibling : null,
|
||
nextSibling : null,
|
||
attributes : null,
|
||
parentNode : null,
|
||
childNodes : null,
|
||
ownerDocument : null,
|
||
nodeValue : null,
|
||
namespaceURI : null,
|
||
prefix : null,
|
||
localName : null,
|
||
// Modified in DOM Level 2:
|
||
insertBefore:function(newChild, refChild){//raises
|
||
return _insertBefore(this,newChild,refChild);
|
||
},
|
||
replaceChild:function(newChild, oldChild){//raises
|
||
_insertBefore(this, newChild,oldChild, assertPreReplacementValidityInDocument);
|
||
if(oldChild){
|
||
this.removeChild(oldChild);
|
||
}
|
||
},
|
||
removeChild:function(oldChild){
|
||
return _removeChild(this,oldChild);
|
||
},
|
||
appendChild:function(newChild){
|
||
return this.insertBefore(newChild,null);
|
||
},
|
||
hasChildNodes:function(){
|
||
return this.firstChild != null;
|
||
},
|
||
cloneNode:function(deep){
|
||
return cloneNode(this.ownerDocument||this,this,deep);
|
||
},
|
||
// Modified in DOM Level 2:
|
||
normalize:function(){
|
||
var child = this.firstChild;
|
||
while(child){
|
||
var next = child.nextSibling;
|
||
if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){
|
||
this.removeChild(next);
|
||
child.appendData(next.data);
|
||
}else{
|
||
child.normalize();
|
||
child = next;
|
||
}
|
||
}
|
||
},
|
||
// Introduced in DOM Level 2:
|
||
isSupported:function(feature, version){
|
||
return this.ownerDocument.implementation.hasFeature(feature,version);
|
||
},
|
||
// Introduced in DOM Level 2:
|
||
hasAttributes:function(){
|
||
return this.attributes.length>0;
|
||
},
|
||
/**
|
||
* Look up the prefix associated to the given namespace URI, starting from this node.
|
||
* **The default namespace declarations are ignored by this method.**
|
||
* See Namespace Prefix Lookup for details on the algorithm used by this method.
|
||
*
|
||
* _Note: The implementation seems to be incomplete when compared to the algorithm described in the specs._
|
||
*
|
||
* @param {string | null} namespaceURI
|
||
* @returns {string | null}
|
||
* @see https://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-lookupNamespacePrefix
|
||
* @see https://www.w3.org/TR/DOM-Level-3-Core/namespaces-algorithms.html#lookupNamespacePrefixAlgo
|
||
* @see https://dom.spec.whatwg.org/#dom-node-lookupprefix
|
||
* @see https://github.com/xmldom/xmldom/issues/322
|
||
*/
|
||
lookupPrefix:function(namespaceURI){
|
||
var el = this;
|
||
while(el){
|
||
var map = el._nsMap;
|
||
//console.dir(map)
|
||
if(map){
|
||
for(var n in map){
|
||
if (Object.prototype.hasOwnProperty.call(map, n) && map[n] === namespaceURI) {
|
||
return n;
|
||
}
|
||
}
|
||
}
|
||
el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
|
||
}
|
||
return null;
|
||
},
|
||
// Introduced in DOM Level 3:
|
||
lookupNamespaceURI:function(prefix){
|
||
var el = this;
|
||
while(el){
|
||
var map = el._nsMap;
|
||
//console.dir(map)
|
||
if(map){
|
||
if(Object.prototype.hasOwnProperty.call(map, prefix)){
|
||
return map[prefix] ;
|
||
}
|
||
}
|
||
el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
|
||
}
|
||
return null;
|
||
},
|
||
// Introduced in DOM Level 3:
|
||
isDefaultNamespace:function(namespaceURI){
|
||
var prefix = this.lookupPrefix(namespaceURI);
|
||
return prefix == null;
|
||
}
|
||
};
|
||
|
||
|
||
function _xmlEncoder(c){
|
||
return c == '<' && '<' ||
|
||
c == '>' && '>' ||
|
||
c == '&' && '&' ||
|
||
c == '"' && '"' ||
|
||
'&#'+c.charCodeAt()+';'
|
||
}
|
||
|
||
|
||
copy(NodeType,Node);
|
||
copy(NodeType,Node.prototype);
|
||
|
||
/**
|
||
* @param callback return true for continue,false for break
|
||
* @return boolean true: break visit;
|
||
*/
|
||
function _visitNode(node,callback){
|
||
if(callback(node)){
|
||
return true;
|
||
}
|
||
if(node = node.firstChild){
|
||
do{
|
||
if(_visitNode(node,callback)){return true}
|
||
}while(node=node.nextSibling)
|
||
}
|
||
}
|
||
|
||
|
||
|
||
function Document(){
|
||
this.ownerDocument = this;
|
||
}
|
||
|
||
function _onAddAttribute(doc,el,newAttr){
|
||
doc && doc._inc++;
|
||
var ns = newAttr.namespaceURI ;
|
||
if(ns === NAMESPACE.XMLNS){
|
||
//update namespace
|
||
el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value
|
||
}
|
||
}
|
||
|
||
function _onRemoveAttribute(doc,el,newAttr,remove){
|
||
doc && doc._inc++;
|
||
var ns = newAttr.namespaceURI ;
|
||
if(ns === NAMESPACE.XMLNS){
|
||
//update namespace
|
||
delete el._nsMap[newAttr.prefix?newAttr.localName:'']
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Updates `el.childNodes`, updating the indexed items and it's `length`.
|
||
* Passing `newChild` means it will be appended.
|
||
* Otherwise it's assumed that an item has been removed,
|
||
* and `el.firstNode` and it's `.nextSibling` are used
|
||
* to walk the current list of child nodes.
|
||
*
|
||
* @param {Document} doc
|
||
* @param {Node} el
|
||
* @param {Node} [newChild]
|
||
* @private
|
||
*/
|
||
function _onUpdateChild (doc, el, newChild) {
|
||
if(doc && doc._inc){
|
||
doc._inc++;
|
||
//update childNodes
|
||
var cs = el.childNodes;
|
||
if (newChild) {
|
||
cs[cs.length++] = newChild;
|
||
} else {
|
||
var child = el.firstChild;
|
||
var i = 0;
|
||
while (child) {
|
||
cs[i++] = child;
|
||
child = child.nextSibling;
|
||
}
|
||
cs.length = i;
|
||
delete cs[cs.length];
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Removes the connections between `parentNode` and `child`
|
||
* and any existing `child.previousSibling` or `child.nextSibling`.
|
||
*
|
||
* @see https://github.com/xmldom/xmldom/issues/135
|
||
* @see https://github.com/xmldom/xmldom/issues/145
|
||
*
|
||
* @param {Node} parentNode
|
||
* @param {Node} child
|
||
* @returns {Node} the child that was removed.
|
||
* @private
|
||
*/
|
||
function _removeChild (parentNode, child) {
|
||
var previous = child.previousSibling;
|
||
var next = child.nextSibling;
|
||
if (previous) {
|
||
previous.nextSibling = next;
|
||
} else {
|
||
parentNode.firstChild = next;
|
||
}
|
||
if (next) {
|
||
next.previousSibling = previous;
|
||
} else {
|
||
parentNode.lastChild = previous;
|
||
}
|
||
child.parentNode = null;
|
||
child.previousSibling = null;
|
||
child.nextSibling = null;
|
||
_onUpdateChild(parentNode.ownerDocument, parentNode);
|
||
return child;
|
||
}
|
||
|
||
/**
|
||
* Returns `true` if `node` can be a parent for insertion.
|
||
* @param {Node} node
|
||
* @returns {boolean}
|
||
*/
|
||
function hasValidParentNodeType(node) {
|
||
return (
|
||
node &&
|
||
(node.nodeType === Node.DOCUMENT_NODE || node.nodeType === Node.DOCUMENT_FRAGMENT_NODE || node.nodeType === Node.ELEMENT_NODE)
|
||
);
|
||
}
|
||
|
||
/**
|
||
* Returns `true` if `node` can be inserted according to it's `nodeType`.
|
||
* @param {Node} node
|
||
* @returns {boolean}
|
||
*/
|
||
function hasInsertableNodeType(node) {
|
||
return (
|
||
node &&
|
||
(isElementNode(node) ||
|
||
isTextNode(node) ||
|
||
isDocTypeNode(node) ||
|
||
node.nodeType === Node.DOCUMENT_FRAGMENT_NODE ||
|
||
node.nodeType === Node.COMMENT_NODE ||
|
||
node.nodeType === Node.PROCESSING_INSTRUCTION_NODE)
|
||
);
|
||
}
|
||
|
||
/**
|
||
* Returns true if `node` is a DOCTYPE node
|
||
* @param {Node} node
|
||
* @returns {boolean}
|
||
*/
|
||
function isDocTypeNode(node) {
|
||
return node && node.nodeType === Node.DOCUMENT_TYPE_NODE;
|
||
}
|
||
|
||
/**
|
||
* Returns true if the node is an element
|
||
* @param {Node} node
|
||
* @returns {boolean}
|
||
*/
|
||
function isElementNode(node) {
|
||
return node && node.nodeType === Node.ELEMENT_NODE;
|
||
}
|
||
/**
|
||
* Returns true if `node` is a text node
|
||
* @param {Node} node
|
||
* @returns {boolean}
|
||
*/
|
||
function isTextNode(node) {
|
||
return node && node.nodeType === Node.TEXT_NODE;
|
||
}
|
||
|
||
/**
|
||
* Check if en element node can be inserted before `child`, or at the end if child is falsy,
|
||
* according to the presence and position of a doctype node on the same level.
|
||
*
|
||
* @param {Document} doc The document node
|
||
* @param {Node} child the node that would become the nextSibling if the element would be inserted
|
||
* @returns {boolean} `true` if an element can be inserted before child
|
||
* @private
|
||
* https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity
|
||
*/
|
||
function isElementInsertionPossible(doc, child) {
|
||
var parentChildNodes = doc.childNodes || [];
|
||
if (find(parentChildNodes, isElementNode) || isDocTypeNode(child)) {
|
||
return false;
|
||
}
|
||
var docTypeNode = find(parentChildNodes, isDocTypeNode);
|
||
return !(child && docTypeNode && parentChildNodes.indexOf(docTypeNode) > parentChildNodes.indexOf(child));
|
||
}
|
||
|
||
/**
|
||
* Check if en element node can be inserted before `child`, or at the end if child is falsy,
|
||
* according to the presence and position of a doctype node on the same level.
|
||
*
|
||
* @param {Node} doc The document node
|
||
* @param {Node} child the node that would become the nextSibling if the element would be inserted
|
||
* @returns {boolean} `true` if an element can be inserted before child
|
||
* @private
|
||
* https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity
|
||
*/
|
||
function isElementReplacementPossible(doc, child) {
|
||
var parentChildNodes = doc.childNodes || [];
|
||
|
||
function hasElementChildThatIsNotChild(node) {
|
||
return isElementNode(node) && node !== child;
|
||
}
|
||
|
||
if (find(parentChildNodes, hasElementChildThatIsNotChild)) {
|
||
return false;
|
||
}
|
||
var docTypeNode = find(parentChildNodes, isDocTypeNode);
|
||
return !(child && docTypeNode && parentChildNodes.indexOf(docTypeNode) > parentChildNodes.indexOf(child));
|
||
}
|
||
|
||
/**
|
||
* @private
|
||
* Steps 1-5 of the checks before inserting and before replacing a child are the same.
|
||
*
|
||
* @param {Node} parent the parent node to insert `node` into
|
||
* @param {Node} node the node to insert
|
||
* @param {Node=} child the node that should become the `nextSibling` of `node`
|
||
* @returns {Node}
|
||
* @throws DOMException for several node combinations that would create a DOM that is not well-formed.
|
||
* @throws DOMException if `child` is provided but is not a child of `parent`.
|
||
* @see https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity
|
||
* @see https://dom.spec.whatwg.org/#concept-node-replace
|
||
*/
|
||
function assertPreInsertionValidity1to5(parent, node, child) {
|
||
// 1. If `parent` is not a Document, DocumentFragment, or Element node, then throw a "HierarchyRequestError" DOMException.
|
||
if (!hasValidParentNodeType(parent)) {
|
||
throw new DOMException(HIERARCHY_REQUEST_ERR, 'Unexpected parent node type ' + parent.nodeType);
|
||
}
|
||
// 2. If `node` is a host-including inclusive ancestor of `parent`, then throw a "HierarchyRequestError" DOMException.
|
||
// not implemented!
|
||
// 3. If `child` is non-null and its parent is not `parent`, then throw a "NotFoundError" DOMException.
|
||
if (child && child.parentNode !== parent) {
|
||
throw new DOMException(NOT_FOUND_ERR, 'child not in parent');
|
||
}
|
||
if (
|
||
// 4. If `node` is not a DocumentFragment, DocumentType, Element, or CharacterData node, then throw a "HierarchyRequestError" DOMException.
|
||
!hasInsertableNodeType(node) ||
|
||
// 5. If either `node` is a Text node and `parent` is a document,
|
||
// the sax parser currently adds top level text nodes, this will be fixed in 0.9.0
|
||
// || (node.nodeType === Node.TEXT_NODE && parent.nodeType === Node.DOCUMENT_NODE)
|
||
// or `node` is a doctype and `parent` is not a document, then throw a "HierarchyRequestError" DOMException.
|
||
(isDocTypeNode(node) && parent.nodeType !== Node.DOCUMENT_NODE)
|
||
) {
|
||
throw new DOMException(
|
||
HIERARCHY_REQUEST_ERR,
|
||
'Unexpected node type ' + node.nodeType + ' for parent node type ' + parent.nodeType
|
||
);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @private
|
||
* Step 6 of the checks before inserting and before replacing a child are different.
|
||
*
|
||
* @param {Document} parent the parent node to insert `node` into
|
||
* @param {Node} node the node to insert
|
||
* @param {Node | undefined} child the node that should become the `nextSibling` of `node`
|
||
* @returns {Node}
|
||
* @throws DOMException for several node combinations that would create a DOM that is not well-formed.
|
||
* @throws DOMException if `child` is provided but is not a child of `parent`.
|
||
* @see https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity
|
||
* @see https://dom.spec.whatwg.org/#concept-node-replace
|
||
*/
|
||
function assertPreInsertionValidityInDocument(parent, node, child) {
|
||
var parentChildNodes = parent.childNodes || [];
|
||
var nodeChildNodes = node.childNodes || [];
|
||
|
||
// DocumentFragment
|
||
if (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {
|
||
var nodeChildElements = nodeChildNodes.filter(isElementNode);
|
||
// If node has more than one element child or has a Text node child.
|
||
if (nodeChildElements.length > 1 || find(nodeChildNodes, isTextNode)) {
|
||
throw new DOMException(HIERARCHY_REQUEST_ERR, 'More than one element or text in fragment');
|
||
}
|
||
// Otherwise, if `node` has one element child and either `parent` has an element child,
|
||
// `child` is a doctype, or `child` is non-null and a doctype is following `child`.
|
||
if (nodeChildElements.length === 1 && !isElementInsertionPossible(parent, child)) {
|
||
throw new DOMException(HIERARCHY_REQUEST_ERR, 'Element in fragment can not be inserted before doctype');
|
||
}
|
||
}
|
||
// Element
|
||
if (isElementNode(node)) {
|
||
// `parent` has an element child, `child` is a doctype,
|
||
// or `child` is non-null and a doctype is following `child`.
|
||
if (!isElementInsertionPossible(parent, child)) {
|
||
throw new DOMException(HIERARCHY_REQUEST_ERR, 'Only one element can be added and only after doctype');
|
||
}
|
||
}
|
||
// DocumentType
|
||
if (isDocTypeNode(node)) {
|
||
// `parent` has a doctype child,
|
||
if (find(parentChildNodes, isDocTypeNode)) {
|
||
throw new DOMException(HIERARCHY_REQUEST_ERR, 'Only one doctype is allowed');
|
||
}
|
||
var parentElementChild = find(parentChildNodes, isElementNode);
|
||
// `child` is non-null and an element is preceding `child`,
|
||
if (child && parentChildNodes.indexOf(parentElementChild) < parentChildNodes.indexOf(child)) {
|
||
throw new DOMException(HIERARCHY_REQUEST_ERR, 'Doctype can only be inserted before an element');
|
||
}
|
||
// or `child` is null and `parent` has an element child.
|
||
if (!child && parentElementChild) {
|
||
throw new DOMException(HIERARCHY_REQUEST_ERR, 'Doctype can not be appended since element is present');
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @private
|
||
* Step 6 of the checks before inserting and before replacing a child are different.
|
||
*
|
||
* @param {Document} parent the parent node to insert `node` into
|
||
* @param {Node} node the node to insert
|
||
* @param {Node | undefined} child the node that should become the `nextSibling` of `node`
|
||
* @returns {Node}
|
||
* @throws DOMException for several node combinations that would create a DOM that is not well-formed.
|
||
* @throws DOMException if `child` is provided but is not a child of `parent`.
|
||
* @see https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity
|
||
* @see https://dom.spec.whatwg.org/#concept-node-replace
|
||
*/
|
||
function assertPreReplacementValidityInDocument(parent, node, child) {
|
||
var parentChildNodes = parent.childNodes || [];
|
||
var nodeChildNodes = node.childNodes || [];
|
||
|
||
// DocumentFragment
|
||
if (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {
|
||
var nodeChildElements = nodeChildNodes.filter(isElementNode);
|
||
// If `node` has more than one element child or has a Text node child.
|
||
if (nodeChildElements.length > 1 || find(nodeChildNodes, isTextNode)) {
|
||
throw new DOMException(HIERARCHY_REQUEST_ERR, 'More than one element or text in fragment');
|
||
}
|
||
// Otherwise, if `node` has one element child and either `parent` has an element child that is not `child` or a doctype is following `child`.
|
||
if (nodeChildElements.length === 1 && !isElementReplacementPossible(parent, child)) {
|
||
throw new DOMException(HIERARCHY_REQUEST_ERR, 'Element in fragment can not be inserted before doctype');
|
||
}
|
||
}
|
||
// Element
|
||
if (isElementNode(node)) {
|
||
// `parent` has an element child that is not `child` or a doctype is following `child`.
|
||
if (!isElementReplacementPossible(parent, child)) {
|
||
throw new DOMException(HIERARCHY_REQUEST_ERR, 'Only one element can be added and only after doctype');
|
||
}
|
||
}
|
||
// DocumentType
|
||
if (isDocTypeNode(node)) {
|
||
function hasDoctypeChildThatIsNotChild(node) {
|
||
return isDocTypeNode(node) && node !== child;
|
||
}
|
||
|
||
// `parent` has a doctype child that is not `child`,
|
||
if (find(parentChildNodes, hasDoctypeChildThatIsNotChild)) {
|
||
throw new DOMException(HIERARCHY_REQUEST_ERR, 'Only one doctype is allowed');
|
||
}
|
||
var parentElementChild = find(parentChildNodes, isElementNode);
|
||
// or an element is preceding `child`.
|
||
if (child && parentChildNodes.indexOf(parentElementChild) < parentChildNodes.indexOf(child)) {
|
||
throw new DOMException(HIERARCHY_REQUEST_ERR, 'Doctype can only be inserted before an element');
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @private
|
||
* @param {Node} parent the parent node to insert `node` into
|
||
* @param {Node} node the node to insert
|
||
* @param {Node=} child the node that should become the `nextSibling` of `node`
|
||
* @returns {Node}
|
||
* @throws DOMException for several node combinations that would create a DOM that is not well-formed.
|
||
* @throws DOMException if `child` is provided but is not a child of `parent`.
|
||
* @see https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity
|
||
*/
|
||
function _insertBefore(parent, node, child, _inDocumentAssertion) {
|
||
// To ensure pre-insertion validity of a node into a parent before a child, run these steps:
|
||
assertPreInsertionValidity1to5(parent, node, child);
|
||
|
||
// If parent is a document, and any of the statements below, switched on the interface node implements,
|
||
// are true, then throw a "HierarchyRequestError" DOMException.
|
||
if (parent.nodeType === Node.DOCUMENT_NODE) {
|
||
(_inDocumentAssertion || assertPreInsertionValidityInDocument)(parent, node, child);
|
||
}
|
||
|
||
var cp = node.parentNode;
|
||
if(cp){
|
||
cp.removeChild(node);//remove and update
|
||
}
|
||
if(node.nodeType === DOCUMENT_FRAGMENT_NODE){
|
||
var newFirst = node.firstChild;
|
||
if (newFirst == null) {
|
||
return node;
|
||
}
|
||
var newLast = node.lastChild;
|
||
}else{
|
||
newFirst = newLast = node;
|
||
}
|
||
var pre = child ? child.previousSibling : parent.lastChild;
|
||
|
||
newFirst.previousSibling = pre;
|
||
newLast.nextSibling = child;
|
||
|
||
|
||
if(pre){
|
||
pre.nextSibling = newFirst;
|
||
}else{
|
||
parent.firstChild = newFirst;
|
||
}
|
||
if(child == null){
|
||
parent.lastChild = newLast;
|
||
}else{
|
||
child.previousSibling = newLast;
|
||
}
|
||
do{
|
||
newFirst.parentNode = parent;
|
||
}while(newFirst !== newLast && (newFirst= newFirst.nextSibling))
|
||
_onUpdateChild(parent.ownerDocument||parent, parent);
|
||
//console.log(parent.lastChild.nextSibling == null)
|
||
if (node.nodeType == DOCUMENT_FRAGMENT_NODE) {
|
||
node.firstChild = node.lastChild = null;
|
||
}
|
||
return node;
|
||
}
|
||
|
||
/**
|
||
* Appends `newChild` to `parentNode`.
|
||
* If `newChild` is already connected to a `parentNode` it is first removed from it.
|
||
*
|
||
* @see https://github.com/xmldom/xmldom/issues/135
|
||
* @see https://github.com/xmldom/xmldom/issues/145
|
||
* @param {Node} parentNode
|
||
* @param {Node} newChild
|
||
* @returns {Node}
|
||
* @private
|
||
*/
|
||
function _appendSingleChild (parentNode, newChild) {
|
||
if (newChild.parentNode) {
|
||
newChild.parentNode.removeChild(newChild);
|
||
}
|
||
newChild.parentNode = parentNode;
|
||
newChild.previousSibling = parentNode.lastChild;
|
||
newChild.nextSibling = null;
|
||
if (newChild.previousSibling) {
|
||
newChild.previousSibling.nextSibling = newChild;
|
||
} else {
|
||
parentNode.firstChild = newChild;
|
||
}
|
||
parentNode.lastChild = newChild;
|
||
_onUpdateChild(parentNode.ownerDocument, parentNode, newChild);
|
||
return newChild;
|
||
}
|
||
|
||
Document.prototype = {
|
||
//implementation : null,
|
||
nodeName : '#document',
|
||
nodeType : DOCUMENT_NODE,
|
||
/**
|
||
* The DocumentType node of the document.
|
||
*
|
||
* @readonly
|
||
* @type DocumentType
|
||
*/
|
||
doctype : null,
|
||
documentElement : null,
|
||
_inc : 1,
|
||
|
||
insertBefore : function(newChild, refChild){//raises
|
||
if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){
|
||
var child = newChild.firstChild;
|
||
while(child){
|
||
var next = child.nextSibling;
|
||
this.insertBefore(child,refChild);
|
||
child = next;
|
||
}
|
||
return newChild;
|
||
}
|
||
_insertBefore(this, newChild, refChild);
|
||
newChild.ownerDocument = this;
|
||
if (this.documentElement === null && newChild.nodeType === ELEMENT_NODE) {
|
||
this.documentElement = newChild;
|
||
}
|
||
|
||
return newChild;
|
||
},
|
||
removeChild : function(oldChild){
|
||
if(this.documentElement == oldChild){
|
||
this.documentElement = null;
|
||
}
|
||
return _removeChild(this,oldChild);
|
||
},
|
||
replaceChild: function (newChild, oldChild) {
|
||
//raises
|
||
_insertBefore(this, newChild, oldChild, assertPreReplacementValidityInDocument);
|
||
newChild.ownerDocument = this;
|
||
if (oldChild) {
|
||
this.removeChild(oldChild);
|
||
}
|
||
if (isElementNode(newChild)) {
|
||
this.documentElement = newChild;
|
||
}
|
||
},
|
||
// Introduced in DOM Level 2:
|
||
importNode : function(importedNode,deep){
|
||
return importNode(this,importedNode,deep);
|
||
},
|
||
// Introduced in DOM Level 2:
|
||
getElementById : function(id){
|
||
var rtv = null;
|
||
_visitNode(this.documentElement,function(node){
|
||
if(node.nodeType == ELEMENT_NODE){
|
||
if(node.getAttribute('id') == id){
|
||
rtv = node;
|
||
return true;
|
||
}
|
||
}
|
||
})
|
||
return rtv;
|
||
},
|
||
|
||
/**
|
||
* The `getElementsByClassName` method of `Document` interface returns an array-like object
|
||
* of all child elements which have **all** of the given class name(s).
|
||
*
|
||
* Returns an empty list if `classeNames` is an empty string or only contains HTML white space characters.
|
||
*
|
||
*
|
||
* Warning: This is a live LiveNodeList.
|
||
* Changes in the DOM will reflect in the array as the changes occur.
|
||
* If an element selected by this array no longer qualifies for the selector,
|
||
* it will automatically be removed. Be aware of this for iteration purposes.
|
||
*
|
||
* @param {string} classNames is a string representing the class name(s) to match; multiple class names are separated by (ASCII-)whitespace
|
||
*
|
||
* @see https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementsByClassName
|
||
* @see https://dom.spec.whatwg.org/#concept-getelementsbyclassname
|
||
*/
|
||
getElementsByClassName: function(classNames) {
|
||
var classNamesSet = toOrderedSet(classNames)
|
||
return new LiveNodeList(this, function(base) {
|
||
var ls = [];
|
||
if (classNamesSet.length > 0) {
|
||
_visitNode(base.documentElement, function(node) {
|
||
if(node !== base && node.nodeType === ELEMENT_NODE) {
|
||
var nodeClassNames = node.getAttribute('class')
|
||
// can be null if the attribute does not exist
|
||
if (nodeClassNames) {
|
||
// before splitting and iterating just compare them for the most common case
|
||
var matches = classNames === nodeClassNames;
|
||
if (!matches) {
|
||
var nodeClassNamesSet = toOrderedSet(nodeClassNames)
|
||
matches = classNamesSet.every(arrayIncludes(nodeClassNamesSet))
|
||
}
|
||
if(matches) {
|
||
ls.push(node);
|
||
}
|
||
}
|
||
}
|
||
});
|
||
}
|
||
return ls;
|
||
});
|
||
},
|
||
|
||
//document factory method:
|
||
createElement : function(tagName){
|
||
var node = new Element();
|
||
node.ownerDocument = this;
|
||
node.nodeName = tagName;
|
||
node.tagName = tagName;
|
||
node.localName = tagName;
|
||
node.childNodes = new NodeList();
|
||
var attrs = node.attributes = new NamedNodeMap();
|
||
attrs._ownerElement = node;
|
||
return node;
|
||
},
|
||
createDocumentFragment : function(){
|
||
var node = new DocumentFragment();
|
||
node.ownerDocument = this;
|
||
node.childNodes = new NodeList();
|
||
return node;
|
||
},
|
||
createTextNode : function(data){
|
||
var node = new Text();
|
||
node.ownerDocument = this;
|
||
node.appendData(data)
|
||
return node;
|
||
},
|
||
createComment : function(data){
|
||
var node = new Comment();
|
||
node.ownerDocument = this;
|
||
node.appendData(data)
|
||
return node;
|
||
},
|
||
createCDATASection : function(data){
|
||
var node = new CDATASection();
|
||
node.ownerDocument = this;
|
||
node.appendData(data)
|
||
return node;
|
||
},
|
||
createProcessingInstruction : function(target,data){
|
||
var node = new ProcessingInstruction();
|
||
node.ownerDocument = this;
|
||
node.tagName = node.target = target;
|
||
node.nodeValue= node.data = data;
|
||
return node;
|
||
},
|
||
createAttribute : function(name){
|
||
var node = new Attr();
|
||
node.ownerDocument = this;
|
||
node.name = name;
|
||
node.nodeName = name;
|
||
node.localName = name;
|
||
node.specified = true;
|
||
return node;
|
||
},
|
||
createEntityReference : function(name){
|
||
var node = new EntityReference();
|
||
node.ownerDocument = this;
|
||
node.nodeName = name;
|
||
return node;
|
||
},
|
||
// Introduced in DOM Level 2:
|
||
createElementNS : function(namespaceURI,qualifiedName){
|
||
var node = new Element();
|
||
var pl = qualifiedName.split(':');
|
||
var attrs = node.attributes = new NamedNodeMap();
|
||
node.childNodes = new NodeList();
|
||
node.ownerDocument = this;
|
||
node.nodeName = qualifiedName;
|
||
node.tagName = qualifiedName;
|
||
node.namespaceURI = namespaceURI;
|
||
if(pl.length == 2){
|
||
node.prefix = pl[0];
|
||
node.localName = pl[1];
|
||
}else{
|
||
//el.prefix = null;
|
||
node.localName = qualifiedName;
|
||
}
|
||
attrs._ownerElement = node;
|
||
return node;
|
||
},
|
||
// Introduced in DOM Level 2:
|
||
createAttributeNS : function(namespaceURI,qualifiedName){
|
||
var node = new Attr();
|
||
var pl = qualifiedName.split(':');
|
||
node.ownerDocument = this;
|
||
node.nodeName = qualifiedName;
|
||
node.name = qualifiedName;
|
||
node.namespaceURI = namespaceURI;
|
||
node.specified = true;
|
||
if(pl.length == 2){
|
||
node.prefix = pl[0];
|
||
node.localName = pl[1];
|
||
}else{
|
||
//el.prefix = null;
|
||
node.localName = qualifiedName;
|
||
}
|
||
return node;
|
||
}
|
||
};
|
||
_extends(Document,Node);
|
||
|
||
|
||
function Element() {
|
||
this._nsMap = {};
|
||
};
|
||
Element.prototype = {
|
||
nodeType : ELEMENT_NODE,
|
||
hasAttribute : function(name){
|
||
return this.getAttributeNode(name)!=null;
|
||
},
|
||
getAttribute : function(name){
|
||
var attr = this.getAttributeNode(name);
|
||
return attr && attr.value || '';
|
||
},
|
||
getAttributeNode : function(name){
|
||
return this.attributes.getNamedItem(name);
|
||
},
|
||
setAttribute : function(name, value){
|
||
var attr = this.ownerDocument.createAttribute(name);
|
||
attr.value = attr.nodeValue = "" + value;
|
||
this.setAttributeNode(attr)
|
||
},
|
||
removeAttribute : function(name){
|
||
var attr = this.getAttributeNode(name)
|
||
attr && this.removeAttributeNode(attr);
|
||
},
|
||
|
||
//four real opeartion method
|
||
appendChild:function(newChild){
|
||
if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
|
||
return this.insertBefore(newChild,null);
|
||
}else{
|
||
return _appendSingleChild(this,newChild);
|
||
}
|
||
},
|
||
setAttributeNode : function(newAttr){
|
||
return this.attributes.setNamedItem(newAttr);
|
||
},
|
||
setAttributeNodeNS : function(newAttr){
|
||
return this.attributes.setNamedItemNS(newAttr);
|
||
},
|
||
removeAttributeNode : function(oldAttr){
|
||
//console.log(this == oldAttr.ownerElement)
|
||
return this.attributes.removeNamedItem(oldAttr.nodeName);
|
||
},
|
||
//get real attribute name,and remove it by removeAttributeNode
|
||
removeAttributeNS : function(namespaceURI, localName){
|
||
var old = this.getAttributeNodeNS(namespaceURI, localName);
|
||
old && this.removeAttributeNode(old);
|
||
},
|
||
|
||
hasAttributeNS : function(namespaceURI, localName){
|
||
return this.getAttributeNodeNS(namespaceURI, localName)!=null;
|
||
},
|
||
getAttributeNS : function(namespaceURI, localName){
|
||
var attr = this.getAttributeNodeNS(namespaceURI, localName);
|
||
return attr && attr.value || '';
|
||
},
|
||
setAttributeNS : function(namespaceURI, qualifiedName, value){
|
||
var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);
|
||
attr.value = attr.nodeValue = "" + value;
|
||
this.setAttributeNode(attr)
|
||
},
|
||
getAttributeNodeNS : function(namespaceURI, localName){
|
||
return this.attributes.getNamedItemNS(namespaceURI, localName);
|
||
},
|
||
|
||
getElementsByTagName : function(tagName){
|
||
return new LiveNodeList(this,function(base){
|
||
var ls = [];
|
||
_visitNode(base,function(node){
|
||
if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){
|
||
ls.push(node);
|
||
}
|
||
});
|
||
return ls;
|
||
});
|
||
},
|
||
getElementsByTagNameNS : function(namespaceURI, localName){
|
||
return new LiveNodeList(this,function(base){
|
||
var ls = [];
|
||
_visitNode(base,function(node){
|
||
if(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){
|
||
ls.push(node);
|
||
}
|
||
});
|
||
return ls;
|
||
|
||
});
|
||
}
|
||
};
|
||
Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;
|
||
Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;
|
||
|
||
|
||
_extends(Element,Node);
|
||
function Attr() {
|
||
};
|
||
Attr.prototype.nodeType = ATTRIBUTE_NODE;
|
||
_extends(Attr,Node);
|
||
|
||
|
||
function CharacterData() {
|
||
};
|
||
CharacterData.prototype = {
|
||
data : '',
|
||
substringData : function(offset, count) {
|
||
return this.data.substring(offset, offset+count);
|
||
},
|
||
appendData: function(text) {
|
||
text = this.data+text;
|
||
this.nodeValue = this.data = text;
|
||
this.length = text.length;
|
||
},
|
||
insertData: function(offset,text) {
|
||
this.replaceData(offset,0,text);
|
||
|
||
},
|
||
appendChild:function(newChild){
|
||
throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])
|
||
},
|
||
deleteData: function(offset, count) {
|
||
this.replaceData(offset,count,"");
|
||
},
|
||
replaceData: function(offset, count, text) {
|
||
var start = this.data.substring(0,offset);
|
||
var end = this.data.substring(offset+count);
|
||
text = start + text + end;
|
||
this.nodeValue = this.data = text;
|
||
this.length = text.length;
|
||
}
|
||
}
|
||
_extends(CharacterData,Node);
|
||
function Text() {
|
||
};
|
||
Text.prototype = {
|
||
nodeName : "#text",
|
||
nodeType : TEXT_NODE,
|
||
splitText : function(offset) {
|
||
var text = this.data;
|
||
var newText = text.substring(offset);
|
||
text = text.substring(0, offset);
|
||
this.data = this.nodeValue = text;
|
||
this.length = text.length;
|
||
var newNode = this.ownerDocument.createTextNode(newText);
|
||
if(this.parentNode){
|
||
this.parentNode.insertBefore(newNode, this.nextSibling);
|
||
}
|
||
return newNode;
|
||
}
|
||
}
|
||
_extends(Text,CharacterData);
|
||
function Comment() {
|
||
};
|
||
Comment.prototype = {
|
||
nodeName : "#comment",
|
||
nodeType : COMMENT_NODE
|
||
}
|
||
_extends(Comment,CharacterData);
|
||
|
||
function CDATASection() {
|
||
};
|
||
CDATASection.prototype = {
|
||
nodeName : "#cdata-section",
|
||
nodeType : CDATA_SECTION_NODE
|
||
}
|
||
_extends(CDATASection,CharacterData);
|
||
|
||
|
||
function DocumentType() {
|
||
};
|
||
DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;
|
||
_extends(DocumentType,Node);
|
||
|
||
function Notation() {
|
||
};
|
||
Notation.prototype.nodeType = NOTATION_NODE;
|
||
_extends(Notation,Node);
|
||
|
||
function Entity() {
|
||
};
|
||
Entity.prototype.nodeType = ENTITY_NODE;
|
||
_extends(Entity,Node);
|
||
|
||
function EntityReference() {
|
||
};
|
||
EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;
|
||
_extends(EntityReference,Node);
|
||
|
||
function DocumentFragment() {
|
||
};
|
||
DocumentFragment.prototype.nodeName = "#document-fragment";
|
||
DocumentFragment.prototype.nodeType = DOCUMENT_FRAGMENT_NODE;
|
||
_extends(DocumentFragment,Node);
|
||
|
||
|
||
function ProcessingInstruction() {
|
||
}
|
||
ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;
|
||
_extends(ProcessingInstruction,Node);
|
||
function XMLSerializer(){}
|
||
XMLSerializer.prototype.serializeToString = function(node,isHtml,nodeFilter){
|
||
return nodeSerializeToString.call(node,isHtml,nodeFilter);
|
||
}
|
||
Node.prototype.toString = nodeSerializeToString;
|
||
function nodeSerializeToString(isHtml,nodeFilter){
|
||
var buf = [];
|
||
var refNode = this.nodeType == 9 && this.documentElement || this;
|
||
var prefix = refNode.prefix;
|
||
var uri = refNode.namespaceURI;
|
||
|
||
if(uri && prefix == null){
|
||
//console.log(prefix)
|
||
var prefix = refNode.lookupPrefix(uri);
|
||
if(prefix == null){
|
||
//isHTML = true;
|
||
var visibleNamespaces=[
|
||
{namespace:uri,prefix:null}
|
||
//{namespace:uri,prefix:''}
|
||
]
|
||
}
|
||
}
|
||
serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);
|
||
//console.log('###',this.nodeType,uri,prefix,buf.join(''))
|
||
return buf.join('');
|
||
}
|
||
|
||
function needNamespaceDefine(node, isHTML, visibleNamespaces) {
|
||
var prefix = node.prefix || '';
|
||
var uri = node.namespaceURI;
|
||
// According to [Namespaces in XML 1.0](https://www.w3.org/TR/REC-xml-names/#ns-using) ,
|
||
// and more specifically https://www.w3.org/TR/REC-xml-names/#nsc-NoPrefixUndecl :
|
||
// > In a namespace declaration for a prefix [...], the attribute value MUST NOT be empty.
|
||
// in a similar manner [Namespaces in XML 1.1](https://www.w3.org/TR/xml-names11/#ns-using)
|
||
// and more specifically https://www.w3.org/TR/xml-names11/#nsc-NSDeclared :
|
||
// > [...] Furthermore, the attribute value [...] must not be an empty string.
|
||
// so serializing empty namespace value like xmlns:ds="" would produce an invalid XML document.
|
||
if (!uri) {
|
||
return false;
|
||
}
|
||
if (prefix === "xml" && uri === NAMESPACE.XML || uri === NAMESPACE.XMLNS) {
|
||
return false;
|
||
}
|
||
|
||
var i = visibleNamespaces.length
|
||
while (i--) {
|
||
var ns = visibleNamespaces[i];
|
||
// get namespace prefix
|
||
if (ns.prefix === prefix) {
|
||
return ns.namespace !== uri;
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
/**
|
||
* Well-formed constraint: No < in Attribute Values
|
||
* > The replacement text of any entity referred to directly or indirectly
|
||
* > in an attribute value must not contain a <.
|
||
* @see https://www.w3.org/TR/xml11/#CleanAttrVals
|
||
* @see https://www.w3.org/TR/xml11/#NT-AttValue
|
||
*
|
||
* Literal whitespace other than space that appear in attribute values
|
||
* are serialized as their entity references, so they will be preserved.
|
||
* (In contrast to whitespace literals in the input which are normalized to spaces)
|
||
* @see https://www.w3.org/TR/xml11/#AVNormalize
|
||
* @see https://w3c.github.io/DOM-Parsing/#serializing-an-element-s-attributes
|
||
*/
|
||
function addSerializedAttribute(buf, qualifiedName, value) {
|
||
buf.push(' ', qualifiedName, '="', value.replace(/[<>&"\t\n\r]/g, _xmlEncoder), '"')
|
||
}
|
||
|
||
function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){
|
||
if (!visibleNamespaces) {
|
||
visibleNamespaces = [];
|
||
}
|
||
|
||
if(nodeFilter){
|
||
node = nodeFilter(node);
|
||
if(node){
|
||
if(typeof node == 'string'){
|
||
buf.push(node);
|
||
return;
|
||
}
|
||
}else{
|
||
return;
|
||
}
|
||
//buf.sort.apply(attrs, attributeSorter);
|
||
}
|
||
|
||
switch(node.nodeType){
|
||
case ELEMENT_NODE:
|
||
var attrs = node.attributes;
|
||
var len = attrs.length;
|
||
var child = node.firstChild;
|
||
var nodeName = node.tagName;
|
||
|
||
isHTML = NAMESPACE.isHTML(node.namespaceURI) || isHTML
|
||
|
||
var prefixedNodeName = nodeName
|
||
if (!isHTML && !node.prefix && node.namespaceURI) {
|
||
var defaultNS
|
||
// lookup current default ns from `xmlns` attribute
|
||
for (var ai = 0; ai < attrs.length; ai++) {
|
||
if (attrs.item(ai).name === 'xmlns') {
|
||
defaultNS = attrs.item(ai).value
|
||
break
|
||
}
|
||
}
|
||
if (!defaultNS) {
|
||
// lookup current default ns in visibleNamespaces
|
||
for (var nsi = visibleNamespaces.length - 1; nsi >= 0; nsi--) {
|
||
var namespace = visibleNamespaces[nsi]
|
||
if (namespace.prefix === '' && namespace.namespace === node.namespaceURI) {
|
||
defaultNS = namespace.namespace
|
||
break
|
||
}
|
||
}
|
||
}
|
||
if (defaultNS !== node.namespaceURI) {
|
||
for (var nsi = visibleNamespaces.length - 1; nsi >= 0; nsi--) {
|
||
var namespace = visibleNamespaces[nsi]
|
||
if (namespace.namespace === node.namespaceURI) {
|
||
if (namespace.prefix) {
|
||
prefixedNodeName = namespace.prefix + ':' + nodeName
|
||
}
|
||
break
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
buf.push('<', prefixedNodeName);
|
||
|
||
for(var i=0;i<len;i++){
|
||
// add namespaces for attributes
|
||
var attr = attrs.item(i);
|
||
if (attr.prefix == 'xmlns') {
|
||
visibleNamespaces.push({ prefix: attr.localName, namespace: attr.value });
|
||
}else if(attr.nodeName == 'xmlns'){
|
||
visibleNamespaces.push({ prefix: '', namespace: attr.value });
|
||
}
|
||
}
|
||
|
||
for(var i=0;i<len;i++){
|
||
var attr = attrs.item(i);
|
||
if (needNamespaceDefine(attr,isHTML, visibleNamespaces)) {
|
||
var prefix = attr.prefix||'';
|
||
var uri = attr.namespaceURI;
|
||
addSerializedAttribute(buf, prefix ? 'xmlns:' + prefix : "xmlns", uri);
|
||
visibleNamespaces.push({ prefix: prefix, namespace:uri });
|
||
}
|
||
serializeToString(attr,buf,isHTML,nodeFilter,visibleNamespaces);
|
||
}
|
||
|
||
// add namespace for current node
|
||
if (nodeName === prefixedNodeName && needNamespaceDefine(node, isHTML, visibleNamespaces)) {
|
||
var prefix = node.prefix||'';
|
||
var uri = node.namespaceURI;
|
||
addSerializedAttribute(buf, prefix ? 'xmlns:' + prefix : "xmlns", uri);
|
||
visibleNamespaces.push({ prefix: prefix, namespace:uri });
|
||
}
|
||
|
||
if(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){
|
||
buf.push('>');
|
||
//if is cdata child node
|
||
if(isHTML && /^script$/i.test(nodeName)){
|
||
while(child){
|
||
if(child.data){
|
||
buf.push(child.data);
|
||
}else{
|
||
serializeToString(child, buf, isHTML, nodeFilter, visibleNamespaces.slice());
|
||
}
|
||
child = child.nextSibling;
|
||
}
|
||
}else
|
||
{
|
||
while(child){
|
||
serializeToString(child, buf, isHTML, nodeFilter, visibleNamespaces.slice());
|
||
child = child.nextSibling;
|
||
}
|
||
}
|
||
buf.push('</',prefixedNodeName,'>');
|
||
}else{
|
||
buf.push('/>');
|
||
}
|
||
// remove added visible namespaces
|
||
//visibleNamespaces.length = startVisibleNamespaces;
|
||
return;
|
||
case DOCUMENT_NODE:
|
||
case DOCUMENT_FRAGMENT_NODE:
|
||
var child = node.firstChild;
|
||
while(child){
|
||
serializeToString(child, buf, isHTML, nodeFilter, visibleNamespaces.slice());
|
||
child = child.nextSibling;
|
||
}
|
||
return;
|
||
case ATTRIBUTE_NODE:
|
||
return addSerializedAttribute(buf, node.name, node.value);
|
||
case TEXT_NODE:
|
||
/**
|
||
* The ampersand character (&) and the left angle bracket (<) must not appear in their literal form,
|
||
* except when used as markup delimiters, or within a comment, a processing instruction, or a CDATA section.
|
||
* If they are needed elsewhere, they must be escaped using either numeric character references or the strings
|
||
* `&` and `<` respectively.
|
||
* The right angle bracket (>) may be represented using the string " > ", and must, for compatibility,
|
||
* be escaped using either `>` or a character reference when it appears in the string `]]>` in content,
|
||
* when that string is not marking the end of a CDATA section.
|
||
*
|
||
* In the content of elements, character data is any string of characters
|
||
* which does not contain the start-delimiter of any markup
|
||
* and does not include the CDATA-section-close delimiter, `]]>`.
|
||
*
|
||
* @see https://www.w3.org/TR/xml/#NT-CharData
|
||
* @see https://w3c.github.io/DOM-Parsing/#xml-serializing-a-text-node
|
||
*/
|
||
return buf.push(node.data
|
||
.replace(/[<&>]/g,_xmlEncoder)
|
||
);
|
||
case CDATA_SECTION_NODE:
|
||
return buf.push( '<![CDATA[',node.data,']]>');
|
||
case COMMENT_NODE:
|
||
return buf.push( "<!--",node.data,"-->");
|
||
case DOCUMENT_TYPE_NODE:
|
||
var pubid = node.publicId;
|
||
var sysid = node.systemId;
|
||
buf.push('<!DOCTYPE ',node.name);
|
||
if(pubid){
|
||
buf.push(' PUBLIC ', pubid);
|
||
if (sysid && sysid!='.') {
|
||
buf.push(' ', sysid);
|
||
}
|
||
buf.push('>');
|
||
}else if(sysid && sysid!='.'){
|
||
buf.push(' SYSTEM ', sysid, '>');
|
||
}else{
|
||
var sub = node.internalSubset;
|
||
if(sub){
|
||
buf.push(" [",sub,"]");
|
||
}
|
||
buf.push(">");
|
||
}
|
||
return;
|
||
case PROCESSING_INSTRUCTION_NODE:
|
||
return buf.push( "<?",node.target," ",node.data,"?>");
|
||
case ENTITY_REFERENCE_NODE:
|
||
return buf.push( '&',node.nodeName,';');
|
||
//case ENTITY_NODE:
|
||
//case NOTATION_NODE:
|
||
default:
|
||
buf.push('??',node.nodeName);
|
||
}
|
||
}
|
||
function importNode(doc,node,deep){
|
||
var node2;
|
||
switch (node.nodeType) {
|
||
case ELEMENT_NODE:
|
||
node2 = node.cloneNode(false);
|
||
node2.ownerDocument = doc;
|
||
//var attrs = node2.attributes;
|
||
//var len = attrs.length;
|
||
//for(var i=0;i<len;i++){
|
||
//node2.setAttributeNodeNS(importNode(doc,attrs.item(i),deep));
|
||
//}
|
||
case DOCUMENT_FRAGMENT_NODE:
|
||
break;
|
||
case ATTRIBUTE_NODE:
|
||
deep = true;
|
||
break;
|
||
//case ENTITY_REFERENCE_NODE:
|
||
//case PROCESSING_INSTRUCTION_NODE:
|
||
////case TEXT_NODE:
|
||
//case CDATA_SECTION_NODE:
|
||
//case COMMENT_NODE:
|
||
// deep = false;
|
||
// break;
|
||
//case DOCUMENT_NODE:
|
||
//case DOCUMENT_TYPE_NODE:
|
||
//cannot be imported.
|
||
//case ENTITY_NODE:
|
||
//case NOTATION_NODE:
|
||
//can not hit in level3
|
||
//default:throw e;
|
||
}
|
||
if(!node2){
|
||
node2 = node.cloneNode(false);//false
|
||
}
|
||
node2.ownerDocument = doc;
|
||
node2.parentNode = null;
|
||
if(deep){
|
||
var child = node.firstChild;
|
||
while(child){
|
||
node2.appendChild(importNode(doc,child,deep));
|
||
child = child.nextSibling;
|
||
}
|
||
}
|
||
return node2;
|
||
}
|
||
//
|
||
//var _relationMap = {firstChild:1,lastChild:1,previousSibling:1,nextSibling:1,
|
||
// attributes:1,childNodes:1,parentNode:1,documentElement:1,doctype,};
|
||
function cloneNode(doc,node,deep){
|
||
var node2 = new node.constructor();
|
||
for (var n in node) {
|
||
if (Object.prototype.hasOwnProperty.call(node, n)) {
|
||
var v = node[n];
|
||
if (typeof v != "object") {
|
||
if (v != node2[n]) {
|
||
node2[n] = v;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if(node.childNodes){
|
||
node2.childNodes = new NodeList();
|
||
}
|
||
node2.ownerDocument = doc;
|
||
switch (node2.nodeType) {
|
||
case ELEMENT_NODE:
|
||
var attrs = node.attributes;
|
||
var attrs2 = node2.attributes = new NamedNodeMap();
|
||
var len = attrs.length
|
||
attrs2._ownerElement = node2;
|
||
for(var i=0;i<len;i++){
|
||
node2.setAttributeNode(cloneNode(doc,attrs.item(i),true));
|
||
}
|
||
break;;
|
||
case ATTRIBUTE_NODE:
|
||
deep = true;
|
||
}
|
||
if(deep){
|
||
var child = node.firstChild;
|
||
while(child){
|
||
node2.appendChild(cloneNode(doc,child,deep));
|
||
child = child.nextSibling;
|
||
}
|
||
}
|
||
return node2;
|
||
}
|
||
|
||
function __set__(object,key,value){
|
||
object[key] = value
|
||
}
|
||
//do dynamic
|
||
try{
|
||
if(Object.defineProperty){
|
||
Object.defineProperty(LiveNodeList.prototype,'length',{
|
||
get:function(){
|
||
_updateLiveList(this);
|
||
return this.$$length;
|
||
}
|
||
});
|
||
|
||
Object.defineProperty(Node.prototype,'textContent',{
|
||
get:function(){
|
||
return getTextContent(this);
|
||
},
|
||
|
||
set:function(data){
|
||
switch(this.nodeType){
|
||
case ELEMENT_NODE:
|
||
case DOCUMENT_FRAGMENT_NODE:
|
||
while(this.firstChild){
|
||
this.removeChild(this.firstChild);
|
||
}
|
||
if(data || String(data)){
|
||
this.appendChild(this.ownerDocument.createTextNode(data));
|
||
}
|
||
break;
|
||
|
||
default:
|
||
this.data = data;
|
||
this.value = data;
|
||
this.nodeValue = data;
|
||
}
|
||
}
|
||
})
|
||
|
||
function getTextContent(node){
|
||
switch(node.nodeType){
|
||
case ELEMENT_NODE:
|
||
case DOCUMENT_FRAGMENT_NODE:
|
||
var buf = [];
|
||
node = node.firstChild;
|
||
while(node){
|
||
if(node.nodeType!==7 && node.nodeType !==8){
|
||
buf.push(getTextContent(node));
|
||
}
|
||
node = node.nextSibling;
|
||
}
|
||
return buf.join('');
|
||
default:
|
||
return node.nodeValue;
|
||
}
|
||
}
|
||
|
||
__set__ = function(object,key,value){
|
||
//console.log(value)
|
||
object['$$'+key] = value
|
||
}
|
||
}
|
||
}catch(e){//ie8
|
||
}
|
||
|
||
//if(typeof require == 'function'){
|
||
exports.DocumentType = DocumentType;
|
||
exports.DOMException = DOMException;
|
||
exports.DOMImplementation = DOMImplementation;
|
||
exports.Element = Element;
|
||
exports.Node = Node;
|
||
exports.NodeList = NodeList;
|
||
exports.XMLSerializer = XMLSerializer;
|
||
//}
|
||
|
||
},{"./conventions":2}],5:[function(require,module,exports){
|
||
'use strict';
|
||
|
||
var freeze = require('./conventions').freeze;
|
||
|
||
/**
|
||
* The entities that are predefined in every XML document.
|
||
*
|
||
* @see https://www.w3.org/TR/2006/REC-xml11-20060816/#sec-predefined-ent W3C XML 1.1
|
||
* @see https://www.w3.org/TR/2008/REC-xml-20081126/#sec-predefined-ent W3C XML 1.0
|
||
* @see https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references#Predefined_entities_in_XML Wikipedia
|
||
*/
|
||
exports.XML_ENTITIES = freeze({
|
||
amp: '&',
|
||
apos: "'",
|
||
gt: '>',
|
||
lt: '<',
|
||
quot: '"',
|
||
});
|
||
|
||
/**
|
||
* A map of all entities that are detected in an HTML document.
|
||
* They contain all entries from `XML_ENTITIES`.
|
||
*
|
||
* @see XML_ENTITIES
|
||
* @see DOMParser.parseFromString
|
||
* @see DOMImplementation.prototype.createHTMLDocument
|
||
* @see https://html.spec.whatwg.org/#named-character-references WHATWG HTML(5) Spec
|
||
* @see https://html.spec.whatwg.org/entities.json JSON
|
||
* @see https://www.w3.org/TR/xml-entity-names/ W3C XML Entity Names
|
||
* @see https://www.w3.org/TR/html4/sgml/entities.html W3C HTML4/SGML
|
||
* @see https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references#Character_entity_references_in_HTML Wikipedia (HTML)
|
||
* @see https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references#Entities_representing_special_characters_in_XHTML Wikpedia (XHTML)
|
||
*/
|
||
exports.HTML_ENTITIES = freeze({
|
||
Aacute: '\u00C1',
|
||
aacute: '\u00E1',
|
||
Abreve: '\u0102',
|
||
abreve: '\u0103',
|
||
ac: '\u223E',
|
||
acd: '\u223F',
|
||
acE: '\u223E\u0333',
|
||
Acirc: '\u00C2',
|
||
acirc: '\u00E2',
|
||
acute: '\u00B4',
|
||
Acy: '\u0410',
|
||
acy: '\u0430',
|
||
AElig: '\u00C6',
|
||
aelig: '\u00E6',
|
||
af: '\u2061',
|
||
Afr: '\uD835\uDD04',
|
||
afr: '\uD835\uDD1E',
|
||
Agrave: '\u00C0',
|
||
agrave: '\u00E0',
|
||
alefsym: '\u2135',
|
||
aleph: '\u2135',
|
||
Alpha: '\u0391',
|
||
alpha: '\u03B1',
|
||
Amacr: '\u0100',
|
||
amacr: '\u0101',
|
||
amalg: '\u2A3F',
|
||
AMP: '\u0026',
|
||
amp: '\u0026',
|
||
And: '\u2A53',
|
||
and: '\u2227',
|
||
andand: '\u2A55',
|
||
andd: '\u2A5C',
|
||
andslope: '\u2A58',
|
||
andv: '\u2A5A',
|
||
ang: '\u2220',
|
||
ange: '\u29A4',
|
||
angle: '\u2220',
|
||
angmsd: '\u2221',
|
||
angmsdaa: '\u29A8',
|
||
angmsdab: '\u29A9',
|
||
angmsdac: '\u29AA',
|
||
angmsdad: '\u29AB',
|
||
angmsdae: '\u29AC',
|
||
angmsdaf: '\u29AD',
|
||
angmsdag: '\u29AE',
|
||
angmsdah: '\u29AF',
|
||
angrt: '\u221F',
|
||
angrtvb: '\u22BE',
|
||
angrtvbd: '\u299D',
|
||
angsph: '\u2222',
|
||
angst: '\u00C5',
|
||
angzarr: '\u237C',
|
||
Aogon: '\u0104',
|
||
aogon: '\u0105',
|
||
Aopf: '\uD835\uDD38',
|
||
aopf: '\uD835\uDD52',
|
||
ap: '\u2248',
|
||
apacir: '\u2A6F',
|
||
apE: '\u2A70',
|
||
ape: '\u224A',
|
||
apid: '\u224B',
|
||
apos: '\u0027',
|
||
ApplyFunction: '\u2061',
|
||
approx: '\u2248',
|
||
approxeq: '\u224A',
|
||
Aring: '\u00C5',
|
||
aring: '\u00E5',
|
||
Ascr: '\uD835\uDC9C',
|
||
ascr: '\uD835\uDCB6',
|
||
Assign: '\u2254',
|
||
ast: '\u002A',
|
||
asymp: '\u2248',
|
||
asympeq: '\u224D',
|
||
Atilde: '\u00C3',
|
||
atilde: '\u00E3',
|
||
Auml: '\u00C4',
|
||
auml: '\u00E4',
|
||
awconint: '\u2233',
|
||
awint: '\u2A11',
|
||
backcong: '\u224C',
|
||
backepsilon: '\u03F6',
|
||
backprime: '\u2035',
|
||
backsim: '\u223D',
|
||
backsimeq: '\u22CD',
|
||
Backslash: '\u2216',
|
||
Barv: '\u2AE7',
|
||
barvee: '\u22BD',
|
||
Barwed: '\u2306',
|
||
barwed: '\u2305',
|
||
barwedge: '\u2305',
|
||
bbrk: '\u23B5',
|
||
bbrktbrk: '\u23B6',
|
||
bcong: '\u224C',
|
||
Bcy: '\u0411',
|
||
bcy: '\u0431',
|
||
bdquo: '\u201E',
|
||
becaus: '\u2235',
|
||
Because: '\u2235',
|
||
because: '\u2235',
|
||
bemptyv: '\u29B0',
|
||
bepsi: '\u03F6',
|
||
bernou: '\u212C',
|
||
Bernoullis: '\u212C',
|
||
Beta: '\u0392',
|
||
beta: '\u03B2',
|
||
beth: '\u2136',
|
||
between: '\u226C',
|
||
Bfr: '\uD835\uDD05',
|
||
bfr: '\uD835\uDD1F',
|
||
bigcap: '\u22C2',
|
||
bigcirc: '\u25EF',
|
||
bigcup: '\u22C3',
|
||
bigodot: '\u2A00',
|
||
bigoplus: '\u2A01',
|
||
bigotimes: '\u2A02',
|
||
bigsqcup: '\u2A06',
|
||
bigstar: '\u2605',
|
||
bigtriangledown: '\u25BD',
|
||
bigtriangleup: '\u25B3',
|
||
biguplus: '\u2A04',
|
||
bigvee: '\u22C1',
|
||
bigwedge: '\u22C0',
|
||
bkarow: '\u290D',
|
||
blacklozenge: '\u29EB',
|
||
blacksquare: '\u25AA',
|
||
blacktriangle: '\u25B4',
|
||
blacktriangledown: '\u25BE',
|
||
blacktriangleleft: '\u25C2',
|
||
blacktriangleright: '\u25B8',
|
||
blank: '\u2423',
|
||
blk12: '\u2592',
|
||
blk14: '\u2591',
|
||
blk34: '\u2593',
|
||
block: '\u2588',
|
||
bne: '\u003D\u20E5',
|
||
bnequiv: '\u2261\u20E5',
|
||
bNot: '\u2AED',
|
||
bnot: '\u2310',
|
||
Bopf: '\uD835\uDD39',
|
||
bopf: '\uD835\uDD53',
|
||
bot: '\u22A5',
|
||
bottom: '\u22A5',
|
||
bowtie: '\u22C8',
|
||
boxbox: '\u29C9',
|
||
boxDL: '\u2557',
|
||
boxDl: '\u2556',
|
||
boxdL: '\u2555',
|
||
boxdl: '\u2510',
|
||
boxDR: '\u2554',
|
||
boxDr: '\u2553',
|
||
boxdR: '\u2552',
|
||
boxdr: '\u250C',
|
||
boxH: '\u2550',
|
||
boxh: '\u2500',
|
||
boxHD: '\u2566',
|
||
boxHd: '\u2564',
|
||
boxhD: '\u2565',
|
||
boxhd: '\u252C',
|
||
boxHU: '\u2569',
|
||
boxHu: '\u2567',
|
||
boxhU: '\u2568',
|
||
boxhu: '\u2534',
|
||
boxminus: '\u229F',
|
||
boxplus: '\u229E',
|
||
boxtimes: '\u22A0',
|
||
boxUL: '\u255D',
|
||
boxUl: '\u255C',
|
||
boxuL: '\u255B',
|
||
boxul: '\u2518',
|
||
boxUR: '\u255A',
|
||
boxUr: '\u2559',
|
||
boxuR: '\u2558',
|
||
boxur: '\u2514',
|
||
boxV: '\u2551',
|
||
boxv: '\u2502',
|
||
boxVH: '\u256C',
|
||
boxVh: '\u256B',
|
||
boxvH: '\u256A',
|
||
boxvh: '\u253C',
|
||
boxVL: '\u2563',
|
||
boxVl: '\u2562',
|
||
boxvL: '\u2561',
|
||
boxvl: '\u2524',
|
||
boxVR: '\u2560',
|
||
boxVr: '\u255F',
|
||
boxvR: '\u255E',
|
||
boxvr: '\u251C',
|
||
bprime: '\u2035',
|
||
Breve: '\u02D8',
|
||
breve: '\u02D8',
|
||
brvbar: '\u00A6',
|
||
Bscr: '\u212C',
|
||
bscr: '\uD835\uDCB7',
|
||
bsemi: '\u204F',
|
||
bsim: '\u223D',
|
||
bsime: '\u22CD',
|
||
bsol: '\u005C',
|
||
bsolb: '\u29C5',
|
||
bsolhsub: '\u27C8',
|
||
bull: '\u2022',
|
||
bullet: '\u2022',
|
||
bump: '\u224E',
|
||
bumpE: '\u2AAE',
|
||
bumpe: '\u224F',
|
||
Bumpeq: '\u224E',
|
||
bumpeq: '\u224F',
|
||
Cacute: '\u0106',
|
||
cacute: '\u0107',
|
||
Cap: '\u22D2',
|
||
cap: '\u2229',
|
||
capand: '\u2A44',
|
||
capbrcup: '\u2A49',
|
||
capcap: '\u2A4B',
|
||
capcup: '\u2A47',
|
||
capdot: '\u2A40',
|
||
CapitalDifferentialD: '\u2145',
|
||
caps: '\u2229\uFE00',
|
||
caret: '\u2041',
|
||
caron: '\u02C7',
|
||
Cayleys: '\u212D',
|
||
ccaps: '\u2A4D',
|
||
Ccaron: '\u010C',
|
||
ccaron: '\u010D',
|
||
Ccedil: '\u00C7',
|
||
ccedil: '\u00E7',
|
||
Ccirc: '\u0108',
|
||
ccirc: '\u0109',
|
||
Cconint: '\u2230',
|
||
ccups: '\u2A4C',
|
||
ccupssm: '\u2A50',
|
||
Cdot: '\u010A',
|
||
cdot: '\u010B',
|
||
cedil: '\u00B8',
|
||
Cedilla: '\u00B8',
|
||
cemptyv: '\u29B2',
|
||
cent: '\u00A2',
|
||
CenterDot: '\u00B7',
|
||
centerdot: '\u00B7',
|
||
Cfr: '\u212D',
|
||
cfr: '\uD835\uDD20',
|
||
CHcy: '\u0427',
|
||
chcy: '\u0447',
|
||
check: '\u2713',
|
||
checkmark: '\u2713',
|
||
Chi: '\u03A7',
|
||
chi: '\u03C7',
|
||
cir: '\u25CB',
|
||
circ: '\u02C6',
|
||
circeq: '\u2257',
|
||
circlearrowleft: '\u21BA',
|
||
circlearrowright: '\u21BB',
|
||
circledast: '\u229B',
|
||
circledcirc: '\u229A',
|
||
circleddash: '\u229D',
|
||
CircleDot: '\u2299',
|
||
circledR: '\u00AE',
|
||
circledS: '\u24C8',
|
||
CircleMinus: '\u2296',
|
||
CirclePlus: '\u2295',
|
||
CircleTimes: '\u2297',
|
||
cirE: '\u29C3',
|
||
cire: '\u2257',
|
||
cirfnint: '\u2A10',
|
||
cirmid: '\u2AEF',
|
||
cirscir: '\u29C2',
|
||
ClockwiseContourIntegral: '\u2232',
|
||
CloseCurlyDoubleQuote: '\u201D',
|
||
CloseCurlyQuote: '\u2019',
|
||
clubs: '\u2663',
|
||
clubsuit: '\u2663',
|
||
Colon: '\u2237',
|
||
colon: '\u003A',
|
||
Colone: '\u2A74',
|
||
colone: '\u2254',
|
||
coloneq: '\u2254',
|
||
comma: '\u002C',
|
||
commat: '\u0040',
|
||
comp: '\u2201',
|
||
compfn: '\u2218',
|
||
complement: '\u2201',
|
||
complexes: '\u2102',
|
||
cong: '\u2245',
|
||
congdot: '\u2A6D',
|
||
Congruent: '\u2261',
|
||
Conint: '\u222F',
|
||
conint: '\u222E',
|
||
ContourIntegral: '\u222E',
|
||
Copf: '\u2102',
|
||
copf: '\uD835\uDD54',
|
||
coprod: '\u2210',
|
||
Coproduct: '\u2210',
|
||
COPY: '\u00A9',
|
||
copy: '\u00A9',
|
||
copysr: '\u2117',
|
||
CounterClockwiseContourIntegral: '\u2233',
|
||
crarr: '\u21B5',
|
||
Cross: '\u2A2F',
|
||
cross: '\u2717',
|
||
Cscr: '\uD835\uDC9E',
|
||
cscr: '\uD835\uDCB8',
|
||
csub: '\u2ACF',
|
||
csube: '\u2AD1',
|
||
csup: '\u2AD0',
|
||
csupe: '\u2AD2',
|
||
ctdot: '\u22EF',
|
||
cudarrl: '\u2938',
|
||
cudarrr: '\u2935',
|
||
cuepr: '\u22DE',
|
||
cuesc: '\u22DF',
|
||
cularr: '\u21B6',
|
||
cularrp: '\u293D',
|
||
Cup: '\u22D3',
|
||
cup: '\u222A',
|
||
cupbrcap: '\u2A48',
|
||
CupCap: '\u224D',
|
||
cupcap: '\u2A46',
|
||
cupcup: '\u2A4A',
|
||
cupdot: '\u228D',
|
||
cupor: '\u2A45',
|
||
cups: '\u222A\uFE00',
|
||
curarr: '\u21B7',
|
||
curarrm: '\u293C',
|
||
curlyeqprec: '\u22DE',
|
||
curlyeqsucc: '\u22DF',
|
||
curlyvee: '\u22CE',
|
||
curlywedge: '\u22CF',
|
||
curren: '\u00A4',
|
||
curvearrowleft: '\u21B6',
|
||
curvearrowright: '\u21B7',
|
||
cuvee: '\u22CE',
|
||
cuwed: '\u22CF',
|
||
cwconint: '\u2232',
|
||
cwint: '\u2231',
|
||
cylcty: '\u232D',
|
||
Dagger: '\u2021',
|
||
dagger: '\u2020',
|
||
daleth: '\u2138',
|
||
Darr: '\u21A1',
|
||
dArr: '\u21D3',
|
||
darr: '\u2193',
|
||
dash: '\u2010',
|
||
Dashv: '\u2AE4',
|
||
dashv: '\u22A3',
|
||
dbkarow: '\u290F',
|
||
dblac: '\u02DD',
|
||
Dcaron: '\u010E',
|
||
dcaron: '\u010F',
|
||
Dcy: '\u0414',
|
||
dcy: '\u0434',
|
||
DD: '\u2145',
|
||
dd: '\u2146',
|
||
ddagger: '\u2021',
|
||
ddarr: '\u21CA',
|
||
DDotrahd: '\u2911',
|
||
ddotseq: '\u2A77',
|
||
deg: '\u00B0',
|
||
Del: '\u2207',
|
||
Delta: '\u0394',
|
||
delta: '\u03B4',
|
||
demptyv: '\u29B1',
|
||
dfisht: '\u297F',
|
||
Dfr: '\uD835\uDD07',
|
||
dfr: '\uD835\uDD21',
|
||
dHar: '\u2965',
|
||
dharl: '\u21C3',
|
||
dharr: '\u21C2',
|
||
DiacriticalAcute: '\u00B4',
|
||
DiacriticalDot: '\u02D9',
|
||
DiacriticalDoubleAcute: '\u02DD',
|
||
DiacriticalGrave: '\u0060',
|
||
DiacriticalTilde: '\u02DC',
|
||
diam: '\u22C4',
|
||
Diamond: '\u22C4',
|
||
diamond: '\u22C4',
|
||
diamondsuit: '\u2666',
|
||
diams: '\u2666',
|
||
die: '\u00A8',
|
||
DifferentialD: '\u2146',
|
||
digamma: '\u03DD',
|
||
disin: '\u22F2',
|
||
div: '\u00F7',
|
||
divide: '\u00F7',
|
||
divideontimes: '\u22C7',
|
||
divonx: '\u22C7',
|
||
DJcy: '\u0402',
|
||
djcy: '\u0452',
|
||
dlcorn: '\u231E',
|
||
dlcrop: '\u230D',
|
||
dollar: '\u0024',
|
||
Dopf: '\uD835\uDD3B',
|
||
dopf: '\uD835\uDD55',
|
||
Dot: '\u00A8',
|
||
dot: '\u02D9',
|
||
DotDot: '\u20DC',
|
||
doteq: '\u2250',
|
||
doteqdot: '\u2251',
|
||
DotEqual: '\u2250',
|
||
dotminus: '\u2238',
|
||
dotplus: '\u2214',
|
||
dotsquare: '\u22A1',
|
||
doublebarwedge: '\u2306',
|
||
DoubleContourIntegral: '\u222F',
|
||
DoubleDot: '\u00A8',
|
||
DoubleDownArrow: '\u21D3',
|
||
DoubleLeftArrow: '\u21D0',
|
||
DoubleLeftRightArrow: '\u21D4',
|
||
DoubleLeftTee: '\u2AE4',
|
||
DoubleLongLeftArrow: '\u27F8',
|
||
DoubleLongLeftRightArrow: '\u27FA',
|
||
DoubleLongRightArrow: '\u27F9',
|
||
DoubleRightArrow: '\u21D2',
|
||
DoubleRightTee: '\u22A8',
|
||
DoubleUpArrow: '\u21D1',
|
||
DoubleUpDownArrow: '\u21D5',
|
||
DoubleVerticalBar: '\u2225',
|
||
DownArrow: '\u2193',
|
||
Downarrow: '\u21D3',
|
||
downarrow: '\u2193',
|
||
DownArrowBar: '\u2913',
|
||
DownArrowUpArrow: '\u21F5',
|
||
DownBreve: '\u0311',
|
||
downdownarrows: '\u21CA',
|
||
downharpoonleft: '\u21C3',
|
||
downharpoonright: '\u21C2',
|
||
DownLeftRightVector: '\u2950',
|
||
DownLeftTeeVector: '\u295E',
|
||
DownLeftVector: '\u21BD',
|
||
DownLeftVectorBar: '\u2956',
|
||
DownRightTeeVector: '\u295F',
|
||
DownRightVector: '\u21C1',
|
||
DownRightVectorBar: '\u2957',
|
||
DownTee: '\u22A4',
|
||
DownTeeArrow: '\u21A7',
|
||
drbkarow: '\u2910',
|
||
drcorn: '\u231F',
|
||
drcrop: '\u230C',
|
||
Dscr: '\uD835\uDC9F',
|
||
dscr: '\uD835\uDCB9',
|
||
DScy: '\u0405',
|
||
dscy: '\u0455',
|
||
dsol: '\u29F6',
|
||
Dstrok: '\u0110',
|
||
dstrok: '\u0111',
|
||
dtdot: '\u22F1',
|
||
dtri: '\u25BF',
|
||
dtrif: '\u25BE',
|
||
duarr: '\u21F5',
|
||
duhar: '\u296F',
|
||
dwangle: '\u29A6',
|
||
DZcy: '\u040F',
|
||
dzcy: '\u045F',
|
||
dzigrarr: '\u27FF',
|
||
Eacute: '\u00C9',
|
||
eacute: '\u00E9',
|
||
easter: '\u2A6E',
|
||
Ecaron: '\u011A',
|
||
ecaron: '\u011B',
|
||
ecir: '\u2256',
|
||
Ecirc: '\u00CA',
|
||
ecirc: '\u00EA',
|
||
ecolon: '\u2255',
|
||
Ecy: '\u042D',
|
||
ecy: '\u044D',
|
||
eDDot: '\u2A77',
|
||
Edot: '\u0116',
|
||
eDot: '\u2251',
|
||
edot: '\u0117',
|
||
ee: '\u2147',
|
||
efDot: '\u2252',
|
||
Efr: '\uD835\uDD08',
|
||
efr: '\uD835\uDD22',
|
||
eg: '\u2A9A',
|
||
Egrave: '\u00C8',
|
||
egrave: '\u00E8',
|
||
egs: '\u2A96',
|
||
egsdot: '\u2A98',
|
||
el: '\u2A99',
|
||
Element: '\u2208',
|
||
elinters: '\u23E7',
|
||
ell: '\u2113',
|
||
els: '\u2A95',
|
||
elsdot: '\u2A97',
|
||
Emacr: '\u0112',
|
||
emacr: '\u0113',
|
||
empty: '\u2205',
|
||
emptyset: '\u2205',
|
||
EmptySmallSquare: '\u25FB',
|
||
emptyv: '\u2205',
|
||
EmptyVerySmallSquare: '\u25AB',
|
||
emsp: '\u2003',
|
||
emsp13: '\u2004',
|
||
emsp14: '\u2005',
|
||
ENG: '\u014A',
|
||
eng: '\u014B',
|
||
ensp: '\u2002',
|
||
Eogon: '\u0118',
|
||
eogon: '\u0119',
|
||
Eopf: '\uD835\uDD3C',
|
||
eopf: '\uD835\uDD56',
|
||
epar: '\u22D5',
|
||
eparsl: '\u29E3',
|
||
eplus: '\u2A71',
|
||
epsi: '\u03B5',
|
||
Epsilon: '\u0395',
|
||
epsilon: '\u03B5',
|
||
epsiv: '\u03F5',
|
||
eqcirc: '\u2256',
|
||
eqcolon: '\u2255',
|
||
eqsim: '\u2242',
|
||
eqslantgtr: '\u2A96',
|
||
eqslantless: '\u2A95',
|
||
Equal: '\u2A75',
|
||
equals: '\u003D',
|
||
EqualTilde: '\u2242',
|
||
equest: '\u225F',
|
||
Equilibrium: '\u21CC',
|
||
equiv: '\u2261',
|
||
equivDD: '\u2A78',
|
||
eqvparsl: '\u29E5',
|
||
erarr: '\u2971',
|
||
erDot: '\u2253',
|
||
Escr: '\u2130',
|
||
escr: '\u212F',
|
||
esdot: '\u2250',
|
||
Esim: '\u2A73',
|
||
esim: '\u2242',
|
||
Eta: '\u0397',
|
||
eta: '\u03B7',
|
||
ETH: '\u00D0',
|
||
eth: '\u00F0',
|
||
Euml: '\u00CB',
|
||
euml: '\u00EB',
|
||
euro: '\u20AC',
|
||
excl: '\u0021',
|
||
exist: '\u2203',
|
||
Exists: '\u2203',
|
||
expectation: '\u2130',
|
||
ExponentialE: '\u2147',
|
||
exponentiale: '\u2147',
|
||
fallingdotseq: '\u2252',
|
||
Fcy: '\u0424',
|
||
fcy: '\u0444',
|
||
female: '\u2640',
|
||
ffilig: '\uFB03',
|
||
fflig: '\uFB00',
|
||
ffllig: '\uFB04',
|
||
Ffr: '\uD835\uDD09',
|
||
ffr: '\uD835\uDD23',
|
||
filig: '\uFB01',
|
||
FilledSmallSquare: '\u25FC',
|
||
FilledVerySmallSquare: '\u25AA',
|
||
fjlig: '\u0066\u006A',
|
||
flat: '\u266D',
|
||
fllig: '\uFB02',
|
||
fltns: '\u25B1',
|
||
fnof: '\u0192',
|
||
Fopf: '\uD835\uDD3D',
|
||
fopf: '\uD835\uDD57',
|
||
ForAll: '\u2200',
|
||
forall: '\u2200',
|
||
fork: '\u22D4',
|
||
forkv: '\u2AD9',
|
||
Fouriertrf: '\u2131',
|
||
fpartint: '\u2A0D',
|
||
frac12: '\u00BD',
|
||
frac13: '\u2153',
|
||
frac14: '\u00BC',
|
||
frac15: '\u2155',
|
||
frac16: '\u2159',
|
||
frac18: '\u215B',
|
||
frac23: '\u2154',
|
||
frac25: '\u2156',
|
||
frac34: '\u00BE',
|
||
frac35: '\u2157',
|
||
frac38: '\u215C',
|
||
frac45: '\u2158',
|
||
frac56: '\u215A',
|
||
frac58: '\u215D',
|
||
frac78: '\u215E',
|
||
frasl: '\u2044',
|
||
frown: '\u2322',
|
||
Fscr: '\u2131',
|
||
fscr: '\uD835\uDCBB',
|
||
gacute: '\u01F5',
|
||
Gamma: '\u0393',
|
||
gamma: '\u03B3',
|
||
Gammad: '\u03DC',
|
||
gammad: '\u03DD',
|
||
gap: '\u2A86',
|
||
Gbreve: '\u011E',
|
||
gbreve: '\u011F',
|
||
Gcedil: '\u0122',
|
||
Gcirc: '\u011C',
|
||
gcirc: '\u011D',
|
||
Gcy: '\u0413',
|
||
gcy: '\u0433',
|
||
Gdot: '\u0120',
|
||
gdot: '\u0121',
|
||
gE: '\u2267',
|
||
ge: '\u2265',
|
||
gEl: '\u2A8C',
|
||
gel: '\u22DB',
|
||
geq: '\u2265',
|
||
geqq: '\u2267',
|
||
geqslant: '\u2A7E',
|
||
ges: '\u2A7E',
|
||
gescc: '\u2AA9',
|
||
gesdot: '\u2A80',
|
||
gesdoto: '\u2A82',
|
||
gesdotol: '\u2A84',
|
||
gesl: '\u22DB\uFE00',
|
||
gesles: '\u2A94',
|
||
Gfr: '\uD835\uDD0A',
|
||
gfr: '\uD835\uDD24',
|
||
Gg: '\u22D9',
|
||
gg: '\u226B',
|
||
ggg: '\u22D9',
|
||
gimel: '\u2137',
|
||
GJcy: '\u0403',
|
||
gjcy: '\u0453',
|
||
gl: '\u2277',
|
||
gla: '\u2AA5',
|
||
glE: '\u2A92',
|
||
glj: '\u2AA4',
|
||
gnap: '\u2A8A',
|
||
gnapprox: '\u2A8A',
|
||
gnE: '\u2269',
|
||
gne: '\u2A88',
|
||
gneq: '\u2A88',
|
||
gneqq: '\u2269',
|
||
gnsim: '\u22E7',
|
||
Gopf: '\uD835\uDD3E',
|
||
gopf: '\uD835\uDD58',
|
||
grave: '\u0060',
|
||
GreaterEqual: '\u2265',
|
||
GreaterEqualLess: '\u22DB',
|
||
GreaterFullEqual: '\u2267',
|
||
GreaterGreater: '\u2AA2',
|
||
GreaterLess: '\u2277',
|
||
GreaterSlantEqual: '\u2A7E',
|
||
GreaterTilde: '\u2273',
|
||
Gscr: '\uD835\uDCA2',
|
||
gscr: '\u210A',
|
||
gsim: '\u2273',
|
||
gsime: '\u2A8E',
|
||
gsiml: '\u2A90',
|
||
Gt: '\u226B',
|
||
GT: '\u003E',
|
||
gt: '\u003E',
|
||
gtcc: '\u2AA7',
|
||
gtcir: '\u2A7A',
|
||
gtdot: '\u22D7',
|
||
gtlPar: '\u2995',
|
||
gtquest: '\u2A7C',
|
||
gtrapprox: '\u2A86',
|
||
gtrarr: '\u2978',
|
||
gtrdot: '\u22D7',
|
||
gtreqless: '\u22DB',
|
||
gtreqqless: '\u2A8C',
|
||
gtrless: '\u2277',
|
||
gtrsim: '\u2273',
|
||
gvertneqq: '\u2269\uFE00',
|
||
gvnE: '\u2269\uFE00',
|
||
Hacek: '\u02C7',
|
||
hairsp: '\u200A',
|
||
half: '\u00BD',
|
||
hamilt: '\u210B',
|
||
HARDcy: '\u042A',
|
||
hardcy: '\u044A',
|
||
hArr: '\u21D4',
|
||
harr: '\u2194',
|
||
harrcir: '\u2948',
|
||
harrw: '\u21AD',
|
||
Hat: '\u005E',
|
||
hbar: '\u210F',
|
||
Hcirc: '\u0124',
|
||
hcirc: '\u0125',
|
||
hearts: '\u2665',
|
||
heartsuit: '\u2665',
|
||
hellip: '\u2026',
|
||
hercon: '\u22B9',
|
||
Hfr: '\u210C',
|
||
hfr: '\uD835\uDD25',
|
||
HilbertSpace: '\u210B',
|
||
hksearow: '\u2925',
|
||
hkswarow: '\u2926',
|
||
hoarr: '\u21FF',
|
||
homtht: '\u223B',
|
||
hookleftarrow: '\u21A9',
|
||
hookrightarrow: '\u21AA',
|
||
Hopf: '\u210D',
|
||
hopf: '\uD835\uDD59',
|
||
horbar: '\u2015',
|
||
HorizontalLine: '\u2500',
|
||
Hscr: '\u210B',
|
||
hscr: '\uD835\uDCBD',
|
||
hslash: '\u210F',
|
||
Hstrok: '\u0126',
|
||
hstrok: '\u0127',
|
||
HumpDownHump: '\u224E',
|
||
HumpEqual: '\u224F',
|
||
hybull: '\u2043',
|
||
hyphen: '\u2010',
|
||
Iacute: '\u00CD',
|
||
iacute: '\u00ED',
|
||
ic: '\u2063',
|
||
Icirc: '\u00CE',
|
||
icirc: '\u00EE',
|
||
Icy: '\u0418',
|
||
icy: '\u0438',
|
||
Idot: '\u0130',
|
||
IEcy: '\u0415',
|
||
iecy: '\u0435',
|
||
iexcl: '\u00A1',
|
||
iff: '\u21D4',
|
||
Ifr: '\u2111',
|
||
ifr: '\uD835\uDD26',
|
||
Igrave: '\u00CC',
|
||
igrave: '\u00EC',
|
||
ii: '\u2148',
|
||
iiiint: '\u2A0C',
|
||
iiint: '\u222D',
|
||
iinfin: '\u29DC',
|
||
iiota: '\u2129',
|
||
IJlig: '\u0132',
|
||
ijlig: '\u0133',
|
||
Im: '\u2111',
|
||
Imacr: '\u012A',
|
||
imacr: '\u012B',
|
||
image: '\u2111',
|
||
ImaginaryI: '\u2148',
|
||
imagline: '\u2110',
|
||
imagpart: '\u2111',
|
||
imath: '\u0131',
|
||
imof: '\u22B7',
|
||
imped: '\u01B5',
|
||
Implies: '\u21D2',
|
||
in: '\u2208',
|
||
incare: '\u2105',
|
||
infin: '\u221E',
|
||
infintie: '\u29DD',
|
||
inodot: '\u0131',
|
||
Int: '\u222C',
|
||
int: '\u222B',
|
||
intcal: '\u22BA',
|
||
integers: '\u2124',
|
||
Integral: '\u222B',
|
||
intercal: '\u22BA',
|
||
Intersection: '\u22C2',
|
||
intlarhk: '\u2A17',
|
||
intprod: '\u2A3C',
|
||
InvisibleComma: '\u2063',
|
||
InvisibleTimes: '\u2062',
|
||
IOcy: '\u0401',
|
||
iocy: '\u0451',
|
||
Iogon: '\u012E',
|
||
iogon: '\u012F',
|
||
Iopf: '\uD835\uDD40',
|
||
iopf: '\uD835\uDD5A',
|
||
Iota: '\u0399',
|
||
iota: '\u03B9',
|
||
iprod: '\u2A3C',
|
||
iquest: '\u00BF',
|
||
Iscr: '\u2110',
|
||
iscr: '\uD835\uDCBE',
|
||
isin: '\u2208',
|
||
isindot: '\u22F5',
|
||
isinE: '\u22F9',
|
||
isins: '\u22F4',
|
||
isinsv: '\u22F3',
|
||
isinv: '\u2208',
|
||
it: '\u2062',
|
||
Itilde: '\u0128',
|
||
itilde: '\u0129',
|
||
Iukcy: '\u0406',
|
||
iukcy: '\u0456',
|
||
Iuml: '\u00CF',
|
||
iuml: '\u00EF',
|
||
Jcirc: '\u0134',
|
||
jcirc: '\u0135',
|
||
Jcy: '\u0419',
|
||
jcy: '\u0439',
|
||
Jfr: '\uD835\uDD0D',
|
||
jfr: '\uD835\uDD27',
|
||
jmath: '\u0237',
|
||
Jopf: '\uD835\uDD41',
|
||
jopf: '\uD835\uDD5B',
|
||
Jscr: '\uD835\uDCA5',
|
||
jscr: '\uD835\uDCBF',
|
||
Jsercy: '\u0408',
|
||
jsercy: '\u0458',
|
||
Jukcy: '\u0404',
|
||
jukcy: '\u0454',
|
||
Kappa: '\u039A',
|
||
kappa: '\u03BA',
|
||
kappav: '\u03F0',
|
||
Kcedil: '\u0136',
|
||
kcedil: '\u0137',
|
||
Kcy: '\u041A',
|
||
kcy: '\u043A',
|
||
Kfr: '\uD835\uDD0E',
|
||
kfr: '\uD835\uDD28',
|
||
kgreen: '\u0138',
|
||
KHcy: '\u0425',
|
||
khcy: '\u0445',
|
||
KJcy: '\u040C',
|
||
kjcy: '\u045C',
|
||
Kopf: '\uD835\uDD42',
|
||
kopf: '\uD835\uDD5C',
|
||
Kscr: '\uD835\uDCA6',
|
||
kscr: '\uD835\uDCC0',
|
||
lAarr: '\u21DA',
|
||
Lacute: '\u0139',
|
||
lacute: '\u013A',
|
||
laemptyv: '\u29B4',
|
||
lagran: '\u2112',
|
||
Lambda: '\u039B',
|
||
lambda: '\u03BB',
|
||
Lang: '\u27EA',
|
||
lang: '\u27E8',
|
||
langd: '\u2991',
|
||
langle: '\u27E8',
|
||
lap: '\u2A85',
|
||
Laplacetrf: '\u2112',
|
||
laquo: '\u00AB',
|
||
Larr: '\u219E',
|
||
lArr: '\u21D0',
|
||
larr: '\u2190',
|
||
larrb: '\u21E4',
|
||
larrbfs: '\u291F',
|
||
larrfs: '\u291D',
|
||
larrhk: '\u21A9',
|
||
larrlp: '\u21AB',
|
||
larrpl: '\u2939',
|
||
larrsim: '\u2973',
|
||
larrtl: '\u21A2',
|
||
lat: '\u2AAB',
|
||
lAtail: '\u291B',
|
||
latail: '\u2919',
|
||
late: '\u2AAD',
|
||
lates: '\u2AAD\uFE00',
|
||
lBarr: '\u290E',
|
||
lbarr: '\u290C',
|
||
lbbrk: '\u2772',
|
||
lbrace: '\u007B',
|
||
lbrack: '\u005B',
|
||
lbrke: '\u298B',
|
||
lbrksld: '\u298F',
|
||
lbrkslu: '\u298D',
|
||
Lcaron: '\u013D',
|
||
lcaron: '\u013E',
|
||
Lcedil: '\u013B',
|
||
lcedil: '\u013C',
|
||
lceil: '\u2308',
|
||
lcub: '\u007B',
|
||
Lcy: '\u041B',
|
||
lcy: '\u043B',
|
||
ldca: '\u2936',
|
||
ldquo: '\u201C',
|
||
ldquor: '\u201E',
|
||
ldrdhar: '\u2967',
|
||
ldrushar: '\u294B',
|
||
ldsh: '\u21B2',
|
||
lE: '\u2266',
|
||
le: '\u2264',
|
||
LeftAngleBracket: '\u27E8',
|
||
LeftArrow: '\u2190',
|
||
Leftarrow: '\u21D0',
|
||
leftarrow: '\u2190',
|
||
LeftArrowBar: '\u21E4',
|
||
LeftArrowRightArrow: '\u21C6',
|
||
leftarrowtail: '\u21A2',
|
||
LeftCeiling: '\u2308',
|
||
LeftDoubleBracket: '\u27E6',
|
||
LeftDownTeeVector: '\u2961',
|
||
LeftDownVector: '\u21C3',
|
||
LeftDownVectorBar: '\u2959',
|
||
LeftFloor: '\u230A',
|
||
leftharpoondown: '\u21BD',
|
||
leftharpoonup: '\u21BC',
|
||
leftleftarrows: '\u21C7',
|
||
LeftRightArrow: '\u2194',
|
||
Leftrightarrow: '\u21D4',
|
||
leftrightarrow: '\u2194',
|
||
leftrightarrows: '\u21C6',
|
||
leftrightharpoons: '\u21CB',
|
||
leftrightsquigarrow: '\u21AD',
|
||
LeftRightVector: '\u294E',
|
||
LeftTee: '\u22A3',
|
||
LeftTeeArrow: '\u21A4',
|
||
LeftTeeVector: '\u295A',
|
||
leftthreetimes: '\u22CB',
|
||
LeftTriangle: '\u22B2',
|
||
LeftTriangleBar: '\u29CF',
|
||
LeftTriangleEqual: '\u22B4',
|
||
LeftUpDownVector: '\u2951',
|
||
LeftUpTeeVector: '\u2960',
|
||
LeftUpVector: '\u21BF',
|
||
LeftUpVectorBar: '\u2958',
|
||
LeftVector: '\u21BC',
|
||
LeftVectorBar: '\u2952',
|
||
lEg: '\u2A8B',
|
||
leg: '\u22DA',
|
||
leq: '\u2264',
|
||
leqq: '\u2266',
|
||
leqslant: '\u2A7D',
|
||
les: '\u2A7D',
|
||
lescc: '\u2AA8',
|
||
lesdot: '\u2A7F',
|
||
lesdoto: '\u2A81',
|
||
lesdotor: '\u2A83',
|
||
lesg: '\u22DA\uFE00',
|
||
lesges: '\u2A93',
|
||
lessapprox: '\u2A85',
|
||
lessdot: '\u22D6',
|
||
lesseqgtr: '\u22DA',
|
||
lesseqqgtr: '\u2A8B',
|
||
LessEqualGreater: '\u22DA',
|
||
LessFullEqual: '\u2266',
|
||
LessGreater: '\u2276',
|
||
lessgtr: '\u2276',
|
||
LessLess: '\u2AA1',
|
||
lesssim: '\u2272',
|
||
LessSlantEqual: '\u2A7D',
|
||
LessTilde: '\u2272',
|
||
lfisht: '\u297C',
|
||
lfloor: '\u230A',
|
||
Lfr: '\uD835\uDD0F',
|
||
lfr: '\uD835\uDD29',
|
||
lg: '\u2276',
|
||
lgE: '\u2A91',
|
||
lHar: '\u2962',
|
||
lhard: '\u21BD',
|
||
lharu: '\u21BC',
|
||
lharul: '\u296A',
|
||
lhblk: '\u2584',
|
||
LJcy: '\u0409',
|
||
ljcy: '\u0459',
|
||
Ll: '\u22D8',
|
||
ll: '\u226A',
|
||
llarr: '\u21C7',
|
||
llcorner: '\u231E',
|
||
Lleftarrow: '\u21DA',
|
||
llhard: '\u296B',
|
||
lltri: '\u25FA',
|
||
Lmidot: '\u013F',
|
||
lmidot: '\u0140',
|
||
lmoust: '\u23B0',
|
||
lmoustache: '\u23B0',
|
||
lnap: '\u2A89',
|
||
lnapprox: '\u2A89',
|
||
lnE: '\u2268',
|
||
lne: '\u2A87',
|
||
lneq: '\u2A87',
|
||
lneqq: '\u2268',
|
||
lnsim: '\u22E6',
|
||
loang: '\u27EC',
|
||
loarr: '\u21FD',
|
||
lobrk: '\u27E6',
|
||
LongLeftArrow: '\u27F5',
|
||
Longleftarrow: '\u27F8',
|
||
longleftarrow: '\u27F5',
|
||
LongLeftRightArrow: '\u27F7',
|
||
Longleftrightarrow: '\u27FA',
|
||
longleftrightarrow: '\u27F7',
|
||
longmapsto: '\u27FC',
|
||
LongRightArrow: '\u27F6',
|
||
Longrightarrow: '\u27F9',
|
||
longrightarrow: '\u27F6',
|
||
looparrowleft: '\u21AB',
|
||
looparrowright: '\u21AC',
|
||
lopar: '\u2985',
|
||
Lopf: '\uD835\uDD43',
|
||
lopf: '\uD835\uDD5D',
|
||
loplus: '\u2A2D',
|
||
lotimes: '\u2A34',
|
||
lowast: '\u2217',
|
||
lowbar: '\u005F',
|
||
LowerLeftArrow: '\u2199',
|
||
LowerRightArrow: '\u2198',
|
||
loz: '\u25CA',
|
||
lozenge: '\u25CA',
|
||
lozf: '\u29EB',
|
||
lpar: '\u0028',
|
||
lparlt: '\u2993',
|
||
lrarr: '\u21C6',
|
||
lrcorner: '\u231F',
|
||
lrhar: '\u21CB',
|
||
lrhard: '\u296D',
|
||
lrm: '\u200E',
|
||
lrtri: '\u22BF',
|
||
lsaquo: '\u2039',
|
||
Lscr: '\u2112',
|
||
lscr: '\uD835\uDCC1',
|
||
Lsh: '\u21B0',
|
||
lsh: '\u21B0',
|
||
lsim: '\u2272',
|
||
lsime: '\u2A8D',
|
||
lsimg: '\u2A8F',
|
||
lsqb: '\u005B',
|
||
lsquo: '\u2018',
|
||
lsquor: '\u201A',
|
||
Lstrok: '\u0141',
|
||
lstrok: '\u0142',
|
||
Lt: '\u226A',
|
||
LT: '\u003C',
|
||
lt: '\u003C',
|
||
ltcc: '\u2AA6',
|
||
ltcir: '\u2A79',
|
||
ltdot: '\u22D6',
|
||
lthree: '\u22CB',
|
||
ltimes: '\u22C9',
|
||
ltlarr: '\u2976',
|
||
ltquest: '\u2A7B',
|
||
ltri: '\u25C3',
|
||
ltrie: '\u22B4',
|
||
ltrif: '\u25C2',
|
||
ltrPar: '\u2996',
|
||
lurdshar: '\u294A',
|
||
luruhar: '\u2966',
|
||
lvertneqq: '\u2268\uFE00',
|
||
lvnE: '\u2268\uFE00',
|
||
macr: '\u00AF',
|
||
male: '\u2642',
|
||
malt: '\u2720',
|
||
maltese: '\u2720',
|
||
Map: '\u2905',
|
||
map: '\u21A6',
|
||
mapsto: '\u21A6',
|
||
mapstodown: '\u21A7',
|
||
mapstoleft: '\u21A4',
|
||
mapstoup: '\u21A5',
|
||
marker: '\u25AE',
|
||
mcomma: '\u2A29',
|
||
Mcy: '\u041C',
|
||
mcy: '\u043C',
|
||
mdash: '\u2014',
|
||
mDDot: '\u223A',
|
||
measuredangle: '\u2221',
|
||
MediumSpace: '\u205F',
|
||
Mellintrf: '\u2133',
|
||
Mfr: '\uD835\uDD10',
|
||
mfr: '\uD835\uDD2A',
|
||
mho: '\u2127',
|
||
micro: '\u00B5',
|
||
mid: '\u2223',
|
||
midast: '\u002A',
|
||
midcir: '\u2AF0',
|
||
middot: '\u00B7',
|
||
minus: '\u2212',
|
||
minusb: '\u229F',
|
||
minusd: '\u2238',
|
||
minusdu: '\u2A2A',
|
||
MinusPlus: '\u2213',
|
||
mlcp: '\u2ADB',
|
||
mldr: '\u2026',
|
||
mnplus: '\u2213',
|
||
models: '\u22A7',
|
||
Mopf: '\uD835\uDD44',
|
||
mopf: '\uD835\uDD5E',
|
||
mp: '\u2213',
|
||
Mscr: '\u2133',
|
||
mscr: '\uD835\uDCC2',
|
||
mstpos: '\u223E',
|
||
Mu: '\u039C',
|
||
mu: '\u03BC',
|
||
multimap: '\u22B8',
|
||
mumap: '\u22B8',
|
||
nabla: '\u2207',
|
||
Nacute: '\u0143',
|
||
nacute: '\u0144',
|
||
nang: '\u2220\u20D2',
|
||
nap: '\u2249',
|
||
napE: '\u2A70\u0338',
|
||
napid: '\u224B\u0338',
|
||
napos: '\u0149',
|
||
napprox: '\u2249',
|
||
natur: '\u266E',
|
||
natural: '\u266E',
|
||
naturals: '\u2115',
|
||
nbsp: '\u00A0',
|
||
nbump: '\u224E\u0338',
|
||
nbumpe: '\u224F\u0338',
|
||
ncap: '\u2A43',
|
||
Ncaron: '\u0147',
|
||
ncaron: '\u0148',
|
||
Ncedil: '\u0145',
|
||
ncedil: '\u0146',
|
||
ncong: '\u2247',
|
||
ncongdot: '\u2A6D\u0338',
|
||
ncup: '\u2A42',
|
||
Ncy: '\u041D',
|
||
ncy: '\u043D',
|
||
ndash: '\u2013',
|
||
ne: '\u2260',
|
||
nearhk: '\u2924',
|
||
neArr: '\u21D7',
|
||
nearr: '\u2197',
|
||
nearrow: '\u2197',
|
||
nedot: '\u2250\u0338',
|
||
NegativeMediumSpace: '\u200B',
|
||
NegativeThickSpace: '\u200B',
|
||
NegativeThinSpace: '\u200B',
|
||
NegativeVeryThinSpace: '\u200B',
|
||
nequiv: '\u2262',
|
||
nesear: '\u2928',
|
||
nesim: '\u2242\u0338',
|
||
NestedGreaterGreater: '\u226B',
|
||
NestedLessLess: '\u226A',
|
||
NewLine: '\u000A',
|
||
nexist: '\u2204',
|
||
nexists: '\u2204',
|
||
Nfr: '\uD835\uDD11',
|
||
nfr: '\uD835\uDD2B',
|
||
ngE: '\u2267\u0338',
|
||
nge: '\u2271',
|
||
ngeq: '\u2271',
|
||
ngeqq: '\u2267\u0338',
|
||
ngeqslant: '\u2A7E\u0338',
|
||
nges: '\u2A7E\u0338',
|
||
nGg: '\u22D9\u0338',
|
||
ngsim: '\u2275',
|
||
nGt: '\u226B\u20D2',
|
||
ngt: '\u226F',
|
||
ngtr: '\u226F',
|
||
nGtv: '\u226B\u0338',
|
||
nhArr: '\u21CE',
|
||
nharr: '\u21AE',
|
||
nhpar: '\u2AF2',
|
||
ni: '\u220B',
|
||
nis: '\u22FC',
|
||
nisd: '\u22FA',
|
||
niv: '\u220B',
|
||
NJcy: '\u040A',
|
||
njcy: '\u045A',
|
||
nlArr: '\u21CD',
|
||
nlarr: '\u219A',
|
||
nldr: '\u2025',
|
||
nlE: '\u2266\u0338',
|
||
nle: '\u2270',
|
||
nLeftarrow: '\u21CD',
|
||
nleftarrow: '\u219A',
|
||
nLeftrightarrow: '\u21CE',
|
||
nleftrightarrow: '\u21AE',
|
||
nleq: '\u2270',
|
||
nleqq: '\u2266\u0338',
|
||
nleqslant: '\u2A7D\u0338',
|
||
nles: '\u2A7D\u0338',
|
||
nless: '\u226E',
|
||
nLl: '\u22D8\u0338',
|
||
nlsim: '\u2274',
|
||
nLt: '\u226A\u20D2',
|
||
nlt: '\u226E',
|
||
nltri: '\u22EA',
|
||
nltrie: '\u22EC',
|
||
nLtv: '\u226A\u0338',
|
||
nmid: '\u2224',
|
||
NoBreak: '\u2060',
|
||
NonBreakingSpace: '\u00A0',
|
||
Nopf: '\u2115',
|
||
nopf: '\uD835\uDD5F',
|
||
Not: '\u2AEC',
|
||
not: '\u00AC',
|
||
NotCongruent: '\u2262',
|
||
NotCupCap: '\u226D',
|
||
NotDoubleVerticalBar: '\u2226',
|
||
NotElement: '\u2209',
|
||
NotEqual: '\u2260',
|
||
NotEqualTilde: '\u2242\u0338',
|
||
NotExists: '\u2204',
|
||
NotGreater: '\u226F',
|
||
NotGreaterEqual: '\u2271',
|
||
NotGreaterFullEqual: '\u2267\u0338',
|
||
NotGreaterGreater: '\u226B\u0338',
|
||
NotGreaterLess: '\u2279',
|
||
NotGreaterSlantEqual: '\u2A7E\u0338',
|
||
NotGreaterTilde: '\u2275',
|
||
NotHumpDownHump: '\u224E\u0338',
|
||
NotHumpEqual: '\u224F\u0338',
|
||
notin: '\u2209',
|
||
notindot: '\u22F5\u0338',
|
||
notinE: '\u22F9\u0338',
|
||
notinva: '\u2209',
|
||
notinvb: '\u22F7',
|
||
notinvc: '\u22F6',
|
||
NotLeftTriangle: '\u22EA',
|
||
NotLeftTriangleBar: '\u29CF\u0338',
|
||
NotLeftTriangleEqual: '\u22EC',
|
||
NotLess: '\u226E',
|
||
NotLessEqual: '\u2270',
|
||
NotLessGreater: '\u2278',
|
||
NotLessLess: '\u226A\u0338',
|
||
NotLessSlantEqual: '\u2A7D\u0338',
|
||
NotLessTilde: '\u2274',
|
||
NotNestedGreaterGreater: '\u2AA2\u0338',
|
||
NotNestedLessLess: '\u2AA1\u0338',
|
||
notni: '\u220C',
|
||
notniva: '\u220C',
|
||
notnivb: '\u22FE',
|
||
notnivc: '\u22FD',
|
||
NotPrecedes: '\u2280',
|
||
NotPrecedesEqual: '\u2AAF\u0338',
|
||
NotPrecedesSlantEqual: '\u22E0',
|
||
NotReverseElement: '\u220C',
|
||
NotRightTriangle: '\u22EB',
|
||
NotRightTriangleBar: '\u29D0\u0338',
|
||
NotRightTriangleEqual: '\u22ED',
|
||
NotSquareSubset: '\u228F\u0338',
|
||
NotSquareSubsetEqual: '\u22E2',
|
||
NotSquareSuperset: '\u2290\u0338',
|
||
NotSquareSupersetEqual: '\u22E3',
|
||
NotSubset: '\u2282\u20D2',
|
||
NotSubsetEqual: '\u2288',
|
||
NotSucceeds: '\u2281',
|
||
NotSucceedsEqual: '\u2AB0\u0338',
|
||
NotSucceedsSlantEqual: '\u22E1',
|
||
NotSucceedsTilde: '\u227F\u0338',
|
||
NotSuperset: '\u2283\u20D2',
|
||
NotSupersetEqual: '\u2289',
|
||
NotTilde: '\u2241',
|
||
NotTildeEqual: '\u2244',
|
||
NotTildeFullEqual: '\u2247',
|
||
NotTildeTilde: '\u2249',
|
||
NotVerticalBar: '\u2224',
|
||
npar: '\u2226',
|
||
nparallel: '\u2226',
|
||
nparsl: '\u2AFD\u20E5',
|
||
npart: '\u2202\u0338',
|
||
npolint: '\u2A14',
|
||
npr: '\u2280',
|
||
nprcue: '\u22E0',
|
||
npre: '\u2AAF\u0338',
|
||
nprec: '\u2280',
|
||
npreceq: '\u2AAF\u0338',
|
||
nrArr: '\u21CF',
|
||
nrarr: '\u219B',
|
||
nrarrc: '\u2933\u0338',
|
||
nrarrw: '\u219D\u0338',
|
||
nRightarrow: '\u21CF',
|
||
nrightarrow: '\u219B',
|
||
nrtri: '\u22EB',
|
||
nrtrie: '\u22ED',
|
||
nsc: '\u2281',
|
||
nsccue: '\u22E1',
|
||
nsce: '\u2AB0\u0338',
|
||
Nscr: '\uD835\uDCA9',
|
||
nscr: '\uD835\uDCC3',
|
||
nshortmid: '\u2224',
|
||
nshortparallel: '\u2226',
|
||
nsim: '\u2241',
|
||
nsime: '\u2244',
|
||
nsimeq: '\u2244',
|
||
nsmid: '\u2224',
|
||
nspar: '\u2226',
|
||
nsqsube: '\u22E2',
|
||
nsqsupe: '\u22E3',
|
||
nsub: '\u2284',
|
||
nsubE: '\u2AC5\u0338',
|
||
nsube: '\u2288',
|
||
nsubset: '\u2282\u20D2',
|
||
nsubseteq: '\u2288',
|
||
nsubseteqq: '\u2AC5\u0338',
|
||
nsucc: '\u2281',
|
||
nsucceq: '\u2AB0\u0338',
|
||
nsup: '\u2285',
|
||
nsupE: '\u2AC6\u0338',
|
||
nsupe: '\u2289',
|
||
nsupset: '\u2283\u20D2',
|
||
nsupseteq: '\u2289',
|
||
nsupseteqq: '\u2AC6\u0338',
|
||
ntgl: '\u2279',
|
||
Ntilde: '\u00D1',
|
||
ntilde: '\u00F1',
|
||
ntlg: '\u2278',
|
||
ntriangleleft: '\u22EA',
|
||
ntrianglelefteq: '\u22EC',
|
||
ntriangleright: '\u22EB',
|
||
ntrianglerighteq: '\u22ED',
|
||
Nu: '\u039D',
|
||
nu: '\u03BD',
|
||
num: '\u0023',
|
||
numero: '\u2116',
|
||
numsp: '\u2007',
|
||
nvap: '\u224D\u20D2',
|
||
nVDash: '\u22AF',
|
||
nVdash: '\u22AE',
|
||
nvDash: '\u22AD',
|
||
nvdash: '\u22AC',
|
||
nvge: '\u2265\u20D2',
|
||
nvgt: '\u003E\u20D2',
|
||
nvHarr: '\u2904',
|
||
nvinfin: '\u29DE',
|
||
nvlArr: '\u2902',
|
||
nvle: '\u2264\u20D2',
|
||
nvlt: '\u003C\u20D2',
|
||
nvltrie: '\u22B4\u20D2',
|
||
nvrArr: '\u2903',
|
||
nvrtrie: '\u22B5\u20D2',
|
||
nvsim: '\u223C\u20D2',
|
||
nwarhk: '\u2923',
|
||
nwArr: '\u21D6',
|
||
nwarr: '\u2196',
|
||
nwarrow: '\u2196',
|
||
nwnear: '\u2927',
|
||
Oacute: '\u00D3',
|
||
oacute: '\u00F3',
|
||
oast: '\u229B',
|
||
ocir: '\u229A',
|
||
Ocirc: '\u00D4',
|
||
ocirc: '\u00F4',
|
||
Ocy: '\u041E',
|
||
ocy: '\u043E',
|
||
odash: '\u229D',
|
||
Odblac: '\u0150',
|
||
odblac: '\u0151',
|
||
odiv: '\u2A38',
|
||
odot: '\u2299',
|
||
odsold: '\u29BC',
|
||
OElig: '\u0152',
|
||
oelig: '\u0153',
|
||
ofcir: '\u29BF',
|
||
Ofr: '\uD835\uDD12',
|
||
ofr: '\uD835\uDD2C',
|
||
ogon: '\u02DB',
|
||
Ograve: '\u00D2',
|
||
ograve: '\u00F2',
|
||
ogt: '\u29C1',
|
||
ohbar: '\u29B5',
|
||
ohm: '\u03A9',
|
||
oint: '\u222E',
|
||
olarr: '\u21BA',
|
||
olcir: '\u29BE',
|
||
olcross: '\u29BB',
|
||
oline: '\u203E',
|
||
olt: '\u29C0',
|
||
Omacr: '\u014C',
|
||
omacr: '\u014D',
|
||
Omega: '\u03A9',
|
||
omega: '\u03C9',
|
||
Omicron: '\u039F',
|
||
omicron: '\u03BF',
|
||
omid: '\u29B6',
|
||
ominus: '\u2296',
|
||
Oopf: '\uD835\uDD46',
|
||
oopf: '\uD835\uDD60',
|
||
opar: '\u29B7',
|
||
OpenCurlyDoubleQuote: '\u201C',
|
||
OpenCurlyQuote: '\u2018',
|
||
operp: '\u29B9',
|
||
oplus: '\u2295',
|
||
Or: '\u2A54',
|
||
or: '\u2228',
|
||
orarr: '\u21BB',
|
||
ord: '\u2A5D',
|
||
order: '\u2134',
|
||
orderof: '\u2134',
|
||
ordf: '\u00AA',
|
||
ordm: '\u00BA',
|
||
origof: '\u22B6',
|
||
oror: '\u2A56',
|
||
orslope: '\u2A57',
|
||
orv: '\u2A5B',
|
||
oS: '\u24C8',
|
||
Oscr: '\uD835\uDCAA',
|
||
oscr: '\u2134',
|
||
Oslash: '\u00D8',
|
||
oslash: '\u00F8',
|
||
osol: '\u2298',
|
||
Otilde: '\u00D5',
|
||
otilde: '\u00F5',
|
||
Otimes: '\u2A37',
|
||
otimes: '\u2297',
|
||
otimesas: '\u2A36',
|
||
Ouml: '\u00D6',
|
||
ouml: '\u00F6',
|
||
ovbar: '\u233D',
|
||
OverBar: '\u203E',
|
||
OverBrace: '\u23DE',
|
||
OverBracket: '\u23B4',
|
||
OverParenthesis: '\u23DC',
|
||
par: '\u2225',
|
||
para: '\u00B6',
|
||
parallel: '\u2225',
|
||
parsim: '\u2AF3',
|
||
parsl: '\u2AFD',
|
||
part: '\u2202',
|
||
PartialD: '\u2202',
|
||
Pcy: '\u041F',
|
||
pcy: '\u043F',
|
||
percnt: '\u0025',
|
||
period: '\u002E',
|
||
permil: '\u2030',
|
||
perp: '\u22A5',
|
||
pertenk: '\u2031',
|
||
Pfr: '\uD835\uDD13',
|
||
pfr: '\uD835\uDD2D',
|
||
Phi: '\u03A6',
|
||
phi: '\u03C6',
|
||
phiv: '\u03D5',
|
||
phmmat: '\u2133',
|
||
phone: '\u260E',
|
||
Pi: '\u03A0',
|
||
pi: '\u03C0',
|
||
pitchfork: '\u22D4',
|
||
piv: '\u03D6',
|
||
planck: '\u210F',
|
||
planckh: '\u210E',
|
||
plankv: '\u210F',
|
||
plus: '\u002B',
|
||
plusacir: '\u2A23',
|
||
plusb: '\u229E',
|
||
pluscir: '\u2A22',
|
||
plusdo: '\u2214',
|
||
plusdu: '\u2A25',
|
||
pluse: '\u2A72',
|
||
PlusMinus: '\u00B1',
|
||
plusmn: '\u00B1',
|
||
plussim: '\u2A26',
|
||
plustwo: '\u2A27',
|
||
pm: '\u00B1',
|
||
Poincareplane: '\u210C',
|
||
pointint: '\u2A15',
|
||
Popf: '\u2119',
|
||
popf: '\uD835\uDD61',
|
||
pound: '\u00A3',
|
||
Pr: '\u2ABB',
|
||
pr: '\u227A',
|
||
prap: '\u2AB7',
|
||
prcue: '\u227C',
|
||
prE: '\u2AB3',
|
||
pre: '\u2AAF',
|
||
prec: '\u227A',
|
||
precapprox: '\u2AB7',
|
||
preccurlyeq: '\u227C',
|
||
Precedes: '\u227A',
|
||
PrecedesEqual: '\u2AAF',
|
||
PrecedesSlantEqual: '\u227C',
|
||
PrecedesTilde: '\u227E',
|
||
preceq: '\u2AAF',
|
||
precnapprox: '\u2AB9',
|
||
precneqq: '\u2AB5',
|
||
precnsim: '\u22E8',
|
||
precsim: '\u227E',
|
||
Prime: '\u2033',
|
||
prime: '\u2032',
|
||
primes: '\u2119',
|
||
prnap: '\u2AB9',
|
||
prnE: '\u2AB5',
|
||
prnsim: '\u22E8',
|
||
prod: '\u220F',
|
||
Product: '\u220F',
|
||
profalar: '\u232E',
|
||
profline: '\u2312',
|
||
profsurf: '\u2313',
|
||
prop: '\u221D',
|
||
Proportion: '\u2237',
|
||
Proportional: '\u221D',
|
||
propto: '\u221D',
|
||
prsim: '\u227E',
|
||
prurel: '\u22B0',
|
||
Pscr: '\uD835\uDCAB',
|
||
pscr: '\uD835\uDCC5',
|
||
Psi: '\u03A8',
|
||
psi: '\u03C8',
|
||
puncsp: '\u2008',
|
||
Qfr: '\uD835\uDD14',
|
||
qfr: '\uD835\uDD2E',
|
||
qint: '\u2A0C',
|
||
Qopf: '\u211A',
|
||
qopf: '\uD835\uDD62',
|
||
qprime: '\u2057',
|
||
Qscr: '\uD835\uDCAC',
|
||
qscr: '\uD835\uDCC6',
|
||
quaternions: '\u210D',
|
||
quatint: '\u2A16',
|
||
quest: '\u003F',
|
||
questeq: '\u225F',
|
||
QUOT: '\u0022',
|
||
quot: '\u0022',
|
||
rAarr: '\u21DB',
|
||
race: '\u223D\u0331',
|
||
Racute: '\u0154',
|
||
racute: '\u0155',
|
||
radic: '\u221A',
|
||
raemptyv: '\u29B3',
|
||
Rang: '\u27EB',
|
||
rang: '\u27E9',
|
||
rangd: '\u2992',
|
||
range: '\u29A5',
|
||
rangle: '\u27E9',
|
||
raquo: '\u00BB',
|
||
Rarr: '\u21A0',
|
||
rArr: '\u21D2',
|
||
rarr: '\u2192',
|
||
rarrap: '\u2975',
|
||
rarrb: '\u21E5',
|
||
rarrbfs: '\u2920',
|
||
rarrc: '\u2933',
|
||
rarrfs: '\u291E',
|
||
rarrhk: '\u21AA',
|
||
rarrlp: '\u21AC',
|
||
rarrpl: '\u2945',
|
||
rarrsim: '\u2974',
|
||
Rarrtl: '\u2916',
|
||
rarrtl: '\u21A3',
|
||
rarrw: '\u219D',
|
||
rAtail: '\u291C',
|
||
ratail: '\u291A',
|
||
ratio: '\u2236',
|
||
rationals: '\u211A',
|
||
RBarr: '\u2910',
|
||
rBarr: '\u290F',
|
||
rbarr: '\u290D',
|
||
rbbrk: '\u2773',
|
||
rbrace: '\u007D',
|
||
rbrack: '\u005D',
|
||
rbrke: '\u298C',
|
||
rbrksld: '\u298E',
|
||
rbrkslu: '\u2990',
|
||
Rcaron: '\u0158',
|
||
rcaron: '\u0159',
|
||
Rcedil: '\u0156',
|
||
rcedil: '\u0157',
|
||
rceil: '\u2309',
|
||
rcub: '\u007D',
|
||
Rcy: '\u0420',
|
||
rcy: '\u0440',
|
||
rdca: '\u2937',
|
||
rdldhar: '\u2969',
|
||
rdquo: '\u201D',
|
||
rdquor: '\u201D',
|
||
rdsh: '\u21B3',
|
||
Re: '\u211C',
|
||
real: '\u211C',
|
||
realine: '\u211B',
|
||
realpart: '\u211C',
|
||
reals: '\u211D',
|
||
rect: '\u25AD',
|
||
REG: '\u00AE',
|
||
reg: '\u00AE',
|
||
ReverseElement: '\u220B',
|
||
ReverseEquilibrium: '\u21CB',
|
||
ReverseUpEquilibrium: '\u296F',
|
||
rfisht: '\u297D',
|
||
rfloor: '\u230B',
|
||
Rfr: '\u211C',
|
||
rfr: '\uD835\uDD2F',
|
||
rHar: '\u2964',
|
||
rhard: '\u21C1',
|
||
rharu: '\u21C0',
|
||
rharul: '\u296C',
|
||
Rho: '\u03A1',
|
||
rho: '\u03C1',
|
||
rhov: '\u03F1',
|
||
RightAngleBracket: '\u27E9',
|
||
RightArrow: '\u2192',
|
||
Rightarrow: '\u21D2',
|
||
rightarrow: '\u2192',
|
||
RightArrowBar: '\u21E5',
|
||
RightArrowLeftArrow: '\u21C4',
|
||
rightarrowtail: '\u21A3',
|
||
RightCeiling: '\u2309',
|
||
RightDoubleBracket: '\u27E7',
|
||
RightDownTeeVector: '\u295D',
|
||
RightDownVector: '\u21C2',
|
||
RightDownVectorBar: '\u2955',
|
||
RightFloor: '\u230B',
|
||
rightharpoondown: '\u21C1',
|
||
rightharpoonup: '\u21C0',
|
||
rightleftarrows: '\u21C4',
|
||
rightleftharpoons: '\u21CC',
|
||
rightrightarrows: '\u21C9',
|
||
rightsquigarrow: '\u219D',
|
||
RightTee: '\u22A2',
|
||
RightTeeArrow: '\u21A6',
|
||
RightTeeVector: '\u295B',
|
||
rightthreetimes: '\u22CC',
|
||
RightTriangle: '\u22B3',
|
||
RightTriangleBar: '\u29D0',
|
||
RightTriangleEqual: '\u22B5',
|
||
RightUpDownVector: '\u294F',
|
||
RightUpTeeVector: '\u295C',
|
||
RightUpVector: '\u21BE',
|
||
RightUpVectorBar: '\u2954',
|
||
RightVector: '\u21C0',
|
||
RightVectorBar: '\u2953',
|
||
ring: '\u02DA',
|
||
risingdotseq: '\u2253',
|
||
rlarr: '\u21C4',
|
||
rlhar: '\u21CC',
|
||
rlm: '\u200F',
|
||
rmoust: '\u23B1',
|
||
rmoustache: '\u23B1',
|
||
rnmid: '\u2AEE',
|
||
roang: '\u27ED',
|
||
roarr: '\u21FE',
|
||
robrk: '\u27E7',
|
||
ropar: '\u2986',
|
||
Ropf: '\u211D',
|
||
ropf: '\uD835\uDD63',
|
||
roplus: '\u2A2E',
|
||
rotimes: '\u2A35',
|
||
RoundImplies: '\u2970',
|
||
rpar: '\u0029',
|
||
rpargt: '\u2994',
|
||
rppolint: '\u2A12',
|
||
rrarr: '\u21C9',
|
||
Rrightarrow: '\u21DB',
|
||
rsaquo: '\u203A',
|
||
Rscr: '\u211B',
|
||
rscr: '\uD835\uDCC7',
|
||
Rsh: '\u21B1',
|
||
rsh: '\u21B1',
|
||
rsqb: '\u005D',
|
||
rsquo: '\u2019',
|
||
rsquor: '\u2019',
|
||
rthree: '\u22CC',
|
||
rtimes: '\u22CA',
|
||
rtri: '\u25B9',
|
||
rtrie: '\u22B5',
|
||
rtrif: '\u25B8',
|
||
rtriltri: '\u29CE',
|
||
RuleDelayed: '\u29F4',
|
||
ruluhar: '\u2968',
|
||
rx: '\u211E',
|
||
Sacute: '\u015A',
|
||
sacute: '\u015B',
|
||
sbquo: '\u201A',
|
||
Sc: '\u2ABC',
|
||
sc: '\u227B',
|
||
scap: '\u2AB8',
|
||
Scaron: '\u0160',
|
||
scaron: '\u0161',
|
||
sccue: '\u227D',
|
||
scE: '\u2AB4',
|
||
sce: '\u2AB0',
|
||
Scedil: '\u015E',
|
||
scedil: '\u015F',
|
||
Scirc: '\u015C',
|
||
scirc: '\u015D',
|
||
scnap: '\u2ABA',
|
||
scnE: '\u2AB6',
|
||
scnsim: '\u22E9',
|
||
scpolint: '\u2A13',
|
||
scsim: '\u227F',
|
||
Scy: '\u0421',
|
||
scy: '\u0441',
|
||
sdot: '\u22C5',
|
||
sdotb: '\u22A1',
|
||
sdote: '\u2A66',
|
||
searhk: '\u2925',
|
||
seArr: '\u21D8',
|
||
searr: '\u2198',
|
||
searrow: '\u2198',
|
||
sect: '\u00A7',
|
||
semi: '\u003B',
|
||
seswar: '\u2929',
|
||
setminus: '\u2216',
|
||
setmn: '\u2216',
|
||
sext: '\u2736',
|
||
Sfr: '\uD835\uDD16',
|
||
sfr: '\uD835\uDD30',
|
||
sfrown: '\u2322',
|
||
sharp: '\u266F',
|
||
SHCHcy: '\u0429',
|
||
shchcy: '\u0449',
|
||
SHcy: '\u0428',
|
||
shcy: '\u0448',
|
||
ShortDownArrow: '\u2193',
|
||
ShortLeftArrow: '\u2190',
|
||
shortmid: '\u2223',
|
||
shortparallel: '\u2225',
|
||
ShortRightArrow: '\u2192',
|
||
ShortUpArrow: '\u2191',
|
||
shy: '\u00AD',
|
||
Sigma: '\u03A3',
|
||
sigma: '\u03C3',
|
||
sigmaf: '\u03C2',
|
||
sigmav: '\u03C2',
|
||
sim: '\u223C',
|
||
simdot: '\u2A6A',
|
||
sime: '\u2243',
|
||
simeq: '\u2243',
|
||
simg: '\u2A9E',
|
||
simgE: '\u2AA0',
|
||
siml: '\u2A9D',
|
||
simlE: '\u2A9F',
|
||
simne: '\u2246',
|
||
simplus: '\u2A24',
|
||
simrarr: '\u2972',
|
||
slarr: '\u2190',
|
||
SmallCircle: '\u2218',
|
||
smallsetminus: '\u2216',
|
||
smashp: '\u2A33',
|
||
smeparsl: '\u29E4',
|
||
smid: '\u2223',
|
||
smile: '\u2323',
|
||
smt: '\u2AAA',
|
||
smte: '\u2AAC',
|
||
smtes: '\u2AAC\uFE00',
|
||
SOFTcy: '\u042C',
|
||
softcy: '\u044C',
|
||
sol: '\u002F',
|
||
solb: '\u29C4',
|
||
solbar: '\u233F',
|
||
Sopf: '\uD835\uDD4A',
|
||
sopf: '\uD835\uDD64',
|
||
spades: '\u2660',
|
||
spadesuit: '\u2660',
|
||
spar: '\u2225',
|
||
sqcap: '\u2293',
|
||
sqcaps: '\u2293\uFE00',
|
||
sqcup: '\u2294',
|
||
sqcups: '\u2294\uFE00',
|
||
Sqrt: '\u221A',
|
||
sqsub: '\u228F',
|
||
sqsube: '\u2291',
|
||
sqsubset: '\u228F',
|
||
sqsubseteq: '\u2291',
|
||
sqsup: '\u2290',
|
||
sqsupe: '\u2292',
|
||
sqsupset: '\u2290',
|
||
sqsupseteq: '\u2292',
|
||
squ: '\u25A1',
|
||
Square: '\u25A1',
|
||
square: '\u25A1',
|
||
SquareIntersection: '\u2293',
|
||
SquareSubset: '\u228F',
|
||
SquareSubsetEqual: '\u2291',
|
||
SquareSuperset: '\u2290',
|
||
SquareSupersetEqual: '\u2292',
|
||
SquareUnion: '\u2294',
|
||
squarf: '\u25AA',
|
||
squf: '\u25AA',
|
||
srarr: '\u2192',
|
||
Sscr: '\uD835\uDCAE',
|
||
sscr: '\uD835\uDCC8',
|
||
ssetmn: '\u2216',
|
||
ssmile: '\u2323',
|
||
sstarf: '\u22C6',
|
||
Star: '\u22C6',
|
||
star: '\u2606',
|
||
starf: '\u2605',
|
||
straightepsilon: '\u03F5',
|
||
straightphi: '\u03D5',
|
||
strns: '\u00AF',
|
||
Sub: '\u22D0',
|
||
sub: '\u2282',
|
||
subdot: '\u2ABD',
|
||
subE: '\u2AC5',
|
||
sube: '\u2286',
|
||
subedot: '\u2AC3',
|
||
submult: '\u2AC1',
|
||
subnE: '\u2ACB',
|
||
subne: '\u228A',
|
||
subplus: '\u2ABF',
|
||
subrarr: '\u2979',
|
||
Subset: '\u22D0',
|
||
subset: '\u2282',
|
||
subseteq: '\u2286',
|
||
subseteqq: '\u2AC5',
|
||
SubsetEqual: '\u2286',
|
||
subsetneq: '\u228A',
|
||
subsetneqq: '\u2ACB',
|
||
subsim: '\u2AC7',
|
||
subsub: '\u2AD5',
|
||
subsup: '\u2AD3',
|
||
succ: '\u227B',
|
||
succapprox: '\u2AB8',
|
||
succcurlyeq: '\u227D',
|
||
Succeeds: '\u227B',
|
||
SucceedsEqual: '\u2AB0',
|
||
SucceedsSlantEqual: '\u227D',
|
||
SucceedsTilde: '\u227F',
|
||
succeq: '\u2AB0',
|
||
succnapprox: '\u2ABA',
|
||
succneqq: '\u2AB6',
|
||
succnsim: '\u22E9',
|
||
succsim: '\u227F',
|
||
SuchThat: '\u220B',
|
||
Sum: '\u2211',
|
||
sum: '\u2211',
|
||
sung: '\u266A',
|
||
Sup: '\u22D1',
|
||
sup: '\u2283',
|
||
sup1: '\u00B9',
|
||
sup2: '\u00B2',
|
||
sup3: '\u00B3',
|
||
supdot: '\u2ABE',
|
||
supdsub: '\u2AD8',
|
||
supE: '\u2AC6',
|
||
supe: '\u2287',
|
||
supedot: '\u2AC4',
|
||
Superset: '\u2283',
|
||
SupersetEqual: '\u2287',
|
||
suphsol: '\u27C9',
|
||
suphsub: '\u2AD7',
|
||
suplarr: '\u297B',
|
||
supmult: '\u2AC2',
|
||
supnE: '\u2ACC',
|
||
supne: '\u228B',
|
||
supplus: '\u2AC0',
|
||
Supset: '\u22D1',
|
||
supset: '\u2283',
|
||
supseteq: '\u2287',
|
||
supseteqq: '\u2AC6',
|
||
supsetneq: '\u228B',
|
||
supsetneqq: '\u2ACC',
|
||
supsim: '\u2AC8',
|
||
supsub: '\u2AD4',
|
||
supsup: '\u2AD6',
|
||
swarhk: '\u2926',
|
||
swArr: '\u21D9',
|
||
swarr: '\u2199',
|
||
swarrow: '\u2199',
|
||
swnwar: '\u292A',
|
||
szlig: '\u00DF',
|
||
Tab: '\u0009',
|
||
target: '\u2316',
|
||
Tau: '\u03A4',
|
||
tau: '\u03C4',
|
||
tbrk: '\u23B4',
|
||
Tcaron: '\u0164',
|
||
tcaron: '\u0165',
|
||
Tcedil: '\u0162',
|
||
tcedil: '\u0163',
|
||
Tcy: '\u0422',
|
||
tcy: '\u0442',
|
||
tdot: '\u20DB',
|
||
telrec: '\u2315',
|
||
Tfr: '\uD835\uDD17',
|
||
tfr: '\uD835\uDD31',
|
||
there4: '\u2234',
|
||
Therefore: '\u2234',
|
||
therefore: '\u2234',
|
||
Theta: '\u0398',
|
||
theta: '\u03B8',
|
||
thetasym: '\u03D1',
|
||
thetav: '\u03D1',
|
||
thickapprox: '\u2248',
|
||
thicksim: '\u223C',
|
||
ThickSpace: '\u205F\u200A',
|
||
thinsp: '\u2009',
|
||
ThinSpace: '\u2009',
|
||
thkap: '\u2248',
|
||
thksim: '\u223C',
|
||
THORN: '\u00DE',
|
||
thorn: '\u00FE',
|
||
Tilde: '\u223C',
|
||
tilde: '\u02DC',
|
||
TildeEqual: '\u2243',
|
||
TildeFullEqual: '\u2245',
|
||
TildeTilde: '\u2248',
|
||
times: '\u00D7',
|
||
timesb: '\u22A0',
|
||
timesbar: '\u2A31',
|
||
timesd: '\u2A30',
|
||
tint: '\u222D',
|
||
toea: '\u2928',
|
||
top: '\u22A4',
|
||
topbot: '\u2336',
|
||
topcir: '\u2AF1',
|
||
Topf: '\uD835\uDD4B',
|
||
topf: '\uD835\uDD65',
|
||
topfork: '\u2ADA',
|
||
tosa: '\u2929',
|
||
tprime: '\u2034',
|
||
TRADE: '\u2122',
|
||
trade: '\u2122',
|
||
triangle: '\u25B5',
|
||
triangledown: '\u25BF',
|
||
triangleleft: '\u25C3',
|
||
trianglelefteq: '\u22B4',
|
||
triangleq: '\u225C',
|
||
triangleright: '\u25B9',
|
||
trianglerighteq: '\u22B5',
|
||
tridot: '\u25EC',
|
||
trie: '\u225C',
|
||
triminus: '\u2A3A',
|
||
TripleDot: '\u20DB',
|
||
triplus: '\u2A39',
|
||
trisb: '\u29CD',
|
||
tritime: '\u2A3B',
|
||
trpezium: '\u23E2',
|
||
Tscr: '\uD835\uDCAF',
|
||
tscr: '\uD835\uDCC9',
|
||
TScy: '\u0426',
|
||
tscy: '\u0446',
|
||
TSHcy: '\u040B',
|
||
tshcy: '\u045B',
|
||
Tstrok: '\u0166',
|
||
tstrok: '\u0167',
|
||
twixt: '\u226C',
|
||
twoheadleftarrow: '\u219E',
|
||
twoheadrightarrow: '\u21A0',
|
||
Uacute: '\u00DA',
|
||
uacute: '\u00FA',
|
||
Uarr: '\u219F',
|
||
uArr: '\u21D1',
|
||
uarr: '\u2191',
|
||
Uarrocir: '\u2949',
|
||
Ubrcy: '\u040E',
|
||
ubrcy: '\u045E',
|
||
Ubreve: '\u016C',
|
||
ubreve: '\u016D',
|
||
Ucirc: '\u00DB',
|
||
ucirc: '\u00FB',
|
||
Ucy: '\u0423',
|
||
ucy: '\u0443',
|
||
udarr: '\u21C5',
|
||
Udblac: '\u0170',
|
||
udblac: '\u0171',
|
||
udhar: '\u296E',
|
||
ufisht: '\u297E',
|
||
Ufr: '\uD835\uDD18',
|
||
ufr: '\uD835\uDD32',
|
||
Ugrave: '\u00D9',
|
||
ugrave: '\u00F9',
|
||
uHar: '\u2963',
|
||
uharl: '\u21BF',
|
||
uharr: '\u21BE',
|
||
uhblk: '\u2580',
|
||
ulcorn: '\u231C',
|
||
ulcorner: '\u231C',
|
||
ulcrop: '\u230F',
|
||
ultri: '\u25F8',
|
||
Umacr: '\u016A',
|
||
umacr: '\u016B',
|
||
uml: '\u00A8',
|
||
UnderBar: '\u005F',
|
||
UnderBrace: '\u23DF',
|
||
UnderBracket: '\u23B5',
|
||
UnderParenthesis: '\u23DD',
|
||
Union: '\u22C3',
|
||
UnionPlus: '\u228E',
|
||
Uogon: '\u0172',
|
||
uogon: '\u0173',
|
||
Uopf: '\uD835\uDD4C',
|
||
uopf: '\uD835\uDD66',
|
||
UpArrow: '\u2191',
|
||
Uparrow: '\u21D1',
|
||
uparrow: '\u2191',
|
||
UpArrowBar: '\u2912',
|
||
UpArrowDownArrow: '\u21C5',
|
||
UpDownArrow: '\u2195',
|
||
Updownarrow: '\u21D5',
|
||
updownarrow: '\u2195',
|
||
UpEquilibrium: '\u296E',
|
||
upharpoonleft: '\u21BF',
|
||
upharpoonright: '\u21BE',
|
||
uplus: '\u228E',
|
||
UpperLeftArrow: '\u2196',
|
||
UpperRightArrow: '\u2197',
|
||
Upsi: '\u03D2',
|
||
upsi: '\u03C5',
|
||
upsih: '\u03D2',
|
||
Upsilon: '\u03A5',
|
||
upsilon: '\u03C5',
|
||
UpTee: '\u22A5',
|
||
UpTeeArrow: '\u21A5',
|
||
upuparrows: '\u21C8',
|
||
urcorn: '\u231D',
|
||
urcorner: '\u231D',
|
||
urcrop: '\u230E',
|
||
Uring: '\u016E',
|
||
uring: '\u016F',
|
||
urtri: '\u25F9',
|
||
Uscr: '\uD835\uDCB0',
|
||
uscr: '\uD835\uDCCA',
|
||
utdot: '\u22F0',
|
||
Utilde: '\u0168',
|
||
utilde: '\u0169',
|
||
utri: '\u25B5',
|
||
utrif: '\u25B4',
|
||
uuarr: '\u21C8',
|
||
Uuml: '\u00DC',
|
||
uuml: '\u00FC',
|
||
uwangle: '\u29A7',
|
||
vangrt: '\u299C',
|
||
varepsilon: '\u03F5',
|
||
varkappa: '\u03F0',
|
||
varnothing: '\u2205',
|
||
varphi: '\u03D5',
|
||
varpi: '\u03D6',
|
||
varpropto: '\u221D',
|
||
vArr: '\u21D5',
|
||
varr: '\u2195',
|
||
varrho: '\u03F1',
|
||
varsigma: '\u03C2',
|
||
varsubsetneq: '\u228A\uFE00',
|
||
varsubsetneqq: '\u2ACB\uFE00',
|
||
varsupsetneq: '\u228B\uFE00',
|
||
varsupsetneqq: '\u2ACC\uFE00',
|
||
vartheta: '\u03D1',
|
||
vartriangleleft: '\u22B2',
|
||
vartriangleright: '\u22B3',
|
||
Vbar: '\u2AEB',
|
||
vBar: '\u2AE8',
|
||
vBarv: '\u2AE9',
|
||
Vcy: '\u0412',
|
||
vcy: '\u0432',
|
||
VDash: '\u22AB',
|
||
Vdash: '\u22A9',
|
||
vDash: '\u22A8',
|
||
vdash: '\u22A2',
|
||
Vdashl: '\u2AE6',
|
||
Vee: '\u22C1',
|
||
vee: '\u2228',
|
||
veebar: '\u22BB',
|
||
veeeq: '\u225A',
|
||
vellip: '\u22EE',
|
||
Verbar: '\u2016',
|
||
verbar: '\u007C',
|
||
Vert: '\u2016',
|
||
vert: '\u007C',
|
||
VerticalBar: '\u2223',
|
||
VerticalLine: '\u007C',
|
||
VerticalSeparator: '\u2758',
|
||
VerticalTilde: '\u2240',
|
||
VeryThinSpace: '\u200A',
|
||
Vfr: '\uD835\uDD19',
|
||
vfr: '\uD835\uDD33',
|
||
vltri: '\u22B2',
|
||
vnsub: '\u2282\u20D2',
|
||
vnsup: '\u2283\u20D2',
|
||
Vopf: '\uD835\uDD4D',
|
||
vopf: '\uD835\uDD67',
|
||
vprop: '\u221D',
|
||
vrtri: '\u22B3',
|
||
Vscr: '\uD835\uDCB1',
|
||
vscr: '\uD835\uDCCB',
|
||
vsubnE: '\u2ACB\uFE00',
|
||
vsubne: '\u228A\uFE00',
|
||
vsupnE: '\u2ACC\uFE00',
|
||
vsupne: '\u228B\uFE00',
|
||
Vvdash: '\u22AA',
|
||
vzigzag: '\u299A',
|
||
Wcirc: '\u0174',
|
||
wcirc: '\u0175',
|
||
wedbar: '\u2A5F',
|
||
Wedge: '\u22C0',
|
||
wedge: '\u2227',
|
||
wedgeq: '\u2259',
|
||
weierp: '\u2118',
|
||
Wfr: '\uD835\uDD1A',
|
||
wfr: '\uD835\uDD34',
|
||
Wopf: '\uD835\uDD4E',
|
||
wopf: '\uD835\uDD68',
|
||
wp: '\u2118',
|
||
wr: '\u2240',
|
||
wreath: '\u2240',
|
||
Wscr: '\uD835\uDCB2',
|
||
wscr: '\uD835\uDCCC',
|
||
xcap: '\u22C2',
|
||
xcirc: '\u25EF',
|
||
xcup: '\u22C3',
|
||
xdtri: '\u25BD',
|
||
Xfr: '\uD835\uDD1B',
|
||
xfr: '\uD835\uDD35',
|
||
xhArr: '\u27FA',
|
||
xharr: '\u27F7',
|
||
Xi: '\u039E',
|
||
xi: '\u03BE',
|
||
xlArr: '\u27F8',
|
||
xlarr: '\u27F5',
|
||
xmap: '\u27FC',
|
||
xnis: '\u22FB',
|
||
xodot: '\u2A00',
|
||
Xopf: '\uD835\uDD4F',
|
||
xopf: '\uD835\uDD69',
|
||
xoplus: '\u2A01',
|
||
xotime: '\u2A02',
|
||
xrArr: '\u27F9',
|
||
xrarr: '\u27F6',
|
||
Xscr: '\uD835\uDCB3',
|
||
xscr: '\uD835\uDCCD',
|
||
xsqcup: '\u2A06',
|
||
xuplus: '\u2A04',
|
||
xutri: '\u25B3',
|
||
xvee: '\u22C1',
|
||
xwedge: '\u22C0',
|
||
Yacute: '\u00DD',
|
||
yacute: '\u00FD',
|
||
YAcy: '\u042F',
|
||
yacy: '\u044F',
|
||
Ycirc: '\u0176',
|
||
ycirc: '\u0177',
|
||
Ycy: '\u042B',
|
||
ycy: '\u044B',
|
||
yen: '\u00A5',
|
||
Yfr: '\uD835\uDD1C',
|
||
yfr: '\uD835\uDD36',
|
||
YIcy: '\u0407',
|
||
yicy: '\u0457',
|
||
Yopf: '\uD835\uDD50',
|
||
yopf: '\uD835\uDD6A',
|
||
Yscr: '\uD835\uDCB4',
|
||
yscr: '\uD835\uDCCE',
|
||
YUcy: '\u042E',
|
||
yucy: '\u044E',
|
||
Yuml: '\u0178',
|
||
yuml: '\u00FF',
|
||
Zacute: '\u0179',
|
||
zacute: '\u017A',
|
||
Zcaron: '\u017D',
|
||
zcaron: '\u017E',
|
||
Zcy: '\u0417',
|
||
zcy: '\u0437',
|
||
Zdot: '\u017B',
|
||
zdot: '\u017C',
|
||
zeetrf: '\u2128',
|
||
ZeroWidthSpace: '\u200B',
|
||
Zeta: '\u0396',
|
||
zeta: '\u03B6',
|
||
Zfr: '\u2128',
|
||
zfr: '\uD835\uDD37',
|
||
ZHcy: '\u0416',
|
||
zhcy: '\u0436',
|
||
zigrarr: '\u21DD',
|
||
Zopf: '\u2124',
|
||
zopf: '\uD835\uDD6B',
|
||
Zscr: '\uD835\uDCB5',
|
||
zscr: '\uD835\uDCCF',
|
||
zwj: '\u200D',
|
||
zwnj: '\u200C',
|
||
});
|
||
|
||
/**
|
||
* @deprecated use `HTML_ENTITIES` instead
|
||
* @see HTML_ENTITIES
|
||
*/
|
||
exports.entityMap = exports.HTML_ENTITIES;
|
||
|
||
},{"./conventions":2}],6:[function(require,module,exports){
|
||
var dom = require('./dom')
|
||
exports.DOMImplementation = dom.DOMImplementation
|
||
exports.XMLSerializer = dom.XMLSerializer
|
||
exports.DOMParser = require('./dom-parser').DOMParser
|
||
|
||
},{"./dom":4,"./dom-parser":3}],7:[function(require,module,exports){
|
||
var NAMESPACE = require("./conventions").NAMESPACE;
|
||
|
||
//[4] NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
|
||
//[4a] NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
|
||
//[5] Name ::= NameStartChar (NameChar)*
|
||
var nameStartChar = /[A-Z_a-z\xC0-\xD6\xD8-\xF6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]///\u10000-\uEFFFF
|
||
var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]");
|
||
var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$');
|
||
//var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/
|
||
//var handlers = 'resolveEntity,getExternalSubset,characters,endDocument,endElement,endPrefixMapping,ignorableWhitespace,processingInstruction,setDocumentLocator,skippedEntity,startDocument,startElement,startPrefixMapping,notationDecl,unparsedEntityDecl,error,fatalError,warning,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,comment,endCDATA,endDTD,endEntity,startCDATA,startDTD,startEntity'.split(',')
|
||
|
||
//S_TAG, S_ATTR, S_EQ, S_ATTR_NOQUOT_VALUE
|
||
//S_ATTR_SPACE, S_ATTR_END, S_TAG_SPACE, S_TAG_CLOSE
|
||
var S_TAG = 0;//tag name offerring
|
||
var S_ATTR = 1;//attr name offerring
|
||
var S_ATTR_SPACE=2;//attr name end and space offer
|
||
var S_EQ = 3;//=space?
|
||
var S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)
|
||
var S_ATTR_END = 5;//attr value end and no space(quot end)
|
||
var S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)
|
||
var S_TAG_CLOSE = 7;//closed el<el />
|
||
|
||
/**
|
||
* Creates an error that will not be caught by XMLReader aka the SAX parser.
|
||
*
|
||
* @param {string} message
|
||
* @param {any?} locator Optional, can provide details about the location in the source
|
||
* @constructor
|
||
*/
|
||
function ParseError(message, locator) {
|
||
this.message = message
|
||
this.locator = locator
|
||
if(Error.captureStackTrace) Error.captureStackTrace(this, ParseError);
|
||
}
|
||
ParseError.prototype = new Error();
|
||
ParseError.prototype.name = ParseError.name
|
||
|
||
function XMLReader(){
|
||
|
||
}
|
||
|
||
XMLReader.prototype = {
|
||
parse:function(source,defaultNSMap,entityMap){
|
||
var domBuilder = this.domBuilder;
|
||
domBuilder.startDocument();
|
||
_copy(defaultNSMap ,defaultNSMap = {})
|
||
parse(source,defaultNSMap,entityMap,
|
||
domBuilder,this.errorHandler);
|
||
domBuilder.endDocument();
|
||
}
|
||
}
|
||
function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
|
||
function fixedFromCharCode(code) {
|
||
// String.prototype.fromCharCode does not supports
|
||
// > 2 bytes unicode chars directly
|
||
if (code > 0xffff) {
|
||
code -= 0x10000;
|
||
var surrogate1 = 0xd800 + (code >> 10)
|
||
, surrogate2 = 0xdc00 + (code & 0x3ff);
|
||
|
||
return String.fromCharCode(surrogate1, surrogate2);
|
||
} else {
|
||
return String.fromCharCode(code);
|
||
}
|
||
}
|
||
function entityReplacer(a){
|
||
var k = a.slice(1,-1);
|
||
if (Object.hasOwnProperty.call(entityMap, k)) {
|
||
return entityMap[k];
|
||
}else if(k.charAt(0) === '#'){
|
||
return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))
|
||
}else{
|
||
errorHandler.error('entity not found:'+a);
|
||
return a;
|
||
}
|
||
}
|
||
function appendText(end){//has some bugs
|
||
if(end>start){
|
||
var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer);
|
||
locator&&position(start);
|
||
domBuilder.characters(xt,0,end-start);
|
||
start = end
|
||
}
|
||
}
|
||
function position(p,m){
|
||
while(p>=lineEnd && (m = linePattern.exec(source))){
|
||
lineStart = m.index;
|
||
lineEnd = lineStart + m[0].length;
|
||
locator.lineNumber++;
|
||
//console.log('line++:',locator,startPos,endPos)
|
||
}
|
||
locator.columnNumber = p-lineStart+1;
|
||
}
|
||
var lineStart = 0;
|
||
var lineEnd = 0;
|
||
var linePattern = /.*(?:\r\n?|\n)|.*$/g
|
||
var locator = domBuilder.locator;
|
||
|
||
var parseStack = [{currentNSMap:defaultNSMapCopy}]
|
||
var closeMap = {};
|
||
var start = 0;
|
||
while(true){
|
||
try{
|
||
var tagStart = source.indexOf('<',start);
|
||
if(tagStart<0){
|
||
if(!source.substr(start).match(/^\s*$/)){
|
||
var doc = domBuilder.doc;
|
||
var text = doc.createTextNode(source.substr(start));
|
||
doc.appendChild(text);
|
||
domBuilder.currentElement = text;
|
||
}
|
||
return;
|
||
}
|
||
if(tagStart>start){
|
||
appendText(tagStart);
|
||
}
|
||
switch(source.charAt(tagStart+1)){
|
||
case '/':
|
||
var end = source.indexOf('>',tagStart+3);
|
||
var tagName = source.substring(tagStart + 2, end).replace(/[ \t\n\r]+$/g, '');
|
||
var config = parseStack.pop();
|
||
if(end<0){
|
||
|
||
tagName = source.substring(tagStart+2).replace(/[\s<].*/,'');
|
||
errorHandler.error("end tag name: "+tagName+' is not complete:'+config.tagName);
|
||
end = tagStart+1+tagName.length;
|
||
}else if(tagName.match(/\s</)){
|
||
tagName = tagName.replace(/[\s<].*/,'');
|
||
errorHandler.error("end tag name: "+tagName+' maybe not complete');
|
||
end = tagStart+1+tagName.length;
|
||
}
|
||
var localNSMap = config.localNSMap;
|
||
var endMatch = config.tagName == tagName;
|
||
var endIgnoreCaseMach = endMatch || config.tagName&&config.tagName.toLowerCase() == tagName.toLowerCase()
|
||
if(endIgnoreCaseMach){
|
||
domBuilder.endElement(config.uri,config.localName,tagName);
|
||
if(localNSMap){
|
||
for (var prefix in localNSMap) {
|
||
if (Object.prototype.hasOwnProperty.call(localNSMap, prefix)) {
|
||
domBuilder.endPrefixMapping(prefix);
|
||
}
|
||
}
|
||
}
|
||
if(!endMatch){
|
||
errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName ); // No known test case
|
||
}
|
||
}else{
|
||
parseStack.push(config)
|
||
}
|
||
|
||
end++;
|
||
break;
|
||
// end elment
|
||
case '?':// <?...?>
|
||
locator&&position(tagStart);
|
||
end = parseInstruction(source,tagStart,domBuilder);
|
||
break;
|
||
case '!':// <!doctype,<![CDATA,<!--
|
||
locator&&position(tagStart);
|
||
end = parseDCC(source,tagStart,domBuilder,errorHandler);
|
||
break;
|
||
default:
|
||
locator&&position(tagStart);
|
||
var el = new ElementAttributes();
|
||
var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
|
||
//elStartEnd
|
||
var end = parseElementStartPart(source,tagStart,el,currentNSMap,entityReplacer,errorHandler);
|
||
var len = el.length;
|
||
|
||
|
||
if(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){
|
||
el.closed = true;
|
||
if(!entityMap.nbsp){
|
||
errorHandler.warning('unclosed xml attribute');
|
||
}
|
||
}
|
||
if(locator && len){
|
||
var locator2 = copyLocator(locator,{});
|
||
//try{//attribute position fixed
|
||
for(var i = 0;i<len;i++){
|
||
var a = el[i];
|
||
position(a.offset);
|
||
a.locator = copyLocator(locator,{});
|
||
}
|
||
domBuilder.locator = locator2
|
||
if(appendElement(el,domBuilder,currentNSMap)){
|
||
parseStack.push(el)
|
||
}
|
||
domBuilder.locator = locator;
|
||
}else{
|
||
if(appendElement(el,domBuilder,currentNSMap)){
|
||
parseStack.push(el)
|
||
}
|
||
}
|
||
|
||
if (NAMESPACE.isHTML(el.uri) && !el.closed) {
|
||
end = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder)
|
||
} else {
|
||
end++;
|
||
}
|
||
}
|
||
}catch(e){
|
||
if (e instanceof ParseError) {
|
||
throw e;
|
||
}
|
||
errorHandler.error('element parse error: '+e)
|
||
end = -1;
|
||
}
|
||
if(end>start){
|
||
start = end;
|
||
}else{
|
||
//TODO: 这里有可能sax回退,有位置错误风险
|
||
appendText(Math.max(tagStart,start)+1);
|
||
}
|
||
}
|
||
}
|
||
function copyLocator(f,t){
|
||
t.lineNumber = f.lineNumber;
|
||
t.columnNumber = f.columnNumber;
|
||
return t;
|
||
}
|
||
|
||
/**
|
||
* @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);
|
||
* @return end of the elementStartPart(end of elementEndPart for selfClosed el)
|
||
*/
|
||
function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){
|
||
|
||
/**
|
||
* @param {string} qname
|
||
* @param {string} value
|
||
* @param {number} startIndex
|
||
*/
|
||
function addAttribute(qname, value, startIndex) {
|
||
if (el.attributeNames.hasOwnProperty(qname)) {
|
||
errorHandler.fatalError('Attribute ' + qname + ' redefined')
|
||
}
|
||
el.addValue(
|
||
qname,
|
||
// @see https://www.w3.org/TR/xml/#AVNormalize
|
||
// since the xmldom sax parser does not "interpret" DTD the following is not implemented:
|
||
// - recursive replacement of (DTD) entity references
|
||
// - trimming and collapsing multiple spaces into a single one for attributes that are not of type CDATA
|
||
value.replace(/[\t\n\r]/g, ' ').replace(/&#?\w+;/g, entityReplacer),
|
||
startIndex
|
||
)
|
||
}
|
||
var attrName;
|
||
var value;
|
||
var p = ++start;
|
||
var s = S_TAG;//status
|
||
while(true){
|
||
var c = source.charAt(p);
|
||
switch(c){
|
||
case '=':
|
||
if(s === S_ATTR){//attrName
|
||
attrName = source.slice(start,p);
|
||
s = S_EQ;
|
||
}else if(s === S_ATTR_SPACE){
|
||
s = S_EQ;
|
||
}else{
|
||
//fatalError: equal must after attrName or space after attrName
|
||
throw new Error('attribute equal must after attrName'); // No known test case
|
||
}
|
||
break;
|
||
case '\'':
|
||
case '"':
|
||
if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE
|
||
){//equal
|
||
if(s === S_ATTR){
|
||
errorHandler.warning('attribute value must after "="')
|
||
attrName = source.slice(start,p)
|
||
}
|
||
start = p+1;
|
||
p = source.indexOf(c,start)
|
||
if(p>0){
|
||
value = source.slice(start, p);
|
||
addAttribute(attrName, value, start-1);
|
||
s = S_ATTR_END;
|
||
}else{
|
||
//fatalError: no end quot match
|
||
throw new Error('attribute value no end \''+c+'\' match');
|
||
}
|
||
}else if(s == S_ATTR_NOQUOT_VALUE){
|
||
value = source.slice(start, p);
|
||
addAttribute(attrName, value, start);
|
||
errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!');
|
||
start = p+1;
|
||
s = S_ATTR_END
|
||
}else{
|
||
//fatalError: no equal before
|
||
throw new Error('attribute value must after "="'); // No known test case
|
||
}
|
||
break;
|
||
case '/':
|
||
switch(s){
|
||
case S_TAG:
|
||
el.setTagName(source.slice(start,p));
|
||
case S_ATTR_END:
|
||
case S_TAG_SPACE:
|
||
case S_TAG_CLOSE:
|
||
s =S_TAG_CLOSE;
|
||
el.closed = true;
|
||
case S_ATTR_NOQUOT_VALUE:
|
||
case S_ATTR:
|
||
break;
|
||
case S_ATTR_SPACE:
|
||
el.closed = true;
|
||
break;
|
||
//case S_EQ:
|
||
default:
|
||
throw new Error("attribute invalid close char('/')") // No known test case
|
||
}
|
||
break;
|
||
case ''://end document
|
||
errorHandler.error('unexpected end of input');
|
||
if(s == S_TAG){
|
||
el.setTagName(source.slice(start,p));
|
||
}
|
||
return p;
|
||
case '>':
|
||
switch(s){
|
||
case S_TAG:
|
||
el.setTagName(source.slice(start,p));
|
||
case S_ATTR_END:
|
||
case S_TAG_SPACE:
|
||
case S_TAG_CLOSE:
|
||
break;//normal
|
||
case S_ATTR_NOQUOT_VALUE://Compatible state
|
||
case S_ATTR:
|
||
value = source.slice(start,p);
|
||
if(value.slice(-1) === '/'){
|
||
el.closed = true;
|
||
value = value.slice(0,-1)
|
||
}
|
||
case S_ATTR_SPACE:
|
||
if(s === S_ATTR_SPACE){
|
||
value = attrName;
|
||
}
|
||
if(s == S_ATTR_NOQUOT_VALUE){
|
||
errorHandler.warning('attribute "'+value+'" missed quot(")!');
|
||
addAttribute(attrName, value, start)
|
||
}else{
|
||
if(!NAMESPACE.isHTML(currentNSMap['']) || !value.match(/^(?:disabled|checked|selected)$/i)){
|
||
errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!')
|
||
}
|
||
addAttribute(value, value, start)
|
||
}
|
||
break;
|
||
case S_EQ:
|
||
throw new Error('attribute value missed!!');
|
||
}
|
||
// console.log(tagName,tagNamePattern,tagNamePattern.test(tagName))
|
||
return p;
|
||
/*xml space '\x20' | #x9 | #xD | #xA; */
|
||
case '\u0080':
|
||
c = ' ';
|
||
default:
|
||
if(c<= ' '){//space
|
||
switch(s){
|
||
case S_TAG:
|
||
el.setTagName(source.slice(start,p));//tagName
|
||
s = S_TAG_SPACE;
|
||
break;
|
||
case S_ATTR:
|
||
attrName = source.slice(start,p)
|
||
s = S_ATTR_SPACE;
|
||
break;
|
||
case S_ATTR_NOQUOT_VALUE:
|
||
var value = source.slice(start, p);
|
||
errorHandler.warning('attribute "'+value+'" missed quot(")!!');
|
||
addAttribute(attrName, value, start)
|
||
case S_ATTR_END:
|
||
s = S_TAG_SPACE;
|
||
break;
|
||
//case S_TAG_SPACE:
|
||
//case S_EQ:
|
||
//case S_ATTR_SPACE:
|
||
// void();break;
|
||
//case S_TAG_CLOSE:
|
||
//ignore warning
|
||
}
|
||
}else{//not space
|
||
//S_TAG, S_ATTR, S_EQ, S_ATTR_NOQUOT_VALUE
|
||
//S_ATTR_SPACE, S_ATTR_END, S_TAG_SPACE, S_TAG_CLOSE
|
||
switch(s){
|
||
//case S_TAG:void();break;
|
||
//case S_ATTR:void();break;
|
||
//case S_ATTR_NOQUOT_VALUE:void();break;
|
||
case S_ATTR_SPACE:
|
||
var tagName = el.tagName;
|
||
if (!NAMESPACE.isHTML(currentNSMap['']) || !attrName.match(/^(?:disabled|checked|selected)$/i)) {
|
||
errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!')
|
||
}
|
||
addAttribute(attrName, attrName, start);
|
||
start = p;
|
||
s = S_ATTR;
|
||
break;
|
||
case S_ATTR_END:
|
||
errorHandler.warning('attribute space is required"'+attrName+'"!!')
|
||
case S_TAG_SPACE:
|
||
s = S_ATTR;
|
||
start = p;
|
||
break;
|
||
case S_EQ:
|
||
s = S_ATTR_NOQUOT_VALUE;
|
||
start = p;
|
||
break;
|
||
case S_TAG_CLOSE:
|
||
throw new Error("elements closed character '/' and '>' must be connected to");
|
||
}
|
||
}
|
||
}//end outer switch
|
||
//console.log('p++',p)
|
||
p++;
|
||
}
|
||
}
|
||
/**
|
||
* @return true if has new namespace define
|
||
*/
|
||
function appendElement(el,domBuilder,currentNSMap){
|
||
var tagName = el.tagName;
|
||
var localNSMap = null;
|
||
//var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
|
||
var i = el.length;
|
||
while(i--){
|
||
var a = el[i];
|
||
var qName = a.qName;
|
||
var value = a.value;
|
||
var nsp = qName.indexOf(':');
|
||
if(nsp>0){
|
||
var prefix = a.prefix = qName.slice(0,nsp);
|
||
var localName = qName.slice(nsp+1);
|
||
var nsPrefix = prefix === 'xmlns' && localName
|
||
}else{
|
||
localName = qName;
|
||
prefix = null
|
||
nsPrefix = qName === 'xmlns' && ''
|
||
}
|
||
//can not set prefix,because prefix !== ''
|
||
a.localName = localName ;
|
||
//prefix == null for no ns prefix attribute
|
||
if(nsPrefix !== false){//hack!!
|
||
if(localNSMap == null){
|
||
localNSMap = {}
|
||
//console.log(currentNSMap,0)
|
||
_copy(currentNSMap,currentNSMap={})
|
||
//console.log(currentNSMap,1)
|
||
}
|
||
currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;
|
||
a.uri = NAMESPACE.XMLNS
|
||
domBuilder.startPrefixMapping(nsPrefix, value)
|
||
}
|
||
}
|
||
var i = el.length;
|
||
while(i--){
|
||
a = el[i];
|
||
var prefix = a.prefix;
|
||
if(prefix){//no prefix attribute has no namespace
|
||
if(prefix === 'xml'){
|
||
a.uri = NAMESPACE.XML;
|
||
}if(prefix !== 'xmlns'){
|
||
a.uri = currentNSMap[prefix || '']
|
||
|
||
//{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}
|
||
}
|
||
}
|
||
}
|
||
var nsp = tagName.indexOf(':');
|
||
if(nsp>0){
|
||
prefix = el.prefix = tagName.slice(0,nsp);
|
||
localName = el.localName = tagName.slice(nsp+1);
|
||
}else{
|
||
prefix = null;//important!!
|
||
localName = el.localName = tagName;
|
||
}
|
||
//no prefix element has default namespace
|
||
var ns = el.uri = currentNSMap[prefix || ''];
|
||
domBuilder.startElement(ns,localName,tagName,el);
|
||
//endPrefixMapping and startPrefixMapping have not any help for dom builder
|
||
//localNSMap = null
|
||
if(el.closed){
|
||
domBuilder.endElement(ns,localName,tagName);
|
||
if(localNSMap){
|
||
for (prefix in localNSMap) {
|
||
if (Object.prototype.hasOwnProperty.call(localNSMap, prefix)) {
|
||
domBuilder.endPrefixMapping(prefix);
|
||
}
|
||
}
|
||
}
|
||
}else{
|
||
el.currentNSMap = currentNSMap;
|
||
el.localNSMap = localNSMap;
|
||
//parseStack.push(el);
|
||
return true;
|
||
}
|
||
}
|
||
function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){
|
||
if(/^(?:script|textarea)$/i.test(tagName)){
|
||
var elEndStart = source.indexOf('</'+tagName+'>',elStartEnd);
|
||
var text = source.substring(elStartEnd+1,elEndStart);
|
||
if(/[&<]/.test(text)){
|
||
if(/^script$/i.test(tagName)){
|
||
//if(!/\]\]>/.test(text)){
|
||
//lexHandler.startCDATA();
|
||
domBuilder.characters(text,0,text.length);
|
||
//lexHandler.endCDATA();
|
||
return elEndStart;
|
||
//}
|
||
}//}else{//text area
|
||
text = text.replace(/&#?\w+;/g,entityReplacer);
|
||
domBuilder.characters(text,0,text.length);
|
||
return elEndStart;
|
||
//}
|
||
|
||
}
|
||
}
|
||
return elStartEnd+1;
|
||
}
|
||
function fixSelfClosed(source,elStartEnd,tagName,closeMap){
|
||
//if(tagName in closeMap){
|
||
var pos = closeMap[tagName];
|
||
if(pos == null){
|
||
//console.log(tagName)
|
||
pos = source.lastIndexOf('</'+tagName+'>')
|
||
if(pos<elStartEnd){//忘记闭合
|
||
pos = source.lastIndexOf('</'+tagName)
|
||
}
|
||
closeMap[tagName] =pos
|
||
}
|
||
return pos<elStartEnd;
|
||
//}
|
||
}
|
||
|
||
function _copy (source, target) {
|
||
for (var n in source) {
|
||
if (Object.prototype.hasOwnProperty.call(source, n)) {
|
||
target[n] = source[n];
|
||
}
|
||
}
|
||
}
|
||
|
||
function parseDCC(source,start,domBuilder,errorHandler){//sure start with '<!'
|
||
var next= source.charAt(start+2)
|
||
switch(next){
|
||
case '-':
|
||
if(source.charAt(start + 3) === '-'){
|
||
var end = source.indexOf('-->',start+4);
|
||
//append comment source.substring(4,end)//<!--
|
||
if(end>start){
|
||
domBuilder.comment(source,start+4,end-start-4);
|
||
return end+3;
|
||
}else{
|
||
errorHandler.error("Unclosed comment");
|
||
return -1;
|
||
}
|
||
}else{
|
||
//error
|
||
return -1;
|
||
}
|
||
default:
|
||
if(source.substr(start+3,6) == 'CDATA['){
|
||
var end = source.indexOf(']]>',start+9);
|
||
domBuilder.startCDATA();
|
||
domBuilder.characters(source,start+9,end-start-9);
|
||
domBuilder.endCDATA()
|
||
return end+3;
|
||
}
|
||
//<!DOCTYPE
|
||
//startDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId)
|
||
var matchs = split(source,start);
|
||
var len = matchs.length;
|
||
if(len>1 && /!doctype/i.test(matchs[0][0])){
|
||
var name = matchs[1][0];
|
||
var pubid = false;
|
||
var sysid = false;
|
||
if(len>3){
|
||
if(/^public$/i.test(matchs[2][0])){
|
||
pubid = matchs[3][0];
|
||
sysid = len>4 && matchs[4][0];
|
||
}else if(/^system$/i.test(matchs[2][0])){
|
||
sysid = matchs[3][0];
|
||
}
|
||
}
|
||
var lastMatch = matchs[len-1]
|
||
domBuilder.startDTD(name, pubid, sysid);
|
||
domBuilder.endDTD();
|
||
|
||
return lastMatch.index+lastMatch[0].length
|
||
}
|
||
}
|
||
return -1;
|
||
}
|
||
|
||
|
||
|
||
function parseInstruction(source,start,domBuilder){
|
||
var end = source.indexOf('?>',start);
|
||
if(end){
|
||
var match = source.substring(start,end).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);
|
||
if(match){
|
||
var len = match[0].length;
|
||
domBuilder.processingInstruction(match[1], match[2]) ;
|
||
return end+2;
|
||
}else{//error
|
||
return -1;
|
||
}
|
||
}
|
||
return -1;
|
||
}
|
||
|
||
function ElementAttributes(){
|
||
this.attributeNames = {}
|
||
}
|
||
ElementAttributes.prototype = {
|
||
setTagName:function(tagName){
|
||
if(!tagNamePattern.test(tagName)){
|
||
throw new Error('invalid tagName:'+tagName)
|
||
}
|
||
this.tagName = tagName
|
||
},
|
||
addValue:function(qName, value, offset) {
|
||
if(!tagNamePattern.test(qName)){
|
||
throw new Error('invalid attribute:'+qName)
|
||
}
|
||
this.attributeNames[qName] = this.length;
|
||
this[this.length++] = {qName:qName,value:value,offset:offset}
|
||
},
|
||
length:0,
|
||
getLocalName:function(i){return this[i].localName},
|
||
getLocator:function(i){return this[i].locator},
|
||
getQName:function(i){return this[i].qName},
|
||
getURI:function(i){return this[i].uri},
|
||
getValue:function(i){return this[i].value}
|
||
// ,getIndex:function(uri, localName)){
|
||
// if(localName){
|
||
//
|
||
// }else{
|
||
// var qName = uri
|
||
// }
|
||
// },
|
||
// getValue:function(){return this.getValue(this.getIndex.apply(this,arguments))},
|
||
// getType:function(uri,localName){}
|
||
// getType:function(i){},
|
||
}
|
||
|
||
|
||
|
||
function split(source,start){
|
||
var match;
|
||
var buf = [];
|
||
var reg = /'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;
|
||
reg.lastIndex = start;
|
||
reg.exec(source);//skip <
|
||
while(match = reg.exec(source)){
|
||
buf.push(match);
|
||
if(match[1])return buf;
|
||
}
|
||
}
|
||
|
||
exports.XMLReader = XMLReader;
|
||
exports.ParseError = ParseError;
|
||
|
||
},{"./conventions":2}],8:[function(require,module,exports){
|
||
'use strict'
|
||
|
||
exports.byteLength = byteLength
|
||
exports.toByteArray = toByteArray
|
||
exports.fromByteArray = fromByteArray
|
||
|
||
var lookup = []
|
||
var revLookup = []
|
||
var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array
|
||
|
||
var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
|
||
for (var i = 0, len = code.length; i < len; ++i) {
|
||
lookup[i] = code[i]
|
||
revLookup[code.charCodeAt(i)] = i
|
||
}
|
||
|
||
// Support decoding URL-safe base64 strings, as Node.js does.
|
||
// See: https://en.wikipedia.org/wiki/Base64#URL_applications
|
||
revLookup['-'.charCodeAt(0)] = 62
|
||
revLookup['_'.charCodeAt(0)] = 63
|
||
|
||
function getLens (b64) {
|
||
var len = b64.length
|
||
|
||
if (len % 4 > 0) {
|
||
throw new Error('Invalid string. Length must be a multiple of 4')
|
||
}
|
||
|
||
// Trim off extra bytes after placeholder bytes are found
|
||
// See: https://github.com/beatgammit/base64-js/issues/42
|
||
var validLen = b64.indexOf('=')
|
||
if (validLen === -1) validLen = len
|
||
|
||
var placeHoldersLen = validLen === len
|
||
? 0
|
||
: 4 - (validLen % 4)
|
||
|
||
return [validLen, placeHoldersLen]
|
||
}
|
||
|
||
// base64 is 4/3 + up to two characters of the original data
|
||
function byteLength (b64) {
|
||
var lens = getLens(b64)
|
||
var validLen = lens[0]
|
||
var placeHoldersLen = lens[1]
|
||
return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
|
||
}
|
||
|
||
function _byteLength (b64, validLen, placeHoldersLen) {
|
||
return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
|
||
}
|
||
|
||
function toByteArray (b64) {
|
||
var tmp
|
||
var lens = getLens(b64)
|
||
var validLen = lens[0]
|
||
var placeHoldersLen = lens[1]
|
||
|
||
var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))
|
||
|
||
var curByte = 0
|
||
|
||
// if there are placeholders, only get up to the last complete 4 chars
|
||
var len = placeHoldersLen > 0
|
||
? validLen - 4
|
||
: validLen
|
||
|
||
var i
|
||
for (i = 0; i < len; i += 4) {
|
||
tmp =
|
||
(revLookup[b64.charCodeAt(i)] << 18) |
|
||
(revLookup[b64.charCodeAt(i + 1)] << 12) |
|
||
(revLookup[b64.charCodeAt(i + 2)] << 6) |
|
||
revLookup[b64.charCodeAt(i + 3)]
|
||
arr[curByte++] = (tmp >> 16) & 0xFF
|
||
arr[curByte++] = (tmp >> 8) & 0xFF
|
||
arr[curByte++] = tmp & 0xFF
|
||
}
|
||
|
||
if (placeHoldersLen === 2) {
|
||
tmp =
|
||
(revLookup[b64.charCodeAt(i)] << 2) |
|
||
(revLookup[b64.charCodeAt(i + 1)] >> 4)
|
||
arr[curByte++] = tmp & 0xFF
|
||
}
|
||
|
||
if (placeHoldersLen === 1) {
|
||
tmp =
|
||
(revLookup[b64.charCodeAt(i)] << 10) |
|
||
(revLookup[b64.charCodeAt(i + 1)] << 4) |
|
||
(revLookup[b64.charCodeAt(i + 2)] >> 2)
|
||
arr[curByte++] = (tmp >> 8) & 0xFF
|
||
arr[curByte++] = tmp & 0xFF
|
||
}
|
||
|
||
return arr
|
||
}
|
||
|
||
function tripletToBase64 (num) {
|
||
return lookup[num >> 18 & 0x3F] +
|
||
lookup[num >> 12 & 0x3F] +
|
||
lookup[num >> 6 & 0x3F] +
|
||
lookup[num & 0x3F]
|
||
}
|
||
|
||
function encodeChunk (uint8, start, end) {
|
||
var tmp
|
||
var output = []
|
||
for (var i = start; i < end; i += 3) {
|
||
tmp =
|
||
((uint8[i] << 16) & 0xFF0000) +
|
||
((uint8[i + 1] << 8) & 0xFF00) +
|
||
(uint8[i + 2] & 0xFF)
|
||
output.push(tripletToBase64(tmp))
|
||
}
|
||
return output.join('')
|
||
}
|
||
|
||
function fromByteArray (uint8) {
|
||
var tmp
|
||
var len = uint8.length
|
||
var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
|
||
var parts = []
|
||
var maxChunkLength = 16383 // must be multiple of 3
|
||
|
||
// go through the array every three bytes, we'll deal with trailing stuff later
|
||
for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
|
||
parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))
|
||
}
|
||
|
||
// pad the end with zeros, but make sure to not forget the extra bytes
|
||
if (extraBytes === 1) {
|
||
tmp = uint8[len - 1]
|
||
parts.push(
|
||
lookup[tmp >> 2] +
|
||
lookup[(tmp << 4) & 0x3F] +
|
||
'=='
|
||
)
|
||
} else if (extraBytes === 2) {
|
||
tmp = (uint8[len - 2] << 8) + uint8[len - 1]
|
||
parts.push(
|
||
lookup[tmp >> 10] +
|
||
lookup[(tmp >> 4) & 0x3F] +
|
||
lookup[(tmp << 2) & 0x3F] +
|
||
'='
|
||
)
|
||
}
|
||
|
||
return parts.join('')
|
||
}
|
||
|
||
},{}],9:[function(require,module,exports){
|
||
(function (Buffer){(function (){
|
||
/*!
|
||
* The buffer module from node.js, for the browser.
|
||
*
|
||
* @author Feross Aboukhadijeh <https://feross.org>
|
||
* @license MIT
|
||
*/
|
||
/* eslint-disable no-proto */
|
||
|
||
'use strict'
|
||
|
||
var base64 = require('base64-js')
|
||
var ieee754 = require('ieee754')
|
||
|
||
exports.Buffer = Buffer
|
||
exports.SlowBuffer = SlowBuffer
|
||
exports.INSPECT_MAX_BYTES = 50
|
||
|
||
var K_MAX_LENGTH = 0x7fffffff
|
||
exports.kMaxLength = K_MAX_LENGTH
|
||
|
||
/**
|
||
* If `Buffer.TYPED_ARRAY_SUPPORT`:
|
||
* === true Use Uint8Array implementation (fastest)
|
||
* === false Print warning and recommend using `buffer` v4.x which has an Object
|
||
* implementation (most compatible, even IE6)
|
||
*
|
||
* Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
|
||
* Opera 11.6+, iOS 4.2+.
|
||
*
|
||
* We report that the browser does not support typed arrays if the are not subclassable
|
||
* using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`
|
||
* (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support
|
||
* for __proto__ and has a buggy typed array implementation.
|
||
*/
|
||
Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport()
|
||
|
||
if (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&
|
||
typeof console.error === 'function') {
|
||
console.error(
|
||
'This browser lacks typed array (Uint8Array) support which is required by ' +
|
||
'`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'
|
||
)
|
||
}
|
||
|
||
function typedArraySupport () {
|
||
// Can typed array instances can be augmented?
|
||
try {
|
||
var arr = new Uint8Array(1)
|
||
arr.__proto__ = { __proto__: Uint8Array.prototype, foo: function () { return 42 } }
|
||
return arr.foo() === 42
|
||
} catch (e) {
|
||
return false
|
||
}
|
||
}
|
||
|
||
Object.defineProperty(Buffer.prototype, 'parent', {
|
||
enumerable: true,
|
||
get: function () {
|
||
if (!Buffer.isBuffer(this)) return undefined
|
||
return this.buffer
|
||
}
|
||
})
|
||
|
||
Object.defineProperty(Buffer.prototype, 'offset', {
|
||
enumerable: true,
|
||
get: function () {
|
||
if (!Buffer.isBuffer(this)) return undefined
|
||
return this.byteOffset
|
||
}
|
||
})
|
||
|
||
function createBuffer (length) {
|
||
if (length > K_MAX_LENGTH) {
|
||
throw new RangeError('The value "' + length + '" is invalid for option "size"')
|
||
}
|
||
// Return an augmented `Uint8Array` instance
|
||
var buf = new Uint8Array(length)
|
||
buf.__proto__ = Buffer.prototype
|
||
return buf
|
||
}
|
||
|
||
/**
|
||
* The Buffer constructor returns instances of `Uint8Array` that have their
|
||
* prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of
|
||
* `Uint8Array`, so the returned instances will have all the node `Buffer` methods
|
||
* and the `Uint8Array` methods. Square bracket notation works as expected -- it
|
||
* returns a single octet.
|
||
*
|
||
* The `Uint8Array` prototype remains unmodified.
|
||
*/
|
||
|
||
function Buffer (arg, encodingOrOffset, length) {
|
||
// Common case.
|
||
if (typeof arg === 'number') {
|
||
if (typeof encodingOrOffset === 'string') {
|
||
throw new TypeError(
|
||
'The "string" argument must be of type string. Received type number'
|
||
)
|
||
}
|
||
return allocUnsafe(arg)
|
||
}
|
||
return from(arg, encodingOrOffset, length)
|
||
}
|
||
|
||
// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97
|
||
if (typeof Symbol !== 'undefined' && Symbol.species != null &&
|
||
Buffer[Symbol.species] === Buffer) {
|
||
Object.defineProperty(Buffer, Symbol.species, {
|
||
value: null,
|
||
configurable: true,
|
||
enumerable: false,
|
||
writable: false
|
||
})
|
||
}
|
||
|
||
Buffer.poolSize = 8192 // not used by this implementation
|
||
|
||
function from (value, encodingOrOffset, length) {
|
||
if (typeof value === 'string') {
|
||
return fromString(value, encodingOrOffset)
|
||
}
|
||
|
||
if (ArrayBuffer.isView(value)) {
|
||
return fromArrayLike(value)
|
||
}
|
||
|
||
if (value == null) {
|
||
throw TypeError(
|
||
'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +
|
||
'or Array-like Object. Received type ' + (typeof value)
|
||
)
|
||
}
|
||
|
||
if (isInstance(value, ArrayBuffer) ||
|
||
(value && isInstance(value.buffer, ArrayBuffer))) {
|
||
return fromArrayBuffer(value, encodingOrOffset, length)
|
||
}
|
||
|
||
if (typeof value === 'number') {
|
||
throw new TypeError(
|
||
'The "value" argument must not be of type number. Received type number'
|
||
)
|
||
}
|
||
|
||
var valueOf = value.valueOf && value.valueOf()
|
||
if (valueOf != null && valueOf !== value) {
|
||
return Buffer.from(valueOf, encodingOrOffset, length)
|
||
}
|
||
|
||
var b = fromObject(value)
|
||
if (b) return b
|
||
|
||
if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&
|
||
typeof value[Symbol.toPrimitive] === 'function') {
|
||
return Buffer.from(
|
||
value[Symbol.toPrimitive]('string'), encodingOrOffset, length
|
||
)
|
||
}
|
||
|
||
throw new TypeError(
|
||
'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +
|
||
'or Array-like Object. Received type ' + (typeof value)
|
||
)
|
||
}
|
||
|
||
/**
|
||
* Functionally equivalent to Buffer(arg, encoding) but throws a TypeError
|
||
* if value is a number.
|
||
* Buffer.from(str[, encoding])
|
||
* Buffer.from(array)
|
||
* Buffer.from(buffer)
|
||
* Buffer.from(arrayBuffer[, byteOffset[, length]])
|
||
**/
|
||
Buffer.from = function (value, encodingOrOffset, length) {
|
||
return from(value, encodingOrOffset, length)
|
||
}
|
||
|
||
// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:
|
||
// https://github.com/feross/buffer/pull/148
|
||
Buffer.prototype.__proto__ = Uint8Array.prototype
|
||
Buffer.__proto__ = Uint8Array
|
||
|
||
function assertSize (size) {
|
||
if (typeof size !== 'number') {
|
||
throw new TypeError('"size" argument must be of type number')
|
||
} else if (size < 0) {
|
||
throw new RangeError('The value "' + size + '" is invalid for option "size"')
|
||
}
|
||
}
|
||
|
||
function alloc (size, fill, encoding) {
|
||
assertSize(size)
|
||
if (size <= 0) {
|
||
return createBuffer(size)
|
||
}
|
||
if (fill !== undefined) {
|
||
// Only pay attention to encoding if it's a string. This
|
||
// prevents accidentally sending in a number that would
|
||
// be interpretted as a start offset.
|
||
return typeof encoding === 'string'
|
||
? createBuffer(size).fill(fill, encoding)
|
||
: createBuffer(size).fill(fill)
|
||
}
|
||
return createBuffer(size)
|
||
}
|
||
|
||
/**
|
||
* Creates a new filled Buffer instance.
|
||
* alloc(size[, fill[, encoding]])
|
||
**/
|
||
Buffer.alloc = function (size, fill, encoding) {
|
||
return alloc(size, fill, encoding)
|
||
}
|
||
|
||
function allocUnsafe (size) {
|
||
assertSize(size)
|
||
return createBuffer(size < 0 ? 0 : checked(size) | 0)
|
||
}
|
||
|
||
/**
|
||
* Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.
|
||
* */
|
||
Buffer.allocUnsafe = function (size) {
|
||
return allocUnsafe(size)
|
||
}
|
||
/**
|
||
* Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.
|
||
*/
|
||
Buffer.allocUnsafeSlow = function (size) {
|
||
return allocUnsafe(size)
|
||
}
|
||
|
||
function fromString (string, encoding) {
|
||
if (typeof encoding !== 'string' || encoding === '') {
|
||
encoding = 'utf8'
|
||
}
|
||
|
||
if (!Buffer.isEncoding(encoding)) {
|
||
throw new TypeError('Unknown encoding: ' + encoding)
|
||
}
|
||
|
||
var length = byteLength(string, encoding) | 0
|
||
var buf = createBuffer(length)
|
||
|
||
var actual = buf.write(string, encoding)
|
||
|
||
if (actual !== length) {
|
||
// Writing a hex string, for example, that contains invalid characters will
|
||
// cause everything after the first invalid character to be ignored. (e.g.
|
||
// 'abxxcd' will be treated as 'ab')
|
||
buf = buf.slice(0, actual)
|
||
}
|
||
|
||
return buf
|
||
}
|
||
|
||
function fromArrayLike (array) {
|
||
var length = array.length < 0 ? 0 : checked(array.length) | 0
|
||
var buf = createBuffer(length)
|
||
for (var i = 0; i < length; i += 1) {
|
||
buf[i] = array[i] & 255
|
||
}
|
||
return buf
|
||
}
|
||
|
||
function fromArrayBuffer (array, byteOffset, length) {
|
||
if (byteOffset < 0 || array.byteLength < byteOffset) {
|
||
throw new RangeError('"offset" is outside of buffer bounds')
|
||
}
|
||
|
||
if (array.byteLength < byteOffset + (length || 0)) {
|
||
throw new RangeError('"length" is outside of buffer bounds')
|
||
}
|
||
|
||
var buf
|
||
if (byteOffset === undefined && length === undefined) {
|
||
buf = new Uint8Array(array)
|
||
} else if (length === undefined) {
|
||
buf = new Uint8Array(array, byteOffset)
|
||
} else {
|
||
buf = new Uint8Array(array, byteOffset, length)
|
||
}
|
||
|
||
// Return an augmented `Uint8Array` instance
|
||
buf.__proto__ = Buffer.prototype
|
||
return buf
|
||
}
|
||
|
||
function fromObject (obj) {
|
||
if (Buffer.isBuffer(obj)) {
|
||
var len = checked(obj.length) | 0
|
||
var buf = createBuffer(len)
|
||
|
||
if (buf.length === 0) {
|
||
return buf
|
||
}
|
||
|
||
obj.copy(buf, 0, 0, len)
|
||
return buf
|
||
}
|
||
|
||
if (obj.length !== undefined) {
|
||
if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {
|
||
return createBuffer(0)
|
||
}
|
||
return fromArrayLike(obj)
|
||
}
|
||
|
||
if (obj.type === 'Buffer' && Array.isArray(obj.data)) {
|
||
return fromArrayLike(obj.data)
|
||
}
|
||
}
|
||
|
||
function checked (length) {
|
||
// Note: cannot use `length < K_MAX_LENGTH` here because that fails when
|
||
// length is NaN (which is otherwise coerced to zero.)
|
||
if (length >= K_MAX_LENGTH) {
|
||
throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
|
||
'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')
|
||
}
|
||
return length | 0
|
||
}
|
||
|
||
function SlowBuffer (length) {
|
||
if (+length != length) { // eslint-disable-line eqeqeq
|
||
length = 0
|
||
}
|
||
return Buffer.alloc(+length)
|
||
}
|
||
|
||
Buffer.isBuffer = function isBuffer (b) {
|
||
return b != null && b._isBuffer === true &&
|
||
b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false
|
||
}
|
||
|
||
Buffer.compare = function compare (a, b) {
|
||
if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)
|
||
if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)
|
||
if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
|
||
throw new TypeError(
|
||
'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array'
|
||
)
|
||
}
|
||
|
||
if (a === b) return 0
|
||
|
||
var x = a.length
|
||
var y = b.length
|
||
|
||
for (var i = 0, len = Math.min(x, y); i < len; ++i) {
|
||
if (a[i] !== b[i]) {
|
||
x = a[i]
|
||
y = b[i]
|
||
break
|
||
}
|
||
}
|
||
|
||
if (x < y) return -1
|
||
if (y < x) return 1
|
||
return 0
|
||
}
|
||
|
||
Buffer.isEncoding = function isEncoding (encoding) {
|
||
switch (String(encoding).toLowerCase()) {
|
||
case 'hex':
|
||
case 'utf8':
|
||
case 'utf-8':
|
||
case 'ascii':
|
||
case 'latin1':
|
||
case 'binary':
|
||
case 'base64':
|
||
case 'ucs2':
|
||
case 'ucs-2':
|
||
case 'utf16le':
|
||
case 'utf-16le':
|
||
return true
|
||
default:
|
||
return false
|
||
}
|
||
}
|
||
|
||
Buffer.concat = function concat (list, length) {
|
||
if (!Array.isArray(list)) {
|
||
throw new TypeError('"list" argument must be an Array of Buffers')
|
||
}
|
||
|
||
if (list.length === 0) {
|
||
return Buffer.alloc(0)
|
||
}
|
||
|
||
var i
|
||
if (length === undefined) {
|
||
length = 0
|
||
for (i = 0; i < list.length; ++i) {
|
||
length += list[i].length
|
||
}
|
||
}
|
||
|
||
var buffer = Buffer.allocUnsafe(length)
|
||
var pos = 0
|
||
for (i = 0; i < list.length; ++i) {
|
||
var buf = list[i]
|
||
if (isInstance(buf, Uint8Array)) {
|
||
buf = Buffer.from(buf)
|
||
}
|
||
if (!Buffer.isBuffer(buf)) {
|
||
throw new TypeError('"list" argument must be an Array of Buffers')
|
||
}
|
||
buf.copy(buffer, pos)
|
||
pos += buf.length
|
||
}
|
||
return buffer
|
||
}
|
||
|
||
function byteLength (string, encoding) {
|
||
if (Buffer.isBuffer(string)) {
|
||
return string.length
|
||
}
|
||
if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {
|
||
return string.byteLength
|
||
}
|
||
if (typeof string !== 'string') {
|
||
throw new TypeError(
|
||
'The "string" argument must be one of type string, Buffer, or ArrayBuffer. ' +
|
||
'Received type ' + typeof string
|
||
)
|
||
}
|
||
|
||
var len = string.length
|
||
var mustMatch = (arguments.length > 2 && arguments[2] === true)
|
||
if (!mustMatch && len === 0) return 0
|
||
|
||
// Use a for loop to avoid recursion
|
||
var loweredCase = false
|
||
for (;;) {
|
||
switch (encoding) {
|
||
case 'ascii':
|
||
case 'latin1':
|
||
case 'binary':
|
||
return len
|
||
case 'utf8':
|
||
case 'utf-8':
|
||
return utf8ToBytes(string).length
|
||
case 'ucs2':
|
||
case 'ucs-2':
|
||
case 'utf16le':
|
||
case 'utf-16le':
|
||
return len * 2
|
||
case 'hex':
|
||
return len >>> 1
|
||
case 'base64':
|
||
return base64ToBytes(string).length
|
||
default:
|
||
if (loweredCase) {
|
||
return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8
|
||
}
|
||
encoding = ('' + encoding).toLowerCase()
|
||
loweredCase = true
|
||
}
|
||
}
|
||
}
|
||
Buffer.byteLength = byteLength
|
||
|
||
function slowToString (encoding, start, end) {
|
||
var loweredCase = false
|
||
|
||
// No need to verify that "this.length <= MAX_UINT32" since it's a read-only
|
||
// property of a typed array.
|
||
|
||
// This behaves neither like String nor Uint8Array in that we set start/end
|
||
// to their upper/lower bounds if the value passed is out of range.
|
||
// undefined is handled specially as per ECMA-262 6th Edition,
|
||
// Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.
|
||
if (start === undefined || start < 0) {
|
||
start = 0
|
||
}
|
||
// Return early if start > this.length. Done here to prevent potential uint32
|
||
// coercion fail below.
|
||
if (start > this.length) {
|
||
return ''
|
||
}
|
||
|
||
if (end === undefined || end > this.length) {
|
||
end = this.length
|
||
}
|
||
|
||
if (end <= 0) {
|
||
return ''
|
||
}
|
||
|
||
// Force coersion to uint32. This will also coerce falsey/NaN values to 0.
|
||
end >>>= 0
|
||
start >>>= 0
|
||
|
||
if (end <= start) {
|
||
return ''
|
||
}
|
||
|
||
if (!encoding) encoding = 'utf8'
|
||
|
||
while (true) {
|
||
switch (encoding) {
|
||
case 'hex':
|
||
return hexSlice(this, start, end)
|
||
|
||
case 'utf8':
|
||
case 'utf-8':
|
||
return utf8Slice(this, start, end)
|
||
|
||
case 'ascii':
|
||
return asciiSlice(this, start, end)
|
||
|
||
case 'latin1':
|
||
case 'binary':
|
||
return latin1Slice(this, start, end)
|
||
|
||
case 'base64':
|
||
return base64Slice(this, start, end)
|
||
|
||
case 'ucs2':
|
||
case 'ucs-2':
|
||
case 'utf16le':
|
||
case 'utf-16le':
|
||
return utf16leSlice(this, start, end)
|
||
|
||
default:
|
||
if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
|
||
encoding = (encoding + '').toLowerCase()
|
||
loweredCase = true
|
||
}
|
||
}
|
||
}
|
||
|
||
// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)
|
||
// to detect a Buffer instance. It's not possible to use `instanceof Buffer`
|
||
// reliably in a browserify context because there could be multiple different
|
||
// copies of the 'buffer' package in use. This method works even for Buffer
|
||
// instances that were created from another copy of the `buffer` package.
|
||
// See: https://github.com/feross/buffer/issues/154
|
||
Buffer.prototype._isBuffer = true
|
||
|
||
function swap (b, n, m) {
|
||
var i = b[n]
|
||
b[n] = b[m]
|
||
b[m] = i
|
||
}
|
||
|
||
Buffer.prototype.swap16 = function swap16 () {
|
||
var len = this.length
|
||
if (len % 2 !== 0) {
|
||
throw new RangeError('Buffer size must be a multiple of 16-bits')
|
||
}
|
||
for (var i = 0; i < len; i += 2) {
|
||
swap(this, i, i + 1)
|
||
}
|
||
return this
|
||
}
|
||
|
||
Buffer.prototype.swap32 = function swap32 () {
|
||
var len = this.length
|
||
if (len % 4 !== 0) {
|
||
throw new RangeError('Buffer size must be a multiple of 32-bits')
|
||
}
|
||
for (var i = 0; i < len; i += 4) {
|
||
swap(this, i, i + 3)
|
||
swap(this, i + 1, i + 2)
|
||
}
|
||
return this
|
||
}
|
||
|
||
Buffer.prototype.swap64 = function swap64 () {
|
||
var len = this.length
|
||
if (len % 8 !== 0) {
|
||
throw new RangeError('Buffer size must be a multiple of 64-bits')
|
||
}
|
||
for (var i = 0; i < len; i += 8) {
|
||
swap(this, i, i + 7)
|
||
swap(this, i + 1, i + 6)
|
||
swap(this, i + 2, i + 5)
|
||
swap(this, i + 3, i + 4)
|
||
}
|
||
return this
|
||
}
|
||
|
||
Buffer.prototype.toString = function toString () {
|
||
var length = this.length
|
||
if (length === 0) return ''
|
||
if (arguments.length === 0) return utf8Slice(this, 0, length)
|
||
return slowToString.apply(this, arguments)
|
||
}
|
||
|
||
Buffer.prototype.toLocaleString = Buffer.prototype.toString
|
||
|
||
Buffer.prototype.equals = function equals (b) {
|
||
if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
|
||
if (this === b) return true
|
||
return Buffer.compare(this, b) === 0
|
||
}
|
||
|
||
Buffer.prototype.inspect = function inspect () {
|
||
var str = ''
|
||
var max = exports.INSPECT_MAX_BYTES
|
||
str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()
|
||
if (this.length > max) str += ' ... '
|
||
return '<Buffer ' + str + '>'
|
||
}
|
||
|
||
Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {
|
||
if (isInstance(target, Uint8Array)) {
|
||
target = Buffer.from(target, target.offset, target.byteLength)
|
||
}
|
||
if (!Buffer.isBuffer(target)) {
|
||
throw new TypeError(
|
||
'The "target" argument must be one of type Buffer or Uint8Array. ' +
|
||
'Received type ' + (typeof target)
|
||
)
|
||
}
|
||
|
||
if (start === undefined) {
|
||
start = 0
|
||
}
|
||
if (end === undefined) {
|
||
end = target ? target.length : 0
|
||
}
|
||
if (thisStart === undefined) {
|
||
thisStart = 0
|
||
}
|
||
if (thisEnd === undefined) {
|
||
thisEnd = this.length
|
||
}
|
||
|
||
if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {
|
||
throw new RangeError('out of range index')
|
||
}
|
||
|
||
if (thisStart >= thisEnd && start >= end) {
|
||
return 0
|
||
}
|
||
if (thisStart >= thisEnd) {
|
||
return -1
|
||
}
|
||
if (start >= end) {
|
||
return 1
|
||
}
|
||
|
||
start >>>= 0
|
||
end >>>= 0
|
||
thisStart >>>= 0
|
||
thisEnd >>>= 0
|
||
|
||
if (this === target) return 0
|
||
|
||
var x = thisEnd - thisStart
|
||
var y = end - start
|
||
var len = Math.min(x, y)
|
||
|
||
var thisCopy = this.slice(thisStart, thisEnd)
|
||
var targetCopy = target.slice(start, end)
|
||
|
||
for (var i = 0; i < len; ++i) {
|
||
if (thisCopy[i] !== targetCopy[i]) {
|
||
x = thisCopy[i]
|
||
y = targetCopy[i]
|
||
break
|
||
}
|
||
}
|
||
|
||
if (x < y) return -1
|
||
if (y < x) return 1
|
||
return 0
|
||
}
|
||
|
||
// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,
|
||
// OR the last index of `val` in `buffer` at offset <= `byteOffset`.
|
||
//
|
||
// Arguments:
|
||
// - buffer - a Buffer to search
|
||
// - val - a string, Buffer, or number
|
||
// - byteOffset - an index into `buffer`; will be clamped to an int32
|
||
// - encoding - an optional encoding, relevant is val is a string
|
||
// - dir - true for indexOf, false for lastIndexOf
|
||
function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
|
||
// Empty buffer means no match
|
||
if (buffer.length === 0) return -1
|
||
|
||
// Normalize byteOffset
|
||
if (typeof byteOffset === 'string') {
|
||
encoding = byteOffset
|
||
byteOffset = 0
|
||
} else if (byteOffset > 0x7fffffff) {
|
||
byteOffset = 0x7fffffff
|
||
} else if (byteOffset < -0x80000000) {
|
||
byteOffset = -0x80000000
|
||
}
|
||
byteOffset = +byteOffset // Coerce to Number.
|
||
if (numberIsNaN(byteOffset)) {
|
||
// byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
|
||
byteOffset = dir ? 0 : (buffer.length - 1)
|
||
}
|
||
|
||
// Normalize byteOffset: negative offsets start from the end of the buffer
|
||
if (byteOffset < 0) byteOffset = buffer.length + byteOffset
|
||
if (byteOffset >= buffer.length) {
|
||
if (dir) return -1
|
||
else byteOffset = buffer.length - 1
|
||
} else if (byteOffset < 0) {
|
||
if (dir) byteOffset = 0
|
||
else return -1
|
||
}
|
||
|
||
// Normalize val
|
||
if (typeof val === 'string') {
|
||
val = Buffer.from(val, encoding)
|
||
}
|
||
|
||
// Finally, search either indexOf (if dir is true) or lastIndexOf
|
||
if (Buffer.isBuffer(val)) {
|
||
// Special case: looking for empty string/buffer always fails
|
||
if (val.length === 0) {
|
||
return -1
|
||
}
|
||
return arrayIndexOf(buffer, val, byteOffset, encoding, dir)
|
||
} else if (typeof val === 'number') {
|
||
val = val & 0xFF // Search for a byte value [0-255]
|
||
if (typeof Uint8Array.prototype.indexOf === 'function') {
|
||
if (dir) {
|
||
return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)
|
||
} else {
|
||
return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)
|
||
}
|
||
}
|
||
return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)
|
||
}
|
||
|
||
throw new TypeError('val must be string, number or Buffer')
|
||
}
|
||
|
||
function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
|
||
var indexSize = 1
|
||
var arrLength = arr.length
|
||
var valLength = val.length
|
||
|
||
if (encoding !== undefined) {
|
||
encoding = String(encoding).toLowerCase()
|
||
if (encoding === 'ucs2' || encoding === 'ucs-2' ||
|
||
encoding === 'utf16le' || encoding === 'utf-16le') {
|
||
if (arr.length < 2 || val.length < 2) {
|
||
return -1
|
||
}
|
||
indexSize = 2
|
||
arrLength /= 2
|
||
valLength /= 2
|
||
byteOffset /= 2
|
||
}
|
||
}
|
||
|
||
function read (buf, i) {
|
||
if (indexSize === 1) {
|
||
return buf[i]
|
||
} else {
|
||
return buf.readUInt16BE(i * indexSize)
|
||
}
|
||
}
|
||
|
||
var i
|
||
if (dir) {
|
||
var foundIndex = -1
|
||
for (i = byteOffset; i < arrLength; i++) {
|
||
if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {
|
||
if (foundIndex === -1) foundIndex = i
|
||
if (i - foundIndex + 1 === valLength) return foundIndex * indexSize
|
||
} else {
|
||
if (foundIndex !== -1) i -= i - foundIndex
|
||
foundIndex = -1
|
||
}
|
||
}
|
||
} else {
|
||
if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength
|
||
for (i = byteOffset; i >= 0; i--) {
|
||
var found = true
|
||
for (var j = 0; j < valLength; j++) {
|
||
if (read(arr, i + j) !== read(val, j)) {
|
||
found = false
|
||
break
|
||
}
|
||
}
|
||
if (found) return i
|
||
}
|
||
}
|
||
|
||
return -1
|
||
}
|
||
|
||
Buffer.prototype.includes = function includes (val, byteOffset, encoding) {
|
||
return this.indexOf(val, byteOffset, encoding) !== -1
|
||
}
|
||
|
||
Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {
|
||
return bidirectionalIndexOf(this, val, byteOffset, encoding, true)
|
||
}
|
||
|
||
Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {
|
||
return bidirectionalIndexOf(this, val, byteOffset, encoding, false)
|
||
}
|
||
|
||
function hexWrite (buf, string, offset, length) {
|
||
offset = Number(offset) || 0
|
||
var remaining = buf.length - offset
|
||
if (!length) {
|
||
length = remaining
|
||
} else {
|
||
length = Number(length)
|
||
if (length > remaining) {
|
||
length = remaining
|
||
}
|
||
}
|
||
|
||
var strLen = string.length
|
||
|
||
if (length > strLen / 2) {
|
||
length = strLen / 2
|
||
}
|
||
for (var i = 0; i < length; ++i) {
|
||
var parsed = parseInt(string.substr(i * 2, 2), 16)
|
||
if (numberIsNaN(parsed)) return i
|
||
buf[offset + i] = parsed
|
||
}
|
||
return i
|
||
}
|
||
|
||
function utf8Write (buf, string, offset, length) {
|
||
return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
|
||
}
|
||
|
||
function asciiWrite (buf, string, offset, length) {
|
||
return blitBuffer(asciiToBytes(string), buf, offset, length)
|
||
}
|
||
|
||
function latin1Write (buf, string, offset, length) {
|
||
return asciiWrite(buf, string, offset, length)
|
||
}
|
||
|
||
function base64Write (buf, string, offset, length) {
|
||
return blitBuffer(base64ToBytes(string), buf, offset, length)
|
||
}
|
||
|
||
function ucs2Write (buf, string, offset, length) {
|
||
return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
|
||
}
|
||
|
||
Buffer.prototype.write = function write (string, offset, length, encoding) {
|
||
// Buffer#write(string)
|
||
if (offset === undefined) {
|
||
encoding = 'utf8'
|
||
length = this.length
|
||
offset = 0
|
||
// Buffer#write(string, encoding)
|
||
} else if (length === undefined && typeof offset === 'string') {
|
||
encoding = offset
|
||
length = this.length
|
||
offset = 0
|
||
// Buffer#write(string, offset[, length][, encoding])
|
||
} else if (isFinite(offset)) {
|
||
offset = offset >>> 0
|
||
if (isFinite(length)) {
|
||
length = length >>> 0
|
||
if (encoding === undefined) encoding = 'utf8'
|
||
} else {
|
||
encoding = length
|
||
length = undefined
|
||
}
|
||
} else {
|
||
throw new Error(
|
||
'Buffer.write(string, encoding, offset[, length]) is no longer supported'
|
||
)
|
||
}
|
||
|
||
var remaining = this.length - offset
|
||
if (length === undefined || length > remaining) length = remaining
|
||
|
||
if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
|
||
throw new RangeError('Attempt to write outside buffer bounds')
|
||
}
|
||
|
||
if (!encoding) encoding = 'utf8'
|
||
|
||
var loweredCase = false
|
||
for (;;) {
|
||
switch (encoding) {
|
||
case 'hex':
|
||
return hexWrite(this, string, offset, length)
|
||
|
||
case 'utf8':
|
||
case 'utf-8':
|
||
return utf8Write(this, string, offset, length)
|
||
|
||
case 'ascii':
|
||
return asciiWrite(this, string, offset, length)
|
||
|
||
case 'latin1':
|
||
case 'binary':
|
||
return latin1Write(this, string, offset, length)
|
||
|
||
case 'base64':
|
||
// Warning: maxLength not taken into account in base64Write
|
||
return base64Write(this, string, offset, length)
|
||
|
||
case 'ucs2':
|
||
case 'ucs-2':
|
||
case 'utf16le':
|
||
case 'utf-16le':
|
||
return ucs2Write(this, string, offset, length)
|
||
|
||
default:
|
||
if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
|
||
encoding = ('' + encoding).toLowerCase()
|
||
loweredCase = true
|
||
}
|
||
}
|
||
}
|
||
|
||
Buffer.prototype.toJSON = function toJSON () {
|
||
return {
|
||
type: 'Buffer',
|
||
data: Array.prototype.slice.call(this._arr || this, 0)
|
||
}
|
||
}
|
||
|
||
function base64Slice (buf, start, end) {
|
||
if (start === 0 && end === buf.length) {
|
||
return base64.fromByteArray(buf)
|
||
} else {
|
||
return base64.fromByteArray(buf.slice(start, end))
|
||
}
|
||
}
|
||
|
||
function utf8Slice (buf, start, end) {
|
||
end = Math.min(buf.length, end)
|
||
var res = []
|
||
|
||
var i = start
|
||
while (i < end) {
|
||
var firstByte = buf[i]
|
||
var codePoint = null
|
||
var bytesPerSequence = (firstByte > 0xEF) ? 4
|
||
: (firstByte > 0xDF) ? 3
|
||
: (firstByte > 0xBF) ? 2
|
||
: 1
|
||
|
||
if (i + bytesPerSequence <= end) {
|
||
var secondByte, thirdByte, fourthByte, tempCodePoint
|
||
|
||
switch (bytesPerSequence) {
|
||
case 1:
|
||
if (firstByte < 0x80) {
|
||
codePoint = firstByte
|
||
}
|
||
break
|
||
case 2:
|
||
secondByte = buf[i + 1]
|
||
if ((secondByte & 0xC0) === 0x80) {
|
||
tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)
|
||
if (tempCodePoint > 0x7F) {
|
||
codePoint = tempCodePoint
|
||
}
|
||
}
|
||
break
|
||
case 3:
|
||
secondByte = buf[i + 1]
|
||
thirdByte = buf[i + 2]
|
||
if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
|
||
tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)
|
||
if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
|
||
codePoint = tempCodePoint
|
||
}
|
||
}
|
||
break
|
||
case 4:
|
||
secondByte = buf[i + 1]
|
||
thirdByte = buf[i + 2]
|
||
fourthByte = buf[i + 3]
|
||
if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
|
||
tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)
|
||
if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
|
||
codePoint = tempCodePoint
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if (codePoint === null) {
|
||
// we did not generate a valid codePoint so insert a
|
||
// replacement char (U+FFFD) and advance only 1 byte
|
||
codePoint = 0xFFFD
|
||
bytesPerSequence = 1
|
||
} else if (codePoint > 0xFFFF) {
|
||
// encode to utf16 (surrogate pair dance)
|
||
codePoint -= 0x10000
|
||
res.push(codePoint >>> 10 & 0x3FF | 0xD800)
|
||
codePoint = 0xDC00 | codePoint & 0x3FF
|
||
}
|
||
|
||
res.push(codePoint)
|
||
i += bytesPerSequence
|
||
}
|
||
|
||
return decodeCodePointsArray(res)
|
||
}
|
||
|
||
// Based on http://stackoverflow.com/a/22747272/680742, the browser with
|
||
// the lowest limit is Chrome, with 0x10000 args.
|
||
// We go 1 magnitude less, for safety
|
||
var MAX_ARGUMENTS_LENGTH = 0x1000
|
||
|
||
function decodeCodePointsArray (codePoints) {
|
||
var len = codePoints.length
|
||
if (len <= MAX_ARGUMENTS_LENGTH) {
|
||
return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
|
||
}
|
||
|
||
// Decode in chunks to avoid "call stack size exceeded".
|
||
var res = ''
|
||
var i = 0
|
||
while (i < len) {
|
||
res += String.fromCharCode.apply(
|
||
String,
|
||
codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
|
||
)
|
||
}
|
||
return res
|
||
}
|
||
|
||
function asciiSlice (buf, start, end) {
|
||
var ret = ''
|
||
end = Math.min(buf.length, end)
|
||
|
||
for (var i = start; i < end; ++i) {
|
||
ret += String.fromCharCode(buf[i] & 0x7F)
|
||
}
|
||
return ret
|
||
}
|
||
|
||
function latin1Slice (buf, start, end) {
|
||
var ret = ''
|
||
end = Math.min(buf.length, end)
|
||
|
||
for (var i = start; i < end; ++i) {
|
||
ret += String.fromCharCode(buf[i])
|
||
}
|
||
return ret
|
||
}
|
||
|
||
function hexSlice (buf, start, end) {
|
||
var len = buf.length
|
||
|
||
if (!start || start < 0) start = 0
|
||
if (!end || end < 0 || end > len) end = len
|
||
|
||
var out = ''
|
||
for (var i = start; i < end; ++i) {
|
||
out += toHex(buf[i])
|
||
}
|
||
return out
|
||
}
|
||
|
||
function utf16leSlice (buf, start, end) {
|
||
var bytes = buf.slice(start, end)
|
||
var res = ''
|
||
for (var i = 0; i < bytes.length; i += 2) {
|
||
res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))
|
||
}
|
||
return res
|
||
}
|
||
|
||
Buffer.prototype.slice = function slice (start, end) {
|
||
var len = this.length
|
||
start = ~~start
|
||
end = end === undefined ? len : ~~end
|
||
|
||
if (start < 0) {
|
||
start += len
|
||
if (start < 0) start = 0
|
||
} else if (start > len) {
|
||
start = len
|
||
}
|
||
|
||
if (end < 0) {
|
||
end += len
|
||
if (end < 0) end = 0
|
||
} else if (end > len) {
|
||
end = len
|
||
}
|
||
|
||
if (end < start) end = start
|
||
|
||
var newBuf = this.subarray(start, end)
|
||
// Return an augmented `Uint8Array` instance
|
||
newBuf.__proto__ = Buffer.prototype
|
||
return newBuf
|
||
}
|
||
|
||
/*
|
||
* Need to make sure that buffer isn't trying to write out of bounds.
|
||
*/
|
||
function checkOffset (offset, ext, length) {
|
||
if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
|
||
if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
|
||
}
|
||
|
||
Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
|
||
offset = offset >>> 0
|
||
byteLength = byteLength >>> 0
|
||
if (!noAssert) checkOffset(offset, byteLength, this.length)
|
||
|
||
var val = this[offset]
|
||
var mul = 1
|
||
var i = 0
|
||
while (++i < byteLength && (mul *= 0x100)) {
|
||
val += this[offset + i] * mul
|
||
}
|
||
|
||
return val
|
||
}
|
||
|
||
Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
|
||
offset = offset >>> 0
|
||
byteLength = byteLength >>> 0
|
||
if (!noAssert) {
|
||
checkOffset(offset, byteLength, this.length)
|
||
}
|
||
|
||
var val = this[offset + --byteLength]
|
||
var mul = 1
|
||
while (byteLength > 0 && (mul *= 0x100)) {
|
||
val += this[offset + --byteLength] * mul
|
||
}
|
||
|
||
return val
|
||
}
|
||
|
||
Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
|
||
offset = offset >>> 0
|
||
if (!noAssert) checkOffset(offset, 1, this.length)
|
||
return this[offset]
|
||
}
|
||
|
||
Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
|
||
offset = offset >>> 0
|
||
if (!noAssert) checkOffset(offset, 2, this.length)
|
||
return this[offset] | (this[offset + 1] << 8)
|
||
}
|
||
|
||
Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
|
||
offset = offset >>> 0
|
||
if (!noAssert) checkOffset(offset, 2, this.length)
|
||
return (this[offset] << 8) | this[offset + 1]
|
||
}
|
||
|
||
Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
|
||
offset = offset >>> 0
|
||
if (!noAssert) checkOffset(offset, 4, this.length)
|
||
|
||
return ((this[offset]) |
|
||
(this[offset + 1] << 8) |
|
||
(this[offset + 2] << 16)) +
|
||
(this[offset + 3] * 0x1000000)
|
||
}
|
||
|
||
Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
|
||
offset = offset >>> 0
|
||
if (!noAssert) checkOffset(offset, 4, this.length)
|
||
|
||
return (this[offset] * 0x1000000) +
|
||
((this[offset + 1] << 16) |
|
||
(this[offset + 2] << 8) |
|
||
this[offset + 3])
|
||
}
|
||
|
||
Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
|
||
offset = offset >>> 0
|
||
byteLength = byteLength >>> 0
|
||
if (!noAssert) checkOffset(offset, byteLength, this.length)
|
||
|
||
var val = this[offset]
|
||
var mul = 1
|
||
var i = 0
|
||
while (++i < byteLength && (mul *= 0x100)) {
|
||
val += this[offset + i] * mul
|
||
}
|
||
mul *= 0x80
|
||
|
||
if (val >= mul) val -= Math.pow(2, 8 * byteLength)
|
||
|
||
return val
|
||
}
|
||
|
||
Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
|
||
offset = offset >>> 0
|
||
byteLength = byteLength >>> 0
|
||
if (!noAssert) checkOffset(offset, byteLength, this.length)
|
||
|
||
var i = byteLength
|
||
var mul = 1
|
||
var val = this[offset + --i]
|
||
while (i > 0 && (mul *= 0x100)) {
|
||
val += this[offset + --i] * mul
|
||
}
|
||
mul *= 0x80
|
||
|
||
if (val >= mul) val -= Math.pow(2, 8 * byteLength)
|
||
|
||
return val
|
||
}
|
||
|
||
Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
|
||
offset = offset >>> 0
|
||
if (!noAssert) checkOffset(offset, 1, this.length)
|
||
if (!(this[offset] & 0x80)) return (this[offset])
|
||
return ((0xff - this[offset] + 1) * -1)
|
||
}
|
||
|
||
Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
|
||
offset = offset >>> 0
|
||
if (!noAssert) checkOffset(offset, 2, this.length)
|
||
var val = this[offset] | (this[offset + 1] << 8)
|
||
return (val & 0x8000) ? val | 0xFFFF0000 : val
|
||
}
|
||
|
||
Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
|
||
offset = offset >>> 0
|
||
if (!noAssert) checkOffset(offset, 2, this.length)
|
||
var val = this[offset + 1] | (this[offset] << 8)
|
||
return (val & 0x8000) ? val | 0xFFFF0000 : val
|
||
}
|
||
|
||
Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
|
||
offset = offset >>> 0
|
||
if (!noAssert) checkOffset(offset, 4, this.length)
|
||
|
||
return (this[offset]) |
|
||
(this[offset + 1] << 8) |
|
||
(this[offset + 2] << 16) |
|
||
(this[offset + 3] << 24)
|
||
}
|
||
|
||
Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
|
||
offset = offset >>> 0
|
||
if (!noAssert) checkOffset(offset, 4, this.length)
|
||
|
||
return (this[offset] << 24) |
|
||
(this[offset + 1] << 16) |
|
||
(this[offset + 2] << 8) |
|
||
(this[offset + 3])
|
||
}
|
||
|
||
Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
|
||
offset = offset >>> 0
|
||
if (!noAssert) checkOffset(offset, 4, this.length)
|
||
return ieee754.read(this, offset, true, 23, 4)
|
||
}
|
||
|
||
Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
|
||
offset = offset >>> 0
|
||
if (!noAssert) checkOffset(offset, 4, this.length)
|
||
return ieee754.read(this, offset, false, 23, 4)
|
||
}
|
||
|
||
Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
|
||
offset = offset >>> 0
|
||
if (!noAssert) checkOffset(offset, 8, this.length)
|
||
return ieee754.read(this, offset, true, 52, 8)
|
||
}
|
||
|
||
Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
|
||
offset = offset >>> 0
|
||
if (!noAssert) checkOffset(offset, 8, this.length)
|
||
return ieee754.read(this, offset, false, 52, 8)
|
||
}
|
||
|
||
function checkInt (buf, value, offset, ext, max, min) {
|
||
if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance')
|
||
if (value > max || value < min) throw new RangeError('"value" argument is out of bounds')
|
||
if (offset + ext > buf.length) throw new RangeError('Index out of range')
|
||
}
|
||
|
||
Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
|
||
value = +value
|
||
offset = offset >>> 0
|
||
byteLength = byteLength >>> 0
|
||
if (!noAssert) {
|
||
var maxBytes = Math.pow(2, 8 * byteLength) - 1
|
||
checkInt(this, value, offset, byteLength, maxBytes, 0)
|
||
}
|
||
|
||
var mul = 1
|
||
var i = 0
|
||
this[offset] = value & 0xFF
|
||
while (++i < byteLength && (mul *= 0x100)) {
|
||
this[offset + i] = (value / mul) & 0xFF
|
||
}
|
||
|
||
return offset + byteLength
|
||
}
|
||
|
||
Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
|
||
value = +value
|
||
offset = offset >>> 0
|
||
byteLength = byteLength >>> 0
|
||
if (!noAssert) {
|
||
var maxBytes = Math.pow(2, 8 * byteLength) - 1
|
||
checkInt(this, value, offset, byteLength, maxBytes, 0)
|
||
}
|
||
|
||
var i = byteLength - 1
|
||
var mul = 1
|
||
this[offset + i] = value & 0xFF
|
||
while (--i >= 0 && (mul *= 0x100)) {
|
||
this[offset + i] = (value / mul) & 0xFF
|
||
}
|
||
|
||
return offset + byteLength
|
||
}
|
||
|
||
Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
|
||
value = +value
|
||
offset = offset >>> 0
|
||
if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
|
||
this[offset] = (value & 0xff)
|
||
return offset + 1
|
||
}
|
||
|
||
Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
|
||
value = +value
|
||
offset = offset >>> 0
|
||
if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
|
||
this[offset] = (value & 0xff)
|
||
this[offset + 1] = (value >>> 8)
|
||
return offset + 2
|
||
}
|
||
|
||
Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
|
||
value = +value
|
||
offset = offset >>> 0
|
||
if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
|
||
this[offset] = (value >>> 8)
|
||
this[offset + 1] = (value & 0xff)
|
||
return offset + 2
|
||
}
|
||
|
||
Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
|
||
value = +value
|
||
offset = offset >>> 0
|
||
if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
|
||
this[offset + 3] = (value >>> 24)
|
||
this[offset + 2] = (value >>> 16)
|
||
this[offset + 1] = (value >>> 8)
|
||
this[offset] = (value & 0xff)
|
||
return offset + 4
|
||
}
|
||
|
||
Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
|
||
value = +value
|
||
offset = offset >>> 0
|
||
if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
|
||
this[offset] = (value >>> 24)
|
||
this[offset + 1] = (value >>> 16)
|
||
this[offset + 2] = (value >>> 8)
|
||
this[offset + 3] = (value & 0xff)
|
||
return offset + 4
|
||
}
|
||
|
||
Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
|
||
value = +value
|
||
offset = offset >>> 0
|
||
if (!noAssert) {
|
||
var limit = Math.pow(2, (8 * byteLength) - 1)
|
||
|
||
checkInt(this, value, offset, byteLength, limit - 1, -limit)
|
||
}
|
||
|
||
var i = 0
|
||
var mul = 1
|
||
var sub = 0
|
||
this[offset] = value & 0xFF
|
||
while (++i < byteLength && (mul *= 0x100)) {
|
||
if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {
|
||
sub = 1
|
||
}
|
||
this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
|
||
}
|
||
|
||
return offset + byteLength
|
||
}
|
||
|
||
Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
|
||
value = +value
|
||
offset = offset >>> 0
|
||
if (!noAssert) {
|
||
var limit = Math.pow(2, (8 * byteLength) - 1)
|
||
|
||
checkInt(this, value, offset, byteLength, limit - 1, -limit)
|
||
}
|
||
|
||
var i = byteLength - 1
|
||
var mul = 1
|
||
var sub = 0
|
||
this[offset + i] = value & 0xFF
|
||
while (--i >= 0 && (mul *= 0x100)) {
|
||
if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {
|
||
sub = 1
|
||
}
|
||
this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
|
||
}
|
||
|
||
return offset + byteLength
|
||
}
|
||
|
||
Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
|
||
value = +value
|
||
offset = offset >>> 0
|
||
if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
|
||
if (value < 0) value = 0xff + value + 1
|
||
this[offset] = (value & 0xff)
|
||
return offset + 1
|
||
}
|
||
|
||
Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
|
||
value = +value
|
||
offset = offset >>> 0
|
||
if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
|
||
this[offset] = (value & 0xff)
|
||
this[offset + 1] = (value >>> 8)
|
||
return offset + 2
|
||
}
|
||
|
||
Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
|
||
value = +value
|
||
offset = offset >>> 0
|
||
if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
|
||
this[offset] = (value >>> 8)
|
||
this[offset + 1] = (value & 0xff)
|
||
return offset + 2
|
||
}
|
||
|
||
Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
|
||
value = +value
|
||
offset = offset >>> 0
|
||
if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
|
||
this[offset] = (value & 0xff)
|
||
this[offset + 1] = (value >>> 8)
|
||
this[offset + 2] = (value >>> 16)
|
||
this[offset + 3] = (value >>> 24)
|
||
return offset + 4
|
||
}
|
||
|
||
Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
|
||
value = +value
|
||
offset = offset >>> 0
|
||
if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
|
||
if (value < 0) value = 0xffffffff + value + 1
|
||
this[offset] = (value >>> 24)
|
||
this[offset + 1] = (value >>> 16)
|
||
this[offset + 2] = (value >>> 8)
|
||
this[offset + 3] = (value & 0xff)
|
||
return offset + 4
|
||
}
|
||
|
||
function checkIEEE754 (buf, value, offset, ext, max, min) {
|
||
if (offset + ext > buf.length) throw new RangeError('Index out of range')
|
||
if (offset < 0) throw new RangeError('Index out of range')
|
||
}
|
||
|
||
function writeFloat (buf, value, offset, littleEndian, noAssert) {
|
||
value = +value
|
||
offset = offset >>> 0
|
||
if (!noAssert) {
|
||
checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
|
||
}
|
||
ieee754.write(buf, value, offset, littleEndian, 23, 4)
|
||
return offset + 4
|
||
}
|
||
|
||
Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
|
||
return writeFloat(this, value, offset, true, noAssert)
|
||
}
|
||
|
||
Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
|
||
return writeFloat(this, value, offset, false, noAssert)
|
||
}
|
||
|
||
function writeDouble (buf, value, offset, littleEndian, noAssert) {
|
||
value = +value
|
||
offset = offset >>> 0
|
||
if (!noAssert) {
|
||
checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
|
||
}
|
||
ieee754.write(buf, value, offset, littleEndian, 52, 8)
|
||
return offset + 8
|
||
}
|
||
|
||
Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
|
||
return writeDouble(this, value, offset, true, noAssert)
|
||
}
|
||
|
||
Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
|
||
return writeDouble(this, value, offset, false, noAssert)
|
||
}
|
||
|
||
// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
|
||
Buffer.prototype.copy = function copy (target, targetStart, start, end) {
|
||
if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')
|
||
if (!start) start = 0
|
||
if (!end && end !== 0) end = this.length
|
||
if (targetStart >= target.length) targetStart = target.length
|
||
if (!targetStart) targetStart = 0
|
||
if (end > 0 && end < start) end = start
|
||
|
||
// Copy 0 bytes; we're done
|
||
if (end === start) return 0
|
||
if (target.length === 0 || this.length === 0) return 0
|
||
|
||
// Fatal error conditions
|
||
if (targetStart < 0) {
|
||
throw new RangeError('targetStart out of bounds')
|
||
}
|
||
if (start < 0 || start >= this.length) throw new RangeError('Index out of range')
|
||
if (end < 0) throw new RangeError('sourceEnd out of bounds')
|
||
|
||
// Are we oob?
|
||
if (end > this.length) end = this.length
|
||
if (target.length - targetStart < end - start) {
|
||
end = target.length - targetStart + start
|
||
}
|
||
|
||
var len = end - start
|
||
|
||
if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {
|
||
// Use built-in when available, missing from IE11
|
||
this.copyWithin(targetStart, start, end)
|
||
} else if (this === target && start < targetStart && targetStart < end) {
|
||
// descending copy from end
|
||
for (var i = len - 1; i >= 0; --i) {
|
||
target[i + targetStart] = this[i + start]
|
||
}
|
||
} else {
|
||
Uint8Array.prototype.set.call(
|
||
target,
|
||
this.subarray(start, end),
|
||
targetStart
|
||
)
|
||
}
|
||
|
||
return len
|
||
}
|
||
|
||
// Usage:
|
||
// buffer.fill(number[, offset[, end]])
|
||
// buffer.fill(buffer[, offset[, end]])
|
||
// buffer.fill(string[, offset[, end]][, encoding])
|
||
Buffer.prototype.fill = function fill (val, start, end, encoding) {
|
||
// Handle string cases:
|
||
if (typeof val === 'string') {
|
||
if (typeof start === 'string') {
|
||
encoding = start
|
||
start = 0
|
||
end = this.length
|
||
} else if (typeof end === 'string') {
|
||
encoding = end
|
||
end = this.length
|
||
}
|
||
if (encoding !== undefined && typeof encoding !== 'string') {
|
||
throw new TypeError('encoding must be a string')
|
||
}
|
||
if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
|
||
throw new TypeError('Unknown encoding: ' + encoding)
|
||
}
|
||
if (val.length === 1) {
|
||
var code = val.charCodeAt(0)
|
||
if ((encoding === 'utf8' && code < 128) ||
|
||
encoding === 'latin1') {
|
||
// Fast path: If `val` fits into a single byte, use that numeric value.
|
||
val = code
|
||
}
|
||
}
|
||
} else if (typeof val === 'number') {
|
||
val = val & 255
|
||
}
|
||
|
||
// Invalid ranges are not set to a default, so can range check early.
|
||
if (start < 0 || this.length < start || this.length < end) {
|
||
throw new RangeError('Out of range index')
|
||
}
|
||
|
||
if (end <= start) {
|
||
return this
|
||
}
|
||
|
||
start = start >>> 0
|
||
end = end === undefined ? this.length : end >>> 0
|
||
|
||
if (!val) val = 0
|
||
|
||
var i
|
||
if (typeof val === 'number') {
|
||
for (i = start; i < end; ++i) {
|
||
this[i] = val
|
||
}
|
||
} else {
|
||
var bytes = Buffer.isBuffer(val)
|
||
? val
|
||
: Buffer.from(val, encoding)
|
||
var len = bytes.length
|
||
if (len === 0) {
|
||
throw new TypeError('The value "' + val +
|
||
'" is invalid for argument "value"')
|
||
}
|
||
for (i = 0; i < end - start; ++i) {
|
||
this[i + start] = bytes[i % len]
|
||
}
|
||
}
|
||
|
||
return this
|
||
}
|
||
|
||
// HELPER FUNCTIONS
|
||
// ================
|
||
|
||
var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g
|
||
|
||
function base64clean (str) {
|
||
// Node takes equal signs as end of the Base64 encoding
|
||
str = str.split('=')[0]
|
||
// Node strips out invalid characters like \n and \t from the string, base64-js does not
|
||
str = str.trim().replace(INVALID_BASE64_RE, '')
|
||
// Node converts strings with length < 2 to ''
|
||
if (str.length < 2) return ''
|
||
// Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
|
||
while (str.length % 4 !== 0) {
|
||
str = str + '='
|
||
}
|
||
return str
|
||
}
|
||
|
||
function toHex (n) {
|
||
if (n < 16) return '0' + n.toString(16)
|
||
return n.toString(16)
|
||
}
|
||
|
||
function utf8ToBytes (string, units) {
|
||
units = units || Infinity
|
||
var codePoint
|
||
var length = string.length
|
||
var leadSurrogate = null
|
||
var bytes = []
|
||
|
||
for (var i = 0; i < length; ++i) {
|
||
codePoint = string.charCodeAt(i)
|
||
|
||
// is surrogate component
|
||
if (codePoint > 0xD7FF && codePoint < 0xE000) {
|
||
// last char was a lead
|
||
if (!leadSurrogate) {
|
||
// no lead yet
|
||
if (codePoint > 0xDBFF) {
|
||
// unexpected trail
|
||
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
|
||
continue
|
||
} else if (i + 1 === length) {
|
||
// unpaired lead
|
||
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
|
||
continue
|
||
}
|
||
|
||
// valid lead
|
||
leadSurrogate = codePoint
|
||
|
||
continue
|
||
}
|
||
|
||
// 2 leads in a row
|
||
if (codePoint < 0xDC00) {
|
||
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
|
||
leadSurrogate = codePoint
|
||
continue
|
||
}
|
||
|
||
// valid surrogate pair
|
||
codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000
|
||
} else if (leadSurrogate) {
|
||
// valid bmp char, but last char was a lead
|
||
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
|
||
}
|
||
|
||
leadSurrogate = null
|
||
|
||
// encode utf8
|
||
if (codePoint < 0x80) {
|
||
if ((units -= 1) < 0) break
|
||
bytes.push(codePoint)
|
||
} else if (codePoint < 0x800) {
|
||
if ((units -= 2) < 0) break
|
||
bytes.push(
|
||
codePoint >> 0x6 | 0xC0,
|
||
codePoint & 0x3F | 0x80
|
||
)
|
||
} else if (codePoint < 0x10000) {
|
||
if ((units -= 3) < 0) break
|
||
bytes.push(
|
||
codePoint >> 0xC | 0xE0,
|
||
codePoint >> 0x6 & 0x3F | 0x80,
|
||
codePoint & 0x3F | 0x80
|
||
)
|
||
} else if (codePoint < 0x110000) {
|
||
if ((units -= 4) < 0) break
|
||
bytes.push(
|
||
codePoint >> 0x12 | 0xF0,
|
||
codePoint >> 0xC & 0x3F | 0x80,
|
||
codePoint >> 0x6 & 0x3F | 0x80,
|
||
codePoint & 0x3F | 0x80
|
||
)
|
||
} else {
|
||
throw new Error('Invalid code point')
|
||
}
|
||
}
|
||
|
||
return bytes
|
||
}
|
||
|
||
function asciiToBytes (str) {
|
||
var byteArray = []
|
||
for (var i = 0; i < str.length; ++i) {
|
||
// Node's code seems to be doing this and not & 0x7F..
|
||
byteArray.push(str.charCodeAt(i) & 0xFF)
|
||
}
|
||
return byteArray
|
||
}
|
||
|
||
function utf16leToBytes (str, units) {
|
||
var c, hi, lo
|
||
var byteArray = []
|
||
for (var i = 0; i < str.length; ++i) {
|
||
if ((units -= 2) < 0) break
|
||
|
||
c = str.charCodeAt(i)
|
||
hi = c >> 8
|
||
lo = c % 256
|
||
byteArray.push(lo)
|
||
byteArray.push(hi)
|
||
}
|
||
|
||
return byteArray
|
||
}
|
||
|
||
function base64ToBytes (str) {
|
||
return base64.toByteArray(base64clean(str))
|
||
}
|
||
|
||
function blitBuffer (src, dst, offset, length) {
|
||
for (var i = 0; i < length; ++i) {
|
||
if ((i + offset >= dst.length) || (i >= src.length)) break
|
||
dst[i + offset] = src[i]
|
||
}
|
||
return i
|
||
}
|
||
|
||
// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass
|
||
// the `instanceof` check but they should be treated as of that type.
|
||
// See: https://github.com/feross/buffer/issues/166
|
||
function isInstance (obj, type) {
|
||
return obj instanceof type ||
|
||
(obj != null && obj.constructor != null && obj.constructor.name != null &&
|
||
obj.constructor.name === type.name)
|
||
}
|
||
function numberIsNaN (obj) {
|
||
// For IE11 support
|
||
return obj !== obj // eslint-disable-line no-self-compare
|
||
}
|
||
|
||
}).call(this)}).call(this,require("buffer").Buffer)
|
||
},{"base64-js":8,"buffer":9,"ieee754":10}],10:[function(require,module,exports){
|
||
/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */
|
||
exports.read = function (buffer, offset, isLE, mLen, nBytes) {
|
||
var e, m
|
||
var eLen = (nBytes * 8) - mLen - 1
|
||
var eMax = (1 << eLen) - 1
|
||
var eBias = eMax >> 1
|
||
var nBits = -7
|
||
var i = isLE ? (nBytes - 1) : 0
|
||
var d = isLE ? -1 : 1
|
||
var s = buffer[offset + i]
|
||
|
||
i += d
|
||
|
||
e = s & ((1 << (-nBits)) - 1)
|
||
s >>= (-nBits)
|
||
nBits += eLen
|
||
for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}
|
||
|
||
m = e & ((1 << (-nBits)) - 1)
|
||
e >>= (-nBits)
|
||
nBits += mLen
|
||
for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}
|
||
|
||
if (e === 0) {
|
||
e = 1 - eBias
|
||
} else if (e === eMax) {
|
||
return m ? NaN : ((s ? -1 : 1) * Infinity)
|
||
} else {
|
||
m = m + Math.pow(2, mLen)
|
||
e = e - eBias
|
||
}
|
||
return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
|
||
}
|
||
|
||
exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
|
||
var e, m, c
|
||
var eLen = (nBytes * 8) - mLen - 1
|
||
var eMax = (1 << eLen) - 1
|
||
var eBias = eMax >> 1
|
||
var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
|
||
var i = isLE ? 0 : (nBytes - 1)
|
||
var d = isLE ? 1 : -1
|
||
var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0
|
||
|
||
value = Math.abs(value)
|
||
|
||
if (isNaN(value) || value === Infinity) {
|
||
m = isNaN(value) ? 1 : 0
|
||
e = eMax
|
||
} else {
|
||
e = Math.floor(Math.log(value) / Math.LN2)
|
||
if (value * (c = Math.pow(2, -e)) < 1) {
|
||
e--
|
||
c *= 2
|
||
}
|
||
if (e + eBias >= 1) {
|
||
value += rt / c
|
||
} else {
|
||
value += rt * Math.pow(2, 1 - eBias)
|
||
}
|
||
if (value * c >= 2) {
|
||
e++
|
||
c /= 2
|
||
}
|
||
|
||
if (e + eBias >= eMax) {
|
||
m = 0
|
||
e = eMax
|
||
} else if (e + eBias >= 1) {
|
||
m = ((value * c) - 1) * Math.pow(2, mLen)
|
||
e = e + eBias
|
||
} else {
|
||
m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
|
||
e = 0
|
||
}
|
||
}
|
||
|
||
for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
|
||
|
||
e = (e << mLen) | m
|
||
eLen += mLen
|
||
for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
|
||
|
||
buffer[offset + i - d] |= s * 128
|
||
}
|
||
|
||
},{}]},{},[1])(1)
|
||
});
|