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.
- package/README.md +308 -0
- package/dist/bin/udf-cli.d.ts +2 -0
- package/dist/bin/udf-cli.js +122 -0
- package/dist/bin/udf-cli.js.map +1 -0
- package/dist/src/converters/html-to-udf.d.ts +1 -0
- package/dist/src/converters/html-to-udf.js +7 -0
- package/dist/src/converters/html-to-udf.js.map +1 -0
- package/dist/src/converters/markdown-to-udf.d.ts +1 -0
- package/dist/src/converters/markdown-to-udf.js +7 -0
- package/dist/src/converters/markdown-to-udf.js.map +1 -0
- package/dist/src/converters/udf-to-html.d.ts +1 -0
- package/dist/src/converters/udf-to-html.js +7 -0
- package/dist/src/converters/udf-to-html.js.map +1 -0
- package/dist/src/converters/udf-to-markdown.d.ts +1 -0
- package/dist/src/converters/udf-to-markdown.js +7 -0
- package/dist/src/converters/udf-to-markdown.js.map +1 -0
- package/dist/src/html/markdown-parser.d.ts +2 -0
- package/dist/src/html/markdown-parser.js +172 -0
- package/dist/src/html/markdown-parser.js.map +1 -0
- package/dist/src/html/markdown-serializer.d.ts +2 -0
- package/dist/src/html/markdown-serializer.js +146 -0
- package/dist/src/html/markdown-serializer.js.map +1 -0
- package/dist/src/html/parser.d.ts +2 -0
- package/dist/src/html/parser.js +517 -0
- package/dist/src/html/parser.js.map +1 -0
- package/dist/src/html/serializer.d.ts +6 -0
- package/dist/src/html/serializer.js +259 -0
- package/dist/src/html/serializer.js.map +1 -0
- package/dist/src/index.d.ts +6 -0
- package/dist/src/index.js +6 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/model/document.d.ts +99 -0
- package/dist/src/model/document.js +88 -0
- package/dist/src/model/document.js.map +1 -0
- package/dist/src/udf/cdata-builder.d.ts +14 -0
- package/dist/src/udf/cdata-builder.js +59 -0
- package/dist/src/udf/cdata-builder.js.map +1 -0
- package/dist/src/udf/parser.d.ts +2 -0
- package/dist/src/udf/parser.js +293 -0
- package/dist/src/udf/parser.js.map +1 -0
- package/dist/src/udf/serializer.d.ts +5 -0
- package/dist/src/udf/serializer.js +228 -0
- package/dist/src/udf/serializer.js.map +1 -0
- package/dist/src/utils/color.d.ts +9 -0
- package/dist/src/utils/color.js +87 -0
- package/dist/src/utils/color.js.map +1 -0
- package/dist/src/utils/style.d.ts +18 -0
- package/dist/src/utils/style.js +55 -0
- package/dist/src/utils/style.js.map +1 -0
- 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":"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"}
|
|
@@ -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, '&')
|
|
10
|
+
.replace(/</g, '<')
|
|
11
|
+
.replace(/>/g, '>')
|
|
12
|
+
.replace(/"/g, '"');
|
|
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":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAehD;;;GAGG;AACH,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,KAAK;SACT,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,KAAkC;IACvD,IAAI,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACzC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAE9E,SAAS,mBAAmB,CAAC,EAAc;IACzC,OAAO,CACL,cAAc;QACd,aAAa;QACb,mBAAmB,EAAE,CAAC,aAAa,GAAG;QACtC,gBAAgB,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;QAC3C,iBAAiB,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;QAC7C,eAAe,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;QACzC,kBAAkB,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;QAC/C,sBAAsB,EAAE,CAAC,gBAAgB,GAAG;QAC5C,mBAAmB,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;QACjD,mBAAmB,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;QACjD,KAAK;QACL,eAAe,CAChB,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,KAAgB;IACtC,IAAI,CAAC,GAAG,YAAY,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;IACpD,CAAC,IAAI,UAAU,KAAK,CAAC,QAAQ,GAAG,CAAC;IACjC,IAAI,KAAK,CAAC,IAAI;QAAE,CAAC,IAAI,cAAc,CAAC;IACpC,IAAI,KAAK,CAAC,MAAM;QAAE,CAAC,IAAI,gBAAgB,CAAC;IACxC,IAAI,KAAK,CAAC,SAAS;QAAE,CAAC,IAAI,mBAAmB,CAAC;IAC9C,yEAAyE;IACzE,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC9B,CAAC,IAAI,gBAAgB,KAAK,CAAC,KAAK,GAAG,CAAC;IACtC,CAAC;IACD,IAAI,KAAK,CAAC,eAAe,KAAK,CAAC,CAAC,EAAE,CAAC;QACjC,CAAC,IAAI,gBAAgB,KAAK,CAAC,eAAe,GAAG,CAAC;IAChD,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CACtB,OAAsB,EACtB,OAAe;IAEf,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;AACtD,CAAC;AAED,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E,SAAS,kBAAkB,CACzB,IAAe,EACf,YAA2B;IAE3B,IAAI,GAAG,GAAG,YAAY,CAAC;IACvB,GAAG,IAAI,eAAe,IAAI,CAAC,SAAS,GAAG,CAAC;IACxC,GAAG,IAAI,gBAAgB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACrD,GAAG,IAAI,iBAAiB,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAEvD,IAAI,IAAI,CAAC,eAAe,KAAK,CAAC,EAAE,CAAC;QAC/B,GAAG,IAAI,qBAAqB,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACjE,CAAC;IACD,IAAI,IAAI,CAAC,WAAW,KAAK,CAAC,EAAE,CAAC;QAC3B,GAAG,IAAI,iBAAiB,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACzD,CAAC;IACD,IAAI,IAAI,CAAC,WAAW,KAAK,CAAC,EAAE,CAAC;QAC3B,GAAG,IAAI,gBAAgB,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACxD,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;QAC1B,GAAG,IAAI,gBAAgB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACvD,CAAC;IAED,kBAAkB;IAClB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAClC,GAAG,IAAI,kBAAkB,CAAC;YAC1B,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;gBACzB,GAAG,IAAI,gBAAgB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAC7D,CAAC;YACD,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBACnC,GAAG,IAAI,YAAY,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;YACzC,CAAC;YACD,GAAG,IAAI,eAAe,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC;QAC3C,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACzC,GAAG,IAAI,kBAAkB,CAAC;YAC1B,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;gBACzB,GAAG,IAAI,gBAAgB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAC7D,CAAC;YACD,GAAG,IAAI,eAAe,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,GAAG,IAAI,GAAG,CAAC;IAEX,oDAAoD;IACpD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,8BAA8B;QAC9B,GAAG,IAAI,2EAA2E,CAAC;IACrF,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;YACjC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAClC,MAAM,GAAG,GAAG,KAAK,CAAC,OAAkB,CAAC;gBACrC,GAAG,IAAI,UAAU,CAAC;gBAClB,GAAG,IAAI,iBAAiB,KAAK,CAAC,WAAW,GAAG,CAAC;gBAC7C,GAAG,IAAI,YAAY,KAAK,CAAC,MAAM,GAAG,CAAC;gBACnC,GAAG,IAAI,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACjC,GAAG,IAAI,KAAK,CAAC;YACf,CAAC;iBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC1C,MAAM,GAAG,GAAG,KAAK,CAAC,OAAmB,CAAC;gBACtC,GAAG,IAAI,QAAQ,CAAC;gBAChB,GAAG,IAAI,eAAe,GAAG,CAAC,IAAI,GAAG,CAAC;gBAClC,GAAG,IAAI,iBAAiB,KAAK,CAAC,WAAW,GAAG,CAAC;gBAC7C,GAAG,IAAI,aAAa,CAAC;gBACrB,GAAG,IAAI,WAAW,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;gBAC1C,GAAG,IAAI,YAAY,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;gBAC5C,GAAG,IAAI,KAAK,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC;IAED,GAAG,IAAI,gBAAgB,CAAC;IACxB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,cAAc,CACrB,KAAY,EACZ,OAAsB,EACtB,cAAiC;IAEjC,IAAI,GAAG,GAAG,QAAQ,CAAC;IACnB,GAAG,IAAI,eAAe,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;IAChD,GAAG,IAAI,iBAAiB,KAAK,CAAC,OAAO,GAAG,CAAC;IAEzC,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IACtE,GAAG,IAAI,iBAAiB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAC3C,GAAG,IAAI,YAAY,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IACpD,GAAG,IAAI,GAAG,CAAC;IAEX,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,GAAG,IAAI,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;IACpD,CAAC;IAED,GAAG,IAAI,YAAY,CAAC;IACpB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,YAAY,CACnB,GAAa,EACb,OAAsB,EACtB,cAAiC;IAEjC,IAAI,GAAG,GAAG,MAAM,CAAC;IACjB,GAAG,IAAI,aAAa,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;IAC5C,GAAG,IAAI,aAAa,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC;IAC/C,GAAG,IAAI,GAAG,CAAC;IAEX,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QAC7B,GAAG,IAAI,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;IACtD,CAAC;IAED,GAAG,IAAI,QAAQ,CAAC;IAChB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,aAAa,CACpB,IAAe,EACf,OAAsB,EACtB,cAAiC;IAEjC,IAAI,GAAG,GAAG,OAAO,CAAC;IAClB,oFAAoF;IACpF,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC;QAAE,GAAG,IAAI,aAAa,IAAI,CAAC,OAAO,GAAG,CAAC;IAC1D,IAAI,IAAI,CAAC,aAAa,KAAK,KAAK;QAAE,GAAG,IAAI,WAAW,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;IACzF,IAAI,IAAI,CAAC,SAAS,KAAK,QAAQ,IAAI,IAAI,CAAC,SAAS,KAAK,CAAC,CAAC;QAAE,GAAG,IAAI,eAAe,IAAI,CAAC,SAAS,GAAG,CAAC;IAClG,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;QAC1B,GAAG,IAAI,YAAY,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;QACnD,GAAG,IAAI,iBAAiB,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;QACvD,GAAG,IAAI,gBAAgB,IAAI,CAAC,UAAU,GAAG,CAAC;QAC1C,GAAG,IAAI,iBAAiB,IAAI,CAAC,WAAW,GAAG,CAAC;QAC5C,GAAG,IAAI,iBAAiB,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;IAC3D,CAAC;IACD,GAAG,IAAI,GAAG,CAAC;IAEX,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;IAE9D,GAAG,IAAI,SAAS,CAAC;IACjB,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CACtB,MAAsB,EACtB,OAAsB,EACtB,cAAiC;IAEjC,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC/B,MAAM,EAAE,GAAG,cAAc,CAAC,KAAK,EAAE,CAAC;YAClC,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAClD,GAAG,IAAI,kBAAkB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QACjD,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAClC,GAAG,IAAI,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAa;IAC9C,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAEhD,YAAY;IACZ,IAAI,GAAG,GAAG,2CAA2C,CAAC;IACtD,GAAG,IAAI,8BAA8B,CAAC;IACtC,GAAG,IAAI,qBAAqB,KAAK,eAAe,CAAC;IACjD,GAAG,IAAI,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACtC,GAAG,IAAI,IAAI,CAAC;IACZ,GAAG,IAAI,qCAAqC,CAAC;IAE7C,MAAM,cAAc,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IACpC,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;IAE1D,GAAG,IAAI,eAAe,CAAC;IACvB,GAAG,IAAI,UAAU,CAAC;IAClB,GAAG,IAAI,iOAAiO,CAAC;IACzO,GAAG,IAAI,qFAAqF,CAAC;IAC7F,GAAG,IAAI,aAAa,CAAC;IACrB,GAAG,IAAI,aAAa,CAAC;IAErB,aAAa;IACb,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;IACxB,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;IACzD,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;IAC5D,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -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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"}
|