UNPKG

@loaders.gl/xml

Version:

Framework-independent loaders for the XML (eXtensible Markup Language) format

1,550 lines (1,542 loc) 42.3 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var __publicField = (obj, key, value) => { __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); return value; }; // dist/index.js var dist_exports = {}; __export(dist_exports, { HTMLLoader: () => HTMLLoader, SAXParser: () => SAXParser, XMLLoader: () => XMLLoader, _uncapitalize: () => uncapitalize, _uncapitalizeKeys: () => uncapitalizeKeys, convertXMLFieldToArrayInPlace: () => convertXMLFieldToArrayInPlace, convertXMLValueToArray: () => convertXMLValueToArray }); module.exports = __toCommonJS(dist_exports); // dist/sax-ts/sax.js var DEFAULT_SAX_EVENTS = { ontext: () => { }, onprocessinginstruction: () => { }, onsgmldeclaration: () => { }, ondoctype: () => { }, oncomment: () => { }, onopentagstart: () => { }, onattribute: () => { }, onopentag: () => { }, onclosetag: () => { }, onopencdata: () => { }, oncdata: () => { }, onclosecdata: () => { }, onerror: () => { }, onend: () => { }, onready: () => { }, onscript: () => { }, onopennamespace: () => { }, onclosenamespace: () => { } }; var DEFAULT_SAX_PARSER_OPTIONS = { ...DEFAULT_SAX_EVENTS, strict: false, MAX_BUFFER_LENGTH: 64 * 1024, lowercase: false, lowercasetags: false, noscript: false, strictEntities: false, xmlns: void 0, position: void 0, trim: void 0, normalize: void 0 }; var EVENTS = [ "text", "processinginstruction", "sgmldeclaration", "doctype", "comment", "opentagstart", "attribute", "opentag", "closetag", "opencdata", "cdata", "closecdata", "error", "end", "ready", "script", "opennamespace", "closenamespace" ]; var BUFFERS = [ "comment", "sgmlDecl", "textNode", "tagName", "doctype", "procInstName", "procInstBody", "entity", "attribName", "attribValue", "cdata", "script" ]; var nameStart = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/; var nameBody = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/; var entityStart = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/; var entityBody = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/; var ENTITIES = { amp: "&", gt: ">", lt: "<", quot: '"', apos: "'", AElig: 198, Aacute: 193, Acirc: 194, Agrave: 192, Aring: 197, Atilde: 195, Auml: 196, Ccedil: 199, ETH: 208, Eacute: 201, Ecirc: 202, Egrave: 200, Euml: 203, Iacute: 205, Icirc: 206, Igrave: 204, Iuml: 207, Ntilde: 209, Oacute: 211, Ocirc: 212, Ograve: 210, Oslash: 216, Otilde: 213, Ouml: 214, THORN: 222, Uacute: 218, Ucirc: 219, Ugrave: 217, Uuml: 220, Yacute: 221, aacute: 225, acirc: 226, aelig: 230, agrave: 224, aring: 229, atilde: 227, auml: 228, ccedil: 231, eacute: 233, ecirc: 234, egrave: 232, eth: 240, euml: 235, iacute: 237, icirc: 238, igrave: 236, iuml: 239, ntilde: 241, oacute: 243, ocirc: 244, ograve: 242, oslash: 248, otilde: 245, ouml: 246, szlig: 223, thorn: 254, uacute: 250, ucirc: 251, ugrave: 249, uuml: 252, yacute: 253, yuml: 255, copy: 169, reg: 174, nbsp: 160, iexcl: 161, cent: 162, pound: 163, curren: 164, yen: 165, brvbar: 166, sect: 167, uml: 168, ordf: 170, laquo: 171, not: 172, shy: 173, macr: 175, deg: 176, plusmn: 177, sup1: 185, sup2: 178, sup3: 179, acute: 180, micro: 181, para: 182, middot: 183, cedil: 184, ordm: 186, raquo: 187, frac14: 188, frac12: 189, frac34: 190, iquest: 191, times: 215, divide: 247, OElig: 338, oelig: 339, Scaron: 352, scaron: 353, Yuml: 376, fnof: 402, circ: 710, tilde: 732, Alpha: 913, Beta: 914, Gamma: 915, Delta: 916, Epsilon: 917, Zeta: 918, Eta: 919, Theta: 920, Iota: 921, Kappa: 922, Lambda: 923, Mu: 924, Nu: 925, Xi: 926, Omicron: 927, Pi: 928, Rho: 929, Sigma: 931, Tau: 932, Upsilon: 933, Phi: 934, Chi: 935, Psi: 936, Omega: 937, alpha: 945, beta: 946, gamma: 947, delta: 948, epsilon: 949, zeta: 950, eta: 951, theta: 952, iota: 953, kappa: 954, lambda: 955, mu: 956, nu: 957, xi: 958, omicron: 959, pi: 960, rho: 961, sigmaf: 962, sigma: 963, tau: 964, upsilon: 965, phi: 966, chi: 967, psi: 968, omega: 969, thetasym: 977, upsih: 978, piv: 982, ensp: 8194, emsp: 8195, thinsp: 8201, zwnj: 8204, zwj: 8205, lrm: 8206, rlm: 8207, ndash: 8211, mdash: 8212, lsquo: 8216, rsquo: 8217, sbquo: 8218, ldquo: 8220, rdquo: 8221, bdquo: 8222, dagger: 8224, Dagger: 8225, bull: 8226, hellip: 8230, permil: 8240, prime: 8242, Prime: 8243, lsaquo: 8249, rsaquo: 8250, oline: 8254, frasl: 8260, euro: 8364, image: 8465, weierp: 8472, real: 8476, trade: 8482, alefsym: 8501, larr: 8592, uarr: 8593, rarr: 8594, darr: 8595, harr: 8596, crarr: 8629, lArr: 8656, uArr: 8657, rArr: 8658, dArr: 8659, hArr: 8660, forall: 8704, part: 8706, exist: 8707, empty: 8709, nabla: 8711, isin: 8712, notin: 8713, ni: 8715, prod: 8719, sum: 8721, minus: 8722, lowast: 8727, radic: 8730, prop: 8733, infin: 8734, ang: 8736, and: 8743, or: 8744, cap: 8745, cup: 8746, int: 8747, there4: 8756, sim: 8764, cong: 8773, asymp: 8776, ne: 8800, equiv: 8801, le: 8804, ge: 8805, sub: 8834, sup: 8835, nsub: 8836, sube: 8838, supe: 8839, oplus: 8853, otimes: 8855, perp: 8869, sdot: 8901, lceil: 8968, rceil: 8969, lfloor: 8970, rfloor: 8971, lang: 9001, rang: 9002, loz: 9674, spades: 9824, clubs: 9827, hearts: 9829, diams: 9830 }; Object.keys(ENTITIES).forEach((key) => { const e = ENTITIES[key]; ENTITIES[key] = typeof e === "number" ? String.fromCharCode(e) : e; }); var SAX = class { EVENTS = EVENTS; ENTITIES = { // TODO: make it readonly, needed for entity-mega test // amp, gt, lt, quot and apos are resolved to strings instead of numerical // codes, IDK why ...ENTITIES }; XML_ENTITIES = { amp: "&", gt: ">", lt: "<", quot: '"', apos: "'" }; S = 0; opt; trackPosition = false; column = 0; line = 0; c = ""; error; q = ""; bufferCheckPosition; closed = false; tags = []; looseCase = ""; closedRoot = false; sawRoot = false; strict = false; tag; strictEntities; state; noscript = false; attribList = []; ns; position = 0; STATE = { BEGIN: this.S++, // leading byte order mark or whitespace BEGIN_WHITESPACE: this.S++, // leading whitespace TEXT: this.S++, // general stuff TEXT_ENTITY: this.S++, // &amp and such. OPEN_WAKA: this.S++, // < SGML_DECL: this.S++, // <!BLARG SGML_DECL_QUOTED: this.S++, // <!BLARG foo "bar DOCTYPE: this.S++, // <!DOCTYPE DOCTYPE_QUOTED: this.S++, // <!DOCTYPE "//blah DOCTYPE_DTD: this.S++, // <!DOCTYPE "//blah" [ ... DOCTYPE_DTD_QUOTED: this.S++, // <!DOCTYPE "//blah" [ "foo COMMENT_STARTING: this.S++, // <!- COMMENT: this.S++, // <!-- COMMENT_ENDING: this.S++, // <!-- blah - COMMENT_ENDED: this.S++, // <!-- blah -- CDATA: this.S++, // <![CDATA[ something CDATA_ENDING: this.S++, // ] CDATA_ENDING_2: this.S++, // ]] PROC_INST: this.S++, // <?hi PROC_INST_BODY: this.S++, // <?hi there PROC_INST_ENDING: this.S++, // <?hi "there" ? OPEN_TAG: this.S++, // <strong OPEN_TAG_SLASH: this.S++, // <strong / ATTRIB: this.S++, // <a ATTRIB_NAME: this.S++, // <a foo ATTRIB_NAME_SAW_WHITE: this.S++, // <a foo _ ATTRIB_VALUE: this.S++, // <a foo= ATTRIB_VALUE_QUOTED: this.S++, // <a foo="bar ATTRIB_VALUE_CLOSED: this.S++, // <a foo="bar" ATTRIB_VALUE_UNQUOTED: this.S++, // <a foo=bar ATTRIB_VALUE_ENTITY_Q: this.S++, // <foo bar="&quot;" ATTRIB_VALUE_ENTITY_U: this.S++, // <foo bar=&quot CLOSE_TAG: this.S++, // </a CLOSE_TAG_SAW_WHITE: this.S++, // </a > SCRIPT: this.S++, // <script> ... SCRIPT_ENDING: this.S++ // <script> ... < }; BUFFERS = BUFFERS; // private parser: (strict: boolean, opt: any) => SAXParser; CDATA = "[CDATA["; DOCTYPE = "DOCTYPE"; XML_NAMESPACE = "http://www.w3.org/XML/1998/namespace"; XMLNS_NAMESPACE = "http://www.w3.org/2000/xmlns/"; rootNS = { xml: this.XML_NAMESPACE, xmlns: this.XMLNS_NAMESPACE }; comment; sgmlDecl; textNode = ""; tagName; doctype; procInstName; procInstBody; entity = ""; attribName; attribValue; cdata = ""; script = ""; startTagPosition = 0; constructor() { this.S = 0; for (const s in this.STATE) { if (this.STATE.hasOwnProperty(s)) { this.STATE[this.STATE[s]] = s; } } this.S = this.STATE; } static charAt(chunk, i) { let result = ""; if (i < chunk.length) { result = chunk.charAt(i); } return result; } static isWhitespace(c) { return c === " " || c === "\n" || c === "\r" || c === " "; } static isQuote(c) { return c === '"' || c === "'"; } static isAttribEnd(c) { return c === ">" || SAX.isWhitespace(c); } static isMatch(regex, c) { return regex.test(c); } static notMatch(regex, c) { return !SAX.isMatch(regex, c); } static qname(name, attribute) { const i = name.indexOf(":"); const qualName = i < 0 ? ["", name] : name.split(":"); let prefix = qualName[0]; let local = qualName[1]; if (attribute && name === "xmlns") { prefix = "xmlns"; local = ""; } return { prefix, local }; } write(chunk) { if (this.error) { throw this.error; } if (this.closed) { return this.errorFunction("Cannot write after close. Assign an onready handler."); } if (chunk === null) { return this.end(); } if (typeof chunk === "object") { chunk = chunk.toString(); } let i = 0; let c; while (true) { c = SAX.charAt(chunk, i++); this.c = c; if (!c) { break; } if (this.trackPosition) { this.position++; if (c === "\n") { this.line++; this.column = 0; } else { this.column++; } } switch (this.state) { case this.S.BEGIN: this.state = this.S.BEGIN_WHITESPACE; if (c === "\uFEFF") { continue; } this.beginWhiteSpace(c); continue; case this.S.BEGIN_WHITESPACE: this.beginWhiteSpace(c); continue; case this.S.TEXT: if (this.sawRoot && !this.closedRoot) { const starti = i - 1; while (c && c !== "<" && c !== "&") { c = SAX.charAt(chunk, i++); if (c && this.trackPosition) { this.position++; if (c === "\n") { this.line++; this.column = 0; } else { this.column++; } } } this.textNode += chunk.substring(starti, i - 1); } if (c === "<" && !(this.sawRoot && this.closedRoot && !this.strict)) { this.state = this.S.OPEN_WAKA; this.startTagPosition = this.position; } else { if (!SAX.isWhitespace(c) && (!this.sawRoot || this.closedRoot)) { this.strictFail("Text data outside of root node."); } if (c === "&") { this.state = this.S.TEXT_ENTITY; } else { this.textNode += c; } } continue; case this.S.SCRIPT: if (c === "<") { this.state = this.S.SCRIPT_ENDING; } else { this.script += c; } continue; case this.S.SCRIPT_ENDING: if (c === "/") { this.state = this.S.CLOSE_TAG; } else { this.script += `<${c}`; this.state = this.S.SCRIPT; } continue; case this.S.OPEN_WAKA: if (c === "!") { this.state = this.S.SGML_DECL; this.sgmlDecl = ""; } else if (SAX.isWhitespace(c)) { } else if (SAX.isMatch(nameStart, c)) { this.state = this.S.OPEN_TAG; this.tagName = c; } else if (c === "/") { this.state = this.S.CLOSE_TAG; this.tagName = ""; } else if (c === "?") { this.state = this.S.PROC_INST; this.procInstName = this.procInstBody = ""; } else { this.strictFail("Unencoded <"); if (this.startTagPosition + 1 < this.position) { const pad = this.position - this.startTagPosition; c = new Array(pad).join(" ") + c; } this.textNode += `<${c}`; this.state = this.S.TEXT; } continue; case this.S.SGML_DECL: if ((this.sgmlDecl + c).toUpperCase() === this.CDATA) { this.emitNode("onopencdata"); this.state = this.S.CDATA; this.sgmlDecl = ""; this.cdata = ""; } else if (this.sgmlDecl + c === "--") { this.state = this.S.COMMENT; this.comment = ""; this.sgmlDecl = ""; } else if ((this.sgmlDecl + c).toUpperCase() === this.DOCTYPE) { this.state = this.S.DOCTYPE; if (this.doctype || this.sawRoot) { this.strictFail("Inappropriately located doctype declaration"); } this.doctype = ""; this.sgmlDecl = ""; } else if (c === ">") { this.emitNode("onsgmldeclaration", this.sgmlDecl); this.sgmlDecl = ""; this.state = this.S.TEXT; } else if (SAX.isQuote(c)) { this.state = this.S.SGML_DECL_QUOTED; this.sgmlDecl += c; } else { this.sgmlDecl += c; } continue; case this.S.SGML_DECL_QUOTED: if (c === this.q) { this.state = this.S.SGML_DECL; this.q = ""; } this.sgmlDecl += c; continue; case this.S.DOCTYPE: if (c === ">") { this.state = this.S.TEXT; this.emitNode("ondoctype", this.doctype); this.doctype = true; } else { this.doctype += c; if (c === "[") { this.state = this.S.DOCTYPE_DTD; } else if (SAX.isQuote(c)) { this.state = this.S.DOCTYPE_QUOTED; this.q = c; } } continue; case this.S.DOCTYPE_QUOTED: this.doctype += c; if (c === this.q) { this.q = ""; this.state = this.S.DOCTYPE; } continue; case this.S.DOCTYPE_DTD: this.doctype += c; if (c === "]") { this.state = this.S.DOCTYPE; } else if (SAX.isQuote(c)) { this.state = this.S.DOCTYPE_DTD_QUOTED; this.q = c; } continue; case this.S.DOCTYPE_DTD_QUOTED: this.doctype += c; if (c === this.q) { this.state = this.S.DOCTYPE_DTD; this.q = ""; } continue; case this.S.COMMENT: if (c === "-") { this.state = this.S.COMMENT_ENDING; } else { this.comment += c; } continue; case this.S.COMMENT_ENDING: if (c === "-") { this.state = this.S.COMMENT_ENDED; this.comment = this.textApplyOptions(this.comment); if (this.comment) { this.emitNode("oncomment", this.comment); } this.comment = ""; } else { this.comment += `-${c}`; this.state = this.S.COMMENT; } continue; case this.S.COMMENT_ENDED: if (c !== ">") { this.strictFail("Malformed comment"); this.comment += `--${c}`; this.state = this.S.COMMENT; } else { this.state = this.S.TEXT; } continue; case this.S.CDATA: if (c === "]") { this.state = this.S.CDATA_ENDING; } else { this.cdata += c; } continue; case this.S.CDATA_ENDING: if (c === "]") { this.state = this.S.CDATA_ENDING_2; } else { this.cdata += `]${c}`; this.state = this.S.CDATA; } continue; case this.S.CDATA_ENDING_2: if (c === ">") { if (this.cdata) { this.emitNode("oncdata", this.cdata); } this.emitNode("onclosecdata"); this.cdata = ""; this.state = this.S.TEXT; } else if (c === "]") { this.cdata += "]"; } else { this.cdata += `]]${c}`; this.state = this.S.CDATA; } continue; case this.S.PROC_INST: if (c === "?") { this.state = this.S.PROC_INST_ENDING; } else if (SAX.isWhitespace(c)) { this.state = this.S.PROC_INST_BODY; } else { this.procInstName += c; } continue; case this.S.PROC_INST_BODY: if (!this.procInstBody && SAX.isWhitespace(c)) { continue; } else if (c === "?") { this.state = this.S.PROC_INST_ENDING; } else { this.procInstBody += c; } continue; case this.S.PROC_INST_ENDING: if (c === ">") { this.emitNode("onprocessinginstruction", { name: this.procInstName, body: this.procInstBody }); this.procInstName = this.procInstBody = ""; this.state = this.S.TEXT; } else { this.procInstBody += `?${c}`; this.state = this.S.PROC_INST_BODY; } continue; case this.S.OPEN_TAG: if (SAX.isMatch(nameBody, c)) { this.tagName += c; } else { this.newTag(); if (c === ">") { this.openTag(); } else if (c === "/") { this.state = this.S.OPEN_TAG_SLASH; } else { if (!SAX.isWhitespace(c)) { this.strictFail("Invalid character in tag name"); } this.state = this.S.ATTRIB; } } continue; case this.S.OPEN_TAG_SLASH: if (c === ">") { this.openTag(true); this.closeTag(); } else { this.strictFail("Forward-slash in opening tag not followed by >"); this.state = this.S.ATTRIB; } continue; case this.S.ATTRIB: if (SAX.isWhitespace(c)) { continue; } else if (c === ">") { this.openTag(); } else if (c === "/") { this.state = this.S.OPEN_TAG_SLASH; } else if (SAX.isMatch(nameStart, c)) { this.attribName = c; this.attribValue = ""; this.state = this.S.ATTRIB_NAME; } else { this.strictFail("Invalid attribute name"); } continue; case this.S.ATTRIB_NAME: if (c === "=") { this.state = this.S.ATTRIB_VALUE; } else if (c === ">") { this.strictFail("Attribute without value"); this.attribValue = this.attribName; this.attrib(); this.openTag(); } else if (SAX.isWhitespace(c)) { this.state = this.S.ATTRIB_NAME_SAW_WHITE; } else if (SAX.isMatch(nameBody, c)) { this.attribName += c; } else { this.strictFail("Invalid attribute name"); } continue; case this.S.ATTRIB_NAME_SAW_WHITE: if (c === "=") { this.state = this.S.ATTRIB_VALUE; } else if (SAX.isWhitespace(c)) { continue; } else { this.strictFail("Attribute without value"); this.tag.attributes[this.attribName] = ""; this.attribValue = ""; this.emitNode("onattribute", { name: this.attribName, value: "" }); this.attribName = ""; if (c === ">") { this.openTag(); } else if (SAX.isMatch(nameStart, c)) { this.attribName = c; this.state = this.S.ATTRIB_NAME; } else { this.strictFail("Invalid attribute name"); this.state = this.S.ATTRIB; } } continue; case this.S.ATTRIB_VALUE: if (SAX.isWhitespace(c)) { continue; } else if (SAX.isQuote(c)) { this.q = c; this.state = this.S.ATTRIB_VALUE_QUOTED; } else { this.strictFail("Unquoted attribute value"); this.state = this.S.ATTRIB_VALUE_UNQUOTED; this.attribValue = c; } continue; case this.S.ATTRIB_VALUE_QUOTED: if (c !== this.q) { if (c === "&") { this.state = this.S.ATTRIB_VALUE_ENTITY_Q; } else { this.attribValue += c; } continue; } this.attrib(); this.q = ""; this.state = this.S.ATTRIB_VALUE_CLOSED; continue; case this.S.ATTRIB_VALUE_CLOSED: if (SAX.isWhitespace(c)) { this.state = this.S.ATTRIB; } else if (c === ">") { this.openTag(); } else if (c === "/") { this.state = this.S.OPEN_TAG_SLASH; } else if (SAX.isMatch(nameStart, c)) { this.strictFail("No whitespace between attributes"); this.attribName = c; this.attribValue = ""; this.state = this.S.ATTRIB_NAME; } else { this.strictFail("Invalid attribute name"); } continue; case this.S.ATTRIB_VALUE_UNQUOTED: if (!SAX.isAttribEnd(c)) { if (c === "&") { this.state = this.S.ATTRIB_VALUE_ENTITY_U; } else { this.attribValue += c; } continue; } this.attrib(); if (c === ">") { this.openTag(); } else { this.state = this.S.ATTRIB; } continue; case this.S.CLOSE_TAG: if (!this.tagName) { if (SAX.isWhitespace(c)) { continue; } else if (SAX.notMatch(nameStart, c)) { if (this.script) { this.script += `</${c}`; this.state = this.S.SCRIPT; } else { this.strictFail("Invalid tagname in closing tag."); } } else { this.tagName = c; } } else if (c === ">") { this.closeTag(); } else if (SAX.isMatch(nameBody, c)) { this.tagName += c; } else if (this.script) { this.script += `</${this.tagName}`; this.tagName = ""; this.state = this.S.SCRIPT; } else { if (!SAX.isWhitespace(c)) { this.strictFail("Invalid tagname in closing tag"); } this.state = this.S.CLOSE_TAG_SAW_WHITE; } continue; case this.S.CLOSE_TAG_SAW_WHITE: if (SAX.isWhitespace(c)) { continue; } if (c === ">") { this.closeTag(); } else { this.strictFail("Invalid characters in closing tag"); } continue; case this.S.TEXT_ENTITY: case this.S.ATTRIB_VALUE_ENTITY_Q: case this.S.ATTRIB_VALUE_ENTITY_U: let returnState; let buffer; switch (this.state) { case this.S.TEXT_ENTITY: returnState = this.S.TEXT; buffer = "textNode"; break; case this.S.ATTRIB_VALUE_ENTITY_Q: returnState = this.S.ATTRIB_VALUE_QUOTED; buffer = "attribValue"; break; case this.S.ATTRIB_VALUE_ENTITY_U: returnState = this.S.ATTRIB_VALUE_UNQUOTED; buffer = "attribValue"; break; default: throw new Error(`Unknown state: ${this.state}`); } if (c === ";") { this[buffer] += this.parseEntity(); this.entity = ""; this.state = returnState; } else if (SAX.isMatch(this.entity.length ? entityBody : entityStart, c)) { this.entity += c; } else { this.strictFail("Invalid character in entity name"); this[buffer] += `&${this.entity}${c}`; this.entity = ""; this.state = returnState; } continue; default: throw new Error(`Unknown state: ${this.state}`); } } if (this.position >= this.bufferCheckPosition) { this.checkBufferLength(); } return this; } emit(event, data) { if (this.events.hasOwnProperty(event)) { const eventName = event.replace(/^on/, ""); this.events[event](data, eventName, this); } } clearBuffers() { for (let i = 0, l = this.BUFFERS.length; i < l; i++) { this[this[i]] = ""; } } flushBuffers() { this.closeText(); if (this.cdata !== "") { this.emitNode("oncdata", this.cdata); this.cdata = ""; } if (this.script !== "") { this.emitNode("onscript", this.script); this.script = ""; } } end() { if (this.sawRoot && !this.closedRoot) this.strictFail("Unclosed root tag"); if (this.state !== this.S.BEGIN && this.state !== this.S.BEGIN_WHITESPACE && this.state !== this.S.TEXT) { this.errorFunction("Unexpected end"); } this.closeText(); this.c = ""; this.closed = true; this.emit("onend"); return new SAXParser(this.opt); } errorFunction(er) { this.closeText(); if (this.trackPosition) { er += ` Line: ${this.line} Column: ${this.column} Char: ${this.c}`; } const error = new Error(er); this.error = error; this.emit("onerror", error); return this; } attrib() { if (!this.strict) { this.attribName = this.attribName[this.looseCase](); } if (this.attribList.indexOf(this.attribName) !== -1 || this.tag.attributes.hasOwnProperty(this.attribName)) { this.attribName = this.attribValue = ""; return; } if (this.opt.xmlns) { const qn = SAX.qname(this.attribName, true); const prefix = qn.prefix; const local = qn.local; if (prefix === "xmlns") { if (local === "xml" && this.attribValue !== this.XML_NAMESPACE) { this.strictFail(`xml: prefix must be bound to ${this.XML_NAMESPACE} Actual: ${this.attribValue}`); } else if (local === "xmlns" && this.attribValue !== this.XMLNS_NAMESPACE) { this.strictFail(`xmlns: prefix must be bound to ${this.XMLNS_NAMESPACE} Actual: ${this.attribValue}`); } else { const tag = this.tag; const parent = this.tags[this.tags.length - 1] || this; if (tag.ns === parent.ns) { tag.ns = Object.create(parent.ns); } tag.ns[local] = this.attribValue; } } this.attribList.push([this.attribName, this.attribValue]); } else { this.tag.attributes[this.attribName] = this.attribValue; this.emitNode("onattribute", { name: this.attribName, value: this.attribValue }); } this.attribName = this.attribValue = ""; } newTag() { if (!this.strict) this.tagName = this.tagName[this.looseCase](); const parent = this.tags[this.tags.length - 1] || this; const tag = this.tag = { name: this.tagName, attributes: {} }; if (this.opt.xmlns) { tag.ns = parent.ns; } this.attribList.length = 0; this.emitNode("onopentagstart", tag); } parseEntity() { let entity = this.entity; const entityLC = entity.toLowerCase(); let num = NaN; let numStr = ""; if (this.ENTITIES[entity]) { return this.ENTITIES[entity]; } if (this.ENTITIES[entityLC]) { return this.ENTITIES[entityLC]; } entity = entityLC; if (entity.charAt(0) === "#") { if (entity.charAt(1) === "x") { entity = entity.slice(2); num = parseInt(entity, 16); numStr = num.toString(16); } else { entity = entity.slice(1); num = parseInt(entity, 10); numStr = num.toString(10); } } entity = entity.replace(/^0+/, ""); if (isNaN(num) || numStr.toLowerCase() !== entity) { this.strictFail("Invalid character entity"); return `&${this.entity};`; } return String.fromCodePoint(num); } beginWhiteSpace(c) { if (c === "<") { this.state = this.S.OPEN_WAKA; this.startTagPosition = this.position; } else if (!SAX.isWhitespace(c)) { this.strictFail("Non-whitespace before first tag."); this.textNode = c; this.state = this.S.TEXT; } else { } } strictFail(message) { if (typeof this !== "object" || !(this instanceof SAXParser)) { throw new Error("bad call to strictFail"); } if (this.strict) { this.errorFunction(message); } } textApplyOptions(text) { if (this.opt.trim) text = text.trim(); if (this.opt.normalize) text = text.replace(/\s+/g, " "); return text; } emitNode(nodeType, data) { if (this.textNode) this.closeText(); this.emit(nodeType, data); } closeText() { this.textNode = this.textApplyOptions(this.textNode); if (this.textNode !== void 0 && this.textNode !== "" && this.textNode !== "undefined") { this.emit("ontext", this.textNode); } this.textNode = ""; } checkBufferLength() { var _a; const maxAllowed = Math.max(this.opt.MAX_BUFFER_LENGTH, 10); let maxActual = 0; for (let i = 0, l = this.BUFFERS.length; i < l; i++) { const len = ((_a = this[this.BUFFERS[i]]) == null ? void 0 : _a.length) || 0; if (len > maxAllowed) { switch (this.BUFFERS[i]) { case "textNode": this.closeText(); break; case "cdata": this.emitNode("oncdata", this.cdata); this.cdata = ""; break; case "script": this.emitNode("onscript", this.script); this.script = ""; break; default: this.errorFunction(`Max buffer length exceeded: ${this.BUFFERS[i]}`); } } maxActual = Math.max(maxActual, len); } const m = this.opt.MAX_BUFFER_LENGTH - maxActual; this.bufferCheckPosition = m + this.position; } openTag(selfClosing) { if (this.opt.xmlns) { const tag = this.tag; const qn = SAX.qname(this.tagName); tag.prefix = qn.prefix; tag.local = qn.local; tag.uri = tag.ns[qn.prefix] || ""; if (tag.prefix && !tag.uri) { this.strictFail(`Unbound namespace prefix: ${JSON.stringify(this.tagName)}`); tag.uri = qn.prefix; } const parent = this.tags[this.tags.length - 1] || this; if (tag.ns && parent.ns !== tag.ns) { const that = this; Object.keys(tag.ns).forEach((p) => { that.emitNode("onopennamespace", { prefix: p, uri: tag.ns[p] }); }); } for (let i = 0, l = this.attribList.length; i < l; i++) { const nv = this.attribList[i]; const name = nv[0]; const value = nv[1]; const qualName = SAX.qname(name, true); const prefix = qualName.prefix; const local = qualName.local; const uri = prefix === "" ? "" : tag.ns[prefix] || ""; const a = { name, value, prefix, local, uri }; if (prefix && prefix !== "xmlns" && !uri) { this.strictFail(`Unbound namespace prefix: ${JSON.stringify(prefix)}`); a.uri = prefix; } this.tag.attributes[name] = a; this.emitNode("onattribute", a); } this.attribList.length = 0; } this.tag.isSelfClosing = Boolean(selfClosing); this.sawRoot = true; this.tags.push(this.tag); this.emitNode("onopentag", this.tag); if (!selfClosing) { if (!this.noscript && this.tagName.toLowerCase() === "script") { this.state = this.S.SCRIPT; } else { this.state = this.S.TEXT; } this.tag = null; this.tagName = ""; } this.attribName = this.attribValue = ""; this.attribList.length = 0; } closeTag() { if (!this.tagName) { this.strictFail("Weird empty close tag."); this.textNode += "</>"; this.state = this.S.TEXT; return; } if (this.script) { if (this.tagName !== "script") { this.script += `</${this.tagName}>`; this.tagName = ""; this.state = this.S.SCRIPT; return; } this.emitNode("onscript", this.script); this.script = ""; } let t = this.tags.length; let tagName = this.tagName; if (!this.strict) { tagName = tagName[this.looseCase](); } while (t--) { const close = this.tags[t]; if (close.name !== tagName) { this.strictFail("Unexpected close tag"); } else { break; } } if (t < 0) { this.strictFail(`Unmatched closing tag: ${this.tagName}`); this.textNode += `</${this.tagName}>`; this.state = this.S.TEXT; return; } this.tagName = tagName; let s = this.tags.length; while (s-- > t) { const tag = this.tag = this.tags.pop(); this.tagName = this.tag.name; this.emitNode("onclosetag", this.tagName); const x = {}; for (const i in tag.ns) { if (tag.ns.hasOwnProperty(i)) { x[i] = tag.ns[i]; } } const parent = this.tags[this.tags.length - 1] || this; if (this.opt.xmlns && tag.ns !== parent.ns) { const that = this; Object.keys(tag.ns).forEach((p) => { const n = tag.ns[p]; that.emitNode("onclosenamespace", { prefix: p, uri: n }); }); } } if (t === 0) this.closedRoot = true; this.tagName = this.attribValue = this.attribName = ""; this.attribList.length = 0; this.state = this.S.TEXT; } }; var SAXParser = class extends SAX { opt = DEFAULT_SAX_PARSER_OPTIONS; events = DEFAULT_SAX_EVENTS; constructor(opt) { super(); this.clearBuffers(); this.opt = opt = { ...this.opt, ...opt }; this.events = { ...this.events, ...opt }; this.q = this.c = ""; this.opt.lowercase = this.opt.lowercase || this.opt.lowercasetags; this.bufferCheckPosition = this.opt.MAX_BUFFER_LENGTH; this.looseCase = this.opt.lowercase ? "toLowerCase" : "toUpperCase"; this.tags = []; this.closed = this.closedRoot = this.sawRoot = false; this.tag = this.error = null; this.strict = Boolean(this.opt.strict); this.noscript = Boolean(this.opt.strict || this.opt.noscript); this.state = this.S.BEGIN; this.strictEntities = this.opt.strictEntities; this.ENTITIES = this.strictEntities ? Object.create(this.XML_ENTITIES) : Object.create(this.ENTITIES); this.attribList = []; if (this.opt.xmlns) { this.ns = Object.create(this.rootNS); } this.trackPosition = this.opt.position !== false; if (this.trackPosition) { this.position = this.line = this.column = 0; } this.emit("onready"); } resume() { this.error = null; return this; } close() { return this.write(null); } flush() { this.flushBuffers(); } }; __publicField(SAXParser, "ENTITIES", ENTITIES); // dist/lib/xml-utils/uncapitalize.js function uncapitalize(str) { return typeof str === "string" ? str.charAt(0).toLowerCase() + str.slice(1) : str; } function uncapitalizeKeys(object) { if (Array.isArray(object)) { return object.map((element) => uncapitalizeKeys(element)); } if (object && typeof object === "object") { const newObject = {}; for (const [key, value] of Object.entries(object)) { newObject[uncapitalize(key)] = uncapitalizeKeys(value); } return newObject; } return object; } // dist/lib/parsers/parse-xml.js var import_fast_xml_parser = require("fast-xml-parser"); function parseXMLSync(text, options) { if ((options == null ? void 0 : options._parser) && options._parser !== "fast-xml-parser") { throw new Error(options == null ? void 0 : options._parser); } const fastXMLOptions = { // Default FastXML options // https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/docs/v4/2.XMLparseOptions.md#allowbooleanattributes allowBooleanAttributes: true, // https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/docs/v4/2.XMLparseOptions.md#ignoredeclaration ignoreDeclaration: true, // https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/docs/v4/2.XMLparseOptions.md#removensprefix removeNSPrefix: options == null ? void 0 : options.removeNSPrefix, // https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/docs/v4/2.XMLparseOptions.md#textnodename textNodeName: options == null ? void 0 : options.textNodeName, // Let's application specify keys that are always arrays isArray: (name, jpath, isLeafNode, isAttribute) => { var _a; const array = Boolean((_a = options == null ? void 0 : options.arrayPaths) == null ? void 0 : _a.some((path) => jpath === path)); return array; }, // Application overrides ...options == null ? void 0 : options._fastXML }; const xml = fastParseXML(text, fastXMLOptions); return (options == null ? void 0 : options.uncapitalizeKeys) ? uncapitalizeKeys(xml) : xml; } function fastParseXML(text, options) { const parser = new import_fast_xml_parser.XMLParser({ ignoreAttributes: false, attributeNamePrefix: "", ...options }); const parsedXML = parser.parse(text); return parsedXML; } // dist/xml-loader.js var VERSION = true ? "4.3.3" : "latest"; var XMLLoader = { dataType: null, batchType: null, name: "XML", id: "xml", module: "xml", version: VERSION, worker: false, extensions: ["xml"], mimeTypes: ["application/xml", "text/xml"], testText: testXMLFile, options: { xml: { _parser: "fast-xml-parser", uncapitalizeKeys: false, removeNSPrefix: false, textNodeName: "value", arrayPaths: [] } }, parse: async (arrayBuffer, options) => parseXMLSync(new TextDecoder().decode(arrayBuffer), { ...XMLLoader.options.xml, ...options == null ? void 0 : options.xml }), parseTextSync: (text, options) => parseXMLSync(text, { ...XMLLoader.options.xml, ...options == null ? void 0 : options.xml }) }; function testXMLFile(text) { return text.startsWith("<?xml"); } // dist/html-loader.js var import_loader_utils = require("@loaders.gl/loader-utils"); var HTMLLoader = { ...XMLLoader, name: "HTML", id: "html", extensions: ["html", "htm"], mimeTypes: ["text/html"], testText: testHTMLFile, parse: async (arrayBuffer, options) => parseTextSync(new TextDecoder().decode(arrayBuffer), options), parseTextSync: (text, options) => parseTextSync(text, options) }; function testHTMLFile(text) { return text.startsWith("<html"); } function parseTextSync(text, options) { var _a, _b; options = (0, import_loader_utils.mergeLoaderOptions)(options, { xml: { _parser: "fast-xml-parser", _fastXML: { htmlEntities: true } } }); return (_b = (_a = XMLLoader).parseTextSync) == null ? void 0 : _b.call(_a, text, options); } // dist/lib/xml-utils/xml-utils.js function convertXMLValueToArray(xmlValue) { if (Array.isArray(xmlValue)) { return xmlValue; } if (xmlValue && typeof xmlValue === "object" && xmlValue["0"]) { } if (xmlValue) { return [xmlValue]; } return []; } function convertXMLFieldToArrayInPlace(xml, key) { xml[key] = convertXMLValueToArray(xml[key]); } //# sourceMappingURL=index.cjs.map