abstract-document 20.0.4 → 20.1.1
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/CHANGELOG.md +4 -0
- package/lib/abstract-document/abstract-doc.d.ts.map +1 -1
- package/lib/abstract-document/abstract-doc.js +2 -2
- package/lib/abstract-document/atoms/atom.d.ts +3 -3
- package/lib/abstract-document/atoms/atom.d.ts.map +1 -1
- package/lib/abstract-document/default-styles.d.ts.map +1 -1
- package/lib/abstract-document/default-styles.js.map +1 -1
- package/lib/abstract-document/markdown/markdown.d.ts.map +1 -1
- package/lib/abstract-document/markdown/markdown.js +4 -4
- package/lib/abstract-document/markdown/markdown.js.map +1 -1
- package/lib/abstract-document/numberings/numbering-definition.d.ts +2 -2
- package/lib/abstract-document/numberings/numbering-definition.d.ts.map +1 -1
- package/lib/abstract-document/numberings/numbering-level-definition.js +2 -2
- package/lib/abstract-document/page/master-page.d.ts +1 -1
- package/lib/abstract-document/page/master-page.d.ts.map +1 -1
- package/lib/abstract-document/page/master-page.js +1 -1
- package/lib/abstract-document/page/master-page.js.map +1 -1
- package/lib/abstract-document/page/section.d.ts +1 -1
- package/lib/abstract-document/page/section.d.ts.map +1 -1
- package/lib/abstract-document/page/section.js +2 -2
- package/lib/abstract-document/page/section.js.map +1 -1
- package/lib/abstract-document/primitives/font.d.ts +1 -1
- package/lib/abstract-document/primitives/font.d.ts.map +1 -1
- package/lib/abstract-document/primitives/font.js +1 -1
- package/lib/abstract-document/primitives/font.js.map +1 -1
- package/lib/abstract-document/primitives/layout-foundation-color.d.ts.map +1 -1
- package/lib/abstract-document/primitives/layout-foundation-color.js.map +1 -1
- package/lib/abstract-document/primitives/layout-foundation.d.ts.map +1 -1
- package/lib/abstract-document/primitives/layout-foundation.js.map +1 -1
- package/lib/abstract-document/resources.d.ts +4 -3
- package/lib/abstract-document/resources.d.ts.map +1 -1
- package/lib/abstract-document/resources.js +4 -4
- package/lib/abstract-document/resources.js.map +1 -1
- package/lib/abstract-document/section-elements/group.d.ts +1 -1
- package/lib/abstract-document/section-elements/group.d.ts.map +1 -1
- package/lib/abstract-document/section-elements/group.js +2 -2
- package/lib/abstract-document/section-elements/group.js.map +1 -1
- package/lib/abstract-document/section-elements/page-break.d.ts +2 -2
- package/lib/abstract-document/section-elements/page-break.d.ts.map +1 -1
- package/lib/abstract-document/section-elements/page-break.js +1 -2
- package/lib/abstract-document/section-elements/page-break.js.map +1 -1
- package/lib/abstract-document/section-elements/paragraph.d.ts +2 -2
- package/lib/abstract-document/section-elements/paragraph.d.ts.map +1 -1
- package/lib/abstract-document/section-elements/paragraph.js +2 -2
- package/lib/abstract-document/section-elements/paragraph.js.map +1 -1
- package/lib/abstract-document/section-elements/section-element.d.ts +1 -1
- package/lib/abstract-document/section-elements/section-element.d.ts.map +1 -1
- package/lib/abstract-document/section-elements/section-element.js.map +1 -1
- package/lib/abstract-document/section-elements/table.d.ts +1 -1
- package/lib/abstract-document/section-elements/table.d.ts.map +1 -1
- package/lib/abstract-document/section-elements/table.js +2 -2
- package/lib/abstract-document/section-elements/table.js.map +1 -1
- package/lib/abstract-document/styles/group-style.js +3 -3
- package/lib/abstract-document/styles/page-style.d.ts.map +1 -1
- package/lib/abstract-document/styles/page-style.js +3 -7
- package/lib/abstract-document/styles/page-style.js.map +1 -1
- package/lib/abstract-document/styles/paragraph-style.d.ts +1 -1
- package/lib/abstract-document/styles/paragraph-style.d.ts.map +1 -1
- package/lib/abstract-document/styles/paragraph-style.js +5 -5
- package/lib/abstract-document/styles/paragraph-style.js.map +1 -1
- package/lib/abstract-document/styles/style.d.ts.map +1 -1
- package/lib/abstract-document/styles/style.js.map +1 -1
- package/lib/abstract-document/styles/table-cell-style.d.ts +1 -1
- package/lib/abstract-document/styles/table-cell-style.d.ts.map +1 -1
- package/lib/abstract-document/styles/table-cell-style.js +7 -7
- package/lib/abstract-document/styles/table-cell-style.js.map +1 -1
- package/lib/abstract-document/styles/table-style.d.ts +1 -1
- package/lib/abstract-document/styles/table-style.d.ts.map +1 -1
- package/lib/abstract-document/styles/table-style.js +2 -2
- package/lib/abstract-document/styles/table-style.js.map +1 -1
- package/lib/abstract-document/styles/text-style.d.ts.map +1 -1
- package/lib/abstract-document/styles/text-style.js +16 -21
- package/lib/abstract-document/styles/text-style.js.map +1 -1
- package/lib/abstract-document/table/table-cell.js +2 -2
- package/lib/abstract-document/table/table-row.d.ts +2 -3
- package/lib/abstract-document/table/table-row.d.ts.map +1 -1
- package/lib/abstract-document/table/table-row.js +2 -3
- package/lib/abstract-document/table/table-row.js.map +1 -1
- package/lib/abstract-document/types.d.ts.map +1 -1
- package/lib/abstract-document-exporters/docx/document-container.d.ts +5 -5
- package/lib/abstract-document-exporters/docx/document-container.d.ts.map +1 -1
- package/lib/abstract-document-exporters/docx/document-container.js +14 -13
- package/lib/abstract-document-exporters/docx/document-container.js.map +1 -1
- package/lib/abstract-document-exporters/docx/docx-constants.d.ts.map +1 -1
- package/lib/abstract-document-exporters/docx/docx-constants.js +1 -4
- package/lib/abstract-document-exporters/docx/docx-constants.js.map +1 -1
- package/lib/abstract-document-exporters/docx/ref-container.d.ts +8 -10
- package/lib/abstract-document-exporters/docx/ref-container.d.ts.map +1 -1
- package/lib/abstract-document-exporters/docx/ref-container.js +34 -35
- package/lib/abstract-document-exporters/docx/ref-container.js.map +1 -1
- package/lib/abstract-document-exporters/docx/string-utils.d.ts +2 -1
- package/lib/abstract-document-exporters/docx/string-utils.d.ts.map +1 -1
- package/lib/abstract-document-exporters/docx/string-utils.js +6 -4
- package/lib/abstract-document-exporters/docx/string-utils.js.map +1 -1
- package/lib/abstract-document-exporters/docx/xml-writer.d.ts +12 -33
- package/lib/abstract-document-exporters/docx/xml-writer.d.ts.map +1 -1
- package/lib/abstract-document-exporters/docx/xml-writer.js +243 -249
- package/lib/abstract-document-exporters/docx/xml-writer.js.map +1 -1
- package/lib/abstract-document-exporters/docx2/render-image.d.ts +1 -1
- package/lib/abstract-document-exporters/docx2/render-image.d.ts.map +1 -1
- package/lib/abstract-document-exporters/docx2/render-image.js +4 -16
- package/lib/abstract-document-exporters/docx2/render-image.js.map +1 -1
- package/lib/abstract-document-exporters/docx2/render.d.ts.map +1 -1
- package/lib/abstract-document-exporters/docx2/render.js +28 -38
- package/lib/abstract-document-exporters/docx2/render.js.map +1 -1
- package/lib/abstract-document-exporters/pdf/font.d.ts.map +1 -1
- package/lib/abstract-document-exporters/pdf/font.js +13 -14
- package/lib/abstract-document-exporters/pdf/font.js.map +1 -1
- package/lib/abstract-document-exporters/pdf/header-footer.d.ts +8 -0
- package/lib/abstract-document-exporters/pdf/header-footer.d.ts.map +1 -0
- package/lib/abstract-document-exporters/pdf/header-footer.js +31 -0
- package/lib/abstract-document-exporters/pdf/header-footer.js.map +1 -0
- package/lib/abstract-document-exporters/pdf/measure.d.ts +4 -4
- package/lib/abstract-document-exporters/pdf/measure.d.ts.map +1 -1
- package/lib/abstract-document-exporters/pdf/measure.js +29 -31
- package/lib/abstract-document-exporters/pdf/measure.js.map +1 -1
- package/lib/abstract-document-exporters/pdf/page.d.ts +15 -0
- package/lib/abstract-document-exporters/pdf/page.d.ts.map +1 -0
- package/lib/abstract-document-exporters/pdf/page.js +2 -0
- package/lib/abstract-document-exporters/pdf/page.js.map +1 -0
- package/lib/abstract-document-exporters/pdf/paginate.d.ts +2 -20
- package/lib/abstract-document-exporters/pdf/paginate.d.ts.map +1 -1
- package/lib/abstract-document-exporters/pdf/paginate.js +8 -45
- package/lib/abstract-document-exporters/pdf/paginate.js.map +1 -1
- package/lib/abstract-document-exporters/pdf/pre-process.d.ts.map +1 -1
- package/lib/abstract-document-exporters/pdf/pre-process.js +8 -35
- package/lib/abstract-document-exporters/pdf/pre-process.js.map +1 -1
- package/lib/abstract-document-exporters/pdf/render-image.d.ts.map +1 -1
- package/lib/abstract-document-exporters/pdf/render-image.js +24 -34
- package/lib/abstract-document-exporters/pdf/render-image.js.map +1 -1
- package/lib/abstract-document-exporters/pdf/render.d.ts +4 -3
- package/lib/abstract-document-exporters/pdf/render.d.ts.map +1 -1
- package/lib/abstract-document-exporters/pdf/render.js +60 -50
- package/lib/abstract-document-exporters/pdf/render.js.map +1 -1
- package/lib/abstract-document-exporters/pdf/std-fonts.js +1 -1
- package/lib/abstract-document-exporters/pdf/std-fonts.js.map +1 -1
- package/lib/abstract-document-exporters/pdf/textRunRow.d.ts +3 -3
- package/lib/abstract-document-exporters/pdf/textRunRow.d.ts.map +1 -1
- package/lib/abstract-document-exporters/pdf/textRunRow.js +6 -6
- package/lib/abstract-document-exporters/pdf/textRunRow.js.map +1 -1
- package/lib/abstract-document-exporters/pdf/update-refs.d.ts +1 -1
- package/lib/abstract-document-exporters/pdf/update-refs.d.ts.map +1 -1
- package/lib/abstract-document-exporters/pdf/update-refs.js +3 -2
- package/lib/abstract-document-exporters/pdf/update-refs.js.map +1 -1
- package/lib/abstract-document-exporters/shared/get_resources.d.ts.map +1 -1
- package/lib/abstract-document-exporters/shared/get_resources.js.map +1 -1
- package/lib/abstract-document-jsx/index.d.ts +2 -3
- package/lib/abstract-document-jsx/index.d.ts.map +1 -1
- package/lib/abstract-document-jsx/index.js +10 -6
- package/lib/abstract-document-jsx/index.js.map +1 -1
- package/lib/abstract-document-xml/abstract-doc-of-xml/abstract-doc-of-xml.d.ts +3 -7
- package/lib/abstract-document-xml/abstract-doc-of-xml/abstract-doc-of-xml.d.ts.map +1 -1
- package/lib/abstract-document-xml/abstract-doc-of-xml/abstract-doc-of-xml.js +5 -3
- package/lib/abstract-document-xml/abstract-doc-of-xml/abstract-doc-of-xml.js.map +1 -1
- package/lib/abstract-document-xml/abstract-doc-of-xml/creator.d.ts.map +1 -1
- package/lib/abstract-document-xml/abstract-doc-of-xml/creator.js +1 -3
- package/lib/abstract-document-xml/abstract-doc-of-xml/creator.js.map +1 -1
- package/lib/abstract-document-xml/abstract-doc-of-xml/custom-elements.d.ts.map +1 -1
- package/lib/abstract-document-xml/abstract-doc-of-xml/custom-elements.js +4 -8
- package/lib/abstract-document-xml/abstract-doc-of-xml/custom-elements.js.map +1 -1
- package/lib/abstract-document-xml/xsd-template/xsd-template.js +2 -2
- package/lib/abstract-document-xml/xsd-template/xsd-template.js.map +1 -1
- package/package.json +22 -22
- package/src/abstract-document/abstract-doc.ts +6 -6
- package/src/abstract-document/atoms/atom.ts +3 -3
- package/src/abstract-document/default-styles.ts +1 -1
- package/src/abstract-document/markdown/markdown.ts +5 -5
- package/src/abstract-document/numberings/numbering-definition.ts +2 -2
- package/src/abstract-document/numberings/numbering-level-definition.ts +2 -2
- package/src/abstract-document/page/master-page.ts +2 -2
- package/src/abstract-document/page/section.ts +3 -3
- package/src/abstract-document/primitives/font.ts +1 -12
- package/src/abstract-document/primitives/layout-foundation-color.ts +1 -4
- package/src/abstract-document/primitives/layout-foundation.ts +1 -4
- package/src/abstract-document/resources.ts +9 -14
- package/src/abstract-document/section-elements/group.ts +3 -3
- package/src/abstract-document/section-elements/page-break.ts +2 -3
- package/src/abstract-document/section-elements/paragraph.ts +4 -4
- package/src/abstract-document/section-elements/section-element.ts +1 -1
- package/src/abstract-document/section-elements/table.ts +3 -3
- package/src/abstract-document/styles/group-style.ts +3 -3
- package/src/abstract-document/styles/page-style.ts +3 -7
- package/src/abstract-document/styles/paragraph-style.ts +6 -14
- package/src/abstract-document/styles/style.ts +1 -5
- package/src/abstract-document/styles/table-cell-style.ts +8 -11
- package/src/abstract-document/styles/table-style.ts +3 -8
- package/src/abstract-document/styles/text-style.ts +16 -21
- package/src/abstract-document/table/table-cell.ts +2 -2
- package/src/abstract-document/table/table-row.ts +3 -4
- package/src/abstract-document/types.ts +0 -1
- package/src/abstract-document-exporters/docx/document-container.ts +24 -13
- package/src/abstract-document-exporters/docx/docx-constants.ts +2 -6
- package/src/abstract-document-exporters/docx/ref-container.ts +48 -41
- package/src/abstract-document-exporters/docx/string-utils.ts +6 -6
- package/src/abstract-document-exporters/docx/xml-writer.ts +261 -266
- package/src/abstract-document-exporters/docx2/render-image.ts +15 -49
- package/src/abstract-document-exporters/docx2/render.ts +64 -139
- package/src/abstract-document-exporters/pdf/font.ts +17 -23
- package/src/abstract-document-exporters/pdf/header-footer.ts +43 -0
- package/src/abstract-document-exporters/pdf/measure.ts +50 -103
- package/src/abstract-document-exporters/pdf/page.ts +16 -0
- package/src/abstract-document-exporters/pdf/paginate.ts +29 -125
- package/src/abstract-document-exporters/pdf/pre-process.ts +11 -47
- package/src/abstract-document-exporters/pdf/render-image.ts +29 -46
- package/src/abstract-document-exporters/pdf/render.ts +84 -129
- package/src/abstract-document-exporters/pdf/std-fonts.ts +1 -1
- package/src/abstract-document-exporters/pdf/textRunRow.ts +12 -23
- package/src/abstract-document-exporters/pdf/update-refs.ts +10 -33
- package/src/abstract-document-exporters/shared/get_resources.ts +4 -4
- package/src/abstract-document-jsx/index.ts +38 -26
- package/src/abstract-document-xml/abstract-doc-of-xml/abstract-doc-of-xml.ts +14 -26
- package/src/abstract-document-xml/abstract-doc-of-xml/creator.ts +10 -28
- package/src/abstract-document-xml/abstract-doc-of-xml/custom-elements.tsx +8 -30
- package/src/abstract-document-xml/xsd-template/xsd-template.ts +2 -2
|
@@ -1,21 +1,3 @@
|
|
|
1
|
-
// interface XmlElement {
|
|
2
|
-
// localName: string,
|
|
3
|
-
// ns: string | undefined,
|
|
4
|
-
// prefix: string | undefined,
|
|
5
|
-
// attributes: Array<XmlAttribute>
|
|
6
|
-
// parent: XmlElement,
|
|
7
|
-
// children: Array<XmlElement>
|
|
8
|
-
// }
|
|
9
|
-
|
|
10
|
-
// interface XmlAttribute {
|
|
11
|
-
// localName: string,
|
|
12
|
-
// value: string,
|
|
13
|
-
// ns: string | undefined,
|
|
14
|
-
// prefix: string | undefined
|
|
15
|
-
// }
|
|
16
|
-
|
|
17
|
-
//tslint:disable
|
|
18
|
-
|
|
19
1
|
interface XmlNamespaceDictionary {
|
|
20
2
|
[ns: string]: string;
|
|
21
3
|
}
|
|
@@ -28,307 +10,320 @@ interface XmlElementContext {
|
|
|
28
10
|
|
|
29
11
|
type XmlWriterState = "Start" | "Prolog" | "Element" | "Content" | "Error" | "Closed";
|
|
30
12
|
|
|
31
|
-
export
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
if (this._state === "Start" || this._state === "Prolog") {
|
|
44
|
-
let bufBld: string = "";
|
|
45
|
-
bufBld += "version=" + XmlWriter.quoteChar + "1.0" + XmlWriter.quoteChar;
|
|
46
|
-
if (this._encoding != null) {
|
|
47
|
-
bufBld += ` encoding=${XmlWriter.quoteChar}${this._encoding}${XmlWriter.quoteChar}`;
|
|
48
|
-
}
|
|
49
|
-
if (standalone) {
|
|
50
|
-
const standAlone = standalone ? "yes" : "no";
|
|
51
|
-
bufBld += ` standalone=${XmlWriter.quoteChar}${standAlone}${XmlWriter.quoteChar}`;
|
|
52
|
-
}
|
|
53
|
-
this.writeIndent(this._state !== "Start");
|
|
54
|
-
const xmlProcessingIntruction = `<?xml ${bufBld}?>`;
|
|
55
|
-
this.write(xmlProcessingIntruction);
|
|
56
|
-
} else {
|
|
57
|
-
this.throwInvalidState();
|
|
58
|
-
}
|
|
59
|
-
// Set next state
|
|
60
|
-
this._state = "Prolog";
|
|
61
|
-
} catch (e) {
|
|
62
|
-
this._state = "Error";
|
|
63
|
-
throw e;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
WriteComment(text: string): void {
|
|
68
|
-
try {
|
|
69
|
-
if (this._state === "Prolog" || this._state === "Content") {
|
|
70
|
-
if (text && (text.indexOf("--") >= 0 || (text.length != 0 && text[text.length - 1] == "-"))) {
|
|
71
|
-
throw new Error("Xml_InvalidCommentChars");
|
|
72
|
-
}
|
|
73
|
-
text = text || "";
|
|
74
|
-
this.writeIndent();
|
|
75
|
-
this.write(`<!--${text}-->`);
|
|
76
|
-
} else {
|
|
77
|
-
this.throwInvalidState();
|
|
78
|
-
}
|
|
79
|
-
// Set next state
|
|
80
|
-
// For XML-comments this case the next state should be the same as the previous one!
|
|
81
|
-
} catch (e) {
|
|
82
|
-
this._state = "Error";
|
|
83
|
-
throw e;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
WriteStartElement(localName: string): void;
|
|
88
|
-
WriteStartElement(localName: string, ns: string): void;
|
|
89
|
-
WriteStartElement(localName: string, ns: string, prefix: string): void;
|
|
90
|
-
WriteStartElement(localName: string, ns?: string, prefix?: string): void {
|
|
91
|
-
try {
|
|
92
|
-
if (
|
|
93
|
-
this._state === "Start" ||
|
|
94
|
-
this._state === "Prolog" ||
|
|
95
|
-
this._state === "Element" ||
|
|
96
|
-
this._state === "Content"
|
|
97
|
-
) {
|
|
98
|
-
if (this._state === "Element") {
|
|
99
|
-
// Close previous start-element
|
|
100
|
-
this.completeStartElement(false, this.peekContextStack().namespaces);
|
|
101
|
-
}
|
|
13
|
+
export interface XmlWriter {
|
|
14
|
+
WriteStartDocument: (standalone?: boolean) => void;
|
|
15
|
+
WriteComment: (text: string) => void;
|
|
16
|
+
WriteStartElement: (localName: string, ns?: string, prefix?: string) => void;
|
|
17
|
+
WriteString: (text: string) => void;
|
|
18
|
+
WriteElementString: (localName: string, value: string, ns: string, prefix: string) => void;
|
|
19
|
+
WriteAttributeString: (localName: string, value: string, ns?: string, prefix?: string) => void;
|
|
20
|
+
WriteEndElement: () => void;
|
|
21
|
+
Flush: () => void;
|
|
22
|
+
close: () => void;
|
|
23
|
+
getXml: () => string;
|
|
24
|
+
}
|
|
102
25
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
namespaces: {},
|
|
108
|
-
contentStringWritten: false,
|
|
109
|
-
});
|
|
26
|
+
export function createXmlWriter(): XmlWriter {
|
|
27
|
+
const quoteChar = '"';
|
|
28
|
+
const encoding = "utf-8";
|
|
29
|
+
const indentSize = 2;
|
|
110
30
|
|
|
111
|
-
|
|
112
|
-
|
|
31
|
+
let xml = "";
|
|
32
|
+
let state: XmlWriterState = "Start";
|
|
33
|
+
const contextStack: Array<XmlElementContext> = [];
|
|
113
34
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
}
|
|
117
|
-
} else {
|
|
118
|
-
this.throwInvalidState();
|
|
119
|
-
}
|
|
120
|
-
// Set next state
|
|
121
|
-
this._state = "Element";
|
|
122
|
-
} catch (e) {
|
|
123
|
-
this._state = "Error";
|
|
124
|
-
throw e;
|
|
125
|
-
}
|
|
35
|
+
function write(text: string): void {
|
|
36
|
+
xml += text;
|
|
126
37
|
}
|
|
127
38
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
if (this._state === "Content" || this._state === "Element") {
|
|
131
|
-
if (this._state === "Element") {
|
|
132
|
-
this.completeStartElement(false, this.peekContextStack().namespaces);
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
// Flag that content string has been written
|
|
136
|
-
this.peekContextStack().contentStringWritten = true;
|
|
137
|
-
|
|
138
|
-
this.write(text);
|
|
139
|
-
} else {
|
|
140
|
-
this.throwInvalidState();
|
|
141
|
-
}
|
|
142
|
-
// Set next state
|
|
143
|
-
this._state = "Content";
|
|
144
|
-
} catch (e) {
|
|
145
|
-
this._state = "Error";
|
|
146
|
-
throw e;
|
|
147
|
-
}
|
|
39
|
+
function peekContextStack(): XmlElementContext {
|
|
40
|
+
return contextStack[contextStack.length - 1];
|
|
148
41
|
}
|
|
149
42
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
if (value && value.length > 0) this.WriteString(value);
|
|
153
|
-
this.WriteEndElement();
|
|
43
|
+
function throwInvalidState(): void {
|
|
44
|
+
throw new Error(`Invalid state '${state}'.`);
|
|
154
45
|
}
|
|
155
46
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
if (this._state === "Element") {
|
|
162
|
-
if (ns) {
|
|
163
|
-
// Seems like a prefix is always invented for attributes if not provided
|
|
164
|
-
// (but for elements it is OK to have blank prefix)
|
|
165
|
-
if (!prefix || prefix.length === 0) {
|
|
166
|
-
prefix = this.getPrefixFromAncestors(ns);
|
|
167
|
-
if (!prefix) {
|
|
168
|
-
prefix = XmlWriter.generatePrefix(this.peekContextStack().namespaces);
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
this.addNamespace(ns, prefix);
|
|
172
|
-
}
|
|
173
|
-
const attributeName: string = XmlWriter.getPrefixedName(localName, prefix);
|
|
174
|
-
this.write(` ${attributeName}=${XmlWriter.quoteChar}${value}${XmlWriter.quoteChar}`);
|
|
175
|
-
} else {
|
|
176
|
-
this.throwInvalidState();
|
|
47
|
+
function generatePrefix(namespaces: XmlNamespaceDictionary): string {
|
|
48
|
+
let i = 1;
|
|
49
|
+
while (i < 100) {
|
|
50
|
+
if (!Object.hasOwn(namespaces, "p" + i)) {
|
|
51
|
+
break;
|
|
177
52
|
}
|
|
178
|
-
|
|
179
|
-
this._state = "Element";
|
|
180
|
-
} catch (e) {
|
|
181
|
-
this._state = "Error";
|
|
182
|
-
throw e;
|
|
53
|
+
i++;
|
|
183
54
|
}
|
|
55
|
+
return "p" + i;
|
|
184
56
|
}
|
|
185
57
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
if (this._state === "Element") {
|
|
193
|
-
this.completeStartElement(true, context.namespaces);
|
|
194
|
-
} else {
|
|
195
|
-
// Do not indent if there is text content written since
|
|
196
|
-
// the indention would be included in the actual text content
|
|
197
|
-
if (!context.contentStringWritten) this.writeIndent();
|
|
198
|
-
this.write(`</${context.elementName}>`);
|
|
199
|
-
}
|
|
200
|
-
this._contextStack.pop();
|
|
201
|
-
} else {
|
|
202
|
-
this.throwInvalidState();
|
|
203
|
-
}
|
|
204
|
-
// Set next state
|
|
205
|
-
if (this._contextStack.length == 0) {
|
|
206
|
-
this._state = "Closed";
|
|
207
|
-
} else {
|
|
208
|
-
this._state = "Content";
|
|
209
|
-
}
|
|
210
|
-
} catch (e) {
|
|
211
|
-
this._state = "Error";
|
|
212
|
-
throw e;
|
|
58
|
+
function getPrefixedName(localName: string, prefix: string | undefined): string {
|
|
59
|
+
if (prefix) {
|
|
60
|
+
return `${prefix}:${localName}`;
|
|
61
|
+
} else {
|
|
62
|
+
// oxlint-disable-next-line typescript/no-unnecessary-template-expression
|
|
63
|
+
return `${localName}`;
|
|
213
64
|
}
|
|
214
65
|
}
|
|
215
66
|
|
|
216
|
-
Flush(): void {
|
|
217
|
-
this.close();
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
close(): void {
|
|
221
|
-
this._state = "Closed";
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
getXml(): string {
|
|
225
|
-
return this._xml;
|
|
226
|
-
}
|
|
227
|
-
|
|
228
67
|
// Find existing prefix for a specified namespace
|
|
229
|
-
|
|
230
|
-
for (const context of
|
|
68
|
+
function getPrefixFromAncestors(ns: string): string | undefined {
|
|
69
|
+
for (const context of contextStack) {
|
|
231
70
|
for (const prefix of Object.keys(context.namespaces)) {
|
|
232
|
-
if (context.namespaces[prefix] === ns)
|
|
71
|
+
if (context.namespaces[prefix] === ns) {
|
|
72
|
+
return prefix;
|
|
73
|
+
}
|
|
233
74
|
}
|
|
234
75
|
}
|
|
235
76
|
return undefined;
|
|
236
77
|
}
|
|
237
78
|
|
|
238
|
-
|
|
239
|
-
return this._contextStack[this._contextStack.length - 1];
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
private static generatePrefix(namespaces: XmlNamespaceDictionary): string {
|
|
243
|
-
let i = 1;
|
|
244
|
-
while (i < 100) {
|
|
245
|
-
if (!namespaces.hasOwnProperty("p" + i)) break;
|
|
246
|
-
i++;
|
|
247
|
-
}
|
|
248
|
-
return "p" + i;
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
private completeStartElement(close: boolean, namespaces: XmlNamespaceDictionary): void {
|
|
252
|
-
this.writeNamespaceAttributes(namespaces);
|
|
253
|
-
if (close) {
|
|
254
|
-
this.write(" />");
|
|
255
|
-
} else {
|
|
256
|
-
this.write(">");
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
private throwInvalidState(): void {
|
|
261
|
-
throw new Error(`Invalid state '${this._state}'.`);
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
private addNamespace(ns: string, prefix: string | undefined): void {
|
|
79
|
+
function addNamespace(ns: string, prefix: string | undefined): void {
|
|
265
80
|
// Make sure we don't duplicate prefixes
|
|
266
|
-
prefix
|
|
267
|
-
this.peekContextStack().namespaces[prefix] = ns;
|
|
81
|
+
peekContextStack().namespaces[prefix ?? ""] = ns;
|
|
268
82
|
}
|
|
269
83
|
|
|
270
|
-
|
|
271
|
-
if (
|
|
84
|
+
function writeIndent(newLine: boolean = true): void {
|
|
85
|
+
if (indentSize > 0) {
|
|
272
86
|
if (newLine) {
|
|
273
|
-
|
|
87
|
+
write("\n");
|
|
274
88
|
}
|
|
275
|
-
if (!(
|
|
276
|
-
for (let i = 0; i <
|
|
277
|
-
|
|
89
|
+
if (!(state === "Start" || state === "Prolog")) {
|
|
90
|
+
for (let i = 0; i < indentSize * (contextStack.length - 1); i++) {
|
|
91
|
+
write(" ");
|
|
278
92
|
}
|
|
279
93
|
}
|
|
280
94
|
}
|
|
281
95
|
}
|
|
282
96
|
|
|
283
|
-
|
|
284
|
-
this._xml += text;
|
|
285
|
-
//console.log(`xml: '${this._xml}'`,);
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
private writeNamespaceAttributes(namespaces: XmlNamespaceDictionary): void {
|
|
289
|
-
// We should not repeat namespaces that exists in our ancestors
|
|
290
|
-
// Check which of our current namespaces that does not exist in this ancestor
|
|
291
|
-
const toWrite = this.getNamespacesNotInAncestors(namespaces);
|
|
292
|
-
|
|
293
|
-
// Write the ones that was not found in ancestor
|
|
294
|
-
for (const prefix of Object.keys(toWrite)) {
|
|
295
|
-
this.writeNamespaceAttribute(namespaces[prefix], prefix);
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
private getNamespacesNotInAncestors(namespaces: XmlNamespaceDictionary): XmlNamespaceDictionary {
|
|
97
|
+
function getNamespacesNotInAncestors(namespaces: XmlNamespaceDictionary): XmlNamespaceDictionary {
|
|
300
98
|
const toWrite: XmlNamespaceDictionary = {};
|
|
301
99
|
for (const prefix of Object.keys(namespaces)) {
|
|
302
100
|
let exists: boolean = false;
|
|
303
101
|
// Don't check the current (last) context in the stack
|
|
304
|
-
for (let i = 0; i <
|
|
305
|
-
const context =
|
|
306
|
-
if (context.namespaces[prefix]
|
|
102
|
+
for (let i = 0; i < contextStack.length - 1; i++) {
|
|
103
|
+
const context = contextStack[i];
|
|
104
|
+
if (context.namespaces[prefix] === namespaces[prefix]) {
|
|
307
105
|
exists = true;
|
|
308
106
|
break;
|
|
309
107
|
}
|
|
310
108
|
}
|
|
311
|
-
if (!exists)
|
|
109
|
+
if (!exists) {
|
|
110
|
+
toWrite[prefix] = namespaces[prefix];
|
|
111
|
+
}
|
|
312
112
|
}
|
|
313
113
|
return toWrite;
|
|
314
114
|
}
|
|
315
115
|
|
|
316
|
-
|
|
116
|
+
function writeNamespaceAttribute(ns: string, prefix: string | undefined): void {
|
|
317
117
|
if (ns) {
|
|
318
118
|
if (prefix) {
|
|
319
|
-
|
|
119
|
+
write(` xmlns:${prefix}="${ns}"`);
|
|
320
120
|
} else {
|
|
321
|
-
|
|
121
|
+
write(` xmlns="${ns}"`);
|
|
322
122
|
}
|
|
323
123
|
}
|
|
324
124
|
}
|
|
325
125
|
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
126
|
+
function writeNamespaceAttributes(namespaces: XmlNamespaceDictionary): void {
|
|
127
|
+
// We should not repeat namespaces that exists in our ancestors
|
|
128
|
+
// Check which of our current namespaces that does not exist in this ancestor
|
|
129
|
+
const toWrite = getNamespacesNotInAncestors(namespaces);
|
|
130
|
+
|
|
131
|
+
// Write the ones that was not found in ancestor
|
|
132
|
+
for (const prefix of Object.keys(toWrite)) {
|
|
133
|
+
writeNamespaceAttribute(namespaces[prefix], prefix);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function completeStartElement(closeElement: boolean, namespaces: XmlNamespaceDictionary): void {
|
|
138
|
+
writeNamespaceAttributes(namespaces);
|
|
139
|
+
if (closeElement) {
|
|
140
|
+
write(" />");
|
|
329
141
|
} else {
|
|
330
|
-
|
|
331
|
-
return `${localName}`;
|
|
142
|
+
write(">");
|
|
332
143
|
}
|
|
333
144
|
}
|
|
145
|
+
|
|
146
|
+
const self: XmlWriter = {
|
|
147
|
+
WriteStartDocument(standalone?: boolean): void {
|
|
148
|
+
try {
|
|
149
|
+
if (state === "Start" || state === "Prolog") {
|
|
150
|
+
let bufBld: string = "";
|
|
151
|
+
bufBld += "version=" + quoteChar + "1.0" + quoteChar;
|
|
152
|
+
if (encoding !== null) {
|
|
153
|
+
bufBld += ` encoding=${quoteChar}${encoding}${quoteChar}`;
|
|
154
|
+
}
|
|
155
|
+
if (standalone) {
|
|
156
|
+
const standAlone = standalone ? "yes" : "no";
|
|
157
|
+
bufBld += ` standalone=${quoteChar}${standAlone}${quoteChar}`;
|
|
158
|
+
}
|
|
159
|
+
writeIndent(state !== "Start");
|
|
160
|
+
const xmlProcessingIntruction = `<?xml ${bufBld}?>`;
|
|
161
|
+
write(xmlProcessingIntruction);
|
|
162
|
+
} else {
|
|
163
|
+
throwInvalidState();
|
|
164
|
+
}
|
|
165
|
+
// Set next state
|
|
166
|
+
state = "Prolog";
|
|
167
|
+
} catch (e) {
|
|
168
|
+
state = "Error";
|
|
169
|
+
throw e;
|
|
170
|
+
}
|
|
171
|
+
},
|
|
172
|
+
|
|
173
|
+
WriteComment(text: string): void {
|
|
174
|
+
try {
|
|
175
|
+
if (state === "Prolog" || state === "Content") {
|
|
176
|
+
if (text && (text.indexOf("--") >= 0 || (text.length !== 0 && text.endsWith("-")))) {
|
|
177
|
+
throw new Error("Xml_InvalidCommentChars");
|
|
178
|
+
}
|
|
179
|
+
text = text || "";
|
|
180
|
+
writeIndent();
|
|
181
|
+
write(`<!--${text}-->`);
|
|
182
|
+
} else {
|
|
183
|
+
throwInvalidState();
|
|
184
|
+
}
|
|
185
|
+
// Set next state
|
|
186
|
+
// For XML-comments this case the next state should be the same as the previous one!
|
|
187
|
+
} catch (e) {
|
|
188
|
+
state = "Error";
|
|
189
|
+
throw e;
|
|
190
|
+
}
|
|
191
|
+
},
|
|
192
|
+
|
|
193
|
+
WriteStartElement(localName: string, ns?: string, prefix?: string): void {
|
|
194
|
+
try {
|
|
195
|
+
if (state === "Start" || state === "Prolog" || state === "Element" || state === "Content") {
|
|
196
|
+
if (state === "Element") {
|
|
197
|
+
// Close previous start-element
|
|
198
|
+
completeStartElement(false, peekContextStack().namespaces);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// Push new element-context to stack
|
|
202
|
+
const elementName: string = getPrefixedName(localName, prefix);
|
|
203
|
+
contextStack.push({
|
|
204
|
+
elementName,
|
|
205
|
+
namespaces: {},
|
|
206
|
+
contentStringWritten: false,
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
writeIndent(state !== "Start");
|
|
210
|
+
write("<" + elementName);
|
|
211
|
+
|
|
212
|
+
if (ns) {
|
|
213
|
+
addNamespace(ns, prefix);
|
|
214
|
+
}
|
|
215
|
+
} else {
|
|
216
|
+
throwInvalidState();
|
|
217
|
+
}
|
|
218
|
+
// Set next state
|
|
219
|
+
state = "Element";
|
|
220
|
+
} catch (e) {
|
|
221
|
+
state = "Error";
|
|
222
|
+
throw e;
|
|
223
|
+
}
|
|
224
|
+
},
|
|
225
|
+
|
|
226
|
+
WriteString(text: string): void {
|
|
227
|
+
try {
|
|
228
|
+
if (state === "Content" || state === "Element") {
|
|
229
|
+
if (state === "Element") {
|
|
230
|
+
completeStartElement(false, peekContextStack().namespaces);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Flag that content string has been written
|
|
234
|
+
peekContextStack().contentStringWritten = true;
|
|
235
|
+
|
|
236
|
+
write(text);
|
|
237
|
+
} else {
|
|
238
|
+
throwInvalidState();
|
|
239
|
+
}
|
|
240
|
+
// Set next state
|
|
241
|
+
state = "Content";
|
|
242
|
+
} catch (e) {
|
|
243
|
+
state = "Error";
|
|
244
|
+
throw e;
|
|
245
|
+
}
|
|
246
|
+
},
|
|
247
|
+
|
|
248
|
+
WriteElementString(localName: string, value: string, ns: string, prefix: string): void {
|
|
249
|
+
self.WriteStartElement(localName, ns, prefix);
|
|
250
|
+
if (value && value.length > 0) {
|
|
251
|
+
self.WriteString(value);
|
|
252
|
+
}
|
|
253
|
+
self.WriteEndElement();
|
|
254
|
+
},
|
|
255
|
+
|
|
256
|
+
WriteAttributeString(localName: string, value: string, ns?: string, prefix?: string): void {
|
|
257
|
+
try {
|
|
258
|
+
if (state === "Element") {
|
|
259
|
+
if (ns) {
|
|
260
|
+
// Seems like a prefix is always invented for attributes if not provided
|
|
261
|
+
// (but for elements it is OK to have blank prefix)
|
|
262
|
+
if (!prefix || prefix.length === 0) {
|
|
263
|
+
prefix = getPrefixFromAncestors(ns);
|
|
264
|
+
// oxlint-disable-next-line typescript/prefer-nullish-coalescing -- an ancestor-registered blank prefix ("") must still be replaced here, per the comment above
|
|
265
|
+
if (!prefix) {
|
|
266
|
+
prefix = generatePrefix(peekContextStack().namespaces);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
addNamespace(ns, prefix);
|
|
270
|
+
}
|
|
271
|
+
const attributeName: string = getPrefixedName(localName, prefix);
|
|
272
|
+
write(` ${attributeName}=${quoteChar}${value}${quoteChar}`);
|
|
273
|
+
} else {
|
|
274
|
+
throwInvalidState();
|
|
275
|
+
}
|
|
276
|
+
// Set next state
|
|
277
|
+
state = "Element";
|
|
278
|
+
} catch (e) {
|
|
279
|
+
state = "Error";
|
|
280
|
+
throw e;
|
|
281
|
+
}
|
|
282
|
+
},
|
|
283
|
+
|
|
284
|
+
WriteEndElement(): void {
|
|
285
|
+
try {
|
|
286
|
+
if (state === "Content" || state === "Element") {
|
|
287
|
+
const context = peekContextStack();
|
|
288
|
+
// Only close in itself if no content
|
|
289
|
+
if (state === "Element") {
|
|
290
|
+
completeStartElement(true, context.namespaces);
|
|
291
|
+
} else {
|
|
292
|
+
// Do not indent if there is text content written since
|
|
293
|
+
// the indention would be included in the actual text content
|
|
294
|
+
if (!context.contentStringWritten) {
|
|
295
|
+
writeIndent();
|
|
296
|
+
}
|
|
297
|
+
write(`</${context.elementName}>`);
|
|
298
|
+
}
|
|
299
|
+
contextStack.pop();
|
|
300
|
+
} else {
|
|
301
|
+
throwInvalidState();
|
|
302
|
+
}
|
|
303
|
+
// Set next state
|
|
304
|
+
if (contextStack.length === 0) {
|
|
305
|
+
state = "Closed";
|
|
306
|
+
} else {
|
|
307
|
+
state = "Content";
|
|
308
|
+
}
|
|
309
|
+
} catch (e) {
|
|
310
|
+
state = "Error";
|
|
311
|
+
throw e;
|
|
312
|
+
}
|
|
313
|
+
},
|
|
314
|
+
|
|
315
|
+
Flush(): void {
|
|
316
|
+
self.close();
|
|
317
|
+
},
|
|
318
|
+
|
|
319
|
+
close(): void {
|
|
320
|
+
state = "Closed";
|
|
321
|
+
},
|
|
322
|
+
|
|
323
|
+
getXml(): string {
|
|
324
|
+
return xml;
|
|
325
|
+
},
|
|
326
|
+
};
|
|
327
|
+
|
|
328
|
+
return self;
|
|
334
329
|
}
|