UNPKG

@mdast2docx/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) 6.84 kB
"use strict";var y=Object.defineProperty;var H=Object.getOwnPropertyDescriptor;var O=Object.getOwnPropertyNames;var D=Object.prototype.hasOwnProperty;var k=(e,r)=>{for(var t in r)y(e,t,{get:r[t],enumerable:!0})},P=(e,r,t,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let s of O(r))!D.call(e,s)&&s!==t&&y(e,s,{get:()=>r[s],enumerable:!(n=H(r,s))||n.enumerable});return e};var v=e=>P(y({},"__esModule",{value:!0}),e);var W={};k(W,{htmlPlugin:()=>V});module.exports=v(W);var b=e=>{let r=document.createElement("canvas").getContext("2d");return r?(r.fillStyle=e,r.fillStyle.slice(1)):e.startsWith("#")?e.slice(1):"auto"};var p=require("docx"),w=["A","ABBR","ACRONYM","B","BDI","BDO","BIG","BR","BUTTON","CITE","CODE","DATA","DATALIST","DEL","DFN","EM","I","IMG","INPUT","INS","KBD","LABEL","MARK","METER","NOSCRIPT","OBJECT","OUTPUT","Q","RUBY","RP","RT","S","SAMP","SCRIPT","SELECT","SLOT","SMALL","SPAN","STRONG","SUB","SUP","svg","TEMPLATE","TEXTAREA","TIME","U","TT","VAR","WBR"],x={A:"link",B:"strong",BR:"break",EM:"emphasis",STRONG:"strong",I:"emphasis",IMG:"image",DEL:"delete",S:"delete"},N=["solid","dashed","dotted","double","none","ridge","groove","inset","outset"],U=e=>{var n;if(!e)return{};let r={},t=e.match(/border(-\w+)?:\s*[^;]+/gi);if(!t)return{};for(let s of t){let[a,u]=s.split(":").map(d=>d.trim()),o=u.split(/\s+/),h=(n=o.find(d=>d.endsWith("px")))==null?void 0:n.replace("px",""),i=o.find(d=>N.includes(d.toLowerCase())),c=o.find(d=>!d.endsWith("px")&&!N.includes(d.toLowerCase())),l=a==="border"?"border":a.replace("border-","");r[l]={...h?{width:parseInt(h,1)}:{},...i?{style:i}:{},...c?{color:c}:{}}}return r},G={solid:p.BorderStyle.SINGLE,dashed:p.BorderStyle.DASHED,dotted:p.BorderStyle.DOTTED,double:p.BorderStyle.DOUBLE,none:p.BorderStyle.NONE,ridge:p.BorderStyle.THREE_D_EMBOSS,groove:p.BorderStyle.THREE_D_ENGRAVE,inset:p.BorderStyle.INSET,outset:p.BorderStyle.OUTSET},g=e=>{if(!e||!Object.keys(e).length)return;let{width:r,color:t,style:n}=e,s={style:n?G[n]:p.BorderStyle.SINGLE};return r&&(s.size=r),t&&(s.color=b(t)),s},S=(e,r=!0)=>{var d,f;let t={};if(!(e instanceof HTMLElement||e instanceof SVGElement))return t;let{textAlign:n,fontWeight:s,fontStyle:a,textDecoration:u,textTransform:o,color:h}=e.style,i=e.getAttribute("style"),c=U(i);if(t.style=i!=null?i:void 0,r&&c.border)t.border=g(c.border);else if(Object.keys(c).length){let B={...c.border,...c.left},A={...c.border,...c.right},C={...c.border,...c.top},R={...c.border,...c.bottom};t.border={left:g(B),right:g(A),top:g(C),bottom:g(R)}}switch(n&&(Object.keys(p.AlignmentType).includes(n)?t.alignment=n:n==="justify"&&(t.alignment=p.AlignmentType.JUSTIFIED)),(/bold/.test(s)||parseInt(s)>=500)&&(t.bold=!0),/(italic|oblique)/.test(a)&&(t.italics=!0),u){case"underline":t.underline={};break;case"overline":t.emphasisMark={};break;case"line-through":t.strike=!0;break}o==="uppercase"&&(t.allCaps=!0),o==="lowercase"&&(t.smallCaps=!0),h&&(t.color=b(h));let l=e.tagName;return l==="SUP"?t.superScript=!0:l==="SUB"?t.subScript=!0:["STRONG","B"].includes(l)?t.bold=!0:["EM","I"].includes(l)?t.italics=!0:["DEL","S"].includes(l)?t.strike=!0:["U","INS"].includes(l)?t.underline={}:l==="MARK"?(t.highlight="yellow",t.emphasisMark={}):l==="PRE"?t.pre=!0:l==="INPUT"&&(t.type=e.type,t.name=e.name,t.value=(d=e.value)!=null?d:e.defaultValue,t.checked=(f=e.checked)!=null?f:e.defaultChecked),t.tag=l.toLowerCase(),t},m=(e,r=!1)=>{var u,o,h,i,c,l;if(!(e instanceof HTMLElement||e instanceof SVGElement))return{type:"text",value:(o=r?e.textContent:(u=e.textContent)==null?void 0:u.replace(/^\s+|\s+$/g," "))!=null?o:""};let t=Array.from(e.childNodes).map(d=>m(d,r)),n=S(e),s=e.getAttributeNames().reduce((d,f)=>({...d,[f]:e.getAttribute(f)}),{}),a=e.tagName;switch(a){case"BR":return{type:"break"};case"IMG":return{type:"image",url:(h=s.src)!=null?h:"",alt:(i=s.alt)!=null?i:"",data:{...n,...s}};case"svg":return{type:"svg",value:e.outerHTML,data:n};case"EM":case"I":case"STRONG":case"B":case"DEL":case"S":return{type:x[a],children:t,data:n};case"A":return{type:"link",url:(c=s.href)!=null?c:"",children:t,data:n};case"INPUT":return/(radio|checkbox)/.test(e.type)?{type:"checkbox",data:n}:{type:"text",value:(l=n.value)!=null?l:`_${e.value||"_".repeat(20)}_`,data:{...n,border:{style:p.BorderStyle.OUTSET}}}}return{type:"fragment",children:t,data:n}},T=(e,r)=>{let t=Array.from(e.childNodes),n=[],s=[];for(let a of t)(a instanceof HTMLElement||a instanceof SVGElement)&&!w.includes(a.tagName)?(s.length&&(n.push({type:"paragraph",children:s.map(u=>m(u,r==null?void 0:r.pre))}),s.length=0),n.push($(a))):s.push(a);return s.length&&n.push({type:"paragraph",children:s.map(a=>m(a,r==null?void 0:r.pre))}),n.length===1?{...n[0],data:{...r,...n[0].data}}:{type:"fragment",children:n,data:r}},L=(e,r)=>Array.from(e.children).map(t=>{let n={...r,...S(t)};return t.tagName==="TR"?{type:"tableRow",children:Array.from(t.children).map(s=>({type:"tableCell",children:[T(s,{...n,tag:void 0})],data:{...n,tag:s.tagName.toLowerCase()}})),data:n}:L(t,n)}).flat(),E={style:"single"},_={left:E,right:E,top:E,bottom:E},$=e=>{let r=S(e),t=e.tagName;switch(t){case"H1":case"H2":case"H3":case"H4":case"H5":case"H6":return{type:"heading",depth:parseInt(t[1]),children:Array.from(e.childNodes).map(n=>m(n)),data:r};case"PRE":case"P":case"DIV":case"DETAILS":case"SUMMARY":case"FORM":case"LI":return T(e,r);case"UL":case"OL":return{type:"list",ordered:t==="OL",children:Array.from(e.childNodes).map(n=>({type:"listItem",children:[T(n)],data:r}))};case"HR":return{type:"thematicBreak",data:r};case"BLOCKQUOTE":return{type:"blockquote",children:Array.from(e.childNodes).map(n=>T(n)),data:r};case"TABLE":return{type:"table",children:L(e),data:r};case"STYLE":return{type:"paragraph",children:[{type:"text",value:`Not supported yet! ${e.textContent}`}],data:{...r,pre:!0,border:_}}}return{type:"paragraph",children:[m(e)],data:r}},I=e=>{var s,a,u;let r=(a=(s=e.value)==null?void 0:s.trim())!=null?a:"",t=r.split(" ")[0].slice(1),n=document.createElement("div");n.innerHTML=r.endsWith("/>")?r:`${r}</${t}>`,Object.assign(e,{...m(n.children[0]),children:(u=e.children)!=null?u:[]})},M=(e,r=!0)=>{var s,a,u;let t=[],n=[];for(let o of e.children){if((s=o.children)!=null&&s.length&&M(o,!1),o.type==="html"&&/^<[^>]*[^/]>$/.test(o.value)){let i=o.value.split(" ")[0].replace(/^<|>$/g,"");if(i[0]==="/"){let c=n.shift();if(!c)throw new Error(`Invalid HTML: ${o.value}`);I(c),((u=(a=n[0])==null?void 0:a.children)!=null?u:t).push(c)}else n.unshift({...o,children:[],tag:i})}else n.length?n[0].children.push(o):t.push(o);let h=o.type==="html"&&/^<[^>]*\/>$/.test(o.value);if(h&&!r)I(o);else if(h&&r||o.type==="html"&&!/^<[^>]*>$/.test(o.value)){let i=document.createElement("div");i.innerHTML=o.value,Object.assign(o,T(i))}}e.children=t},V=()=>({preprocess:M});0&&(module.exports={htmlPlugin});