From 9d3472dff0fb0add24651ec1f720745d6c78a09c Mon Sep 17 00:00:00 2001 From: M_Viper Date: Thu, 22 Oct 2026 09:14:06 +0000 Subject: [PATCH] Delete 100 files via Git Manager GUI --- node_modules/@xmldom/xmldom/index.d.ts | 96 - node_modules/@xmldom/xmldom/lib/.eslintrc.yml | 2 - .../@xmldom/xmldom/lib/conventions.js | 214 -- node_modules/@xmldom/xmldom/lib/dom-parser.js | 322 --- node_modules/@xmldom/xmldom/lib/dom.js | 2266 ----------------- node_modules/@xmldom/xmldom/lib/entities.js | 2166 ---------------- node_modules/@xmldom/xmldom/lib/index.js | 4 - node_modules/@xmldom/xmldom/lib/sax.js | 683 ----- node_modules/@xmldom/xmldom/package.json | 75 - node_modules/@xmldom/xmldom/readme.md | 356 --- node_modules/abbrev/LICENSE | 46 - node_modules/abbrev/README.md | 23 - node_modules/abbrev/lib/index.js | 53 - node_modules/abbrev/package.json | 41 - node_modules/agent-base/LICENSE | 22 - node_modules/agent-base/README.md | 69 - node_modules/agent-base/dist/helpers.d.ts | 15 - node_modules/agent-base/dist/helpers.d.ts.map | 1 - node_modules/agent-base/dist/helpers.js | 66 - node_modules/agent-base/dist/helpers.js.map | 1 - node_modules/agent-base/dist/index.d.ts | 41 - node_modules/agent-base/dist/index.d.ts.map | 1 - node_modules/agent-base/dist/index.js | 178 -- node_modules/agent-base/dist/index.js.map | 1 - node_modules/agent-base/package.json | 46 - node_modules/ajv/.runkit_example.js | 23 - node_modules/ajv/dist/2019.d.ts | 19 - node_modules/ajv/dist/2019.js | 61 - node_modules/ajv/dist/2019.js.map | 1 - node_modules/ajv/dist/2020.d.ts | 19 - node_modules/ajv/dist/2020.js | 55 - node_modules/ajv/dist/2020.js.map | 1 - node_modules/ajv/dist/ajv.d.ts | 18 - node_modules/ajv/dist/ajv.js | 50 - node_modules/ajv/dist/ajv.js.map | 1 - .../ajv/dist/compile/codegen/code.d.ts | 40 - node_modules/ajv/dist/compile/codegen/code.js | 156 -- .../ajv/dist/compile/codegen/code.js.map | 1 - .../ajv/dist/compile/codegen/index.d.ts | 79 - .../ajv/dist/compile/codegen/index.js | 697 ----- .../ajv/dist/compile/codegen/index.js.map | 1 - .../ajv/dist/compile/codegen/scope.d.ts | 79 - .../ajv/dist/compile/codegen/scope.js | 143 -- .../ajv/dist/compile/codegen/scope.js.map | 1 - node_modules/ajv/dist/compile/errors.d.ts | 13 - node_modules/ajv/dist/compile/errors.js | 123 - node_modules/ajv/dist/compile/errors.js.map | 1 - node_modules/ajv/dist/compile/index.d.ts | 80 - node_modules/ajv/dist/compile/index.js | 242 -- node_modules/ajv/dist/compile/index.js.map | 1 - node_modules/ajv/dist/compile/jtd/parse.d.ts | 4 - node_modules/ajv/dist/compile/jtd/parse.js | 350 --- .../ajv/dist/compile/jtd/parse.js.map | 1 - .../ajv/dist/compile/jtd/serialize.d.ts | 4 - .../ajv/dist/compile/jtd/serialize.js | 236 -- .../ajv/dist/compile/jtd/serialize.js.map | 1 - node_modules/ajv/dist/compile/jtd/types.d.ts | 6 - node_modules/ajv/dist/compile/jtd/types.js | 14 - .../ajv/dist/compile/jtd/types.js.map | 1 - node_modules/ajv/dist/compile/names.d.ts | 20 - node_modules/ajv/dist/compile/names.js | 28 - node_modules/ajv/dist/compile/names.js.map | 1 - node_modules/ajv/dist/compile/ref_error.d.ts | 6 - node_modules/ajv/dist/compile/ref_error.js | 12 - .../ajv/dist/compile/ref_error.js.map | 1 - node_modules/ajv/dist/compile/resolve.d.ts | 12 - node_modules/ajv/dist/compile/resolve.js | 155 -- node_modules/ajv/dist/compile/resolve.js.map | 1 - node_modules/ajv/dist/compile/rules.d.ts | 28 - node_modules/ajv/dist/compile/rules.js | 26 - node_modules/ajv/dist/compile/rules.js.map | 1 - node_modules/ajv/dist/compile/util.d.ts | 40 - node_modules/ajv/dist/compile/util.js | 178 -- node_modules/ajv/dist/compile/util.js.map | 1 - .../dist/compile/validate/applicability.d.ts | 6 - .../dist/compile/validate/applicability.js | 19 - .../compile/validate/applicability.js.map | 1 - .../ajv/dist/compile/validate/boolSchema.d.ts | 4 - .../ajv/dist/compile/validate/boolSchema.js | 50 - .../dist/compile/validate/boolSchema.js.map | 1 - .../ajv/dist/compile/validate/dataType.d.ts | 17 - .../ajv/dist/compile/validate/dataType.js | 203 -- .../ajv/dist/compile/validate/dataType.js.map | 1 - .../ajv/dist/compile/validate/defaults.d.ts | 2 - .../ajv/dist/compile/validate/defaults.js | 35 - .../ajv/dist/compile/validate/defaults.js.map | 1 - .../ajv/dist/compile/validate/index.d.ts | 42 - .../ajv/dist/compile/validate/index.js | 520 ---- .../ajv/dist/compile/validate/index.js.map | 1 - .../ajv/dist/compile/validate/keyword.d.ts | 8 - .../ajv/dist/compile/validate/keyword.js | 124 - .../ajv/dist/compile/validate/keyword.js.map | 1 - .../ajv/dist/compile/validate/subschema.d.ts | 47 - .../ajv/dist/compile/validate/subschema.js | 81 - .../dist/compile/validate/subschema.js.map | 1 - node_modules/ajv/dist/core.d.ts | 174 -- node_modules/ajv/dist/core.js | 618 ----- node_modules/ajv/dist/core.js.map | 1 - node_modules/ajv/dist/jtd.d.ts | 47 - node_modules/ajv/dist/jtd.js | 72 - 100 files changed, 11897 deletions(-) delete mode 100644 node_modules/@xmldom/xmldom/index.d.ts delete mode 100644 node_modules/@xmldom/xmldom/lib/.eslintrc.yml delete mode 100644 node_modules/@xmldom/xmldom/lib/conventions.js delete mode 100644 node_modules/@xmldom/xmldom/lib/dom-parser.js delete mode 100644 node_modules/@xmldom/xmldom/lib/dom.js delete mode 100644 node_modules/@xmldom/xmldom/lib/entities.js delete mode 100644 node_modules/@xmldom/xmldom/lib/index.js delete mode 100644 node_modules/@xmldom/xmldom/lib/sax.js delete mode 100644 node_modules/@xmldom/xmldom/package.json delete mode 100644 node_modules/@xmldom/xmldom/readme.md delete mode 100644 node_modules/abbrev/LICENSE delete mode 100644 node_modules/abbrev/README.md delete mode 100644 node_modules/abbrev/lib/index.js delete mode 100644 node_modules/abbrev/package.json delete mode 100644 node_modules/agent-base/LICENSE delete mode 100644 node_modules/agent-base/README.md delete mode 100644 node_modules/agent-base/dist/helpers.d.ts delete mode 100644 node_modules/agent-base/dist/helpers.d.ts.map delete mode 100644 node_modules/agent-base/dist/helpers.js delete mode 100644 node_modules/agent-base/dist/helpers.js.map delete mode 100644 node_modules/agent-base/dist/index.d.ts delete mode 100644 node_modules/agent-base/dist/index.d.ts.map delete mode 100644 node_modules/agent-base/dist/index.js delete mode 100644 node_modules/agent-base/dist/index.js.map delete mode 100644 node_modules/agent-base/package.json delete mode 100644 node_modules/ajv/.runkit_example.js delete mode 100644 node_modules/ajv/dist/2019.d.ts delete mode 100644 node_modules/ajv/dist/2019.js delete mode 100644 node_modules/ajv/dist/2019.js.map delete mode 100644 node_modules/ajv/dist/2020.d.ts delete mode 100644 node_modules/ajv/dist/2020.js delete mode 100644 node_modules/ajv/dist/2020.js.map delete mode 100644 node_modules/ajv/dist/ajv.d.ts delete mode 100644 node_modules/ajv/dist/ajv.js delete mode 100644 node_modules/ajv/dist/ajv.js.map delete mode 100644 node_modules/ajv/dist/compile/codegen/code.d.ts delete mode 100644 node_modules/ajv/dist/compile/codegen/code.js delete mode 100644 node_modules/ajv/dist/compile/codegen/code.js.map delete mode 100644 node_modules/ajv/dist/compile/codegen/index.d.ts delete mode 100644 node_modules/ajv/dist/compile/codegen/index.js delete mode 100644 node_modules/ajv/dist/compile/codegen/index.js.map delete mode 100644 node_modules/ajv/dist/compile/codegen/scope.d.ts delete mode 100644 node_modules/ajv/dist/compile/codegen/scope.js delete mode 100644 node_modules/ajv/dist/compile/codegen/scope.js.map delete mode 100644 node_modules/ajv/dist/compile/errors.d.ts delete mode 100644 node_modules/ajv/dist/compile/errors.js delete mode 100644 node_modules/ajv/dist/compile/errors.js.map delete mode 100644 node_modules/ajv/dist/compile/index.d.ts delete mode 100644 node_modules/ajv/dist/compile/index.js delete mode 100644 node_modules/ajv/dist/compile/index.js.map delete mode 100644 node_modules/ajv/dist/compile/jtd/parse.d.ts delete mode 100644 node_modules/ajv/dist/compile/jtd/parse.js delete mode 100644 node_modules/ajv/dist/compile/jtd/parse.js.map delete mode 100644 node_modules/ajv/dist/compile/jtd/serialize.d.ts delete mode 100644 node_modules/ajv/dist/compile/jtd/serialize.js delete mode 100644 node_modules/ajv/dist/compile/jtd/serialize.js.map delete mode 100644 node_modules/ajv/dist/compile/jtd/types.d.ts delete mode 100644 node_modules/ajv/dist/compile/jtd/types.js delete mode 100644 node_modules/ajv/dist/compile/jtd/types.js.map delete mode 100644 node_modules/ajv/dist/compile/names.d.ts delete mode 100644 node_modules/ajv/dist/compile/names.js delete mode 100644 node_modules/ajv/dist/compile/names.js.map delete mode 100644 node_modules/ajv/dist/compile/ref_error.d.ts delete mode 100644 node_modules/ajv/dist/compile/ref_error.js delete mode 100644 node_modules/ajv/dist/compile/ref_error.js.map delete mode 100644 node_modules/ajv/dist/compile/resolve.d.ts delete mode 100644 node_modules/ajv/dist/compile/resolve.js delete mode 100644 node_modules/ajv/dist/compile/resolve.js.map delete mode 100644 node_modules/ajv/dist/compile/rules.d.ts delete mode 100644 node_modules/ajv/dist/compile/rules.js delete mode 100644 node_modules/ajv/dist/compile/rules.js.map delete mode 100644 node_modules/ajv/dist/compile/util.d.ts delete mode 100644 node_modules/ajv/dist/compile/util.js delete mode 100644 node_modules/ajv/dist/compile/util.js.map delete mode 100644 node_modules/ajv/dist/compile/validate/applicability.d.ts delete mode 100644 node_modules/ajv/dist/compile/validate/applicability.js delete mode 100644 node_modules/ajv/dist/compile/validate/applicability.js.map delete mode 100644 node_modules/ajv/dist/compile/validate/boolSchema.d.ts delete mode 100644 node_modules/ajv/dist/compile/validate/boolSchema.js delete mode 100644 node_modules/ajv/dist/compile/validate/boolSchema.js.map delete mode 100644 node_modules/ajv/dist/compile/validate/dataType.d.ts delete mode 100644 node_modules/ajv/dist/compile/validate/dataType.js delete mode 100644 node_modules/ajv/dist/compile/validate/dataType.js.map delete mode 100644 node_modules/ajv/dist/compile/validate/defaults.d.ts delete mode 100644 node_modules/ajv/dist/compile/validate/defaults.js delete mode 100644 node_modules/ajv/dist/compile/validate/defaults.js.map delete mode 100644 node_modules/ajv/dist/compile/validate/index.d.ts delete mode 100644 node_modules/ajv/dist/compile/validate/index.js delete mode 100644 node_modules/ajv/dist/compile/validate/index.js.map delete mode 100644 node_modules/ajv/dist/compile/validate/keyword.d.ts delete mode 100644 node_modules/ajv/dist/compile/validate/keyword.js delete mode 100644 node_modules/ajv/dist/compile/validate/keyword.js.map delete mode 100644 node_modules/ajv/dist/compile/validate/subschema.d.ts delete mode 100644 node_modules/ajv/dist/compile/validate/subschema.js delete mode 100644 node_modules/ajv/dist/compile/validate/subschema.js.map delete mode 100644 node_modules/ajv/dist/core.d.ts delete mode 100644 node_modules/ajv/dist/core.js delete mode 100644 node_modules/ajv/dist/core.js.map delete mode 100644 node_modules/ajv/dist/jtd.d.ts delete mode 100644 node_modules/ajv/dist/jtd.js diff --git a/node_modules/@xmldom/xmldom/index.d.ts b/node_modules/@xmldom/xmldom/index.d.ts deleted file mode 100644 index a0400fe..0000000 --- a/node_modules/@xmldom/xmldom/index.d.ts +++ /dev/null @@ -1,96 +0,0 @@ -/// - -declare module "@xmldom/xmldom" { - var DOMParser: DOMParserStatic; - var XMLSerializer: XMLSerializerStatic; - var DOMImplementation: DOMImplementationStatic; - - interface DOMImplementationStatic { - new(): DOMImplementation; - } - - interface DOMParserStatic { - new (): DOMParser; - new (options: Options): DOMParser; - } - - interface XMLSerializerStatic { - new (): XMLSerializer; - } - - interface DOMParser { - parseFromString(xmlsource: string, mimeType?: string): Document; - } - - /** Options accepted by `XMLSerializer.prototype.serializeToString`. */ - interface XMLSerializerOptions { - /** - * When `true`, the serializer throws a DOMException with code `INVALID_STATE_ERR` if: - * - A CDATASection node's data contains `"]]>"`. - * - A Comment node's data contains `"-->"` (the injection sequence that terminates a - * comment). Comments whose data contains `"--"` but not `"-->"` are accepted on this - * branch — the 0.8.x parser does not validate bare `"--"` in comment content. - * - A ProcessingInstruction's target is not a valid XML `NCName` (a `Name` with no colon) - * or is an ASCII case-insensitive match for `"xml"`, or its data contains `"?>"` - * (W3C DOM Parsing §3.2.1.7). - * - An EntityReference's `nodeName` is not a valid XML `Name`. - * - * @default false - */ - requireWellFormed?: boolean; - } - - interface XMLSerializer { - /** - * Returns the result of serializing `node` to XML. - * - * When `options.requireWellFormed` is `true`, the serializer throws for content that would - * produce ill-formed XML. - * - * __This implementation differs from the specification:__ - * - CDATASection nodes whose data contains `]]>` are serialized by splitting the section - * at each `]]>` occurrence (following W3C DOM Level 3 Core `split-cdata-sections` - * default behaviour) unless `requireWellFormed` is `true`. - * - when `requireWellFormed` is `true`, `DOMException` with code `INVALID_STATE_ERR` - * is only thrown to prevent injection vectors, not for all the spec mandated checks. - * - * @throws {DOMException} - * With code `INVALID_STATE_ERR` when `requireWellFormed` is `true` and: - * - an Element's qualified name (including any namespace prefix) is not a valid XML QName, - * - an attribute's qualified name (including a synthesized `xmlns:` namespace declaration) - * is not a valid XML QName, - * - a CDATASection node's data contains `"]]>"`, - * - a Comment node's data contains `"-->"` (bare `"--"` does not throw on this branch), - * - a ProcessingInstruction's target is not a valid XML `NCName` (a `Name` with no colon) or - * is an ASCII case-insensitive match for `"xml"`, or its data contains `"?>"`, - * - a DocumentType's `name` is not a valid XML `Name` (XML 1.0 production [5]), - * - a DocumentType's `publicId` is non-empty and does not match the XML `PubidLiteral` - * production, - * - a DocumentType's `systemId` is non-empty and does not match the XML `SystemLiteral` - * production, - * - a DocumentType's `internalSubset` contains `"]>"`, or - * - an EntityReference's `nodeName` is not a valid XML `Name` (XML 1.0 production [5]). - * Note: xmldom does not enforce `readonly` on DocumentType fields — direct property - * writes succeed and are covered by the serializer-level checks above. - * @see https://html.spec.whatwg.org/#dom-xmlserializer-serializetostring - * @see https://w3c.github.io/DOM-Parsing/#xml-serialization - * @see https://github.com/w3c/DOM-Parsing/issues/84 - */ - serializeToString(node: Node, isHtml?: boolean, nodeFilter?: (node: Node) => Node | null | undefined, options?: XMLSerializerOptions): string; - } - - interface Options { - locator?: any; - errorHandler?: ErrorHandlerFunction | ErrorHandlerObject | undefined; - } - - interface ErrorHandlerFunction { - (level: string, msg: any): any; - } - - interface ErrorHandlerObject { - warning?: ((msg: any) => any) | undefined; - error?: ((msg: any) => any) | undefined; - fatalError?: ((msg: any) => any) | undefined; - } -} diff --git a/node_modules/@xmldom/xmldom/lib/.eslintrc.yml b/node_modules/@xmldom/xmldom/lib/.eslintrc.yml deleted file mode 100644 index 3eb98ab..0000000 --- a/node_modules/@xmldom/xmldom/lib/.eslintrc.yml +++ /dev/null @@ -1,2 +0,0 @@ -extends: - - 'plugin:es5/no-es2015' diff --git a/node_modules/@xmldom/xmldom/lib/conventions.js b/node_modules/@xmldom/xmldom/lib/conventions.js deleted file mode 100644 index 2ccd477..0000000 --- a/node_modules/@xmldom/xmldom/lib/conventions.js +++ /dev/null @@ -1,214 +0,0 @@ -'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 | ({length:number, [number]: T})} list - * @param {function (item: T, index: number, list:Array | ({length:number, [number]: T})):boolean} predicate - * @param {Partial>?} 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 = Object} oc `Object` by default, - * allows to inject custom object constructor for tests - * @returns {Readonly} - * - * @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/', -}) - -//[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\-\.]*)?$/ - -exports.assign = assign; -exports.find = find; -exports.freeze = freeze; -exports.MIME_TYPE = MIME_TYPE; -exports.NAMESPACE = NAMESPACE; -exports.nameStartChar = nameStartChar; -exports.nameChar = nameChar; -exports.tagNamePattern = tagNamePattern; diff --git a/node_modules/@xmldom/xmldom/lib/dom-parser.js b/node_modules/@xmldom/xmldom/lib/dom-parser.js deleted file mode 100644 index 94769a2..0000000 --- a/node_modules/@xmldom/xmldom/lib/dom-parser.js +++ /dev/null @@ -1,322 +0,0 @@ -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} [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; diff --git a/node_modules/@xmldom/xmldom/lib/dom.js b/node_modules/@xmldom/xmldom/lib/dom.js deleted file mode 100644 index cfe1c2e..0000000 --- a/node_modules/@xmldom/xmldom/lib/dom.js +++ /dev/null @@ -1,2266 +0,0 @@ -var conventions = require("./conventions"); - -var find = conventions.find; -var NAMESPACE = conventions.NAMESPACE; -var tagNamePattern = conventions.tagNamePattern; - -/** - * 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} current - * @param {string} element - * @returns {Record} - */ -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 index >= 0 && index < this.length ? this[index] : null; - }, - toString:function(isHTML,nodeFilter,options){ - var requireWellFormed = !!options && !!options.requireWellFormed; - for(var buf = [], i = 0;i Attr membership index; lets the parse-time de-duplication in - // setNamedItem resolve an existing attribute in O(1) instead of scanning the - // list, so building an element with M attributes costs O(M) rather than O(M^2). - // The numbered entries and length remain the sole authority for attribute order. - // Object.create(null) so an attribute named __proto__ or constructor is an - // ordinary key. - this._nameIndex = Object.create(null); -}; - -function _findNodeIndex(list,node){ - var i = list.length; - while(i--){ - if(list[i] === node){return i} - } -} - -function _nnmIndexAdd(list, attr) { - list._nameIndex[attr.nodeName] = attr; -} -function _nnmIndexRemove(list, attr) { - // Only drop the entry if it still points at this attribute; a replacement with - // a different nodeName may already have re-keyed it. - if (list._nameIndex[attr.nodeName] === attr) { - delete list._nameIndex[attr.nodeName]; - } -} - -function _addNamedNode(el,list,newAttr,oldAttr){ - if(oldAttr){ - list[_findNodeIndex(list,oldAttr)] = newAttr; - // oldAttr leaves the list; drop its index entry (its nodeName may differ - // from newAttr's when the replacement came via setNamedItemNS). - _nnmIndexRemove(list, oldAttr); - }else{ - list[list.length++] = newAttr; - } - _nnmIndexAdd(list, 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(i0 || 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); - } - // Resolve any existing attribute with the same nodeName through the O(1) - // membership index rather than an O(M) scan — this is the parse-dedup hot - // path (setAttributeNode per attribute during parse). Absent -> undefined, - // matching getNamedItem's contract. - var oldAttr = this._nameIndex[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 implementation differs from the specification:__ - * - this implementation is not validating names or qualified names - * (when parsing XML strings, the SAX parser takes care of that) - * - * Note: `internalSubset` can only be introduced via a direct property write to `node.internalSubset` after creation. - * Creation-time validation of `publicId`, `systemId` is not enforced. - * The serializer-level check covers all mutation vectors, including direct property writes. - * `internalSubset` is only serialized as `[ ... ]` when both `publicId` and `systemId` are - * absent (empty or `'.'`) — if either external identifier is present, `internalSubset` is - * silently omitted from the serialized output. - * - * @param {string} qualifiedName - * @param {string} [publicId] - * The external subset public identifier. Stored verbatim including surrounding quotes. - * When serialized with `requireWellFormed: true` (via the 4th-parameter options object), - * throws `DOMException` with code `INVALID_STATE_ERR` if the value is non-empty and does - * not match the XML `PubidLiteral` production (W3C DOM Parsing §3.2.1.3; XML 1.0 [12]). - * @param {string} [systemId] - * The external subset system identifier. Stored verbatim including surrounding quotes. - * When serialized with `requireWellFormed: true`, throws `DOMException` with code - * `INVALID_STATE_ERR` if the value is non-empty and does not match the XML `SystemLiteral` - * production (W3C DOM Parsing §3.2.1.3; XML 1.0 [11]). - * @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: - /** - * Puts the specified node and all of its subtree into a "normalized" form. In a normalized - * subtree, no text nodes in the subtree are empty and there are no adjacent text nodes. - * - * Specifically, this method merges any adjacent text nodes (i.e., nodes for which `nodeType` - * is `TEXT_NODE`) into a single node with the combined data. It also removes any empty text - * nodes. - * - * This method iteratively traverses all child nodes to normalize all descendant nodes within - * the subtree. - * - * @throws {DOMException} - * May throw a DOMException if operations within removeChild or appendData (which are - * potentially invoked in this method) do not meet their specific constraints. - * @see {@link Node.removeChild} - * @see {@link CharacterData.appendData} - * @see ../docs/walk-dom.md. - */ - normalize: function () { - walkDOM(this, null, { - enter: function (node) { - // Merge adjacent text children of node before walkDOM schedules them. - // walkDOM reads lastChild/previousSibling after enter returns, so the - // surviving post-merge children are what it descends into. - var child = node.firstChild; - while (child) { - var next = child.nextSibling; - if (next !== null && next.nodeType === TEXT_NODE && child.nodeType === TEXT_NODE) { - // Merge the whole run of adjacent text nodes at once: gather the - // following text siblings' data, unlink them in a single pass, and - // re-index the child list a single time. Per-sibling `removeChild` - // (each an O(K) re-index) plus per-sibling `appendData` (each an O(K) - // string rebuild) is O(K^2) over a long run of single-character text - // nodes; this keeps it O(K). The first text node of the run survives - // and carries the concatenated data, preserving node identity and - // locator semantics. - var tail = []; - var sibling = next; - while (sibling !== null && sibling.nodeType === TEXT_NODE) { - tail.push(sibling.data); - sibling = sibling.nextSibling; - } - // `sibling` is now the first non-text node after the run, or null. - var removed = child.nextSibling; - while (removed !== sibling) { - var following = removed.nextSibling; - removed.parentNode = null; - removed.previousSibling = null; - removed.nextSibling = null; - removed = following; - } - child.nextSibling = sibling; - if (sibling !== null) { - sibling.previousSibling = child; - } else { - node.lastChild = child; - } - child.appendData(tail.join('')); // single O(K) string rebuild - _onUpdateChild(node.ownerDocument, node); // single O(K) re-index - child = sibling; - } else { - child = next; - } - } - return true; // descend into surviving children - }, - }); - }, - // 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 {Node} node - * Root of the subtree to visit. - * @param {function(Node): boolean} callback - * Called for each node in depth-first pre-order. Return a truthy value to stop traversal early. - * @return {boolean} `true` if traversal was aborted by the callback, `false` otherwise. - */ -function _visitNode(node, callback) { - return walkDOM(node, null, { enter: function (n) { return callback(n) ? walkDOM.STOP : true; } }) === walkDOM.STOP; -} - -/** - * Depth-first pre/post-order DOM tree walker. - * - * Visits every node in the subtree rooted at `node`. For each node: - * - * 1. Calls `callbacks.enter(node, context)` before descending into the node's children. The - * return value becomes the `context` passed to each child's `enter` call and to the matching - * `exit` call. - * 2. If `enter` returns `null` or `undefined`, the node's children are skipped; - * sibling traversal continues normally. - * 3. If `enter` returns `walkDOM.STOP`, the entire traversal is aborted immediately — no - * further `enter` or `exit` calls are made. - * 4. `lastChild` and `previousSibling` are read **after** `enter` returns, so `enter` may - * safely modify the node's own child list before the walker descends. Modifying siblings of - * the current node or any other part of the tree produces unpredictable results: nodes already - * queued on the stack are visited regardless of DOM changes, and newly inserted nodes outside - * the current child list are never visited. - * 5. Calls `callbacks.exit(node, context)` (if provided) after all of a node's children have - * been visited, passing the same `context` that `enter` - * returned for that node. - * - * This implementation uses an explicit stack and does not recurse — it is safe on arbitrarily - * deep trees. - * - * @param {Node} node - * Root of the subtree to walk. - * @param {*} context - * Initial context value passed to the root node's `enter`. - * @param {{ enter: function(Node, *): *, exit?: function(Node, *): void }} callbacks - * @returns {void | walkDOM.STOP} - * @see ../docs/walk-dom.md. - */ -function walkDOM(node, context, callbacks) { - // Each stack frame is {node, context, phase}: - // walkDOM.ENTER — call enter, then push children - // walkDOM.EXIT — call exit - var stack = [{ node: node, context: context, phase: walkDOM.ENTER }]; - while (stack.length > 0) { - var frame = stack.pop(); - if (frame.phase === walkDOM.ENTER) { - var childContext = callbacks.enter(frame.node, frame.context); - if (childContext === walkDOM.STOP) { - return walkDOM.STOP; - } - // Push exit frame before children so it fires after all children are processed (Last In First Out) - stack.push({ node: frame.node, context: childContext, phase: walkDOM.EXIT }); - if (childContext === null || childContext === undefined) { - continue; // skip children - } - // lastChild is read after enter returns, so enter may modify the child list. - var child = frame.node.lastChild; - // Traverse from lastChild backwards so that pushing onto the stack - // naturally yields firstChild on top (processed first). - while (child) { - stack.push({ node: child, context: childContext, phase: walkDOM.ENTER }); - child = child.previousSibling; - } - } else { - // frame.phase === walkDOM.EXIT - if (callbacks.exit) { - callbacks.exit(frame.node, frame.context); - } - } - } -} - -/** - * Sentinel value returned from a `walkDOM` `enter` callback to abort the entire traversal - * immediately. - * - * @type {symbol} - */ -walkDOM.STOP = Symbol('walkDOM.STOP'); -/** - * Phase constant for a stack frame that has not yet been visited. - * The `enter` callback is called and children are scheduled. - * - * @type {number} - */ -walkDOM.ENTER = 0; -/** - * Phase constant for a stack frame whose subtree has been fully visited. - * The `exit` callback is called. - * - * @type {number} - */ -walkDOM.EXIT = 1; - -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; - // Update ownerDocument for each node being inserted - var targetDoc = parent.ownerDocument || parent; - _updateOwnerDocument(newFirst, targetDoc); - }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; -} - -/** - * Recursively updates the ownerDocument property for a node and all its descendants - * @param {Node} node - * @param {Document} newOwnerDocument - * @private - */ -function _updateOwnerDocument(node, newOwnerDocument) { - if (node.ownerDocument === newOwnerDocument) { - return; - } - - node.ownerDocument = newOwnerDocument; - - // Update attributes if this is an element - if (node.nodeType === ELEMENT_NODE && node.attributes) { - for (var i = 0; i < node.attributes.length; i++) { - var attr = node.attributes.item(i); - if (attr) { - attr.ownerDocument = newOwnerDocument; - } - } - } - - // Recursively update child nodes - var child = node.firstChild; - while (child) { - _updateOwnerDocument(child, newOwnerDocument); - child = child.nextSibling; - } -} - -/** - * 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); - - // Update ownerDocument for the new child and all its descendants - var targetDoc = parentNode.ownerDocument || parentNode; - _updateOwnerDocument(newChild, targetDoc); - - 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); - _updateOwnerDocument(newChild, 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); - _updateOwnerDocument(newChild, 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; - }, - /** - * Returns a new CDATASection node whose data is `data`. - * - * __This implementation differs from the specification:__ - * - calling this method on an HTML document does not throw `NotSupportedError`. - * - * @param {string} data - * @returns {CDATASection} - * @throws DOMException with code `INVALID_CHARACTER_ERR` if `data` contains `"]]>"`. - * @see https://developer.mozilla.org/en-US/docs/Web/API/Document/createCDATASection - * @see https://dom.spec.whatwg.org/#dom-document-createcdatasection - */ - createCDATASection : function(data){ - if (data.indexOf(']]>') !== -1) { - throw new DOMException(INVALID_CHARACTER_ERR, 'data contains "]]>"'); - } - var node = new CDATASection(); - node.ownerDocument = this; - node.appendData(data) - return node; - }, - /** - * Returns a ProcessingInstruction node whose target is target and data is data. - * - * __This implementation differs from the specification:__ - * - it does not do any input validation on the arguments and doesn't throw "InvalidCharacterError". - * - * Note: When the resulting document is serialized with `requireWellFormed: true`, the - * serializer throws with code `INVALID_STATE_ERR` if `.target` is not a valid XML `NCName` - * (a `Name` with no colon) or is an ASCII case-insensitive match for `"xml"`, or if `.data` - * contains `?>` (W3C DOM Parsing §3.2.1.7). Without that option the target and data are - * emitted verbatim. - * - * @param {string} target - * @param {string} data - * @returns {ProcessingInstruction} - * @see https://developer.mozilla.org/docs/Web/API/Document/createProcessingInstruction - * @see https://dom.spec.whatwg.org/#dom-document-createprocessinginstruction - * @see https://www.w3.org/TR/DOM-Parsing/#dfn-concept-serialize-xml §3.2.1.7 - */ - createProcessingInstruction : function(target,data){ - var node = new ProcessingInstruction(); - node.ownerDocument = this; - node.tagName = node.nodeName = 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; - }, - /** - * Creates an EntityReference object, serialized as `&name;`. - * - * The `name` is validated against the XML `Name` production at creation time; an invalid name - * throws a `DOMException` with code `INVALID_CHARACTER_ERR`. When the resulting node is - * serialized with `requireWellFormed: true`, the serializer re-validates `nodeName` and throws - * a `DOMException` with code `INVALID_STATE_ERR` if a later `nodeName` mutation made it invalid; - * without that option the name is emitted verbatim. - * - * Note: xmldom does not expand entities — the parser resolves entity references inline and never - * constructs `EntityReference` nodes, so this method is the only producer. - * - * @param {string} name The name of the entity to reference. - * @returns {EntityReference} - * @throws {DOMException} With code `INVALID_CHARACTER_ERR` when `name` is not a valid XML `Name`. - * @see https://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-392B75AE - */ - createEntityReference : function(name){ - if (!tagNamePattern.test(name)) { - throw new DOMException(INVALID_CHARACTER_ERR, 'not a valid xml name "' + 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); - - -/** - * Represents a DocumentType node (the `` declaration). - * - * `name`, `publicId`, `systemId`, and `internalSubset` are plain own-property assignments. - * xmldom does not enforce the `readonly` constraint declared by the WHATWG DOM spec — - * direct property writes succeed silently. Values are serialized verbatim when - * `requireWellFormed` is false (the default). When the serializer is invoked with - * `requireWellFormed: true` (via the 4th-parameter options object), it validates each - * field — including `name`, which is checked against the XML `Name` production — and throws - * `DOMException` with code `INVALID_STATE_ERR` on invalid values. - * - * @class - * @see https://developer.mozilla.org/docs/Web/API/DocumentType MDN - */ -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); - -/** - * Represents an EntityReference node, serialized as `&nodeName;`. - * - * `nodeName` is the referenced entity's name, stored verbatim. When serialized with - * `requireWellFormed: true`, the serializer validates `nodeName` against the XML `Name` production - * and throws a `DOMException` with code `INVALID_STATE_ERR` if it does not match; without that - * option the name is emitted verbatim between `&` and `;`. - * - * Note: xmldom does not expand entities — the parser resolves entity references inline and never - * constructs `EntityReference` nodes, so the only producer is `Document.createEntityReference`. - * - * @class - * @see https://www.w3.org/TR/xml/#NT-Name - */ -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(){} -/** - * Returns the result of serializing `node` to XML. - * - * When `options.requireWellFormed` is `true`, the serializer throws for content that would - * produce ill-formed XML. - * - * __This implementation differs from the specification:__ - * - CDATASection nodes whose data contains `]]>` are serialized by splitting the section - * at each `]]>` occurrence (following W3C DOM Level 3 Core `split-cdata-sections` - * default behaviour) unless `requireWellFormed` is `true`. - * - when `requireWellFormed` is `true`, `DOMException` with code `INVALID_STATE_ERR` - * is only thrown to prevent injection vectors, not for all the spec mandated checks. - * - * @param {Node} node - * @param {boolean} [isHtml] - * @param {function} [nodeFilter] - * @param {Object} [options] - * @param {boolean} [options.requireWellFormed=false] - * When `true`, throws for content that would produce ill-formed XML. - * @returns {string} - * @throws {DOMException} - * With code `INVALID_STATE_ERR` when `requireWellFormed` is `true` and: - * - an Element's qualified name (including any namespace prefix) is not a valid XML QName, - * - an attribute's qualified name (including a synthesized `xmlns:` namespace declaration) is - * not a valid XML QName, - * - a CDATASection node's data contains `"]]>"`, - * - a Comment node's data contains `"-->"` (bare `"--"` does not throw on this branch), - * - a ProcessingInstruction's target is not a valid XML `NCName` (a `Name` with no colon) or is - * an ASCII case-insensitive match for `"xml"`, or its data contains `"?>"`, - * - a DocumentType's `name` is not a valid XML `Name` (XML 1.0 production [5]), - * - a DocumentType's `publicId` is non-empty and does not match the XML `PubidLiteral` - * production, - * - a DocumentType's `systemId` is non-empty and does not match the XML `SystemLiteral` - * production, - * - a DocumentType's `internalSubset` contains `"]>"`, or - * - an EntityReference's `nodeName` is not a valid XML `Name` (XML 1.0 production [5]). - * Note: xmldom does not enforce `readonly` on DocumentType fields — direct property - * writes succeed and are covered by the serializer-level checks above. - * @see https://html.spec.whatwg.org/#dom-xmlserializer-serializetostring - * @see https://w3c.github.io/DOM-Parsing/#xml-serialization - * @see https://github.com/w3c/DOM-Parsing/issues/84 - */ -XMLSerializer.prototype.serializeToString = function(node,isHtml,nodeFilter,options){ - return nodeSerializeToString.call(node,isHtml,nodeFilter,options); -} -Node.prototype.toString = nodeSerializeToString; -function nodeSerializeToString(isHtml,nodeFilter,options){ - var requireWellFormed = !!options && !!options.requireWellFormed; - 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,requireWellFormed); - //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, requireWellFormed) { - if (requireWellFormed && !tagNamePattern.test(qualifiedName)) { - throw new DOMException(INVALID_STATE_ERR, 'The attribute name "' + qualifiedName + '" is not a valid XML QName'); - } - buf.push(' ', qualifiedName, '="', value.replace(/[<>&"\t\n\r]/g, _xmlEncoder), '"') -} - -function serializeToString(node, buf, isHTML, nodeFilter, visibleNamespaces, requireWellFormed) { - if (!visibleNamespaces) { - visibleNamespaces = []; - } - walkDOM(node, { ns: visibleNamespaces, isHTML: isHTML }, { - enter: function (n, ctx) { - var ns = ctx.ns; - var html = ctx.isHTML; - - if (nodeFilter) { - n = nodeFilter(n); - if (n) { - if (typeof n == 'string') { - buf.push(n); - return null; - } - } else { - return null; - } - } - - switch (n.nodeType) { - case ELEMENT_NODE: - var attrs = n.attributes; - var len = attrs.length; - var nodeName = n.tagName; - - html = NAMESPACE.isHTML(n.namespaceURI) || html; - - var prefixedNodeName = nodeName; - if (!html && !n.prefix && n.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 = ns.length - 1; nsi >= 0; nsi--) { - var nsEntry = ns[nsi]; - if (nsEntry.prefix === '' && nsEntry.namespace === n.namespaceURI) { - defaultNS = nsEntry.namespace; - break; - } - } - } - if (defaultNS !== n.namespaceURI) { - for (var nsi = ns.length - 1; nsi >= 0; nsi--) { - var nsEntry = ns[nsi]; - if (nsEntry.namespace === n.namespaceURI) { - if (nsEntry.prefix) { - prefixedNodeName = nsEntry.prefix + ':' + nodeName; - } - break; - } - } - } - } - - if (requireWellFormed && !tagNamePattern.test(prefixedNodeName)) { - throw new DOMException(INVALID_STATE_ERR, 'The element name "' + prefixedNodeName + '" is not a valid XML QName'); - } - buf.push('<', prefixedNodeName); - - // Build a fresh namespace snapshot for this element's children. - // The slice prevents sibling elements from inheriting each other's declarations. - var childNs = ns.slice(); - for (var i = 0; i < len; i++) { - var attr = attrs.item(i); - if (attr.prefix == 'xmlns') { - childNs.push({ prefix: attr.localName, namespace: attr.value }); - } else if (attr.nodeName == 'xmlns') { - childNs.push({ prefix: '', namespace: attr.value }); - } - } - - for (var i = 0; i < len; i++) { - var attr = attrs.item(i); - if (needNamespaceDefine(attr, html, childNs)) { - var attrPrefix = attr.prefix || ''; - var uri = attr.namespaceURI; - addSerializedAttribute(buf, attrPrefix ? 'xmlns:' + attrPrefix : 'xmlns', uri, requireWellFormed); - childNs.push({ prefix: attrPrefix, namespace: uri }); - } - // Apply nodeFilter and serialize the attribute. - var filteredAttr = nodeFilter ? nodeFilter(attr) : attr; - if (filteredAttr) { - if (typeof filteredAttr === 'string') { - buf.push(filteredAttr); - } else { - addSerializedAttribute(buf, filteredAttr.name, filteredAttr.value, requireWellFormed); - } - } - } - - // add namespace for current node - if (nodeName === prefixedNodeName && needNamespaceDefine(n, html, childNs)) { - var nodePrefix = n.prefix || ''; - var uri = n.namespaceURI; - addSerializedAttribute(buf, nodePrefix ? 'xmlns:' + nodePrefix : 'xmlns', uri, requireWellFormed); - childNs.push({ prefix: nodePrefix, namespace: uri }); - } - - var child = n.firstChild; - if (child || html && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)) { - buf.push('>'); - if (html && /^script$/i.test(nodeName)) { - // Inline serialization for