@blocknote/xl-docx-exporter 0.26.0 → 0.27.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,3 @@
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")).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=_;
1
+ "use strict";var A=Object.create;var b=Object.defineProperty;var D=Object.getOwnPropertyDescriptor;var B=Object.getOwnPropertyNames;var S=Object.getPrototypeOf,v=Object.prototype.hasOwnProperty;var O=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of B(t))!v.call(e,i)&&i!==n&&b(e,i,{get:()=>t[i],enumerable:!(o=D(t,i))||o.enumerable});return e};var h=(e,t,n)=>(n=e!=null?A(S(e)):{},O(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"),r=require("docx");async function I(e){if(typeof window<"u"){const t=await createImageBitmap(e),{width:n,height:o}=t;return t.close(),{width:n,height:o}}else{const t=(await import("image-meta")).imageMeta,n=new Uint8Array(await e.arrayBuffer()),o=t(n);if(!o.width||!o.height)throw new Error("Image dimensions not found");return{width:o.width,height:o.height}}}const k=(e,t)=>{const o=new Array(e.headerRows??0).fill(!0),i=new Array(e.headerCols??0).fill(!0);return new r.Table({layout:"autofit",columnWidths:e.columnWidths.map(s=>(s??120)*.75*20),rows:e.rows.map((s,u)=>{const c=o[u];return new r.TableRow({tableHeader:c,children:s.cells.map((m,w)=>{var x;const y=(x=e.columnWidths)==null?void 0:x[w],a=p.mapTableCell(m),T=i[w];return new r.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:r.ShadingType.SOLID,color:t.options.colors[a.props.backgroundColor].background.slice(1)},children:[new r.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:r.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 r.Paragraph({...l(e.props,t.options.colors),children:t.transformInlineContent(e.content),style:"Normal",run:{font:"Inter"}}),numberedListItem:(e,t,n)=>new r.Paragraph({...l(e.props,t.options.colors),children:t.transformInlineContent(e.content),numbering:{reference:"blocknote-numbered-list",level:n}}),bulletListItem:(e,t,n)=>new r.Paragraph({...l(e.props,t.options.colors),children:t.transformInlineContent(e.content),numbering:{reference:"blocknote-bullet-list",level:n}}),checkListItem:(e,t)=>new r.Paragraph({...l(e.props,t.options.colors),children:[new r.CheckBox({checked:e.props.checked}),new r.TextRun({children:[" "]}),...t.transformInlineContent(e.content)]}),heading:(e,t)=>new r.Paragraph({...l(e.props,t.options.colors),children:t.transformInlineContent(e.content),heading:`Heading${e.props.level}`}),quote:(e,t)=>new r.Paragraph({shading:{color:"#7D797A"},border:{left:{color:"#7D797A",space:100,style:"single",size:8}},...l(e.props,t.options.colors),children:t.transformInlineContent(e.content)}),audio:(e,t)=>[g(e.props,"Open audio",t),...f(e.props,t)],video:(e,t)=>[g(e.props,"Open video",t),...f(e.props,t)],file:(e,t)=>[g(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 r.Paragraph({style:"Codeblock",shading:{type:r.ShadingType.SOLID,fill:"161616",color:"161616"},children:[...t.split(`
2
+ `).map((o,i)=>new r.TextRun({text:o,break:i>0?1:0}))]})},pageBreak:()=>new r.Paragraph({children:[new r.PageBreak]}),image:async(e,t)=>{const n=await t.resolveFile(e.props.url),{width:o,height:i}=await I(n);return[new r.Paragraph({...l(e.props,t.options.colors),children:[new r.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/o*i}})]}),...f(e.props,t)]},table:(e,t)=>k(e.content,t)};function g(e,t,n){return new r.Paragraph({...l(e,n.options.colors),children:[new r.ExternalHyperlink({children:[new r.TextRun({text:e.name||t,style:"Hyperlink"})],link:e.url})]})}function f(e,t){return e.caption?[new r.Paragraph({...l(e,t.options.colors),children:[new r.TextRun({text:e.caption})],style:"Caption"})]:[]}const F={link:(e,t)=>new r.ExternalHyperlink({children:e.content.map(n=>t.transformStyledText(n,!0)),link:e.href}),text:(e,t)=>t.transformStyledText(e)},R={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"}:{}},L={blockMapping:P,inlineContentMapping:F,styleMapping:R};async function M(e){return"https://corsproxy.api.blocknotejs.org/corsproxy/?url="+encodeURIComponent(e)}async function C(e){{const t=e.default;return await(await fetch(t)).arrayBuffer()}}const d=16*.75*1.5*20;class E extends p.Exporter{constructor(t,n,o){const s={...{colors:p.COLORS_DEFAULT,resolveFileUrl:M},...o};super(t,n,s),this.schema=t,this.mappings=n}transformStyledText(t,n){const o=this.mapStyles(t.styles),i=Object.assign({},...o);return new r.TextRun({...i,style:n?"Hyperlink":void 0,text:t.text})}async transformBlocks(t,n=0){const o=[];for(const i of t){let s=await this.transformBlocks(i.children,n+1);s=s.map((c,m)=>(c instanceof r.Paragraph&&!c.properties.numberingReferences.length&&c.addRunToFront(new r.TextRun({children:[new r.Tab]})),c));const u=await this.mapBlock(i,n,0);Array.isArray(u)?o.push(...u,...s):o.push(u,...s)}return o}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 o=(await import("buffer")).default.Buffer;t instanceof ArrayBuffer&&(t=o.from(t)),n instanceof ArrayBuffer&&(n=o.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},(o,i)=>({start:1,level:i,format:r.LevelFormat.DECIMAL,text:`%${i+1}.`,alignment:r.AlignmentType.LEFT,style:{paragraph:{indent:{left:d*(i+1),hanging:d}}}}))},{reference:"blocknote-bullet-list",levels:Array.from({length:9},(o,i)=>({start:1,level:i,format:r.LevelFormat.BULLET,text:n[i%n.length],alignment:r.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 o=await this.toDocxJsDocument(t,n),i=globalThis.Buffer;try{return globalThis.Buffer||(globalThis.Buffer=(await import("buffer")).default.Buffer),r.Packer.toBlob(o)}finally{globalThis.Buffer=i}}async toDocxJsDocument(t,n={sectionOptions:{},documentOptions:{}}){const o=new r.Document({...await this.createDefaultDocumentOptions(),...n.documentOptions,sections:[{children:await this.transformBlocks(t),...n.sectionOptions}]});return o.Document.Relationships.createRelationship(o.Document.Relationships.RelationshipCount+1,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable","fontTable.xml"),o}}exports.DOCXExporter=E;exports.docxDefaultSchemaMappings=L;
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\")).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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"}
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 quote: (block, exporter) => {\n return new Paragraph({\n shading: {\n color: \"#7D797A\",\n },\n border: {\n left: {\n color: \"#7D797A\",\n space: 100,\n style: \"single\",\n size: 8,\n },\n },\n ...blockPropsToStyles(block.props, exporter.options.colors),\n children: exporter.transformInlineContent(block.content),\n });\n },\n audio: (block, exporter) => {\n return [\n file(block.props, \"Open audio\", exporter),\n ...caption(block.props, exporter),\n ];\n },\n video: (block, exporter) => {\n return [\n file(block.props, \"Open video\", exporter),\n ...caption(block.props, exporter),\n ];\n },\n file: (block, exporter) => {\n return [\n file(block.props, \"Open file\", exporter),\n ...caption(block.props, exporter),\n ];\n },\n codeBlock: (block) => {\n const textContent = (block.content as StyledText<any>[])[0]?.text || \"\";\n\n return new Paragraph({\n style: \"Codeblock\",\n shading: {\n type: ShadingType.SOLID,\n fill: \"161616\",\n color: \"161616\",\n },\n children: [\n ...textContent.split(\"\\n\").map((line, index) => {\n return new TextRun({\n text: line,\n break: index > 0 ? 1 : 0,\n });\n }),\n ],\n });\n },\n pageBreak: () => {\n return new Paragraph({\n children: [new PageBreak()],\n });\n },\n image: async (block, exporter) => {\n const blob = await exporter.resolveFile(block.props.url);\n const { width, height } = await getImageDimensions(blob);\n\n return [\n new Paragraph({\n ...blockPropsToStyles(block.props, exporter.options.colors),\n children: [\n new ImageRun({\n data: await blob.arrayBuffer(),\n // it would be nicer to set the actual data type here, but then we'd need to use a mime type / image type\n // detector. atm passing gif does not seem to be causing issues as the \"type\" is mainly used by docxjs internally\n // (i.e.: to make sure it's not svg)\n type: \"gif\",\n altText: block.props.caption\n ? {\n description: block.props.caption,\n name: block.props.caption,\n title: block.props.caption,\n }\n : undefined,\n transformation: {\n width: block.props.previewWidth,\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 type GlobalThis = typeof globalThis & { Buffer?: any };\n const prevBuffer = (globalThis as GlobalThis).Buffer;\n try {\n if (!(globalThis as GlobalThis).Buffer) {\n // load Buffer polyfill because docxjs requires this\n (globalThis as GlobalThis).Buffer = (\n await import(\"buffer\")\n ).default.Buffer;\n }\n return Packer.toBlob(doc);\n } finally {\n (globalThis as GlobalThis).Buffer = prevBuffer;\n }\n }\n\n /**\n * Convert a document (array of Blocks to a docxjs Document)\n */\n public async toDocxJsDocument(\n blocks: Block<B, I, S>[],\n options: {\n sectionOptions: Omit<ISectionOptions, \"children\">;\n documentOptions: DocumentOptions;\n } = {\n sectionOptions: {},\n documentOptions: {},\n }\n ) {\n const doc = new Document({\n ...(await this.createDefaultDocumentOptions()),\n ...options.documentOptions,\n sections: [\n {\n children: await this.transformBlocks(blocks),\n ...options.sectionOptions,\n },\n ],\n });\n\n // fix https://github.com/dolanmiu/docx/pull/2800/files\n doc.Document.Relationships.createRelationship(\n doc.Document.Relationships.RelationshipCount + 1,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable\",\n \"fontTable.xml\"\n );\n\n return doc;\n }\n}\n"],"names":["getImageDimensions","blob","bmp","width","height","imageMetaFunc","bytes","meta","Table","data","headerRows","headerCols","DocxTable","w","row","rowIndex","isHeaderRow","TableRow","c","colIndex","_a","cell","mapTableCell","isHeaderColumn","TableCell","ShadingType","Paragraph","UnreachableCaseError","blockPropsToStyles","props","colors","docxBlockMappingForDefaultSchema","block","exporter","nestingLevel","CheckBox","TextRun","file","caption","textContent","line","index","PageBreak","ImageRun","defaultText","ExternalHyperlink","docxInlineContentMappingForDefaultSchema","ic","content","docxStyleMappingForDefaultSchema","val","docxDefaultSchemaMappings","corsProxyResolveFileUrl","url","loadFileBuffer","requireUrl","dataUrl","DEFAULT_TAB_STOP","DOCXExporter","Exporter","schema","mappings","options","newOptions","COLORS_DEFAULT","styledText","hyperlink","stylesArray","styles","blocks","ret","b","children","_i","Tab","self","interFont","geistMonoFont","Buffer","externalStyles","bullets","_","LevelFormat","AlignmentType","doc","prevBuffer","Packer","Document"],"mappings":"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"}
@@ -1,8 +1,7 @@
1
- import { mapTableCell as O, UnreachableCaseError as A, Exporter as S, COLORS_DEFAULT as v } from "@blocknote/core";
2
- import { Table as E, TableRow as k, TableCell as I, ShadingType as h, Paragraph as s, CheckBox as _, TextRun as u, PageBreak as F, ImageRun as R, ExternalHyperlink as B, Tab as L, LevelFormat as b, AlignmentType as C, Packer as M, Document as U } from "docx";
3
- var H = { BASE_URL: "/", MODE: "production", DEV: !1, PROD: !0, SSR: !1 };
4
- async function P(e) {
5
- if (typeof window < "u" && H.NODE_ENV !== "test") {
1
+ import { mapTableCell as I, UnreachableCaseError as T, Exporter as O, COLORS_DEFAULT as k } from "@blocknote/core";
2
+ import { Table as F, TableRow as S, TableCell as v, Paragraph as s, ShadingType as m, ImageRun as L, PageBreak as M, TextRun as u, CheckBox as R, ExternalHyperlink as B, Tab as U, AlignmentType as b, LevelFormat as C, Packer as E, Document as _ } from "docx";
3
+ async function H(e) {
4
+ if (typeof window < "u") {
6
5
  const t = await createImageBitmap(e), { width: n, height: r } = t;
7
6
  return t.close(), { width: n, height: r };
8
7
  } else {
@@ -14,21 +13,21 @@ async function P(e) {
14
13
  }
15
14
  const W = (e, t) => {
16
15
  const r = new Array(e.headerRows ?? 0).fill(!0), o = new Array(e.headerCols ?? 0).fill(!0);
17
- return new E({
16
+ return new F({
18
17
  layout: "autofit",
19
18
  columnWidths: e.columnWidths.map(
20
19
  (a) => (a ?? 120) * /* to points */
21
20
  0.75 * /* to twips */
22
21
  20
23
22
  ),
24
- rows: e.rows.map((a, f) => {
25
- const c = r[f];
26
- return new k({
23
+ rows: e.rows.map((a, p) => {
24
+ const c = r[p];
25
+ return new S({
27
26
  tableHeader: c,
28
27
  children: a.cells.map((g, w) => {
29
28
  var x;
30
- const y = (x = e.columnWidths) == null ? void 0 : x[w], i = O(g), T = o[w];
31
- return new I({
29
+ const y = (x = e.columnWidths) == null ? void 0 : x[w], i = I(g), D = o[w];
30
+ return new v({
32
31
  width: y ? {
33
32
  size: `${y * 0.75}pt`,
34
33
  type: "dxa"
@@ -36,20 +35,20 @@ const W = (e, t) => {
36
35
  columnSpan: i.props.colspan,
37
36
  rowSpan: i.props.rowspan,
38
37
  shading: i.props.backgroundColor === "default" || !i.props.backgroundColor ? void 0 : {
39
- type: h.SOLID,
38
+ type: m.SOLID,
40
39
  color: t.options.colors[i.props.backgroundColor].background.slice(1)
41
40
  },
42
41
  children: [
43
42
  new s({
44
43
  children: t.transformInlineContent(i.content),
45
44
  alignment: !i.props.textAlignment || i.props.textAlignment === "left" ? void 0 : i.props.textAlignment === "center" ? "center" : i.props.textAlignment === "right" ? "right" : i.props.textAlignment === "justify" ? "distribute" : (() => {
46
- throw new A(
45
+ throw new T(
47
46
  i.props.textAlignment
48
47
  );
49
48
  })(),
50
49
  run: {
51
50
  // TODO add support for table headers exporting, bolding seems to not be working at the moment
52
- bold: c || T,
51
+ bold: c || D,
53
52
  // TODO table paragraph color seems to not be working at the moment
54
53
  // Probably because the runs are setting their own color
55
54
  color: i.props.textColor === "default" || !i.props.textColor ? void 0 : t.options.colors[i.props.textColor].text.slice(1)
@@ -65,18 +64,18 @@ const W = (e, t) => {
65
64
  function l(e, t) {
66
65
  return {
67
66
  shading: e.backgroundColor === "default" || !e.backgroundColor ? void 0 : {
68
- type: h.SOLID,
67
+ type: m.SOLID,
69
68
  color: t[e.backgroundColor].background.slice(1)
70
69
  },
71
70
  run: e.textColor === "default" || !e.textColor ? void 0 : {
72
71
  color: t[e.textColor].text.slice(1)
73
72
  },
74
73
  alignment: !e.textAlignment || e.textAlignment === "left" ? void 0 : e.textAlignment === "center" ? "center" : e.textAlignment === "right" ? "right" : e.textAlignment === "justify" ? "distribute" : (() => {
75
- throw new A(e.textAlignment);
74
+ throw new T(e.textAlignment);
76
75
  })()
77
76
  };
78
77
  }
79
- const N = {
78
+ const P = {
80
79
  paragraph: (e, t) => new s({
81
80
  ...l(e.props, t.options.colors),
82
81
  children: t.transformInlineContent(e.content),
@@ -104,7 +103,7 @@ const N = {
104
103
  checkListItem: (e, t) => new s({
105
104
  ...l(e.props, t.options.colors),
106
105
  children: [
107
- new _({ checked: e.props.checked }),
106
+ new R({ checked: e.props.checked }),
108
107
  new u({
109
108
  children: [" "]
110
109
  }),
@@ -116,17 +115,32 @@ const N = {
116
115
  children: t.transformInlineContent(e.content),
117
116
  heading: `Heading${e.props.level}`
118
117
  }),
118
+ quote: (e, t) => new s({
119
+ shading: {
120
+ color: "#7D797A"
121
+ },
122
+ border: {
123
+ left: {
124
+ color: "#7D797A",
125
+ space: 100,
126
+ style: "single",
127
+ size: 8
128
+ }
129
+ },
130
+ ...l(e.props, t.options.colors),
131
+ children: t.transformInlineContent(e.content)
132
+ }),
119
133
  audio: (e, t) => [
120
- m(e.props, "Open audio", t),
121
- ...p(e.props, t)
134
+ h(e.props, "Open audio", t),
135
+ ...f(e.props, t)
122
136
  ],
123
137
  video: (e, t) => [
124
- m(e.props, "Open video", t),
125
- ...p(e.props, t)
138
+ h(e.props, "Open video", t),
139
+ ...f(e.props, t)
126
140
  ],
127
141
  file: (e, t) => [
128
- m(e.props, "Open file", t),
129
- ...p(e.props, t)
142
+ h(e.props, "Open file", t),
143
+ ...f(e.props, t)
130
144
  ],
131
145
  codeBlock: (e) => {
132
146
  var n;
@@ -134,7 +148,7 @@ const N = {
134
148
  return new s({
135
149
  style: "Codeblock",
136
150
  shading: {
137
- type: h.SOLID,
151
+ type: m.SOLID,
138
152
  fill: "161616",
139
153
  color: "161616"
140
154
  },
@@ -148,15 +162,15 @@ const N = {
148
162
  });
149
163
  },
150
164
  pageBreak: () => new s({
151
- children: [new F()]
165
+ children: [new M()]
152
166
  }),
153
167
  image: async (e, t) => {
154
- const n = await t.resolveFile(e.props.url), { width: r, height: o } = await P(n);
168
+ const n = await t.resolveFile(e.props.url), { width: r, height: o } = await H(n);
155
169
  return [
156
170
  new s({
157
171
  ...l(e.props, t.options.colors),
158
172
  children: [
159
- new R({
173
+ new L({
160
174
  data: await n.arrayBuffer(),
161
175
  // it would be nicer to set the actual data type here, but then we'd need to use a mime type / image type
162
176
  // detector. atm passing gif does not seem to be causing issues as the "type" is mainly used by docxjs internally
@@ -174,12 +188,12 @@ const N = {
174
188
  })
175
189
  ]
176
190
  }),
177
- ...p(e.props, t)
191
+ ...f(e.props, t)
178
192
  ];
179
193
  },
180
194
  table: (e, t) => W(e.content, t)
181
195
  };
182
- function m(e, t, n) {
196
+ function h(e, t, n) {
183
197
  return new s({
184
198
  ...l(e, n.options.colors),
185
199
  children: [
@@ -195,7 +209,7 @@ function m(e, t, n) {
195
209
  ]
196
210
  });
197
211
  }
198
- function p(e, t) {
212
+ function f(e, t) {
199
213
  return e.caption ? [
200
214
  new s({
201
215
  ...l(e, t.options.colors),
@@ -208,7 +222,7 @@ function p(e, t) {
208
222
  })
209
223
  ] : [];
210
224
  }
211
- const $ = {
225
+ const j = {
212
226
  link: (e, t) => new B({
213
227
  children: e.content.map((n) => t.transformStyledText(
214
228
  n,
@@ -217,7 +231,7 @@ const $ = {
217
231
  link: e.href
218
232
  }),
219
233
  text: (e, t) => t.transformStyledText(e)
220
- }, j = {
234
+ }, $ = {
221
235
  bold: (e) => e ? {
222
236
  bold: e
223
237
  } : {},
@@ -243,21 +257,16 @@ const $ = {
243
257
  code: (e) => e ? {
244
258
  font: "GeistMono"
245
259
  } : {}
246
- }, X = {
247
- blockMapping: N,
248
- inlineContentMapping: $,
249
- styleMapping: j
260
+ }, J = {
261
+ blockMapping: P,
262
+ inlineContentMapping: j,
263
+ styleMapping: $
250
264
  };
251
- async function V(e) {
265
+ async function N(e) {
252
266
  return "https://corsproxy.api.blocknotejs.org/corsproxy/?url=" + encodeURIComponent(e);
253
267
  }
254
- var G = { BASE_URL: "/", MODE: "production", DEV: !1, PROD: !0, SSR: !1 };
255
- async function D(e) {
256
- if (G.NODE_ENV === "test") {
257
- const t = require("fs");
258
- let n = e.default;
259
- return n.startsWith("/@fs/") && (n = n.substring(4)), t.readFileSync(n);
260
- } else {
268
+ async function A(e) {
269
+ {
261
270
  const t = e.default;
262
271
  return await (await fetch(t)).arrayBuffer();
263
272
  }
@@ -269,12 +278,12 @@ const d = (
269
278
  1.5 * /* 1 point is 20 twips */
270
279
  20
271
280
  );
272
- class q extends S {
281
+ class q extends O {
273
282
  constructor(t, n, r) {
274
283
  const a = {
275
284
  ...{
276
- colors: v,
277
- resolveFileUrl: V
285
+ colors: k,
286
+ resolveFileUrl: N
278
287
  },
279
288
  ...r
280
289
  };
@@ -303,23 +312,23 @@ class q extends S {
303
312
  let a = await this.transformBlocks(o.children, n + 1);
304
313
  a = a.map((c, g) => (c instanceof s && !c.properties.numberingReferences.length && c.addRunToFront(
305
314
  new u({
306
- children: [new L()]
315
+ children: [new U()]
307
316
  })
308
317
  ), c));
309
- const f = await this.mapBlock(
318
+ const p = await this.mapBlock(
310
319
  o,
311
320
  n,
312
321
  0
313
322
  /*unused*/
314
323
  );
315
- Array.isArray(f) ? r.push(...f, ...a) : r.push(f, ...a);
324
+ Array.isArray(p) ? r.push(...p, ...a) : r.push(p, ...a);
316
325
  }
317
326
  return r;
318
327
  }
319
328
  async getFonts() {
320
- let t = await D(
329
+ let t = await A(
321
330
  await import("./Inter_18pt-Regular-byxnNS-8.js")
322
- ), n = await D(
331
+ ), n = await A(
323
332
  await import("./GeistMono-Regular-D4rKXxwr.js")
324
333
  );
325
334
  if (t instanceof ArrayBuffer || n instanceof Uint8Array) {
@@ -344,9 +353,9 @@ class q extends S {
344
353
  levels: Array.from({ length: 9 }, (r, o) => ({
345
354
  start: 1,
346
355
  level: o,
347
- format: b.DECIMAL,
356
+ format: C.DECIMAL,
348
357
  text: `%${o + 1}.`,
349
- alignment: C.LEFT,
358
+ alignment: b.LEFT,
350
359
  style: {
351
360
  paragraph: {
352
361
  indent: {
@@ -362,9 +371,9 @@ class q extends S {
362
371
  levels: Array.from({ length: 9 }, (r, o) => ({
363
372
  start: 1,
364
373
  level: o,
365
- format: b.BULLET,
374
+ format: C.BULLET,
366
375
  text: n[o % n.length],
367
- alignment: C.LEFT,
376
+ alignment: b.LEFT,
368
377
  style: {
369
378
  paragraph: {
370
379
  indent: {
@@ -391,7 +400,7 @@ class q extends S {
391
400
  }) {
392
401
  const r = await this.toDocxJsDocument(t, n), o = globalThis.Buffer;
393
402
  try {
394
- return globalThis.Buffer || (globalThis.Buffer = (await import("buffer")).default.Buffer), M.toBlob(r);
403
+ return globalThis.Buffer || (globalThis.Buffer = (await import("buffer")).default.Buffer), E.toBlob(r);
395
404
  } finally {
396
405
  globalThis.Buffer = o;
397
406
  }
@@ -403,7 +412,7 @@ class q extends S {
403
412
  sectionOptions: {},
404
413
  documentOptions: {}
405
414
  }) {
406
- const r = new U({
415
+ const r = new _({
407
416
  ...await this.createDefaultDocumentOptions(),
408
417
  ...n.documentOptions,
409
418
  sections: [
@@ -422,6 +431,6 @@ class q extends S {
422
431
  }
423
432
  export {
424
433
  q as DOCXExporter,
425
- X as docxDefaultSchemaMappings
434
+ J as docxDefaultSchemaMappings
426
435
  };
427
436
  //# sourceMappingURL=blocknote-xl-docx-exporter.js.map
@@ -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\")).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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"}
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 quote: (block, exporter) => {\n return new Paragraph({\n shading: {\n color: \"#7D797A\",\n },\n border: {\n left: {\n color: \"#7D797A\",\n space: 100,\n style: \"single\",\n size: 8,\n },\n },\n ...blockPropsToStyles(block.props, exporter.options.colors),\n children: exporter.transformInlineContent(block.content),\n });\n },\n audio: (block, exporter) => {\n return [\n file(block.props, \"Open audio\", exporter),\n ...caption(block.props, exporter),\n ];\n },\n video: (block, exporter) => {\n return [\n file(block.props, \"Open video\", exporter),\n ...caption(block.props, exporter),\n ];\n },\n file: (block, exporter) => {\n return [\n file(block.props, \"Open file\", exporter),\n ...caption(block.props, exporter),\n ];\n },\n codeBlock: (block) => {\n const textContent = (block.content as StyledText<any>[])[0]?.text || \"\";\n\n return new Paragraph({\n style: \"Codeblock\",\n shading: {\n type: ShadingType.SOLID,\n fill: \"161616\",\n color: \"161616\",\n },\n children: [\n ...textContent.split(\"\\n\").map((line, index) => {\n return new TextRun({\n text: line,\n break: index > 0 ? 1 : 0,\n });\n }),\n ],\n });\n },\n pageBreak: () => {\n return new Paragraph({\n children: [new PageBreak()],\n });\n },\n image: async (block, exporter) => {\n const blob = await exporter.resolveFile(block.props.url);\n const { width, height } = await getImageDimensions(blob);\n\n return [\n new Paragraph({\n ...blockPropsToStyles(block.props, exporter.options.colors),\n children: [\n new ImageRun({\n data: await blob.arrayBuffer(),\n // it would be nicer to set the actual data type here, but then we'd need to use a mime type / image type\n // detector. atm passing gif does not seem to be causing issues as the \"type\" is mainly used by docxjs internally\n // (i.e.: to make sure it's not svg)\n type: \"gif\",\n altText: block.props.caption\n ? {\n description: block.props.caption,\n name: block.props.caption,\n title: block.props.caption,\n }\n : undefined,\n transformation: {\n width: block.props.previewWidth,\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 type GlobalThis = typeof globalThis & { Buffer?: any };\n const prevBuffer = (globalThis as GlobalThis).Buffer;\n try {\n if (!(globalThis as GlobalThis).Buffer) {\n // load Buffer polyfill because docxjs requires this\n (globalThis as GlobalThis).Buffer = (\n await import(\"buffer\")\n ).default.Buffer;\n }\n return Packer.toBlob(doc);\n } finally {\n (globalThis as GlobalThis).Buffer = prevBuffer;\n }\n }\n\n /**\n * Convert a document (array of Blocks to a docxjs Document)\n */\n public async toDocxJsDocument(\n blocks: Block<B, I, S>[],\n options: {\n sectionOptions: Omit<ISectionOptions, \"children\">;\n documentOptions: DocumentOptions;\n } = {\n sectionOptions: {},\n documentOptions: {},\n }\n ) {\n const doc = new Document({\n ...(await this.createDefaultDocumentOptions()),\n ...options.documentOptions,\n sections: [\n {\n children: await this.transformBlocks(blocks),\n ...options.sectionOptions,\n },\n ],\n });\n\n // fix https://github.com/dolanmiu/docx/pull/2800/files\n doc.Document.Relationships.createRelationship(\n doc.Document.Relationships.RelationshipCount + 1,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable\",\n \"fontTable.xml\"\n );\n\n return doc;\n }\n}\n"],"names":["getImageDimensions","blob","bmp","width","height","imageMetaFunc","bytes","meta","Table","data","headerRows","headerCols","DocxTable","w","row","rowIndex","isHeaderRow","TableRow","c","colIndex","_a","cell","mapTableCell","isHeaderColumn","TableCell","ShadingType","Paragraph","UnreachableCaseError","blockPropsToStyles","props","colors","docxBlockMappingForDefaultSchema","block","exporter","nestingLevel","CheckBox","TextRun","file","caption","textContent","line","index","PageBreak","ImageRun","defaultText","ExternalHyperlink","docxInlineContentMappingForDefaultSchema","ic","content","docxStyleMappingForDefaultSchema","val","docxDefaultSchemaMappings","corsProxyResolveFileUrl","url","loadFileBuffer","requireUrl","dataUrl","DEFAULT_TAB_STOP","DOCXExporter","Exporter","schema","mappings","options","newOptions","COLORS_DEFAULT","styledText","hyperlink","stylesArray","styles","blocks","ret","b","children","_i","Tab","self","interFont","geistMonoFont","Buffer","externalStyles","bullets","_","i","LevelFormat","AlignmentType","doc","prevBuffer","Packer","Document"],"mappings":"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"}
@@ -1 +1 @@
1
- {"builtAt":1742379519123,"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"]}]}
1
+ {"builtAt":1743885357957,"assets":[{"name":"blocknote-xl-docx-exporter.cjs","size":8123},{"name":"Inter_18pt-Regular-CCMUw8TC.cjs","size":457096},{"name":"GeistMono-Regular--NrcstcO.cjs","size":155187},{"name":"styles-C7c5RlKz.cjs","size":55568},{"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":34125}],"chunks":[{"id":"a1ee98a","entry":true,"initial":true,"files":["blocknote-xl-docx-exporter.cjs"],"names":["blocknote-xl-docx-exporter"]},{"id":"b6f14fb","entry":false,"initial":false,"files":["Inter_18pt-Regular-CCMUw8TC.cjs"],"names":["Inter_18pt-Regular"]},{"id":"642be88","entry":false,"initial":false,"files":["GeistMono-Regular--NrcstcO.cjs"],"names":["GeistMono-Regular"]},{"id":"714dba6","entry":false,"initial":false,"files":["styles-C7c5RlKz.cjs"],"names":["styles"]}],"modules":[{"name":"../../shared/util/imageUtil.ts","size":592,"chunks":["a1ee98a"]},{"name":"./src/docx/util/Table.tsx","size":2384,"chunks":["a1ee98a"]},{"name":"./src/docx/defaultSchema/blocks.ts","size":5600,"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":214,"chunks":["a1ee98a"]},{"name":"./src/docx/docxExporter.ts","size":5251,"chunks":["a1ee98a"]},{"name":"./src/index.ts","size":0,"chunks":["a1ee98a"]},{"name":"../../shared/assets/fonts/inter/Inter_18pt-Regular.ttf","size":456958,"chunks":["b6f14fb"]},{"name":"../../shared/assets/fonts/GeistMono-Regular.ttf","size":155049,"chunks":["642be88"]},{"name":"./src/docx/template/word/styles.xml?raw","size":59368,"chunks":["714dba6"]}]}
package/package.json CHANGED
@@ -2,8 +2,14 @@
2
2
  "name": "@blocknote/xl-docx-exporter",
3
3
  "homepage": "https://github.com/TypeCellOS/BlockNote",
4
4
  "private": false,
5
+ "sideEffects": false,
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/TypeCellOS/BlockNote.git",
9
+ "directory": "packages/xl-docx-exporter"
10
+ },
5
11
  "license": "AGPL-3.0 OR PROPRIETARY",
6
- "version": "0.26.0",
12
+ "version": "0.27.2",
7
13
  "files": [
8
14
  "dist",
9
15
  "types",
@@ -41,21 +47,15 @@
41
47
  "require": "./dist/style.css"
42
48
  }
43
49
  },
44
- "scripts": {
45
- "dev": "vite",
46
- "build": "tsc --build && vite build",
47
- "lint": "eslint src --max-warnings 0",
48
- "test": "vitest --run",
49
- "test-watch": "vitest watch",
50
- "email": "email dev"
51
- },
52
50
  "dependencies": {
53
- "@blocknote/core": "^0.26.0",
51
+ "@blocknote/core": "^0.27.2",
54
52
  "buffer": "^6.0.3",
55
53
  "docx": "^9.0.2",
56
54
  "image-meta": "^0.2.1"
57
55
  },
58
56
  "devDependencies": {
57
+ "@types/react": "^18.0.25",
58
+ "@types/react-dom": "^18.0.9",
59
59
  "@zip.js/zip.js": "^2.7.57",
60
60
  "eslint": "^8.10.0",
61
61
  "prettier": "^2.7.1",
@@ -64,7 +64,9 @@
64
64
  "vite": "^5.3.4",
65
65
  "vite-plugin-eslint": "^1.8.1",
66
66
  "vitest": "^2.0.3",
67
- "xml-formatter": "^3.6.3"
67
+ "xml-formatter": "^3.6.3",
68
+ "react": "^18.3.1",
69
+ "react-dom": "^18.3.1"
68
70
  },
69
71
  "peerDependencies": {
70
72
  "react": "^18.0 || ^19.0 || >= 19.0.0-rc",
@@ -75,9 +77,12 @@
75
77
  "../../.eslintrc.js"
76
78
  ]
77
79
  },
78
- "publishConfig": {
79
- "access": "public",
80
- "registry": "https://registry.npmjs.org/"
81
- },
82
- "gitHead": "7d8c79c62c750db921208c373e6ae7b0c42f994c"
83
- }
80
+ "scripts": {
81
+ "dev": "vite",
82
+ "build": "tsc --build && vite build",
83
+ "lint": "eslint src --max-warnings 0",
84
+ "test": "vitest --run",
85
+ "test-watch": "vitest watch",
86
+ "email": "email dev"
87
+ }
88
+ }
@@ -1,5 +1,5 @@
1
1
  <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2
- <w:document xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" xmlns:cx="http://schemas.microsoft.com/office/drawing/2014/chartex" xmlns:cx1="http://schemas.microsoft.com/office/drawing/2015/9/8/chartex" xmlns:cx2="http://schemas.microsoft.com/office/drawing/2015/10/21/chartex" xmlns:cx3="http://schemas.microsoft.com/office/drawing/2016/5/9/chartex" xmlns:cx4="http://schemas.microsoft.com/office/drawing/2016/5/10/chartex" xmlns:cx5="http://schemas.microsoft.com/office/drawing/2016/5/11/chartex" xmlns:cx6="http://schemas.microsoft.com/office/drawing/2016/5/12/chartex" xmlns:cx7="http://schemas.microsoft.com/office/drawing/2016/5/13/chartex" xmlns:cx8="http://schemas.microsoft.com/office/drawing/2016/5/14/chartex" xmlns:aink="http://schemas.microsoft.com/office/drawing/2016/ink" xmlns:am3d="http://schemas.microsoft.com/office/drawing/2017/model3d" xmlns:w16cex="http://schemas.microsoft.com/office/word/2018/wordml/cex" xmlns:w16cid="http://schemas.microsoft.com/office/word/2016/wordml/cid" xmlns:w16="http://schemas.microsoft.com/office/word/2018/wordml" xmlns:w16sdtdh="http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash" xmlns:w16se="http://schemas.microsoft.com/office/word/2015/wordml/symex" mc:Ignorable="w14 w15 wp14">
2
+ <w:document mc:Ignorable="w14 w15 wp14" xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" xmlns:cx="http://schemas.microsoft.com/office/drawing/2014/chartex" xmlns:cx1="http://schemas.microsoft.com/office/drawing/2015/9/8/chartex" xmlns:cx2="http://schemas.microsoft.com/office/drawing/2015/10/21/chartex" xmlns:cx3="http://schemas.microsoft.com/office/drawing/2016/5/9/chartex" xmlns:cx4="http://schemas.microsoft.com/office/drawing/2016/5/10/chartex" xmlns:cx5="http://schemas.microsoft.com/office/drawing/2016/5/11/chartex" xmlns:cx6="http://schemas.microsoft.com/office/drawing/2016/5/12/chartex" xmlns:cx7="http://schemas.microsoft.com/office/drawing/2016/5/13/chartex" xmlns:cx8="http://schemas.microsoft.com/office/drawing/2016/5/14/chartex" xmlns:aink="http://schemas.microsoft.com/office/drawing/2016/ink" xmlns:am3d="http://schemas.microsoft.com/office/drawing/2017/model3d" xmlns:w16cex="http://schemas.microsoft.com/office/word/2018/wordml/cex" xmlns:w16cid="http://schemas.microsoft.com/office/word/2016/wordml/cid" xmlns:w16="http://schemas.microsoft.com/office/word/2018/wordml" xmlns:w16sdtdh="http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash" xmlns:w16se="http://schemas.microsoft.com/office/word/2015/wordml/symex">
3
3
  <w:body>
4
4
  <w:p>
5
5
  <w:pPr>
@@ -14,4 +14,5 @@
14
14
  <Relationship Id="FAKE-ID" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="" TargetMode="External"/>
15
15
  <Relationship Id="FAKE-ID" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="https://www.blocknotejs.org" TargetMode="External"/>
16
16
  <Relationship Id="FAKE-ID" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/e1037269513fbdc121e06bb1bc7cf37b9045c8fc.gif"/>
17
+ <Relationship Id="FAKE-ID" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable" Target="fontTable.xml"/>
17
18
  </Relationships>
@@ -116,6 +116,23 @@ export const docxBlockMappingForDefaultSchema: BlockMapping<
116
116
  heading: `Heading${block.props.level}`,
117
117
  });
118
118
  },
119
+ quote: (block, exporter) => {
120
+ return new Paragraph({
121
+ shading: {
122
+ color: "#7D797A",
123
+ },
124
+ border: {
125
+ left: {
126
+ color: "#7D797A",
127
+ space: 100,
128
+ style: "single",
129
+ size: 8,
130
+ },
131
+ },
132
+ ...blockPropsToStyles(block.props, exporter.options.colors),
133
+ children: exporter.transformInlineContent(block.content),
134
+ });
135
+ },
119
136
  audio: (block, exporter) => {
120
137
  return [
121
138
  file(block.props, "Open audio", exporter),
@@ -32,10 +32,10 @@ describe("exporter", () => {
32
32
  const zip = new ZipReader(new BlobReader(blob));
33
33
  const entries = await zip.getEntries();
34
34
 
35
- expect(
35
+ await expect(
36
36
  prettify(await getZIPEntryContent(entries, "word/document.xml"))
37
37
  ).toMatchFileSnapshot("__snapshots__/basic/document.xml");
38
- expect(
38
+ await expect(
39
39
  prettify(await getZIPEntryContent(entries, "word/styles.xml"))
40
40
  ).toMatchFileSnapshot("__snapshots__/basic/styles.xml");
41
41
 
@@ -87,7 +87,7 @@ describe("exporter", () => {
87
87
  const entries = await zip.getEntries();
88
88
 
89
89
  // files related to header / footer
90
- expect(
90
+ await expect(
91
91
  prettify(
92
92
  await getZIPEntryContent(entries, "word/_rels/document.xml.rels")
93
93
  )
@@ -95,16 +95,16 @@ describe("exporter", () => {
95
95
  "__snapshots__/withCustomOptions/document.xml.rels"
96
96
  );
97
97
 
98
- expect(
98
+ await expect(
99
99
  prettify(await getZIPEntryContent(entries, "word/header1.xml"))
100
100
  ).toMatchFileSnapshot("__snapshots__/withCustomOptions/header1.xml");
101
101
 
102
- expect(
102
+ await expect(
103
103
  prettify(await getZIPEntryContent(entries, "word/footer1.xml"))
104
104
  ).toMatchFileSnapshot("__snapshots__/withCustomOptions/footer1.xml");
105
105
 
106
106
  // has author data
107
- expect(
107
+ await expect(
108
108
  prettify(await getZIPEntryContent(entries, "docProps/core.xml"))
109
109
  ).toMatchFileSnapshot("__snapshots__/withCustomOptions/core.xml");
110
110
  }
@@ -239,15 +239,18 @@ export class DOCXExporter<
239
239
  }
240
240
  ) {
241
241
  const doc = await this.toDocxJsDocument(blocks, options);
242
- const prevBuffer = globalThis.Buffer;
242
+ type GlobalThis = typeof globalThis & { Buffer?: any };
243
+ const prevBuffer = (globalThis as GlobalThis).Buffer;
243
244
  try {
244
- if (!globalThis.Buffer) {
245
+ if (!(globalThis as GlobalThis).Buffer) {
245
246
  // load Buffer polyfill because docxjs requires this
246
- globalThis.Buffer = (await import("buffer")).default.Buffer;
247
+ (globalThis as GlobalThis).Buffer = (
248
+ await import("buffer")
249
+ ).default.Buffer;
247
250
  }
248
251
  return Packer.toBlob(doc);
249
252
  } finally {
250
- globalThis.Buffer = prevBuffer;
253
+ (globalThis as GlobalThis).Buffer = prevBuffer;
251
254
  }
252
255
  }
253
256
 
@@ -76,6 +76,40 @@ export declare const docxDefaultSchemaMappings: {
76
76
  };
77
77
  }, any, import("@blocknote/core").InlineContentSchema, import("@blocknote/core").StyleSchema>;
78
78
  };
79
+ quote: {
80
+ config: {
81
+ type: "quote";
82
+ content: "inline";
83
+ propSchema: {
84
+ backgroundColor: {
85
+ default: "default";
86
+ };
87
+ textColor: {
88
+ default: "default";
89
+ };
90
+ textAlignment: {
91
+ default: "left";
92
+ values: readonly ["left", "center", "right", "justify"];
93
+ };
94
+ };
95
+ };
96
+ implementation: import("@blocknote/core").TiptapBlockImplementation<{
97
+ type: "quote";
98
+ content: "inline";
99
+ propSchema: {
100
+ backgroundColor: {
101
+ default: "default";
102
+ };
103
+ textColor: {
104
+ default: "default";
105
+ };
106
+ textAlignment: {
107
+ default: "left";
108
+ values: readonly ["left", "center", "right", "justify"];
109
+ };
110
+ };
111
+ }, any, import("@blocknote/core").InlineContentSchema, import("@blocknote/core").StyleSchema>;
112
+ };
79
113
  codeBlock: {
80
114
  config: {
81
115
  type: "codeBlock";
@@ -83,7 +117,6 @@ export declare const docxDefaultSchemaMappings: {
83
117
  propSchema: {
84
118
  language: {
85
119
  default: string;
86
- values: string[];
87
120
  };
88
121
  };
89
122
  };
@@ -93,7 +126,6 @@ export declare const docxDefaultSchemaMappings: {
93
126
  propSchema: {
94
127
  language: {
95
128
  default: string;
96
- values: string[];
97
129
  };
98
130
  };
99
131
  }, any, import("@blocknote/core").InlineContentSchema, import("@blocknote/core").StyleSchema>;
@@ -1,4 +0,0 @@
1
- export declare function getImageDimensions(blob: Blob): Promise<{
2
- width: number;
3
- height: number;
4
- }>;