udf-cli 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.
Files changed (50) hide show
  1. package/README.md +308 -0
  2. package/dist/bin/udf-cli.d.ts +2 -0
  3. package/dist/bin/udf-cli.js +122 -0
  4. package/dist/bin/udf-cli.js.map +1 -0
  5. package/dist/src/converters/html-to-udf.d.ts +1 -0
  6. package/dist/src/converters/html-to-udf.js +7 -0
  7. package/dist/src/converters/html-to-udf.js.map +1 -0
  8. package/dist/src/converters/markdown-to-udf.d.ts +1 -0
  9. package/dist/src/converters/markdown-to-udf.js +7 -0
  10. package/dist/src/converters/markdown-to-udf.js.map +1 -0
  11. package/dist/src/converters/udf-to-html.d.ts +1 -0
  12. package/dist/src/converters/udf-to-html.js +7 -0
  13. package/dist/src/converters/udf-to-html.js.map +1 -0
  14. package/dist/src/converters/udf-to-markdown.d.ts +1 -0
  15. package/dist/src/converters/udf-to-markdown.js +7 -0
  16. package/dist/src/converters/udf-to-markdown.js.map +1 -0
  17. package/dist/src/html/markdown-parser.d.ts +2 -0
  18. package/dist/src/html/markdown-parser.js +172 -0
  19. package/dist/src/html/markdown-parser.js.map +1 -0
  20. package/dist/src/html/markdown-serializer.d.ts +2 -0
  21. package/dist/src/html/markdown-serializer.js +146 -0
  22. package/dist/src/html/markdown-serializer.js.map +1 -0
  23. package/dist/src/html/parser.d.ts +2 -0
  24. package/dist/src/html/parser.js +517 -0
  25. package/dist/src/html/parser.js.map +1 -0
  26. package/dist/src/html/serializer.d.ts +6 -0
  27. package/dist/src/html/serializer.js +259 -0
  28. package/dist/src/html/serializer.js.map +1 -0
  29. package/dist/src/index.d.ts +6 -0
  30. package/dist/src/index.js +6 -0
  31. package/dist/src/index.js.map +1 -0
  32. package/dist/src/model/document.d.ts +99 -0
  33. package/dist/src/model/document.js +88 -0
  34. package/dist/src/model/document.js.map +1 -0
  35. package/dist/src/udf/cdata-builder.d.ts +14 -0
  36. package/dist/src/udf/cdata-builder.js +59 -0
  37. package/dist/src/udf/cdata-builder.js.map +1 -0
  38. package/dist/src/udf/parser.d.ts +2 -0
  39. package/dist/src/udf/parser.js +293 -0
  40. package/dist/src/udf/parser.js.map +1 -0
  41. package/dist/src/udf/serializer.d.ts +5 -0
  42. package/dist/src/udf/serializer.js +228 -0
  43. package/dist/src/udf/serializer.js.map +1 -0
  44. package/dist/src/utils/color.d.ts +9 -0
  45. package/dist/src/utils/color.js +87 -0
  46. package/dist/src/utils/color.js.map +1 -0
  47. package/dist/src/utils/style.d.ts +18 -0
  48. package/dist/src/utils/style.js +55 -0
  49. package/dist/src/utils/style.js.map +1 -0
  50. package/package.json +47 -0
