UNPKG

@m2d/html

Version:

Extend MDAST by parsing embedded HTML in Markdown. Converts HTML into structured MDAST nodes compatible with @m2d/core for DOCX generation.

4 lines (2 loc) 5.62 kB
import{a as b}from"./chunk-CYY6OEIU.mjs";import{AlignmentType as T,BorderStyle as l,FrameAnchorType as N,HorizontalPositionAlign as A,VerticalPositionAlign as R}from"docx";var k=["BR","IMG","EM","I","STRONG","B","DEL","S","A","SUP","SUB","svg"],C={BR:"break",IMG:"image",EM:"emphasis",I:"emphasis",STRONG:"strong",B:"strong",DEL:"delete",S:"delete",A:"link"},S=["solid","dashed","dotted","double","none","ridge","groove","inset","outset"],H=t=>{var n;if(!t)return{};let r={},e=t.match(/border(-\w+)?:\s*[^;]+/gi);if(!e)return{};for(let s of e){let[o,i]=s.split(":").map(c=>c.trim()),d=i.split(/\s+/),p=(n=d.find(c=>c.endsWith("px")))==null?void 0:n.replace("px",""),a=d.find(c=>S.includes(c.toLowerCase())),m=d.find(c=>!c.endsWith("px")&&!S.includes(c.toLowerCase())),y=o==="border"?"border":o.replace("border-","");r[y]={...p?{width:parseInt(p,1)}:{},...a?{style:a}:{},...m?{color:m}:{}}}return r},D={solid:l.SINGLE,dashed:l.DASHED,dotted:l.DOTTED,double:l.DOUBLE,none:l.NONE,ridge:l.THREE_D_EMBOSS,groove:l.THREE_D_ENGRAVE,inset:l.INSET,outset:l.OUTSET},u=t=>{if(!t||!Object.keys(t).length)return;let{width:r,color:e,style:n}=t,s={style:n?D[n]:l.SINGLE};return r&&(s.size=r),e&&(s.color=b(e)),s},E=(t,r=!0)=>{let e={};if(!(t instanceof HTMLElement||t instanceof SVGElement))return e;let{textAlign:n,fontWeight:s,fontStyle:o,textDecoration:i,textTransform:d,color:p}=t.style,a=H(t.getAttribute("style"));if(r&&a.border)e.border=u(a.border);else if(Object.keys(a).length){let m={...a.border,...a.left},y={...a.border,...a.right},c={...a.border,...a.top},B={...a.border,...a.bottom};e.border={left:u(m),right:u(y),top:u(c),bottom:u(B)}}switch(n&&(Object.keys(T).includes(n)?e.alignment=n:n==="justify"&&(e.alignment=T.JUSTIFIED)),(/bold/.test(s)||parseInt(s)>=500)&&(e.bold=!0),/(italic|oblique)/.test(o)&&(e.italics=!0),i){case"underline":e.underline={};break;case"overline":e.emphasisMark={};break;case"line-through":e.strike=!0;break}return d==="uppercase"&&(e.allCaps=!0),d==="lowercase"&&(e.smallCaps=!0),p&&(e.color=b(p)),t.tagName==="SUP"?e.superScript=!0:t.tagName==="SUB"?e.subScript=!0:["STRONG","B"].includes(t.tagName)?e.bold=!0:["EM","I"].includes(t.tagName)?e.italics=!0:["DEL","S"].includes(t.tagName)?e.strike=!0:["U","INS"].includes(t.tagName)?e.underline={}:t.tagName==="MARK"?(e.highlight="yellow",e.emphasisMark={}):t.tagName==="PRE"&&(e.pre=!0),e},h=t=>{var s,o,i,d;if(!(t instanceof HTMLElement||t instanceof SVGElement))return{type:"text",value:(s=t.textContent)!=null?s:""};let r=Array.from(t.childNodes).map(h),e=E(t),n=t.getAttributeNames().reduce((p,a)=>({...p,[a]:t.getAttribute(a)}),{});switch(t.tagName){case"BR":return{type:"break"};case"IMG":return{type:"image",url:(o=n.src)!=null?o:"",alt:(i=n.alt)!=null?i:"",data:{...e,...n}};case"svg":return{type:"svg",id:`s${crypto.randomUUID()}`,value:t.outerHTML,data:e};case"EM":case"I":case"STRONG":case"B":case"DEL":case"S":return{type:C[t.tagName],children:r,data:e};case"A":return{type:"link",url:(d=n.href)!=null?d:"",children:r,data:e};case"INPUT":if(/(radio|checkbox)/.test(t.type))return{type:"checkbox"}}return{type:"fragment",children:r,data:e}},g=(t,r)=>{let e=Array.from(t.childNodes),n=[],s=[];for(let o of e)(o instanceof HTMLElement||o instanceof SVGElement)&&!k.includes(o.tagName)?(s.length&&(n.push({type:"paragraph",children:s.map(h)}),s.length=0),n.push(O(o))):s.push(o);return s.length&&n.push({type:"paragraph",children:s.map(h)}),n.length===1?{...n[0],data:{...r,...n[0].data}}:{type:"fragment",children:n,data:r}},I=(t,r)=>Array.from(t.children).map(e=>{let n={...r,...E(e)};return e instanceof HTMLTableRowElement?{type:"tableRow",children:Array.from(e.children).map(s=>({type:"tableCell",children:[h(s)]})),data:n}:I(e,n)}).flat(),f={style:"single"},M={left:f,right:f,top:f,bottom:f},O=t=>{let r=E(t);switch(t.tagName){case"H1":case"H2":case"H3":case"H4":case"H5":case"H6":return{type:"heading",depth:parseInt(t.tagName[1]),children:Array.from(t.childNodes).map(h),data:r};case"PRE":case"P":case"DIV":case"DETAILS":case"SUMMARY":case"FORM":case"LI":return g(t,r);case"UL":case"OL":return{type:"list",ordered:t.tagName==="OL",children:Array.from(t.childNodes).map(e=>({type:"listItem",children:[g(e)],data:r}))};case"HR":return{type:"thematicBreak",data:r};case"BLOCKQUOTE":return{type:"blockquote",children:Array.from(t.childNodes).map(e=>g(e)),data:r};case"TABLE":return{type:"table",children:I(t),data:r};case"STYLE":return{type:"paragraph",children:[{type:"text",value:`Not supported yet! ${t.textContent}`}],data:{...r,pre:!0,border:M}};case"INPUT":if(!/(radio|checkbox)/.test(t.type))return{type:"paragraph",children:[],data:{...r,frame:{width:5e3,height:90,alignment:{x:A.LEFT,y:R.CENTER},anchor:{horizontal:N.TEXT,vertical:N.TEXT},type:"alignment"},border:M}}}return{type:"paragraph",children:[h(t)],data:r}},L=t=>{var n,s;let r=[],e=[];for(let o of t.children)if((n=o.children)!=null&&n.length&&L(o),o.type==="html"&&/^<[^>]*[^/]>$/.test(o.value)){let i=o.value.split(" ")[0].slice(1);i[0]==="/"?((s=e[0])==null?void 0:s.tag)===i.slice(1,-1)&&r.push(e.shift()):e.unshift({...o,children:[],tag:i})}else e.length?e[0].children.push(o):r.push(o);t.children=r},x=()=>({block:async(t,r)=>{if(r.type==="html"){let e=document.createElement("div");e.innerHTML=r.value,Object.assign(r,g(e))}return[]},inline:async(t,r)=>{var e,n;if(r.type==="html"){let s=(n=(e=r.value)==null?void 0:e.trim())!=null?n:"",o=s.split(" ")[0].slice(1),i=document.createElement("div");i.innerHTML=s.endsWith("/>")?s:`${s}</${o}>`,Object.assign(r,{...h(i.children[0]),children:r.children})}return[]},preprocess:L});export{x as htmlPlugin};