UNPKG

europa

Version:

Library for converting HTML into valid Markdown within a web browser

2 lines 12.6 kB
/*! Europa v6.0.0 | (C) 2022 neocotic | MIT License */var t={d:(e,r)=>{for(var n in r)t.o(r,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:r[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e)},e={};t.d(e,{Z:()=>z});const r=[function(t){const e=t.createBoldConverter();return{converters:{B:e,STRONG:e}}},function(){const t=Symbol(),e=Symbol(),r={startTag(r,n){const s=r.context.get(t);return n.set(e,s),r.append(s?"\\`":"`"),r.context.set(t,!0),!0},endTag(r,n){const s=n.get(e);r.context.set(t,s),r.append(s?"\\`":"`")}};return{converters:{CODE:r,KBD:r,SAMP:r},startConversion(e){e.context.set(t,!1)},convertText:(e,r)=>!!r.context.get(t)&&(r.output(r.escape(e,"`")),!0)}},function(t){return{converters:{DD:t.createBlockQuoteConverter(),DT:{startTag:t=>(t.appendParagraph(),t.output("**"),t.atNoWhitespace=!0,!0),endTag(t){t.output("**")}}}}},function(){return{converters:{DETAILS:{startTag(t,e){const{element:r}=t;return t.appendParagraph(),!!r.hasAttr("open")||(t.convertNode(r.find("summary")),!1)}}}}},function(){const t={startTag(t){const e=parseInt(t.element.tagName().match(/([1-6])$/)[1],10);let r="";for(let t=0;t<e;t++)r+="#";return t.appendParagraph().output(`${r} `),!0},endTag(t){t.appendParagraph()}};return{converters:{H1:t,H2:t,H3:t,H4:t,H5:t,H6:t}}},function(){return{converters:{HR:{startTag:t=>(t.appendParagraph().output("---").appendParagraph(),!1)}}}},function(){return{converters:{IMG:{startTag(t){const e=t.getOption("absolute"),r=t.getOption("inline"),{element:n}=t,s=n.attr("src");if(!s)return!1;const o=n.attr("alt")||"",a=n.attr("title"),i=e?t.resolveUrl(s):s;let c=a?`${i} "${a}"`:i;if(r)c=`(${c})`;else{c=`[${t.addReference("image",c)}]`}return t.output(`![${o}]${c}`),!1}}}}},function(t){const e=t.createItalicConverter();return{converters:{CITE:e,DFN:e,EM:e,I:e,U:e,VAR:e}}},function(){return{converters:{BR:{startTag:t=>(t.append(` ${t.left}`),t.atLeft=!0,t.atNoWhitespace=!0,!1)}}}},function(){const t=Symbol();return{converters:{A:{startTag(e,r){const n=e.getOption("absolute"),s=e.getOption("inline"),{element:o}=e,a=o.attr("href");if(!a)return!0;const i=o.attr("title"),c=n?e.resolveUrl(a):a;let u=i?`${c} "${i}"`:c;if(s)u=`(${u})`;else{u=`[${e.addReference("link",u)}]`}return r.set(t,u),e.output("["),e.atNoWhitespace=!0,!0},endTag(e,r){r.has(t)&&e.output(`]${r.get(t)}`)}}}}},function(){const t=Symbol(),e=Symbol(),r=Symbol();function n(n){return{startTag:(s,o)=>(o.set(e,s.context.get(t)),o.set(r,s.listIndex),0===s.listDepth&&s.appendParagraph(),s.context.set(t,n),s.listIndex=1,s.listDepth++,!0),endTag(n,s){n.context.set(t,s.get(e)),n.listIndex=s.get(r),n.listDepth--}}}return{converters:{LI:{startTag(e){const r=e.context.get(t)?e.listIndex+++". ":"* ";return e.atLeft?e.last&&(e.last=e.last.replace(/ {2,4}$/,e.eol)):(e.append(e.left.replace(/ {2,4}$/,e.eol)),e.atLeft=!0,e.atNoWhitespace=!0,e.atParagraph=!0),e.append(function(t="",e=0,r=" "){if(!r)return t;for(let n=0;n<e;n++)t=r+t;return t}(r,2*(e.listDepth-1))),!0}},OL:n(!0),UL:n(!1)},startConversion(e){e.context.set(t,!1)},escapeText:t=>t.replace(/^\s*([+-])(\s+|$)/,"\\$1$2").replace(/^\s*(\d+)\.(\s+|$)/,"$1\\.$2")}},function(){const t={startTag:t=>(t.appendParagraph(),!0),endTag(t){t.appendParagraph()}};return{converters:{ADDRESS:t,ARTICLE:t,ASIDE:t,DIV:t,FIELDSET:t,FOOTER:t,HEADER:t,MAIN:t,NAV:t,P:t,SECTION:t}}},function(){return{converters:{PRE:{startTag(t,e){t.appendParagraph().append("```").append(t.left);const r=t.element.innerHtml();return r&&t.output(r,{preserveLeadingWhitespace:!0}),t.atLeft||t.append(t.left),t.atLeft=t.atParagraph=!1,t.append("```").appendParagraph(),!1}}}}},function(t){return{converters:{BLOCKQUOTE:t.createBlockQuoteConverter(),Q:{startTag:t=>(t.output('"'),t.atNoWhitespace=!0,!0),endTag(t){t.output('"')}}}}}];var n;const s=Symbol();class o{constructor(){this[n]=new Map}delete(t){return this[s].delete(t),this}forEach(t){for(const[e,r]of this[s])"string"==typeof e&&t(e,r);return this}get(t){const e=this[s].get(t);if(void 0===e){throw new Error(`Cannot find context value for ${"string"==typeof t?"":"private "}key: '${String(t)}'`)}return e}has(t){return this[s].has(t)}keys(){return this.map((t=>t))}map(t){const e=[];return this.forEach(((r,n)=>e.push(t(r,n)))),e}set(t,e){return this[s].set(t,e),this}values(){return this.map(((t,e)=>e))}}var a,i,c,u,h;n=s;const l=Symbol(),p=Symbol(),d=Symbol(),g=Symbol(),f=Symbol(),v=Symbol(),m=Symbol(),T=Symbol();class y{constructor(t){this.atLeft=!0,this.atNoWhitespace=!0,this.atParagraph=!0,this.last=null,this.listDepth=0,this.listIndex=1,this[a]="",this[i]=new o,this[c]={all:{},last:{}},this[u]=[],this[h]=new Set(["APPLET","AREA","AUDIO","BUTTON","CANVAS","DATALIST","EMBED","HEAD","INPUT","MAP","MENU","METER","NOFRAMES","NOSCRIPT","OBJECT","OPTGROUP","OPTION","PARAM","PROGRESS","RP","RT","RUBY","SCRIPT","SELECT","STYLE","TEXTAREA","TITLE","VIDEO"]);const{element:e,environment:r,options:n,pluginManager:s}=t;this[d]=r,this[g]=n,this[f]=s,this.element=e,this.left=n.eol}addReference(t,e){if(this.getOption("inline"))throw new Error('Cannot add reference when "inline" option is enabled');const r=this[v],n=`${t}:${e}`;let s=r.all[n];return null==s&&(s=r.last[t]?r.last[t]+1:1,this[m].push({id:s,key:t,value:e}),r.all[n]=r.last[t]=s),`${t}${s}`}append(t){return null!=this.last&&(this[l]+=this.last),this.last=t,this}appendParagraph(){return this.atParagraph||(this.atLeft||(this.append(this.left),this.atLeft=!0),this.append(this.left),this.atNoWhitespace=!0,this.atParagraph=!0),this}convertNode(t){if(!t)return this;const e=this[f];if(t.isElement()){if(this.isHidden(t))return this;this.element=t;const r=t.tagName();if(this.skipTagNames.has(r))return this;const n=new o;(!e.hasConverterHook(r,"startTag")||e.invokeConverterHook(r,"startTag",this,n))&&t.children().forEach((t=>this.convertNode(t))),e.invokeConverterHook(r,"endTag",this,n)}else if(t.isText()){const r=t.text()||"";e.invokeTextConverterHook(r,this)||this.output(r,{clean:!0})}return this}end(){if(this[m].length){const{eol:t}=this;this.append(t.repeat(2)),this[m].sort(((t,e)=>t.key<e.key?-1:t.key>e.key?1:t.id<e.id?-1:t.id>e.id?1:0)).forEach((e=>this.append(`[${e.key}${e.id}]: ${e.value}${t}`)))}return this.append("")[l].trim()}escape(t,e){return e?t.replace(new RegExp(`(${e})`,"g"),"\\$1"):this[f].invokeTextEscaperHook(t.replace(/([\\`*_\[\]#])/g,(t=>`\\${t}`)).replace(/([\u00a0\u2002\u2003\u2009])|([\u2018\u2019])|([\u201c\u201d])/g,((t,e,r,n)=>e?" ":r?"'":n?'"':t)),this)}getOption(t){return this[g][t]}isHidden(t){return"none"===t.css("display")||"hidden"===t.css("visibility")}output(t,e={}){if(!t)return this;const r="\n";return t=t.replace(/\r\n/g,r),e.clean&&(t=this.escape(t).replace(/\n([ \t]*\n)+/g,r).replace(/\n[ \t]+/g,r).replace(/[ \t]+/g," ")),e.preserveLeadingWhitespace||(t=this.atNoWhitespace?t.replace(/^[ \t\n]+/,""):/^[ \t]*\n/.test(t)?t.replace(/^[ \t\n]+/,r):t.replace(/^[ \t]+/," ")),t?(this.atLeft=/\n$/.test(t),this.atNoWhitespace=/[ \t\n]$/.test(t),this.atParagraph=/\n{2}$/.test(t),this.append(t.replace(/\n/g,this.left))):this}resolveUrl(t){return this[d].resolveUrl(this.getOption("baseUri"),t)}get context(){return this[p]}get eol(){return this[g].eol}get options(){return Object.assign({},this[g])}get skipTagNames(){return this[T]}}a=l,i=p,c=v,u=m,h=T;const E=Symbol();class S{constructor(t){this[E]=t.environment}parse(t){const e={absolute:!1,baseUri:()=>this[E].getDefaultBaseUri(),eol:()=>this[E].getDefaultEndOfLineCharacter(),inline:!1};return Object.entries(e).reduce(((e,[r,n])=>{var s;return function(t,e,r){t[e]=r}(e,r,null!==(s=null==t?void 0:t[r])&&void 0!==s?s:"function"==typeof n?n():n),e}),{})}}class b{createBlockQuoteConverter(){const t=Symbol();return{startTag:(e,r)=>(e.appendParagraph(),r.set(t,e.left),e.left+="> ",e.atParagraph?e.append("> "):e.appendParagraph(),!0),endTag(e,r){e.atLeft=!1,e.atParagraph=!1,e.left=r.get(t),e.appendParagraph()}}}createBoldConverter(){return{startTag:t=>(t.output("**"),t.atNoWhitespace=!0,!0),endTag(t){t.output("**")}}}createItalicConverter(){return{startTag:t=>(t.output("_"),t.atNoWhitespace=!0,!0),endTag(t){t.output("_")}}}}var x,P,N,$;const C=Symbol(),O=Symbol(),k=Symbol(),R=Symbol(),A=Symbol(),D=Symbol();class L{constructor(){this[x]=new b,this[P]={},this[N]=[],this[$]=null}addPlugin(t){const e=t(this[O]);return this[C](e),this}addPreset(t){var e;return null===(e=t(this[O]).plugins)||void 0===e||e.forEach((t=>this[C](t))),this}hasConverterHook(t,e){const r=this[k][t];return"function"==typeof(null==r?void 0:r[e])}invokeConverterHook(t,e,r,n){var s;const o=null===(s=this[k][t])||void 0===s?void 0:s[e];return"function"!=typeof o?"startTag"!==e&&void 0:o(r,n)}invokeHook(t,e){this[D].forEach((r=>{const n=r[t];"function"==typeof n&&n(e)}))}invokeTextConverterHook(t,e){return this[A]().textConverters.some((r=>r(t,e)))}invokeTextEscaperHook(t,e){return this[A]().textEscapers.reduce(((t,r)=>r(t,e)),t)}[(x=O,P=k,N=D,$=R,C)](t){t.converters&&Object.entries(t.converters).forEach((([t,e])=>{this[k][t.toUpperCase()]=e})),"function"!=typeof t.convertText&&"function"!=typeof t.escapeText||(this[R]=null),this[D].push(t)}[A](){let t=this[R];if(t)return t;const e=[],r=[];return this[D].forEach((t=>{"function"==typeof t.convertText&&e.push(t.convertText),"function"==typeof t.escapeText&&r.push(t.escapeText)})),t={textConverters:e,textEscapers:r},this[R]=t,t}}const H=Symbol(),I=Symbol(),w=Symbol();class U{constructor(t){const{environment:e,options:r}=t;this[H]=e,this[I]=new S({environment:e}).parse(r)}convert(t){if(!t)return"";const e=this[H].getDom().createRoot(t),r=U[w],n=new y({element:e.body(),environment:this[H],options:this[I],pluginManager:r});return r.invokeHook("startConversion",n),n.convertNode(e.body()),r.invokeHook("endConversion",n),n.end()}static registerPlugin(t){U[w].addPlugin(t)}static registerPreset(t){U[w].addPreset(t)}}U[w]=new L;const M=Symbol(),B=Symbol();class W{constructor(t){this[M]=t.dom,this[B]=t.node}children(){return this.map(this[B].childNodes,((t,e)=>this[M].createNode(t,e)))}dom(){return this[M]}isElement(){return!1}isRoot(){return!1}isText(){return this[M].isText(this[B],this.root())}map(t,e){const r=[],n=this.root();for(let s=0;s<t.length;s++)r.push(e(t[s],n));return r}node(){return this[B]}parent(){const{parentNode:t}=this[B];return t?this[M].createNode(t,this.root()):this.root()}text(){return this[B].textContent||""}type(){return this[B].nodeType}}class j extends W{constructor(t){super(t)}find(t){const e=this.node().querySelector(t);if(e)return this.dom().createElement(e,this.root())}findAll(t){const e=this.dom(),r=this.node().querySelectorAll(t);return this.map(r,((t,r)=>e.createElement(t,r)))}}const F=Symbol(),Q=Symbol();class V extends j{constructor(t){super(t),this[F]=t.root,this[Q]=t.node.tagName.toUpperCase()}attr(t){var e;return null!==(e=this.node().getAttribute(t))&&void 0!==e?e:void 0}css(t){if(!t)return;const{style:e}=this.node();return e[t]||void 0}hasAttr(t){return this.node().hasAttribute(t)}innerHtml(){return this.node().innerHTML}isElement(){return!0}outerHtml(){return this.node().outerHTML}prop(t){const e=this.node();if(!(t in e))return;const r=e[t];return null!=r?r:void 0}root(){return this[F]}tagName(){return this[Q]}}const _=Symbol();class G extends W{constructor(t){super(t),this[_]=t.root}root(){return this[_]}}class q extends j{constructor(t){super(t)}body(){const t=this.find(":first-child");if(!t)throw new Error("Unable to find DOM root body");return t}isRoot(){return!0}parent(){return this}root(){return this}}class K{createElement(t,e){return new V({dom:this,node:t,root:e})}createNode(t,e){return this.isElement(t,e)?this.createElement(t,e):this.isRoot(t,e)?e:new G({dom:this,node:t,root:e})}createRoot(t){const e=document.createElement("span");"string"==typeof t?e.innerHTML=t:Array.isArray(t)?e.append(...t):e.appendChild(t);const r=document.createDocumentFragment();return r.appendChild(e),new q({dom:this,node:r})}isElement(t,e){return t.nodeType===Node.ELEMENT_NODE}isRoot(t,e){return t===e.node()}isText(t,e){return t.nodeType===Node.TEXT_NODE}}var X;const Y=Symbol();X=Y;const Z=Symbol();class J extends U{constructor(t){super({environment:J[Z],options:t})}}J[Z]=new class{constructor(){this[X]=new K}getDefaultBaseUri(){return window.document.baseURI}getDefaultEndOfLineCharacter(){return"\n"}getDom(){return this[Y]}resolveUrl(t,e){const r=new URL(e,new URL(t,"resolve://"));if("resolve:"===r.protocol){const{pathname:t,search:e,hash:n}=r;return`${t}${e}${n}`}return r.toString()}},J.registerPreset((function(t){return{plugins:r.map((e=>e(t)))}}));const z=J;var tt=e.Z;export{tt as default}; //# sourceMappingURL=europa.mjs.map