@blocknote/xl-docx-exporter 0.33.0 → 0.35.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.
@@ -1,5 +1,5 @@
1
- import { mapTableCell as I, UnreachableCaseError as T, Exporter as O, COLORS_DEFAULT as k } from "@blocknote/core";
2
- import { Table as F, TableRow as S, TableCell as v, Paragraph as s, ShadingType as m, ImageRun as L, PageBreak as M, TextRun as u, CheckBox as R, ExternalHyperlink as B, Tab as E, AlignmentType as C, LevelFormat as b, Packer as U, Document as _ } from "docx";
1
+ import { mapTableCell as k, UnreachableCaseError as T, Exporter as v, COLORS_DEFAULT as F } from "@blocknote/core";
2
+ import { Table as D, TableRow as I, TableCell as g, Paragraph as l, ShadingType as w, ImageRun as S, PageBreak as _, TextRun as p, CheckBox as M, ExternalHyperlink as L, Tab as E, AlignmentType as C, LevelFormat as A, Packer as U, Document as R } from "docx";
3
3
  async function H(e) {
4
4
  if (typeof window < "u") {
5
5
  const t = await createImageBitmap(e), { width: n, height: r } = t;
@@ -13,45 +13,45 @@ async function H(e) {
13
13
  }
14
14
  const W = (e, t) => {
15
15
  const r = new Array(e.headerRows ?? 0).fill(!0), o = new Array(e.headerCols ?? 0).fill(!0);
16
- return new F({
16
+ return new D({
17
17
  layout: "autofit",
18
18
  columnWidths: e.columnWidths.map(
19
- (a) => (a ?? 120) * /* to points */
19
+ (i) => (i ?? 120) * /* to points */
20
20
  0.75 * /* to twips */
21
21
  20
22
22
  ),
23
- rows: e.rows.map((a, p) => {
24
- const c = r[p];
25
- return new S({
23
+ rows: e.rows.map((i, u) => {
24
+ const c = r[u];
25
+ return new I({
26
26
  tableHeader: c,
27
- children: a.cells.map((g, w) => {
28
- var x;
29
- const y = (x = e.columnWidths) == null ? void 0 : x[w], i = I(g), D = o[w];
30
- return new v({
31
- width: y ? {
32
- size: `${y * 0.75}pt`,
27
+ children: i.cells.map((d, y) => {
28
+ var b;
29
+ const x = (b = e.columnWidths) == null ? void 0 : b[y], s = k(d), O = o[y];
30
+ return new g({
31
+ width: x ? {
32
+ size: `${x * 0.75}pt`,
33
33
  type: "dxa"
34
34
  } : void 0,
35
- columnSpan: i.props.colspan,
36
- rowSpan: i.props.rowspan,
37
- shading: i.props.backgroundColor === "default" || !i.props.backgroundColor ? void 0 : {
38
- type: m.SOLID,
39
- color: t.options.colors[i.props.backgroundColor].background.slice(1)
35
+ columnSpan: s.props.colspan,
36
+ rowSpan: s.props.rowspan,
37
+ shading: s.props.backgroundColor === "default" || !s.props.backgroundColor ? void 0 : {
38
+ type: w.SOLID,
39
+ color: t.options.colors[s.props.backgroundColor].background.slice(1)
40
40
  },
41
41
  children: [
42
- new s({
43
- children: t.transformInlineContent(i.content),
44
- alignment: !i.props.textAlignment || i.props.textAlignment === "left" ? void 0 : i.props.textAlignment === "center" ? "center" : i.props.textAlignment === "right" ? "right" : i.props.textAlignment === "justify" ? "distribute" : (() => {
42
+ new l({
43
+ children: t.transformInlineContent(s.content),
44
+ alignment: !s.props.textAlignment || s.props.textAlignment === "left" ? void 0 : s.props.textAlignment === "center" ? "center" : s.props.textAlignment === "right" ? "right" : s.props.textAlignment === "justify" ? "distribute" : (() => {
45
45
  throw new T(
46
- i.props.textAlignment
46
+ s.props.textAlignment
47
47
  );
48
48
  })(),
49
49
  run: {
50
50
  // TODO add support for table headers exporting, bolding seems to not be working at the moment
51
- bold: c || D,
51
+ bold: c || O,
52
52
  // TODO table paragraph color seems to not be working at the moment
53
53
  // Probably because the runs are setting their own color
54
- color: i.props.textColor === "default" || !i.props.textColor ? void 0 : t.options.colors[i.props.textColor].text.slice(1)
54
+ color: s.props.textColor === "default" || !s.props.textColor ? void 0 : t.options.colors[s.props.textColor].text.slice(1)
55
55
  }
56
56
  })
57
57
  ]
@@ -61,10 +61,10 @@ const W = (e, t) => {
61
61
  })
62
62
  });
63
63
  };
64
- function l(e, t) {
64
+ function a(e, t) {
65
65
  return {
66
66
  shading: e.backgroundColor === "default" || !e.backgroundColor ? void 0 : {
67
- type: m.SOLID,
67
+ type: w.SOLID,
68
68
  color: t[e.backgroundColor].background.slice(1)
69
69
  },
70
70
  run: e.textColor === "default" || !e.textColor ? void 0 : {
@@ -75,56 +75,56 @@ function l(e, t) {
75
75
  })()
76
76
  };
77
77
  }
78
- const P = {
79
- paragraph: (e, t) => new s({
80
- ...l(e.props, t.options.colors),
78
+ const $ = {
79
+ paragraph: (e, t) => new l({
80
+ ...a(e.props, t.options.colors),
81
81
  children: t.transformInlineContent(e.content),
82
82
  style: "Normal",
83
83
  run: {
84
84
  font: "Inter"
85
85
  }
86
86
  }),
87
- toggleListItem: (e, t) => new s({
88
- ...l(e.props, t.options.colors),
87
+ toggleListItem: (e, t) => new l({
88
+ ...a(e.props, t.options.colors),
89
89
  children: [
90
- new u({
90
+ new p({
91
91
  children: ["> "]
92
92
  }),
93
93
  ...t.transformInlineContent(e.content)
94
94
  ]
95
95
  }),
96
- numberedListItem: (e, t, n) => new s({
97
- ...l(e.props, t.options.colors),
96
+ numberedListItem: (e, t, n) => new l({
97
+ ...a(e.props, t.options.colors),
98
98
  children: t.transformInlineContent(e.content),
99
99
  numbering: {
100
100
  reference: "blocknote-numbered-list",
101
101
  level: n
102
102
  }
103
103
  }),
104
- bulletListItem: (e, t, n) => new s({
105
- ...l(e.props, t.options.colors),
104
+ bulletListItem: (e, t, n) => new l({
105
+ ...a(e.props, t.options.colors),
106
106
  children: t.transformInlineContent(e.content),
107
107
  numbering: {
108
108
  reference: "blocknote-bullet-list",
109
109
  level: n
110
110
  }
111
111
  }),
112
- checkListItem: (e, t) => new s({
113
- ...l(e.props, t.options.colors),
112
+ checkListItem: (e, t) => new l({
113
+ ...a(e.props, t.options.colors),
114
114
  children: [
115
- new R({ checked: e.props.checked }),
116
- new u({
115
+ new M({ checked: e.props.checked }),
116
+ new p({
117
117
  children: [" "]
118
118
  }),
119
119
  ...t.transformInlineContent(e.content)
120
120
  ]
121
121
  }),
122
- heading: (e, t) => new s({
123
- ...l(e.props, t.options.colors),
122
+ heading: (e, t) => new l({
123
+ ...a(e.props, t.options.colors),
124
124
  children: t.transformInlineContent(e.content),
125
125
  heading: `Heading${e.props.level}`
126
126
  }),
127
- quote: (e, t) => new s({
127
+ quote: (e, t) => new l({
128
128
  shading: {
129
129
  color: "#7D797A"
130
130
  },
@@ -136,50 +136,84 @@ const P = {
136
136
  size: 8
137
137
  }
138
138
  },
139
- ...l(e.props, t.options.colors),
139
+ ...a(e.props, t.options.colors),
140
140
  children: t.transformInlineContent(e.content)
141
141
  }),
142
142
  audio: (e, t) => [
143
- h(e.props, "Open audio", t),
143
+ m(e.props, "Open audio", t),
144
144
  ...f(e.props, t)
145
145
  ],
146
146
  video: (e, t) => [
147
- h(e.props, "Open video", t),
147
+ m(e.props, "Open video", t),
148
148
  ...f(e.props, t)
149
149
  ],
150
150
  file: (e, t) => [
151
- h(e.props, "Open file", t),
151
+ m(e.props, "Open file", t),
152
152
  ...f(e.props, t)
153
153
  ],
154
154
  codeBlock: (e) => {
155
155
  var n;
156
156
  const t = ((n = e.content[0]) == null ? void 0 : n.text) || "";
157
- return new s({
157
+ return new l({
158
158
  style: "Codeblock",
159
159
  shading: {
160
- type: m.SOLID,
160
+ type: w.SOLID,
161
161
  fill: "161616",
162
162
  color: "161616"
163
163
  },
164
164
  children: [
165
165
  ...t.split(`
166
- `).map((r, o) => new u({
166
+ `).map((r, o) => new p({
167
167
  text: r,
168
168
  break: o > 0 ? 1 : 0
169
169
  }))
170
170
  ]
171
171
  });
172
172
  },
173
- pageBreak: () => new s({
174
- children: [new M()]
173
+ pageBreak: () => new l({
174
+ children: [new _()]
175
+ }),
176
+ column: (e, t, n, r, o) => new g({
177
+ width: {
178
+ size: `${e.props.width * 100}%`,
179
+ type: "pct"
180
+ },
181
+ children: (o || []).flatMap((i) => Array.isArray(i) ? i : [i])
182
+ }),
183
+ columnList: (e, t, n, r, o) => new D({
184
+ layout: "autofit",
185
+ borders: {
186
+ bottom: { style: "nil" },
187
+ top: { style: "nil" },
188
+ left: { style: "nil" },
189
+ right: { style: "nil" },
190
+ insideHorizontal: { style: "nil" },
191
+ insideVertical: { style: "nil" }
192
+ },
193
+ rows: [
194
+ new I({
195
+ children: o.map(
196
+ (i, u, c) => {
197
+ var d;
198
+ return new g({
199
+ width: {
200
+ size: `${parseFloat(`${((d = i.options.width) == null ? void 0 : d.size) || "100%"}`) / (c.length * 100) * 100}%`,
201
+ type: "pct"
202
+ },
203
+ children: i.options.children
204
+ });
205
+ }
206
+ )
207
+ })
208
+ ]
175
209
  }),
176
210
  image: async (e, t) => {
177
211
  const n = await t.resolveFile(e.props.url), { width: r, height: o } = await H(n);
178
212
  return [
179
- new s({
180
- ...l(e.props, t.options.colors),
213
+ new l({
214
+ ...a(e.props, t.options.colors),
181
215
  children: [
182
- new L({
216
+ new S({
183
217
  data: await n.arrayBuffer(),
184
218
  // it would be nicer to set the actual data type here, but then we'd need to use a mime type / image type
185
219
  // detector. atm passing gif does not seem to be causing issues as the "type" is mainly used by docxjs internally
@@ -202,13 +236,13 @@ const P = {
202
236
  },
203
237
  table: (e, t) => W(e.content, t)
204
238
  };
205
- function h(e, t, n) {
206
- return new s({
207
- ...l(e, n.options.colors),
239
+ function m(e, t, n) {
240
+ return new l({
241
+ ...a(e, n.options.colors),
208
242
  children: [
209
- new B({
243
+ new L({
210
244
  children: [
211
- new u({
245
+ new p({
212
246
  text: e.name || t,
213
247
  style: "Hyperlink"
214
248
  })
@@ -220,10 +254,10 @@ function h(e, t, n) {
220
254
  }
221
255
  function f(e, t) {
222
256
  return e.caption ? [
223
- new s({
224
- ...l(e, t.options.colors),
257
+ new l({
258
+ ...a(e, t.options.colors),
225
259
  children: [
226
- new u({
260
+ new p({
227
261
  text: e.caption
228
262
  })
229
263
  ],
@@ -231,8 +265,8 @@ function f(e, t) {
231
265
  })
232
266
  ] : [];
233
267
  }
234
- const j = {
235
- link: (e, t) => new B({
268
+ const z = {
269
+ link: (e, t) => new L({
236
270
  children: e.content.map((n) => t.transformStyledText(
237
271
  n,
238
272
  !0
@@ -240,7 +274,7 @@ const j = {
240
274
  link: e.href
241
275
  }),
242
276
  text: (e, t) => t.transformStyledText(e)
243
- }, $ = {
277
+ }, P = {
244
278
  bold: (e) => e ? {
245
279
  bold: e
246
280
  } : {},
@@ -267,36 +301,36 @@ const j = {
267
301
  font: "GeistMono"
268
302
  } : {}
269
303
  }, J = {
270
- blockMapping: P,
271
- inlineContentMapping: j,
272
- styleMapping: $
304
+ blockMapping: $,
305
+ inlineContentMapping: z,
306
+ styleMapping: P
273
307
  };
274
- async function N(e) {
308
+ async function j(e) {
275
309
  return "https://corsproxy.api.blocknotejs.org/corsproxy/?url=" + encodeURIComponent(e);
276
310
  }
277
- async function A(e) {
311
+ async function B(e) {
278
312
  {
279
313
  const t = e.default;
280
314
  return await (await fetch(t)).arrayBuffer();
281
315
  }
282
316
  }
283
- const d = (
317
+ const h = (
284
318
  /* default font size */
285
319
  16 * /* 1 pixel is 0.75 points */
286
320
  0.75 * /* 1.5em*/
287
321
  1.5 * /* 1 point is 20 twips */
288
322
  20
289
323
  );
290
- class q extends O {
324
+ class q extends v {
291
325
  constructor(t, n, r) {
292
- const a = {
326
+ const i = {
293
327
  ...{
294
- colors: k,
295
- resolveFileUrl: N
328
+ colors: F,
329
+ resolveFileUrl: j
296
330
  },
297
331
  ...r
298
332
  };
299
- super(t, n, a), this.schema = t, this.mappings = n;
333
+ super(t, n, i), this.schema = t, this.mappings = n;
300
334
  }
301
335
  /**
302
336
  * Mostly for internal use, you probably want to use `toBlob` or `toDocxJsDocument` instead.
@@ -306,7 +340,7 @@ class q extends O {
306
340
  {},
307
341
  ...r
308
342
  );
309
- return new u({
343
+ return new p({
310
344
  ...o,
311
345
  style: n ? "Hyperlink" : void 0,
312
346
  text: t.text
@@ -318,26 +352,26 @@ class q extends O {
318
352
  async transformBlocks(t, n = 0) {
319
353
  const r = [];
320
354
  for (const o of t) {
321
- let a = await this.transformBlocks(o.children, n + 1);
322
- a = a.map((c, g) => (c instanceof s && !c.properties.numberingReferences.length && c.addRunToFront(
323
- new u({
355
+ let i = await this.transformBlocks(o.children, n + 1);
356
+ ["columnList", "column"].includes(o.type) || (i = i.map((c, d) => (c instanceof l && !c.properties.numberingReferences.length && c.addRunToFront(
357
+ new p({
324
358
  children: [new E()]
325
359
  })
326
- ), c));
327
- const p = await this.mapBlock(
360
+ ), c)));
361
+ const u = await this.mapBlock(
328
362
  o,
329
363
  n,
330
- 0
331
- /*unused*/
364
+ 0,
365
+ i
332
366
  );
333
- Array.isArray(p) ? r.push(...p, ...a) : r.push(p, ...a);
367
+ ["columnList", "column"].includes(o.type) ? r.push(u) : Array.isArray(u) ? r.push(...u, ...i) : r.push(u, ...i);
334
368
  }
335
369
  return r;
336
370
  }
337
371
  async getFonts() {
338
- let t = await A(
372
+ let t = await B(
339
373
  await import("./Inter_18pt-Regular-byxnNS-8.js")
340
- ), n = await A(
374
+ ), n = await B(
341
375
  await import("./GeistMono-Regular-D4rKXxwr.js")
342
376
  );
343
377
  if (t instanceof ArrayBuffer || n instanceof ArrayBuffer) {
@@ -362,14 +396,14 @@ class q extends O {
362
396
  levels: Array.from({ length: 9 }, (r, o) => ({
363
397
  start: 1,
364
398
  level: o,
365
- format: b.DECIMAL,
399
+ format: A.DECIMAL,
366
400
  text: `%${o + 1}.`,
367
401
  alignment: C.LEFT,
368
402
  style: {
369
403
  paragraph: {
370
404
  indent: {
371
- left: d * (o + 1),
372
- hanging: d
405
+ left: h * (o + 1),
406
+ hanging: h
373
407
  }
374
408
  }
375
409
  }
@@ -380,14 +414,14 @@ class q extends O {
380
414
  levels: Array.from({ length: 9 }, (r, o) => ({
381
415
  start: 1,
382
416
  level: o,
383
- format: b.BULLET,
417
+ format: A.BULLET,
384
418
  text: n[o % n.length],
385
419
  alignment: C.LEFT,
386
420
  style: {
387
421
  paragraph: {
388
422
  indent: {
389
- left: d * (o + 1),
390
- hanging: d
423
+ left: h * (o + 1),
424
+ hanging: h
391
425
  }
392
426
  }
393
427
  }
@@ -421,7 +455,7 @@ class q extends O {
421
455
  sectionOptions: {},
422
456
  documentOptions: {}
423
457
  }) {
424
- const r = new _({
458
+ return new R({
425
459
  ...await this.createDefaultDocumentOptions(),
426
460
  ...n.documentOptions,
427
461
  sections: [
@@ -431,11 +465,6 @@ class q extends O {
431
465
  }
432
466
  ]
433
467
  });
434
- return r.Document.Relationships.createRelationship(
435
- r.Document.Relationships.RelationshipCount + 1,
436
- "http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable",
437
- "fontTable.xml"
438
- ), r;
439
468
  }
440
469
  }
441
470
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"blocknote-xl-docx-exporter.js","sources":["../../../shared/util/imageUtil.ts","../src/docx/util/Table.tsx","../src/docx/defaultSchema/blocks.ts","../src/docx/defaultSchema/inlinecontent.ts","../src/docx/defaultSchema/styles.ts","../src/docx/defaultSchema/index.ts","../../../shared/api/corsProxy.ts","../../../shared/util/fileUtil.ts","../src/docx/docxExporter.ts"],"sourcesContent":["export async function getImageDimensions(blob: Blob) {\n if (typeof window !== \"undefined\" && import.meta.env.NODE_ENV !== \"test\") {\n const bmp = await createImageBitmap(blob);\n const { width, height } = bmp;\n bmp.close(); // free memory\n return { width, height };\n } else {\n // node or vitest\n const imageMetaFunc = (await import(\"image-meta\")).imageMeta;\n const bytes = new Uint8Array(await blob.arrayBuffer());\n const meta = imageMetaFunc(bytes);\n if (!meta.width || !meta.height) {\n throw new Error(\"Image dimensions not found\");\n }\n return { width: meta.width, height: meta.height };\n }\n}\n","import {\n Exporter,\n InlineContentSchema,\n mapTableCell,\n TableContent,\n UnreachableCaseError,\n} from \"@blocknote/core\";\nimport {\n Table as DocxTable,\n Paragraph,\n ParagraphChild,\n ShadingType,\n TableCell,\n TableRow,\n} from \"docx\";\n\nexport const Table = (\n data: TableContent<InlineContentSchema>,\n t: Exporter<any, any, any, any, ParagraphChild, any, any>,\n) => {\n const DEFAULT_COLUMN_WIDTH = 120;\n\n // If headerRows is 1, then the first row is a header row\n const headerRows = new Array(data.headerRows ?? 0).fill(true);\n // If headerCols is 1, then the first column is a header column\n const headerCols = new Array(data.headerCols ?? 0).fill(true);\n\n return new DocxTable({\n layout: \"autofit\",\n columnWidths: data.columnWidths.map(\n (w) =>\n (w ?? DEFAULT_COLUMN_WIDTH) * /* to points */ 0.75 * /* to twips */ 20,\n ),\n rows: data.rows.map((row, rowIndex) => {\n const isHeaderRow = headerRows[rowIndex];\n return new TableRow({\n tableHeader: isHeaderRow,\n children: row.cells.map((c, colIndex) => {\n const width = data.columnWidths?.[colIndex];\n const cell = mapTableCell(c);\n const isHeaderColumn = headerCols[colIndex];\n\n return new TableCell({\n width: width\n ? {\n size: `${width * 0.75}pt`,\n type: \"dxa\",\n }\n : undefined,\n columnSpan: cell.props.colspan,\n rowSpan: cell.props.rowspan,\n shading:\n cell.props.backgroundColor === \"default\" ||\n !cell.props.backgroundColor\n ? undefined\n : {\n type: ShadingType.SOLID,\n color:\n t.options.colors[\n cell.props\n .backgroundColor as keyof typeof t.options.colors\n ].background.slice(1),\n },\n children: [\n new Paragraph({\n children: t.transformInlineContent(cell.content),\n\n alignment:\n !cell.props.textAlignment ||\n cell.props.textAlignment === \"left\"\n ? undefined\n : cell.props.textAlignment === \"center\"\n ? \"center\"\n : cell.props.textAlignment === \"right\"\n ? \"right\"\n : cell.props.textAlignment === \"justify\"\n ? \"distribute\"\n : (() => {\n throw new UnreachableCaseError(\n cell.props.textAlignment,\n );\n })(),\n run: {\n // TODO add support for table headers exporting, bolding seems to not be working at the moment\n bold: isHeaderRow || isHeaderColumn,\n // TODO table paragraph color seems to not be working at the moment\n // Probably because the runs are setting their own color\n color:\n cell.props.textColor === \"default\" || !cell.props.textColor\n ? undefined\n : t.options.colors[\n cell.props.textColor as keyof typeof t.options.colors\n ].text.slice(1),\n },\n }),\n ],\n });\n }),\n });\n }),\n });\n};\n","import {\n BlockMapping,\n COLORS_DEFAULT,\n DefaultBlockSchema,\n DefaultProps,\n pageBreakSchema,\n StyledText,\n UnreachableCaseError,\n} from \"@blocknote/core\";\nimport { getImageDimensions } from \"@shared/util/imageUtil.js\";\nimport {\n CheckBox,\n Table as DocxTable,\n ExternalHyperlink,\n ImageRun,\n IParagraphOptions,\n PageBreak,\n Paragraph,\n ParagraphChild,\n ShadingType,\n TextRun,\n} from \"docx\";\nimport { Table } from \"../util/Table.js\";\n\nfunction blockPropsToStyles(\n props: Partial<DefaultProps>,\n colors: typeof COLORS_DEFAULT,\n): IParagraphOptions {\n return {\n shading:\n props.backgroundColor === \"default\" || !props.backgroundColor\n ? undefined\n : {\n type: ShadingType.SOLID,\n color:\n colors[\n props.backgroundColor as keyof typeof colors\n ].background.slice(1),\n },\n run:\n props.textColor === \"default\" || !props.textColor\n ? undefined\n : {\n color: colors[props.textColor as keyof typeof colors].text.slice(1),\n },\n alignment:\n !props.textAlignment || props.textAlignment === \"left\"\n ? undefined\n : props.textAlignment === \"center\"\n ? \"center\"\n : props.textAlignment === \"right\"\n ? \"right\"\n : props.textAlignment === \"justify\"\n ? \"distribute\"\n : (() => {\n throw new UnreachableCaseError(props.textAlignment);\n })(),\n };\n}\nexport const docxBlockMappingForDefaultSchema: BlockMapping<\n DefaultBlockSchema & typeof pageBreakSchema.blockSchema,\n any,\n any,\n | Promise<Paragraph[] | Paragraph | DocxTable>\n | Paragraph[]\n | Paragraph\n | DocxTable,\n ParagraphChild\n> = {\n paragraph: (block, exporter) => {\n return new Paragraph({\n ...blockPropsToStyles(block.props, exporter.options.colors),\n children: exporter.transformInlineContent(block.content),\n style: \"Normal\",\n run: {\n font: \"Inter\",\n },\n });\n },\n toggleListItem: (block, exporter) => {\n return new Paragraph({\n ...blockPropsToStyles(block.props, exporter.options.colors),\n children: [\n new TextRun({\n children: [\"> \"],\n }),\n ...exporter.transformInlineContent(block.content),\n ],\n });\n },\n numberedListItem: (block, exporter, nestingLevel) => {\n return new Paragraph({\n ...blockPropsToStyles(block.props, exporter.options.colors),\n children: exporter.transformInlineContent(block.content),\n numbering: {\n reference: \"blocknote-numbered-list\",\n level: nestingLevel,\n },\n });\n },\n bulletListItem: (block, exporter, nestingLevel) => {\n return new Paragraph({\n ...blockPropsToStyles(block.props, exporter.options.colors),\n children: exporter.transformInlineContent(block.content),\n numbering: {\n reference: \"blocknote-bullet-list\",\n level: nestingLevel,\n },\n });\n },\n checkListItem: (block, exporter) => {\n return new Paragraph({\n ...blockPropsToStyles(block.props, exporter.options.colors),\n children: [\n new CheckBox({ checked: block.props.checked }),\n new TextRun({\n children: [\" \"],\n }),\n ...exporter.transformInlineContent(block.content),\n ],\n });\n },\n heading: (block, exporter) => {\n return new Paragraph({\n ...blockPropsToStyles(block.props, exporter.options.colors),\n children: exporter.transformInlineContent(block.content),\n heading: `Heading${block.props.level}`,\n });\n },\n quote: (block, exporter) => {\n return new Paragraph({\n shading: {\n color: \"#7D797A\",\n },\n border: {\n left: {\n color: \"#7D797A\",\n space: 100,\n style: \"single\",\n size: 8,\n },\n },\n ...blockPropsToStyles(block.props, exporter.options.colors),\n children: exporter.transformInlineContent(block.content),\n });\n },\n audio: (block, exporter) => {\n return [\n file(block.props, \"Open audio\", exporter),\n ...caption(block.props, exporter),\n ];\n },\n video: (block, exporter) => {\n return [\n file(block.props, \"Open video\", exporter),\n ...caption(block.props, exporter),\n ];\n },\n file: (block, exporter) => {\n return [\n file(block.props, \"Open file\", exporter),\n ...caption(block.props, exporter),\n ];\n },\n codeBlock: (block) => {\n const textContent = (block.content as StyledText<any>[])[0]?.text || \"\";\n\n return new Paragraph({\n style: \"Codeblock\",\n shading: {\n type: ShadingType.SOLID,\n fill: \"161616\",\n color: \"161616\",\n },\n children: [\n ...textContent.split(\"\\n\").map((line, index) => {\n return new TextRun({\n text: line,\n break: index > 0 ? 1 : 0,\n });\n }),\n ],\n });\n },\n pageBreak: () => {\n return new Paragraph({\n children: [new PageBreak()],\n });\n },\n image: async (block, exporter) => {\n const blob = await exporter.resolveFile(block.props.url);\n const { width, height } = await getImageDimensions(blob);\n\n return [\n new Paragraph({\n ...blockPropsToStyles(block.props, exporter.options.colors),\n children: [\n new ImageRun({\n data: await blob.arrayBuffer(),\n // it would be nicer to set the actual data type here, but then we'd need to use a mime type / image type\n // detector. atm passing gif does not seem to be causing issues as the \"type\" is mainly used by docxjs internally\n // (i.e.: to make sure it's not svg)\n type: \"gif\",\n altText: block.props.caption\n ? {\n description: block.props.caption,\n name: block.props.caption,\n title: block.props.caption,\n }\n : undefined,\n transformation: {\n width: block.props.previewWidth || width,\n height: ((block.props.previewWidth || width) / width) * height,\n },\n }),\n ],\n }),\n ...caption(block.props, exporter),\n ];\n },\n table: (block, exporter) => {\n return Table(block.content, exporter);\n },\n};\n\nfunction file(\n props: Partial<DefaultProps & { name: string; url: string }>,\n defaultText: string,\n exporter: any,\n) {\n return new Paragraph({\n ...blockPropsToStyles(props, exporter.options.colors),\n children: [\n new ExternalHyperlink({\n children: [\n new TextRun({\n text: props.name || defaultText,\n style: \"Hyperlink\",\n }),\n ],\n link: props.url!,\n }),\n ],\n });\n}\n\nfunction caption(\n props: Partial<DefaultProps & { caption: string }>,\n exporter: any,\n) {\n if (!props.caption) {\n return [];\n }\n return [\n new Paragraph({\n ...blockPropsToStyles(props, exporter.options.colors),\n children: [\n new TextRun({\n text: props.caption,\n }),\n ],\n style: \"Caption\",\n }),\n ];\n}\n","import {\n DefaultInlineContentSchema,\n DefaultStyleSchema,\n InlineContentMapping,\n} from \"@blocknote/core\";\nimport { ExternalHyperlink, ParagraphChild, TextRun } from \"docx\";\nimport type { DOCXExporter } from \"../docxExporter.js\";\n\nexport const docxInlineContentMappingForDefaultSchema: InlineContentMapping<\n DefaultInlineContentSchema,\n DefaultStyleSchema,\n ParagraphChild,\n TextRun\n> = {\n link: (ic, exporter) => {\n return new ExternalHyperlink({\n children: ic.content.map((content) => {\n return (exporter as DOCXExporter<any, any, any>).transformStyledText(\n content,\n true,\n );\n }),\n link: ic.href,\n });\n },\n text: (ic, t) => {\n return t.transformStyledText(ic);\n },\n};\n","import { DefaultStyleSchema, StyleMapping } from \"@blocknote/core\";\nimport { IRunPropertiesOptions } from \"docx\";\n\nexport const docxStyleMappingForDefaultSchema: StyleMapping<\n DefaultStyleSchema,\n IRunPropertiesOptions\n> = {\n bold: (val) => {\n if (!val) {\n return {};\n }\n return {\n bold: val,\n };\n },\n italic: (val) => {\n if (!val) {\n return {};\n }\n return {\n italics: val,\n };\n },\n underline: (val) => {\n if (!val) {\n return {};\n }\n return {\n underline: {\n type: \"single\",\n },\n };\n },\n strike: (val) => {\n if (!val) {\n return {};\n }\n return {\n strike: val,\n };\n },\n backgroundColor: (val, exporter) => {\n if (!val) {\n return {};\n }\n return {\n shading: {\n fill: exporter.options.colors[\n val as keyof typeof exporter.options.colors\n ].background.slice(1),\n },\n };\n },\n textColor: (val, exporter) => {\n if (!val) {\n return {};\n }\n return {\n color:\n exporter.options.colors[\n val as keyof typeof exporter.options.colors\n ].text.slice(1),\n };\n },\n code: (val) => {\n if (!val) {\n return {};\n }\n return {\n font: \"GeistMono\",\n };\n },\n};\n","import { docxBlockMappingForDefaultSchema } from \"./blocks.js\";\nimport { docxInlineContentMappingForDefaultSchema } from \"./inlinecontent.js\";\nimport { docxStyleMappingForDefaultSchema } from \"./styles.js\";\n\nexport const docxDefaultSchemaMappings = {\n blockMapping: docxBlockMappingForDefaultSchema,\n inlineContentMapping: docxInlineContentMappingForDefaultSchema,\n styleMapping: docxStyleMappingForDefaultSchema,\n};\n","export async function corsProxyResolveFileUrl(url: string) {\n return (\n \"https://corsproxy.api.blocknotejs.org/corsproxy/?url=\" +\n encodeURIComponent(url)\n );\n}\n","/**\n *\n * Helper functions so that we can import files both on vitest, browser and node\n * TODO: should find a way to test automatically in all environments\n */\n\nexport async function loadFileDataUrl(\n requireUrl: { default: string },\n mimeType: string,\n) {\n if (import.meta.env.NODE_ENV === \"test\") {\n const buffer = await loadFileBuffer(requireUrl);\n const fileBase64 = buffer.toString(\"base64\");\n\n const dataUrl = `data:${mimeType};base64,${fileBase64}`;\n return dataUrl;\n } else {\n // in browser, this is already a data url\n return requireUrl.default as string;\n }\n}\n\nexport async function loadFontDataUrl(requireUrl: { default: string }) {\n return loadFileDataUrl(requireUrl, \"font/ttf\");\n}\n\nexport async function loadFileBuffer(requireUrl: {\n default: string;\n}): Promise<Buffer | ArrayBuffer> {\n if (import.meta.env.NODE_ENV === \"test\") {\n // in vitest, this is the url we need to load with readfilesync\n // eslint-disable-next-line\n const fs = require(\"fs\");\n let url = requireUrl.default;\n\n if (url.startsWith(\"/@fs/\")) {\n url = url.substring(\"/@fs\".length);\n }\n const buffer = fs.readFileSync(url);\n return buffer;\n } else {\n // in browser, this is already a data url\n const dataUrl = requireUrl.default as string;\n // convert to buffer on browser\n const response = await fetch(dataUrl);\n const arrayBuffer = await response.arrayBuffer();\n return arrayBuffer;\n }\n}\n\n/**\n * usage:\n * \n * await loadFontDataUrl(\n await import(\"../fonts/inter/Inter_18pt-Italic.ttf\")\n );\n */\n","import {\n Block,\n BlockNoteSchema,\n BlockSchema,\n COLORS_DEFAULT,\n InlineContentSchema,\n StyleSchema,\n StyledText,\n} from \"@blocknote/core\";\nimport {\n AlignmentType,\n Document,\n IRunPropertiesOptions,\n ISectionOptions,\n LevelFormat,\n Packer,\n Paragraph,\n ParagraphChild,\n Tab,\n Table,\n TextRun,\n} from \"docx\";\n\nimport { Exporter, ExporterOptions } from \"@blocknote/core\";\nimport { corsProxyResolveFileUrl } from \"@shared/api/corsProxy.js\";\nimport { loadFileBuffer } from \"@shared/util/fileUtil.js\";\n\n// get constructor arg type from Document\ntype DocumentOptions = Partial<ConstructorParameters<typeof Document>[0]>;\n\nconst DEFAULT_TAB_STOP =\n /* default font size */ 16 *\n /* 1 pixel is 0.75 points */ 0.75 *\n /* 1.5em*/ 1.5 *\n /* 1 point is 20 twips */ 20;\n\n/**\n * Exports a BlockNote document to a .docx file using the docxjs library.\n */\nexport class DOCXExporter<\n B extends BlockSchema,\n S extends StyleSchema,\n I extends InlineContentSchema,\n> extends Exporter<\n B,\n I,\n S,\n Promise<Paragraph[] | Paragraph | Table> | Paragraph[] | Paragraph | Table,\n ParagraphChild,\n IRunPropertiesOptions,\n TextRun\n> {\n public constructor(\n /**\n * The schema of your editor. The mappings are automatically typed checked against this schema.\n */\n protected readonly schema: BlockNoteSchema<B, I, S>,\n /**\n * The mappings that map the BlockNote schema to the docxjs content.\n * Pass {@link docxDefaultSchemaMappings} for the default schema.\n */\n protected readonly mappings: Exporter<\n NoInfer<B>,\n NoInfer<I>,\n NoInfer<S>,\n | Promise<Paragraph[] | Paragraph | Table>\n | Paragraph[]\n | Paragraph\n | Table,\n ParagraphChild,\n IRunPropertiesOptions,\n TextRun\n >[\"mappings\"],\n options?: Partial<ExporterOptions>,\n ) {\n const defaults = {\n colors: COLORS_DEFAULT,\n resolveFileUrl: corsProxyResolveFileUrl,\n } satisfies Partial<ExporterOptions>;\n\n const newOptions = {\n ...defaults,\n ...options,\n };\n super(schema, mappings, newOptions);\n }\n\n /**\n * Mostly for internal use, you probably want to use `toBlob` or `toDocxJsDocument` instead.\n */\n public transformStyledText(styledText: StyledText<S>, hyperlink?: boolean) {\n const stylesArray = this.mapStyles(styledText.styles);\n\n const styles: IRunPropertiesOptions = Object.assign(\n {} as IRunPropertiesOptions,\n ...stylesArray,\n );\n\n return new TextRun({\n ...styles,\n style: hyperlink ? \"Hyperlink\" : undefined,\n text: styledText.text,\n });\n }\n\n /**\n * Mostly for internal use, you probably want to use `toBlob` or `toDocxJsDocument` instead.\n */\n public async transformBlocks(\n blocks: Block<B, I, S>[],\n nestingLevel = 0,\n ): Promise<Array<Paragraph | Table>> {\n const ret: Array<Paragraph | Table> = [];\n\n for (const b of blocks) {\n let children = await this.transformBlocks(b.children, nestingLevel + 1);\n children = children.map((c, _i) => {\n // NOTE: nested tables not supported (we can't insert the new Tab before a table)\n if (\n c instanceof Paragraph &&\n !(c as any).properties.numberingReferences.length\n ) {\n c.addRunToFront(\n new TextRun({\n children: [new Tab()],\n }),\n );\n }\n return c;\n });\n const self = await this.mapBlock(b as any, nestingLevel, 0 /*unused*/); // TODO: any\n if (Array.isArray(self)) {\n ret.push(...self, ...children);\n } else {\n ret.push(self, ...children);\n }\n }\n return ret;\n }\n\n protected async getFonts(): Promise<DocumentOptions[\"fonts\"]> {\n // Unfortunately, loading the variable font doesn't work\n // \"./src/fonts/Inter-VariableFont_opsz,wght.ttf\",\n\n let interFont = await loadFileBuffer(\n await import(\"@shared/assets/fonts/inter/Inter_18pt-Regular.ttf\"),\n );\n let geistMonoFont = await loadFileBuffer(\n await import(\"@shared/assets/fonts/GeistMono-Regular.ttf\"),\n );\n\n if (\n interFont instanceof ArrayBuffer ||\n geistMonoFont instanceof ArrayBuffer\n ) {\n // conversion with Polyfill needed because docxjs requires Buffer\n // NOTE: the buffer/ import is intentional and as documented in\n // the `buffer` package usage instructions\n // https://github.com/feross/buffer?tab=readme-ov-file#usage\n const Buffer = (await import(\"buffer/\")).Buffer;\n\n if (interFont instanceof ArrayBuffer) {\n interFont = Buffer.from(interFont) as unknown as Buffer;\n }\n if (geistMonoFont instanceof ArrayBuffer) {\n geistMonoFont = Buffer.from(geistMonoFont) as unknown as Buffer;\n }\n }\n\n return [\n { name: \"Inter\", data: interFont },\n {\n name: \"GeistMono\",\n data: geistMonoFont,\n },\n ];\n }\n\n protected async createDefaultDocumentOptions(): Promise<DocumentOptions> {\n const externalStyles = (await import(\"./template/word/styles.xml?raw\"))\n .default;\n\n const bullets = [\"•\"]; //, \"◦\", \"▪\"]; (these don't look great, just use solid bullet for now)\n return {\n numbering: {\n config: [\n {\n reference: \"blocknote-numbered-list\",\n levels: Array.from({ length: 9 }, (_, i) => ({\n start: 1,\n level: i,\n format: LevelFormat.DECIMAL,\n text: `%${i + 1}.`,\n alignment: AlignmentType.LEFT,\n style: {\n paragraph: {\n indent: {\n left: DEFAULT_TAB_STOP * (i + 1),\n hanging: DEFAULT_TAB_STOP,\n },\n },\n },\n })),\n },\n {\n reference: \"blocknote-bullet-list\",\n levels: Array.from({ length: 9 }, (_, i) => ({\n start: 1,\n level: i,\n format: LevelFormat.BULLET,\n text: bullets[i % bullets.length],\n alignment: AlignmentType.LEFT,\n style: {\n paragraph: {\n indent: {\n left: DEFAULT_TAB_STOP * (i + 1),\n hanging: DEFAULT_TAB_STOP,\n },\n },\n },\n })),\n },\n ],\n },\n fonts: await this.getFonts(),\n defaultTabStop: 200,\n externalStyles,\n };\n }\n\n /**\n * Convert a document (array of Blocks to a Blob representing a .docx file)\n */\n public async toBlob(\n blocks: Block<B, I, S>[],\n options: {\n sectionOptions: Omit<ISectionOptions, \"children\">;\n documentOptions: DocumentOptions;\n } = {\n sectionOptions: {},\n documentOptions: {},\n },\n ) {\n const doc = await this.toDocxJsDocument(blocks, options);\n type GlobalThis = typeof globalThis & { Buffer?: any };\n const prevBuffer = (globalThis as GlobalThis).Buffer;\n try {\n if (!(globalThis as GlobalThis).Buffer) {\n // load Buffer polyfill because docxjs requires this\n (globalThis as GlobalThis).Buffer = (\n await import(\"buffer\")\n ).default.Buffer;\n }\n return Packer.toBlob(doc);\n } finally {\n (globalThis as GlobalThis).Buffer = prevBuffer;\n }\n }\n\n /**\n * Convert a document (array of Blocks to a docxjs Document)\n */\n public async toDocxJsDocument(\n blocks: Block<B, I, S>[],\n options: {\n sectionOptions: Omit<ISectionOptions, \"children\">;\n documentOptions: DocumentOptions;\n } = {\n sectionOptions: {},\n documentOptions: {},\n },\n ) {\n const doc = new Document({\n ...(await this.createDefaultDocumentOptions()),\n ...options.documentOptions,\n sections: [\n {\n children: await this.transformBlocks(blocks),\n ...options.sectionOptions,\n },\n ],\n });\n\n // fix https://github.com/dolanmiu/docx/pull/2800/files\n doc.Document.Relationships.createRelationship(\n doc.Document.Relationships.RelationshipCount + 1,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable\",\n \"fontTable.xml\",\n );\n\n return doc;\n }\n}\n"],"names":["getImageDimensions","blob","bmp","width","height","imageMetaFunc","bytes","meta","Table","data","headerRows","headerCols","DocxTable","w","row","rowIndex","isHeaderRow","TableRow","c","colIndex","_a","cell","mapTableCell","isHeaderColumn","TableCell","ShadingType","Paragraph","UnreachableCaseError","blockPropsToStyles","props","colors","docxBlockMappingForDefaultSchema","block","exporter","TextRun","nestingLevel","CheckBox","file","caption","textContent","line","index","PageBreak","ImageRun","defaultText","ExternalHyperlink","docxInlineContentMappingForDefaultSchema","ic","content","docxStyleMappingForDefaultSchema","val","docxDefaultSchemaMappings","corsProxyResolveFileUrl","url","loadFileBuffer","requireUrl","dataUrl","DEFAULT_TAB_STOP","DOCXExporter","Exporter","schema","mappings","options","newOptions","COLORS_DEFAULT","styledText","hyperlink","stylesArray","styles","blocks","ret","b","children","_i","Tab","self","interFont","geistMonoFont","Buffer","n","externalStyles","bullets","_","i","LevelFormat","AlignmentType","doc","prevBuffer","Packer","Document"],"mappings":"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"}
1
+ {"version":3,"file":"blocknote-xl-docx-exporter.js","sources":["../../../shared/util/imageUtil.ts","../src/docx/util/Table.tsx","../src/docx/defaultSchema/blocks.ts","../src/docx/defaultSchema/inlinecontent.ts","../src/docx/defaultSchema/styles.ts","../src/docx/defaultSchema/index.ts","../../../shared/api/corsProxy.ts","../../../shared/util/fileUtil.ts","../src/docx/docxExporter.ts"],"sourcesContent":["export async function getImageDimensions(blob: Blob) {\n if (typeof window !== \"undefined\" && import.meta.env.NODE_ENV !== \"test\") {\n const bmp = await createImageBitmap(blob);\n const { width, height } = bmp;\n bmp.close(); // free memory\n return { width, height };\n } else {\n // node or vitest\n const imageMetaFunc = (await import(\"image-meta\")).imageMeta;\n const bytes = new Uint8Array(await blob.arrayBuffer());\n const meta = imageMetaFunc(bytes);\n if (!meta.width || !meta.height) {\n throw new Error(\"Image dimensions not found\");\n }\n return { width: meta.width, height: meta.height };\n }\n}\n","import {\n Exporter,\n InlineContentSchema,\n mapTableCell,\n TableContent,\n UnreachableCaseError,\n} from \"@blocknote/core\";\nimport {\n Table as DocxTable,\n Paragraph,\n ParagraphChild,\n ShadingType,\n TableCell,\n TableRow,\n} from \"docx\";\n\nexport const Table = (\n data: TableContent<InlineContentSchema>,\n t: Exporter<any, any, any, any, ParagraphChild, any, any>,\n) => {\n const DEFAULT_COLUMN_WIDTH = 120;\n\n // If headerRows is 1, then the first row is a header row\n const headerRows = new Array(data.headerRows ?? 0).fill(true);\n // If headerCols is 1, then the first column is a header column\n const headerCols = new Array(data.headerCols ?? 0).fill(true);\n\n return new DocxTable({\n layout: \"autofit\",\n columnWidths: data.columnWidths.map(\n (w) =>\n (w ?? DEFAULT_COLUMN_WIDTH) * /* to points */ 0.75 * /* to twips */ 20,\n ),\n rows: data.rows.map((row, rowIndex) => {\n const isHeaderRow = headerRows[rowIndex];\n return new TableRow({\n tableHeader: isHeaderRow,\n children: row.cells.map((c, colIndex) => {\n const width = data.columnWidths?.[colIndex];\n const cell = mapTableCell(c);\n const isHeaderColumn = headerCols[colIndex];\n\n return new TableCell({\n width: width\n ? {\n size: `${width * 0.75}pt`,\n type: \"dxa\",\n }\n : undefined,\n columnSpan: cell.props.colspan,\n rowSpan: cell.props.rowspan,\n shading:\n cell.props.backgroundColor === \"default\" ||\n !cell.props.backgroundColor\n ? undefined\n : {\n type: ShadingType.SOLID,\n color:\n t.options.colors[\n cell.props\n .backgroundColor as keyof typeof t.options.colors\n ].background.slice(1),\n },\n children: [\n new Paragraph({\n children: t.transformInlineContent(cell.content),\n\n alignment:\n !cell.props.textAlignment ||\n cell.props.textAlignment === \"left\"\n ? undefined\n : cell.props.textAlignment === \"center\"\n ? \"center\"\n : cell.props.textAlignment === \"right\"\n ? \"right\"\n : cell.props.textAlignment === \"justify\"\n ? \"distribute\"\n : (() => {\n throw new UnreachableCaseError(\n cell.props.textAlignment,\n );\n })(),\n run: {\n // TODO add support for table headers exporting, bolding seems to not be working at the moment\n bold: isHeaderRow || isHeaderColumn,\n // TODO table paragraph color seems to not be working at the moment\n // Probably because the runs are setting their own color\n color:\n cell.props.textColor === \"default\" || !cell.props.textColor\n ? undefined\n : t.options.colors[\n cell.props.textColor as keyof typeof t.options.colors\n ].text.slice(1),\n },\n }),\n ],\n });\n }),\n });\n }),\n });\n};\n","import {\n BlockMapping,\n COLORS_DEFAULT,\n DefaultBlockSchema,\n DefaultProps,\n pageBreakSchema,\n StyledText,\n UnreachableCaseError,\n} from \"@blocknote/core\";\nimport { getImageDimensions } from \"@shared/util/imageUtil.js\";\nimport {\n CheckBox,\n Table as DocxTable,\n ExternalHyperlink,\n ImageRun,\n IParagraphOptions,\n PageBreak,\n Paragraph,\n ParagraphChild,\n ShadingType,\n TableCell,\n TableRow,\n TextRun,\n} from \"docx\";\nimport { Table } from \"../util/Table.js\";\nimport { multiColumnSchema } from \"@blocknote/xl-multi-column\";\n\nfunction blockPropsToStyles(\n props: Partial<DefaultProps>,\n colors: typeof COLORS_DEFAULT,\n): IParagraphOptions {\n return {\n shading:\n props.backgroundColor === \"default\" || !props.backgroundColor\n ? undefined\n : {\n type: ShadingType.SOLID,\n color:\n colors[\n props.backgroundColor as keyof typeof colors\n ].background.slice(1),\n },\n run:\n props.textColor === \"default\" || !props.textColor\n ? undefined\n : {\n color: colors[props.textColor as keyof typeof colors].text.slice(1),\n },\n alignment:\n !props.textAlignment || props.textAlignment === \"left\"\n ? undefined\n : props.textAlignment === \"center\"\n ? \"center\"\n : props.textAlignment === \"right\"\n ? \"right\"\n : props.textAlignment === \"justify\"\n ? \"distribute\"\n : (() => {\n throw new UnreachableCaseError(props.textAlignment);\n })(),\n };\n}\nexport const docxBlockMappingForDefaultSchema: BlockMapping<\n DefaultBlockSchema &\n typeof pageBreakSchema.blockSchema &\n typeof multiColumnSchema.blockSchema,\n any,\n any,\n | Promise<Paragraph[] | Paragraph | DocxTable>\n | Paragraph[]\n | Paragraph\n | DocxTable,\n ParagraphChild\n> = {\n paragraph: (block, exporter) => {\n return new Paragraph({\n ...blockPropsToStyles(block.props, exporter.options.colors),\n children: exporter.transformInlineContent(block.content),\n style: \"Normal\",\n run: {\n font: \"Inter\",\n },\n });\n },\n toggleListItem: (block, exporter) => {\n return new Paragraph({\n ...blockPropsToStyles(block.props, exporter.options.colors),\n children: [\n new TextRun({\n children: [\"> \"],\n }),\n ...exporter.transformInlineContent(block.content),\n ],\n });\n },\n numberedListItem: (block, exporter, nestingLevel) => {\n return new Paragraph({\n ...blockPropsToStyles(block.props, exporter.options.colors),\n children: exporter.transformInlineContent(block.content),\n numbering: {\n reference: \"blocknote-numbered-list\",\n level: nestingLevel,\n },\n });\n },\n bulletListItem: (block, exporter, nestingLevel) => {\n return new Paragraph({\n ...blockPropsToStyles(block.props, exporter.options.colors),\n children: exporter.transformInlineContent(block.content),\n numbering: {\n reference: \"blocknote-bullet-list\",\n level: nestingLevel,\n },\n });\n },\n checkListItem: (block, exporter) => {\n return new Paragraph({\n ...blockPropsToStyles(block.props, exporter.options.colors),\n children: [\n new CheckBox({ checked: block.props.checked }),\n new TextRun({\n children: [\" \"],\n }),\n ...exporter.transformInlineContent(block.content),\n ],\n });\n },\n heading: (block, exporter) => {\n return new Paragraph({\n ...blockPropsToStyles(block.props, exporter.options.colors),\n children: exporter.transformInlineContent(block.content),\n heading: `Heading${block.props.level}`,\n });\n },\n quote: (block, exporter) => {\n return new Paragraph({\n shading: {\n color: \"#7D797A\",\n },\n border: {\n left: {\n color: \"#7D797A\",\n space: 100,\n style: \"single\",\n size: 8,\n },\n },\n ...blockPropsToStyles(block.props, exporter.options.colors),\n children: exporter.transformInlineContent(block.content),\n });\n },\n audio: (block, exporter) => {\n return [\n file(block.props, \"Open audio\", exporter),\n ...caption(block.props, exporter),\n ];\n },\n video: (block, exporter) => {\n return [\n file(block.props, \"Open video\", exporter),\n ...caption(block.props, exporter),\n ];\n },\n file: (block, exporter) => {\n return [\n file(block.props, \"Open file\", exporter),\n ...caption(block.props, exporter),\n ];\n },\n codeBlock: (block) => {\n const textContent = (block.content as StyledText<any>[])[0]?.text || \"\";\n\n return new Paragraph({\n style: \"Codeblock\",\n shading: {\n type: ShadingType.SOLID,\n fill: \"161616\",\n color: \"161616\",\n },\n children: [\n ...textContent.split(\"\\n\").map((line, index) => {\n return new TextRun({\n text: line,\n break: index > 0 ? 1 : 0,\n });\n }),\n ],\n });\n },\n pageBreak: () => {\n return new Paragraph({\n children: [new PageBreak()],\n });\n },\n column: (block, _exporter, _nestingLevel, _numberedListIndex, children) => {\n return new TableCell({\n width: {\n size: `${block.props.width * 100}%`,\n type: \"pct\",\n },\n children: (children || []).flatMap((child) => {\n if (Array.isArray(child)) {\n return child;\n }\n\n return [child];\n }),\n }) as any;\n },\n columnList: (\n _block,\n _exporter,\n _nestingLevel,\n _numberedListIndex,\n children,\n ) => {\n return new DocxTable({\n layout: \"autofit\",\n borders: {\n bottom: { style: \"nil\" },\n top: { style: \"nil\" },\n left: { style: \"nil\" },\n right: { style: \"nil\" },\n insideHorizontal: { style: \"nil\" },\n insideVertical: { style: \"nil\" },\n },\n rows: [\n new TableRow({\n children: (children as unknown as TableCell[]).map(\n (cell, _index, children) => {\n return new TableCell({\n width: {\n size: `${(parseFloat(`${cell.options.width?.size || \"100%\"}`) / (children.length * 100)) * 100}%`,\n type: \"pct\",\n },\n children: cell.options.children,\n });\n },\n ),\n }),\n ],\n });\n },\n image: async (block, exporter) => {\n const blob = await exporter.resolveFile(block.props.url);\n const { width, height } = await getImageDimensions(blob);\n\n return [\n new Paragraph({\n ...blockPropsToStyles(block.props, exporter.options.colors),\n children: [\n new ImageRun({\n data: await blob.arrayBuffer(),\n // it would be nicer to set the actual data type here, but then we'd need to use a mime type / image type\n // detector. atm passing gif does not seem to be causing issues as the \"type\" is mainly used by docxjs internally\n // (i.e.: to make sure it's not svg)\n type: \"gif\",\n altText: block.props.caption\n ? {\n description: block.props.caption,\n name: block.props.caption,\n title: block.props.caption,\n }\n : undefined,\n transformation: {\n width: block.props.previewWidth || width,\n height: ((block.props.previewWidth || width) / width) * height,\n },\n }),\n ],\n }),\n ...caption(block.props, exporter),\n ];\n },\n table: (block, exporter) => {\n return Table(block.content, exporter);\n },\n};\n\nfunction file(\n props: Partial<DefaultProps & { name: string; url: string }>,\n defaultText: string,\n exporter: any,\n) {\n return new Paragraph({\n ...blockPropsToStyles(props, exporter.options.colors),\n children: [\n new ExternalHyperlink({\n children: [\n new TextRun({\n text: props.name || defaultText,\n style: \"Hyperlink\",\n }),\n ],\n link: props.url!,\n }),\n ],\n });\n}\n\nfunction caption(\n props: Partial<DefaultProps & { caption: string }>,\n exporter: any,\n) {\n if (!props.caption) {\n return [];\n }\n return [\n new Paragraph({\n ...blockPropsToStyles(props, exporter.options.colors),\n children: [\n new TextRun({\n text: props.caption,\n }),\n ],\n style: \"Caption\",\n }),\n ];\n}\n","import {\n DefaultInlineContentSchema,\n DefaultStyleSchema,\n InlineContentMapping,\n} from \"@blocknote/core\";\nimport { ExternalHyperlink, ParagraphChild, TextRun } from \"docx\";\nimport type { DOCXExporter } from \"../docxExporter.js\";\n\nexport const docxInlineContentMappingForDefaultSchema: InlineContentMapping<\n DefaultInlineContentSchema,\n DefaultStyleSchema,\n ParagraphChild,\n TextRun\n> = {\n link: (ic, exporter) => {\n return new ExternalHyperlink({\n children: ic.content.map((content) => {\n return (exporter as DOCXExporter<any, any, any>).transformStyledText(\n content,\n true,\n );\n }),\n link: ic.href,\n });\n },\n text: (ic, t) => {\n return t.transformStyledText(ic);\n },\n};\n","import { DefaultStyleSchema, StyleMapping } from \"@blocknote/core\";\nimport { IRunPropertiesOptions } from \"docx\";\n\nexport const docxStyleMappingForDefaultSchema: StyleMapping<\n DefaultStyleSchema,\n IRunPropertiesOptions\n> = {\n bold: (val) => {\n if (!val) {\n return {};\n }\n return {\n bold: val,\n };\n },\n italic: (val) => {\n if (!val) {\n return {};\n }\n return {\n italics: val,\n };\n },\n underline: (val) => {\n if (!val) {\n return {};\n }\n return {\n underline: {\n type: \"single\",\n },\n };\n },\n strike: (val) => {\n if (!val) {\n return {};\n }\n return {\n strike: val,\n };\n },\n backgroundColor: (val, exporter) => {\n if (!val) {\n return {};\n }\n return {\n shading: {\n fill: exporter.options.colors[\n val as keyof typeof exporter.options.colors\n ].background.slice(1),\n },\n };\n },\n textColor: (val, exporter) => {\n if (!val) {\n return {};\n }\n return {\n color:\n exporter.options.colors[\n val as keyof typeof exporter.options.colors\n ].text.slice(1),\n };\n },\n code: (val) => {\n if (!val) {\n return {};\n }\n return {\n font: \"GeistMono\",\n };\n },\n};\n","import { docxBlockMappingForDefaultSchema } from \"./blocks.js\";\nimport { docxInlineContentMappingForDefaultSchema } from \"./inlinecontent.js\";\nimport { docxStyleMappingForDefaultSchema } from \"./styles.js\";\n\nexport const docxDefaultSchemaMappings = {\n blockMapping: docxBlockMappingForDefaultSchema,\n inlineContentMapping: docxInlineContentMappingForDefaultSchema,\n styleMapping: docxStyleMappingForDefaultSchema,\n};\n","export async function corsProxyResolveFileUrl(url: string) {\n return (\n \"https://corsproxy.api.blocknotejs.org/corsproxy/?url=\" +\n encodeURIComponent(url)\n );\n}\n","/**\n *\n * Helper functions so that we can import files both on vitest, browser and node\n * TODO: should find a way to test automatically in all environments\n */\n\nexport async function loadFileDataUrl(\n requireUrl: { default: string },\n mimeType: string,\n) {\n if (import.meta.env.NODE_ENV === \"test\") {\n const buffer = await loadFileBuffer(requireUrl);\n const fileBase64 = buffer.toString(\"base64\");\n\n const dataUrl = `data:${mimeType};base64,${fileBase64}`;\n return dataUrl;\n } else {\n // in browser, this is already a data url\n return requireUrl.default as string;\n }\n}\n\nexport async function loadFontDataUrl(requireUrl: { default: string }) {\n return loadFileDataUrl(requireUrl, \"font/ttf\");\n}\n\nexport async function loadFileBuffer(requireUrl: {\n default: string;\n}): Promise<Buffer | ArrayBuffer> {\n if (import.meta.env.NODE_ENV === \"test\") {\n // in vitest, this is the url we need to load with readfilesync\n // eslint-disable-next-line\n const fs = require(\"fs\");\n let url = requireUrl.default;\n\n if (url.startsWith(\"/@fs/\")) {\n url = url.substring(\"/@fs\".length);\n }\n const buffer = fs.readFileSync(url);\n return buffer;\n } else {\n // in browser, this is already a data url\n const dataUrl = requireUrl.default as string;\n // convert to buffer on browser\n const response = await fetch(dataUrl);\n const arrayBuffer = await response.arrayBuffer();\n return arrayBuffer;\n }\n}\n\n/**\n * usage:\n * \n * await loadFontDataUrl(\n await import(\"../fonts/inter/Inter_18pt-Italic.ttf\")\n );\n */\n","import {\n Block,\n BlockNoteSchema,\n BlockSchema,\n COLORS_DEFAULT,\n InlineContentSchema,\n StyleSchema,\n StyledText,\n} from \"@blocknote/core\";\nimport {\n AlignmentType,\n Document,\n IRunPropertiesOptions,\n ISectionOptions,\n LevelFormat,\n Packer,\n Paragraph,\n ParagraphChild,\n Tab,\n Table,\n TextRun,\n} from \"docx\";\n\nimport { Exporter, ExporterOptions } from \"@blocknote/core\";\nimport { corsProxyResolveFileUrl } from \"@shared/api/corsProxy.js\";\nimport { loadFileBuffer } from \"@shared/util/fileUtil.js\";\n\n// get constructor arg type from Document\ntype DocumentOptions = Partial<ConstructorParameters<typeof Document>[0]>;\n\nconst DEFAULT_TAB_STOP =\n /* default font size */ 16 *\n /* 1 pixel is 0.75 points */ 0.75 *\n /* 1.5em*/ 1.5 *\n /* 1 point is 20 twips */ 20;\n\n/**\n * Exports a BlockNote document to a .docx file using the docxjs library.\n */\nexport class DOCXExporter<\n B extends BlockSchema,\n S extends StyleSchema,\n I extends InlineContentSchema,\n> extends Exporter<\n B,\n I,\n S,\n Promise<Paragraph[] | Paragraph | Table> | Paragraph[] | Paragraph | Table,\n ParagraphChild,\n IRunPropertiesOptions,\n TextRun\n> {\n public constructor(\n /**\n * The schema of your editor. The mappings are automatically typed checked against this schema.\n */\n protected readonly schema: BlockNoteSchema<B, I, S>,\n /**\n * The mappings that map the BlockNote schema to the docxjs content.\n * Pass {@link docxDefaultSchemaMappings} for the default schema.\n */\n protected readonly mappings: Exporter<\n NoInfer<B>,\n NoInfer<I>,\n NoInfer<S>,\n | Promise<Paragraph[] | Paragraph | Table>\n | Paragraph[]\n | Paragraph\n | Table,\n ParagraphChild,\n IRunPropertiesOptions,\n TextRun\n >[\"mappings\"],\n options?: Partial<ExporterOptions>,\n ) {\n const defaults = {\n colors: COLORS_DEFAULT,\n resolveFileUrl: corsProxyResolveFileUrl,\n } satisfies Partial<ExporterOptions>;\n\n const newOptions = {\n ...defaults,\n ...options,\n };\n super(schema, mappings, newOptions);\n }\n\n /**\n * Mostly for internal use, you probably want to use `toBlob` or `toDocxJsDocument` instead.\n */\n public transformStyledText(styledText: StyledText<S>, hyperlink?: boolean) {\n const stylesArray = this.mapStyles(styledText.styles);\n\n const styles: IRunPropertiesOptions = Object.assign(\n {} as IRunPropertiesOptions,\n ...stylesArray,\n );\n\n return new TextRun({\n ...styles,\n style: hyperlink ? \"Hyperlink\" : undefined,\n text: styledText.text,\n });\n }\n\n /**\n * Mostly for internal use, you probably want to use `toBlob` or `toDocxJsDocument` instead.\n */\n public async transformBlocks(\n blocks: Block<B, I, S>[],\n nestingLevel = 0,\n ): Promise<Array<Paragraph | Table>> {\n const ret: Array<Paragraph | Table> = [];\n\n for (const b of blocks) {\n let children = await this.transformBlocks(b.children, nestingLevel + 1);\n\n if (![\"columnList\", \"column\"].includes(b.type)) {\n children = children.map((c, _i) => {\n // NOTE: nested tables not supported (we can't insert the new Tab before a table)\n if (\n c instanceof Paragraph &&\n !(c as any).properties.numberingReferences.length\n ) {\n c.addRunToFront(\n new TextRun({\n children: [new Tab()],\n }),\n );\n }\n return c;\n });\n }\n\n const self = await this.mapBlock(\n b as any,\n nestingLevel,\n 0 /*unused*/,\n children,\n ); // TODO: any\n if ([\"columnList\", \"column\"].includes(b.type)) {\n ret.push(self as Table);\n } else if (Array.isArray(self)) {\n ret.push(...self, ...children);\n } else {\n ret.push(self, ...children);\n }\n }\n return ret;\n }\n\n protected async getFonts(): Promise<DocumentOptions[\"fonts\"]> {\n // Unfortunately, loading the variable font doesn't work\n // \"./src/fonts/Inter-VariableFont_opsz,wght.ttf\",\n\n let interFont = await loadFileBuffer(\n await import(\"@shared/assets/fonts/inter/Inter_18pt-Regular.ttf\"),\n );\n let geistMonoFont = await loadFileBuffer(\n await import(\"@shared/assets/fonts/GeistMono-Regular.ttf\"),\n );\n\n if (\n interFont instanceof ArrayBuffer ||\n geistMonoFont instanceof ArrayBuffer\n ) {\n // conversion with Polyfill needed because docxjs requires Buffer\n // NOTE: the buffer/ import is intentional and as documented in\n // the `buffer` package usage instructions\n // https://github.com/feross/buffer?tab=readme-ov-file#usage\n const Buffer = (await import(\"buffer/\")).Buffer;\n\n if (interFont instanceof ArrayBuffer) {\n interFont = Buffer.from(interFont) as unknown as Buffer;\n }\n if (geistMonoFont instanceof ArrayBuffer) {\n geistMonoFont = Buffer.from(geistMonoFont) as unknown as Buffer;\n }\n }\n\n return [\n { name: \"Inter\", data: interFont },\n {\n name: \"GeistMono\",\n data: geistMonoFont,\n },\n ];\n }\n\n protected async createDefaultDocumentOptions(): Promise<DocumentOptions> {\n const externalStyles = (await import(\"./template/word/styles.xml?raw\"))\n .default;\n\n const bullets = [\"•\"]; //, \"◦\", \"▪\"]; (these don't look great, just use solid bullet for now)\n return {\n numbering: {\n config: [\n {\n reference: \"blocknote-numbered-list\",\n levels: Array.from({ length: 9 }, (_, i) => ({\n start: 1,\n level: i,\n format: LevelFormat.DECIMAL,\n text: `%${i + 1}.`,\n alignment: AlignmentType.LEFT,\n style: {\n paragraph: {\n indent: {\n left: DEFAULT_TAB_STOP * (i + 1),\n hanging: DEFAULT_TAB_STOP,\n },\n },\n },\n })),\n },\n {\n reference: \"blocknote-bullet-list\",\n levels: Array.from({ length: 9 }, (_, i) => ({\n start: 1,\n level: i,\n format: LevelFormat.BULLET,\n text: bullets[i % bullets.length],\n alignment: AlignmentType.LEFT,\n style: {\n paragraph: {\n indent: {\n left: DEFAULT_TAB_STOP * (i + 1),\n hanging: DEFAULT_TAB_STOP,\n },\n },\n },\n })),\n },\n ],\n },\n fonts: await this.getFonts(),\n defaultTabStop: 200,\n externalStyles,\n };\n }\n\n /**\n * Convert a document (array of Blocks to a Blob representing a .docx file)\n */\n public async toBlob(\n blocks: Block<B, I, S>[],\n options: {\n sectionOptions: Omit<ISectionOptions, \"children\">;\n documentOptions: DocumentOptions;\n } = {\n sectionOptions: {},\n documentOptions: {},\n },\n ) {\n const doc = await this.toDocxJsDocument(blocks, options);\n type GlobalThis = typeof globalThis & { Buffer?: any };\n const prevBuffer = (globalThis as GlobalThis).Buffer;\n try {\n if (!(globalThis as GlobalThis).Buffer) {\n // load Buffer polyfill because docxjs requires this\n (globalThis as GlobalThis).Buffer = (\n await import(\"buffer\")\n ).default.Buffer;\n }\n return Packer.toBlob(doc);\n } finally {\n (globalThis as GlobalThis).Buffer = prevBuffer;\n }\n }\n\n /**\n * Convert a document (array of Blocks to a docxjs Document)\n */\n public async toDocxJsDocument(\n blocks: Block<B, I, S>[],\n options: {\n sectionOptions: Omit<ISectionOptions, \"children\">;\n documentOptions: DocumentOptions;\n } = {\n sectionOptions: {},\n documentOptions: {},\n },\n ) {\n const doc = new Document({\n ...(await this.createDefaultDocumentOptions()),\n ...options.documentOptions,\n sections: [\n {\n children: await this.transformBlocks(blocks),\n ...options.sectionOptions,\n },\n ],\n });\n\n return doc;\n }\n}\n"],"names":["getImageDimensions","blob","bmp","width","height","imageMetaFunc","bytes","meta","Table","data","headerRows","headerCols","DocxTable","w","row","rowIndex","isHeaderRow","TableRow","c","colIndex","_a","cell","mapTableCell","isHeaderColumn","TableCell","ShadingType","Paragraph","UnreachableCaseError","blockPropsToStyles","props","colors","docxBlockMappingForDefaultSchema","block","exporter","TextRun","nestingLevel","CheckBox","file","caption","textContent","line","index","PageBreak","_exporter","_nestingLevel","_numberedListIndex","children","child","_block","_index","ImageRun","defaultText","ExternalHyperlink","docxInlineContentMappingForDefaultSchema","ic","content","docxStyleMappingForDefaultSchema","val","docxDefaultSchemaMappings","corsProxyResolveFileUrl","url","loadFileBuffer","requireUrl","dataUrl","DEFAULT_TAB_STOP","DOCXExporter","Exporter","schema","mappings","options","newOptions","COLORS_DEFAULT","styledText","hyperlink","stylesArray","styles","blocks","ret","b","_i","Tab","self","interFont","geistMonoFont","Buffer","n","externalStyles","bullets","_","i","LevelFormat","AlignmentType","doc","prevBuffer","Packer","Document"],"mappings":"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"}