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.
@@ -12,7 +12,8 @@
12
12
  * .addRow(["February", 14200.00])
13
13
  * .addRow(["Total", { value: "=SUM(B2:B3)", type: "formula" }])
14
14
  * .setColumnWidth(0, "4cm")
15
- * .setColumnWidth(1, "5cm");
15
+ * .setColumnWidth(1, "5cm")
16
+ * .freezeRows(1);
16
17
  */
17
18
  export class OdsSheet {
18
19
  /** Internal sheet data — used by OdsDocument.save(). */
@@ -33,26 +34,20 @@ export class OdsSheet {
33
34
  * - `boolean` → boolean
34
35
  * - `string` → string (never auto-detected as formula)
35
36
  * - `null` / `undefined` → empty cell
36
- * - {@link OdsCellObject} → explicit type (required for formulas)
37
- *
38
- * Row options apply formatting defaults to every cell in the row.
39
- * Per-cell {@link OdsCellObject} options override row-level defaults.
37
+ * - {@link OdsCellObject} → explicit type (required for formulas, percentages, currencies)
40
38
  *
41
39
  * @param values - Array of cell values in column order.
42
40
  * @param options - Optional formatting defaults for all cells in this row.
43
41
  * @returns This sheet, for chaining.
44
42
  *
45
43
  * @example
46
- * // Simple auto-typed row
47
- * sheet.addRow([1.23, "Text", new Date("2026-01-15"), true]);
48
- *
49
- * @example
50
- * // Header row with formatting
51
44
  * sheet.addRow(["Month", "Revenue"], { bold: true, backgroundColor: "#DDDDDD" });
52
- *
53
- * @example
54
- * // Row with a formula cell
55
- * sheet.addRow(["Total", { value: "=SUM(B1:B10)", type: "formula" }]);
45
+ * sheet.addRow(["January", 12500.00]);
46
+ * sheet.addRow(["Total", { value: "=SUM(B2:B3)", type: "formula" }]);
47
+ * sheet.addRow([{ value: 0.1234, type: "percentage", numberFormat: "percentage:1" }]);
48
+ * sheet.addRow([{ value: 1234.56, type: "currency", numberFormat: "currency:EUR" }]);
49
+ * sheet.addRow([{ value: "Report", type: "string", colSpan: 3, bold: true }]);
50
+ * sheet.addRow([{ value: "odf-kit", type: "string", href: "https://github.com/GitHubNewbie0/odf-kit" }]);
56
51
  */
57
52
  addRow(values, options) {
58
53
  const cells = values.map((v) => toCellData(v));
@@ -62,16 +57,9 @@ export class OdsSheet {
62
57
  /**
63
58
  * Set the width of a column.
64
59
  *
65
- * May be called before or after adding rows. Uses zero-based column index.
66
- * Columns without an explicit width use the application's optimal width.
67
- *
68
60
  * @param colIndex - Zero-based column index.
69
61
  * @param width - Width with units (e.g. `"3cm"`, `"1.5in"`).
70
62
  * @returns This sheet, for chaining.
71
- *
72
- * @example
73
- * sheet.setColumnWidth(0, "4cm");
74
- * sheet.setColumnWidth(1, "8cm");
75
63
  */
76
64
  setColumnWidth(colIndex, width) {
77
65
  this.data.columns.set(colIndex, { width });
@@ -80,17 +68,9 @@ export class OdsSheet {
80
68
  /**
81
69
  * Set the height of a row.
82
70
  *
83
- * The row must already exist (added via {@link addRow}). Uses zero-based
84
- * row index. Silently ignored for out-of-range indices.
85
- * Rows without an explicit height use the application's optimal height.
86
- *
87
71
  * @param rowIndex - Zero-based row index.
88
72
  * @param height - Height with units (e.g. `"1cm"`, `"18pt"`).
89
73
  * @returns This sheet, for chaining.
90
- *
91
- * @example
92
- * sheet.addRow(["Header"]);
93
- * sheet.setRowHeight(0, "1cm");
94
74
  */
95
75
  setRowHeight(rowIndex, height) {
96
76
  const row = this.data.rows[rowIndex];
@@ -99,24 +79,65 @@ export class OdsSheet {
99
79
  }
100
80
  return this;
101
81
  }
82
+ /**
83
+ * Freeze the top N rows so they remain visible when scrolling down.
84
+ *
85
+ * Typically used to keep a header row visible. Call after adding rows.
86
+ *
87
+ * @param rows - Number of rows to freeze (default 1).
88
+ * @returns This sheet, for chaining.
89
+ *
90
+ * @example
91
+ * sheet.addRow(["Name", "Amount", "Date"], { bold: true });
92
+ * sheet.freezeRows(1);
93
+ */
94
+ freezeRows(rows = 1) {
95
+ this.data.freezeRows = rows;
96
+ return this;
97
+ }
98
+ /**
99
+ * Freeze the left N columns so they remain visible when scrolling right.
100
+ *
101
+ * @param cols - Number of columns to freeze (default 1).
102
+ * @returns This sheet, for chaining.
103
+ *
104
+ * @example
105
+ * sheet.freezeColumns(1); // freeze the first column
106
+ */
107
+ freezeColumns(cols = 1) {
108
+ this.data.freezeColumns = cols;
109
+ return this;
110
+ }
111
+ /**
112
+ * Set the sheet tab color.
113
+ *
114
+ * @param color - Hex color (`"#FF0000"`) or CSS named color (`"red"`).
115
+ * @returns This sheet, for chaining.
116
+ *
117
+ * @example
118
+ * doc.addSheet("Q1").setTabColor("#4CAF50");
119
+ * doc.addSheet("Q2").setTabColor("#2196F3");
120
+ */
121
+ setTabColor(color) {
122
+ this.data.tabColor = color;
123
+ return this;
124
+ }
102
125
  }
103
126
  // ─── Internal Helpers ─────────────────────────────────────────────────
104
- /**
105
- * Convert an OdsCellValue to internal OdsCellData with resolved type.
106
- */
107
127
  function toCellData(value) {
108
128
  if (value === null || value === undefined) {
109
129
  return { value: null, type: "empty" };
110
130
  }
111
- // OdsCellObject — has an explicit 'type' field alongside 'value'
112
131
  if (isOdsCellObject(value)) {
113
132
  return {
114
133
  value: value.value,
115
134
  type: value.type,
116
135
  options: extractCellOptions(value),
136
+ colSpan: value.colSpan,
137
+ rowSpan: value.rowSpan,
138
+ href: value.href,
117
139
  };
118
140
  }
119
- // Auto-typed primitives
120
141
  if (value instanceof Date) {
121
142
  return { value, type: "date" };
122
143
  }
@@ -126,19 +147,11 @@ function toCellData(value) {
126
147
  if (typeof value === "number") {
127
148
  return { value, type: "float" };
128
149
  }
129
- // string — never auto-detected as formula
130
150
  return { value: value, type: "string" };
131
151
  }
132
- /**
133
- * Type guard: returns true when value is an OdsCellObject.
134
- */
135
152
  function isOdsCellObject(value) {
136
153
  return typeof value === "object" && value !== null && !(value instanceof Date) && "type" in value;
137
154
  }
138
- /**
139
- * Extract OdsCellOptions fields from an OdsCellObject, excluding 'value' and 'type'.
140
- * Returns undefined when no formatting options are present.
141
- */
142
155
  function extractCellOptions(obj) {
143
156
  const opts = {};
144
157
  if (obj.bold !== undefined)
@@ -175,6 +188,8 @@ function extractCellOptions(obj) {
175
188
  opts.wrap = obj.wrap;
176
189
  if (obj.dateFormat !== undefined)
177
190
  opts.dateFormat = obj.dateFormat;
191
+ if (obj.numberFormat !== undefined)
192
+ opts.numberFormat = obj.numberFormat;
178
193
  return Object.keys(opts).length > 0 ? opts : undefined;
179
194
  }
180
195
  //# sourceMappingURL=sheet-builder.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sheet-builder.js","sourceRoot":"","sources":["../../src/ods/sheet-builder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sheet-builder.js","sourceRoot":"","sources":["../../src/ods/sheet-builder.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  /** Recognized cell types in ODS. */
2
- export type OdsCellType = "string" | "float" | "date" | "boolean" | "formula";
2
+ export type OdsCellType = "string" | "float" | "date" | "boolean" | "formula" | "percentage" | "currency";
3
3
  /** Built-in date display formats. */
4
4
  export type OdsDateFormat = "YYYY-MM-DD" | "DD/MM/YYYY" | "MM/DD/YYYY";
5
5
  /**
@@ -7,14 +7,6 @@ export type OdsDateFormat = "YYYY-MM-DD" | "DD/MM/YYYY" | "MM/DD/YYYY";
7
7
  *
8
8
  * Applied at the row level (as defaults for all cells) or at the cell level
9
9
  * (as overrides for a single cell via {@link OdsCellObject}).
10
- *
11
- * @example
12
- * // Row-level defaults
13
- * sheet.addRow(["Header", "Value"], { bold: true, backgroundColor: "#DDDDDD" });
14
- *
15
- * @example
16
- * // Cell-level overrides inside OdsCellObject
17
- * sheet.addRow([{ value: "Special", type: "string", color: "#FF0000" }]);
18
10
  */
19
11
  export interface OdsCellOptions {
20
12
  /** Bold text. */
@@ -28,19 +20,15 @@ export interface OdsCellOptions {
28
20
  fontSize?: number | string;
29
21
  /** Font family (e.g. `"Arial"`, `"Liberation Sans"`). */
30
22
  fontFamily?: string;
31
- /**
32
- * Text color. Accepts hex (`"#FF0000"`) or CSS named colors (`"red"`).
33
- */
23
+ /** Text color. Accepts hex (`"#FF0000"`) or CSS named colors (`"red"`). */
34
24
  color?: string;
35
25
  /** Underline the text. */
36
26
  underline?: boolean;
37
- /**
38
- * Cell background color. Accepts hex (`"#DDDDDD"`) or CSS named colors.
39
- */
27
+ /** Cell background color. Accepts hex (`"#DDDDDD"`) or CSS named colors. */
40
28
  backgroundColor?: string;
41
29
  /**
42
- * Border on all four sides. Uses CSS border shorthand:
43
- * `"<width> <style> <color>"` (e.g. `"0.5pt solid #000000"`).
30
+ * Border on all four sides. CSS shorthand: `"<width> <style> <color>"`
31
+ * (e.g. `"0.5pt solid #000000"`).
44
32
  */
45
33
  border?: string;
46
34
  /** Top border. Overrides `border` for the top side. */
@@ -64,6 +52,24 @@ export interface OdsCellOptions {
64
52
  * Overrides the document-level default set via `OdsDocument.setDateFormat()`.
65
53
  */
66
54
  dateFormat?: OdsDateFormat;
55
+ /**
56
+ * Number display format. Applies when the cell contains a numeric value.
57
+ *
58
+ * Predefined formats:
59
+ * - `"integer"` — 1,234 (no decimal places, thousands separator)
60
+ * - `"decimal:N"` — 1,234.56 (N decimal places, thousands separator)
61
+ * - `"percentage"` — 12.34% (raw value × 100, 2 decimal places)
62
+ * - `"percentage:N"` — 12.3% (N decimal places)
63
+ * - `"currency:CODE"` — €1,234.56 (ISO 4217 code, 2 decimal places)
64
+ * - `"currency:CODE:N"` — €1,234.6 (currency with N decimal places)
65
+ *
66
+ * @example
67
+ * { value: 1234567.89, type: "float", numberFormat: "decimal:2" }
68
+ * { value: 0.1234, type: "percentage", numberFormat: "percentage:1" }
69
+ * { value: 1234.56, type: "currency", numberFormat: "currency:EUR" }
70
+ * { value: 9999, type: "float", numberFormat: "integer" }
71
+ */
72
+ numberFormat?: string;
67
73
  }
68
74
  /**
69
75
  * Row-level formatting options. Applied to all cells in the row as defaults.
@@ -73,29 +79,53 @@ export type OdsRowOptions = OdsCellOptions;
73
79
  /**
74
80
  * Explicit typed cell — use when automatic type detection is insufficient.
75
81
  *
76
- * Required for formula cells. Also allows per-cell formatting that overrides
77
- * the row-level defaults set in `addRow()`.
78
- *
79
- * Extends {@link OdsCellOptions} so individual cell formatting can override
80
- * row-level defaults.
82
+ * Required for formula, percentage, and currency cells. Also allows per-cell
83
+ * formatting that overrides row-level defaults.
81
84
  *
82
85
  * @example
83
86
  * // Formula — explicit type required
84
87
  * { value: "=SUM(B1:B10)", type: "formula" }
85
88
  *
86
89
  * @example
87
- * // Date with per-cell format override
88
- * { value: new Date("2026-01-15"), type: "date", dateFormat: "DD/MM/YYYY" }
90
+ * // Percentage
91
+ * { value: 0.1234, type: "percentage", numberFormat: "percentage:1" }
89
92
  *
90
93
  * @example
91
- * // String with bold override inside a non-bold row
92
- * { value: "Total", type: "string", bold: true }
94
+ * // Currency
95
+ * { value: 1234.56, type: "currency", numberFormat: "currency:EUR" }
96
+ *
97
+ * @example
98
+ * // Merged cell spanning 3 columns
99
+ * { value: "Q1 Report", type: "string", colSpan: 3, bold: true }
100
+ *
101
+ * @example
102
+ * // Hyperlink
103
+ * { value: "odf-kit", type: "string", href: "https://github.com/GitHubNewbie0/odf-kit" }
93
104
  */
94
105
  export interface OdsCellObject extends OdsCellOptions {
95
106
  /** The cell value. */
96
107
  value: string | number | boolean | Date | null;
97
108
  /** The explicit cell type. */
98
109
  type: OdsCellType;
110
+ /**
111
+ * Span this cell across N columns (default 1).
112
+ * The spanned columns in the same row are automatically filled with
113
+ * covered cells.
114
+ */
115
+ colSpan?: number;
116
+ /**
117
+ * Span this cell across N rows (default 1).
118
+ * The spanned cells in subsequent rows at the same column position are
119
+ * automatically filled with covered cells.
120
+ */
121
+ rowSpan?: number;
122
+ /**
123
+ * Hyperlink URL. When set, the cell text becomes a clickable link.
124
+ *
125
+ * @example
126
+ * { value: "odf-kit", type: "string", href: "https://github.com/GitHubNewbie0/odf-kit" }
127
+ */
128
+ href?: string;
99
129
  }
100
130
  /**
101
131
  * A cell value — either a primitive (auto-typed) or an explicit {@link OdsCellObject}.
@@ -108,11 +138,7 @@ export interface OdsCellObject extends OdsCellOptions {
108
138
  * - `null` / `undefined` → empty cell
109
139
  *
110
140
  * @example
111
- * // Primitives — auto-typed
112
141
  * sheet.addRow(["Hello", 42, new Date("2026-01-15"), true]);
113
- *
114
- * @example
115
- * // Mix of primitives and explicit objects
116
142
  * sheet.addRow(["Total", { value: "=SUM(B1:B10)", type: "formula" }]);
117
143
  */
118
144
  export type OdsCellValue = string | number | boolean | Date | null | undefined | OdsCellObject;
@@ -124,6 +150,12 @@ export interface OdsCellData {
124
150
  type: OdsCellType | "empty";
125
151
  /** Cell-level formatting options — merged with row options at render time. */
126
152
  options?: OdsCellOptions;
153
+ /** Column span — number of columns this cell covers (default 1). */
154
+ colSpan?: number;
155
+ /** Row span — number of rows this cell covers (default 1). */
156
+ rowSpan?: number;
157
+ /** Hyperlink URL — when set, cell text is rendered as a link. */
158
+ href?: string;
127
159
  }
128
160
  /** Internal representation of a row. */
129
161
  export interface OdsRowData {
@@ -147,5 +179,11 @@ export interface OdsSheetData {
147
179
  rows: OdsRowData[];
148
180
  /** Sparse column definitions keyed by zero-based column index. */
149
181
  columns: Map<number, OdsColumnData>;
182
+ /** Number of rows to freeze at the top (0 = no freeze). */
183
+ freezeRows?: number;
184
+ /** Number of columns to freeze at the left (0 = no freeze). */
185
+ freezeColumns?: number;
186
+ /** Sheet tab color (hex e.g. `"#FF0000"` or CSS named color). */
187
+ tabColor?: string;
150
188
  }
151
189
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ods/types.ts"],"names":[],"mappings":"AAEA,oCAAoC;AACpC,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;AAE9E,qCAAqC;AACrC,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,YAAY,GAAG,YAAY,CAAC;AAEvE;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,cAAc;IAC7B,iBAAiB;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf,mBAAmB;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAE3B,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,0BAA0B;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,6DAA6D;IAC7D,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,iDAAiD;IACjD,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IAEpC,qDAAqD;IACrD,aAAa,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAE5C,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,4CAA4C;IAC5C,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf;;;OAGG;IACH,UAAU,CAAC,EAAE,aAAa,CAAC;CAC5B;AAED;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,cAAc,CAAC;AAE3C;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,aAAc,SAAQ,cAAc;IACnD,sBAAsB;IACtB,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC;IAE/C,8BAA8B;IAC9B,IAAI,EAAE,WAAW,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,GAAG,aAAa,CAAC;AAI/F,+DAA+D;AAC/D,MAAM,WAAW,WAAW;IAC1B,kEAAkE;IAClE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC;IAE/C,8BAA8B;IAC9B,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC;IAE5B,8EAA8E;IAC9E,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B;AAED,wCAAwC;AACxC,MAAM,WAAW,UAAU;IACzB,yCAAyC;IACzC,KAAK,EAAE,WAAW,EAAE,CAAC;IAErB,uEAAuE;IACvE,OAAO,CAAC,EAAE,aAAa,CAAC;IAExB,qDAAqD;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,sDAAsD;AACtD,MAAM,WAAW,aAAa;IAC5B,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,mDAAmD;AACnD,MAAM,WAAW,YAAY;IAC3B,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;IAEb,+BAA+B;IAC/B,IAAI,EAAE,UAAU,EAAE,CAAC;IAEnB,kEAAkE;IAClE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CACrC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ods/types.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,9 @@ export { TableBuilder, RowBuilder, CellBuilder } from "./table-builder.js";
5
5
  export { ListBuilder } from "./list-builder.js";
6
6
  export { htmlToOdt } from "./html-to-odt.js";
7
7
  export { markdownToOdt } from "./markdown-to-odt.js";
8
+ export { tiptapToOdt } from "./tiptap-to-odt.js";
8
9
  export type { ContentElement } from "./content.js";
9
10
  export type { HtmlToOdtOptions } from "./html-to-odt.js";
11
+ export type { TiptapNode, TiptapMark, TiptapToOdtOptions } from "./tiptap-to-odt.js";
10
12
  export type { TextFormatting, TextRun, TableOptions, CellOptions, PageLayout, ParagraphOptions, TabStop, ListOptions, ImageOptions, ImageData, } from "./types.js";
11
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/odt/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,YAAY,EACV,cAAc,EACd,OAAO,EACP,YAAY,EACZ,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,OAAO,EACP,WAAW,EACX,YAAY,EACZ,SAAS,GACV,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/odt/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACrF,YAAY,EACV,cAAc,EACd,OAAO,EACP,YAAY,EACZ,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,OAAO,EACP,WAAW,EACX,YAAY,EACZ,SAAS,GACV,MAAM,YAAY,CAAC"}
package/dist/odt/index.js CHANGED
@@ -5,4 +5,5 @@ export { TableBuilder, RowBuilder, CellBuilder } from "./table-builder.js";
5
5
  export { ListBuilder } from "./list-builder.js";
6
6
  export { htmlToOdt } from "./html-to-odt.js";
7
7
  export { markdownToOdt } from "./markdown-to-odt.js";
8
+ export { tiptapToOdt } from "./tiptap-to-odt.js";
8
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/odt/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/odt/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,116 @@
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
+ import type { OdtDocument } from "./document.js";
19
+ import type { HtmlToOdtOptions } from "./html-to-odt.js";
20
+ /** A TipTap/ProseMirror JSON document node. */
21
+ export interface TiptapNode {
22
+ /** Node type name (e.g. "doc", "paragraph", "heading", "text"). */
23
+ type: string;
24
+ /** Text content — present only on text nodes. */
25
+ text?: string;
26
+ /** Node attributes (e.g. { level: 1 } for headings, { href: "..." } for links). */
27
+ attrs?: Record<string, unknown>;
28
+ /** Child nodes — present on block and inline container nodes. */
29
+ content?: TiptapNode[];
30
+ /** Inline formatting marks — present on text nodes. */
31
+ marks?: TiptapMark[];
32
+ }
33
+ /** A TipTap/ProseMirror inline mark. */
34
+ export interface TiptapMark {
35
+ /** Mark type name (e.g. "bold", "italic", "link", "textStyle"). */
36
+ type: string;
37
+ /** Mark attributes (e.g. { href: "..." } for link, { color: "#ff0000" } for textStyle). */
38
+ attrs?: Record<string, unknown>;
39
+ }
40
+ /**
41
+ * Options for {@link tiptapToOdt}.
42
+ *
43
+ * Extends {@link HtmlToOdtOptions} — all page format, margin, orientation,
44
+ * and metadata options apply.
45
+ */
46
+ export interface TiptapToOdtOptions extends HtmlToOdtOptions {
47
+ /**
48
+ * Pre-fetched image bytes keyed by src URL.
49
+ *
50
+ * TipTap image nodes with `attrs.src` are looked up in this map.
51
+ * If found, the image is embedded in the ODT. If not found (and the src
52
+ * is not a data URI), a placeholder paragraph is emitted instead.
53
+ *
54
+ * Data URIs (`data:image/...;base64,...`) are always decoded and embedded
55
+ * regardless of this map.
56
+ *
57
+ * @example
58
+ * const images = {
59
+ * "https://example.com/photo.jpg": jpegBytes,
60
+ * "ipfs://Qm...": ipfsImageBytes,
61
+ * }
62
+ * const bytes = await tiptapToOdt(json, { images })
63
+ */
64
+ images?: Record<string, Uint8Array>;
65
+ /**
66
+ * Handler for unknown node types — custom TipTap extensions not
67
+ * recognized by odf-kit.
68
+ *
69
+ * Called once per unrecognized node. The handler receives the node and
70
+ * the OdtDocument instance and may call any OdtDocument methods to add
71
+ * content. If not provided, unknown nodes are silently skipped.
72
+ *
73
+ * @example
74
+ * // Handle a custom "callout" node
75
+ * unknownNodeHandler: (node, doc) => {
76
+ * if (node.type === 'callout') {
77
+ * const text = node.content?.[0]?.content?.[0]?.text ?? ''
78
+ * doc.addParagraph(`⚠️ ${text}`)
79
+ * }
80
+ * }
81
+ */
82
+ unknownNodeHandler?: (node: TiptapNode, doc: OdtDocument) => void;
83
+ }
84
+ /**
85
+ * Convert a TipTap/ProseMirror JSON document to an ODT file.
86
+ *
87
+ * Accepts the JSON object returned by `editor.getJSON()` in TipTap.
88
+ * No dependency on @tiptap/core — the JSON is walked as a plain object.
89
+ *
90
+ * @param json - TipTap JSONContent document (must have type "doc").
91
+ * @param options - Page format, margins, metadata, images, unknownNodeHandler.
92
+ * @returns Promise resolving to a valid `.odt` file as a `Uint8Array`.
93
+ *
94
+ * @example
95
+ * import { tiptapToOdt } from "odf-kit"
96
+ *
97
+ * const json = editor.getJSON()
98
+ * const bytes = await tiptapToOdt(json, { pageFormat: "A4" })
99
+ *
100
+ * @example
101
+ * // With pre-fetched images
102
+ * const images = { "https://example.com/photo.jpg": jpegBytes }
103
+ * const bytes = await tiptapToOdt(json, { images })
104
+ *
105
+ * @example
106
+ * // With custom node handler
107
+ * const bytes = await tiptapToOdt(json, {
108
+ * unknownNodeHandler: (node, doc) => {
109
+ * if (node.type === "callout") {
110
+ * doc.addParagraph(`⚠️ ${extractText(node)}`)
111
+ * }
112
+ * }
113
+ * })
114
+ */
115
+ export declare function tiptapToOdt(json: TiptapNode, options?: TiptapToOdtOptions): Promise<Uint8Array>;
116
+ //# sourceMappingURL=tiptap-to-odt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tiptap-to-odt.d.ts","sourceRoot":"","sources":["../../src/odt/tiptap-to-odt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAKzD,+CAA+C;AAC/C,MAAM,WAAW,UAAU;IACzB,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mFAAmF;IACnF,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,iEAAiE;IACjE,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;IACvB,uDAAuD;IACvD,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;CACtB;AAED,wCAAwC;AACxC,MAAM,WAAW,UAAU;IACzB,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;IACb,2FAA2F;IAC3F,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED;;;;;GAKG;AACH,MAAM,WAAW,kBAAmB,SAAQ,gBAAgB;IAC1D;;;;;;;;;;;;;;;;OAgBG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAEpC;;;;;;;;;;;;;;;;OAgBG;IACH,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,WAAW,KAAK,IAAI,CAAC;CACnE;AAUD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,UAAU,EAChB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,UAAU,CAAC,CAsCrB"}