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.
Files changed (214) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/lib/abstract-document/abstract-doc.d.ts.map +1 -1
  3. package/lib/abstract-document/abstract-doc.js +2 -2
  4. package/lib/abstract-document/atoms/atom.d.ts +3 -3
  5. package/lib/abstract-document/atoms/atom.d.ts.map +1 -1
  6. package/lib/abstract-document/default-styles.d.ts.map +1 -1
  7. package/lib/abstract-document/default-styles.js.map +1 -1
  8. package/lib/abstract-document/markdown/markdown.d.ts.map +1 -1
  9. package/lib/abstract-document/markdown/markdown.js +4 -4
  10. package/lib/abstract-document/markdown/markdown.js.map +1 -1
  11. package/lib/abstract-document/numberings/numbering-definition.d.ts +2 -2
  12. package/lib/abstract-document/numberings/numbering-definition.d.ts.map +1 -1
  13. package/lib/abstract-document/numberings/numbering-level-definition.js +2 -2
  14. package/lib/abstract-document/page/master-page.d.ts +1 -1
  15. package/lib/abstract-document/page/master-page.d.ts.map +1 -1
  16. package/lib/abstract-document/page/master-page.js +1 -1
  17. package/lib/abstract-document/page/master-page.js.map +1 -1
  18. package/lib/abstract-document/page/section.d.ts +1 -1
  19. package/lib/abstract-document/page/section.d.ts.map +1 -1
  20. package/lib/abstract-document/page/section.js +2 -2
  21. package/lib/abstract-document/page/section.js.map +1 -1
  22. package/lib/abstract-document/primitives/font.d.ts +1 -1
  23. package/lib/abstract-document/primitives/font.d.ts.map +1 -1
  24. package/lib/abstract-document/primitives/font.js +1 -1
  25. package/lib/abstract-document/primitives/font.js.map +1 -1
  26. package/lib/abstract-document/primitives/layout-foundation-color.d.ts.map +1 -1
  27. package/lib/abstract-document/primitives/layout-foundation-color.js.map +1 -1
  28. package/lib/abstract-document/primitives/layout-foundation.d.ts.map +1 -1
  29. package/lib/abstract-document/primitives/layout-foundation.js.map +1 -1
  30. package/lib/abstract-document/resources.d.ts +4 -3
  31. package/lib/abstract-document/resources.d.ts.map +1 -1
  32. package/lib/abstract-document/resources.js +4 -4
  33. package/lib/abstract-document/resources.js.map +1 -1
  34. package/lib/abstract-document/section-elements/group.d.ts +1 -1
  35. package/lib/abstract-document/section-elements/group.d.ts.map +1 -1
  36. package/lib/abstract-document/section-elements/group.js +2 -2
  37. package/lib/abstract-document/section-elements/group.js.map +1 -1
  38. package/lib/abstract-document/section-elements/page-break.d.ts +2 -2
  39. package/lib/abstract-document/section-elements/page-break.d.ts.map +1 -1
  40. package/lib/abstract-document/section-elements/page-break.js +1 -2
  41. package/lib/abstract-document/section-elements/page-break.js.map +1 -1
  42. package/lib/abstract-document/section-elements/paragraph.d.ts +2 -2
  43. package/lib/abstract-document/section-elements/paragraph.d.ts.map +1 -1
  44. package/lib/abstract-document/section-elements/paragraph.js +2 -2
  45. package/lib/abstract-document/section-elements/paragraph.js.map +1 -1
  46. package/lib/abstract-document/section-elements/section-element.d.ts +1 -1
  47. package/lib/abstract-document/section-elements/section-element.d.ts.map +1 -1
  48. package/lib/abstract-document/section-elements/section-element.js.map +1 -1
  49. package/lib/abstract-document/section-elements/table.d.ts +1 -1
  50. package/lib/abstract-document/section-elements/table.d.ts.map +1 -1
  51. package/lib/abstract-document/section-elements/table.js +2 -2
  52. package/lib/abstract-document/section-elements/table.js.map +1 -1
  53. package/lib/abstract-document/styles/group-style.js +3 -3
  54. package/lib/abstract-document/styles/page-style.d.ts.map +1 -1
  55. package/lib/abstract-document/styles/page-style.js +3 -7
  56. package/lib/abstract-document/styles/page-style.js.map +1 -1
  57. package/lib/abstract-document/styles/paragraph-style.d.ts +1 -1
  58. package/lib/abstract-document/styles/paragraph-style.d.ts.map +1 -1
  59. package/lib/abstract-document/styles/paragraph-style.js +5 -5
  60. package/lib/abstract-document/styles/paragraph-style.js.map +1 -1
  61. package/lib/abstract-document/styles/style.d.ts.map +1 -1
  62. package/lib/abstract-document/styles/style.js.map +1 -1
  63. package/lib/abstract-document/styles/table-cell-style.d.ts +1 -1
  64. package/lib/abstract-document/styles/table-cell-style.d.ts.map +1 -1
  65. package/lib/abstract-document/styles/table-cell-style.js +7 -7
  66. package/lib/abstract-document/styles/table-cell-style.js.map +1 -1
  67. package/lib/abstract-document/styles/table-style.d.ts +1 -1
  68. package/lib/abstract-document/styles/table-style.d.ts.map +1 -1
  69. package/lib/abstract-document/styles/table-style.js +2 -2
  70. package/lib/abstract-document/styles/table-style.js.map +1 -1
  71. package/lib/abstract-document/styles/text-style.d.ts.map +1 -1
  72. package/lib/abstract-document/styles/text-style.js +16 -21
  73. package/lib/abstract-document/styles/text-style.js.map +1 -1
  74. package/lib/abstract-document/table/table-cell.js +2 -2
  75. package/lib/abstract-document/table/table-row.d.ts +2 -3
  76. package/lib/abstract-document/table/table-row.d.ts.map +1 -1
  77. package/lib/abstract-document/table/table-row.js +2 -3
  78. package/lib/abstract-document/table/table-row.js.map +1 -1
  79. package/lib/abstract-document/types.d.ts.map +1 -1
  80. package/lib/abstract-document-exporters/docx/document-container.d.ts +5 -5
  81. package/lib/abstract-document-exporters/docx/document-container.d.ts.map +1 -1
  82. package/lib/abstract-document-exporters/docx/document-container.js +14 -13
  83. package/lib/abstract-document-exporters/docx/document-container.js.map +1 -1
  84. package/lib/abstract-document-exporters/docx/docx-constants.d.ts.map +1 -1
  85. package/lib/abstract-document-exporters/docx/docx-constants.js +1 -4
  86. package/lib/abstract-document-exporters/docx/docx-constants.js.map +1 -1
  87. package/lib/abstract-document-exporters/docx/ref-container.d.ts +8 -10
  88. package/lib/abstract-document-exporters/docx/ref-container.d.ts.map +1 -1
  89. package/lib/abstract-document-exporters/docx/ref-container.js +34 -35
  90. package/lib/abstract-document-exporters/docx/ref-container.js.map +1 -1
  91. package/lib/abstract-document-exporters/docx/string-utils.d.ts +2 -1
  92. package/lib/abstract-document-exporters/docx/string-utils.d.ts.map +1 -1
  93. package/lib/abstract-document-exporters/docx/string-utils.js +6 -4
  94. package/lib/abstract-document-exporters/docx/string-utils.js.map +1 -1
  95. package/lib/abstract-document-exporters/docx/xml-writer.d.ts +12 -33
  96. package/lib/abstract-document-exporters/docx/xml-writer.d.ts.map +1 -1
  97. package/lib/abstract-document-exporters/docx/xml-writer.js +243 -249
  98. package/lib/abstract-document-exporters/docx/xml-writer.js.map +1 -1
  99. package/lib/abstract-document-exporters/docx2/render-image.d.ts +1 -1
  100. package/lib/abstract-document-exporters/docx2/render-image.d.ts.map +1 -1
  101. package/lib/abstract-document-exporters/docx2/render-image.js +4 -16
  102. package/lib/abstract-document-exporters/docx2/render-image.js.map +1 -1
  103. package/lib/abstract-document-exporters/docx2/render.d.ts.map +1 -1
  104. package/lib/abstract-document-exporters/docx2/render.js +28 -38
  105. package/lib/abstract-document-exporters/docx2/render.js.map +1 -1
  106. package/lib/abstract-document-exporters/pdf/font.d.ts.map +1 -1
  107. package/lib/abstract-document-exporters/pdf/font.js +13 -14
  108. package/lib/abstract-document-exporters/pdf/font.js.map +1 -1
  109. package/lib/abstract-document-exporters/pdf/header-footer.d.ts +8 -0
  110. package/lib/abstract-document-exporters/pdf/header-footer.d.ts.map +1 -0
  111. package/lib/abstract-document-exporters/pdf/header-footer.js +31 -0
  112. package/lib/abstract-document-exporters/pdf/header-footer.js.map +1 -0
  113. package/lib/abstract-document-exporters/pdf/measure.d.ts +4 -4
  114. package/lib/abstract-document-exporters/pdf/measure.d.ts.map +1 -1
  115. package/lib/abstract-document-exporters/pdf/measure.js +29 -31
  116. package/lib/abstract-document-exporters/pdf/measure.js.map +1 -1
  117. package/lib/abstract-document-exporters/pdf/page.d.ts +15 -0
  118. package/lib/abstract-document-exporters/pdf/page.d.ts.map +1 -0
  119. package/lib/abstract-document-exporters/pdf/page.js +2 -0
  120. package/lib/abstract-document-exporters/pdf/page.js.map +1 -0
  121. package/lib/abstract-document-exporters/pdf/paginate.d.ts +2 -20
  122. package/lib/abstract-document-exporters/pdf/paginate.d.ts.map +1 -1
  123. package/lib/abstract-document-exporters/pdf/paginate.js +8 -45
  124. package/lib/abstract-document-exporters/pdf/paginate.js.map +1 -1
  125. package/lib/abstract-document-exporters/pdf/pre-process.d.ts.map +1 -1
  126. package/lib/abstract-document-exporters/pdf/pre-process.js +8 -35
  127. package/lib/abstract-document-exporters/pdf/pre-process.js.map +1 -1
  128. package/lib/abstract-document-exporters/pdf/render-image.d.ts.map +1 -1
  129. package/lib/abstract-document-exporters/pdf/render-image.js +24 -34
  130. package/lib/abstract-document-exporters/pdf/render-image.js.map +1 -1
  131. package/lib/abstract-document-exporters/pdf/render.d.ts +4 -3
  132. package/lib/abstract-document-exporters/pdf/render.d.ts.map +1 -1
  133. package/lib/abstract-document-exporters/pdf/render.js +60 -50
  134. package/lib/abstract-document-exporters/pdf/render.js.map +1 -1
  135. package/lib/abstract-document-exporters/pdf/std-fonts.js +1 -1
  136. package/lib/abstract-document-exporters/pdf/std-fonts.js.map +1 -1
  137. package/lib/abstract-document-exporters/pdf/textRunRow.d.ts +3 -3
  138. package/lib/abstract-document-exporters/pdf/textRunRow.d.ts.map +1 -1
  139. package/lib/abstract-document-exporters/pdf/textRunRow.js +6 -6
  140. package/lib/abstract-document-exporters/pdf/textRunRow.js.map +1 -1
  141. package/lib/abstract-document-exporters/pdf/update-refs.d.ts +1 -1
  142. package/lib/abstract-document-exporters/pdf/update-refs.d.ts.map +1 -1
  143. package/lib/abstract-document-exporters/pdf/update-refs.js +3 -2
  144. package/lib/abstract-document-exporters/pdf/update-refs.js.map +1 -1
  145. package/lib/abstract-document-exporters/shared/get_resources.d.ts.map +1 -1
  146. package/lib/abstract-document-exporters/shared/get_resources.js.map +1 -1
  147. package/lib/abstract-document-jsx/index.d.ts +2 -3
  148. package/lib/abstract-document-jsx/index.d.ts.map +1 -1
  149. package/lib/abstract-document-jsx/index.js +10 -6
  150. package/lib/abstract-document-jsx/index.js.map +1 -1
  151. package/lib/abstract-document-xml/abstract-doc-of-xml/abstract-doc-of-xml.d.ts +3 -7
  152. package/lib/abstract-document-xml/abstract-doc-of-xml/abstract-doc-of-xml.d.ts.map +1 -1
  153. package/lib/abstract-document-xml/abstract-doc-of-xml/abstract-doc-of-xml.js +5 -3
  154. package/lib/abstract-document-xml/abstract-doc-of-xml/abstract-doc-of-xml.js.map +1 -1
  155. package/lib/abstract-document-xml/abstract-doc-of-xml/creator.d.ts.map +1 -1
  156. package/lib/abstract-document-xml/abstract-doc-of-xml/creator.js +1 -3
  157. package/lib/abstract-document-xml/abstract-doc-of-xml/creator.js.map +1 -1
  158. package/lib/abstract-document-xml/abstract-doc-of-xml/custom-elements.d.ts.map +1 -1
  159. package/lib/abstract-document-xml/abstract-doc-of-xml/custom-elements.js +4 -8
  160. package/lib/abstract-document-xml/abstract-doc-of-xml/custom-elements.js.map +1 -1
  161. package/lib/abstract-document-xml/xsd-template/xsd-template.js +2 -2
  162. package/lib/abstract-document-xml/xsd-template/xsd-template.js.map +1 -1
  163. package/package.json +22 -22
  164. package/src/abstract-document/abstract-doc.ts +6 -6
  165. package/src/abstract-document/atoms/atom.ts +3 -3
  166. package/src/abstract-document/default-styles.ts +1 -1
  167. package/src/abstract-document/markdown/markdown.ts +5 -5
  168. package/src/abstract-document/numberings/numbering-definition.ts +2 -2
  169. package/src/abstract-document/numberings/numbering-level-definition.ts +2 -2
  170. package/src/abstract-document/page/master-page.ts +2 -2
  171. package/src/abstract-document/page/section.ts +3 -3
  172. package/src/abstract-document/primitives/font.ts +1 -12
  173. package/src/abstract-document/primitives/layout-foundation-color.ts +1 -4
  174. package/src/abstract-document/primitives/layout-foundation.ts +1 -4
  175. package/src/abstract-document/resources.ts +9 -14
  176. package/src/abstract-document/section-elements/group.ts +3 -3
  177. package/src/abstract-document/section-elements/page-break.ts +2 -3
  178. package/src/abstract-document/section-elements/paragraph.ts +4 -4
  179. package/src/abstract-document/section-elements/section-element.ts +1 -1
  180. package/src/abstract-document/section-elements/table.ts +3 -3
  181. package/src/abstract-document/styles/group-style.ts +3 -3
  182. package/src/abstract-document/styles/page-style.ts +3 -7
  183. package/src/abstract-document/styles/paragraph-style.ts +6 -14
  184. package/src/abstract-document/styles/style.ts +1 -5
  185. package/src/abstract-document/styles/table-cell-style.ts +8 -11
  186. package/src/abstract-document/styles/table-style.ts +3 -8
  187. package/src/abstract-document/styles/text-style.ts +16 -21
  188. package/src/abstract-document/table/table-cell.ts +2 -2
  189. package/src/abstract-document/table/table-row.ts +3 -4
  190. package/src/abstract-document/types.ts +0 -1
  191. package/src/abstract-document-exporters/docx/document-container.ts +24 -13
  192. package/src/abstract-document-exporters/docx/docx-constants.ts +2 -6
  193. package/src/abstract-document-exporters/docx/ref-container.ts +48 -41
  194. package/src/abstract-document-exporters/docx/string-utils.ts +6 -6
  195. package/src/abstract-document-exporters/docx/xml-writer.ts +261 -266
  196. package/src/abstract-document-exporters/docx2/render-image.ts +15 -49
  197. package/src/abstract-document-exporters/docx2/render.ts +64 -139
  198. package/src/abstract-document-exporters/pdf/font.ts +17 -23
  199. package/src/abstract-document-exporters/pdf/header-footer.ts +43 -0
  200. package/src/abstract-document-exporters/pdf/measure.ts +50 -103
  201. package/src/abstract-document-exporters/pdf/page.ts +16 -0
  202. package/src/abstract-document-exporters/pdf/paginate.ts +29 -125
  203. package/src/abstract-document-exporters/pdf/pre-process.ts +11 -47
  204. package/src/abstract-document-exporters/pdf/render-image.ts +29 -46
  205. package/src/abstract-document-exporters/pdf/render.ts +84 -129
  206. package/src/abstract-document-exporters/pdf/std-fonts.ts +1 -1
  207. package/src/abstract-document-exporters/pdf/textRunRow.ts +12 -23
  208. package/src/abstract-document-exporters/pdf/update-refs.ts +10 -33
  209. package/src/abstract-document-exporters/shared/get_resources.ts +4 -4
  210. package/src/abstract-document-jsx/index.ts +38 -26
  211. package/src/abstract-document-xml/abstract-doc-of-xml/abstract-doc-of-xml.ts +14 -26
  212. package/src/abstract-document-xml/abstract-doc-of-xml/creator.ts +10 -28
  213. package/src/abstract-document-xml/abstract-doc-of-xml/custom-elements.tsx +8 -30
  214. 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 class XmlWriter {
32
- private static readonly quoteChar = '"';
33
- private readonly _encoding: string = "utf-8";
34
- private readonly _indent: number = 2;
35
-
36
- private _xml: string = "";
37
- private _state: XmlWriterState = "Start";
38
- private _contextStack: Array<XmlElementContext> = [];
39
-
40
- WriteStartDocument(standalone?: boolean): void {
41
- try {
42
- // tslint:disable-next-line:no-this
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
- // Push new element-context to stack
104
- const elementName: string = XmlWriter.getPrefixedName(localName, prefix);
105
- this._contextStack.push({
106
- elementName,
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
- this.writeIndent(this._state !== "Start");
112
- this.write("<" + elementName);
31
+ let xml = "";
32
+ let state: XmlWriterState = "Start";
33
+ const contextStack: Array<XmlElementContext> = [];
113
34
 
114
- if (ns) {
115
- this.addNamespace(ns, prefix);
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
- WriteString(text: string): void {
129
- try {
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
- WriteElementString(localName: string, value: string, ns: string, prefix: string): void {
151
- this.WriteStartElement(localName, ns, prefix);
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
- WriteAttributeString(localName: string, value: string): void;
157
- WriteAttributeString(localName: string, value: string, ns: string): void;
158
- WriteAttributeString(localName: string, value: string, ns: string, prefix: string): void;
159
- WriteAttributeString(localName: string, value: string, ns?: string, prefix?: string): void {
160
- try {
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
- // Set next state
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
- WriteEndElement(): void {
187
- try {
188
- if (this._state === "Content" || this._state === "Element") {
189
- // const context = this._contextStack.pop() as XmlElementContext;
190
- const context = this.peekContextStack();
191
- // Only close in itself if no content
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
- private getPrefixFromAncestors(ns: string): string | undefined {
230
- for (const context of this._contextStack) {
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) return prefix;
71
+ if (context.namespaces[prefix] === ns) {
72
+ return prefix;
73
+ }
233
74
  }
234
75
  }
235
76
  return undefined;
236
77
  }
237
78
 
238
- private peekContextStack(): XmlElementContext {
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 = prefix || "";
267
- this.peekContextStack().namespaces[prefix] = ns;
81
+ peekContextStack().namespaces[prefix ?? ""] = ns;
268
82
  }
269
83
 
270
- private writeIndent(newLine: boolean = true): void {
271
- if (this._indent > 0) {
84
+ function writeIndent(newLine: boolean = true): void {
85
+ if (indentSize > 0) {
272
86
  if (newLine) {
273
- this.write("\n");
87
+ write("\n");
274
88
  }
275
- if (!(this._state === "Start" || this._state === "Prolog")) {
276
- for (let i = 0; i < this._indent * (this._contextStack.length - 1); i++) {
277
- this.write(" ");
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
- private write(text: string): void {
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 < this._contextStack.length - 1; i++) {
305
- const context = this._contextStack[i];
306
- if (context.namespaces[prefix] == 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) toWrite[prefix] = namespaces[prefix];
109
+ if (!exists) {
110
+ toWrite[prefix] = namespaces[prefix];
111
+ }
312
112
  }
313
113
  return toWrite;
314
114
  }
315
115
 
316
- private writeNamespaceAttribute(ns: string, prefix: string | undefined): void {
116
+ function writeNamespaceAttribute(ns: string, prefix: string | undefined): void {
317
117
  if (ns) {
318
118
  if (prefix) {
319
- this.write(` xmlns:${prefix}="${ns}"`);
119
+ write(` xmlns:${prefix}="${ns}"`);
320
120
  } else {
321
- this.write(` xmlns="${ns}"`);
121
+ write(` xmlns="${ns}"`);
322
122
  }
323
123
  }
324
124
  }
325
125
 
326
- private static getPrefixedName(localName: string, prefix: string | undefined): string {
327
- if (prefix) {
328
- return `${prefix}:${localName}`;
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
- // oxlint-disable-next-line typescript/no-unnecessary-template-expression
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
  }