@eksml/xml 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +588 -0
- package/dist/converters/fromLossless.d.mts +14 -0
- package/dist/converters/fromLossless.d.mts.map +1 -0
- package/dist/converters/fromLossless.mjs +35 -0
- package/dist/converters/fromLossless.mjs.map +1 -0
- package/dist/converters/fromLossy.d.mts +18 -0
- package/dist/converters/fromLossy.d.mts.map +1 -0
- package/dist/converters/fromLossy.mjs +91 -0
- package/dist/converters/fromLossy.mjs.map +1 -0
- package/dist/converters/lossless.d.mts +39 -0
- package/dist/converters/lossless.d.mts.map +1 -0
- package/dist/converters/lossless.mjs +74 -0
- package/dist/converters/lossless.mjs.map +1 -0
- package/dist/converters/lossy.d.mts +42 -0
- package/dist/converters/lossy.d.mts.map +1 -0
- package/dist/converters/lossy.mjs +158 -0
- package/dist/converters/lossy.mjs.map +1 -0
- package/dist/htmlConstants-D6fsKbZ-.mjs +30 -0
- package/dist/htmlConstants-D6fsKbZ-.mjs.map +1 -0
- package/dist/parser-BfdEfWDg.d.mts +95 -0
- package/dist/parser-BfdEfWDg.d.mts.map +1 -0
- package/dist/parser-CYq309aR.mjs +479 -0
- package/dist/parser-CYq309aR.mjs.map +1 -0
- package/dist/parser.d.mts +2 -0
- package/dist/parser.mjs +2 -0
- package/dist/sax.d.mts +64 -0
- package/dist/sax.d.mts.map +1 -0
- package/dist/sax.mjs +70 -0
- package/dist/sax.mjs.map +1 -0
- package/dist/saxEngine-BDnD7ruG.mjs +750 -0
- package/dist/saxEngine-BDnD7ruG.mjs.map +1 -0
- package/dist/utilities/index.d.mts +88 -0
- package/dist/utilities/index.d.mts.map +1 -0
- package/dist/utilities/index.mjs +87 -0
- package/dist/utilities/index.mjs.map +1 -0
- package/dist/writer.d.mts +58 -0
- package/dist/writer.d.mts.map +1 -0
- package/dist/writer.mjs +357 -0
- package/dist/writer.mjs.map +1 -0
- package/dist/xmlParseStream.d.mts +138 -0
- package/dist/xmlParseStream.d.mts.map +1 -0
- package/dist/xmlParseStream.mjs +313 -0
- package/dist/xmlParseStream.mjs.map +1 -0
- package/package.json +100 -0
- package/src/converters/fromLossless.ts +80 -0
- package/src/converters/fromLossy.ts +180 -0
- package/src/converters/lossless.ts +116 -0
- package/src/converters/lossy.ts +274 -0
- package/src/parser.ts +728 -0
- package/src/sax.ts +157 -0
- package/src/saxEngine.ts +1157 -0
- package/src/utilities/escapeRegExp.ts +19 -0
- package/src/utilities/filter.ts +63 -0
- package/src/utilities/getElementById.ts +21 -0
- package/src/utilities/getElementsByClassName.ts +22 -0
- package/src/utilities/htmlConstants.ts +26 -0
- package/src/utilities/index.ts +7 -0
- package/src/utilities/isElementNode.ts +19 -0
- package/src/utilities/isTextNode.ts +19 -0
- package/src/utilities/toContentString.ts +23 -0
- package/src/writer.ts +650 -0
- package/src/xmlParseStream.ts +597 -0
package/dist/sax.mjs
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { n as HTML_VOID_ELEMENTS, t as HTML_RAW_CONTENT_TAGS } from "./htmlConstants-D6fsKbZ-.mjs";
|
|
2
|
+
import { t as saxEngine } from "./saxEngine-BDnD7ruG.mjs";
|
|
3
|
+
//#region src/sax.ts
|
|
4
|
+
/**
|
|
5
|
+
* Create an EventEmitter-style SAX parser.
|
|
6
|
+
*
|
|
7
|
+
* Uses the internal SAX engine, but wraps it with `.on()` / `.off()` methods
|
|
8
|
+
* so handlers can be added and removed dynamically.
|
|
9
|
+
*
|
|
10
|
+
* @param options - Parser options (html mode, selfClosingTags, rawContentTags).
|
|
11
|
+
* @returns A SaxParser with `.on()`, `.off()`, `.write()`, `.close()`.
|
|
12
|
+
*/
|
|
13
|
+
function createSaxParser(options) {
|
|
14
|
+
const opts = options ?? {};
|
|
15
|
+
const isHtml = opts.html === true;
|
|
16
|
+
const selfClosingTags = opts.selfClosingTags ?? (isHtml ? HTML_VOID_ELEMENTS : []);
|
|
17
|
+
const rawContentTags = opts.rawContentTags ?? (isHtml ? HTML_RAW_CONTENT_TAGS : []);
|
|
18
|
+
const listeners = {
|
|
19
|
+
openTag: /* @__PURE__ */ new Set(),
|
|
20
|
+
closeTag: /* @__PURE__ */ new Set(),
|
|
21
|
+
text: /* @__PURE__ */ new Set(),
|
|
22
|
+
cdata: /* @__PURE__ */ new Set(),
|
|
23
|
+
comment: /* @__PURE__ */ new Set(),
|
|
24
|
+
processingInstruction: /* @__PURE__ */ new Set(),
|
|
25
|
+
doctype: /* @__PURE__ */ new Set()
|
|
26
|
+
};
|
|
27
|
+
const parser = saxEngine({
|
|
28
|
+
onOpenTag(tagName, attributes) {
|
|
29
|
+
for (const handler of listeners.openTag) handler(tagName, attributes);
|
|
30
|
+
},
|
|
31
|
+
onCloseTag(tagName) {
|
|
32
|
+
for (const handler of listeners.closeTag) handler(tagName);
|
|
33
|
+
},
|
|
34
|
+
onText(text) {
|
|
35
|
+
for (const handler of listeners.text) handler(text);
|
|
36
|
+
},
|
|
37
|
+
onCdata(data) {
|
|
38
|
+
for (const handler of listeners.cdata) handler(data);
|
|
39
|
+
},
|
|
40
|
+
onComment(comment) {
|
|
41
|
+
for (const handler of listeners.comment) handler(comment);
|
|
42
|
+
},
|
|
43
|
+
onProcessingInstruction(name, body) {
|
|
44
|
+
for (const handler of listeners.processingInstruction) handler(name, body);
|
|
45
|
+
},
|
|
46
|
+
onDoctype(tagName, attributes) {
|
|
47
|
+
for (const handler of listeners.doctype) handler(tagName, attributes);
|
|
48
|
+
},
|
|
49
|
+
selfClosingTags,
|
|
50
|
+
rawContentTags
|
|
51
|
+
});
|
|
52
|
+
return {
|
|
53
|
+
on(event, handler) {
|
|
54
|
+
listeners[event].add(handler);
|
|
55
|
+
},
|
|
56
|
+
off(event, handler) {
|
|
57
|
+
listeners[event].delete(handler);
|
|
58
|
+
},
|
|
59
|
+
write(chunk) {
|
|
60
|
+
parser.write(chunk);
|
|
61
|
+
},
|
|
62
|
+
close() {
|
|
63
|
+
parser.close();
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
//#endregion
|
|
68
|
+
export { createSaxParser };
|
|
69
|
+
|
|
70
|
+
//# sourceMappingURL=sax.mjs.map
|
package/dist/sax.mjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sax.mjs","names":[],"sources":["../src/sax.ts"],"sourcesContent":["/**\n * createSaxParser — EventEmitter-style SAX parser built on the internal SAX engine.\n *\n * Provides dynamic `.on()` / `.off()` handler management on top of the core\n * SAX tokenizer.\n *\n * @example\n * ```ts\n * import { createSaxParser } from '@eksml/xml/sax';\n *\n * const parser = createSaxParser({ html: true });\n *\n * parser.on('openTag', (tagName, attrs) => console.log(tagName, attrs));\n * parser.on('text', (text) => console.log(text));\n *\n * parser.write('<div><br><p>Hello</p></div>');\n * parser.close();\n * ```\n */\n\nimport type { SaxEngineHandlers, Attributes } from '#src/saxEngine.ts';\nimport { saxEngine } from '#src/saxEngine.ts';\nimport {\n HTML_VOID_ELEMENTS,\n HTML_RAW_CONTENT_TAGS,\n} from '#src/utilities/htmlConstants.ts';\n\n// ---------------------------------------------------------------------------\n// SAX event types\n// ---------------------------------------------------------------------------\n\n/** Event name → handler signature map for the SAX parser. */\nexport interface SaxEventMap {\n openTag: (tagName: string, attributes: Attributes) => void;\n closeTag: (tagName: string) => void;\n text: (text: string) => void;\n cdata: (data: string) => void;\n comment: (comment: string) => void;\n processingInstruction: (name: string, body: string) => void;\n doctype: (tagName: string, attributes: Attributes) => void;\n}\n\n/** SAX event names. */\nexport type SaxEventName = keyof SaxEventMap;\n\n/** EventEmitter-style SAX parser returned by `createSaxParser()`. */\nexport interface SaxParser {\n /** Register an event handler. */\n on<E extends SaxEventName>(event: E, handler: SaxEventMap[E]): void;\n /** Remove an event handler. */\n off<E extends SaxEventName>(event: E, handler: SaxEventMap[E]): void;\n /** Feed a chunk of XML to the parser. */\n write(chunk: string): void;\n /** Signal end-of-input and flush any remaining buffered data. */\n close(): void;\n}\n\n// ---------------------------------------------------------------------------\n// SAX parser options\n// ---------------------------------------------------------------------------\n\n/** Options for `createSaxParser()`. */\nexport interface SaxParserOptions {\n /**\n * Enable HTML mode. Sets `selfClosingTags` and `rawContentTags` to their\n * HTML defaults unless explicitly provided.\n */\n html?: boolean;\n /** Tag names that are self-closing (void). Defaults to HTML voids when `html: true`. */\n selfClosingTags?: string[];\n /** Tag names whose content is raw text. Defaults to `['script', 'style']` when `html: true`. */\n rawContentTags?: string[];\n}\n\n// ---------------------------------------------------------------------------\n// createSaxParser\n// ---------------------------------------------------------------------------\n\n/**\n * Create an EventEmitter-style SAX parser.\n *\n * Uses the internal SAX engine, but wraps it with `.on()` / `.off()` methods\n * so handlers can be added and removed dynamically.\n *\n * @param options - Parser options (html mode, selfClosingTags, rawContentTags).\n * @returns A SaxParser with `.on()`, `.off()`, `.write()`, `.close()`.\n */\nexport function createSaxParser(options?: SaxParserOptions): SaxParser {\n const opts = options ?? {};\n\n // Resolve HTML-mode defaults (same logic as parse() and XmlParseStream)\n const isHtml = opts.html === true;\n const selfClosingTags =\n opts.selfClosingTags ?? (isHtml ? HTML_VOID_ELEMENTS : []);\n const rawContentTags =\n opts.rawContentTags ?? (isHtml ? HTML_RAW_CONTENT_TAGS : []);\n\n // Listener sets — one Set per event type\n const listeners: {\n [E in SaxEventName]: Set<SaxEventMap[E]>;\n } = {\n openTag: new Set(),\n closeTag: new Set(),\n text: new Set(),\n cdata: new Set(),\n comment: new Set(),\n processingInstruction: new Set(),\n doctype: new Set(),\n };\n\n // Bridge handlers: call all registered listeners for each event\n const handlers: SaxEngineHandlers = {\n onOpenTag(tagName: string, attributes: Attributes) {\n for (const handler of listeners.openTag) handler(tagName, attributes);\n },\n onCloseTag(tagName: string) {\n for (const handler of listeners.closeTag) handler(tagName);\n },\n onText(text: string) {\n for (const handler of listeners.text) handler(text);\n },\n onCdata(data: string) {\n for (const handler of listeners.cdata) handler(data);\n },\n onComment(comment: string) {\n for (const handler of listeners.comment) handler(comment);\n },\n onProcessingInstruction(name: string, body: string) {\n for (const handler of listeners.processingInstruction)\n handler(name, body);\n },\n onDoctype(tagName: string, attributes: Attributes) {\n for (const handler of listeners.doctype) handler(tagName, attributes);\n },\n };\n\n const parser = saxEngine({\n ...handlers,\n selfClosingTags,\n rawContentTags,\n });\n\n return {\n on<E extends SaxEventName>(event: E, handler: SaxEventMap[E]): void {\n listeners[event].add(handler);\n },\n off<E extends SaxEventName>(event: E, handler: SaxEventMap[E]): void {\n listeners[event].delete(handler);\n },\n write(chunk: string): void {\n parser.write(chunk);\n },\n close(): void {\n parser.close();\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;AAuFA,SAAgB,gBAAgB,SAAuC;CACrE,MAAM,OAAO,WAAW,EAAE;CAG1B,MAAM,SAAS,KAAK,SAAS;CAC7B,MAAM,kBACJ,KAAK,oBAAoB,SAAS,qBAAqB,EAAE;CAC3D,MAAM,iBACJ,KAAK,mBAAmB,SAAS,wBAAwB,EAAE;CAG7D,MAAM,YAEF;EACF,yBAAS,IAAI,KAAK;EAClB,0BAAU,IAAI,KAAK;EACnB,sBAAM,IAAI,KAAK;EACf,uBAAO,IAAI,KAAK;EAChB,yBAAS,IAAI,KAAK;EAClB,uCAAuB,IAAI,KAAK;EAChC,yBAAS,IAAI,KAAK;EACnB;CA4BD,MAAM,SAAS,UAAU;EAxBvB,UAAU,SAAiB,YAAwB;AACjD,QAAK,MAAM,WAAW,UAAU,QAAS,SAAQ,SAAS,WAAW;;EAEvE,WAAW,SAAiB;AAC1B,QAAK,MAAM,WAAW,UAAU,SAAU,SAAQ,QAAQ;;EAE5D,OAAO,MAAc;AACnB,QAAK,MAAM,WAAW,UAAU,KAAM,SAAQ,KAAK;;EAErD,QAAQ,MAAc;AACpB,QAAK,MAAM,WAAW,UAAU,MAAO,SAAQ,KAAK;;EAEtD,UAAU,SAAiB;AACzB,QAAK,MAAM,WAAW,UAAU,QAAS,SAAQ,QAAQ;;EAE3D,wBAAwB,MAAc,MAAc;AAClD,QAAK,MAAM,WAAW,UAAU,sBAC9B,SAAQ,MAAM,KAAK;;EAEvB,UAAU,SAAiB,YAAwB;AACjD,QAAK,MAAM,WAAW,UAAU,QAAS,SAAQ,SAAS,WAAW;;EAMvE;EACA;EACD,CAAC;AAEF,QAAO;EACL,GAA2B,OAAU,SAA+B;AAClE,aAAU,OAAO,IAAI,QAAQ;;EAE/B,IAA4B,OAAU,SAA+B;AACnE,aAAU,OAAO,OAAO,QAAQ;;EAElC,MAAM,OAAqB;AACzB,UAAO,MAAM,MAAM;;EAErB,QAAc;AACZ,UAAO,OAAO;;EAEjB"}
|