@mdast2docx/image
Version:
MDAST to DOCX plugin for resolving and embedding images. Supports base64, URLs, and custom resolvers for seamless DOCX image integration.
2 lines (1 loc) • 2.46 kB
JavaScript
import{a as w}from"./chunk-ZB3LIW3R.mjs";var P=["jpeg","jpg","bmp","gif","png"],D=a=>{let e=new Uint8Array(a).slice(0,4);if(e[0]===66&&e[1]===77)return"bmp";switch(e.reduce((t,i)=>t+i.toString(16).padStart(2,"0"),"")){case"89504E47":return"png";case"47494638":return"gif";case"FFD8FFE0":case"FFD8FFE1":case"FFD8FFE2":case"FFD8FFE3":case"FFD8FFE8":return"jpg"}},v=async(a,e)=>{var p;let n=e.scale,t=a.split(";")[0].split("/")[1],i=new Image;i.src=a,await new Promise(u=>i.onload=u);let s=i.width*n,r=i.height*n;if(P.includes(t))return{data:a,type:t,transformation:{width:s/n,height:r/n}};let g=document.createElement("canvas"),m=g.getContext("2d");if(!m)throw new Error("Canvas context not available");g.width=s,g.height=r,m.drawImage(i,0,0,s,r);let c=(p=e==null?void 0:e.fallbackImageType)!=null?p:"png";return{data:g.toDataURL(`image/${c}`),type:c,transformation:{width:s/n,height:r/n}}},E=async(a,e)=>{var r;let n=await fetch(a.startsWith("http")?a:`${window.location.origin}/${a.replace(/^\/+/,"")}`);if(/(svg|xml)/.test((r=n.headers.get("content-type"))!=null?r:"")||a.endsWith(".svg")){let g=await n.text();return w({type:"svg",value:g,id:`s${crypto.randomUUID()}`},e)}let t=await n.arrayBuffer(),i=D(t)||"png",s=await createImageBitmap(new Blob([t],{type:i}));return P.includes(i)?{type:i,data:t,transformation:{width:s.width,height:s.height}}:(console.warn(`${i} not supported by docx. Using fallback.`),v(a,e))},O=null,x=async(a,e,n=!1)=>{try{return a.startsWith("data:")?await v(a,e):await E(a,e)}catch(t){return console.error(`Error resolving image: ${a}`,t),n||!e.placeholder?{type:"gif",data:"",transformation:{width:200,height:200}}:O||(O=await x(e.placeholder,e,!0))}},R={scale:3,fallbackImageType:"png",imageResolver:x,maxW:6.3,maxH:9.7,dpi:96},U=a=>{let e={...R,...a};return{inline:async(n,t,i,s)=>{var r,g,m,c,p,u;if(/^(image|svg)/.test(t.type)){let I=(c=(m=t.alt)!=null?m:(g=(r=t.url)==null?void 0:r.split("/"))==null?void 0:g.pop())!=null?c:"",b=(u=t.url)!=null?u:s[(p=t.identifier)==null?void 0:p.toUpperCase()],f=t.type==="svg"?await w(t,e):await e.imageResolver(b,e),{data:h}=t,{width:d,height:y}=f.transformation,{width:o,height:l}=h!=null?h:{};o&&!l?l=y*o/d:!o&&l?o=d*l/y:!o&&!l&&(l=y,o=d);let F=Math.min(e.maxW*e.dpi/o,e.maxH*e.dpi/l,1);return f.transformation={width:o*F,height:l*F},t.type="",[new n.ImageRun({...f,altText:{description:I,name:I,title:I},...i,...t.data})]}return[]}}};export{D as getImageMimeType,U as imagePlugin};