odf-kit 0.9.5 → 0.9.7

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.
@@ -0,0 +1,447 @@
1
+ /**
2
+ * TipTap/ProseMirror JSON to ODT converter.
3
+ *
4
+ * Walks a TipTap JSONContent document tree and maps nodes to OdtDocument
5
+ * API calls. No dependency on @tiptap/core — just plain JSON walking.
6
+ *
7
+ * Supported block nodes: doc, paragraph, heading (1–6), bulletList,
8
+ * orderedList, listItem, blockquote, codeBlock, horizontalRule, hardBreak,
9
+ * image (data URI or pre-fetched via images option), table, tableRow,
10
+ * tableCell, tableHeader.
11
+ *
12
+ * Supported marks: bold, italic, underline, strike, code, link, textStyle
13
+ * (color, fontSize, fontFamily), highlight, superscript, subscript.
14
+ *
15
+ * Unknown node types are silently skipped unless unknownNodeHandler is
16
+ * provided in options.
17
+ */
18
+ // ─── Constants ────────────────────────────────────────────────────────
19
+ const HR_BORDER = "0.5pt solid #000000";
20
+ const BLOCKQUOTE_INDENT = "1cm";
21
+ const MONOSPACE_FONT = "Courier New";
22
+ // ─── Public API ───────────────────────────────────────────────────────
23
+ /**
24
+ * Convert a TipTap/ProseMirror JSON document to an ODT file.
25
+ *
26
+ * Accepts the JSON object returned by `editor.getJSON()` in TipTap.
27
+ * No dependency on @tiptap/core — the JSON is walked as a plain object.
28
+ *
29
+ * @param json - TipTap JSONContent document (must have type "doc").
30
+ * @param options - Page format, margins, metadata, images, unknownNodeHandler.
31
+ * @returns Promise resolving to a valid `.odt` file as a `Uint8Array`.
32
+ *
33
+ * @example
34
+ * import { tiptapToOdt } from "odf-kit"
35
+ *
36
+ * const json = editor.getJSON()
37
+ * const bytes = await tiptapToOdt(json, { pageFormat: "A4" })
38
+ *
39
+ * @example
40
+ * // With pre-fetched images
41
+ * const images = { "https://example.com/photo.jpg": jpegBytes }
42
+ * const bytes = await tiptapToOdt(json, { images })
43
+ *
44
+ * @example
45
+ * // With custom node handler
46
+ * const bytes = await tiptapToOdt(json, {
47
+ * unknownNodeHandler: (node, doc) => {
48
+ * if (node.type === "callout") {
49
+ * doc.addParagraph(`⚠️ ${extractText(node)}`)
50
+ * }
51
+ * }
52
+ * })
53
+ */
54
+ export async function tiptapToOdt(json, options) {
55
+ // We reuse htmlToOdt's page layout setup by creating the document
56
+ // through it with an empty HTML string, then walking the TipTap JSON
57
+ // to populate. However, htmlToOdt is not designed for this — instead
58
+ // we duplicate the page setup logic here for a clean implementation.
59
+ // Import OdtDocument dynamically to avoid circular dependency issues
60
+ const { OdtDocument } = await import("./document.js");
61
+ const doc = new OdtDocument();
62
+ // Apply metadata
63
+ if (options?.metadata) {
64
+ doc.setMetadata(options.metadata);
65
+ }
66
+ // Resolve page format (mirrors html-to-odt.ts)
67
+ const PAGE_FORMATS = {
68
+ A4: { width: "21cm", height: "29.7cm", margin: "2.5cm" },
69
+ letter: { width: "21.59cm", height: "27.94cm", margin: "2.54cm" },
70
+ legal: { width: "21.59cm", height: "35.56cm", margin: "2.54cm" },
71
+ A3: { width: "29.7cm", height: "42cm", margin: "2.5cm" },
72
+ A5: { width: "14.8cm", height: "21cm", margin: "2cm" },
73
+ };
74
+ const format = PAGE_FORMATS[options?.pageFormat ?? "A4"];
75
+ doc.setPageLayout({
76
+ width: format.width,
77
+ height: format.height,
78
+ orientation: options?.orientation,
79
+ marginTop: options?.marginTop ?? format.margin,
80
+ marginBottom: options?.marginBottom ?? format.margin,
81
+ marginLeft: options?.marginLeft ?? format.margin,
82
+ marginRight: options?.marginRight ?? format.margin,
83
+ });
84
+ // Walk the document tree
85
+ walkNode(json, doc, options ?? {});
86
+ return doc.save();
87
+ }
88
+ // ─── Node Walking ─────────────────────────────────────────────────────
89
+ /**
90
+ * Walk a single TipTap node and emit the corresponding ODT content.
91
+ */
92
+ function walkNode(node, doc, options) {
93
+ switch (node.type) {
94
+ case "doc":
95
+ for (const child of node.content ?? []) {
96
+ walkNode(child, doc, options);
97
+ }
98
+ break;
99
+ case "paragraph": {
100
+ const runs = extractRuns(node.content ?? [], {});
101
+ if (runs.length === 0 || runs.every((r) => !r.text && !r.lineBreak)) {
102
+ // Empty paragraph — still emit it to preserve spacing
103
+ doc.addParagraph("");
104
+ }
105
+ else {
106
+ doc.addParagraph((p) => applyRuns(p, runs));
107
+ }
108
+ break;
109
+ }
110
+ case "heading": {
111
+ const level = node.attrs?.level ?? 1;
112
+ const runs = extractRuns(node.content ?? [], {});
113
+ doc.addHeading((p) => applyRuns(p, runs), level);
114
+ break;
115
+ }
116
+ case "blockquote": {
117
+ const opts = { indentLeft: BLOCKQUOTE_INDENT };
118
+ for (const child of node.content ?? []) {
119
+ walkNodeWithParaOpts(child, doc, options, opts);
120
+ }
121
+ break;
122
+ }
123
+ case "codeBlock": {
124
+ const text = extractText(node);
125
+ const lines = text.split("\n");
126
+ doc.addParagraph((p) => {
127
+ lines.forEach((line, i) => {
128
+ p.addText(line, { fontFamily: MONOSPACE_FONT });
129
+ if (i < lines.length - 1)
130
+ p.addLineBreak();
131
+ });
132
+ });
133
+ break;
134
+ }
135
+ case "horizontalRule": {
136
+ doc.addParagraph("", { borderBottom: HR_BORDER });
137
+ break;
138
+ }
139
+ case "bulletList": {
140
+ doc.addList((l) => fillList(l, node, options), { type: "bullet" });
141
+ break;
142
+ }
143
+ case "orderedList": {
144
+ doc.addList((l) => fillList(l, node, options), { type: "numbered" });
145
+ break;
146
+ }
147
+ case "table": {
148
+ walkTable(node, doc);
149
+ break;
150
+ }
151
+ case "image": {
152
+ walkImage(node, doc, options);
153
+ break;
154
+ }
155
+ // Transparent containers — walk children
156
+ case "listItem":
157
+ case "tableRow":
158
+ case "tableCell":
159
+ case "tableHeader": {
160
+ for (const child of node.content ?? []) {
161
+ walkNode(child, doc, options);
162
+ }
163
+ break;
164
+ }
165
+ // Text node — should not appear at block level, emit as paragraph
166
+ case "text": {
167
+ const runs = extractRuns([node], {});
168
+ if (runs.length > 0) {
169
+ doc.addParagraph((p) => applyRuns(p, runs));
170
+ }
171
+ break;
172
+ }
173
+ default: {
174
+ if (options.unknownNodeHandler) {
175
+ options.unknownNodeHandler(node, doc);
176
+ }
177
+ // If no handler, silently skip
178
+ break;
179
+ }
180
+ }
181
+ }
182
+ /**
183
+ * Walk a node with inherited paragraph options (used for blockquote).
184
+ */
185
+ function walkNodeWithParaOpts(node, doc, options, paraOpts) {
186
+ if (node.type === "paragraph") {
187
+ const runs = extractRuns(node.content ?? [], {});
188
+ if (runs.length === 0 || runs.every((r) => !r.text && !r.lineBreak)) {
189
+ doc.addParagraph("", paraOpts);
190
+ }
191
+ else {
192
+ doc.addParagraph((p) => applyRuns(p, runs), paraOpts);
193
+ }
194
+ }
195
+ else {
196
+ walkNode(node, doc, options);
197
+ }
198
+ }
199
+ // ─── List Walking ─────────────────────────────────────────────────────
200
+ /**
201
+ * Populate a ListBuilder from a bulletList or orderedList node.
202
+ * Called recursively for nested lists.
203
+ */
204
+ function fillList(l, listNode, options) {
205
+ for (const item of listNode.content ?? []) {
206
+ if (item.type !== "listItem")
207
+ continue;
208
+ // A listItem contains one or more paragraphs and optionally nested lists
209
+ const paragraphs = (item.content ?? []).filter((c) => c.type === "paragraph");
210
+ const nestedList = (item.content ?? []).find((c) => c.type === "bulletList" || c.type === "orderedList");
211
+ // Use text from first paragraph as the item content
212
+ const firstPara = paragraphs[0];
213
+ const runs = firstPara ? extractRuns(firstPara.content ?? [], {}) : [];
214
+ if (runs.length > 0 && runs.some((r) => r.text || r.lineBreak)) {
215
+ l.addItem((p) => applyRuns(p, runs));
216
+ }
217
+ else {
218
+ l.addItem("");
219
+ }
220
+ if (nestedList) {
221
+ l.addNested((sub) => fillList(sub, nestedList, options));
222
+ }
223
+ }
224
+ }
225
+ // ─── Table Walking ────────────────────────────────────────────────────
226
+ /**
227
+ * Walk a table node and add a table to the document.
228
+ */
229
+ function walkTable(node, doc) {
230
+ const rows = node.content ?? [];
231
+ if (rows.length === 0)
232
+ return;
233
+ doc.addTable((t) => {
234
+ for (const row of rows) {
235
+ if (row.type !== "tableRow")
236
+ continue;
237
+ t.addRow((r) => {
238
+ for (const cell of row.content ?? []) {
239
+ if (cell.type !== "tableCell" && cell.type !== "tableHeader")
240
+ continue;
241
+ const isHeader = cell.type === "tableHeader";
242
+ const baseFormatting = isHeader ? { bold: true } : {};
243
+ // Extract text from all paragraphs in the cell
244
+ const allRuns = [];
245
+ for (const child of cell.content ?? []) {
246
+ if (child.type === "paragraph") {
247
+ const runs = extractRuns(child.content ?? [], baseFormatting);
248
+ if (allRuns.length > 0 && runs.length > 0) {
249
+ allRuns.push({ text: " " }); // space between paragraphs
250
+ }
251
+ allRuns.push(...runs);
252
+ }
253
+ }
254
+ if (allRuns.length > 0) {
255
+ r.addCell((c) => applyRuns(c, allRuns));
256
+ }
257
+ else {
258
+ r.addCell("");
259
+ }
260
+ }
261
+ });
262
+ }
263
+ });
264
+ }
265
+ // ─── Image Handling ───────────────────────────────────────────────────
266
+ /**
267
+ * Handle a TipTap image node.
268
+ * - Data URIs are decoded and embedded directly.
269
+ * - Other URLs are looked up in options.images. If found, embedded.
270
+ * - If not found, a placeholder paragraph is emitted.
271
+ */
272
+ function walkImage(node, doc, options) {
273
+ const src = node.attrs?.src ?? "";
274
+ const alt = node.attrs?.alt ?? "Image";
275
+ const width = node.attrs?.width;
276
+ const height = node.attrs?.height;
277
+ // Resolve image bytes
278
+ let bytes;
279
+ let mimeType = "image/png";
280
+ if (src.startsWith("data:")) {
281
+ // Data URI — decode directly
282
+ const match = src.match(/^data:([^;]+);base64,(.+)$/);
283
+ if (match) {
284
+ mimeType = match[1];
285
+ bytes = base64ToUint8Array(match[2]);
286
+ }
287
+ }
288
+ else if (options.images?.[src]) {
289
+ // Pre-fetched image
290
+ bytes = options.images[src];
291
+ mimeType = guessMimeType(src);
292
+ }
293
+ if (bytes) {
294
+ const widthCm = width ? `${Math.round((width / 96) * 2.54)}cm` : "10cm";
295
+ const heightCm = height ? `${Math.round((height / 96) * 2.54)}cm` : "auto";
296
+ doc.addImage(bytes, {
297
+ mimeType: mimeType,
298
+ width: widthCm,
299
+ height: heightCm,
300
+ });
301
+ }
302
+ else {
303
+ // Placeholder
304
+ doc.addParagraph(`[Image: ${alt}]`);
305
+ }
306
+ }
307
+ /** Decode a base64 string to Uint8Array. Pure implementation, no Buffer or atob needed. */
308
+ function base64ToUint8Array(b64) {
309
+ const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
310
+ const lookup = new Uint8Array(256);
311
+ for (let i = 0; i < chars.length; i++)
312
+ lookup[chars.charCodeAt(i)] = i;
313
+ const clean = b64.replace(/[^A-Za-z0-9+/]/g, "");
314
+ const len = clean.length;
315
+ const bytes = new Uint8Array((len * 3) >> 2);
316
+ let pos = 0;
317
+ for (let i = 0; i < len; i += 4) {
318
+ const a = lookup[clean.charCodeAt(i)];
319
+ const b = lookup[clean.charCodeAt(i + 1)];
320
+ const c = lookup[clean.charCodeAt(i + 2)];
321
+ const d = lookup[clean.charCodeAt(i + 3)];
322
+ bytes[pos++] = (a << 2) | (b >> 4);
323
+ if (i + 2 < len)
324
+ bytes[pos++] = ((b & 0xf) << 4) | (c >> 2);
325
+ if (i + 3 < len)
326
+ bytes[pos++] = ((c & 0x3) << 6) | d;
327
+ }
328
+ return bytes.slice(0, pos);
329
+ }
330
+ /** Guess MIME type from file extension. */
331
+ function guessMimeType(src) {
332
+ const ext = src.split(".").pop()?.toLowerCase() ?? "";
333
+ const map = {
334
+ png: "image/png",
335
+ jpg: "image/jpeg",
336
+ jpeg: "image/jpeg",
337
+ gif: "image/gif",
338
+ svg: "image/svg+xml",
339
+ webp: "image/webp",
340
+ };
341
+ return map[ext] ?? "image/png";
342
+ }
343
+ // ─── Inline Content Extraction ────────────────────────────────────────
344
+ /**
345
+ * Recursively extract TextRun objects from TipTap inline content nodes.
346
+ * Handles text nodes with marks and hardBreak nodes.
347
+ */
348
+ function extractRuns(nodes, inherited) {
349
+ const runs = [];
350
+ for (const node of nodes) {
351
+ if (node.type === "text") {
352
+ const text = node.text ?? "";
353
+ if (!text)
354
+ continue;
355
+ const formatting = mergeMarks(node.marks ?? [], inherited);
356
+ const linkMark = node.marks?.find((m) => m.type === "link");
357
+ const hasFormatting = Object.keys(formatting).length > 0;
358
+ if (linkMark) {
359
+ const href = linkMark.attrs?.href ?? "";
360
+ runs.push({ text, link: href, formatting: hasFormatting ? formatting : undefined });
361
+ }
362
+ else {
363
+ runs.push({ text, formatting: hasFormatting ? formatting : undefined });
364
+ }
365
+ }
366
+ else if (node.type === "hardBreak") {
367
+ runs.push({ text: "", lineBreak: true });
368
+ }
369
+ else if (node.content) {
370
+ runs.push(...extractRuns(node.content, inherited));
371
+ }
372
+ }
373
+ return runs;
374
+ }
375
+ /**
376
+ * Convert an array of TipTap marks to TextFormatting, merged with inherited.
377
+ */
378
+ function mergeMarks(marks, inherited) {
379
+ let f = { ...inherited };
380
+ for (const mark of marks) {
381
+ switch (mark.type) {
382
+ case "bold":
383
+ f = { ...f, bold: true };
384
+ break;
385
+ case "italic":
386
+ f = { ...f, italic: true };
387
+ break;
388
+ case "underline":
389
+ f = { ...f, underline: true };
390
+ break;
391
+ case "strike":
392
+ f = { ...f, strikethrough: true };
393
+ break;
394
+ case "code":
395
+ f = { ...f, fontFamily: MONOSPACE_FONT };
396
+ break;
397
+ case "superscript":
398
+ f = { ...f, superscript: true };
399
+ break;
400
+ case "subscript":
401
+ f = { ...f, subscript: true };
402
+ break;
403
+ case "highlight": {
404
+ const color = mark.attrs?.color ?? "yellow";
405
+ f = { ...f, highlightColor: color };
406
+ break;
407
+ }
408
+ case "textStyle": {
409
+ if (mark.attrs?.color)
410
+ f = { ...f, color: mark.attrs.color };
411
+ if (mark.attrs?.fontSize)
412
+ f = { ...f, fontSize: mark.attrs.fontSize };
413
+ if (mark.attrs?.fontFamily)
414
+ f = { ...f, fontFamily: mark.attrs.fontFamily };
415
+ break;
416
+ }
417
+ // "link" handled in extractRuns — not a formatting property
418
+ }
419
+ }
420
+ return f;
421
+ }
422
+ // ─── Helpers ──────────────────────────────────────────────────────────
423
+ /**
424
+ * Apply an array of TextRun objects to a ParagraphBuilder.
425
+ */
426
+ function applyRuns(p, runs) {
427
+ for (const run of runs) {
428
+ if (run.lineBreak) {
429
+ p.addLineBreak();
430
+ }
431
+ else if (run.link) {
432
+ p.addLink(run.text ?? "", run.link, run.formatting);
433
+ }
434
+ else {
435
+ p.addText(run.text ?? "", run.formatting);
436
+ }
437
+ }
438
+ }
439
+ /**
440
+ * Extract all plain text from a node tree (used for codeBlock).
441
+ */
442
+ function extractText(node) {
443
+ if (node.type === "text")
444
+ return node.text ?? "";
445
+ return (node.content ?? []).map(extractText).join("");
446
+ }
447
+ //# sourceMappingURL=tiptap-to-odt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tiptap-to-odt.js","sourceRoot":"","sources":["../../src/odt/tiptap-to-odt.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "odf-kit",
3
- "version": "0.9.5",
3
+ "version": "0.9.7",
4
4
  "description": "Generate, fill, read, and convert OpenDocument Format (.odt) files in JavaScript and TypeScript. Works in Node.js and browsers.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -51,13 +51,22 @@
51
51
  "opendocument",
52
52
  "odt",
53
53
  "ods",
54
- "odp",
55
- "odg",
56
54
  "libreoffice",
57
55
  "document",
58
56
  "spreadsheet",
59
- "presentation",
60
- "browser"
57
+ "browser",
58
+ "tiptap",
59
+ "prosemirror",
60
+ "tiptap-odt",
61
+ "prosemirror-odt",
62
+ "html-to-odt",
63
+ "markdown-to-odt",
64
+ "tiptap-export",
65
+ "odt-export",
66
+ "odt-generator",
67
+ "template",
68
+ "typst",
69
+ "iso26300"
61
70
  ],
62
71
  "author": "GitHubNewbie0",
63
72
  "license": "Apache-2.0",