UNPKG

@m2d/core

Version:

Core engine to convert extended MDAST to DOCX. Supports plugins for footnotes, images, lists, tables, and more. Designed for seamless Markdown-to-DOCX conversion.

4 lines (3 loc) 5.86 kB
"use strict";var v=Object.create;var D=Object.defineProperty;var B=Object.getOwnPropertyDescriptor;var F=Object.getOwnPropertyNames;var H=Object.getPrototypeOf,A=Object.prototype.hasOwnProperty;var j=(t,a)=>{for(var s in a)D(t,s,{get:a[s],enumerable:!0})},R=(t,a,s,i)=>{if(a&&typeof a=="object"||typeof a=="function")for(let d of F(a))!A.call(t,d)&&d!==s&&D(t,d,{get:()=>a[d],enumerable:!(i=B(a,d))||i.enumerable});return t};var z=(t,a,s)=>(s=t!=null?v(H(t)):{},R(a||!t||!t.__esModule?D(s,"default",{value:t,enumerable:!0}):s,t)),L=t=>R(D({},"__esModule",{value:!0}),t);var K={};j(K,{toDocx:()=>G});module.exports=L(K);var g=require("docx");var w=t=>{let a={},s={};return t.forEach(i=>{var d;i.type==="definition"?a[i.identifier.toUpperCase()]=i.url:i.type==="footnoteDefinition"?s[i.identifier.toUpperCase()]={children:i.children}:(d=i.children)!=null&&d.length&&Object.assign(a,w(i.children))}),{definitions:a,footnoteDefinitions:s}},k=t=>{var a,s;return(a=t.children)!=null&&a.length?t.children.map(k).join(""):(s=t.value)!=null?s:""},M={useTitle:!0,plugins:[]},S={styles:{default:{document:{paragraph:{spacing:{before:175,line:300},alignment:"thaiDistribute"},run:{size:24}},heading1:{paragraph:{spacing:{before:350}}},heading2:{paragraph:{spacing:{before:350}}},heading3:{paragraph:{spacing:{before:350}}},heading4:{paragraph:{spacing:{before:350}}},heading5:{paragraph:{spacing:{before:350}}},heading6:{paragraph:{spacing:{before:350}}}}}};var E=z(require("docx")),X=(t,a,s)=>{let i=async(d,x={})=>{var P,m;return(await Promise.all((m=(P=d.children)==null?void 0:P.map(async n=>{var e,r,p;let c=(await Promise.all(s.map(f=>{var u,y;return(y=(u=f.inline)==null?void 0:u.call(f,E,n,x,t,a,i))!=null?y:[]}))).flat(),l=Object.assign({},x,n.data),h=(r=n.url)!=null?r:t[(e=n.identifier)==null?void 0:e.toUpperCase()];switch(n.type){case"text":return[...c,...l.pre?n.value.split(` `).map(f=>new g.TextRun({text:f,...l,break:1})):[new g.TextRun({text:n.value,...l})]];case"checkbox":return[...c,new g.CheckBox({checked:!!n.checked})];case"break":return[...c,new g.TextRun({break:1})];case"inlineCode":return[...c,new g.TextRun({text:n.value,...l,style:"code",font:{name:"Consolas"}})];case"emphasis":return l.italics=!0,[...c,...await i(n,l)];case"strong":return l.bold=!0,[...c,...await i(n,l)];case"delete":return l.strike=!0,[...c,...await i(n,l)];case"link":case"linkReference":return l.underline={},[...c,h.startsWith("#")?new g.InternalHyperlink({anchor:h.slice(1),children:await i(n,l)}):new g.ExternalHyperlink({link:h,children:await i(n,l)})];case"footnoteReference":return[...c,new g.FootnoteReferenceRun((p=a[n.identifier].id)!=null?p:0)];case"fragment":return[...c,...await i(n,l)];case"":return[...c];default:return console.warn(`Unsupported inline node type: ${n.type}`),[...c]}}))!=null?m:[])).flat()};return i},C=async(t,a,s,i)=>{let{plugins:d,useTitle:x,...P}={...M,...i};d.forEach(c=>{var l;return(l=c==null?void 0:c.preprocess)==null?void 0:l.call(c,t)});let m=X(a,s,d),n=async(c,l)=>{var h;return(await Promise.all((h=c.children)==null?void 0:h.map(async e=>{var f,u,y,T;let r={...l},p=(await Promise.all(d.map(b=>{var I,O;return(O=(I=b.block)==null?void 0:I.call(b,E,e,r,n,m))!=null?O:[]}))).flat();switch(Object.assign(r,e.data),e.type){case"paragraph":{let b=r.pre?{alignment:"left"}:{},I=typeof r.checked=="boolean"?[new g.CheckBox({checked:r.checked,checkedState:{value:"2611"},uncheckedState:{value:"2610"}}),new g.TextRun(" ")]:[];return[...p,new g.Paragraph({...b,...r,children:[...I,...await m(e,r)]})]}case"heading":return[new g.Paragraph({...r,...p,heading:x?e.depth===1?"Title":`Heading${e.depth-1}`:`Heading${e.depth}`,children:[new g.Bookmark({id:k(e).replace(/[. ]+/g,"-").toLowerCase(),children:await m(e,r)})]})];case"code":return[...p,new g.Paragraph({border:{bottom:{style:g.BorderStyle.SINGLE,space:5,size:1},left:{style:g.BorderStyle.SINGLE,space:10,size:1},right:{style:g.BorderStyle.SINGLE,space:5,size:1},top:{style:g.BorderStyle.SINGLE,space:6,size:1}},...r,alignment:"left",style:"blockCode",children:e.value.split(` `).map((b,I)=>new g.TextRun({...r,text:b,break:I===0?0:1,style:"code",font:{name:"Consolas"}}))})];case"list":return e.ordered?(r.bullet={level:((u=(f=r.bullet)==null?void 0:f.level)!=null?u:-1)+1},console.warn("Please add numbering plugin to support ordered lists. For now, we use only bullets for both the ordered and the unordered list.")):r.bullet={level:((T=(y=r.bullet)==null?void 0:y.level)!=null?T:-1)+1},[...p,...await n(e,r)];case"blockquote":return[...p,...await n(e,r)];case"listItem":return r.checked=e.checked,[...p,...await n(e,r)];case"thematicBreak":return[...p,new g.Paragraph({...e.data,border:{top:{style:g.BorderStyle.SINGLE,size:6}}})];case"definition":case"footnoteDefinition":return p;case"table":return console.warn("Please add table plugin to support tables."),p;case"fragment":return[...p,...await n(e,r)];case"":return p;case"yaml":case"html":default:return console.warn(`May be an unsupported node type: ${e.type}`,e),p}}))).flat()};return{...P,children:await n(t,{})}};var G=async(t,a={},s={},i="blob")=>{var l;let d=1,x={},P={...S,...a};(l=s==null?void 0:s.plugins)==null||l.forEach(h=>{var e;return(e=h.root)==null?void 0:e.call(h,P)});let m=await Promise.all((Array.isArray(t)?t:[{ast:t}]).map(async({ast:h,props:e})=>{var f;let{definitions:r,footnoteDefinitions:p}=w(h.children);return await Promise.all(Object.values(p).map(async u=>{u.id=d,x[d]=await C({type:"root",children:u.children},r,{}),d++})),(f=e==null?void 0:e.plugins)==null||f.forEach(u=>{var y;return(y=u.root)==null?void 0:y.call(u,P)}),{ast:h,props:{...s,...e},definitions:r,footnoteDefinitions:p}})),n=await Promise.all(m.map(({ast:h,props:e,definitions:r,footnoteDefinitions:p})=>C(h,r,p,e))),c=new g.Document({...P,footnotes:x,sections:n});return g.Packer.pack(c,i)};0&&(module.exports={toDocx});