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) 5.89 kB
"use strict";var P=Object.defineProperty;var W=Object.getOwnPropertyDescriptor;var $=Object.getOwnPropertyNames;var B=Object.prototype.hasOwnProperty;var U=(t,e)=>{for(var i in e)P(t,i,{get:e[i],enumerable:!0})},V=(t,e,i,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of $(e))!B.call(t,a)&&a!==i&&P(t,a,{get:()=>e[a],enumerable:!(r=W(e,a))||r.enumerable});return t};var k=t=>V(P({},"__esModule",{value:!0}),t);var z={};U(z,{imagePlugin:()=>q});module.exports=k(z);var x=require("@m2d/core/cache");var R=t=>{let e=new Uint8Array(t).slice(0,4);if(e[0]===66&&e[1]===77)return"bmp";switch(e.reduce((r,a)=>r+a.toString(16).padStart(2,"0"),"").toUpperCase()){case"89504E47":return"png";case"47494638":return"gif";case"FFD8FFE0":case"FFD8FFE1":case"FFD8FFE2":case"FFD8FFE3":case"FFD8FFE8":return"jpg"}},w=null,F=!1,v=async t=>(!w&&t.placeholder&&!F?(F=!0,w=await t.imageResolver(t.placeholder,t)):w={type:"gif",data:"",transformation:{width:200,height:200}},w);var L=t=>new Promise((e,i)=>{let r=new Blob([t],{type:"image/svg+xml"}),a=new FileReader;a.onloadend=()=>e(a.result),a.onerror=i,a.readAsDataURL(r)}),N=(t,e)=>new Promise((i,r)=>{let a=document.createElement("div");a.innerHTML=t,a.style="width:100%;height:100%;position:absolute;",e.appendChild(a);let n=a.querySelector("svg");if(!n||n.nodeType!==1)return r(new Error("No or invalid <svg> found"));requestAnimationFrame(()=>{try{let o=n.getBBox(),s=parseFloat(getComputedStyle(n).width)||0,g=parseFloat(getComputedStyle(n).height)||0,l=4,m=o.x-l,c=o.y-l,h=o.width+l*2,u=o.height+l*2,p=s>0?Math.min(h,s):h,f=g>0?Math.min(u,g):u,d=n.cloneNode(!0);d.setAttribute("viewBox",`${m} ${c} ${h} ${u}`),d.setAttribute("width",`${p}`),d.setAttribute("height",`${f}`),d.removeAttribute("style");let y=new XMLSerializer().serializeToString(d);a.remove(),i({svg:y,scale:Math.min(h/s,u/g,1)})}catch(o){a.remove(),r(o)}})}),I,j=t=>(I||(I=document.createElement("div"),I.style=`height:${t.maxH}in;width:${t.maxW}in;position:absolute;left:-2500vw;`,document.body.appendChild(I),t.dpi=parseFloat(getComputedStyle(I).width)/t.maxW),I),M=(t,e)=>e.diagramType==="pie"?t.replace(".pieTitleText{text-anchor:middle;",".pieTitleText{").replace(/<text[^>]*class="pieTitleText"[^>]*>(.*?)<\/text>/,(i,r)=>i.replace(r,r.replace(/^"|"$/g,"")).replace(/ x=".*?"/,' x="-20%"')):t,C=async(t,e)=>{let i=t.value,r,a=!1;if(typeof i=="string")r=i;else{let n=await i;if(!n)return v(e);r=n.svg,a=n.diagramType==="gantt",r=e.fixGeneratedSvg(r,n)}try{let n=new Image,o=j(e);o.appendChild(n);let s=a||!r?{svg:r,scale:1}:await N(r,o),g=await L(s.svg);n.src=g,await new Promise(f=>n.onload=f),a&&(e.scale=Math.max(e.scale,Math.floor(Math.min(innerWidth/n.width,innerHeight/n.height))));let l=n.width*e.scale,m=n.height*e.scale,c=document.createElement("canvas"),h=c.getContext("2d");if(!h)throw new Error("Canvas context not available");c.width=l,c.height=m,h.drawImage(n,0,0,l,m);let u=c.toDataURL(`image/${e.fallbackImageType}`);n.remove();let p=Math.min(e.maxW*e.dpi/l,e.maxH*e.dpi/m,1)*s.scale;return{type:e.fallbackImageType,data:u,transformation:{width:l*p,height:m*p}}}catch(n){return console.error("Error resolving SVG image: ",n),v(e)}};var A=["jpeg","jpg","bmp","gif","png"],H="img",G=async(t,e)=>{var m;let i=e.scale,r=t.split(";")[0].split("/")[1],a=new Image;a.src=t,await new Promise(c=>a.onload=c);let n=a.width*i,o=a.height*i;if(A.includes(r))return{data:t,type:r,transformation:{width:n/i,height:o/i}};let s=document.createElement("canvas"),g=s.getContext("2d");if(!g)throw new Error("Canvas context not available");s.width=n,s.height=o,g.drawImage(a,0,0,n,o);let l=(m=e.fallbackImageType)!=null?m:"png";return{data:s.toDataURL(`image/${l}`),type:l,transformation:{width:n/i,height:o/i}}},K=async(t,e)=>{var o;let i=await fetch(t);if(/(svg|xml)/.test((o=i.headers.get("content-type"))!=null?o:"")||t.endsWith(".svg")){let s=await i.text();return C({type:"svg",value:s},e)}let r=await i.arrayBuffer(),a=R(r)||"png",n=await createImageBitmap(new Blob([r],{type:a}));return A.includes(a)?{type:a,data:r,transformation:{width:n.width,height:n.height}}:(console.warn(`${a} not supported by docx. Using fallback.`),G(t,e))},_=async(t,e,i)=>{var r;try{let a=await((i==null?void 0:i.type)==="svg"?C(i,e):t.startsWith("data:")?G(t,e):K(t,e)),{width:n,height:o}=a.transformation,{width:s,height:g}=(r=i==null?void 0:i.data)!=null?r:{};s&&!g?g=o*s/n:!s&&g?s=n*g/o:!s&&!g&&(s=n,g=o);let l=Math.min(e.maxW*e.dpi/s,e.maxH*e.dpi/g,1);return a.transformation={width:s*l,height:g*l},a}catch(a){return console.error(`Error resolving image: ${t}`,a),v(e)}},b={scale:3,fallbackImageType:"png",imageResolver:_,maxW:6.3,maxH:9.7,dpi:96,cacheConfig:{cacheMode:"both",ignoreKeys:["dpi","cacheConfig","type","alt"],parallel:!0},maxAgeMinutes:7*24*60,fixGeneratedSvg:M},q=t=>{var n,o,s,g,l;let e={...b,...t},i={cache:(n=e.cache)!=null?n:void 0,...b.cacheConfig,...e.cacheConfig,ignoreKeys:[...(s=(o=b.cacheConfig)==null?void 0:o.ignoreKeys)!=null?s:[],...(l=(g=e.cacheConfig)==null?void 0:g.ignoreKeys)!=null?l:[]]};e.imageResolver=(0,x.createPersistentCache)(e.imageResolver,H,i);let r=async(m,c)=>{let h=[],u=p=>{var f;(f=p.children)==null||f.forEach(u),/^(image|svg)/.test(p.type)&&h.push((async()=>{var T,D,E,O,S;let d=(D=p.url)!=null?D:c[(T=p.identifier)==null?void 0:T.toUpperCase()],y=(S=(O=p.alt)!=null?O:(E=d==null?void 0:d.split("/"))==null?void 0:E.pop())!=null?S:"";p.data={...await e.imageResolver(d,e,p),altText:{description:y,name:y,title:y},...p.data}})())};u(m),await Promise.all(h)},a=!1;return{preprocess:r,inline:(m,c,h)=>/^(image|svg)/.test(c.type)?(c._type=c.type,c.type="",[new m.ImageRun({...c.data,...h})]):[],postprocess:()=>{var m,c;(!((m=e==null?void 0:e.cacheConfig)!=null&&m.cacheMode)||((c=e==null?void 0:e.cacheConfig)==null?void 0:c.cacheMode)!=="memory")&&!a&&(a=!0,(0,x.simpleCleanup)(e.maxAgeMinutes,H))}}};0&&(module.exports={imagePlugin});