UNPKG

@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) 4.82 kB
"use strict";var x=Object.defineProperty;var T=Object.getOwnPropertyDescriptor;var R=Object.getOwnPropertyNames;var $=Object.prototype.hasOwnProperty;var C=(a,e)=>{for(var i in e)x(a,i,{get:e[i],enumerable:!0})},B=(a,e,i,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of R(e))!$.call(a,t)&&t!==i&&x(a,t,{get:()=>e[t],enumerable:!(n=T(e,t))||n.enumerable});return a};var W=a=>B(x({},"__esModule",{value:!0}),a);var k={};C(k,{getImageMimeType:()=>O,imagePlugin:()=>L});module.exports=W(k);var H=a=>new Promise((e,i)=>{let n=new Blob([a],{type:"image/svg+xml"}),t=new FileReader;t.onloadend=()=>e(t.result),t.onerror=i,t.readAsDataURL(n)}),U=(a,e)=>new Promise((i,n)=>{let t=document.createElement("div");t.innerHTML=a,t.style="width:100%;height:100%;position:absolute;",e.appendChild(t);let s=t.querySelector("svg");if(!s||s.nodeType!==1)return n(new Error("No or invalid <svg> found"));requestAnimationFrame(()=>{try{let r=s.getBBox(),o=parseFloat(getComputedStyle(s).width)||0,c=parseFloat(getComputedStyle(s).height)||0,g=4,l=r.x-g,m=r.y-g,p=r.width+g*2,d=r.height+g*2,u=o>0?Math.min(p,o):p,w=c>0?Math.min(d,c):d,h=s.cloneNode(!0);h.setAttribute("viewBox",`${l} ${m} ${p} ${d}`),h.setAttribute("width",`${u}`),h.setAttribute("height",`${w}`),h.removeAttribute("style");let v=new XMLSerializer().serializeToString(h);t.remove(),i({svg:v,scale:Math.min(p/o,d/c,1)})}catch(r){t.remove(),n(r)}})}),y,M=a=>(y||(y=document.createElement("div"),y.style=`height:${a.maxH}in;width:${a.maxW}in;position:absolute;left:-2500vw;`,document.body.appendChild(y),a.dpi=parseFloat(getComputedStyle(y).width)/a.maxW),y),b=async(a,e)=>{var n;let i=a.value;try{let t=new Image,s=M(e);s.appendChild(t);let r=/(?:^|\n)\s*gantt\s*/.test((n=a.data)==null?void 0:n.mermaid),o=r?{svg:i,scale:1}:await U(i,s),c=await H(o.svg);t.src=c,await new Promise(w=>t.onload=w),r&&(e.scale*=2);let g=t.width*e.scale,l=t.height*e.scale,m=document.createElement("canvas"),p=m.getContext("2d");if(!p)throw new Error("Canvas context not available");m.width=g,m.height=l,p.drawImage(t,0,0,g,l);let d=m.toDataURL(`image/${e.fallbackImageType}`);t.remove();let u=Math.min(e.maxW*e.dpi/g,e.maxH*e.dpi/l,1)*o.scale;return{type:e.fallbackImageType,data:d,transformation:{width:g*u,height:l*u}}}catch(t){return console.error("Error resolving SVG image: ",t),{type:"png",data:Buffer.from([]),transformation:{width:100,height:100}}}};var D=["jpeg","jpg","bmp","gif","png"],O=a=>{let e=new Uint8Array(a).slice(0,4);if(e[0]===66&&e[1]===77)return"bmp";switch(e.reduce((n,t)=>n+t.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"}},E=async(a,e)=>{var l;let i=e.scale,n=a.split(";")[0].split("/")[1],t=new Image;t.src=a,await new Promise(m=>t.onload=m);let s=t.width*i,r=t.height*i;if(D.includes(n))return{data:a,type:n,transformation:{width:s/i,height:r/i}};let o=document.createElement("canvas"),c=o.getContext("2d");if(!c)throw new Error("Canvas context not available");o.width=s,o.height=r,c.drawImage(t,0,0,s,r);let g=(l=e==null?void 0:e.fallbackImageType)!=null?l:"png";return{data:o.toDataURL(`image/${g}`),type:g,transformation:{width:s/i,height:r/i}}},A=async(a,e)=>{var r;let i=await fetch(a.startsWith("http")?a:`${window.location.origin}/${a.replace(/^\/+/,"")}`);if(/(svg|xml)/.test((r=i.headers.get("content-type"))!=null?r:"")||a.endsWith(".svg")){let o=await i.text();return b({type:"svg",value:o,id:`s${crypto.randomUUID()}`},e)}let n=await i.arrayBuffer(),t=O(n)||"png",s=await createImageBitmap(new Blob([n],{type:t}));return D.includes(t)?{type:t,data:n,transformation:{width:s.width,height:s.height}}:(console.warn(`${t} not supported by docx. Using fallback.`),E(a,e))},F=null,S=async(a,e,i=!1)=>{try{return a.startsWith("data:")?await E(a,e):await A(a,e)}catch(n){return console.error(`Error resolving image: ${a}`,n),i||!e.placeholder?{type:"gif",data:"",transformation:{width:200,height:200}}:F||(F=await S(e.placeholder,e,!0))}},G={scale:3,fallbackImageType:"png",imageResolver:S,maxW:6.3,maxH:9.7,dpi:96},L=a=>{let e={...G,...a};return{inline:async(i,n,t,s)=>{var r,o,c,g,l,m;if(/^(image|svg)/.test(n.type)){let p=(g=(c=n.alt)!=null?c:(o=(r=n.url)==null?void 0:r.split("/"))==null?void 0:o.pop())!=null?g:"",d=(m=n.url)!=null?m:s[(l=n.identifier)==null?void 0:l.toUpperCase()],u=n.type==="svg"?await b(n,e):await e.imageResolver(d,e),{data:w}=n,{width:h,height:v}=u.transformation,{width:f,height:I}=w!=null?w:{};f&&!I?I=v*f/h:!f&&I?f=h*I/v:!f&&!I&&(I=v,f=h);let P=Math.min(e.maxW*e.dpi/f,e.maxH*e.dpi/I,1);return u.transformation={width:f*P,height:I*P},n.type="",[new i.ImageRun({...u,altText:{description:p,name:p,title:p},...t,...n.data})]}return[]}}};0&&(module.exports={getImageMimeType,imagePlugin});