@docen/export-docx 0.0.0 → 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +30 -16
- package/dist/index.d.mts +30 -16
- package/dist/index.d.ts +30 -16
- package/dist/index.mjs +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -90,10 +90,11 @@ Converts TipTap/ProseMirror content to DOCX format.
|
|
|
90
90
|
**Configuration Options:**
|
|
91
91
|
|
|
92
92
|
- `title` - Document title
|
|
93
|
-
- `
|
|
93
|
+
- `creator` - Document author
|
|
94
94
|
- `description` - Document description
|
|
95
95
|
- `outputType` - Output format (required)
|
|
96
96
|
- `table` - Table styling defaults (alignment, spacing, borders)
|
|
97
|
+
- `image` - Image handling options
|
|
97
98
|
- `styles` - Document default styles (font, line height, spacing)
|
|
98
99
|
- `horizontalRule` - Horizontal rule style
|
|
99
100
|
|
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const docx=require("docx"),imageMeta=require("image-meta"),ofetch=require("ofetch");function f(t){return t?t.startsWith("#")?t:{red:"#FF0000",green:"#008000",blue:"#0000FF",yellow:"#FFFF00",orange:"#FFA500",purple:"#800080",pink:"#FFC0CB",brown:"#A52A2A",black:"#000000",white:"#FFFFFF",gray:"#808080",grey:"#808080",cyan:"#00FFFF",magenta:"#FF00FF",lime:"#00FF00",navy:"#000080",teal:"#008080",maroon:"#800000",olive:"#808000",silver:"#C0C0C0",gold:"#FFD700",indigo:"#4B0082",violet:"#EE82EE"}[t.toLowerCase()]||t:void 0}function convertText(t){const e=t.marks?.some(s=>s.type==="bold"),n=t.marks?.some(s=>s.type==="italic"),r=t.marks?.some(s=>s.type==="underline"),a=t.marks?.some(s=>s.type==="strike"),o=t.marks?.some(s=>s.type==="code"),i=t.marks?.some(s=>s.type==="subscript"),p=t.marks?.some(s=>s.type==="superscript"),w=t.marks?.find(s=>s.type==="link"),u=t.marks?.find(s=>s.type==="textStyle"),c=t.marks?.some(s=>s.type==="highlight"),g=f(u?.attrs?.color),d=f(u?.attrs?.backgroundColor);let h;if(u?.attrs?.fontSize){const s=u.attrs.fontSize;if(s.endsWith("px")){const v=parseFloat(s);isNaN(v)||(h=Math.round(v*1.5))}}let l;o?l="Consolas":u?.attrs?.fontFamily&&(l=u.attrs.fontFamily);const y={text:t.text||"",bold:e||void 0,italics:n||void 0,underline:r?{}:void 0,strike:a||void 0,font:l,size:h,subScript:i||void 0,superScript:p||void 0,color:g,shading:d?{fill:d}:void 0,highlight:c?"yellow":void 0};return w?.attrs?.href?new docx.ExternalHyperlink({children:[new docx.TextRun({...y,style:"Hyperlink"})],link:w.attrs.href}):new docx.TextRun(y)}function convertHardBreak(t){const e={text:"",break:1};if(t)for(const n of t)switch(n.type){case"bold":e.bold=!0;break;case"italic":e.italics=!0;break;case"underline":e.underline={};break;case"strike":e.strike=!0;break;case"textStyle":n.attrs?.color&&(e.color=n.attrs.color);break}return new docx.TextRun(e)}function convertParagraph(t,e){const n={children:t.content?.flatMap(r=>r.type==="text"?convertText(r):r.type==="hardBreak"?convertHardBreak(r.marks):[])||[],...e};return new docx.Paragraph(n)}function convertHeading(t){const e=t?.attrs?.level,n=t.content?.flatMap(a=>a.type==="text"?convertText(a):a.type==="hardBreak"?convertHardBreak(a.marks):[])||[],r={1:docx.HeadingLevel.HEADING_1,2:docx.HeadingLevel.HEADING_2,3:docx.HeadingLevel.HEADING_3,4:docx.HeadingLevel.HEADING_4,5:docx.HeadingLevel.HEADING_5,6:docx.HeadingLevel.HEADING_6};return new docx.Paragraph({children:n,heading:r[e]})}function convertBlockquote(t){return t.content?t.content.map(e=>{if(e.type==="paragraph"){const n=e.content?.flatMap(r=>r.type==="text"?convertText(r):r.type==="hardBreak"?convertHardBreak(r.marks):[])||[];return new docx.Paragraph({children:n,indent:{left:720},border:{left:{style:"single"}}})}return new docx.Paragraph({})}):[]}function getImageTypeFromSrc(t){if(t.startsWith("data:")){const e=t.match(/data:image\/(\w+);/);if(e)switch(e[1].toLowerCase()){case"jpg":case"jpeg":return"jpeg";case"png":return"png";case"gif":return"gif";case"bmp":return"bmp";case"tiff":return"tiff";default:return"png"}}else switch(t.split(".").pop()?.toLowerCase()){case"jpg":case"jpeg":return"jpeg";case"png":return"png";case"gif":return"gif";case"bmp":return"bmp";case"tiff":return"tiff";default:return"png"}return"png"}function createFloatingOptions(){return{horizontalPosition:{relative:"page",align:"center"},verticalPosition:{relative:"page",align:"top"},lockAnchor:!0,behindDocument:!1,inFrontOfText:!1}}function getImageWidth(t,e,n){return t.attrs?.width?t.attrs.width:e?.run?.transformation?.width?e.run.transformation.width:n?.width?Math.min(n.width,600):400}function getImageHeight(t,e,n,r){return t.attrs?.height?t.attrs.height:n?.run?.transformation?.height?n.run.transformation.height:r?.width&&r?.height?Math.round(e*r.height/r.width):300}async function getImageDataAndMeta(t){try{const e=await(await ofetch.ofetch(t,{responseType:"blob"})).bytes();let n;try{n=imageMeta.imageMeta(e)}catch(r){console.warn("Failed to extract image metadata:",r),n={width:void 0,height:void 0,type:getImageTypeFromSrc(t)||"png",orientation:void 0}}return{data:e,meta:n}}catch(e){throw console.warn(`Failed to fetch image from ${t}:`,e),e}}async function convertImage(t,e){const n=c=>{switch(c){case"jpeg":case"jpg":return"jpg";case"png":return"png";case"gif":return"gif";case"bmp":return"bmp"}switch(getImageTypeFromSrc(t.attrs?.src||"")){case"jpeg":return"jpg";case"png":return"png";case"gif":return"gif";case"bmp":return"bmp";default:return"png"}};let r,a;try{const c=t.attrs?.src||"";if(c.startsWith("http")){const g=await getImageDataAndMeta(c);r=g.data,a=g.meta}else if(c.startsWith("data:")){const g=c.split(",")[1],d=atob(g),h=new Uint8Array(d.length);for(let l=0;l<d.length;l++)h[l]=d.charCodeAt(l);r=h;try{a=imageMeta.imageMeta(r)}catch{a={type:"png",width:void 0,height:void 0,orientation:void 0}}}else throw new Error(`Unsupported image source format: ${c.substring(0,20)}...`)}catch(c){return console.warn("Failed to process image:",c),new docx.Paragraph({children:[new docx.ImageRun({type:"png",data:new Uint8Array(0),transformation:{width:100,height:100},altText:{name:t.attrs?.alt||"Failed to load image"}})]})}const o=getImageWidth(t,e,a),i=getImageHeight(t,o,e,a),p={type:n(a.type),data:r,transformation:{width:o,height:i},altText:{name:t.attrs?.alt||"",description:void 0,title:t.attrs?.title||void 0},...e?.run&&e.run.floating&&{floating:e.run.floating},...e?.run&&e.run.outline&&{outline:e.run.outline}},w=new docx.ImageRun(p),u=e?.paragraph||{};return new docx.Paragraph({children:[w],...u})}function convertTableCell(t,e){const n={children:t.content?.map(r=>convertParagraph(r,e?.cell?.paragraph??e?.row?.paragraph??e?.paragraph))||[],...e?.cell?.run};return t.attrs?.colspan&&t.attrs.colspan>1&&(n.columnSpan=t.attrs.colspan),t.attrs?.rowspan&&t.attrs.rowspan>1&&(n.rowSpan=t.attrs.rowspan),t.attrs?.colwidth!==null&&t.attrs?.colwidth!==void 0&&t.attrs.colwidth.length>0&&(n.width={size:t.attrs.colwidth[0],type:"dxa"}),new docx.TableCell(n)}function convertTableHeader(t,e){const n={children:t.content?.map(r=>convertParagraph(r,e?.header?.paragraph??e?.cell?.paragraph??e?.row?.paragraph??e?.paragraph))||[],...e?.header?.run};return t.attrs?.colspan&&t.attrs.colspan>1&&(n.columnSpan=t.attrs.colspan),t.attrs?.rowspan&&t.attrs.rowspan>1&&(n.rowSpan=t.attrs.rowspan),t.attrs?.colwidth!==null&&t.attrs?.colwidth!==void 0&&t.attrs.colwidth.length>0&&(n.width={size:t.attrs.colwidth[0],type:"dxa"}),new docx.TableCell(n)}function convertTableRow(t,e){const n=e?.row,r=t.content?.flatMap(a=>a.type==="tableCell"?convertTableCell(a,e):a.type==="tableHeader"?convertTableHeader(a,e):[])||[];return new docx.TableRow({children:r,...n})}function convertTable(t,e){const n={rows:t.content?.map(r=>convertTableRow(r,e))||[],...e?.run};return[new docx.Table(n),new docx.Paragraph({})]}function convertCodeBlock(t){const e=t.content?.map(n=>n.text||"").join("")||"";return new docx.Paragraph({children:[new docx.TextRun({text:e,font:"Consolas"})]})}function convertListItem(t,e){if(!t.content||t.content.length===0)return new docx.Paragraph({});const n=t.content[0];return n.type==="paragraph"?convertParagraph(n,e):new docx.Paragraph({})}function convertBulletList(){return{numbering:{reference:"bullet-list",level:0}}}function convertOrderedList(t){const e=t.attrs?.start||1;return{numbering:{reference:"ordered-list",level:0},start:e}}function convertList(t,e){if(!t.content)return[];const n=[],r=e==="bullet"?convertBulletList():convertOrderedList(t);let a=r.numbering.reference;e==="ordered"&&r.start&&r.start!==1&&(a=`ordered-list-start-${r.start}`);for(const o of t.content)if(o.type==="listItem"){const i=convertListItem(o,{numbering:{reference:a,level:0}});n.push(i)}return n}function convertTaskItem(t){if(!t.content||t.content.length===0)return new docx.Paragraph({});const e=t.content[0];if(e.type==="paragraph"){const n=t.attrs?.checked?"\u2611 ":"\u2610 ",r=e.content?.flatMap(o=>o.type==="text"?convertText(o):o.type==="hardBreak"?convertHardBreak(o.marks):[])||[],a=new docx.TextRun({text:n});return new docx.Paragraph({children:[a,...r]})}return new docx.Paragraph({})}function convertTaskList(t){return!t.content||t.content.length===0?[]:t.content.filter(e=>e.type==="taskItem").map(e=>convertTaskItem(e))}function convertHorizontalRule(t,e){return new docx.Paragraph({children:[],border:{bottom:{style:docx.BorderStyle.SINGLE,size:1,color:"auto"}},...e?.paragraph})}async function convertDetails(t,e){if(!t.content)return[];const n=[];let r,a;for(const o of t.content)o.type==="detailsSummary"?r=o:o.type==="detailsContent"&&(a=o);if(r?.content){const o=r.content.flatMap(p=>p.type==="text"?convertText(p):p.type==="hardBreak"?convertHardBreak(p.marks):[]),i=new docx.Paragraph({children:o,...e.details?.summary?.paragraph});n.push(i)}if(a?.content)for(const o of a.content){const i=await convertNode(o,e);Array.isArray(i)?n.push(...i):i&&n.push(i)}return n}async function generateDOCX(t,e){const{title:n,subject:r,creator:a,keywords:o,description:i,lastModifiedBy:p,revision:w,styles:u,tableOfContents:c,sections:g,fonts:d,hyphenation:h,compatibility:l,customProperties:y,evenAndOddHeaderAndFooters:s,defaultTabStop:v,outputType:F}=e,k=await convertDocumentContent(t,e),b=c?new docx.TableOfContents(c.title,{...c.run}):null,I=Q(t),m={sections:g?g.map((L,T)=>{const x=[];return T===0&&b&&x.push(b),T===0&&x.push(...k),{...L,...x.length>0?{children:x}:{}}}):[{children:b?[b,...k]:k}],title:n||"Document",subject:r||"",creator:a||"",keywords:o||"",description:i||"",lastModifiedBy:p||"",revision:w||1,styles:u,numbering:I};d&&d.length>0&&Object.assign(m,{fonts:d}),h&&Object.assign(m,{hyphenation:h}),l&&Object.assign(m,{compatibility:l}),y&&y.length>0&&Object.assign(m,{customProperties:y}),s!==void 0&&Object.assign(m,{evenAndOddHeaderAndFooters:s}),v!==void 0&&Object.assign(m,{defaultTabStop:v});const A=new docx.Document(m);return docx.Packer.pack(A,F||"arraybuffer")}async function convertDocumentContent(t,e){const n=[];if(!t||!Array.isArray(t.content))return n;for(const r of t.content){const a=await convertNode(r,e);Array.isArray(a)?n.push(...a):a&&n.push(a)}return n}async function convertNode(t,e){if(!t||!t.type)return null;switch(t.type){case"paragraph":return convertParagraph(t);case"heading":return convertHeading(t);case"blockquote":return convertBlockquote(t);case"codeBlock":return convertCodeBlock(t);case"image":return await convertImage(t,e.image);case"table":return convertTable(t,e.table);case"bulletList":return convertList(t,"bullet");case"orderedList":return convertList(t,"ordered");case"taskList":return convertTaskList(t);case"listItem":return convertListItem(t);case"taskItem":return convertTaskItem(t);case"hardBreak":return new docx.Paragraph({children:[convertHardBreak()]});case"horizontalRule":return convertHorizontalRule(t,e.horizontalRule);case"details":return await convertDetails(t,e);default:return new docx.Paragraph({children:[new docx.TextRun({text:`[Unsupported: ${t.type}]`})]})}}function Q(t){const e=new Set;function n(o){if(o.type==="orderedList"&&o.attrs?.start&&e.add(o.attrs.start),o.content)for(const i of o.content)n(i)}n(t);const r=[{level:0,format:docx.LevelFormat.BULLET,text:"\u2022",alignment:docx.AlignmentType.START,style:{paragraph:{indent:{left:docx.convertInchesToTwip(.5),hanging:docx.convertInchesToTwip(.25)}}}},{level:0,format:docx.LevelFormat.DECIMAL,text:"%1.",alignment:docx.AlignmentType.START,style:{paragraph:{indent:{left:docx.convertInchesToTwip(.5),hanging:docx.convertInchesToTwip(.25)}}}}],a=[{reference:"bullet-list",levels:[r[0]]},{reference:"ordered-list",levels:[r[1]]}];for(const o of e)o!==1&&a.push({reference:`ordered-list-start-${o}`,levels:[{level:0,format:docx.LevelFormat.DECIMAL,text:"%1.",alignment:docx.AlignmentType.START,start:o,style:{paragraph:{indent:{left:docx.convertInchesToTwip(.5),hanging:docx.convertInchesToTwip(.25)}}}}]});return{config:a}}exports.convertBlockquote=convertBlockquote,exports.convertBulletList=convertBulletList,exports.convertCodeBlock=convertCodeBlock,exports.convertDetails=convertDetails,exports.convertDocumentContent=convertDocumentContent,exports.convertHardBreak=convertHardBreak,exports.convertHeading=convertHeading,exports.convertHorizontalRule=convertHorizontalRule,exports.convertImage=convertImage,exports.convertList=convertList,exports.convertListItem=convertListItem,exports.convertNode=convertNode,exports.convertOrderedList=convertOrderedList,exports.convertParagraph=convertParagraph,exports.convertTable=convertTable,exports.convertTableCell=convertTableCell,exports.convertTableHeader=convertTableHeader,exports.convertTableRow=convertTableRow,exports.convertTaskItem=convertTaskItem,exports.convertTaskList=convertTaskList,exports.convertText=convertText,exports.createFloatingOptions=createFloatingOptions,exports.generateDOCX=generateDOCX,exports.getImageDataAndMeta=getImageDataAndMeta,exports.getImageHeight=getImageHeight,exports.getImageTypeFromSrc=getImageTypeFromSrc,exports.getImageWidth=getImageWidth;
|
|
1
|
+
"use strict";const docx=require("docx"),imageMeta=require("image-meta"),ofetch=require("ofetch");function f(t){return t?t.startsWith("#")?t:{red:"#FF0000",green:"#008000",blue:"#0000FF",yellow:"#FFFF00",orange:"#FFA500",purple:"#800080",pink:"#FFC0CB",brown:"#A52A2A",black:"#000000",white:"#FFFFFF",gray:"#808080",grey:"#808080",cyan:"#00FFFF",magenta:"#FF00FF",lime:"#00FF00",navy:"#000080",teal:"#008080",maroon:"#800000",olive:"#808000",silver:"#C0C0C0",gold:"#FFD700",indigo:"#4B0082",violet:"#EE82EE"}[t.toLowerCase()]||t:void 0}function convertText(t){const e=t.marks?.some(s=>s.type==="bold"),n=t.marks?.some(s=>s.type==="italic"),r=t.marks?.some(s=>s.type==="underline"),a=t.marks?.some(s=>s.type==="strike"),o=t.marks?.some(s=>s.type==="code"),i=t.marks?.some(s=>s.type==="subscript"),p=t.marks?.some(s=>s.type==="superscript"),c=t.marks?.find(s=>s.type==="link"),l=t.marks?.find(s=>s.type==="textStyle"),d=t.marks?.some(s=>s.type==="highlight"),g=f(l?.attrs?.color),u=f(l?.attrs?.backgroundColor);let y;if(l?.attrs?.fontSize){const s=l.attrs.fontSize;if(s.endsWith("px")){const v=parseFloat(s);isNaN(v)||(y=Math.round(v*1.5))}}let m;o?m="Consolas":l?.attrs?.fontFamily&&(m=l.attrs.fontFamily);const w={text:t.text||"",bold:e||void 0,italics:n||void 0,underline:r?{}:void 0,strike:a||void 0,font:m,size:y,subScript:i||void 0,superScript:p||void 0,color:g,shading:u?{fill:u}:void 0,highlight:d?"yellow":void 0};return c?.attrs?.href?new docx.ExternalHyperlink({children:[new docx.TextRun({...w,style:"Hyperlink"})],link:c.attrs.href}):new docx.TextRun(w)}function convertHardBreak(t){const e={text:"",break:1};if(t)for(const n of t)switch(n.type){case"bold":e.bold=!0;break;case"italic":e.italics=!0;break;case"underline":e.underline={};break;case"strike":e.strike=!0;break;case"textStyle":n.attrs?.color&&(e.color=n.attrs.color);break}return new docx.TextRun(e)}function getImageTypeFromSrc(t){if(t.startsWith("data:")){const e=t.match(/data:image\/(\w+);/);if(e)switch(e[1].toLowerCase()){case"jpg":case"jpeg":return"jpeg";case"png":return"png";case"gif":return"gif";case"bmp":return"bmp";case"tiff":return"tiff";default:return"png"}}else switch(t.split(".").pop()?.toLowerCase()){case"jpg":case"jpeg":return"jpeg";case"png":return"png";case"gif":return"gif";case"bmp":return"bmp";case"tiff":return"tiff";default:return"png"}return"png"}function createFloatingOptions(){return{horizontalPosition:{relative:"page",align:"center"},verticalPosition:{relative:"page",align:"top"},lockAnchor:!0,behindDocument:!1,inFrontOfText:!1}}function getImageWidth(t,e,n){return t.attrs?.width!==void 0&&t.attrs?.width!==null?t.attrs.width:e?.run?.transformation?.width?e.run.transformation.width:n?.width?n.width:400}function getImageHeight(t,e,n,r){return t.attrs?.height!==void 0&&t.attrs?.height!==null?t.attrs.height:n?.run?.transformation?.height?n.run.transformation.height:r?.width&&r?.height?Math.round(e*r.height/r.width):300}async function getImageDataAndMeta(t){try{const e=await(await ofetch.ofetch(t,{responseType:"blob"})).bytes();let n;try{n=imageMeta.imageMeta(e)}catch(r){console.warn("Failed to extract image metadata:",r),n={width:void 0,height:void 0,type:getImageTypeFromSrc(t)||"png",orientation:void 0}}return{data:e,meta:n}}catch(e){throw console.warn(`Failed to fetch image from ${t}:`,e),e}}async function convertImageToRun(t,e){const n=c=>{switch(c){case"jpeg":case"jpg":return"jpg";case"png":return"png";case"gif":return"gif";case"bmp":return"bmp"}switch(getImageTypeFromSrc(t.attrs?.src||"")){case"jpeg":return"jpg";case"png":return"png";case"gif":return"gif";case"bmp":return"bmp";default:return"png"}};let r,a;try{const c=t.attrs?.src||"";if(c.startsWith("http")){const l=await getImageDataAndMeta(c);r=l.data,a=l.meta}else if(c.startsWith("data:")){const l=c.split(",")[1];if(!l)throw new Error("Invalid data URL: missing base64 data");const d=atob(l),g=new Uint8Array(d.length);for(let u=0;u<d.length;u++)g[u]=d.charCodeAt(u);r=g;try{a=imageMeta.imageMeta(r)}catch{a={type:"png",width:void 0,height:void 0,orientation:void 0}}}else throw new Error(`Unsupported image source format: ${c.substring(0,20)}...`)}catch(c){return console.warn("Failed to process image:",c),new docx.ImageRun({type:"png",data:new Uint8Array(0),transformation:{width:100,height:100},altText:{name:t.attrs?.alt||"Failed to load image"}})}const o=getImageWidth(t,e,a),i=getImageHeight(t,o,e,a),p={type:n(a.type),data:r,transformation:{width:o,height:i},altText:{name:t.attrs?.alt||"",description:void 0,title:t.attrs?.title||void 0},...e?.run&&e.run.floating&&{floating:e.run.floating},...e?.run&&e.run.outline&&{outline:e.run.outline}};return new docx.ImageRun(p)}async function convertImage(t,e){const n=await convertImageToRun(t,e),r=e?.paragraph||{};return new docx.Paragraph({children:[n],...r})}async function convertParagraph(t,e,n){const r={children:(await Promise.all((t.content||[]).map(async a=>a.type==="text"?convertText(a):a.type==="hardBreak"?convertHardBreak(a.marks):a.type==="image"?await convertImageToRun(a,n?.image):[]))).flat(),...e};return new docx.Paragraph(r)}function convertHeading(t){const e=t?.attrs?.level,n=t.content?.flatMap(a=>a.type==="text"?convertText(a):a.type==="hardBreak"?convertHardBreak(a.marks):[])||[],r={1:docx.HeadingLevel.HEADING_1,2:docx.HeadingLevel.HEADING_2,3:docx.HeadingLevel.HEADING_3,4:docx.HeadingLevel.HEADING_4,5:docx.HeadingLevel.HEADING_5,6:docx.HeadingLevel.HEADING_6};return new docx.Paragraph({children:n,heading:r[e]})}function convertBlockquote(t){return t.content?t.content.map(e=>{if(e.type==="paragraph"){const n=e.content?.flatMap(r=>r.type==="text"?convertText(r):r.type==="hardBreak"?convertHardBreak(r.marks):[])||[];return new docx.Paragraph({children:n,indent:{left:720},border:{left:{style:"single"}}})}return new docx.Paragraph({})}):[]}async function convertTableCell(t,e,n){const r={children:await Promise.all((t.content||[]).map(a=>convertParagraph(a,e?.cell?.paragraph??e?.row?.paragraph??e?.paragraph,n))),...e?.cell?.run};return t.attrs?.colspan&&t.attrs.colspan>1&&(r.columnSpan=t.attrs.colspan),t.attrs?.rowspan&&t.attrs.rowspan>1&&(r.rowSpan=t.attrs.rowspan),t.attrs?.colwidth!==null&&t.attrs?.colwidth!==void 0&&t.attrs.colwidth.length>0&&(r.width={size:t.attrs.colwidth[0],type:"dxa"}),new docx.TableCell(r)}async function convertTableHeader(t,e,n){const r={children:await Promise.all((t.content||[]).map(a=>convertParagraph(a,e?.header?.paragraph??e?.cell?.paragraph??e?.row?.paragraph??e?.paragraph,n))),...e?.header?.run};return t.attrs?.colspan&&t.attrs.colspan>1&&(r.columnSpan=t.attrs.colspan),t.attrs?.rowspan&&t.attrs.rowspan>1&&(r.rowSpan=t.attrs.rowspan),t.attrs?.colwidth!==null&&t.attrs?.colwidth!==void 0&&t.attrs.colwidth.length>0&&(r.width={size:t.attrs.colwidth[0],type:"dxa"}),new docx.TableCell(r)}async function convertTableRow(t,e,n){const r=e?.row,a=(await Promise.all((t.content||[]).map(async o=>o.type==="tableCell"?await convertTableCell(o,e,n):o.type==="tableHeader"?await convertTableHeader(o,e,n):null))).filter(o=>o!==null);return new docx.TableRow({children:a,...r})}async function convertTable(t,e,n){const r={rows:await Promise.all((t.content||[]).map(a=>convertTableRow(a,e,n))),...e?.run};return[new docx.Table(r),new docx.Paragraph({})]}function convertCodeBlock(t){const e=t.content?.map(n=>n.text||"").join("")||"";return new docx.Paragraph({children:[new docx.TextRun({text:e,font:"Consolas"})]})}async function convertListItem(t,e,n){if(!t.content||t.content.length===0)return new docx.Paragraph({});const r=t.content[0];return r.type==="paragraph"?await convertParagraph(r,e,n):new docx.Paragraph({})}function convertBulletList(){return{numbering:{reference:"bullet-list",level:0}}}function convertOrderedList(t){const e=t.attrs?.start||1;return{numbering:{reference:"ordered-list",level:0},start:e}}async function convertList(t,e,n){if(!t.content)return[];const r=[],a=e==="bullet"?convertBulletList():convertOrderedList(t);let o=a.numbering.reference;e==="ordered"&&a.start&&a.start!==1&&(o=`ordered-list-start-${a.start}`);for(const i of t.content)if(i.type==="listItem"){const p=await convertListItem(i,{numbering:{reference:o,level:0}},n);r.push(p)}return r}function convertTaskItem(t){if(!t.content||t.content.length===0)return new docx.Paragraph({});const e=t.content[0];if(e.type==="paragraph"){const n=t.attrs?.checked?"\u2611 ":"\u2610 ",r=e.content?.flatMap(o=>o.type==="text"?convertText(o):o.type==="hardBreak"?convertHardBreak(o.marks):[])||[],a=new docx.TextRun({text:n});return new docx.Paragraph({children:[a,...r]})}return new docx.Paragraph({})}function convertTaskList(t){return!t.content||t.content.length===0?[]:t.content.filter(e=>e.type==="taskItem").map(e=>convertTaskItem(e))}function convertHorizontalRule(t,e){return new docx.Paragraph({children:[],border:{bottom:{style:docx.BorderStyle.SINGLE,size:1,color:"auto"}},...e?.paragraph})}async function convertDetails(t,e){if(!t.content)return[];const n=[];let r,a;for(const o of t.content)o.type==="detailsSummary"?r=o:o.type==="detailsContent"&&(a=o);if(r?.content){const o=r.content.flatMap(p=>p.type==="text"?convertText(p):p.type==="hardBreak"?convertHardBreak(p.marks):[]),i=new docx.Paragraph({children:o,...e.details?.summary?.paragraph});n.push(i)}if(a?.content)for(const o of a.content){const i=await convertNode(o,e);Array.isArray(i)?n.push(...i):i&&n.push(i)}return n}async function generateDOCX(t,e){const{title:n,subject:r,creator:a,keywords:o,description:i,lastModifiedBy:p,revision:c,styles:l,tableOfContents:d,sections:g,fonts:u,hyphenation:y,compatibility:m,customProperties:w,evenAndOddHeaderAndFooters:s,defaultTabStop:v,outputType:F}=e,k=await convertDocumentContent(t,e),b=d?new docx.TableOfContents(d.title,{...d.run}):null,I=Q(t),h={sections:g?g.map((L,T)=>{const x=[];return T===0&&b&&x.push(b),T===0&&x.push(...k),{...L,...x.length>0?{children:x}:{}}}):[{children:b?[b,...k]:k}],title:n||"Document",subject:r||"",creator:a||"",keywords:o||"",description:i||"",lastModifiedBy:p||"",revision:c||1,styles:l,numbering:I};u&&u.length>0&&Object.assign(h,{fonts:u}),y&&Object.assign(h,{hyphenation:y}),m&&Object.assign(h,{compatibility:m}),w&&w.length>0&&Object.assign(h,{customProperties:w}),s!==void 0&&Object.assign(h,{evenAndOddHeaderAndFooters:s}),v!==void 0&&Object.assign(h,{defaultTabStop:v});const A=new docx.Document(h);return docx.Packer.pack(A,F||"arraybuffer")}async function convertDocumentContent(t,e){const n=[];if(!t||!Array.isArray(t.content))return n;for(const r of t.content){const a=await convertNode(r,e);Array.isArray(a)?n.push(...a):a&&n.push(a)}return n}async function convertNode(t,e){if(!t||!t.type)return null;switch(t.type){case"paragraph":return await convertParagraph(t,void 0,e);case"heading":return convertHeading(t);case"blockquote":return convertBlockquote(t);case"codeBlock":return convertCodeBlock(t);case"image":return await convertImage(t,e.image);case"table":return await convertTable(t,e.table,e);case"bulletList":return await convertList(t,"bullet",e);case"orderedList":return await convertList(t,"ordered",e);case"taskList":return convertTaskList(t);case"listItem":return convertListItem(t);case"taskItem":return convertTaskItem(t);case"hardBreak":return new docx.Paragraph({children:[convertHardBreak()]});case"horizontalRule":return convertHorizontalRule(t,e.horizontalRule);case"details":return await convertDetails(t,e);default:return new docx.Paragraph({children:[new docx.TextRun({text:`[Unsupported: ${t.type}]`})]})}}function Q(t){const e=new Set;function n(o){if(o.type==="orderedList"&&o.attrs?.start&&e.add(o.attrs.start),o.content)for(const i of o.content)n(i)}n(t);const r=[{level:0,format:docx.LevelFormat.BULLET,text:"\u2022",alignment:docx.AlignmentType.START,style:{paragraph:{indent:{left:docx.convertInchesToTwip(.5),hanging:docx.convertInchesToTwip(.25)}}}},{level:0,format:docx.LevelFormat.DECIMAL,text:"%1.",alignment:docx.AlignmentType.START,style:{paragraph:{indent:{left:docx.convertInchesToTwip(.5),hanging:docx.convertInchesToTwip(.25)}}}}],a=[{reference:"bullet-list",levels:[r[0]]},{reference:"ordered-list",levels:[r[1]]}];for(const o of e)o!==1&&a.push({reference:`ordered-list-start-${o}`,levels:[{level:0,format:docx.LevelFormat.DECIMAL,text:"%1.",alignment:docx.AlignmentType.START,start:o,style:{paragraph:{indent:{left:docx.convertInchesToTwip(.5),hanging:docx.convertInchesToTwip(.25)}}}}]});return{config:a}}exports.convertBlockquote=convertBlockquote,exports.convertBulletList=convertBulletList,exports.convertCodeBlock=convertCodeBlock,exports.convertDetails=convertDetails,exports.convertDocumentContent=convertDocumentContent,exports.convertHardBreak=convertHardBreak,exports.convertHeading=convertHeading,exports.convertHorizontalRule=convertHorizontalRule,exports.convertImage=convertImage,exports.convertImageToRun=convertImageToRun,exports.convertList=convertList,exports.convertListItem=convertListItem,exports.convertNode=convertNode,exports.convertOrderedList=convertOrderedList,exports.convertParagraph=convertParagraph,exports.convertTable=convertTable,exports.convertTableCell=convertTableCell,exports.convertTableHeader=convertTableHeader,exports.convertTableRow=convertTableRow,exports.convertTaskItem=convertTaskItem,exports.convertTaskList=convertTaskList,exports.convertText=convertText,exports.createFloatingOptions=createFloatingOptions,exports.generateDOCX=generateDOCX,exports.getImageDataAndMeta=getImageDataAndMeta,exports.getImageHeight=getImageHeight,exports.getImageTypeFromSrc=getImageTypeFromSrc,exports.getImageWidth=getImageWidth;
|
package/dist/index.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { OutputType, ISectionOptions, IPropertiesOptions, ITableOfContentsOptions, IParagraphOptions, IImageOptions, ITableOptions, ITableRowOptions, ITableCellOptions, OutputByType, FileChild, TextRun, ExternalHyperlink, Paragraph, Table, TableRow, TableCell } from 'docx';
|
|
1
|
+
import { OutputType, ISectionOptions, IPropertiesOptions, ITableOfContentsOptions, IParagraphOptions, IImageOptions, ITableOptions, ITableRowOptions, ITableCellOptions, OutputByType, FileChild, TextRun, ExternalHyperlink, Paragraph, ImageRun, Table, TableRow, TableCell } from 'docx';
|
|
2
2
|
import { ImageMeta } from 'image-meta';
|
|
3
3
|
|
|
4
4
|
declare class OrderedMap<T = any> {
|
|
@@ -6473,7 +6473,7 @@ interface DocumentNode extends JSONContent {
|
|
|
6473
6473
|
}
|
|
6474
6474
|
interface ParagraphNode extends JSONContent {
|
|
6475
6475
|
type: "paragraph";
|
|
6476
|
-
content?: Array<TextNode | HardBreakNode>;
|
|
6476
|
+
content?: Array<TextNode | HardBreakNode | ImageNode>;
|
|
6477
6477
|
}
|
|
6478
6478
|
interface HeadingNode extends JSONContent {
|
|
6479
6479
|
type: "heading";
|
|
@@ -6592,9 +6592,10 @@ declare function convertHardBreak(marks?: Array<{
|
|
|
6592
6592
|
*
|
|
6593
6593
|
* @param node - TipTap paragraph node
|
|
6594
6594
|
* @param options - Optional paragraph options (e.g., numbering)
|
|
6595
|
-
* @
|
|
6595
|
+
* @param exportOptions - Export options (for image processing)
|
|
6596
|
+
* @returns Promise<DOCX Paragraph object>
|
|
6596
6597
|
*/
|
|
6597
|
-
declare function convertParagraph(node: ParagraphNode, options?: IParagraphOptions): Paragraph
|
|
6598
|
+
declare function convertParagraph(node: ParagraphNode, options?: IParagraphOptions, exportOptions?: DocxExportOptions): Promise<Paragraph>;
|
|
6598
6599
|
|
|
6599
6600
|
/**
|
|
6600
6601
|
* Convert TipTap heading node to DOCX paragraph
|
|
@@ -6613,6 +6614,14 @@ declare function convertHeading(node: HeadingNode): Paragraph;
|
|
|
6613
6614
|
*/
|
|
6614
6615
|
declare function convertBlockquote(node: BlockquoteNode): Paragraph[];
|
|
6615
6616
|
|
|
6617
|
+
/**
|
|
6618
|
+
* Convert TipTap image node to DOCX ImageRun
|
|
6619
|
+
*
|
|
6620
|
+
* @param node - TipTap image node
|
|
6621
|
+
* @param options - Image options from PropertiesOptions
|
|
6622
|
+
* @returns Promise<DOCX ImageRun>
|
|
6623
|
+
*/
|
|
6624
|
+
declare function convertImageToRun(node: ImageNode, options: DocxExportOptions["image"]): Promise<ImageRun>;
|
|
6616
6625
|
/**
|
|
6617
6626
|
* Convert TipTap image node to DOCX Paragraph with ImageRun
|
|
6618
6627
|
*
|
|
@@ -6627,36 +6636,40 @@ declare function convertImage(node: ImageNode, options: DocxExportOptions["image
|
|
|
6627
6636
|
*
|
|
6628
6637
|
* @param node - TipTap table node
|
|
6629
6638
|
* @param options - Table options from PropertiesOptions
|
|
6630
|
-
* @
|
|
6639
|
+
* @param exportOptions - Export options (for image processing)
|
|
6640
|
+
* @returns Promise<Array containing Table and a following Paragraph to prevent merging>
|
|
6631
6641
|
*/
|
|
6632
|
-
declare function convertTable(node: TableNode, options: DocxExportOptions["table"]): Array<Table | Paragraph
|
|
6642
|
+
declare function convertTable(node: TableNode, options: DocxExportOptions["table"], exportOptions?: DocxExportOptions): Promise<Array<Table | Paragraph>>;
|
|
6633
6643
|
|
|
6634
6644
|
/**
|
|
6635
6645
|
* Convert TipTap table row node to DOCX TableRow
|
|
6636
6646
|
*
|
|
6637
6647
|
* @param node - TipTap table row node
|
|
6638
6648
|
* @param options - Table options from PropertiesOptions
|
|
6639
|
-
* @
|
|
6649
|
+
* @param exportOptions - Export options (for image processing)
|
|
6650
|
+
* @returns Promise<DOCX TableRow object>
|
|
6640
6651
|
*/
|
|
6641
|
-
declare function convertTableRow(node: TableRowNode, options: DocxExportOptions["table"]): TableRow
|
|
6652
|
+
declare function convertTableRow(node: TableRowNode, options: DocxExportOptions["table"], exportOptions?: DocxExportOptions): Promise<TableRow>;
|
|
6642
6653
|
|
|
6643
6654
|
/**
|
|
6644
6655
|
* Convert TipTap table cell node to DOCX TableCell
|
|
6645
6656
|
*
|
|
6646
6657
|
* @param node - TipTap table cell node
|
|
6647
6658
|
* @param options - Table options from PropertiesOptions
|
|
6648
|
-
* @
|
|
6659
|
+
* @param exportOptions - Export options (for image processing)
|
|
6660
|
+
* @returns Promise<DOCX TableCell object>
|
|
6649
6661
|
*/
|
|
6650
|
-
declare function convertTableCell(node: TableCellNode, options: DocxExportOptions["table"]): TableCell
|
|
6662
|
+
declare function convertTableCell(node: TableCellNode, options: DocxExportOptions["table"], exportOptions?: DocxExportOptions): Promise<TableCell>;
|
|
6651
6663
|
|
|
6652
6664
|
/**
|
|
6653
6665
|
* Convert TipTap table header node to DOCX TableCell
|
|
6654
6666
|
*
|
|
6655
6667
|
* @param node - TipTap table header node
|
|
6656
6668
|
* @param options - Table options from PropertiesOptions
|
|
6657
|
-
* @
|
|
6669
|
+
* @param exportOptions - Export options (for image processing)
|
|
6670
|
+
* @returns Promise<DOCX TableCell object for header>
|
|
6658
6671
|
*/
|
|
6659
|
-
declare function convertTableHeader(node: TableHeaderNode, options: DocxExportOptions["table"]): TableCell
|
|
6672
|
+
declare function convertTableHeader(node: TableHeaderNode, options: DocxExportOptions["table"], exportOptions?: DocxExportOptions): Promise<TableCell>;
|
|
6660
6673
|
|
|
6661
6674
|
/**
|
|
6662
6675
|
* Convert TipTap codeBlock node to DOCX Paragraph
|
|
@@ -6678,7 +6691,7 @@ declare function convertOrderedList(node: OrderedListNode): ListOptions;
|
|
|
6678
6691
|
/**
|
|
6679
6692
|
* Convert list nodes (bullet or ordered) with proper numbering
|
|
6680
6693
|
*/
|
|
6681
|
-
declare function convertList(node: BulletListNode | OrderedListNode, listType: "bullet" | "ordered"): Paragraph[]
|
|
6694
|
+
declare function convertList(node: BulletListNode | OrderedListNode, listType: "bullet" | "ordered", exportOptions?: DocxExportOptions): Promise<Paragraph[]>;
|
|
6682
6695
|
|
|
6683
6696
|
/**
|
|
6684
6697
|
* Convert TipTap list item node to DOCX Paragraph
|
|
@@ -6689,9 +6702,10 @@ declare function convertList(node: BulletListNode | OrderedListNode, listType: "
|
|
|
6689
6702
|
*
|
|
6690
6703
|
* @param node - TipTap list item node
|
|
6691
6704
|
* @param options - Optional paragraph options (e.g., numbering)
|
|
6692
|
-
* @
|
|
6705
|
+
* @param exportOptions - Export options (for image processing)
|
|
6706
|
+
* @returns Promise<DOCX Paragraph object>
|
|
6693
6707
|
*/
|
|
6694
|
-
declare function convertListItem(node: ListItemNode, options?: IParagraphOptions): Paragraph
|
|
6708
|
+
declare function convertListItem(node: ListItemNode, options?: IParagraphOptions, exportOptions?: DocxExportOptions): Promise<Paragraph>;
|
|
6695
6709
|
|
|
6696
6710
|
/**
|
|
6697
6711
|
* Convert TipTap task list node to DOCX paragraphs
|
|
@@ -6794,5 +6808,5 @@ declare function getImageDataAndMeta(url: string): Promise<{
|
|
|
6794
6808
|
meta: ImageMeta;
|
|
6795
6809
|
}>;
|
|
6796
6810
|
|
|
6797
|
-
export { convertBlockquote, convertBulletList, convertCodeBlock, convertDetails, convertDocumentContent, convertHardBreak, convertHeading, convertHorizontalRule, convertImage, convertList, convertListItem, convertNode, convertOrderedList, convertParagraph, convertTable, convertTableCell, convertTableHeader, convertTableRow, convertTaskItem, convertTaskList, convertText, createFloatingOptions, generateDOCX, getImageDataAndMeta, getImageHeight, getImageTypeFromSrc, getImageWidth };
|
|
6811
|
+
export { convertBlockquote, convertBulletList, convertCodeBlock, convertDetails, convertDocumentContent, convertHardBreak, convertHeading, convertHorizontalRule, convertImage, convertImageToRun, convertList, convertListItem, convertNode, convertOrderedList, convertParagraph, convertTable, convertTableCell, convertTableHeader, convertTableRow, convertTaskItem, convertTaskList, convertText, createFloatingOptions, generateDOCX, getImageDataAndMeta, getImageHeight, getImageTypeFromSrc, getImageWidth };
|
|
6798
6812
|
export type { BlockNode, BlockquoteNode, BulletListNode, CodeBlockNode, DetailsContentNode, DetailsNode, DetailsSummaryNode, DocumentNode, DocxExportOptions, HardBreakNode, HeadingNode, HorizontalRuleNode, ImageNode, JSONContent, ListItemNode, ListOptions, Mark, OrderedListNode, ParagraphNode, TableCellNode, TableHeaderNode, TableNode, TableRowNode, TaskItemNode, TaskListNode, TextContent, TextNode };
|
package/dist/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { OutputType, ISectionOptions, IPropertiesOptions, ITableOfContentsOptions, IParagraphOptions, IImageOptions, ITableOptions, ITableRowOptions, ITableCellOptions, OutputByType, FileChild, TextRun, ExternalHyperlink, Paragraph, Table, TableRow, TableCell } from 'docx';
|
|
1
|
+
import { OutputType, ISectionOptions, IPropertiesOptions, ITableOfContentsOptions, IParagraphOptions, IImageOptions, ITableOptions, ITableRowOptions, ITableCellOptions, OutputByType, FileChild, TextRun, ExternalHyperlink, Paragraph, ImageRun, Table, TableRow, TableCell } from 'docx';
|
|
2
2
|
import { ImageMeta } from 'image-meta';
|
|
3
3
|
|
|
4
4
|
declare class OrderedMap<T = any> {
|
|
@@ -6473,7 +6473,7 @@ interface DocumentNode extends JSONContent {
|
|
|
6473
6473
|
}
|
|
6474
6474
|
interface ParagraphNode extends JSONContent {
|
|
6475
6475
|
type: "paragraph";
|
|
6476
|
-
content?: Array<TextNode | HardBreakNode>;
|
|
6476
|
+
content?: Array<TextNode | HardBreakNode | ImageNode>;
|
|
6477
6477
|
}
|
|
6478
6478
|
interface HeadingNode extends JSONContent {
|
|
6479
6479
|
type: "heading";
|
|
@@ -6592,9 +6592,10 @@ declare function convertHardBreak(marks?: Array<{
|
|
|
6592
6592
|
*
|
|
6593
6593
|
* @param node - TipTap paragraph node
|
|
6594
6594
|
* @param options - Optional paragraph options (e.g., numbering)
|
|
6595
|
-
* @
|
|
6595
|
+
* @param exportOptions - Export options (for image processing)
|
|
6596
|
+
* @returns Promise<DOCX Paragraph object>
|
|
6596
6597
|
*/
|
|
6597
|
-
declare function convertParagraph(node: ParagraphNode, options?: IParagraphOptions): Paragraph
|
|
6598
|
+
declare function convertParagraph(node: ParagraphNode, options?: IParagraphOptions, exportOptions?: DocxExportOptions): Promise<Paragraph>;
|
|
6598
6599
|
|
|
6599
6600
|
/**
|
|
6600
6601
|
* Convert TipTap heading node to DOCX paragraph
|
|
@@ -6613,6 +6614,14 @@ declare function convertHeading(node: HeadingNode): Paragraph;
|
|
|
6613
6614
|
*/
|
|
6614
6615
|
declare function convertBlockquote(node: BlockquoteNode): Paragraph[];
|
|
6615
6616
|
|
|
6617
|
+
/**
|
|
6618
|
+
* Convert TipTap image node to DOCX ImageRun
|
|
6619
|
+
*
|
|
6620
|
+
* @param node - TipTap image node
|
|
6621
|
+
* @param options - Image options from PropertiesOptions
|
|
6622
|
+
* @returns Promise<DOCX ImageRun>
|
|
6623
|
+
*/
|
|
6624
|
+
declare function convertImageToRun(node: ImageNode, options: DocxExportOptions["image"]): Promise<ImageRun>;
|
|
6616
6625
|
/**
|
|
6617
6626
|
* Convert TipTap image node to DOCX Paragraph with ImageRun
|
|
6618
6627
|
*
|
|
@@ -6627,36 +6636,40 @@ declare function convertImage(node: ImageNode, options: DocxExportOptions["image
|
|
|
6627
6636
|
*
|
|
6628
6637
|
* @param node - TipTap table node
|
|
6629
6638
|
* @param options - Table options from PropertiesOptions
|
|
6630
|
-
* @
|
|
6639
|
+
* @param exportOptions - Export options (for image processing)
|
|
6640
|
+
* @returns Promise<Array containing Table and a following Paragraph to prevent merging>
|
|
6631
6641
|
*/
|
|
6632
|
-
declare function convertTable(node: TableNode, options: DocxExportOptions["table"]): Array<Table | Paragraph
|
|
6642
|
+
declare function convertTable(node: TableNode, options: DocxExportOptions["table"], exportOptions?: DocxExportOptions): Promise<Array<Table | Paragraph>>;
|
|
6633
6643
|
|
|
6634
6644
|
/**
|
|
6635
6645
|
* Convert TipTap table row node to DOCX TableRow
|
|
6636
6646
|
*
|
|
6637
6647
|
* @param node - TipTap table row node
|
|
6638
6648
|
* @param options - Table options from PropertiesOptions
|
|
6639
|
-
* @
|
|
6649
|
+
* @param exportOptions - Export options (for image processing)
|
|
6650
|
+
* @returns Promise<DOCX TableRow object>
|
|
6640
6651
|
*/
|
|
6641
|
-
declare function convertTableRow(node: TableRowNode, options: DocxExportOptions["table"]): TableRow
|
|
6652
|
+
declare function convertTableRow(node: TableRowNode, options: DocxExportOptions["table"], exportOptions?: DocxExportOptions): Promise<TableRow>;
|
|
6642
6653
|
|
|
6643
6654
|
/**
|
|
6644
6655
|
* Convert TipTap table cell node to DOCX TableCell
|
|
6645
6656
|
*
|
|
6646
6657
|
* @param node - TipTap table cell node
|
|
6647
6658
|
* @param options - Table options from PropertiesOptions
|
|
6648
|
-
* @
|
|
6659
|
+
* @param exportOptions - Export options (for image processing)
|
|
6660
|
+
* @returns Promise<DOCX TableCell object>
|
|
6649
6661
|
*/
|
|
6650
|
-
declare function convertTableCell(node: TableCellNode, options: DocxExportOptions["table"]): TableCell
|
|
6662
|
+
declare function convertTableCell(node: TableCellNode, options: DocxExportOptions["table"], exportOptions?: DocxExportOptions): Promise<TableCell>;
|
|
6651
6663
|
|
|
6652
6664
|
/**
|
|
6653
6665
|
* Convert TipTap table header node to DOCX TableCell
|
|
6654
6666
|
*
|
|
6655
6667
|
* @param node - TipTap table header node
|
|
6656
6668
|
* @param options - Table options from PropertiesOptions
|
|
6657
|
-
* @
|
|
6669
|
+
* @param exportOptions - Export options (for image processing)
|
|
6670
|
+
* @returns Promise<DOCX TableCell object for header>
|
|
6658
6671
|
*/
|
|
6659
|
-
declare function convertTableHeader(node: TableHeaderNode, options: DocxExportOptions["table"]): TableCell
|
|
6672
|
+
declare function convertTableHeader(node: TableHeaderNode, options: DocxExportOptions["table"], exportOptions?: DocxExportOptions): Promise<TableCell>;
|
|
6660
6673
|
|
|
6661
6674
|
/**
|
|
6662
6675
|
* Convert TipTap codeBlock node to DOCX Paragraph
|
|
@@ -6678,7 +6691,7 @@ declare function convertOrderedList(node: OrderedListNode): ListOptions;
|
|
|
6678
6691
|
/**
|
|
6679
6692
|
* Convert list nodes (bullet or ordered) with proper numbering
|
|
6680
6693
|
*/
|
|
6681
|
-
declare function convertList(node: BulletListNode | OrderedListNode, listType: "bullet" | "ordered"): Paragraph[]
|
|
6694
|
+
declare function convertList(node: BulletListNode | OrderedListNode, listType: "bullet" | "ordered", exportOptions?: DocxExportOptions): Promise<Paragraph[]>;
|
|
6682
6695
|
|
|
6683
6696
|
/**
|
|
6684
6697
|
* Convert TipTap list item node to DOCX Paragraph
|
|
@@ -6689,9 +6702,10 @@ declare function convertList(node: BulletListNode | OrderedListNode, listType: "
|
|
|
6689
6702
|
*
|
|
6690
6703
|
* @param node - TipTap list item node
|
|
6691
6704
|
* @param options - Optional paragraph options (e.g., numbering)
|
|
6692
|
-
* @
|
|
6705
|
+
* @param exportOptions - Export options (for image processing)
|
|
6706
|
+
* @returns Promise<DOCX Paragraph object>
|
|
6693
6707
|
*/
|
|
6694
|
-
declare function convertListItem(node: ListItemNode, options?: IParagraphOptions): Paragraph
|
|
6708
|
+
declare function convertListItem(node: ListItemNode, options?: IParagraphOptions, exportOptions?: DocxExportOptions): Promise<Paragraph>;
|
|
6695
6709
|
|
|
6696
6710
|
/**
|
|
6697
6711
|
* Convert TipTap task list node to DOCX paragraphs
|
|
@@ -6794,5 +6808,5 @@ declare function getImageDataAndMeta(url: string): Promise<{
|
|
|
6794
6808
|
meta: ImageMeta;
|
|
6795
6809
|
}>;
|
|
6796
6810
|
|
|
6797
|
-
export { convertBlockquote, convertBulletList, convertCodeBlock, convertDetails, convertDocumentContent, convertHardBreak, convertHeading, convertHorizontalRule, convertImage, convertList, convertListItem, convertNode, convertOrderedList, convertParagraph, convertTable, convertTableCell, convertTableHeader, convertTableRow, convertTaskItem, convertTaskList, convertText, createFloatingOptions, generateDOCX, getImageDataAndMeta, getImageHeight, getImageTypeFromSrc, getImageWidth };
|
|
6811
|
+
export { convertBlockquote, convertBulletList, convertCodeBlock, convertDetails, convertDocumentContent, convertHardBreak, convertHeading, convertHorizontalRule, convertImage, convertImageToRun, convertList, convertListItem, convertNode, convertOrderedList, convertParagraph, convertTable, convertTableCell, convertTableHeader, convertTableRow, convertTaskItem, convertTaskList, convertText, createFloatingOptions, generateDOCX, getImageDataAndMeta, getImageHeight, getImageTypeFromSrc, getImageWidth };
|
|
6798
6812
|
export type { BlockNode, BlockquoteNode, BulletListNode, CodeBlockNode, DetailsContentNode, DetailsNode, DetailsSummaryNode, DocumentNode, DocxExportOptions, HardBreakNode, HeadingNode, HorizontalRuleNode, ImageNode, JSONContent, ListItemNode, ListOptions, Mark, OrderedListNode, ParagraphNode, TableCellNode, TableHeaderNode, TableNode, TableRowNode, TaskItemNode, TaskListNode, TextContent, TextNode };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { OutputType, ISectionOptions, IPropertiesOptions, ITableOfContentsOptions, IParagraphOptions, IImageOptions, ITableOptions, ITableRowOptions, ITableCellOptions, OutputByType, FileChild, TextRun, ExternalHyperlink, Paragraph, Table, TableRow, TableCell } from 'docx';
|
|
1
|
+
import { OutputType, ISectionOptions, IPropertiesOptions, ITableOfContentsOptions, IParagraphOptions, IImageOptions, ITableOptions, ITableRowOptions, ITableCellOptions, OutputByType, FileChild, TextRun, ExternalHyperlink, Paragraph, ImageRun, Table, TableRow, TableCell } from 'docx';
|
|
2
2
|
import { ImageMeta } from 'image-meta';
|
|
3
3
|
|
|
4
4
|
declare class OrderedMap<T = any> {
|
|
@@ -6473,7 +6473,7 @@ interface DocumentNode extends JSONContent {
|
|
|
6473
6473
|
}
|
|
6474
6474
|
interface ParagraphNode extends JSONContent {
|
|
6475
6475
|
type: "paragraph";
|
|
6476
|
-
content?: Array<TextNode | HardBreakNode>;
|
|
6476
|
+
content?: Array<TextNode | HardBreakNode | ImageNode>;
|
|
6477
6477
|
}
|
|
6478
6478
|
interface HeadingNode extends JSONContent {
|
|
6479
6479
|
type: "heading";
|
|
@@ -6592,9 +6592,10 @@ declare function convertHardBreak(marks?: Array<{
|
|
|
6592
6592
|
*
|
|
6593
6593
|
* @param node - TipTap paragraph node
|
|
6594
6594
|
* @param options - Optional paragraph options (e.g., numbering)
|
|
6595
|
-
* @
|
|
6595
|
+
* @param exportOptions - Export options (for image processing)
|
|
6596
|
+
* @returns Promise<DOCX Paragraph object>
|
|
6596
6597
|
*/
|
|
6597
|
-
declare function convertParagraph(node: ParagraphNode, options?: IParagraphOptions): Paragraph
|
|
6598
|
+
declare function convertParagraph(node: ParagraphNode, options?: IParagraphOptions, exportOptions?: DocxExportOptions): Promise<Paragraph>;
|
|
6598
6599
|
|
|
6599
6600
|
/**
|
|
6600
6601
|
* Convert TipTap heading node to DOCX paragraph
|
|
@@ -6613,6 +6614,14 @@ declare function convertHeading(node: HeadingNode): Paragraph;
|
|
|
6613
6614
|
*/
|
|
6614
6615
|
declare function convertBlockquote(node: BlockquoteNode): Paragraph[];
|
|
6615
6616
|
|
|
6617
|
+
/**
|
|
6618
|
+
* Convert TipTap image node to DOCX ImageRun
|
|
6619
|
+
*
|
|
6620
|
+
* @param node - TipTap image node
|
|
6621
|
+
* @param options - Image options from PropertiesOptions
|
|
6622
|
+
* @returns Promise<DOCX ImageRun>
|
|
6623
|
+
*/
|
|
6624
|
+
declare function convertImageToRun(node: ImageNode, options: DocxExportOptions["image"]): Promise<ImageRun>;
|
|
6616
6625
|
/**
|
|
6617
6626
|
* Convert TipTap image node to DOCX Paragraph with ImageRun
|
|
6618
6627
|
*
|
|
@@ -6627,36 +6636,40 @@ declare function convertImage(node: ImageNode, options: DocxExportOptions["image
|
|
|
6627
6636
|
*
|
|
6628
6637
|
* @param node - TipTap table node
|
|
6629
6638
|
* @param options - Table options from PropertiesOptions
|
|
6630
|
-
* @
|
|
6639
|
+
* @param exportOptions - Export options (for image processing)
|
|
6640
|
+
* @returns Promise<Array containing Table and a following Paragraph to prevent merging>
|
|
6631
6641
|
*/
|
|
6632
|
-
declare function convertTable(node: TableNode, options: DocxExportOptions["table"]): Array<Table | Paragraph
|
|
6642
|
+
declare function convertTable(node: TableNode, options: DocxExportOptions["table"], exportOptions?: DocxExportOptions): Promise<Array<Table | Paragraph>>;
|
|
6633
6643
|
|
|
6634
6644
|
/**
|
|
6635
6645
|
* Convert TipTap table row node to DOCX TableRow
|
|
6636
6646
|
*
|
|
6637
6647
|
* @param node - TipTap table row node
|
|
6638
6648
|
* @param options - Table options from PropertiesOptions
|
|
6639
|
-
* @
|
|
6649
|
+
* @param exportOptions - Export options (for image processing)
|
|
6650
|
+
* @returns Promise<DOCX TableRow object>
|
|
6640
6651
|
*/
|
|
6641
|
-
declare function convertTableRow(node: TableRowNode, options: DocxExportOptions["table"]): TableRow
|
|
6652
|
+
declare function convertTableRow(node: TableRowNode, options: DocxExportOptions["table"], exportOptions?: DocxExportOptions): Promise<TableRow>;
|
|
6642
6653
|
|
|
6643
6654
|
/**
|
|
6644
6655
|
* Convert TipTap table cell node to DOCX TableCell
|
|
6645
6656
|
*
|
|
6646
6657
|
* @param node - TipTap table cell node
|
|
6647
6658
|
* @param options - Table options from PropertiesOptions
|
|
6648
|
-
* @
|
|
6659
|
+
* @param exportOptions - Export options (for image processing)
|
|
6660
|
+
* @returns Promise<DOCX TableCell object>
|
|
6649
6661
|
*/
|
|
6650
|
-
declare function convertTableCell(node: TableCellNode, options: DocxExportOptions["table"]): TableCell
|
|
6662
|
+
declare function convertTableCell(node: TableCellNode, options: DocxExportOptions["table"], exportOptions?: DocxExportOptions): Promise<TableCell>;
|
|
6651
6663
|
|
|
6652
6664
|
/**
|
|
6653
6665
|
* Convert TipTap table header node to DOCX TableCell
|
|
6654
6666
|
*
|
|
6655
6667
|
* @param node - TipTap table header node
|
|
6656
6668
|
* @param options - Table options from PropertiesOptions
|
|
6657
|
-
* @
|
|
6669
|
+
* @param exportOptions - Export options (for image processing)
|
|
6670
|
+
* @returns Promise<DOCX TableCell object for header>
|
|
6658
6671
|
*/
|
|
6659
|
-
declare function convertTableHeader(node: TableHeaderNode, options: DocxExportOptions["table"]): TableCell
|
|
6672
|
+
declare function convertTableHeader(node: TableHeaderNode, options: DocxExportOptions["table"], exportOptions?: DocxExportOptions): Promise<TableCell>;
|
|
6660
6673
|
|
|
6661
6674
|
/**
|
|
6662
6675
|
* Convert TipTap codeBlock node to DOCX Paragraph
|
|
@@ -6678,7 +6691,7 @@ declare function convertOrderedList(node: OrderedListNode): ListOptions;
|
|
|
6678
6691
|
/**
|
|
6679
6692
|
* Convert list nodes (bullet or ordered) with proper numbering
|
|
6680
6693
|
*/
|
|
6681
|
-
declare function convertList(node: BulletListNode | OrderedListNode, listType: "bullet" | "ordered"): Paragraph[]
|
|
6694
|
+
declare function convertList(node: BulletListNode | OrderedListNode, listType: "bullet" | "ordered", exportOptions?: DocxExportOptions): Promise<Paragraph[]>;
|
|
6682
6695
|
|
|
6683
6696
|
/**
|
|
6684
6697
|
* Convert TipTap list item node to DOCX Paragraph
|
|
@@ -6689,9 +6702,10 @@ declare function convertList(node: BulletListNode | OrderedListNode, listType: "
|
|
|
6689
6702
|
*
|
|
6690
6703
|
* @param node - TipTap list item node
|
|
6691
6704
|
* @param options - Optional paragraph options (e.g., numbering)
|
|
6692
|
-
* @
|
|
6705
|
+
* @param exportOptions - Export options (for image processing)
|
|
6706
|
+
* @returns Promise<DOCX Paragraph object>
|
|
6693
6707
|
*/
|
|
6694
|
-
declare function convertListItem(node: ListItemNode, options?: IParagraphOptions): Paragraph
|
|
6708
|
+
declare function convertListItem(node: ListItemNode, options?: IParagraphOptions, exportOptions?: DocxExportOptions): Promise<Paragraph>;
|
|
6695
6709
|
|
|
6696
6710
|
/**
|
|
6697
6711
|
* Convert TipTap task list node to DOCX paragraphs
|
|
@@ -6794,5 +6808,5 @@ declare function getImageDataAndMeta(url: string): Promise<{
|
|
|
6794
6808
|
meta: ImageMeta;
|
|
6795
6809
|
}>;
|
|
6796
6810
|
|
|
6797
|
-
export { convertBlockquote, convertBulletList, convertCodeBlock, convertDetails, convertDocumentContent, convertHardBreak, convertHeading, convertHorizontalRule, convertImage, convertList, convertListItem, convertNode, convertOrderedList, convertParagraph, convertTable, convertTableCell, convertTableHeader, convertTableRow, convertTaskItem, convertTaskList, convertText, createFloatingOptions, generateDOCX, getImageDataAndMeta, getImageHeight, getImageTypeFromSrc, getImageWidth };
|
|
6811
|
+
export { convertBlockquote, convertBulletList, convertCodeBlock, convertDetails, convertDocumentContent, convertHardBreak, convertHeading, convertHorizontalRule, convertImage, convertImageToRun, convertList, convertListItem, convertNode, convertOrderedList, convertParagraph, convertTable, convertTableCell, convertTableHeader, convertTableRow, convertTaskItem, convertTaskList, convertText, createFloatingOptions, generateDOCX, getImageDataAndMeta, getImageHeight, getImageTypeFromSrc, getImageWidth };
|
|
6798
6812
|
export type { BlockNode, BlockquoteNode, BulletListNode, CodeBlockNode, DetailsContentNode, DetailsNode, DetailsSummaryNode, DocumentNode, DocxExportOptions, HardBreakNode, HeadingNode, HorizontalRuleNode, ImageNode, JSONContent, ListItemNode, ListOptions, Mark, OrderedListNode, ParagraphNode, TableCellNode, TableHeaderNode, TableNode, TableRowNode, TaskItemNode, TaskListNode, TextContent, TextNode };
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{ExternalHyperlink as ct,TextRun as v,Paragraph as i,HeadingLevel as k,ImageRun as N,TableCell as z,TableRow as lt,Table as pt,BorderStyle as ut,TableOfContents as dt,Document as ht,Packer as ft,convertInchesToTwip as F,AlignmentType as j,LevelFormat as L}from"docx";import{imageMeta as R}from"image-meta";import{ofetch as gt}from"ofetch";function G(t){return t?t.startsWith("#")?t:{red:"#FF0000",green:"#008000",blue:"#0000FF",yellow:"#FFFF00",orange:"#FFA500",purple:"#800080",pink:"#FFC0CB",brown:"#A52A2A",black:"#000000",white:"#FFFFFF",gray:"#808080",grey:"#808080",cyan:"#00FFFF",magenta:"#FF00FF",lime:"#00FF00",navy:"#000080",teal:"#008080",maroon:"#800000",olive:"#808000",silver:"#C0C0C0",gold:"#FFD700",indigo:"#4B0082",violet:"#EE82EE"}[t.toLowerCase()]||t:void 0}function A(t){const e=t.marks?.some(s=>s.type==="bold"),n=t.marks?.some(s=>s.type==="italic"),r=t.marks?.some(s=>s.type==="underline"),a=t.marks?.some(s=>s.type==="strike"),o=t.marks?.some(s=>s.type==="code"),c=t.marks?.some(s=>s.type==="subscript"),u=t.marks?.some(s=>s.type==="superscript"),y=t.marks?.find(s=>s.type==="link"),d=t.marks?.find(s=>s.type==="textStyle"),l=t.marks?.some(s=>s.type==="highlight"),f=G(d?.attrs?.color),h=G(d?.attrs?.backgroundColor);let g;if(d?.attrs?.fontSize){const s=d.attrs.fontSize;if(s.endsWith("px")){const T=parseFloat(s);isNaN(T)||(g=Math.round(T*1.5))}}let p;o?p="Consolas":d?.attrs?.fontFamily&&(p=d.attrs.fontFamily);const b={text:t.text||"",bold:e||void 0,italics:n||void 0,underline:r?{}:void 0,strike:a||void 0,font:p,size:g,subScript:c||void 0,superScript:u||void 0,color:f,shading:h?{fill:h}:void 0,highlight:l?"yellow":void 0};return y?.attrs?.href?new ct({children:[new v({...b,style:"Hyperlink"})],link:y.attrs.href}):new v(b)}function w(t){const e={text:"",break:1};if(t)for(const n of t)switch(n.type){case"bold":e.bold=!0;break;case"italic":e.italics=!0;break;case"underline":e.underline={};break;case"strike":e.strike=!0;break;case"textStyle":n.attrs?.color&&(e.color=n.attrs.color);break}return new v(e)}function x(t,e){const n={children:t.content?.flatMap(r=>r.type==="text"?A(r):r.type==="hardBreak"?w(r.marks):[])||[],...e};return new i(n)}function P(t){const e=t?.attrs?.level,n=t.content?.flatMap(a=>a.type==="text"?A(a):a.type==="hardBreak"?w(a.marks):[])||[],r={1:k.HEADING_1,2:k.HEADING_2,3:k.HEADING_3,4:k.HEADING_4,5:k.HEADING_5,6:k.HEADING_6};return new i({children:n,heading:r[e]})}function W(t){return t.content?t.content.map(e=>{if(e.type==="paragraph"){const n=e.content?.flatMap(r=>r.type==="text"?A(r):r.type==="hardBreak"?w(r.marks):[])||[];return new i({children:n,indent:{left:720},border:{left:{style:"single"}}})}return new i({})}):[]}function B(t){if(t.startsWith("data:")){const e=t.match(/data:image\/(\w+);/);if(e)switch(e[1].toLowerCase()){case"jpg":case"jpeg":return"jpeg";case"png":return"png";case"gif":return"gif";case"bmp":return"bmp";case"tiff":return"tiff";default:return"png"}}else switch(t.split(".").pop()?.toLowerCase()){case"jpg":case"jpeg":return"jpeg";case"png":return"png";case"gif":return"gif";case"bmp":return"bmp";case"tiff":return"tiff";default:return"png"}return"png"}function mt(){return{horizontalPosition:{relative:"page",align:"center"},verticalPosition:{relative:"page",align:"top"},lockAnchor:!0,behindDocument:!1,inFrontOfText:!1}}function _(t,e,n){return t.attrs?.width?t.attrs.width:e?.run?.transformation?.width?e.run.transformation.width:n?.width?Math.min(n.width,600):400}function U(t,e,n,r){return t.attrs?.height?t.attrs.height:n?.run?.transformation?.height?n.run.transformation.height:r?.width&&r?.height?Math.round(e*r.height/r.width):300}async function $(t){try{const e=await(await gt(t,{responseType:"blob"})).bytes();let n;try{n=R(e)}catch(r){console.warn("Failed to extract image metadata:",r),n={width:void 0,height:void 0,type:B(t)||"png",orientation:void 0}}return{data:e,meta:n}}catch(e){throw console.warn(`Failed to fetch image from ${t}:`,e),e}}async function q(t,e){const n=l=>{switch(l){case"jpeg":case"jpg":return"jpg";case"png":return"png";case"gif":return"gif";case"bmp":return"bmp"}switch(B(t.attrs?.src||"")){case"jpeg":return"jpg";case"png":return"png";case"gif":return"gif";case"bmp":return"bmp";default:return"png"}};let r,a;try{const l=t.attrs?.src||"";if(l.startsWith("http")){const f=await $(l);r=f.data,a=f.meta}else if(l.startsWith("data:")){const f=l.split(",")[1],h=atob(f),g=new Uint8Array(h.length);for(let p=0;p<h.length;p++)g[p]=h.charCodeAt(p);r=g;try{a=R(r)}catch{a={type:"png",width:void 0,height:void 0,orientation:void 0}}}else throw new Error(`Unsupported image source format: ${l.substring(0,20)}...`)}catch(l){return console.warn("Failed to process image:",l),new i({children:[new N({type:"png",data:new Uint8Array(0),transformation:{width:100,height:100},altText:{name:t.attrs?.alt||"Failed to load image"}})]})}const o=_(t,e,a),c=U(t,o,e,a),u={type:n(a.type),data:r,transformation:{width:o,height:c},altText:{name:t.attrs?.alt||"",description:void 0,title:t.attrs?.title||void 0},...e?.run&&e.run.floating&&{floating:e.run.floating},...e?.run&&e.run.outline&&{outline:e.run.outline}},y=new N(u),d=e?.paragraph||{};return new i({children:[y],...d})}function Q(t,e){const n={children:t.content?.map(r=>x(r,e?.cell?.paragraph??e?.row?.paragraph??e?.paragraph))||[],...e?.cell?.run};return t.attrs?.colspan&&t.attrs.colspan>1&&(n.columnSpan=t.attrs.colspan),t.attrs?.rowspan&&t.attrs.rowspan>1&&(n.rowSpan=t.attrs.rowspan),t.attrs?.colwidth!==null&&t.attrs?.colwidth!==void 0&&t.attrs.colwidth.length>0&&(n.width={size:t.attrs.colwidth[0],type:"dxa"}),new z(n)}function X(t,e){const n={children:t.content?.map(r=>x(r,e?.header?.paragraph??e?.cell?.paragraph??e?.row?.paragraph??e?.paragraph))||[],...e?.header?.run};return t.attrs?.colspan&&t.attrs.colspan>1&&(n.columnSpan=t.attrs.colspan),t.attrs?.rowspan&&t.attrs.rowspan>1&&(n.rowSpan=t.attrs.rowspan),t.attrs?.colwidth!==null&&t.attrs?.colwidth!==void 0&&t.attrs.colwidth.length>0&&(n.width={size:t.attrs.colwidth[0],type:"dxa"}),new z(n)}function J(t,e){const n=e?.row,r=t.content?.flatMap(a=>a.type==="tableCell"?Q(a,e):a.type==="tableHeader"?X(a,e):[])||[];return new lt({children:r,...n})}function K(t,e){const n={rows:t.content?.map(r=>J(r,e))||[],...e?.run};return[new pt(n),new i({})]}function V(t){const e=t.content?.map(n=>n.text||"").join("")||"";return new i({children:[new v({text:e,font:"Consolas"})]})}function H(t,e){if(!t.content||t.content.length===0)return new i({});const n=t.content[0];return n.type==="paragraph"?x(n,e):new i({})}function Y(){return{numbering:{reference:"bullet-list",level:0}}}function Z(t){const e=t.attrs?.start||1;return{numbering:{reference:"ordered-list",level:0},start:e}}function D(t,e){if(!t.content)return[];const n=[],r=e==="bullet"?Y():Z(t);let a=r.numbering.reference;e==="ordered"&&r.start&&r.start!==1&&(a=`ordered-list-start-${r.start}`);for(const o of t.content)if(o.type==="listItem"){const c=H(o,{numbering:{reference:a,level:0}});n.push(c)}return n}function E(t){if(!t.content||t.content.length===0)return new i({});const e=t.content[0];if(e.type==="paragraph"){const n=t.attrs?.checked?"\u2611 ":"\u2610 ",r=e.content?.flatMap(o=>o.type==="text"?A(o):o.type==="hardBreak"?w(o.marks):[])||[],a=new v({text:n});return new i({children:[a,...r]})}return new i({})}function tt(t){return!t.content||t.content.length===0?[]:t.content.filter(e=>e.type==="taskItem").map(e=>E(e))}function et(t,e){return new i({children:[],border:{bottom:{style:ut.SINGLE,size:1,color:"auto"}},...e?.paragraph})}async function nt(t,e){if(!t.content)return[];const n=[];let r,a;for(const o of t.content)o.type==="detailsSummary"?r=o:o.type==="detailsContent"&&(a=o);if(r?.content){const o=r.content.flatMap(u=>u.type==="text"?A(u):u.type==="hardBreak"?w(u.marks):[]),c=new i({children:o,...e.details?.summary?.paragraph});n.push(c)}if(a?.content)for(const o of a.content){const c=await M(o,e);Array.isArray(c)?n.push(...c):c&&n.push(c)}return n}async function wt(t,e){const{title:n,subject:r,creator:a,keywords:o,description:c,lastModifiedBy:u,revision:y,styles:d,tableOfContents:l,sections:f,fonts:h,hyphenation:g,compatibility:p,customProperties:b,evenAndOddHeaderAndFooters:s,defaultTabStop:T,outputType:at}=e,S=await rt(t,e),C=l?new dt(l.title,{...l.run}):null,ot=yt(t),m={sections:f?f.map((it,O)=>{const I=[];return O===0&&C&&I.push(C),O===0&&I.push(...S),{...it,...I.length>0?{children:I}:{}}}):[{children:C?[C,...S]:S}],title:n||"Document",subject:r||"",creator:a||"",keywords:o||"",description:c||"",lastModifiedBy:u||"",revision:y||1,styles:d,numbering:ot};h&&h.length>0&&Object.assign(m,{fonts:h}),g&&Object.assign(m,{hyphenation:g}),p&&Object.assign(m,{compatibility:p}),b&&b.length>0&&Object.assign(m,{customProperties:b}),s!==void 0&&Object.assign(m,{evenAndOddHeaderAndFooters:s}),T!==void 0&&Object.assign(m,{defaultTabStop:T});const st=new ht(m);return ft.pack(st,at||"arraybuffer")}async function rt(t,e){const n=[];if(!t||!Array.isArray(t.content))return n;for(const r of t.content){const a=await M(r,e);Array.isArray(a)?n.push(...a):a&&n.push(a)}return n}async function M(t,e){if(!t||!t.type)return null;switch(t.type){case"paragraph":return x(t);case"heading":return P(t);case"blockquote":return W(t);case"codeBlock":return V(t);case"image":return await q(t,e.image);case"table":return K(t,e.table);case"bulletList":return D(t,"bullet");case"orderedList":return D(t,"ordered");case"taskList":return tt(t);case"listItem":return H(t);case"taskItem":return E(t);case"hardBreak":return new i({children:[w()]});case"horizontalRule":return et(t,e.horizontalRule);case"details":return await nt(t,e);default:return new i({children:[new v({text:`[Unsupported: ${t.type}]`})]})}}function yt(t){const e=new Set;function n(o){if(o.type==="orderedList"&&o.attrs?.start&&e.add(o.attrs.start),o.content)for(const c of o.content)n(c)}n(t);const r=[{level:0,format:L.BULLET,text:"\u2022",alignment:j.START,style:{paragraph:{indent:{left:F(.5),hanging:F(.25)}}}},{level:0,format:L.DECIMAL,text:"%1.",alignment:j.START,style:{paragraph:{indent:{left:F(.5),hanging:F(.25)}}}}],a=[{reference:"bullet-list",levels:[r[0]]},{reference:"ordered-list",levels:[r[1]]}];for(const o of e)o!==1&&a.push({reference:`ordered-list-start-${o}`,levels:[{level:0,format:L.DECIMAL,text:"%1.",alignment:j.START,start:o,style:{paragraph:{indent:{left:F(.5),hanging:F(.25)}}}}]});return{config:a}}export{W as convertBlockquote,Y as convertBulletList,V as convertCodeBlock,nt as convertDetails,rt as convertDocumentContent,w as convertHardBreak,P as convertHeading,et as convertHorizontalRule,q as convertImage,D as convertList,H as convertListItem,M as convertNode,Z as convertOrderedList,x as convertParagraph,K as convertTable,Q as convertTableCell,X as convertTableHeader,J as convertTableRow,E as convertTaskItem,tt as convertTaskList,A as convertText,mt as createFloatingOptions,wt as generateDOCX,$ as getImageDataAndMeta,U as getImageHeight,B as getImageTypeFromSrc,_ as getImageWidth};
|
|
1
|
+
import{ExternalHyperlink as lt,TextRun as v,ImageRun as R,Paragraph as c,HeadingLevel as b,TableCell as N,TableRow as ut,Table as pt,BorderStyle as dt,TableOfContents as ht,Document as ft,Packer as gt,convertInchesToTwip as k,AlignmentType as j,LevelFormat as L}from"docx";import{imageMeta as z}from"image-meta";import{ofetch as mt}from"ofetch";function G(t){return t?t.startsWith("#")?t:{red:"#FF0000",green:"#008000",blue:"#0000FF",yellow:"#FFFF00",orange:"#FFA500",purple:"#800080",pink:"#FFC0CB",brown:"#A52A2A",black:"#000000",white:"#FFFFFF",gray:"#808080",grey:"#808080",cyan:"#00FFFF",magenta:"#FF00FF",lime:"#00FF00",navy:"#000080",teal:"#008080",maroon:"#800000",olive:"#808000",silver:"#C0C0C0",gold:"#FFD700",indigo:"#4B0082",violet:"#EE82EE"}[t.toLowerCase()]||t:void 0}function F(t){const e=t.marks?.some(i=>i.type==="bold"),n=t.marks?.some(i=>i.type==="italic"),r=t.marks?.some(i=>i.type==="underline"),a=t.marks?.some(i=>i.type==="strike"),o=t.marks?.some(i=>i.type==="code"),s=t.marks?.some(i=>i.type==="subscript"),p=t.marks?.some(i=>i.type==="superscript"),l=t.marks?.find(i=>i.type==="link"),u=t.marks?.find(i=>i.type==="textStyle"),h=t.marks?.some(i=>i.type==="highlight"),f=G(u?.attrs?.color),d=G(u?.attrs?.backgroundColor);let T;if(u?.attrs?.fontSize){const i=u.attrs.fontSize;if(i.endsWith("px")){const A=parseFloat(i);isNaN(A)||(T=Math.round(A*1.5))}}let w;o?w="Consolas":u?.attrs?.fontFamily&&(w=u.attrs.fontFamily);const y={text:t.text||"",bold:e||void 0,italics:n||void 0,underline:r?{}:void 0,strike:a||void 0,font:w,size:T,subScript:s||void 0,superScript:p||void 0,color:f,shading:d?{fill:d}:void 0,highlight:h?"yellow":void 0};return l?.attrs?.href?new lt({children:[new v({...y,style:"Hyperlink"})],link:l.attrs.href}):new v(y)}function m(t){const e={text:"",break:1};if(t)for(const n of t)switch(n.type){case"bold":e.bold=!0;break;case"italic":e.italics=!0;break;case"underline":e.underline={};break;case"strike":e.strike=!0;break;case"textStyle":n.attrs?.color&&(e.color=n.attrs.color);break}return new v(e)}function B(t){if(t.startsWith("data:")){const e=t.match(/data:image\/(\w+);/);if(e)switch(e[1].toLowerCase()){case"jpg":case"jpeg":return"jpeg";case"png":return"png";case"gif":return"gif";case"bmp":return"bmp";case"tiff":return"tiff";default:return"png"}}else switch(t.split(".").pop()?.toLowerCase()){case"jpg":case"jpeg":return"jpeg";case"png":return"png";case"gif":return"gif";case"bmp":return"bmp";case"tiff":return"tiff";default:return"png"}return"png"}function wt(){return{horizontalPosition:{relative:"page",align:"center"},verticalPosition:{relative:"page",align:"top"},lockAnchor:!0,behindDocument:!1,inFrontOfText:!1}}function U(t,e,n){return t.attrs?.width!==void 0&&t.attrs?.width!==null?t.attrs.width:e?.run?.transformation?.width?e.run.transformation.width:n?.width?n.width:400}function W(t,e,n,r){return t.attrs?.height!==void 0&&t.attrs?.height!==null?t.attrs.height:n?.run?.transformation?.height?n.run.transformation.height:r?.width&&r?.height?Math.round(e*r.height/r.width):300}async function _(t){try{const e=await(await mt(t,{responseType:"blob"})).bytes();let n;try{n=z(e)}catch(r){console.warn("Failed to extract image metadata:",r),n={width:void 0,height:void 0,type:B(t)||"png",orientation:void 0}}return{data:e,meta:n}}catch(e){throw console.warn(`Failed to fetch image from ${t}:`,e),e}}async function E(t,e){const n=l=>{switch(l){case"jpeg":case"jpg":return"jpg";case"png":return"png";case"gif":return"gif";case"bmp":return"bmp"}switch(B(t.attrs?.src||"")){case"jpeg":return"jpg";case"png":return"png";case"gif":return"gif";case"bmp":return"bmp";default:return"png"}};let r,a;try{const l=t.attrs?.src||"";if(l.startsWith("http")){const u=await _(l);r=u.data,a=u.meta}else if(l.startsWith("data:")){const u=l.split(",")[1];if(!u)throw new Error("Invalid data URL: missing base64 data");const h=atob(u),f=new Uint8Array(h.length);for(let d=0;d<h.length;d++)f[d]=h.charCodeAt(d);r=f;try{a=z(r)}catch{a={type:"png",width:void 0,height:void 0,orientation:void 0}}}else throw new Error(`Unsupported image source format: ${l.substring(0,20)}...`)}catch(l){return console.warn("Failed to process image:",l),new R({type:"png",data:new Uint8Array(0),transformation:{width:100,height:100},altText:{name:t.attrs?.alt||"Failed to load image"}})}const o=U(t,e,a),s=W(t,o,e,a),p={type:n(a.type),data:r,transformation:{width:o,height:s},altText:{name:t.attrs?.alt||"",description:void 0,title:t.attrs?.title||void 0},...e?.run&&e.run.floating&&{floating:e.run.floating},...e?.run&&e.run.outline&&{outline:e.run.outline}};return new R(p)}async function $(t,e){const n=await E(t,e),r=e?.paragraph||{};return new c({children:[n],...r})}async function x(t,e,n){const r={children:(await Promise.all((t.content||[]).map(async a=>a.type==="text"?F(a):a.type==="hardBreak"?m(a.marks):a.type==="image"?await E(a,n?.image):[]))).flat(),...e};return new c(r)}function q(t){const e=t?.attrs?.level,n=t.content?.flatMap(a=>a.type==="text"?F(a):a.type==="hardBreak"?m(a.marks):[])||[],r={1:b.HEADING_1,2:b.HEADING_2,3:b.HEADING_3,4:b.HEADING_4,5:b.HEADING_5,6:b.HEADING_6};return new c({children:n,heading:r[e]})}function Q(t){return t.content?t.content.map(e=>{if(e.type==="paragraph"){const n=e.content?.flatMap(r=>r.type==="text"?F(r):r.type==="hardBreak"?m(r.marks):[])||[];return new c({children:n,indent:{left:720},border:{left:{style:"single"}}})}return new c({})}):[]}async function X(t,e,n){const r={children:await Promise.all((t.content||[]).map(a=>x(a,e?.cell?.paragraph??e?.row?.paragraph??e?.paragraph,n))),...e?.cell?.run};return t.attrs?.colspan&&t.attrs.colspan>1&&(r.columnSpan=t.attrs.colspan),t.attrs?.rowspan&&t.attrs.rowspan>1&&(r.rowSpan=t.attrs.rowspan),t.attrs?.colwidth!==null&&t.attrs?.colwidth!==void 0&&t.attrs.colwidth.length>0&&(r.width={size:t.attrs.colwidth[0],type:"dxa"}),new N(r)}async function J(t,e,n){const r={children:await Promise.all((t.content||[]).map(a=>x(a,e?.header?.paragraph??e?.cell?.paragraph??e?.row?.paragraph??e?.paragraph,n))),...e?.header?.run};return t.attrs?.colspan&&t.attrs.colspan>1&&(r.columnSpan=t.attrs.colspan),t.attrs?.rowspan&&t.attrs.rowspan>1&&(r.rowSpan=t.attrs.rowspan),t.attrs?.colwidth!==null&&t.attrs?.colwidth!==void 0&&t.attrs.colwidth.length>0&&(r.width={size:t.attrs.colwidth[0],type:"dxa"}),new N(r)}async function K(t,e,n){const r=e?.row,a=(await Promise.all((t.content||[]).map(async o=>o.type==="tableCell"?await X(o,e,n):o.type==="tableHeader"?await J(o,e,n):null))).filter(o=>o!==null);return new ut({children:a,...r})}async function V(t,e,n){const r={rows:await Promise.all((t.content||[]).map(a=>K(a,e,n))),...e?.run};return[new pt(r),new c({})]}function Y(t){const e=t.content?.map(n=>n.text||"").join("")||"";return new c({children:[new v({text:e,font:"Consolas"})]})}async function H(t,e,n){if(!t.content||t.content.length===0)return new c({});const r=t.content[0];return r.type==="paragraph"?await x(r,e,n):new c({})}function Z(){return{numbering:{reference:"bullet-list",level:0}}}function tt(t){const e=t.attrs?.start||1;return{numbering:{reference:"ordered-list",level:0},start:e}}async function D(t,e,n){if(!t.content)return[];const r=[],a=e==="bullet"?Z():tt(t);let o=a.numbering.reference;e==="ordered"&&a.start&&a.start!==1&&(o=`ordered-list-start-${a.start}`);for(const s of t.content)if(s.type==="listItem"){const p=await H(s,{numbering:{reference:o,level:0}},n);r.push(p)}return r}function O(t){if(!t.content||t.content.length===0)return new c({});const e=t.content[0];if(e.type==="paragraph"){const n=t.attrs?.checked?"\u2611 ":"\u2610 ",r=e.content?.flatMap(o=>o.type==="text"?F(o):o.type==="hardBreak"?m(o.marks):[])||[],a=new v({text:n});return new c({children:[a,...r]})}return new c({})}function et(t){return!t.content||t.content.length===0?[]:t.content.filter(e=>e.type==="taskItem").map(e=>O(e))}function nt(t,e){return new c({children:[],border:{bottom:{style:dt.SINGLE,size:1,color:"auto"}},...e?.paragraph})}async function rt(t,e){if(!t.content)return[];const n=[];let r,a;for(const o of t.content)o.type==="detailsSummary"?r=o:o.type==="detailsContent"&&(a=o);if(r?.content){const o=r.content.flatMap(p=>p.type==="text"?F(p):p.type==="hardBreak"?m(p.marks):[]),s=new c({children:o,...e.details?.summary?.paragraph});n.push(s)}if(a?.content)for(const o of a.content){const s=await M(o,e);Array.isArray(s)?n.push(...s):s&&n.push(s)}return n}async function yt(t,e){const{title:n,subject:r,creator:a,keywords:o,description:s,lastModifiedBy:p,revision:l,styles:u,tableOfContents:h,sections:f,fonts:d,hyphenation:T,compatibility:w,customProperties:y,evenAndOddHeaderAndFooters:i,defaultTabStop:A,outputType:ot}=e,S=await at(t,e),I=h?new ht(h.title,{...h.run}):null,it=vt(t),g={sections:f?f.map((ct,P)=>{const C=[];return P===0&&I&&C.push(I),P===0&&C.push(...S),{...ct,...C.length>0?{children:C}:{}}}):[{children:I?[I,...S]:S}],title:n||"Document",subject:r||"",creator:a||"",keywords:o||"",description:s||"",lastModifiedBy:p||"",revision:l||1,styles:u,numbering:it};d&&d.length>0&&Object.assign(g,{fonts:d}),T&&Object.assign(g,{hyphenation:T}),w&&Object.assign(g,{compatibility:w}),y&&y.length>0&&Object.assign(g,{customProperties:y}),i!==void 0&&Object.assign(g,{evenAndOddHeaderAndFooters:i}),A!==void 0&&Object.assign(g,{defaultTabStop:A});const st=new ft(g);return gt.pack(st,ot||"arraybuffer")}async function at(t,e){const n=[];if(!t||!Array.isArray(t.content))return n;for(const r of t.content){const a=await M(r,e);Array.isArray(a)?n.push(...a):a&&n.push(a)}return n}async function M(t,e){if(!t||!t.type)return null;switch(t.type){case"paragraph":return await x(t,void 0,e);case"heading":return q(t);case"blockquote":return Q(t);case"codeBlock":return Y(t);case"image":return await $(t,e.image);case"table":return await V(t,e.table,e);case"bulletList":return await D(t,"bullet",e);case"orderedList":return await D(t,"ordered",e);case"taskList":return et(t);case"listItem":return H(t);case"taskItem":return O(t);case"hardBreak":return new c({children:[m()]});case"horizontalRule":return nt(t,e.horizontalRule);case"details":return await rt(t,e);default:return new c({children:[new v({text:`[Unsupported: ${t.type}]`})]})}}function vt(t){const e=new Set;function n(o){if(o.type==="orderedList"&&o.attrs?.start&&e.add(o.attrs.start),o.content)for(const s of o.content)n(s)}n(t);const r=[{level:0,format:L.BULLET,text:"\u2022",alignment:j.START,style:{paragraph:{indent:{left:k(.5),hanging:k(.25)}}}},{level:0,format:L.DECIMAL,text:"%1.",alignment:j.START,style:{paragraph:{indent:{left:k(.5),hanging:k(.25)}}}}],a=[{reference:"bullet-list",levels:[r[0]]},{reference:"ordered-list",levels:[r[1]]}];for(const o of e)o!==1&&a.push({reference:`ordered-list-start-${o}`,levels:[{level:0,format:L.DECIMAL,text:"%1.",alignment:j.START,start:o,style:{paragraph:{indent:{left:k(.5),hanging:k(.25)}}}}]});return{config:a}}export{Q as convertBlockquote,Z as convertBulletList,Y as convertCodeBlock,rt as convertDetails,at as convertDocumentContent,m as convertHardBreak,q as convertHeading,nt as convertHorizontalRule,$ as convertImage,E as convertImageToRun,D as convertList,H as convertListItem,M as convertNode,tt as convertOrderedList,x as convertParagraph,V as convertTable,X as convertTableCell,J as convertTableHeader,K as convertTableRow,O as convertTaskItem,et as convertTaskList,F as convertText,wt as createFloatingOptions,yt as generateDOCX,_ as getImageDataAndMeta,W as getImageHeight,B as getImageTypeFromSrc,U as getImageWidth};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@docen/export-docx",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.1",
|
|
4
4
|
"description": "A powerful TipTap/ProseMirror extension that converts editor content to Microsoft Word DOCX format",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"converter",
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
},
|
|
56
56
|
"devDependencies": {
|
|
57
57
|
"@tiptap/core": "3.7.2",
|
|
58
|
-
"@docen/tiptap-extensions": "0.0.
|
|
58
|
+
"@docen/tiptap-extensions": "0.0.1"
|
|
59
59
|
},
|
|
60
60
|
"scripts": {
|
|
61
61
|
"dev": "unbuild --stub",
|