@docen/export-docx 0.0.1 → 0.0.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.
- package/dist/index.cjs +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +2 -2
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"),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;
|
|
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=t.content&&t.content.length>0&&t.content.every(o=>o.type==="image");let a={children:(await Promise.all((t.content||[]).map(async o=>o.type==="text"?convertText(o):o.type==="hardBreak"?convertHardBreak(o.marks):o.type==="image"?await convertImageToRun(o,n?.image):[]))).flat()};return!r&&n?.styles?.default?.document?.paragraph&&(a={...a,...n.styles.default.document.paragraph}),r&&n?.image?.paragraph&&(a={...a,...n.image.paragraph}),e&&(a={...a,...e}),new docx.Paragraph(a)}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.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
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};
|
|
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 gt,Packer as ft,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"),g=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:g,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),g=new Uint8Array(h.length);for(let d=0;d<h.length;d++)g[d]=h.charCodeAt(d);r=g;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=t.content&&t.content.length>0&&t.content.every(o=>o.type==="image");let a={children:(await Promise.all((t.content||[]).map(async o=>o.type==="text"?F(o):o.type==="hardBreak"?m(o.marks):o.type==="image"?await E(o,n?.image):[]))).flat()};return!r&&n?.styles?.default?.document?.paragraph&&(a={...a,...n.styles.default.document.paragraph}),r&&n?.image?.paragraph&&(a={...a,...n.image.paragraph}),e&&(a={...a,...e}),new c(a)}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:g,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),f={sections:g?g.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(f,{fonts:d}),T&&Object.assign(f,{hyphenation:T}),w&&Object.assign(f,{compatibility:w}),y&&y.length>0&&Object.assign(f,{customProperties:y}),i!==void 0&&Object.assign(f,{evenAndOddHeaderAndFooters:i}),A!==void 0&&Object.assign(f,{defaultTabStop:A});const st=new gt(f);return ft.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.2",
|
|
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.2"
|
|
59
59
|
},
|
|
60
60
|
"scripts": {
|
|
61
61
|
"dev": "unbuild --stub",
|