@blocknote/xl-docx-exporter 0.25.0 → 0.25.1
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/dist/blocknote-xl-docx-exporter.cjs +1 -1
- package/dist/blocknote-xl-docx-exporter.cjs.map +1 -1
- package/dist/blocknote-xl-docx-exporter.js +11 -11
- package/dist/blocknote-xl-docx-exporter.js.map +1 -1
- package/dist/webpack-stats.json +1 -1
- package/package.json +3 -3
- package/src/docx/docxExporter.ts +2 -2
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use strict";var D=Object.create;var b=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var B=Object.getOwnPropertyNames;var S=Object.getPrototypeOf,O=Object.prototype.hasOwnProperty;var v=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of B(t))!O.call(e,i)&&i!==n&&b(e,i,{get:()=>t[i],enumerable:!(r=A(t,i))||r.enumerable});return e};var h=(e,t,n)=>(n=e!=null?D(S(e)):{},v(t||!e||!e.__esModule?b(n,"default",{value:e,enumerable:!0}):n,e));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const p=require("@blocknote/core"),o=require("docx");var E={BASE_URL:"/",MODE:"production",DEV:!1,PROD:!0,SSR:!1};async function R(e){if(typeof window<"u"&&E.NODE_ENV!=="test"){const t=await createImageBitmap(e),{width:n,height:r}=t;return t.close(),{width:n,height:r}}else{const t=(await import("image-meta")).imageMeta,n=new Uint8Array(await e.arrayBuffer()),r=t(n);if(!r.width||!r.height)throw new Error("Image dimensions not found");return{width:r.width,height:r.height}}}const k=(e,t)=>{const r=new Array(e.headerRows??0).fill(!0),i=new Array(e.headerCols??0).fill(!0);return new o.Table({layout:"autofit",columnWidths:e.columnWidths.map(s=>(s??120)*.75*20),rows:e.rows.map((s,u)=>{const c=r[u];return new o.TableRow({tableHeader:c,children:s.cells.map((g,w)=>{var x;const y=(x=e.columnWidths)==null?void 0:x[w],a=p.mapTableCell(g),T=i[w];return new o.TableCell({width:y?{size:`${y*.75}pt`,type:"dxa"}:void 0,columnSpan:a.props.colspan,rowSpan:a.props.rowspan,shading:a.props.backgroundColor==="default"||!a.props.backgroundColor?void 0:{type:o.ShadingType.SOLID,color:t.options.colors[a.props.backgroundColor].background.slice(1)},children:[new o.Paragraph({children:t.transformInlineContent(a.content),alignment:!a.props.textAlignment||a.props.textAlignment==="left"?void 0:a.props.textAlignment==="center"?"center":a.props.textAlignment==="right"?"right":a.props.textAlignment==="justify"?"distribute":(()=>{throw new p.UnreachableCaseError(a.props.textAlignment)})(),run:{bold:c||T,color:a.props.textColor==="default"||!a.props.textColor?void 0:t.options.colors[a.props.textColor].text.slice(1)}})]})})})})})};function l(e,t){return{shading:e.backgroundColor==="default"||!e.backgroundColor?void 0:{type:o.ShadingType.SOLID,color:t[e.backgroundColor].background.slice(1)},run:e.textColor==="default"||!e.textColor?void 0:{color:t[e.textColor].text.slice(1)},alignment:!e.textAlignment||e.textAlignment==="left"?void 0:e.textAlignment==="center"?"center":e.textAlignment==="right"?"right":e.textAlignment==="justify"?"distribute":(()=>{throw new p.UnreachableCaseError(e.textAlignment)})()}}const P={paragraph:(e,t)=>new o.Paragraph({...l(e.props,t.options.colors),children:t.transformInlineContent(e.content),style:"Normal",run:{font:"Inter"}}),numberedListItem:(e,t,n)=>new o.Paragraph({...l(e.props,t.options.colors),children:t.transformInlineContent(e.content),numbering:{reference:"blocknote-numbered-list",level:n}}),bulletListItem:(e,t,n)=>new o.Paragraph({...l(e.props,t.options.colors),children:t.transformInlineContent(e.content),numbering:{reference:"blocknote-bullet-list",level:n}}),checkListItem:(e,t)=>new o.Paragraph({...l(e.props,t.options.colors),children:[new o.CheckBox({checked:e.props.checked}),new o.TextRun({children:[" "]}),...t.transformInlineContent(e.content)]}),heading:(e,t)=>new o.Paragraph({...l(e.props,t.options.colors),children:t.transformInlineContent(e.content),heading:`Heading${e.props.level}`}),audio:(e,t)=>[m(e.props,"Open audio",t),...f(e.props,t)],video:(e,t)=>[m(e.props,"Open video",t),...f(e.props,t)],file:(e,t)=>[m(e.props,"Open file",t),...f(e.props,t)],codeBlock:e=>{var n;const t=((n=e.content[0])==null?void 0:n.text)||"";return new o.Paragraph({style:"Codeblock",shading:{type:o.ShadingType.SOLID,fill:"161616",color:"161616"},children:[...t.split(`
|
|
2
|
-
`).map((r,i)=>new o.TextRun({text:r,break:i>0?1:0}))]})},pageBreak:()=>new o.Paragraph({children:[new o.PageBreak]}),image:async(e,t)=>{const n=await t.resolveFile(e.props.url),{width:r,height:i}=await R(n);return[new o.Paragraph({...l(e.props,t.options.colors),children:[new o.ImageRun({data:await n.arrayBuffer(),type:"gif",altText:e.props.caption?{description:e.props.caption,name:e.props.caption,title:e.props.caption}:void 0,transformation:{width:e.props.previewWidth,height:e.props.previewWidth/r*i}})]}),...f(e.props,t)]},table:(e,t)=>k(e.content,t)};function m(e,t,n){return new o.Paragraph({...l(e,n.options.colors),children:[new o.ExternalHyperlink({children:[new o.TextRun({text:e.name||t,style:"Hyperlink"})],link:e.url})]})}function f(e,t){return e.caption?[new o.Paragraph({...l(e,t.options.colors),children:[new o.TextRun({text:e.caption})],style:"Caption"})]:[]}const F={link:(e,t)=>new o.ExternalHyperlink({children:e.content.map(n=>t.transformStyledText(n,!0)),link:e.href}),text:(e,t)=>t.transformStyledText(e)},I={bold:e=>e?{bold:e}:{},italic:e=>e?{italics:e}:{},underline:e=>e?{underline:{type:"single"}}:{},strike:e=>e?{strike:e}:{},backgroundColor:(e,t)=>e?{shading:{fill:t.options.colors[e].background.slice(1)}}:{},textColor:(e,t)=>e?{color:t.options.colors[e].text.slice(1)}:{},code:e=>e?{font:"GeistMono"}:{}},_={blockMapping:P,inlineContentMapping:F,styleMapping:I};async function L(e){return"https://corsproxy.api.blocknotejs.org/corsproxy/?url="+encodeURIComponent(e)}var M={BASE_URL:"/",MODE:"production",DEV:!1,PROD:!0,SSR:!1};async function C(e){if(M.NODE_ENV==="test"){const t=require("fs");let n=e.default;return n.startsWith("/@fs/")&&(n=n.substring(4)),t.readFileSync(n)}else{const t=e.default;return await(await fetch(t)).arrayBuffer()}}const d=16*.75*1.5*20;class U extends p.Exporter{constructor(t,n,r){const s={...{colors:p.COLORS_DEFAULT,resolveFileUrl:L},...r};super(t,n,s),this.schema=t,this.mappings=n}transformStyledText(t,n){const r=this.mapStyles(t.styles),i=Object.assign({},...r);return new o.TextRun({...i,style:n?"Hyperlink":void 0,text:t.text})}async transformBlocks(t,n=0){const r=[];for(const i of t){let s=await this.transformBlocks(i.children,n+1);s=s.map((c,g)=>(c instanceof o.Paragraph&&!c.properties.numberingReferences.length&&c.addRunToFront(new o.TextRun({children:[new o.Tab]})),c));const u=await this.mapBlock(i,n,0);Array.isArray(u)?r.push(...u,...s):r.push(u,...s)}return r}async getFonts(){let t=await C(await Promise.resolve().then(()=>require("./Inter_18pt-Regular-CCMUw8TC.cjs"))),n=await C(await Promise.resolve().then(()=>require("./GeistMono-Regular--NrcstcO.cjs")));if(t instanceof ArrayBuffer||n instanceof Uint8Array){const r=(await import("buffer")).Buffer;t instanceof ArrayBuffer&&(t=r.from(t)),n instanceof ArrayBuffer&&(n=r.from(n))}return[{name:"Inter",data:t},{name:"GeistMono",data:n}]}async createDefaultDocumentOptions(){const t=(await Promise.resolve().then(()=>require("./styles-C7c5RlKz.cjs"))).default,n=["•"];return{numbering:{config:[{reference:"blocknote-numbered-list",levels:Array.from({length:9},(r,i)=>({start:1,level:i,format:o.LevelFormat.DECIMAL,text:`%${i+1}.`,alignment:o.AlignmentType.LEFT,style:{paragraph:{indent:{left:d*(i+1),hanging:d}}}}))},{reference:"blocknote-bullet-list",levels:Array.from({length:9},(r,i)=>({start:1,level:i,format:o.LevelFormat.BULLET,text:n[i%n.length],alignment:o.AlignmentType.LEFT,style:{paragraph:{indent:{left:d*(i+1),hanging:d}}}}))}]},fonts:await this.getFonts(),defaultTabStop:200,externalStyles:t}}async toBlob(t,n={sectionOptions:{},documentOptions:{}}){const r=await this.toDocxJsDocument(t,n),i=globalThis.Buffer;try{return globalThis.Buffer||(globalThis.Buffer=(await import("buffer")).Buffer),o.Packer.toBlob(r)}finally{globalThis.Buffer=i}}async toDocxJsDocument(t,n={sectionOptions:{},documentOptions:{}}){const r=new o.Document({...await this.createDefaultDocumentOptions(),...n.documentOptions,sections:[{children:await this.transformBlocks(t),...n.sectionOptions}]});return r.Document.Relationships.createRelationship(r.Document.Relationships.RelationshipCount+1,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable","fontTable.xml"),r}}exports.DOCXExporter=U;exports.docxDefaultSchemaMappings=_;
|
|
2
|
+
`).map((r,i)=>new o.TextRun({text:r,break:i>0?1:0}))]})},pageBreak:()=>new o.Paragraph({children:[new o.PageBreak]}),image:async(e,t)=>{const n=await t.resolveFile(e.props.url),{width:r,height:i}=await R(n);return[new o.Paragraph({...l(e.props,t.options.colors),children:[new o.ImageRun({data:await n.arrayBuffer(),type:"gif",altText:e.props.caption?{description:e.props.caption,name:e.props.caption,title:e.props.caption}:void 0,transformation:{width:e.props.previewWidth,height:e.props.previewWidth/r*i}})]}),...f(e.props,t)]},table:(e,t)=>k(e.content,t)};function m(e,t,n){return new o.Paragraph({...l(e,n.options.colors),children:[new o.ExternalHyperlink({children:[new o.TextRun({text:e.name||t,style:"Hyperlink"})],link:e.url})]})}function f(e,t){return e.caption?[new o.Paragraph({...l(e,t.options.colors),children:[new o.TextRun({text:e.caption})],style:"Caption"})]:[]}const F={link:(e,t)=>new o.ExternalHyperlink({children:e.content.map(n=>t.transformStyledText(n,!0)),link:e.href}),text:(e,t)=>t.transformStyledText(e)},I={bold:e=>e?{bold:e}:{},italic:e=>e?{italics:e}:{},underline:e=>e?{underline:{type:"single"}}:{},strike:e=>e?{strike:e}:{},backgroundColor:(e,t)=>e?{shading:{fill:t.options.colors[e].background.slice(1)}}:{},textColor:(e,t)=>e?{color:t.options.colors[e].text.slice(1)}:{},code:e=>e?{font:"GeistMono"}:{}},_={blockMapping:P,inlineContentMapping:F,styleMapping:I};async function L(e){return"https://corsproxy.api.blocknotejs.org/corsproxy/?url="+encodeURIComponent(e)}var M={BASE_URL:"/",MODE:"production",DEV:!1,PROD:!0,SSR:!1};async function C(e){if(M.NODE_ENV==="test"){const t=require("fs");let n=e.default;return n.startsWith("/@fs/")&&(n=n.substring(4)),t.readFileSync(n)}else{const t=e.default;return await(await fetch(t)).arrayBuffer()}}const d=16*.75*1.5*20;class U extends p.Exporter{constructor(t,n,r){const s={...{colors:p.COLORS_DEFAULT,resolveFileUrl:L},...r};super(t,n,s),this.schema=t,this.mappings=n}transformStyledText(t,n){const r=this.mapStyles(t.styles),i=Object.assign({},...r);return new o.TextRun({...i,style:n?"Hyperlink":void 0,text:t.text})}async transformBlocks(t,n=0){const r=[];for(const i of t){let s=await this.transformBlocks(i.children,n+1);s=s.map((c,g)=>(c instanceof o.Paragraph&&!c.properties.numberingReferences.length&&c.addRunToFront(new o.TextRun({children:[new o.Tab]})),c));const u=await this.mapBlock(i,n,0);Array.isArray(u)?r.push(...u,...s):r.push(u,...s)}return r}async getFonts(){let t=await C(await Promise.resolve().then(()=>require("./Inter_18pt-Regular-CCMUw8TC.cjs"))),n=await C(await Promise.resolve().then(()=>require("./GeistMono-Regular--NrcstcO.cjs")));if(t instanceof ArrayBuffer||n instanceof Uint8Array){const r=(await import("buffer")).default.Buffer;t instanceof ArrayBuffer&&(t=r.from(t)),n instanceof ArrayBuffer&&(n=r.from(n))}return[{name:"Inter",data:t},{name:"GeistMono",data:n}]}async createDefaultDocumentOptions(){const t=(await Promise.resolve().then(()=>require("./styles-C7c5RlKz.cjs"))).default,n=["•"];return{numbering:{config:[{reference:"blocknote-numbered-list",levels:Array.from({length:9},(r,i)=>({start:1,level:i,format:o.LevelFormat.DECIMAL,text:`%${i+1}.`,alignment:o.AlignmentType.LEFT,style:{paragraph:{indent:{left:d*(i+1),hanging:d}}}}))},{reference:"blocknote-bullet-list",levels:Array.from({length:9},(r,i)=>({start:1,level:i,format:o.LevelFormat.BULLET,text:n[i%n.length],alignment:o.AlignmentType.LEFT,style:{paragraph:{indent:{left:d*(i+1),hanging:d}}}}))}]},fonts:await this.getFonts(),defaultTabStop:200,externalStyles:t}}async toBlob(t,n={sectionOptions:{},documentOptions:{}}){const r=await this.toDocxJsDocument(t,n),i=globalThis.Buffer;try{return globalThis.Buffer||(globalThis.Buffer=(await import("buffer")).default.Buffer),o.Packer.toBlob(r)}finally{globalThis.Buffer=i}}async toDocxJsDocument(t,n={sectionOptions:{},documentOptions:{}}){const r=new o.Document({...await this.createDefaultDocumentOptions(),...n.documentOptions,sections:[{children:await this.transformBlocks(t),...n.sectionOptions}]});return r.Document.Relationships.createRelationship(r.Document.Relationships.RelationshipCount+1,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable","fontTable.xml"),r}}exports.DOCXExporter=U;exports.docxDefaultSchemaMappings=_;
|
|
3
3
|
//# sourceMappingURL=blocknote-xl-docx-exporter.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blocknote-xl-docx-exporter.cjs","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 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 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,\n height: (block.props.previewWidth / 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 Uint8Array\n ) {\n // conversion with Polyfill needed because docxjs requires Buffer\n const Buffer = (await import(\"buffer\")).Buffer;\n\n if (interFont instanceof ArrayBuffer) {\n interFont = Buffer.from(interFont);\n }\n if (geistMonoFont instanceof ArrayBuffer) {\n geistMonoFont = Buffer.from(geistMonoFont);\n }\n }\n\n return [\n { name: \"Inter\", data: interFont as Buffer },\n {\n name: \"GeistMono\",\n data: geistMonoFont as Buffer,\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 const prevBuffer = globalThis.Buffer;\n try {\n if (!globalThis.Buffer) {\n // load Buffer polyfill because docxjs requires this\n globalThis.Buffer = (await import(\"buffer\")).Buffer;\n }\n return Packer.toBlob(doc);\n } finally {\n 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","define_import_meta_env_default","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","nestingLevel","CheckBox","TextRun","file","caption","textContent","line","index","PageBreak","ImageRun","defaultText","ExternalHyperlink","docxInlineContentMappingForDefaultSchema","ic","content","docxStyleMappingForDefaultSchema","val","docxDefaultSchemaMappings","corsProxyResolveFileUrl","url","loadFileBuffer","requireUrl","fs","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","externalStyles","bullets","_","LevelFormat","AlignmentType","doc","prevBuffer","Packer","Document"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"blocknote-xl-docx-exporter.cjs","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 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 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,\n height: (block.props.previewWidth / 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 Uint8Array\n ) {\n // conversion with Polyfill needed because docxjs requires Buffer\n const Buffer = (await import(\"buffer\")).default.Buffer;\n\n if (interFont instanceof ArrayBuffer) {\n interFont = Buffer.from(interFont);\n }\n if (geistMonoFont instanceof ArrayBuffer) {\n geistMonoFont = Buffer.from(geistMonoFont);\n }\n }\n\n return [\n { name: \"Inter\", data: interFont as Buffer },\n {\n name: \"GeistMono\",\n data: geistMonoFont as Buffer,\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 const prevBuffer = globalThis.Buffer;\n try {\n if (!globalThis.Buffer) {\n // load Buffer polyfill because docxjs requires this\n globalThis.Buffer = (await import(\"buffer\")).default.Buffer;\n }\n return Packer.toBlob(doc);\n } finally {\n 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","define_import_meta_env_default","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","nestingLevel","CheckBox","TextRun","file","caption","textContent","line","index","PageBreak","ImageRun","defaultText","ExternalHyperlink","docxInlineContentMappingForDefaultSchema","ic","content","docxStyleMappingForDefaultSchema","val","docxDefaultSchemaMappings","corsProxyResolveFileUrl","url","loadFileBuffer","requireUrl","fs","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","externalStyles","bullets","_","LevelFormat","AlignmentType","doc","prevBuffer","Packer","Document"],"mappings":"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"}
|
|
@@ -21,8 +21,8 @@ const W = (e, t) => {
|
|
|
21
21
|
0.75 * /* to twips */
|
|
22
22
|
20
|
|
23
23
|
),
|
|
24
|
-
rows: e.rows.map((a,
|
|
25
|
-
const c = r[
|
|
24
|
+
rows: e.rows.map((a, f) => {
|
|
25
|
+
const c = r[f];
|
|
26
26
|
return new k({
|
|
27
27
|
tableHeader: c,
|
|
28
28
|
children: a.cells.map((g, w) => {
|
|
@@ -118,15 +118,15 @@ const N = {
|
|
|
118
118
|
}),
|
|
119
119
|
audio: (e, t) => [
|
|
120
120
|
m(e.props, "Open audio", t),
|
|
121
|
-
...
|
|
121
|
+
...p(e.props, t)
|
|
122
122
|
],
|
|
123
123
|
video: (e, t) => [
|
|
124
124
|
m(e.props, "Open video", t),
|
|
125
|
-
...
|
|
125
|
+
...p(e.props, t)
|
|
126
126
|
],
|
|
127
127
|
file: (e, t) => [
|
|
128
128
|
m(e.props, "Open file", t),
|
|
129
|
-
...
|
|
129
|
+
...p(e.props, t)
|
|
130
130
|
],
|
|
131
131
|
codeBlock: (e) => {
|
|
132
132
|
var n;
|
|
@@ -174,7 +174,7 @@ const N = {
|
|
|
174
174
|
})
|
|
175
175
|
]
|
|
176
176
|
}),
|
|
177
|
-
...
|
|
177
|
+
...p(e.props, t)
|
|
178
178
|
];
|
|
179
179
|
},
|
|
180
180
|
table: (e, t) => W(e.content, t)
|
|
@@ -195,7 +195,7 @@ function m(e, t, n) {
|
|
|
195
195
|
]
|
|
196
196
|
});
|
|
197
197
|
}
|
|
198
|
-
function
|
|
198
|
+
function p(e, t) {
|
|
199
199
|
return e.caption ? [
|
|
200
200
|
new s({
|
|
201
201
|
...l(e, t.options.colors),
|
|
@@ -306,13 +306,13 @@ class q extends S {
|
|
|
306
306
|
children: [new L()]
|
|
307
307
|
})
|
|
308
308
|
), c));
|
|
309
|
-
const
|
|
309
|
+
const f = await this.mapBlock(
|
|
310
310
|
o,
|
|
311
311
|
n,
|
|
312
312
|
0
|
|
313
313
|
/*unused*/
|
|
314
314
|
);
|
|
315
|
-
Array.isArray(
|
|
315
|
+
Array.isArray(f) ? r.push(...f, ...a) : r.push(f, ...a);
|
|
316
316
|
}
|
|
317
317
|
return r;
|
|
318
318
|
}
|
|
@@ -323,7 +323,7 @@ class q extends S {
|
|
|
323
323
|
await import("./GeistMono-Regular-D4rKXxwr.js")
|
|
324
324
|
);
|
|
325
325
|
if (t instanceof ArrayBuffer || n instanceof Uint8Array) {
|
|
326
|
-
const r = (await import("buffer")).Buffer;
|
|
326
|
+
const r = (await import("buffer")).default.Buffer;
|
|
327
327
|
t instanceof ArrayBuffer && (t = r.from(t)), n instanceof ArrayBuffer && (n = r.from(n));
|
|
328
328
|
}
|
|
329
329
|
return [
|
|
@@ -391,7 +391,7 @@ class q extends S {
|
|
|
391
391
|
}) {
|
|
392
392
|
const r = await this.toDocxJsDocument(t, n), o = globalThis.Buffer;
|
|
393
393
|
try {
|
|
394
|
-
return globalThis.Buffer || (globalThis.Buffer = (await import("buffer")).Buffer), M.toBlob(r);
|
|
394
|
+
return globalThis.Buffer || (globalThis.Buffer = (await import("buffer")).default.Buffer), M.toBlob(r);
|
|
395
395
|
} finally {
|
|
396
396
|
globalThis.Buffer = o;
|
|
397
397
|
}
|
|
@@ -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 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 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,\n height: (block.props.previewWidth / 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 Uint8Array\n ) {\n // conversion with Polyfill needed because docxjs requires Buffer\n const Buffer = (await import(\"buffer\")).Buffer;\n\n if (interFont instanceof ArrayBuffer) {\n interFont = Buffer.from(interFont);\n }\n if (geistMonoFont instanceof ArrayBuffer) {\n geistMonoFont = Buffer.from(geistMonoFont);\n }\n }\n\n return [\n { name: \"Inter\", data: interFont as Buffer },\n {\n name: \"GeistMono\",\n data: geistMonoFont as Buffer,\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 const prevBuffer = globalThis.Buffer;\n try {\n if (!globalThis.Buffer) {\n // load Buffer polyfill because docxjs requires this\n globalThis.Buffer = (await import(\"buffer\")).Buffer;\n }\n return Packer.toBlob(doc);\n } finally {\n 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","define_import_meta_env_default","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","nestingLevel","CheckBox","TextRun","file","caption","textContent","line","index","PageBreak","ImageRun","defaultText","ExternalHyperlink","docxInlineContentMappingForDefaultSchema","ic","content","docxStyleMappingForDefaultSchema","val","docxDefaultSchemaMappings","corsProxyResolveFileUrl","url","loadFileBuffer","requireUrl","fs","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","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 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 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 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,\n height: (block.props.previewWidth / 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 Uint8Array\n ) {\n // conversion with Polyfill needed because docxjs requires Buffer\n const Buffer = (await import(\"buffer\")).default.Buffer;\n\n if (interFont instanceof ArrayBuffer) {\n interFont = Buffer.from(interFont);\n }\n if (geistMonoFont instanceof ArrayBuffer) {\n geistMonoFont = Buffer.from(geistMonoFont);\n }\n }\n\n return [\n { name: \"Inter\", data: interFont as Buffer },\n {\n name: \"GeistMono\",\n data: geistMonoFont as Buffer,\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 const prevBuffer = globalThis.Buffer;\n try {\n if (!globalThis.Buffer) {\n // load Buffer polyfill because docxjs requires this\n globalThis.Buffer = (await import(\"buffer\")).default.Buffer;\n }\n return Packer.toBlob(doc);\n } finally {\n 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","define_import_meta_env_default","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","nestingLevel","CheckBox","TextRun","file","caption","textContent","line","index","PageBreak","ImageRun","defaultText","ExternalHyperlink","docxInlineContentMappingForDefaultSchema","ic","content","docxStyleMappingForDefaultSchema","val","docxDefaultSchemaMappings","corsProxyResolveFileUrl","url","loadFileBuffer","requireUrl","fs","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","externalStyles","bullets","_","i","LevelFormat","AlignmentType","doc","prevBuffer","Packer","Document"],"mappings":"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"}
|
package/dist/webpack-stats.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"builtAt":
|
|
1
|
+
{"builtAt":1741193165035,"assets":[{"name":"blocknote-xl-docx-exporter.cjs","size":8201},{"name":"styles-C7c5RlKz.cjs","size":55568},{"name":"GeistMono-Regular--NrcstcO.cjs","size":155187},{"name":"Inter_18pt-Regular-CCMUw8TC.cjs","size":457096},{"name":"styles-C7c5RlKz.cjs.map","size":72356},{"name":"GeistMono-Regular--NrcstcO.cjs.map","size":155239},{"name":"Inter_18pt-Regular-CCMUw8TC.cjs.map","size":457156},{"name":"blocknote-xl-docx-exporter.cjs.map","size":33519}],"chunks":[{"id":"a1ee98a","entry":true,"initial":true,"files":["blocknote-xl-docx-exporter.cjs"],"names":["blocknote-xl-docx-exporter"]},{"id":"714dba6","entry":false,"initial":false,"files":["styles-C7c5RlKz.cjs"],"names":["styles"]},{"id":"642be88","entry":false,"initial":false,"files":["GeistMono-Regular--NrcstcO.cjs"],"names":["GeistMono-Regular"]},{"id":"b6f14fb","entry":false,"initial":false,"files":["Inter_18pt-Regular-CCMUw8TC.cjs"],"names":["Inter_18pt-Regular"]}],"modules":[{"name":"../../shared/util/imageUtil.ts","size":714,"chunks":["a1ee98a"]},{"name":"./src/docx/util/Table.tsx","size":2384,"chunks":["a1ee98a"]},{"name":"./src/docx/defaultSchema/blocks.ts","size":5196,"chunks":["a1ee98a"]},{"name":"./src/docx/defaultSchema/inlinecontent.ts","size":363,"chunks":["a1ee98a"]},{"name":"./src/docx/defaultSchema/styles.ts","size":941,"chunks":["a1ee98a"]},{"name":"./src/docx/defaultSchema/index.ts","size":203,"chunks":["a1ee98a"]},{"name":"../../shared/api/corsProxy.ts","size":139,"chunks":["a1ee98a"]},{"name":"../../shared/util/fileUtil.ts","size":600,"chunks":["a1ee98a"]},{"name":"./src/docx/docxExporter.ts","size":5251,"chunks":["a1ee98a"]},{"name":"./src/index.ts","size":0,"chunks":["a1ee98a"]},{"name":"./src/docx/template/word/styles.xml?raw","size":59368,"chunks":["714dba6"]},{"name":"../../shared/assets/fonts/GeistMono-Regular.ttf","size":155049,"chunks":["642be88"]},{"name":"../../shared/assets/fonts/inter/Inter_18pt-Regular.ttf","size":456958,"chunks":["b6f14fb"]}]}
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"homepage": "https://github.com/TypeCellOS/BlockNote",
|
|
4
4
|
"private": false,
|
|
5
5
|
"license": "AGPL-3.0 OR PROPRIETARY",
|
|
6
|
-
"version": "0.25.
|
|
6
|
+
"version": "0.25.1",
|
|
7
7
|
"files": [
|
|
8
8
|
"dist",
|
|
9
9
|
"types",
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"email": "email dev"
|
|
51
51
|
},
|
|
52
52
|
"dependencies": {
|
|
53
|
-
"@blocknote/core": "^0.25.
|
|
53
|
+
"@blocknote/core": "^0.25.1",
|
|
54
54
|
"buffer": "^6.0.3",
|
|
55
55
|
"docx": "^9.0.2",
|
|
56
56
|
"image-meta": "^0.2.1"
|
|
@@ -79,5 +79,5 @@
|
|
|
79
79
|
"access": "public",
|
|
80
80
|
"registry": "https://registry.npmjs.org/"
|
|
81
81
|
},
|
|
82
|
-
"gitHead": "
|
|
82
|
+
"gitHead": "79dac9b8156f076d7a8ba095451fb0da2c09400a"
|
|
83
83
|
}
|
package/src/docx/docxExporter.ts
CHANGED
|
@@ -154,7 +154,7 @@ export class DOCXExporter<
|
|
|
154
154
|
geistMonoFont instanceof Uint8Array
|
|
155
155
|
) {
|
|
156
156
|
// conversion with Polyfill needed because docxjs requires Buffer
|
|
157
|
-
const Buffer = (await import("buffer")).Buffer;
|
|
157
|
+
const Buffer = (await import("buffer")).default.Buffer;
|
|
158
158
|
|
|
159
159
|
if (interFont instanceof ArrayBuffer) {
|
|
160
160
|
interFont = Buffer.from(interFont);
|
|
@@ -243,7 +243,7 @@ export class DOCXExporter<
|
|
|
243
243
|
try {
|
|
244
244
|
if (!globalThis.Buffer) {
|
|
245
245
|
// load Buffer polyfill because docxjs requires this
|
|
246
|
-
globalThis.Buffer = (await import("buffer")).Buffer;
|
|
246
|
+
globalThis.Buffer = (await import("buffer")).default.Buffer;
|
|
247
247
|
}
|
|
248
248
|
return Packer.toBlob(doc);
|
|
249
249
|
} finally {
|