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.
- package/CHANGELOG.md +161 -34
- package/README.md +242 -279
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/ods/content.d.ts +0 -9
- package/dist/ods/content.d.ts.map +1 -1
- package/dist/ods/content.js +274 -97
- package/dist/ods/content.js.map +1 -1
- package/dist/ods/document.d.ts +2 -42
- package/dist/ods/document.d.ts.map +1 -1
- package/dist/ods/document.js +7 -42
- package/dist/ods/document.js.map +1 -1
- package/dist/ods/index.d.ts +1 -1
- package/dist/ods/index.d.ts.map +1 -1
- package/dist/ods/settings.d.ts +13 -0
- package/dist/ods/settings.d.ts.map +1 -0
- package/dist/ods/settings.js +67 -0
- package/dist/ods/settings.js.map +1 -0
- package/dist/ods/sheet-builder.d.ts +42 -28
- package/dist/ods/sheet-builder.d.ts.map +1 -1
- package/dist/ods/sheet-builder.js +57 -42
- package/dist/ods/sheet-builder.js.map +1 -1
- package/dist/ods/types.d.ts +68 -30
- package/dist/ods/types.d.ts.map +1 -1
- package/dist/odt/index.d.ts +2 -0
- package/dist/odt/index.d.ts.map +1 -1
- package/dist/odt/index.js +1 -0
- package/dist/odt/index.js.map +1 -1
- package/dist/odt/tiptap-to-odt.d.ts +116 -0
- package/dist/odt/tiptap-to-odt.d.ts.map +1 -0
- package/dist/odt/tiptap-to-odt.js +447 -0
- package/dist/odt/tiptap-to-odt.js.map +1 -0
- package/package.json +14 -5
|
@@ -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.
|
|
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
|
-
"
|
|
60
|
-
"
|
|
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",
|