UNPKG

quikdown

Version:

Small, safe, bidirectional Markdown parser and editor with streaming, undo/redo, rich fences, MCP tools, and a standalone airgapped build. Zero runtime deps. Browser and Node.js.

9 lines (8 loc) • 23.7 kB
/** * quikdown_bd - Bidirectional Markdown Parser * @version 1.2.22 * @license BSD-2-Clause * @copyright DeftIO 2025 */ function t(t){if(t.length<3)return!1;let e="";for(let n=0;n<t.length;n++){const r=t[n];" "!==r&&"\t"!==r&&(e+=r)}if(e.length<3)return!1;const n=e[0];if("-"!==n&&"*"!==n&&"_"!==n)return!1;for(let t=1;t<e.length;t++)if(e[t]!==n)return!1;return!0}const e="quikdown-",n="§CB",r="§HT",o="§BE",l="§NL§",c={href:1,src:1,action:1,formaction:1},s={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},a={h1:"font-size:2em;margin:.67em 0;text-align:left",h2:"font-size:1.5em;margin:.83em 0",h3:"font-size:1.25em;margin:1em 0",h4:"font-size:1em;margin:1.33em 0",h5:"font-size:.875em;margin:1.67em 0",h6:"font-size:.85em;margin:2em 0",pre:"background:#f4f4f4;padding:10px;border-radius:4px;overflow-x:auto;margin:1em 0",code:"background:#f0f0f0;padding:2px 4px;border-radius:3px;font-family:monospace",blockquote:"border-left:4px solid #ddd;margin-left:0;padding-left:1em",table:"border-collapse:collapse;width:100%;margin:1em 0",th:"border:1px solid #ddd;padding:8px;background-color:#f2f2f2;font-weight:bold;text-align:left",td:"border:1px solid #ddd;padding:8px;text-align:left",hr:"border:none;border-top:1px solid #ddd;margin:1em 0",img:"max-width:100%;height:auto",a:"color:#06c;text-decoration:underline",strong:"font-weight:bold",em:"font-style:italic",del:"text-decoration:line-through",ul:"margin:.5em 0;padding-left:2em",ol:"margin:.5em 0;padding-left:2em",li:"margin:.25em 0","task-item":"list-style:none","task-checkbox":"margin-right:.5em",alert:"padding:1em;margin:1em 0;border-left:4px solid #0969da;border-radius:4px;background:#ddf4ff","alert-title":"font-weight:600;margin:0 0 .4em","alert-note":"border-left-color:#0969da;background:#ddf4ff","alert-tip":"border-left-color:#1a7f37;background:#dafbe1","alert-important":"border-left-color:#8250df;background:#fbefff","alert-warning":"border-left-color:#9a6700;background:#fff8c5","alert-caution":"border-left-color:#cf222e;background:#ffebe9",sup:"font-size:.75em;vertical-align:super;line-height:0",footnotes:"margin-top:2em;font-size:.9em","footnote-backref":"text-decoration:none;margin-left:.25em"};function i(t){if(null==t||""===t)return{url:"",title:null};const e=t.match(/^(.*)\s+(?:"([^"]*)"|&quot;([^&]*?)&quot;)\s*$/);if(e)return{url:e[1].replace(/\s+$/,""),title:e[2]??e[3]};const n=t.match(/^(.*)\s+(?:'([^']*)'|&#39;([^&]*?)&#39;)\s*$/);return n?{url:n[1].replace(/\s+$/,""),title:n[2]??n[3]}:t.startsWith("&lt;")&&t.endsWith("&gt;")?{url:t.slice(4,-4),title:null}:{url:t,title:null}}function u(t){return t.replace(/[*_`~]/g,"").trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"section"}function f(t,e){const n=e.get(t)||0;return e.set(t,n+1),0===n?t:`${t}-${n}`}function d(t){let e=0,n=0;for(;n<t.length&&t.startsWith("&gt;",n);)n+=4,e++," "===t[n]&&n++;return{depth:e,content:t.slice(n)}}function $(e){const r=e.trim();return""===r||(!!/^#{1,6}\s/.test(r)||(!!t(r)||(!!/^&gt;/.test(r)||(!!/^[-*+]\s/.test(r)||(!!/^\d+\.\s/.test(r)||(!!r.startsWith("|")||!!r.startsWith(n)))))))}const g=[[/\*\*(.+?)\*\*/g,"strong"],[/__(.+?)__/g,"strong"],[/(?<!\*)\*(?!\*)(.+?)(?<!\*)\*(?!\*)/g,"em"],[/(?<![A-Za-z0-9_])_(?![_\s])(.+?)(?<![\s_])_(?![A-Za-z0-9_])/g,"em"],[/~~(.+?)~~/g,"del"],[/`([^`\n]+)`/g,"code"]],p={NOTE:"Note",TIP:"Tip",IMPORTANT:"Important",WARNING:"Warning",CAUTION:"Caution"};function h(t,n,r){const o=t.length>0&&1===t[0].depth?t[0].content.trim().match(/^\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\]\s*$/i):null;let l="";const c=[],s=n("blockquote").includes("style=");for(let i=0;i<t.length;i++){const{depth:u,content:f}=t[i];if(!(u<=0)){if(o&&0===i){const t=o[1].toUpperCase(),n=t.toLowerCase();if(s){const t=a.alert,e=a["alert-"+n];l+=`<div style="${e?`${t};${e}`:t}"${r(">")}>`}else l+=`<div class="${e}alert ${e}alert-${n}"${r(">")}>`;const i=p[t];l+=s?`<p style="${a["alert-title"]}">${i}</p>`:`<p class="${e}alert-title">${i}</p>`,c.push("alert");continue}for(;c.length>u;){l+="alert"===c.pop()?"</div>":"</blockquote>"}for(;c.length<u;)0===c.length&&o?c.push("alert"):(l+=`<blockquote${n("blockquote")}${r(">")}>`,c.push("blockquote"));l+=f,i<t.length-1&&(l+="\n")}}for(;c.length>0;){l+="alert"===c.pop()?"</div>":"</blockquote>"}return l.trimEnd()}function m(t){if(0===t.length)return!1;const e=t.match(/^([ \t]+)(.*)$/);if(!e)return!1;if(e[1].replace(/\t/g," ").length<4)return!1;const n=e[2];return!(/^[-*+]\s/.test(n)||/^\d+\.\s/.test(n)||/^>/.test(n)||/^#{1,6}\s/.test(n))}function b(t){if(t.startsWith(" "))return t.slice(4);if("\t"===t[0])return t.slice(1);const e=t.match(/^[ \t]+(.*)$/);return e?e[1]:t}const q=/^(\s*)([*\-+]|\d+\.)\s+(.+)$/;function x(t){const e=t.match(/^[ \t]+(\S.*)$/);if(!e)return!1;const n=e[1];return!/^(```|~~~|>|&gt;|\||#{1,6}(\s|$)|<)/.test(n)&&!/^([-*_])\1{2,}\s*$/.test(n)}function _(t){return t.trim().replace(/^\|/,"").replace(/\|$/,"").split("|")}function y(p,_={}){if(!p||"string"!=typeof p)return"";const{fence_plugin:y,inline_styles:k=!1,bidirectional:N=!1,lazy_linefeeds:w=!1,allow_unsafe_html:E=!1,heading_ids:C=!1,reference_links:T=!1,footnotes:v=!1}=_,L=function(t,n){return function(r,o=""){if(t){let t=n[r];return t||o?(o&&o.includes("text-align")&&t&&t.includes("text-align")&&(t=t.replace(/text-align:[^;]+;?/,"").trim(),t&&!t.endsWith(";")&&(t+=";")),` style="${o?t?`${t}${o}`:o:t}"`):""}{const t=` class="${e}${r}"`;return o?`${t} style="${o}"`:t}}}(k,a),z=new Map;function S(t){return t.replace(/[&<>"']/g,t=>s[t])}const O=N?t=>` data-qd="${S(t)}"`:()=>"";function j(t,e=!1){if(!t)return"";if(e)return t;const n=t.trim(),r=n.toLowerCase(),o=["javascript:","vbscript:","data:"];for(const t of o)if(r.startsWith(t))return"data:"===t&&r.startsWith("data:image/")?n:"#";return n}let W=p;const I=[],M=[];W=W.replace(/^(```|~~~)([^\n]*)\n([\s\S]*?)^\1$/gm,(t,e,r,o)=>{const l=`${n}${I.length}§`,c=r?r.trim():"";return y&&y.render&&"function"==typeof y.render?I.push({lang:c,code:o.trimEnd(),custom:!0,fence:e,hasReverse:!!y.reverse}):I.push({lang:c,code:S(o.trimEnd()),custom:!1,fence:e}),l});const Z=[];W=W.replace(/\\`/g,()=>{const t=`${o}${Z.length}§`;return Z.push("`"),t}),W=W.replace(/`([^`\n]+)`/g,(t,e)=>{const n=`§IC${M.length}§`;return M.push(S(e)),n}),W=W.replace(/\\([\\*_{}[\]()#+\-.!~|<>])/g,(t,e)=>{const n=`${o}${Z.length}§`;return Z.push(S(e)),n});const P=new Map,B=new Map,H=[];if(T||v){const F=W.split("\n"),G=[];let J=0;for(;J<F.length;){const K=F[J];if(K.includes(n))G.push(K),J++;else{if(v){const Q=K.match(/^\[\^([^\]]+)\]:\s+([\s\S]*)$/);if(Q){const V=Q[1];let Y=Q[2];for(;J+1<F.length;){const et=F[J+1];if(!/^[ \t]+\S/.test(et)||et.includes(n))break;Y+=" "+et.trim(),J++}const tt=V;B.has(tt)||B.set(tt,Y),J++;continue}}if(T){const nt=K.match(/^\[([^\]]+)\]:\s+<?([^\s>]+)>?(?:\s+(?:"([^"]*)"|'([^']*)'|\(([^)]*)\)))?\s*$/);if(nt){const rt=nt[1].toLowerCase(),ot=nt[2],lt=void 0!==nt[3]?nt[3]:void 0!==nt[4]?nt[4]:void 0!==nt[5]?nt[5]:null;P.has(rt)||P.set(rt,{url:ot,title:lt}),J++;continue}}G.push(K),J++}}W=G.join("\n")}const R=[],U=Array.isArray(E)?Object.fromEntries(E.map(t=>[t,1])):E&&"object"==typeof E?E:null;if(U&&(W=W.replace(/<!--[\s\S]*?-->/g,t=>{const e=R.length;return R.push(t),`${r}${e}§`}),W=W.replace(/<\/?([a-zA-Z][a-zA-Z0-9]*)\b[^>]*\/?>/g,(t,e)=>{if(e.toLowerCase()in U){const e=function(t){if(!/\s/.test(t.replace(/<\/?[a-zA-Z][a-zA-Z0-9]*/,"").replace(/\/?>$/,"")))return t;const e=t.match(/^(<\/?[a-zA-Z][a-zA-Z0-9]*)([\s\S]*?)(\/?>)$/);if(!e)return t;const[,n,r,o]=e,l=/([a-zA-Z_][\w\-.:]*)(?:\s*=\s*(?:"([^"]*)"|'([^']*)'|(\S+)))?/g,s=[];let a;for(;null!==(a=l.exec(r));){const t=a[1],e=void 0!==a[2]?a[2]:void 0!==a[3]?a[3]:a[4];if(!/^on/i.test(t))if(void 0===e)s.push(t);else{let n=e;t.toLowerCase()in c&&(n=j(e)),s.push(`${t}="${n}"`)}}return n+(s.length?" "+s.join(" "):"")+o}(t),n=R.length;return R.push(e),`${r}${n}§`}return t})),!0!==E&&(W=S(W)),U&&R.forEach((t,e)=>{W=W.replace(`${r}${e}§`,t)}),W=function(t,e,n){const r=t.split("\n"),o=[];let c=0,s=!1;for(;c<r.length;){const t=r[c];if(q.test(t)){s=!0,o.push(t),c++;continue}if(s){if(x(t)){o.push(t),c++;continue}s=!1}if(!m(t)){o.push(t),c++;continue}const a=[];for(;c<r.length;){const t=r[c];if(""===t){if(c+1<r.length&&m(r[c+1])){a.push(""),c++;continue}break}if(!m(t))break;a.push(b(t)),c++}const i=a.join(l);o.push(`<pre${e("pre")}${n(" ")}><code${e("code")}>${i}</code></pre>`)}return o.join("\n")}(W,L,O),W=function(t,e,n){const r=t.split("\n"),o=[];let l=!1,c=[];for(let t=0;t<r.length;t++){const s=r[t].trim();if(s.includes("|")&&(s.startsWith("|")||/[^\\|]/.test(s)))l||(l=!0,c=[]),c.push(s);else{if(l){const t=A(c,e,n);t?o.push(t):o.push(...c),l=!1,c=[]}o.push(r[t])}}if(l&&c.length>0){const t=A(c,e,n);t?o.push(t):o.push(...c)}return o.join("\n")}(W,L,N),W=function(e,n,r,o,l,c){const s=e.split("\n"),a=[];let i=0;for(;i<s.length;){const e=s[i];if(/^\[\/\/\]: #/.test(e)){i++;continue}let g=0;for(;g<e.length&&g<7&&"#"===e[g];)g++;if(g>=1&&g<=6&&" "===e[g]){const t=e.slice(g+1).replace(/\s*#+\s*$/,""),s="h"+g;let d="";if(o){d=` id="${c(f(u(t),l))}"`}a.push(`<${s}${n(s)}${d}${r("#".repeat(g))}>${t}</${s}>`),i++;continue}if(t(e))a.push(`<hr${n("hr")}${r(e.trim())}>`),i++;else{if(d(e).depth>0){const t=[];let e=0;for(;i<s.length;){const n=d(s[i]);if(n.depth>0)t.push(n),e=n.depth,i++;else{if(!(e>0)||$(s[i]))break;t.push({depth:e,content:s[i]}),i++}}a.push(h(t,n,r));continue}a.push(e),i++}}return a.join("\n")}(W,L,O,C,z,S),W=function(t,n,r,o){const l=t.split("\n"),c=[],s=[];let a=0,i=!1;const u=t=>t.replace(/[&<>"']/g,t=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"}[t])),f=o?t=>` data-qd="${u(t)}"`:()=>"";for(let t=0;t<l.length;t++){const o=l[t],u=o.match(q);if(u){const[,t,o,l]=u;0===s.length&&(a=t.length);const d=Math.max(0,Math.floor((t.length-a)/2)),$=/^\d+\./.test(o),g=$?"ol":"ul";let p=l,h="";const m=l.match(/^\[([x ])\]\s+(.*)$/i);if(m&&!$){const[,t,n]=m,o="x"===t.toLowerCase();p=`<input type="checkbox"${r?' style="margin-right:.5em"':` class="${e}task-checkbox"`}${o?" checked":""} disabled> ${n}`,h=r?' style="list-style:none"':` class="${e}task-item"`}for(;s.length>d+1;){const t=s.pop();c.push(`</${t.type}>`)}for(s.length===d+1&&s[d].type!==g&&c.push(`</${s.pop().type}>`);s.length<d+1;)s.push({type:g,level:s.length}),c.push(`<${g}${n(g)}>`);const b=h||n("li");c.push(`<li${b}${f(o)}>${p}</li>`),i=!0}else if(i&&x(o)){let t=c[c.length-1].slice(0,-5);/( {2}|\\)$/.test(t)?t=t.replace(/( {2}|\\)$/,`<br${n("br")}>`):t+=" ",c[c.length-1]=`${t}${o.trim()}</li>`}else{for(;s.length>0;){const t=s.pop();c.push(`</${t.type}>`)}c.push(o),i=!1}}for(;s.length>0;){const t=s.pop();c.push(`</${t.type}>`)}return c.join("\n")}(W,L,k,N),W=W.replace(/!\[([^\]]*)\]\(([^)]+)\)/g,(t,e,n)=>{const{url:r,title:o}=i(n),l=j(r,_.allow_unsafe_urls),c=o?` title="${S(o)}"`:"",s=N&&e?` data-qd-alt="${S(e)}"`:"",a=N?` data-qd-src="${S(r)}"`:"",u=N&&o?` data-qd-title="${S(o)}"`:"";return`<img${L("img")} src="${l}" alt="${e}"${c}${s}${a}${u}${O("!")}>`}),W=W.replace(/\[([^\]]+)\]\(([^)]+)\)/g,(t,e,n)=>{const{url:r,title:o}=i(n),l=j(r,_.allow_unsafe_urls),c=/^https?:\/\//i.test(l)?' rel="noopener noreferrer"':"",s=o?` title="${S(o)}"`:"",a=N?` data-qd-text="${S(e)}"`:"",u=N&&o?` data-qd-title="${S(o)}"`:"";return`<a${L("a")} href="${l}"${c}${s}${a}${u}${O("[")}>${e}</a>`}),W=W.replace(/(^|\s)(https?:\/\/[^\s<]+)/g,(t,e,n)=>{const{url:r,trailing:o}=function(t){let e="";const n=/[.,;:!?)]/;for(;t.length>0&&n.test(t[t.length-1]);){const n=t[t.length-1];if(")"===n&&(t.match(/\(/g)||[]).length>=(t.match(/\)/g)||[]).length)break;e=n+e,t=t.slice(0,-1)}return{url:t,trailing:e}}(n),l=j(r,_.allow_unsafe_urls);return`${e}<a${L("a")} href="${l}" rel="noopener noreferrer">${r}</a>${o}`}),T&&P.size>0){function ct(t,e,n){const r=j(t.url,_.allow_unsafe_urls),o=/^https?:\/\//i.test(r)?' rel="noopener noreferrer"':"",l=t.title?` title="${S(t.title)}"`:"",c=N?` data-qd-ref="${S(e)}"`:"";return`<a${L("a")} href="${r}"${o}${l}${c}${O("[ref")}>${n}</a>`}W=W.replace(/\[([^\]]+)\]\[([^\]]*)\]/g,(t,e,n)=>{const r=P.get((""===n?e:n).toLowerCase());return r?ct(r,n,e):t}),W=W.replace(/(?<!\])\[([^\]^[\n]+)\](?!\(|\[)/g,(t,e)=>{const n=P.get(e.toLowerCase());return n?ct(n,e,e):t})}v&&B.size>0&&(W=W.replace(/\[\^([^\]]+)\]/g,(t,e)=>{if(!B.has(e))return t;let n=H.indexOf(e);-1===n?(H.push(e),n=H.length):n+=1;const r=N?` data-qd-fn="${S(e)}"`:"";return`<sup${L("sup")}${r}${O("[^")}><a href="#fn-${S(e)}" id="fnref-${S(e)}">${n}</a></sup>`}));const D=[];W=W.replace(/<[^>]+>/g,t=>(D.push(t),`%%T${D.length-1}%%`));const X=["**","__","*","_","~~"];for(let st=0;st<5;st++){const[at,it]=g[st];W=W.replace(at,`<${it}${L(it)}${O(X[st])}>$1</${it}>`)}if(W=W.replace(/%%T(\d+)%%/g,(t,e)=>D[e]),W=W.replace(/\\\n/g,`<br${L("br")}>`),w){const ut=[];let ft=0;W=W.replace(/<(table|[uo]l)[^>]*>[\s\S]*?<\/\1>/g,t=>(ut[ft]=t,`§B${ft++}§`)),W=W.replace(/\n\n+/g,"§P§").replace(/(<\/(?:h[1-6]|blockquote|pre)>)\n/g,"$1§N§").replace(/(<(?:h[1-6]|blockquote|pre|hr)[^>]*>)\n/g,"$1§N§").replace(/\n(<(?:h[1-6]|blockquote|pre|hr)[^>]*>)/g,"§N§$1").replace(/\n(§B\d+§)/g,"§N§$1").replace(/(§B\d+§)\n/g,"$1§N§").replace(/\n/g,`<br${L("br")}>`).replace(/§N§/g,"\n").replace(/§P§/g,"</p><p>"),ut.forEach((t,e)=>W=W.replace(`§B${e}§`,t)),W="<p>"+W+"</p>"}else W=W.replace(/ {2}$/gm,`<br${L("br")}>`),W=W.replace(/\n\n+/g,(t,e)=>W.substring(0,e).match(/<\/(h[1-6]|blockquote|ul|ol|table|pre|hr)>$/)?"<p>":"</p><p>"),W="<p>"+W+"</p>";if([[/<p><\/p>/g,""],[/<p>(<h[1-6][^>]*>)/g,"$1"],[/(<\/h[1-6]>)<\/p>/g,"$1"],[/<p>(<blockquote[^>]*>)/g,"$1"],[/(<\/blockquote>)<\/p>/g,"$1"],[/<p>(<ul[^>]*>|<ol[^>]*>)/g,"$1"],[/(<\/ul>|<\/ol>)<\/p>/g,"$1"],[/<p>(<hr[^>]*>)<\/p>/g,"$1"],[/<p>(<table[^>]*>)/g,"$1"],[/(<\/table>)<\/p>/g,"$1"],[/<p>(<pre[^>]*>)/g,"$1"],[/(<\/pre>)<\/p>/g,"$1"],[/<p>(<div[^>]*>)/g,"$1"],[/(<\/div>)<\/p>/g,"$1"],[/<p>(<section[^>]*>)/g,"$1"],[/(<\/section>)<\/p>/g,"$1"],[new RegExp(`<p>(${n}\\d+§)</p>`,"g"),"$1"]].forEach(([t,e])=>{W=W.replace(t,e)}),W=W.replace(/(<\/(?:h[1-6]|blockquote|div|section|ul|ol|table|pre|hr)>)\n([^<])/g,"$1\n<p>$2"),v&&H.length>0){const dt=N?' data-qd="[^section"':"";let $t=`<section${L("footnotes")}${dt}>`;$t+=`<hr${L("hr")}>`,$t+=`<ol${L("ol")}>`;for(const gt of H){const pt=B.get(gt)||"";let ht=!0===E?pt:S(pt);for(const[bt,qt]of g)ht=ht.replace(bt,`<${qt}${L(qt)}>$1</${qt}>`);const mt=N?` data-qd-fn-id="${S(gt)}"`:"";$t+=`<li${L("li")} id="fn-${S(gt)}"${mt}>${ht} <a href="#fnref-${S(gt)}"${L("footnote-backref")}>↩</a></li>`}$t+="</ol></section>",W+=$t}return I.forEach((t,e)=>{let r;if(t.custom&&y&&y.render)if(r=y.render(t.code,t.lang),void 0===r){const e=!k&&t.lang?` class="language-${S(t.lang)}"`:"",n=k?L("code"):e,o=N&&t.lang?` data-qd-lang="${S(t.lang)}"`:"",l=N?` data-qd-fence="${S(t.fence)}"`:"";r=`<pre${L("pre")}${l}${o}><code${n}>${S(t.code)}</code></pre>`}else N&&(r=r.replace(/^<(\w+)/,`<$1 data-qd-fence="${S(t.fence)}" data-qd-lang="${S(t.lang)}" data-qd-source="${S(t.code)}"`));else{const e=!k&&t.lang?` class="language-${S(t.lang)}"`:"",n=k?L("code"):e,o=N&&t.lang?` data-qd-lang="${S(t.lang)}"`:"",l=N?` data-qd-fence="${S(t.fence)}"`:"";r=`<pre${L("pre")}${l}${o}><code${n}>${t.code}</code></pre>`}const o=`${n}${e}§`;W=W.replace(o,r)}),M.forEach((t,e)=>{const n=`§IC${e}§`;W=W.replace(n,`<code${L("code")}${O("`")}>${t}</code>`)}),Z.forEach((t,e)=>{W=W.replace(`${o}${e}§`,t)}),W=W.split(l).join("\n"),W.trim()}function k(t,e){return[[/\*\*(.+?)\*\*/g,"strong"],[/__(.+?)__/g,"strong"],[/(?<!\*)\*(?!\*)(.+?)(?<!\*)\*(?!\*)/g,"em"],[/(?<![A-Za-z0-9_])_(?![_\s])(.+?)(?<![\s_])_(?![A-Za-z0-9_])/g,"em"],[/~~(.+?)~~/g,"del"],[/`([^`\n]+)`/g,"code"]].forEach(([n,r])=>{t=t.replace(n,`<${r}${e(r)}>$1</${r}>`)}),t}function A(t,e,n){if(t.length<2)return null;let r,o,l,c=-1;for(let e=1;e<t.length;e++)if(/^\|?[\s\-:|]+\|?$/.test(t[e])&&t[e].includes("-")){c=e;break}if(-1===c)r=[t[0]],o=t.slice(1),l=_(t[0]).map(()=>"left");else{r=t.slice(0,c),o=t.slice(c+1);const e=_(t[c]);l=e.map(t=>{const e=t.trim();return e.startsWith(":")&&e.endsWith(":")?"center":e.endsWith(":")?"right":"left"})}const s=l.length,a=n?` data-qd-align="${l.join(",")}"`:"";let i=`<table${e("table")}${a}>\n`;return i+=`<thead${e("thead")}>\n`,r.forEach(t=>{i+=`<tr${e("tr")}>\n`;const n=_(t);for(let t=0;t<s;t++){const r=t<n.length?n[t]:"",o=l[t]&&"left"!==l[t]?`text-align:${l[t]}`:"",c=k(r.trim(),e);i+=`<th${e("th",o)}>${c}</th>\n`}i+="</tr>\n"}),i+="</thead>\n",o.length>0&&(i+=`<tbody${e("tbody")}>\n`,o.forEach(t=>{i+=`<tr${e("tr")}>\n`;const n=_(t);for(let t=0;t<s;t++){const r=t<n.length?n[t]:"",o=l[t]&&"left"!==l[t]?`text-align:${l[t]}`:"",c=k(r.trim(),e);i+=`<td${e("td",o)}>${c}</td>\n`}i+="</tr>\n"}),i+="</tbody>\n"),i+="</table>",i}function N(t,e={}){return y(t,{...e,bidirectional:!0})}y.emitStyles=function(t="quikdown-",e="light"){const n=a,r={"#f4f4f4":"#2a2a2a","#f0f0f0":"#2a2a2a","#f2f2f2":"#2a2a2a","#ddd":"#3a3a3a","#06c":"#6db3f2","#ddf4ff":"#162d50","#dafbe1":"#16351d","#fbefff":"#2d1a42","#fff8c5":"#342a10","#ffebe9":"#3d1418",_textColor:"#e0e0e0"},o={_textColor:"#333"};let l="";for(const[c,s]of Object.entries(n)){let n=s;if("dark"===e&&r){for(const[t,e]of Object.entries(r))t.startsWith("_")||(n=n.replaceAll(t,e));["h1","h2","h3","h4","h5","h6","td","li","blockquote","alert","alert-title"].includes(c)&&(n+=`;color:${r._textColor}`)}else if("light"===e&&o){["h1","h2","h3","h4","h5","h6","td","li","blockquote","alert","alert-title"].includes(c)&&(n+=`;color:${o._textColor}`)}l+=`.${t}${c} { ${n} }\n`}return l},y.configure=function(t){return function(e){return y(e,t)}},y.version="1.2.22","undefined"!=typeof module&&module.exports&&(module.exports=y),"undefined"!=typeof window&&(window.quikdown=y),Object.keys(y).forEach(t=>{"configure"!==t&&(N[t]=y[t])}),N.toMarkdown=function(t,e={}){let n;if("string"==typeof t)n=document.createElement("div"),n.innerHTML=t;else{if(!(t instanceof Element))return"";n=t}function r(t,n={}){if(t.nodeType===Node.TEXT_NODE)return t.textContent;if(t.nodeType!==Node.ELEMENT_NODE)return"";const l=t.tagName.toLowerCase(),c=t.getAttribute("data-qd");let s="";for(const e of t.childNodes)s+=r(e,{parentTag:l,...n});switch(l){case"h1":case"h2":case"h3":case"h4":case"h5":case"h6":const n=parseInt(l[1]);return`${c||"#".repeat(n)} ${s.trim()}\n\n`;case"strong":case"b":if(!s)return"";const r=c||"**";return`${r}${s}${r}`;case"em":case"i":if(!s)return"";const a=c||"*";return`${a}${s}${a}`;case"del":case"s":case"strike":if(!s)return"";const i=c||"~~";return`${i}${s}${i}`;case"code":if(!s)return"";const u=c||"`";return`${u}${s}${u}`;case"pre":const f=t.getAttribute("data-qd-fence")||c||"```",d=t.getAttribute("data-qd-lang")||"";if(e.fence_plugin&&e.fence_plugin.reverse&&d)try{const n=e.fence_plugin.reverse(t);if(n&&n.content){const t=n.fence||f;return`${t}${n.lang||d}\n${n.content}\n${t}\n\n`}}catch(t){console.warn("Fence reverse handler error:",t)}const $=t.getAttribute("data-qd-source");if($)return`${f}${d}\n${$}\n${f}\n\n`;const g=t.querySelector("code");return`${f}${d}\n${(g?g.textContent:s).trimEnd()}\n${f}\n\n`;case"blockquote":const p=c||">";return s.trim().split("\n").map(t=>`${p} ${t}`).join("\n")+"\n\n";case"hr":return`${c||"---"}\n\n`;case"br":return`${c||" "}\n`;case"a":{const e=t.getAttribute("href")||"";if(e.startsWith("#fnref-"))return"";const n=t.getAttribute("data-qd-ref");if(null!==n){const e=t.getAttribute("data-qd-text")||s.trim();return""===n?`[${e}][]`:n.toLowerCase()===e.toLowerCase()?`[${n}]`:`[${e}][${n}]`}const r=t.getAttribute("data-qd-text")||s.trim();return r!==e||c?`[${r}](${e})`:`<${e}>`}case"sup":{const e=t.getAttribute("data-qd-fn");return e?`[^${e}]`:s}case"section":if("[^section"===c){let e="";const n=t.querySelector("ol");if(n)for(const t of n.children){if("LI"!==t.tagName)continue;const n=t.getAttribute("data-qd-fn-id");if(!n)continue;let r="";for(const e of t.childNodes)if(e.nodeType===Node.TEXT_NODE)r+=e.textContent;else if(e.nodeType===Node.ELEMENT_NODE){if("A"===e.tagName&&(e.getAttribute("href")||"").startsWith("#fnref-"))continue;r+=e.textContent}e+=`[^${n}]: ${r.trim()}\n`}return e?"\n"+e:""}return s;case"img":return`${c||"!"}[${t.getAttribute("data-qd-alt")||t.getAttribute("alt")||""}](${t.getAttribute("data-qd-src")||t.getAttribute("src")||""})`;case"ul":case"ol":return o(t,"ol"===l)+"\n";case"li":case"span":default:return s;case"table":return function(t){let e="";const n=t.getAttribute("data-qd-align"),r=n?n.split(","):[],o=t.querySelector("thead");if(o){const t=o.querySelector("tr");if(t){const n=[];for(const e of t.querySelectorAll("th"))n.push(e.textContent.trim());e+="| "+n.join(" | ")+" |\n";e+="| "+n.map((t,e)=>{const n=r[e]||"left";return"center"===n?":---:":"right"===n?"---:":"---"}).join(" | ")+" |\n"}}const l=t.querySelector("tbody");if(l)for(const t of l.querySelectorAll("tr")){const n=[];for(const e of t.querySelectorAll("td"))n.push(e.textContent.trim());n.length>0&&(e+="| "+n.join(" | ")+" |\n")}return e.trim()}(t)+"\n\n";case"p":if(s.trim()){const t=s.split("\n");let e=s.trim();if(t.length>1){let n=0;for(let e=t.length-1;e>=0&&""===t[e].trim();e--)n++;if(n>0)return e+="\n ",e+"\n"}return e+"\n\n"}return"";case"div":const h=t.getAttribute("data-qd-lang"),m=t.getAttribute("data-qd-fence");if(h&&e.fence_plugin&&e.fence_plugin.reverse)try{const n=e.fence_plugin.reverse(t);if(n&&n.content){const t=n.fence||m||"```";return`${t}${n.lang||h}\n${n.content}\n${t}\n\n`}}catch(t){console.warn("Fence reverse handler error:",t)}const b=t.getAttribute("data-qd-source");if(b&&m)return`${m}${h||""}\n${b}\n${m}\n\n`;if(t.classList&&t.classList.contains("mermaid-container")){const e=t.getAttribute("data-qd-fence")||"```",n=t.getAttribute("data-qd-lang")||"mermaid",r=t.getAttribute("data-qd-source");if(r){const t=document.createElement("textarea");t.innerHTML=r;return`${e}${n}\n${t.value}\n${e}\n\n`}const o=t.querySelector("pre.mermaid");if(o){const t=o.getAttribute("data-qd-source");if(t){const r=document.createElement("textarea");r.innerHTML=t;return`${e}${n}\n${r.value}\n${e}\n\n`}}const l=t.querySelector(".mermaid-source");if(l){const t=document.createElement("div");t.innerHTML=l.innerHTML;return`${e}${n}\n${t.textContent}\n${e}\n\n`}const c=t.querySelector(".mermaid");if(c&&c.textContent.includes("graph"))return`${e}${n}\n${c.textContent.trim()}\n${e}\n\n`}if(t.classList&&t.classList.contains("mermaid")){const e=t.getAttribute("data-qd-fence")||"```";return`${e}${t.getAttribute("data-qd-lang")||"mermaid"}\n${t.textContent.trim()}\n${e}\n\n`}return s}}function o(t,e,n=0){let l="",c=1;const s=" ".repeat(n);for(const a of t.children){if("UL"===a.tagName||"OL"===a.tagName){l+=o(a,"OL"===a.tagName,n+1);continue}if("LI"!==a.tagName)continue;let t=a.getAttribute("data-qd")||(e?`${c}.`:"-");const i=a.querySelector('input[type="checkbox"]');if(i){const e=i.checked?"x":" ";t="-";const n="\n"+s+" ".repeat(t.length+5);let o="";for(const t of a.childNodes)t.nodeType===Node.TEXT_NODE?o+=t.textContent:t.tagName&&"INPUT"!==t.tagName&&(o+=r(t));l+=`${s}${t} [${e}] ${o.trim().replace(/\n/g,n)}\n`}else{const e="\n"+s+" ".repeat(t.length+1);let c="",i="";for(const t of a.childNodes)"UL"===t.tagName||"OL"===t.tagName?i+=o(t,"OL"===t.tagName,n+1):c+=r(t);l+=`${s}${t} ${c.trim().replace(/\n/g,e)}\n${i}`}c++}return l}let l=r(n);return l=l.replace(/\n{3,}/g,"\n\n"),l=l.trim(),l},N.configure=function(t){const e=y.configure({...t,bidirectional:!0});return function(t){return e(t)}},"undefined"!=typeof module&&module.exports&&(module.exports=N),"undefined"!=typeof window&&(window.quikdown_bd=N);export{N as default}; //# sourceMappingURL=quikdown_bd.esm.min.js.map