@@ -0,0 +1,293 @@
1
+ import JSZip from 'jszip';
2
+ import { parseDocument } from 'htmlparser2';
3
+ import { Element, Text, CDATA } from 'domhandler';
4
+ import { Alignment, DEFAULT_TEXT_STYLE, DEFAULT_PAGE_FORMAT, DEFAULT_BORDER, } from '../model/document.js';
5
+ // ---------------------------------------------------------------------------
6
+ // DOM helpers
7
+ // ---------------------------------------------------------------------------
8
+ function childElements(el) {
9
+ return el.children.filter((c) => c instanceof Element);
10
+ }
11
+ function findElement(parent, tagName) {
12
+ return childElements(parent).find((c) => c.name === tagName);
13
+ }
14
+ function findAllElements(parent, tagName) {
15
+ return childElements(parent).filter((c) => c.name === tagName);
16
+ }
17
+ /** Extract text/CDATA content from all child text nodes of an element. */
18
+ function textContent(el) {
19
+ const parts = [];
20
+ for (const child of el.children) {
21
+ if (child instanceof Text) {
22
+ parts.push(child.data);
23
+ }
24
+ else if (child instanceof CDATA) {
25
+ // CDATA node wraps child Text nodes
26
+ for (const inner of child.children) {
27
+ if (inner instanceof Text) {
28
+ parts.push(inner.data);
29
+ }
30
+ }
31
+ }
32
+ }
33
+ return parts.join('');
34
+ }
35
+ // ---------------------------------------------------------------------------
36
+ // Attribute readers
37
+ // ---------------------------------------------------------------------------
38
+ function attrFloat(el, name, fallback = 0) {
39
+ const v = el.attribs[name];
40
+ if (v === undefined || v === '')
41
+ return fallback;
42
+ const n = parseFloat(v);
43
+ return isNaN(n) ? fallback : n;
44
+ }
45
+ function attrInt(el, name, fallback = 0) {
46
+ const v = el.attribs[name];
47
+ if (v === undefined || v === '')
48
+ return fallback;
49
+ const n = parseInt(v, 10);
50
+ return isNaN(n) ? fallback : n;
51
+ }
52
+ function attrStr(el, name, fallback = '') {
53
+ return el.attribs[name] ?? fallback;
54
+ }
55
+ function attrBool(el, name) {
56
+ const v = el.attribs[name];
57
+ return v === 'true';
58
+ }
59
+ function parseAlignment(value) {
60
+ switch (value) {
61
+ case '1':
62
+ return Alignment.Center;
63
+ case '2':
64
+ return Alignment.Right;
65
+ case '3':
66
+ return Alignment.Justify;
67
+ default:
68
+ return Alignment.Left;
69
+ }
70
+ }
71
+ function parseVerticalAlign(value) {
72
+ switch (value) {
73
+ case 'vcenter':
74
+ return 'middle';
75
+ case 'bottom':
76
+ return 'bottom';
77
+ default:
78
+ return 'top';
79
+ }
80
+ }
81
+ function parseBorderStyle(el) {
82
+ const name = attrStr(el, 'border', DEFAULT_BORDER.name);
83
+ const style = attrStr(el, 'borderStyle', DEFAULT_BORDER.style);
84
+ return { name, style };
85
+ }
86
+ // ---------------------------------------------------------------------------
87
+ // Page format
88
+ // ---------------------------------------------------------------------------
89
+ function parsePageFormat(propertiesEl) {
90
+ const pageFormatEl = findElement(propertiesEl, 'pageFormat');
91
+ if (!pageFormatEl)
92
+ return { ...DEFAULT_PAGE_FORMAT };
93
+ return {
94
+ mediaSizeName: attrInt(pageFormatEl, 'mediaSizeName', DEFAULT_PAGE_FORMAT.mediaSizeName),
95
+ leftMargin: attrFloat(pageFormatEl, 'leftMargin', DEFAULT_PAGE_FORMAT.leftMargin),
96
+ rightMargin: attrFloat(pageFormatEl, 'rightMargin', DEFAULT_PAGE_FORMAT.rightMargin),
97
+ topMargin: attrFloat(pageFormatEl, 'topMargin', DEFAULT_PAGE_FORMAT.topMargin),
98
+ bottomMargin: attrFloat(pageFormatEl, 'bottomMargin', DEFAULT_PAGE_FORMAT.bottomMargin),
99
+ paperOrientation: attrInt(pageFormatEl, 'paperOrientation', DEFAULT_PAGE_FORMAT.paperOrientation),
100
+ headerFOffset: attrFloat(pageFormatEl, 'headerFOffset', DEFAULT_PAGE_FORMAT.headerFOffset),
101
+ footerFOffset: attrFloat(pageFormatEl, 'footerFOffset', DEFAULT_PAGE_FORMAT.footerFOffset),
102
+ };
103
+ }
104
+ // ---------------------------------------------------------------------------
105
+ // Inline elements
106
+ // ---------------------------------------------------------------------------
107
+ function parseTextRun(el, runes) {
108
+ const startOffset = attrInt(el, 'startOffset');
109
+ const length = attrInt(el, 'length');
110
+ let text = runes.slice(startOffset, startOffset + length).join('');
111
+ // Filter out zero-width space placeholder used for empty paragraphs
112
+ text = text.replace(/\u200B/g, '');
113
+ const style = {
114
+ fontFamily: attrStr(el, 'family', DEFAULT_TEXT_STYLE.fontFamily),
115
+ fontSize: attrFloat(el, 'size', DEFAULT_TEXT_STYLE.fontSize),
116
+ bold: attrBool(el, 'bold'),
117
+ italic: attrBool(el, 'italic'),
118
+ underline: attrBool(el, 'underline'),
119
+ color: attrInt(el, 'foreground', DEFAULT_TEXT_STYLE.color),
120
+ backgroundColor: attrInt(el, 'background', DEFAULT_TEXT_STYLE.backgroundColor),
121
+ };
122
+ return { type: 'text', text, style };
123
+ }
124
+ function parseImageRun(el) {
125
+ return {
126
+ type: 'image',
127
+ data: attrStr(el, 'imageData'),
128
+ width: attrFloat(el, 'width'),
129
+ height: attrFloat(el, 'height'),
130
+ };
131
+ }
132
+ // ---------------------------------------------------------------------------
133
+ // Paragraph
134
+ // ---------------------------------------------------------------------------
135
+ function parseParagraph(el, runes) {
136
+ const runs = [];
137
+ for (const child of childElements(el)) {
138
+ switch (child.name) {
139
+ case 'content':
140
+ runs.push(parseTextRun(child, runes));
141
+ break;
142
+ case 'image':
143
+ runs.push(parseImageRun(child));
144
+ break;
145
+ case 'tab':
146
+ // Treat tab as a text run with tab character
147
+ break;
148
+ }
149
+ }
150
+ // Filter out text runs that are empty after removing zero-width spaces
151
+ const filteredRuns = runs.filter((r) => {
152
+ if (r.type === 'text' && r.text === '')
153
+ return false;
154
+ return true;
155
+ });
156
+ const paragraph = {
157
+ type: 'paragraph',
158
+ alignment: parseAlignment(el.attribs['Alignment']),
159
+ leftIndent: attrFloat(el, 'LeftIndent'),
160
+ rightIndent: attrFloat(el, 'RightIndent'),
161
+ firstLineIndent: attrFloat(el, 'FirstLineIndent'),
162
+ lineSpacing: attrFloat(el, 'LineSpacing'),
163
+ spaceBefore: attrFloat(el, 'SpaceAbove'),
164
+ spaceAfter: attrFloat(el, 'SpaceBelow'),
165
+ runs: filteredRuns,
166
+ };
167
+ // List properties
168
+ const isNumbered = attrBool(el, 'Numbered');
169
+ const isBulleted = attrBool(el, 'Bulleted');
170
+ if (isNumbered || isBulleted) {
171
+ const list = {
172
+ type: isNumbered ? 'numbered' : 'bulleted',
173
+ level: attrInt(el, 'ListLevel'),
174
+ };
175
+ const numberType = el.attribs['NumberType'];
176
+ if (numberType)
177
+ list.numberType = numberType;
178
+ const bulletType = el.attribs['BulletType'];
179
+ if (bulletType)
180
+ list.bulletType = bulletType;
181
+ const listId = el.attribs['ListId'];
182
+ if (listId !== undefined && listId !== '') {
183
+ list.listId = parseInt(listId, 10);
184
+ }
185
+ paragraph.list = list;
186
+ }
187
+ return paragraph;
188
+ }
189
+ // ---------------------------------------------------------------------------
190
+ // Table
191
+ // ---------------------------------------------------------------------------
192
+ function parseTableCell(el, runes) {
193
+ const content = [];
194
+ for (const child of childElements(el)) {
195
+ if (child.name === 'paragraph') {
196
+ content.push(parseParagraph(child, runes));
197
+ }
198
+ else if (child.name === 'table') {
199
+ content.push(parseTable(child, runes));
200
+ }
201
+ }
202
+ return {
203
+ colspan: attrInt(el, 'colspan', 1),
204
+ rowspan: attrInt(el, 'rowspan', 1),
205
+ verticalAlign: parseVerticalAlign(el.attribs['align']),
206
+ fillColor: attrInt(el, 'fillColor', 16777215),
207
+ border: parseBorderStyle(el),
208
+ borderWidth: attrFloat(el, 'borderWidth', 0.5),
209
+ borderColor: attrInt(el, 'borderColor', 0),
210
+ borderSpec: attrInt(el, 'borderSpec', 15),
211
+ content,
212
+ };
213
+ }
214
+ function parseTableRow(el, runes) {
215
+ const cells = [];
216
+ for (const child of findAllElements(el, 'cell')) {
217
+ cells.push(parseTableCell(child, runes));
218
+ }
219
+ return {
220
+ name: attrStr(el, 'rowName', 'row1'),
221
+ rowType: attrStr(el, 'rowType', 'dataRow'),
222
+ height: attrFloat(el, 'height'),
223
+ border: parseBorderStyle(el),
224
+ cells,
225
+ };
226
+ }
227
+ function parseTable(el, runes) {
228
+ const rows = [];
229
+ for (const child of findAllElements(el, 'row')) {
230
+ rows.push(parseTableRow(child, runes));
231
+ }
232
+ const columnSpansStr = attrStr(el, 'columnSpans');
233
+ const columnWidths = columnSpansStr
234
+ ? columnSpansStr.split(',').map((s) => parseFloat(s.trim()))
235
+ : [];
236
+ return {
237
+ type: 'table',
238
+ name: attrStr(el, 'tableName', 'Sabit'),
239
+ columns: attrInt(el, 'columnCount', columnWidths.length),
240
+ columnWidths,
241
+ border: parseBorderStyle(el),
242
+ rows,
243
+ };
244
+ }
245
+ // ---------------------------------------------------------------------------
246
+ // Top-level elements parsing
247
+ // ---------------------------------------------------------------------------
248
+ function parseElements(elementsEl, runes) {
249
+ const body = [];
250
+ for (const child of childElements(elementsEl)) {
251
+ if (child.name === 'paragraph') {
252
+ body.push(parseParagraph(child, runes));
253
+ }
254
+ else if (child.name === 'table') {
255
+ body.push(parseTable(child, runes));
256
+ }
257
+ }
258
+ return body;
259
+ }
260
+ // ---------------------------------------------------------------------------
261
+ // Main entry point
262
+ // ---------------------------------------------------------------------------
263
+ export async function parseUdf(buffer) {
264
+ const zip = await JSZip.loadAsync(buffer);
265
+ const contentXml = zip.file('content.xml');
266
+ if (!contentXml) {
267
+ throw new Error('UDF file does not contain content.xml');
268
+ }
269
+ const xmlContent = await contentXml.async('string');
270
+ const dom = parseDocument(xmlContent, { xmlMode: true });
271
+ // Find <template> root element
272
+ const templateEl = dom.children.find((c) => c instanceof Element && c.name === 'template');
273
+ if (!templateEl) {
274
+ throw new Error('Missing <template> root element');
275
+ }
276
+ // Extract CDATA text from <content> element (child of <template>)
277
+ const contentEl = findElement(templateEl, 'content');
278
+ if (!contentEl) {
279
+ throw new Error('Missing <content> element');
280
+ }
281
+ const cdataText = textContent(contentEl);
282
+ const runes = Array.from(cdataText);
283
+ // Parse page format from <properties>
284
+ const propertiesEl = findElement(templateEl, 'properties');
285
+ const pages = propertiesEl
286
+ ? parsePageFormat(propertiesEl)
287
+ : { ...DEFAULT_PAGE_FORMAT };
288
+ // Parse block elements from <elements>
289
+ const elementsEl = findElement(templateEl, 'elements');
290
+ const body = elementsEl ? parseElements(elementsEl, runes) : [];
291
+ return { pages, body };
292
+ }
293
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/udf/parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAkB,MAAM,YAAY,CAAC;AAiBlE,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,GACf,MAAM,sBAAsB,CAAC;AAE9B,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E,SAAS,aAAa,CAAC,EAAW;IAChC,OAAO,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAgB,EAAE,CAAC,CAAC,YAAY,OAAO,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,WAAW,CAAC,MAAe,EAAE,OAAe;IACnD,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,eAAe,CAAC,MAAe,EAAE,OAAe;IACvD,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;AACjE,CAAC;AAED,0EAA0E;AAC1E,SAAS,WAAW,CAAC,EAAW;IAC9B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;QAChC,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;aAAM,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAClC,oCAAoC;YACpC,KAAK,MAAM,KAAK,IAAK,KAAe,CAAC,QAAQ,EAAE,CAAC;gBAC9C,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;oBAC1B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC;AAED,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E,SAAS,SAAS,CAAC,EAAW,EAAE,IAAY,EAAE,WAAmB,CAAC;IAChE,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,EAAE;QAAE,OAAO,QAAQ,CAAC;IACjD,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IACxB,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,OAAO,CAAC,EAAW,EAAE,IAAY,EAAE,WAAmB,CAAC;IAC9D,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,EAAE;QAAE,OAAO,QAAQ,CAAC;IACjD,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1B,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,OAAO,CAAC,EAAW,EAAE,IAAY,EAAE,WAAmB,EAAE;IAC/D,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC;AACtC,CAAC;AAED,SAAS,QAAQ,CAAC,EAAW,EAAE,IAAY;IACzC,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,OAAO,CAAC,KAAK,MAAM,CAAC;AACtB,CAAC;AAED,SAAS,cAAc,CAAC,KAAyB;IAC/C,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,GAAG;YACN,OAAO,SAAS,CAAC,MAAM,CAAC;QAC1B,KAAK,GAAG;YACN,OAAO,SAAS,CAAC,KAAK,CAAC;QACzB,KAAK,GAAG;YACN,OAAO,SAAS,CAAC,OAAO,CAAC;QAC3B;YACE,OAAO,SAAS,CAAC,IAAI,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAyB;IACnD,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,SAAS;YACZ,OAAO,QAAQ,CAAC;QAClB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAClB;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,EAAW;IACnC,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,OAAO,CAAC,EAAE,EAAE,aAAa,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC;IAC/D,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACzB,CAAC;AAED,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E,SAAS,eAAe,CAAC,YAAqB;IAC5C,MAAM,YAAY,GAAG,WAAW,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IAC7D,IAAI,CAAC,YAAY;QAAE,OAAO,EAAE,GAAG,mBAAmB,EAAE,CAAC;IAErD,OAAO;QACL,aAAa,EAAE,OAAO,CAAC,YAAY,EAAE,eAAe,EAAE,mBAAmB,CAAC,aAAa,CAAC;QACxF,UAAU,EAAE,SAAS,CAAC,YAAY,EAAE,YAAY,EAAE,mBAAmB,CAAC,UAAU,CAAC;QACjF,WAAW,EAAE,SAAS,CAAC,YAAY,EAAE,aAAa,EAAE,mBAAmB,CAAC,WAAW,CAAC;QACpF,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,WAAW,EAAE,mBAAmB,CAAC,SAAS,CAAC;QAC9E,YAAY,EAAE,SAAS,CAAC,YAAY,EAAE,cAAc,EAAE,mBAAmB,CAAC,YAAY,CAAC;QACvF,gBAAgB,EAAE,OAAO,CAAC,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,CAAC,gBAAgB,CAAC;QACjG,aAAa,EAAE,SAAS,CAAC,YAAY,EAAE,eAAe,EAAE,mBAAmB,CAAC,aAAa,CAAC;QAC1F,aAAa,EAAE,SAAS,CAAC,YAAY,EAAE,eAAe,EAAE,mBAAmB,CAAC,aAAa,CAAC;KAC3F,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E,SAAS,YAAY,CAAC,EAAW,EAAE,KAAe;IAChD,MAAM,WAAW,GAAG,OAAO,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IACrC,IAAI,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEnE,oEAAoE;IACpE,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAEnC,MAAM,KAAK,GAAc;QACvB,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,kBAAkB,CAAC,UAAU,CAAC;QAChE,QAAQ,EAAE,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,kBAAkB,CAAC,QAAQ,CAAC;QAC5D,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QAC1B,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;QAC9B,SAAS,EAAE,QAAQ,CAAC,EAAE,EAAE,WAAW,CAAC;QACpC,KAAK,EAAE,OAAO,CAAC,EAAE,EAAE,YAAY,EAAE,kBAAkB,CAAC,KAAK,CAAC;QAC1D,eAAe,EAAE,OAAO,CAAC,EAAE,EAAE,YAAY,EAAE,kBAAkB,CAAC,eAAe,CAAC;KAC/E,CAAC;IAEF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACvC,CAAC;AAED,SAAS,aAAa,CAAC,EAAW;IAChC,OAAO;QACL,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,WAAW,CAAC;QAC9B,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,OAAO,CAAC;QAC7B,MAAM,EAAE,SAAS,CAAC,EAAE,EAAE,QAAQ,CAAC;KAChC,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,SAAS,cAAc,CAAC,EAAW,EAAE,KAAe;IAClD,MAAM,IAAI,GAAoB,EAAE,CAAC;IAEjC,KAAK,MAAM,KAAK,IAAI,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC;QACtC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,SAAS;gBACZ,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;gBACtC,MAAM;YACR,KAAK,OAAO;gBACV,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;gBAChC,MAAM;YACR,KAAK,KAAK;gBACR,6CAA6C;gBAC7C,MAAM;QACV,CAAC;IACH,CAAC;IAED,uEAAuE;IACvE,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACrC,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,EAAE;YAAE,OAAO,KAAK,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAc;QAC3B,IAAI,EAAE,WAAW;QACjB,SAAS,EAAE,cAAc,CAAC,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAClD,UAAU,EAAE,SAAS,CAAC,EAAE,EAAE,YAAY,CAAC;QACvC,WAAW,EAAE,SAAS,CAAC,EAAE,EAAE,aAAa,CAAC;QACzC,eAAe,EAAE,SAAS,CAAC,EAAE,EAAE,iBAAiB,CAAC;QACjD,WAAW,EAAE,SAAS,CAAC,EAAE,EAAE,aAAa,CAAC;QACzC,WAAW,EAAE,SAAS,CAAC,EAAE,EAAE,YAAY,CAAC;QACxC,UAAU,EAAE,SAAS,CAAC,EAAE,EAAE,YAAY,CAAC;QACvC,IAAI,EAAE,YAAY;KACnB,CAAC;IAEF,kBAAkB;IAClB,MAAM,UAAU,GAAG,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IAC5C,IAAI,UAAU,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAmB;YAC3B,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU;YAC1C,KAAK,EAAE,OAAO,CAAC,EAAE,EAAE,WAAW,CAAC;SAChC,CAAC;QACF,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAC5C,IAAI,UAAU;YAAE,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7C,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAC5C,IAAI,UAAU;YAAE,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7C,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACpC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;YAC1C,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACrC,CAAC;QACD,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC;IACxB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,8EAA8E;AAC9E,QAAQ;AACR,8EAA8E;AAE9E,SAAS,cAAc,CAAC,EAAW,EAAE,KAAe;IAClD,MAAM,OAAO,GAAmB,EAAE,CAAC;IAEnC,KAAK,MAAM,KAAK,IAAI,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QAC7C,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAClC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAClC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAClC,aAAa,EAAE,kBAAkB,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACtD,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,WAAW,EAAE,QAAQ,CAAC;QAC7C,MAAM,EAAE,gBAAgB,CAAC,EAAE,CAAC;QAC5B,WAAW,EAAE,SAAS,CAAC,EAAE,EAAE,aAAa,EAAE,GAAG,CAAC;QAC9C,WAAW,EAAE,OAAO,CAAC,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC;QAC1C,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE,YAAY,EAAE,EAAE,CAAC;QACzC,OAAO;KACR,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,EAAW,EAAE,KAAe;IACjD,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,KAAK,MAAM,KAAK,IAAI,eAAe,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC;QACpC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC;QAC1C,MAAM,EAAE,SAAS,CAAC,EAAE,EAAE,QAAQ,CAAC;QAC/B,MAAM,EAAE,gBAAgB,CAAC,EAAE,CAAC;QAC5B,KAAK;KACN,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,EAAW,EAAE,KAAe;IAC9C,MAAM,IAAI,GAAe,EAAE,CAAC;IAC5B,KAAK,MAAM,KAAK,IAAI,eAAe,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,cAAc,GAAG,OAAO,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,cAAc;QACjC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5D,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;QACL,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC;QACvC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,aAAa,EAAE,YAAY,CAAC,MAAM,CAAC;QACxD,YAAY;QACZ,MAAM,EAAE,gBAAgB,CAAC,EAAE,CAAC;QAC5B,IAAI;KACL,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,6BAA6B;AAC7B,8EAA8E;AAE9E,SAAS,aAAa,CAAC,UAAmB,EAAE,KAAe;IACzD,MAAM,IAAI,GAAmB,EAAE,CAAC;IAEhC,KAAK,MAAM,KAAK,IAAI,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9C,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QAC1C,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAClC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAAc;IAC3C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC3C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACpD,MAAM,GAAG,GAAG,aAAa,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAEzD,+BAA+B;IAC/B,MAAM,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,CAClC,CAAC,CAAC,EAAgB,EAAE,CAAC,CAAC,YAAY,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,CACnE,CAAC;IACF,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IAED,kEAAkE;IAClE,MAAM,SAAS,GAAG,WAAW,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IACrD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC/C,CAAC;IACD,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAEpC,sCAAsC;IACtC,MAAM,YAAY,GAAG,WAAW,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAe,YAAY;QACpC,CAAC,CAAC,eAAe,CAAC,YAAY,CAAC;QAC/B,CAAC,CAAC,EAAE,GAAG,mBAAmB,EAAE,CAAC;IAE/B,uCAAuC;IACvC,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACvD,MAAM,IAAI,GAAmB,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEhF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { Document } from '../model/document.js';
2
+ /**
3
+ * Serialize a Document to a UDF file (ZIP buffer containing content.xml).
4
+ */
5
+ export declare function serializeUdf(doc: Document): Promise<Buffer>;
@@ -0,0 +1,228 @@
1
+ import JSZip from 'jszip';
2
+ import { buildCdata } from './cdata-builder.js';
3
+ /**
4
+ * Escape a string for use inside XML attribute values.
5
+ * CDATA sections do not need escaping.
6
+ */
7
+ function escapeAttr(value) {
8
+ return value
9
+ .replace(/&/g, '&amp;')
10
+ .replace(/</g, '&lt;')
11
+ .replace(/>/g, '&gt;')
12
+ .replace(/"/g, '&quot;');
13
+ }
14
+ /**
15
+ * Map vertical alignment values from the model to UDF attribute values.
16
+ */
17
+ function cellAlignAttr(align) {
18
+ if (align === 'middle')
19
+ return 'vcenter';
20
+ return align;
21
+ }
22
+ // ---------------------------------------------------------------------------
23
+ // XML generation helpers
24
+ // ---------------------------------------------------------------------------
25
+ function serializePageFormat(pf) {
26
+ return (`<properties>` +
27
+ `<pageFormat` +
28
+ ` mediaSizeName="${pf.mediaSizeName}"` +
29
+ ` leftMargin="${pf.leftMargin.toFixed(2)}"` +
30
+ ` rightMargin="${pf.rightMargin.toFixed(2)}"` +
31
+ ` topMargin="${pf.topMargin.toFixed(2)}"` +
32
+ ` bottomMargin="${pf.bottomMargin.toFixed(2)}"` +
33
+ ` paperOrientation="${pf.paperOrientation}"` +
34
+ ` headerFOffset="${pf.headerFOffset.toFixed(1)}"` +
35
+ ` footerFOffset="${pf.footerFOffset.toFixed(1)}"` +
36
+ ` />` +
37
+ `</properties>`);
38
+ }
39
+ function fontAttributes(style) {
40
+ let s = ` family="${escapeAttr(style.fontFamily)}"`;
41
+ s += ` size="${style.fontSize}"`;
42
+ if (style.bold)
43
+ s += ` bold="true"`;
44
+ if (style.italic)
45
+ s += ` italic="true"`;
46
+ if (style.underline)
47
+ s += ` underline="true"`;
48
+ // Only emit foreground/background when non-default (matches Go behavior)
49
+ if (style.color !== -16777216) {
50
+ s += ` foreground="${style.color}"`;
51
+ }
52
+ if (style.backgroundColor !== -1) {
53
+ s += ` background="${style.backgroundColor}"`;
54
+ }
55
+ return s;
56
+ }
57
+ /**
58
+ * Collect OffsetEntry items that belong to a specific blockId.
59
+ */
60
+ function entriesForBlock(entries, blockId) {
61
+ return entries.filter((e) => e.blockId === blockId);
62
+ }
63
+ // ---------------------------------------------------------------------------
64
+ // Element serialisation
65
+ // ---------------------------------------------------------------------------
66
+ function serializeParagraph(para, blockEntries) {
67
+ let xml = `<paragraph`;
68
+ xml += ` Alignment="${para.alignment}"`;
69
+ xml += ` LeftIndent="${para.leftIndent.toFixed(1)}"`;
70
+ xml += ` RightIndent="${para.rightIndent.toFixed(1)}"`;
71
+ if (para.firstLineIndent !== 0) {
72
+ xml += ` FirstLineIndent="${para.firstLineIndent.toFixed(2)}"`;
73
+ }
74
+ if (para.lineSpacing !== 0) {
75
+ xml += ` LineSpacing="${para.lineSpacing.toFixed(2)}"`;
76
+ }
77
+ if (para.spaceBefore !== 0) {
78
+ xml += ` SpaceAbove="${para.spaceBefore.toFixed(2)}"`;
79
+ }
80
+ if (para.spaceAfter !== 0) {
81
+ xml += ` SpaceBelow="${para.spaceAfter.toFixed(2)}"`;
82
+ }
83
+ // List attributes
84
+ if (para.list) {
85
+ if (para.list.type === 'numbered') {
86
+ xml += ` Numbered="true"`;
87
+ if (para.list.numberType) {
88
+ xml += ` NumberType="${escapeAttr(para.list.numberType)}"`;
89
+ }
90
+ if (para.list.listId !== undefined) {
91
+ xml += ` ListId="${para.list.listId}"`;
92
+ }
93
+ xml += ` ListLevel="${para.list.level}"`;
94
+ }
95
+ else if (para.list.type === 'bulleted') {
96
+ xml += ` Bulleted="true"`;
97
+ if (para.list.bulletType) {
98
+ xml += ` BulletType="${escapeAttr(para.list.bulletType)}"`;
99
+ }
100
+ xml += ` ListLevel="${para.list.level}"`;
101
+ }
102
+ }
103
+ xml += `>`;
104
+ // Content / image elements driven by offset entries
105
+ if (blockEntries.length === 0) {
106
+ // Empty paragraph placeholder
107
+ xml += `<content startOffset="0" length="1" family="Times New Roman" size="10" />`;
108
+ }
109
+ else {
110
+ for (const entry of blockEntries) {
111
+ if (entry.element.type === 'text') {
112
+ const run = entry.element;
113
+ xml += `<content`;
114
+ xml += ` startOffset="${entry.startOffset}"`;
115
+ xml += ` length="${entry.length}"`;
116
+ xml += fontAttributes(run.style);
117
+ xml += ` />`;
118
+ }
119
+ else if (entry.element.type === 'image') {
120
+ const img = entry.element;
121
+ xml += `<image`;
122
+ xml += ` imageData="${img.data}"`;
123
+ xml += ` startOffset="${entry.startOffset}"`;
124
+ xml += ` length="1"`;
125
+ xml += ` width="${img.width.toFixed(1)}"`;
126
+ xml += ` height="${img.height.toFixed(1)}"`;
127
+ xml += ` />`;
128
+ }
129
+ }
130
+ }
131
+ xml += `</paragraph>\n`;
132
+ return xml;
133
+ }
134
+ function serializeTable(table, entries, blockIdCounter) {
135
+ let xml = `<table`;
136
+ xml += ` tableName="${escapeAttr(table.name)}"`;
137
+ xml += ` columnCount="${table.columns}"`;
138
+ const spans = table.columnWidths.map((w) => Math.round(w).toString());
139
+ xml += ` columnSpans="${spans.join(',')}"`;
140
+ xml += ` border="${escapeAttr(table.border.name)}"`;
141
+ xml += `>`;
142
+ for (const row of table.rows) {
143
+ xml += serializeRow(row, entries, blockIdCounter);
144
+ }
145
+ xml += `</table>\n`;
146
+ return xml;
147
+ }
148
+ function serializeRow(row, entries, blockIdCounter) {
149
+ let xml = `<row`;
150
+ xml += ` rowName="${escapeAttr(row.name)}"`;
151
+ xml += ` rowType="${escapeAttr(row.rowType)}"`;
152
+ xml += `>`;
153
+ for (const cell of row.cells) {
154
+ xml += serializeCell(cell, entries, blockIdCounter);
155
+ }
156
+ xml += `</row>`;
157
+ return xml;
158
+ }
159
+ function serializeCell(cell, entries, blockIdCounter) {
160
+ let xml = `<cell`;
161
+ // Only emit non-default cell attributes (matches Go behavior - minimal cell output)
162
+ if (cell.colspan > 1)
163
+ xml += ` colspan="${cell.colspan}"`;
164
+ if (cell.verticalAlign !== 'top')
165
+ xml += ` align="${cellAlignAttr(cell.verticalAlign)}"`;
166
+ if (cell.fillColor !== 16777215 && cell.fillColor !== -1)
167
+ xml += ` fillColor="${cell.fillColor}"`;
168
+ if (cell.borderSpec !== 0) {
169
+ xml += ` border="${escapeAttr(cell.border.name)}"`;
170
+ xml += ` borderWidth="${cell.borderWidth.toFixed(1)}"`;
171
+ xml += ` borderSpec="${cell.borderSpec}"`;
172
+ xml += ` borderColor="${cell.borderColor}"`;
173
+ xml += ` borderStyle="${escapeAttr(cell.border.style)}"`;
174
+ }
175
+ xml += `>`;
176
+ xml += serializeBlocks(cell.content, entries, blockIdCounter);
177
+ xml += `</cell>`;
178
+ return xml;
179
+ }
180
+ /**
181
+ * Serialize a list of block elements (paragraphs and tables).
182
+ * The blockIdCounter tracks which block id to assign (must match
183
+ * the order produced by buildCdata).
184
+ */
185
+ function serializeBlocks(blocks, entries, blockIdCounter) {
186
+ let xml = '';
187
+ for (const block of blocks) {
188
+ if (block.type === 'paragraph') {
189
+ const id = blockIdCounter.value++;
190
+ const blockEntries = entriesForBlock(entries, id);
191
+ xml += serializeParagraph(block, blockEntries);
192
+ }
193
+ else if (block.type === 'table') {
194
+ xml += serializeTable(block, entries, blockIdCounter);
195
+ }
196
+ }
197
+ return xml;
198
+ }
199
+ // ---------------------------------------------------------------------------
200
+ // Public API
201
+ // ---------------------------------------------------------------------------
202
+ /**
203
+ * Serialize a Document to a UDF file (ZIP buffer containing content.xml).
204
+ */
205
+ export async function serializeUdf(doc) {
206
+ const { cdata, entries } = buildCdata(doc.body);
207
+ // Build XML
208
+ let xml = `<?xml version="1.0" encoding="UTF-8" ?>\n`;
209
+ xml += `<template format_id="1.8">\n`;
210
+ xml += `<content><![CDATA[${cdata}]]></content>`;
211
+ xml += serializePageFormat(doc.pages);
212
+ xml += `\n`;
213
+ xml += `<elements resolver="hvl-default">\n`;
214
+ const blockIdCounter = { value: 0 };
215
+ xml += serializeBlocks(doc.body, entries, blockIdCounter);
216
+ xml += `</elements>\n`;
217
+ xml += `<styles>`;
218
+ xml += `<style name="default" description="Geçerli" family="Dialog" size="12" bold="false" italic="false" foreground="-13421773" FONT_ATTRIBUTE_KEY="javax.swing.plaf.FontUIResource[family=Dialog,name=Dialog,style=plain,size=12]" />`;
219
+ xml += `<style name="hvl-default" family="Times New Roman" size="12" description="Gövde" />`;
220
+ xml += `</styles>\n`;
221
+ xml += `</template>`;
222
+ // Create ZIP
223
+ const zip = new JSZip();
224
+ zip.file('content.xml', xml, { compression: 'DEFLATE' });
225
+ const buf = await zip.generateAsync({ type: 'nodebuffer' });
226
+ return buf;
227
+ }
228
+ //# sourceMappingURL=serializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serializer.js","sourceRoot":"","sources":["../../../src/udf/serializer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Convert a CSS color string to a signed ARGB int32 value.
3
+ * Supports: hex (#RGB, #RRGGBB), rgb(r,g,b), named colors.
4
+ */
5
+ export declare function cssToArgb(color: string): number;
6
+ /**
7
+ * Convert a signed ARGB int32 value to a CSS hex color string.
8
+ */
9
+ export declare function argbToCss(argb: number): string;
@@ -0,0 +1,87 @@
1
+ const NAMED_COLORS = {
2
+ black: [0, 0, 0],
3
+ white: [255, 255, 255],
4
+ red: [255, 0, 0],
5
+ green: [0, 128, 0],
6
+ blue: [0, 0, 255],
7
+ yellow: [255, 255, 0],
8
+ cyan: [0, 255, 255],
9
+ magenta: [255, 0, 255],
10
+ orange: [255, 165, 0],
11
+ purple: [128, 0, 128],
12
+ gray: [128, 128, 128],
13
+ grey: [128, 128, 128],
14
+ navy: [0, 0, 128],
15
+ teal: [0, 128, 128],
16
+ maroon: [128, 0, 0],
17
+ olive: [128, 128, 0],
18
+ silver: [192, 192, 192],
19
+ lime: [0, 255, 0],
20
+ aqua: [0, 255, 255],
21
+ fuchsia: [255, 0, 255],
22
+ transparent: [0, 0, 0], // alpha=0, but we use alpha=FF
23
+ };
24
+ function rgbToArgbInt(r, g, b) {
25
+ // ARGB with alpha=0xFF, stored as signed 32-bit int
26
+ const unsigned = ((0xFF << 24) | (r << 16) | (g << 8) | b) >>> 0;
27
+ // Convert to signed 32-bit
28
+ return unsigned | 0;
29
+ }
30
+ function parseHexColor(hex) {
31
+ hex = hex.replace('#', '');
32
+ if (hex.length === 3) {
33
+ hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];
34
+ }
35
+ if (hex.length !== 6)
36
+ return null;
37
+ const r = parseInt(hex.slice(0, 2), 16);
38
+ const g = parseInt(hex.slice(2, 4), 16);
39
+ const b = parseInt(hex.slice(4, 6), 16);
40
+ if (isNaN(r) || isNaN(g) || isNaN(b))
41
+ return null;
42
+ return [r, g, b];
43
+ }
44
+ function parseRgbColor(str) {
45
+ const match = str.match(/rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/);
46
+ if (!match)
47
+ return null;
48
+ return [parseInt(match[1]), parseInt(match[2]), parseInt(match[3])];
49
+ }
50
+ /**
51
+ * Convert a CSS color string to a signed ARGB int32 value.
52
+ * Supports: hex (#RGB, #RRGGBB), rgb(r,g,b), named colors.
53
+ */
54
+ export function cssToArgb(color) {
55
+ color = color.trim().toLowerCase();
56
+ // Hex
57
+ if (color.startsWith('#')) {
58
+ const rgb = parseHexColor(color);
59
+ if (rgb)
60
+ return rgbToArgbInt(...rgb);
61
+ }
62
+ // rgb() / rgba()
63
+ if (color.startsWith('rgb')) {
64
+ const rgb = parseRgbColor(color);
65
+ if (rgb)
66
+ return rgbToArgbInt(...rgb);
67
+ }
68
+ // Named color
69
+ const named = NAMED_COLORS[color];
70
+ if (named)
71
+ return rgbToArgbInt(...named);
72
+ // Default: black
73
+ return -16777216;
74
+ }
75
+ /**
76
+ * Convert a signed ARGB int32 value to a CSS hex color string.
77
+ */
78
+ export function argbToCss(argb) {
79
+ const unsigned = argb >>> 0;
80
+ const r = (unsigned >> 16) & 0xFF;
81
+ const g = (unsigned >> 8) & 0xFF;
82
+ const b = unsigned & 0xFF;
83
+ return '#' + r.toString(16).padStart(2, '0') +
84
+ g.toString(16).padStart(2, '0') +
85
+ b.toString(16).padStart(2, '0');
86
+ }
87
+ //# sourceMappingURL=color.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color.js","sourceRoot":"","sources":["../../../src/utils/color.ts"],"names":[],"mappings":"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"}