md-editor-rt
Version:
Markdown editor for react, developed in jsx and typescript, dark theme、beautify content by prettier、render articles directly、paste or clip the picture and upload it...
66 lines (65 loc) • 29.8 kB
JavaScript
;const j=require("react/jsx-runtime"),a=require("react"),h=require("./config.cjs"),P=require("./context.cjs"),de=require("./index2.cjs"),be=require("@vavt/copy2clipboard"),re=require("@vavt/util"),Ee=require("markdown-it"),xe=require("markdown-it-image-figures"),Ce=require("markdown-it-sub"),ve=require("markdown-it-sup"),u=require("./event-bus.cjs"),T=require("./dom.cjs"),$e=require("lru-cache"),ke=require("medium-zoom"),_={hljs:`${h.prefix}-hljs`,hlcss:`${h.prefix}-hlCss`,prettier:`${h.prefix}-prettier`,prettierMD:`${h.prefix}-prettierMD`,cropperjs:`${h.prefix}-cropper`,croppercss:`${h.prefix}-cropperCss`,screenfull:`${h.prefix}-screenfull`,mermaidM:`${h.prefix}-mermaid-m`,mermaid:`${h.prefix}-mermaid`,katexjs:`${h.prefix}-katex`,katexcss:`${h.prefix}-katexCss`,echarts:`${h.prefix}-echarts`},ye=(e,t,r)=>{const{editorId:n,usedLanguageText:s,customIcon:f,rootRef:c,setting:d}=a.useContext(P.EditorContext),{formatCopiedText:o=p=>p}=e;a.useEffect(()=>{d.preview&&c.current?.querySelectorAll(`#${n} .${h.prefix}-preview .${h.prefix}-code`).forEach(p=>{let i=-1;const l=p.querySelector(`.${h.prefix}-copy-button:not([data-processed])`);l&&(l.onclick=m=>{m.preventDefault(),clearTimeout(i);const g=(p.querySelector("input:checked + pre code")||p.querySelector("pre code")).textContent||"",{text:E,successTips:b,failTips:y}=s.copyCode;let x=b;be(o(g)).catch(()=>{x=y}).finally(()=>{l.dataset.isIcon?l.dataset.tips=x:l.innerHTML=x,i=window.setTimeout(()=>{l.dataset.isIcon?l.dataset.tips=E:l.innerHTML=E},1500)})},l.setAttribute("data-processed","true"))})},[f,n,o,t,r,d.preview,c,s.copyCode])},we=e=>{const{editorId:t,theme:r,rootRef:n}=a.useContext(P.EditorContext),s=a.useRef(h.globalConfig.editorExtensions.echarts?.instance),[f,c]=a.useState(0),d=a.useRef([]),o=a.useRef([]),p=a.useRef([]),i=a.useCallback(()=>{!e.noEcharts&&s.current&&c(C=>C+1)},[e.noEcharts]);a.useEffect(()=>{i()},[r,i]),a.useEffect(()=>{if(e.noEcharts||s.current)return;const{editorExtensions:C,editorExtensionsAttrs:g}=h.globalConfig,E=C.echarts.js;T.appendHandler("script",{...g.echarts?.js,src:E,id:_.echarts,onload(){s.current=window.echarts,i()}},"echarts")},[e.noEcharts,i]);const l=a.useCallback((C=!1)=>{const g=p.current;if(!g.length){C&&(d.current.forEach(x=>x?.dispose?.()),o.current.forEach(x=>x?.disconnect?.()),d.current=[],o.current=[],p.current=[]);return}const E=[],b=[],y=[];g.forEach((x,k)=>{const I=d.current[k],v=o.current[k];if(C||!x||!x.isConnected||(n?.current?!n.current.contains(x):!1)){I?.dispose?.(),v?.disconnect?.();return}E.push(x),I&&b.push(I),v&&y.push(v)}),p.current=E,d.current=b,o.current=y},[n]),m=a.useCallback(()=>{l(),!e.noEcharts&&s.current&&n?.current&&Array.from(n.current.querySelectorAll(`#${t} div.${h.prefix}-echarts:not([data-processed])`)).forEach(g=>{if(g.dataset.closed!=="false")try{const E=new Function(`return ${g.innerText}`)(),b=s.current.init(g,r);b.setOption(E),g.setAttribute("data-processed",""),p.current.push(g),d.current.push(b);const y=new ResizeObserver(()=>{b.resize()});y.observe(g),o.current.push(y)}catch(E){u.bus.emit(t,u.ERROR_CATCHER,{name:"echarts",message:E?.message,error:E})}})},[e.noEcharts,n,t,r,l]);return a.useEffect(()=>()=>{l(!0)},[l]),{reRenderEcharts:f,replaceEcharts:m}},Ie=e=>{const{highlight:t}=a.useContext(P.EditorContext),r=a.useRef(h.globalConfig.editorExtensions.highlight.instance),[n,s]=a.useState(!!r.current);return a.useEffect(()=>{e.noHighlight||h.globalConfig.editorExtensions.highlight.instance||T.updateHandler("link",{...t.css,rel:"stylesheet",id:_.hlcss})},[t.css,e.noHighlight]),a.useEffect(()=>{e.noHighlight||r.current||T.appendHandler("script",{...t.js,id:_.hljs,onload(){r.current=window.hljs,s(!0)}},"hljs")},[]),{hljsRef:r,hljsInited:n}},Re=e=>{const t=a.useRef(h.globalConfig.editorExtensions.katex.instance),[r,n]=a.useState(!!t.current);return a.useEffect(()=>{if(e.noKatex||t.current)return;const{editorExtensions:s,editorExtensionsAttrs:f}=h.globalConfig;T.appendHandler("script",{...f.katex?.js,src:s.katex.js,id:_.katexjs,onload(){t.current=window.katex,n(!0)}},"katex"),T.appendHandler("link",{...f.katex?.css,rel:"stylesheet",href:s.katex.css,id:_.katexcss})},[e.noKatex]),{katexRef:t,katexInited:r}},Q=new $e.LRUCache({max:1e3,ttl:6e5}),Se=e=>{const{editorId:t,theme:r,rootRef:n}=a.useContext(P.EditorContext),{noMermaid:s,sanitizeMermaid:f}=e,c=a.useRef(h.globalConfig.editorExtensions.mermaid.instance),[d,o]=a.useState(-1),p=a.useCallback(()=>{Q.clear();const l=c.current;!s&&l&&(l.initialize(h.globalConfig.mermaidConfig({startOnLoad:!1,theme:r==="dark"?"dark":"default"})),o(m=>m+1))},[s,r]);a.useEffect(p,[p]),a.useEffect(()=>{const{editorExtensions:l,editorExtensionsAttrs:m}=h.globalConfig;if(s||c.current)return;const C=l.mermaid.js;/\.mjs/.test(C)?(T.appendHandler("link",{...m.mermaid?.js,rel:"modulepreload",href:C,id:_.mermaidM}),import(C).then(g=>{c.current=g.default,p()}).catch(g=>{u.bus.emit(t,u.ERROR_CATCHER,{name:"mermaid",message:`Failed to load mermaid module: ${g.message}`,error:g})})):T.appendHandler("script",{...m.mermaid?.js,src:C,id:_.mermaid,onload(){c.current=window.mermaid,p()}},"mermaid")},[p,t,s]);const i=a.useCallback(async()=>{if(!s&&c.current){const l=n.current?.querySelectorAll(`div.${h.prefix}-mermaid`)||[],m=document.createElement("div"),C=document.body.offsetWidth>1366?document.body.offsetWidth:1366,g=document.body.offsetHeight>768?document.body.offsetHeight:768;m.style.width=C+"px",m.style.height=g+"px",m.style.position="fixed",m.style.zIndex="-10000",m.style.top="-10000";let E=l.length;E>0&&document.body.appendChild(m),await Promise.allSettled(Array.from(l).map(b=>(async x=>{if(x.dataset.closed==="false")return!1;const k=x.innerText;let I=Q.get(k);if(!I){const v=re.randomId();let S={svg:""};try{S=await c.current.render(v,k,m),I=await f(S.svg);const w=document.createElement("p");w.className=`${h.prefix}-mermaid`,w.setAttribute("data-processed",""),w.setAttribute("data-content",k),w.innerHTML=I,w.children[0]?.removeAttribute("height"),Q.set(k,w.innerHTML),x.dataset.line!==void 0&&(w.dataset.line=x.dataset.line),x.replaceWith(w)}catch(w){u.bus.emit(t,u.ERROR_CATCHER,{name:"mermaid",message:w.message,error:w})}--E===0&&m.remove()}})(b)))}},[t,s,n,f]);return{reRender:d,replaceMermaid:i}},Ae=(e,t)=>{t=t||{};const r=3,n=t.marker||"!",s=n.charCodeAt(0),f=n.length;let c="",d="";const o=(i,l,m,C,g)=>{const E=i[l];return E.type==="admonition_open"?i[l].attrPush(["class",`${h.prefix}-admonition ${h.prefix}-admonition-${E.info}`]):E.type==="admonition_title_open"&&i[l].attrPush(["class",`${h.prefix}-admonition-title`]),g.renderToken(i,l,m)},p=i=>{const l=i.trim().split(" ",2);d="",c=l[0],l.length>1&&(d=i.substring(c.length+2))};e.block.ruler.before("code","admonition",(i,l,m,C)=>{let g,E,b,y=!1,x=i.bMarks[l]+i.tShift[l],k=i.eMarks[l];if(s!==i.src.charCodeAt(x))return!1;for(g=x+1;g<=k&&n[(g-x)%f]===i.src[g];g++);const I=Math.floor((g-x)/f);if(I!==r)return!1;g-=(g-x)%f;const v=i.src.slice(x,g),S=i.src.slice(g,k);if(p(S),C)return!0;for(E=l;E++,!(E>=m||(x=i.bMarks[E]+i.tShift[E],k=i.eMarks[E],x<k&&i.sCount[E]<i.blkIndent));)if(s===i.src.charCodeAt(x)&&!(i.sCount[E]-i.blkIndent>=4)){for(g=x+1;g<=k&&n[(g-x)%f]===i.src[g];g++);if(!(Math.floor((g-x)/f)<I)&&(g-=(g-x)%f,g=i.skipSpaces(g),!(g<k))){y=!0;break}}const w=i.parentType,R=i.lineMax;return i.parentType="root",i.lineMax=E,b=i.push("admonition_open","div",1),b.markup=v,b.block=!0,b.info=c,b.map=[l,E],d&&(b=i.push("admonition_title_open","p",1),b.markup=v+" "+c,b.map=[l,E],b=i.push("inline","",0),b.content=d,b.map=[l,i.line-1],b.children=[],b=i.push("admonition_title_close","p",-1),b.markup=v+" "+c),i.md.block.tokenize(i,l+1,E),b=i.push("admonition_close","div",-1),b.markup=i.src.slice(x,g),b.block=!0,i.parentType=w,i.lineMax=R,i.line=E+(y?1:0),!0},{alt:["paragraph","reference","blockquote","list"]}),e.renderer.rules.admonition_open=o,e.renderer.rules.admonition_title_open=o,e.renderer.rules.admonition_title_close=o,e.renderer.rules.admonition_close=o},se=(e,t)=>{const r=e.attrs?e.attrs.slice():[];return t.forEach(n=>{const s=e.attrIndex(n[0]);s<0?r.push(n):(r[s]=r[s].slice(),r[s][1]+=` ${n[1]}`)}),r},Te=(e,t)=>{const r=e.renderer.rules.fence,n=e.utils.unescapeAll,s=/\[(\w*)(?::([\w ]*))?\]/,f=/::(open|close)/,c=l=>l.info?n(l.info).trim():"",d=l=>{const m=c(l),[C=null,g=""]=(s.exec(m)||[]).slice(1);return[C,g]},o=l=>{const m=c(l);return m?m.split(/(\s+)/g)[0]:""},p=l=>{const m=l.info.match(f)||[],C=m[1]==="open"||m[1]!=="close"&&t.codeFoldable&&l.content.trim().split(`
`).length<t.autoFoldThreshold,g=m[1]||t.codeFoldable?"details":"div",E=m[1]||t.codeFoldable?"summary":"div";return{open:C,tagContainer:g,tagHeader:E}},i=(l,m,C,g,E)=>{if(l[m].hidden)return"";const b=t.usedLanguageTextRef.current.copyCode.text,y=t.customIconRef.current.copy||b,x=!!t.customIconRef.current.copy,k=`<span class="${h.prefix}-collapse-tips">${T.StrIcon("collapse-tips",t.customIconRef.current)}</span>`,[I]=d(l[m]);if(I===null){const{open:A,tagContainer:L,tagHeader:N}=p(l[m]),D=[["class",`${h.prefix}-code`]];A&&D.push(["open",""]);const W={attrs:se(l[m],D)};l[m].info=l[m].info.replace(f,"");const te=r(l,m,C,g,E);return`
<${L} ${E.renderAttrs(W)}>
<${N} class="${h.prefix}-code-head">
<div class="${h.prefix}-code-flag"><span></span><span></span><span></span></div>
<div class="${h.prefix}-code-action">
<span class="${h.prefix}-code-lang">${e.utils.escapeHtml(l[m].info.trim())}</span>
<span class="${h.prefix}-copy-button" data-tips="${b}"${x?" data-is-icon=true":""}>${y}</span>
${t.extraTools instanceof Function?t.extraTools({lang:l[m].info.trim()}):t.extraTools||""}
${L==="details"?k:""}
</div>
</${N}>
${te}
</${L}>
`}let v,S,w,R,F="",U="",O="";const{open:G,tagContainer:q,tagHeader:J}=p(l[m]),V=[["class",`${h.prefix}-code`]];G&&V.push(["open",""]);const ee={attrs:se(l[m],V)};for(let A=m;A<l.length&&(v=l[A],[S,w]=d(v),S===I);A++){v.info=v.info.replace(s,"").replace(f,""),v.hidden=!0;const L=`${h.prefix}-codetab-${t.editorId}-${m}-${A-m}`;R=A-m>0?"":"checked",F+=`
<li>
<input
type="radio"
id="label-${h.prefix}-codetab-label-1-${t.editorId}-${m}-${A-m}"
name="${h.prefix}-codetab-label-${t.editorId}-${m}"
class="${L}"
${R}
>
<label
for="label-${h.prefix}-codetab-label-1-${t.editorId}-${m}-${A-m}"
onclick="this.getRootNode().querySelectorAll('.${L}').forEach(e => e.click())"
>
${e.utils.escapeHtml(w||o(v))}
</label>
</li>`,U+=`
<div role="tabpanel">
<input
type="radio"
name="${h.prefix}-codetab-pre-${t.editorId}-${m}"
class="${L}"
${R}
role="presentation">
${r(l,A,C,g,E)}
</div>`,O+=`
<input
type="radio"
name="${h.prefix}-codetab-lang-${t.editorId}-${m}"
class="${L}"
${R}
role="presentation">
<span class=${h.prefix}-code-lang role="note">${e.utils.escapeHtml(o(v))}</span>`}return`
<${q} ${E.renderAttrs(ee)}>
<${J} class="${h.prefix}-code-head">
<div class="${h.prefix}-code-flag">
<ul class="${h.prefix}-codetab-label" role="tablist">${F}</ul>
</div>
<div class="${h.prefix}-code-action">
<span class="${h.prefix}-codetab-lang">${O}</span>
<span class="${h.prefix}-copy-button" data-tips="${b}"${x?" data-is-icon=true":""}>${y}</span>
${t.extraTools instanceof Function?t.extraTools({lang:l[m].info.trim()}):t.extraTools||""}
${q==="details"?k:""}
</div>
</${J}>
${U}
</${q}>
`};e.renderer.rules.fence=i,e.renderer.rules.code_block=i},He=(e,t)=>{const r=e.renderer.rules.fence.bind(e.renderer.rules);e.renderer.rules.fence=(n,s,f,c,d)=>{const o=n[s],p=o.content.trim();if(o.info==="echarts"){if(o.attrSet("class",`${h.prefix}-echarts`),o.attrSet("data-echarts-theme",t.themeRef.current),o.map&&o.level===0){const i=o.map[1]-1,m=!!c.srcLines[i]?.trim()?.startsWith("```");o.attrSet("data-closed",`${m}`),o.attrSet("data-line",String(o.map[0]))}return`<div ${d.renderAttrs(o)} style="width: 100%; aspect-ratio: 4 / 3;">${e.utils.escapeHtml(p)}</div>`}return r(n,s,f,c,d)}},_e=(e,t)=>{e.renderer.rules.heading_open=(r,n)=>{const s=r[n],f=r[n+1].children?.reduce((d,o)=>d+(["text","code_inline","math_inline"].includes(o.type)&&o.content||""),"")||"",c=s.markup.length;return t.headsRef.current.push({text:f,level:c,line:s.map[0],currentToken:s,nextToken:r[n+1]}),s.map&&s.level===0&&s.attrSet("id",t.mdHeadingId({text:f,level:c,index:t.headsRef.current.length,currentToken:s,nextToken:r[n+1]})),e.renderer.renderToken(r,n,t)},e.renderer.rules.heading_close=(r,n,s,f,c)=>c.renderToken(r,n,s)},ce={block:[{open:"$$",close:"$$"},{open:"\\[",close:"\\]"}],inline:[{open:"$$",close:"$$"},{open:"$",close:"$"},{open:"\\[",close:"\\]"},{open:"\\(",close:"\\)"}]},Le=e=>(t,r)=>{const n=e.delimiters;for(const s of n){if(!t.src.startsWith(s.open,t.pos))continue;const f=t.pos+s.open.length;let c=f;for(;(c=t.src.indexOf(s.close,c))!==-1;){let d=0,o=c-1;for(;o>=0&&t.src[o]==="\\";)d++,o--;if(d%2===0)break;c+=s.close.length}if(c!==-1){if(c-f===0)return r||(t.pending+=s.open+s.close),t.pos=c+s.close.length,!0;if(!r){const d=t.push("math_inline","math",0);d.markup=s.open,d.content=t.src.slice(f,c)}return t.pos=c+s.close.length,!0}}return!1},Pe=e=>(t,r,n,s)=>{const f=e.delimiters,c=t.bMarks[r]+t.tShift[r],d=t.eMarks[r],o=(p,i,l)=>{t.line=i;const m=t.push("math_block","math",0);return m.block=!0,m.content=p,m.map=[r,t.line],m.markup=l,!0};for(const p of f){const i=c;if(t.src.slice(i,i+p.open.length)!==p.open)continue;const l=i+p.open.length,m=t.src.slice(l,d).trim(),C=m==="",g=m===p.close,E=m.endsWith(p.close);if(!C&&!g&&!E)continue;if(s)return!0;if(g)return o("",r+1,p.open);if(!C&&E){const v=m.slice(0,-p.close.length);return o(v,r+1,p.open)}let b=r+1,y=!1,x="";for(;b<n;b++){const v=t.bMarks[b]+t.tShift[b],S=t.eMarks[b];if(v<S&&t.tShift[b]<t.blkIndent)break;if(t.src.slice(v,S).trim().endsWith(p.close)){const R=t.src.slice(0,S).lastIndexOf(p.close);x=t.src.slice(v,R),y=!0;break}}if(!y)continue;const I=t.getLines(r+1,b,t.tShift[r],!0)+(x.trim()?x:"");return o(I,b+1,p.open)}return!1},Me=(e,{katexRef:t,inlineDelimiters:r,blockDelimiters:n})=>{const s=(d,o,p,i,l=!1)=>{const m={attrs:se(d,[["class",o]])},C=i.renderAttrs(m);if(!t.current)return`<${p} ${C}>${d.content}</${p}>`;const g=t.current.renderToString(d.content,h.globalConfig.katexConfig({throwOnError:!1,displayMode:l}));return`<${p} ${C} data-processed>${g}</${p}>`},f=(d,o,p,i,l)=>s(d[o],`${h.prefix}-katex-inline`,"span",l),c=(d,o,p,i,l)=>s(d[o],`${h.prefix}-katex-block`,"p",l,!0);e.inline.ruler.before("escape","math_inline",Le({delimiters:r||ce.inline})),e.block.ruler.after("blockquote","math_block",Pe({delimiters:n||ce.block}),{alt:["paragraph","reference","blockquote","list"]}),e.renderer.rules.math_inline=f,e.renderer.rules.math_block=c},Oe=(e,t)=>{const r=e.renderer.rules.fence.bind(e.renderer.rules);e.renderer.rules.fence=(n,s,f,c,d)=>{const o=n[s],p=o.content.trim();if(o.info==="mermaid"){if(o.attrSet("class",`${h.prefix}-mermaid`),o.attrSet("data-mermaid-theme",t.themeRef.current),o.map&&o.level===0){const l=o.map[1]-1,C=!!c.srcLines[l]?.trim()?.startsWith("```");o.attrSet("data-closed",`${C}`),o.attrSet("data-line",String(o.map[0]))}const i=Q.get(p);return i?(o.attrSet("data-processed",""),o.attrSet("data-content",p),`<p ${d.renderAttrs(o)}>${i}</p>`):`<div ${d.renderAttrs(o)}>${e.utils.escapeHtml(p)}</div>`}return r(n,s,f,c,d)}},ie=(e,t,r)=>{const n=e.attrIndex(t),s=[t,r];n<0?e.attrPush(s):(e.attrs=e.attrs||[],e.attrs[n]=s)},Ne=e=>e.type==="inline",De=e=>e.type==="paragraph_open",je=e=>e.type==="list_item_open",Fe=e=>e.content.indexOf("[ ] ")===0||e.content.indexOf("[x] ")===0||e.content.indexOf("[X] ")===0,Ge=(e,t)=>Ne(e[t])&&De(e[t-1])&&je(e[t-2])&&Fe(e[t]),qe=(e,t)=>{const r=e[t].level-1;for(let n=t-1;n>=0;n--)if(e[n].level===r)return n;return-1},Ue=e=>{const t=new e("html_inline","",0);return t.content="<label>",t},Ve=e=>{const t=new e("html_inline","",0);return t.content="</label>",t},We=(e,t,r)=>{const n=new r("html_inline","",0);return n.content='<label class="task-list-item-label" for="'+t+'">'+e+"</label>",n.attrs=[{for:t}],n},ze=(e,t,r)=>{const n=new t("html_inline","",0),s=r.enabled?" ":' disabled="" ';return e.content.indexOf("[ ] ")===0?n.content='<input class="task-list-item-checkbox"'+s+'type="checkbox">':(e.content.indexOf("[x] ")===0||e.content.indexOf("[X] ")===0)&&(n.content='<input class="task-list-item-checkbox" checked=""'+s+'type="checkbox">'),n},Be=(e,t,r)=>{if(e.children=e.children||[],e.children.unshift(ze(e,t,r)),e.children[1].content=e.children[1].content.slice(3),e.content=e.content.slice(3),r.label)if(r.labelAfter){e.children.pop();const n="task-item-"+Math.ceil(Math.random()*(1e4*1e3)-1e3);e.children[0].content=e.children[0].content.slice(0,-1)+' id="'+n+'">',e.children.push(We(e.content,n,t))}else e.children.unshift(Ue(t)),e.children.push(Ve(t))},Ke=(e,t={})=>{e.core.ruler.after("inline","github-task-lists",r=>{const n=r.tokens;for(let s=2;s<n.length;s++)Ge(n,s)&&(Be(n[s],r.Token,t),ie(n[s-2],"class","task-list-item"+(t.enabled?" enabled":" ")),ie(n[qe(n,s-2)],"class","contains-task-list"))})},Ze=e=>{e.core.ruler.push("init-line-number",t=>(t.tokens.forEach(r=>{r.map&&(r.attrs||(r.attrs=[]),r.attrs.push(["data-line",r.map[0].toString()]))}),!0))},Je=(e,t)=>{const{modelValue:r,sanitize:n,mdHeadingId:s,codeFoldable:f,autoFoldThreshold:c,noKatex:d,noMermaid:o,noHighlight:p,onHtmlChanged:i,onGetCatalog:l}=e,{editorConfig:m,markdownItConfig:C,markdownItPlugins:g,editorExtensions:E}=h.globalConfig,{editorId:b,language:y,showCodeRowNumber:x,theme:k,usedLanguageText:I,customIcon:v,rootRef:S,setting:w}=a.useContext(P.EditorContext),R=a.useRef([]),F=a.useRef(k);a.useEffect(()=>{F.current=k},[k]);const U=a.useRef(I);a.useEffect(()=>{U.current=I},[I]);const O=a.useRef(v);a.useEffect(()=>{O.current=v},[v]);const{hljsRef:G,hljsInited:q}=Ie(e),{katexRef:J,katexInited:V}=Re(e),{reRender:ee,replaceMermaid:A}=Se(e),{reRenderEcharts:L,replaceEcharts:N}=we(e),[D]=a.useState(()=>{const $=Ee({html:!0,breaks:!0,linkify:!0});C($,{editorId:b});const H=[{type:"image",plugin:xe,options:{figcaption:!0,classes:"md-zoom"}},{type:"admonition",plugin:Ae,options:{}},{type:"taskList",plugin:Ke,options:{}},{type:"heading",plugin:_e,options:{mdHeadingId:s,headsRef:R}},{type:"code",plugin:Te,options:{editorId:b,usedLanguageTextRef:U,codeFoldable:f,autoFoldThreshold:c,customIconRef:O}},{type:"sub",plugin:Ce,options:{}},{type:"sup",plugin:ve,options:{}}];d||H.push({type:"katex",plugin:Me,options:{katexRef:J}}),o||H.push({type:"mermaid",plugin:Oe,options:{themeRef:F}}),e.noEcharts||H.push({type:"echarts",plugin:He,options:{themeRef:F}}),g(H,{editorId:b}).forEach(M=>{$.use(M.plugin,M.options)});const B=$.options.highlight;return $.set({highlight:(M,K,he)=>{if(B){const ne=B(M,K,he);if(ne)return ne}let Z;!p&&G.current?G.current.getLanguage(K)?Z=G.current.highlight(M,{language:K,ignoreIllegals:!0}).value:Z=G.current.highlightAuto(M).value:Z=D.utils.escapeHtml(M);const ge=x?de.generateCodeRowNumber(Z.replace(/^\n+|\n+$/g,""),M.replace(/^\n+|\n+$/g,"")):`<span class="${h.prefix}-code-block">${Z.replace(/^\n+|\n+$/g,"")}</span>`;return`<pre><code class="language-${K}" language=${K}>${ge}</code></pre>`}}),Ze($),$}),[W,te]=a.useState(`_article-key_${re.randomId()}`),[z,pe]=a.useState(()=>(R.current=[],n(D.render(r,{srcLines:r.split(`
`)})))),me=a.useMemo(()=>(p||q)&&(d||V),[q,V,p,d]),oe=a.useRef(!0),X=a.useCallback(()=>{R.current=[];const $=n(D.render(r,{srcLines:r.split(`
`)}));pe($)},[D,r,n]),Y=a.useCallback(()=>{let $=()=>{},H=()=>{};const B=S.current?.querySelectorAll(`#${b} p.${h.prefix}-mermaid:not([data-closed=false])`);return H=T.copyMermaid(B,{customIcon:O.current}),E.mermaid?.enableZoom&&($=T.zoomMermaid(B,{customIcon:O.current})),[$,H]},[E.mermaid?.enableZoom,b,S]);return a.useEffect(()=>{u.bus.emit(b,u.BUILD_FINISHED,z),i?.(z),l?.(R.current),u.bus.emit(b,u.CATALOG_CHANGED,R.current)},[b,z,W,l,i]),a.useEffect(()=>{let $=()=>{},H=()=>{};return w.preview&&(A().then(()=>{[$,H]=Y()}),N(),u.bus.emit(b,u.CATALOG_CHANGED,R.current)),()=>{$(),H()}},[b,Y,N,A,w.preview]),a.useEffect(()=>{if(oe.current){oe.current=!1;return}const $=setTimeout(()=>{X()},t?0:m.renderDelay);return()=>{clearTimeout($)}},[me,k,X,y,t,m.renderDelay]),a.useEffect(()=>{let $=()=>{},H=()=>{};return A().then(()=>{[$,H]=Y()}),N(),()=>{$(),H()}},[Y,z,W,ee,A,L,N]),a.useEffect(()=>{const $=()=>{u.bus.emit(b,u.CATALOG_CHANGED,R.current)};return u.bus.on(b,{name:u.PUSH_CATALOG,callback:$}),()=>{u.bus.remove(b,u.PUSH_CATALOG,$)}},[b]),a.useEffect(()=>{const $=()=>{te(`_article-key_${re.randomId()}`),X()};return u.bus.on(b,{name:u.RERENDER,callback:$}),()=>{u.bus.remove(b,u.RERENDER,$)}},[b,X]),{html:z,key:W}},Xe=(e,t)=>{const{editorId:r,setting:n}=a.useContext(P.EditorContext);a.useEffect(()=>e.noImgZoomIn?void 0:(()=>{const f=document.querySelectorAll(`#${r}-preview img:not(.not-zoom):not(.medium-zoom-image)`),c=ke(f,{background:"#00000073"});return()=>{c.detach()}})(),[r,t,e.noImgZoomIn,n])},le={checked:{regexp:/- \[x\]/,value:"- [ ]"},unChecked:{regexp:/- \[\s\]/,value:"- [x]"}},Ye=(e,t)=>{const{editorId:r,rootRef:n}=a.useContext(P.EditorContext);a.useEffect(()=>{const s=n.current?.querySelectorAll(".task-list-item.enabled")||[],f=c=>{c.preventDefault();const d=c.target.checked?"unChecked":"checked",o=c.target.parentElement?.dataset.line;if(!o)return;const p=Number(o),i=e.modelValue.split(`
`),l=i[Number(p)].replace(le[d].regexp,le[d].value);e.previewOnly?(i[Number(p)]=l,e.onChange(i.join(`
`))):u.bus.emit(r,u.TASK_STATE_CHANGED,p+1,l)};return s.forEach(c=>{c.addEventListener("click",f)}),()=>{s.forEach(c=>{c.removeEventListener("click",f)})}},[r,t,e,n])},Qe=(e,t,r)=>{const{onRemount:n}=e,{setting:s}=a.useContext(P.EditorContext);a.useEffect(()=>{n?.()},[t,r,n]),a.useEffect(()=>{(s.preview||s.htmlPreview)&&n?.()},[s.preview,s.htmlPreview,n])},ae=e=>{const r=new DOMParser().parseFromString(e,"text/html");return Array.from(r.body.childNodes)},et=(e,t)=>e.nodeType!==t.nodeType?!1:e.nodeType===Node.TEXT_NODE||e.nodeType===Node.COMMENT_NODE?e.textContent===t.textContent:e.nodeType===Node.ELEMENT_NODE?e.outerHTML===t.outerHTML:e.isEqualNode?e.isEqualNode(t):!1,tt=(e,t,r)=>{const n=Array.from(e.childNodes),s=Math.min(t.length,r.length);let f=-1;for(let d=0;d<s;d+=1)if(!et(t[d],r[d])){f=d;break}if(f===-1)if(r.length>t.length)f=t.length;else if(t.length>r.length)f=r.length;else return;const c=Math.min(f,n.length);for(let d=n.length-1;d>=c;d-=1)n[d].remove();for(let d=f;d<t.length;d+=1)e.appendChild(t[d].cloneNode(!0))},nt=({html:e,id:t,className:r})=>{const n=a.useRef(null),s=a.useRef({__html:e}),f=a.useRef(e);return a.useEffect(()=>{const c=n.current;if(!c)return;const d=f.current;if(d===e)return;const o=ae(e),p=ae(d);tt(c,o,p),f.current=e},[e]),j.jsx("div",{id:t,className:r,dangerouslySetInnerHTML:s.current,ref:n})},rt=a.memo(nt),st=e=>{const{previewOnly:t=!1,setting:r={preview:!0},previewComponent:n=rt}=e,{editorId:s,previewTheme:f,showCodeRowNumber:c}=a.useContext(P.EditorContext),{html:d,key:o}=Je(e,!!t);ye(e,d,o),Xe(e,d),Ye(e,d),Qe(e,d,o);const p=a.useMemo(()=>j.jsx(n,{html:d,id:`${s}-preview`,className:de.classnames([`${h.prefix}-preview`,`${f||"default"}-theme`,c&&`${h.prefix}-scrn`])},o),[n,s,d,o,f,c]);return j.jsxs(j.Fragment,{children:[r.preview&&(t?p:j.jsx("div",{id:`${s}-preview-wrapper`,className:`${h.prefix}-preview-wrapper`,children:p},"content-preview-wrapper")),r.htmlPreview&&j.jsx("div",{id:`${s}-html-wrapper`,className:`${h.prefix}-preview-wrapper`,children:j.jsx("div",{className:`${h.prefix}-html`,children:d})},"html-preview-wrapper")]})},ot=a.memo(st),ct=(e,t)=>{const{value:r,modelValue:n,onSave:s}=e,{editorId:f}=t,[c,d]=a.useState({buildFinished:!1,html:""});a.useEffect(()=>{const o=p=>{d(()=>({buildFinished:!0,html:p}))};return u.bus.on(f,{name:u.BUILD_FINISHED,callback:o}),()=>{u.bus.remove(f,u.BUILD_FINISHED,o)}},[f]),a.useEffect(()=>{const o=()=>{if(s){const p=new Promise(i=>{if(c.buildFinished)i(c.html);else{const l=m=>{i(m),u.bus.remove(f,u.BUILD_FINISHED,l)};u.bus.on(f,{name:u.BUILD_FINISHED,callback:l})}});s(r||n||"",p)}};return u.bus.on(f,{name:u.ON_SAVE,callback:o}),()=>{u.bus.remove(f,u.ON_SAVE,o)}},[f,n,s,c.buildFinished,c.html,r]),a.useEffect(()=>{d(o=>({...o,buildFinished:!1}))},[r,n])},it=e=>{const{noPrettier:t,noUploadImg:r}=e;a.useEffect(()=>{const{editorExtensions:n,editorExtensionsAttrs:s}=h.globalConfig,f=t||!!n.prettier.prettierInstance,c=t||!!n.prettier.parserMarkdownInstance;if(!(r||!!n.cropper.instance)){const{js:o={},css:p={}}=s.cropper||{};T.appendHandler("link",{...p,rel:"stylesheet",href:n.cropper.css,id:_.croppercss}),T.appendHandler("script",{...o,src:n.cropper.js,id:_.cropperjs})}if(!f){const{standaloneJs:o={}}=s.prettier||{};T.appendHandler("script",{...o,src:n.prettier.standaloneJs,id:_.prettier})}if(!c){const{parserMarkdownJs:o={}}=s.prettier||{};T.appendHandler("script",{...o,src:n.prettier.parserMarkdownJs,id:_.prettierMD})}},[t,r])},lt=(e,t)=>{a.useEffect(()=>(u.bus.on(e,{name:u.ERROR_CATCHER,callback:t}),()=>{u.bus.remove(e,u.ERROR_CATCHER,t)}),[e,t])},at=(e,t)=>{const{editorId:r}=t,{onUploadImg:n}=e;a.useEffect(()=>{const s=(f,c)=>{n?.(f,o=>{u.bus.emit(r,u.REPLACE,"image",{desc:"",urls:o}),c?.()})};return u.bus.on(r,{name:u.UPLOAD_IMAGE,callback:s}),()=>{u.bus.remove(r,u.UPLOAD_IMAGE,s)}},[r,n])},ut=(e,t)=>{const{editorId:r}=t,[n,s]=a.useState(!1);return a.useEffect(()=>{const f=c=>{s(c===void 0?d=>!d:c)};return u.bus.on(r,{name:u.CHANGE_CATALOG_VISIBLE,callback:f}),()=>{u.bus.remove(r,u.CHANGE_CATALOG_VISIBLE,f)}},[r]),n};let ue="";const fe=e=>{const{theme:t=h.defaultProps.theme,previewTheme:r=h.defaultProps.previewTheme,codeTheme:n=h.defaultProps.codeTheme,language:s=h.defaultProps.language,codeStyleReverse:f=h.defaultProps.codeStyleReverse,codeStyleReverseList:c=h.defaultProps.codeStyleReverseList}=e,d=a.useMemo(()=>{const p=h.globalConfig.editorExtensions.highlight,i=h.globalConfig.editorExtensionsAttrs.highlight,{js:l}=p,m={...h.codeCss,...p.css},{js:C,css:g={}}=i||{},E=f&&c.includes(r)?"dark":t,b=m[n]?m[n][E]:h.codeCss.atom[E],y=m[n]&&g[n]?g[n][E]:g.atom?g.atom[E]:{};return{js:{src:l,...C},css:{href:b,...y}}},[f,c,r,t,n]),o=a.useMemo(()=>{const p={...h.staticTextDefault,...h.globalConfig.editorConfig.languageUserDefined};return p[s]?p[s]:h.staticTextDefault["zh-CN"]},[s]);return[d,o]},dt=e=>{const{preview:t=h.defaultProps.preview,htmlPreview:r=h.defaultProps.htmlPreview,pageFullscreen:n=h.defaultProps.pageFullscreen}=e,[s,f]=fe(e),[c,d]=a.useState({pageFullscreen:n,fullscreen:!1,preview:t,htmlPreview:t?!1:r,previewOnly:!1}),o=a.useRef(c),p=a.useCallback((i,l)=>{d(m=>{const C=l===void 0?!m[i]:l,g={...m};switch(i){case"preview":{g.htmlPreview=!1,g.previewOnly=!1;break}case"htmlPreview":{g.preview=!1,g.previewOnly=!1;break}case"previewOnly":{C?!g.preview&&!g.htmlPreview&&(g.preview=!0):(o.current.preview||(g.preview=!1),o.current.htmlPreview||(g.htmlPreview=!1));break}}return o.current[i]=C,g[i]=C,g})},[]);return a.useEffect(()=>{ue=document.body.style.overflow},[]),a.useEffect(()=>{c.pageFullscreen||c.fullscreen?document.body.style.overflow="hidden":document.body.style.overflow=ue},[c.pageFullscreen,c.fullscreen]),[s,f,c,p]},ft=(e,t,r,n,s,f)=>{const{editorId:c}=t;a.useEffect(()=>{u.bus.emit(c,u.PAGE_FULL_SCREEN_CHANGED,n.pageFullscreen)},[c,n.pageFullscreen]),a.useEffect(()=>{u.bus.emit(c,u.FULL_SCREEN_CHANGED,n.fullscreen)},[c,n.fullscreen]),a.useEffect(()=>{u.bus.emit(c,u.PREVIEW_CHANGED,n.preview)},[c,n.preview]),a.useEffect(()=>{u.bus.emit(c,u.PREVIEW_ONLY_CHANGED,n.previewOnly)},[c,n.previewOnly]),a.useEffect(()=>{u.bus.emit(c,u.HTML_PREVIEW_CHANGED,n.htmlPreview)},[c,n.htmlPreview]),a.useEffect(()=>{u.bus.emit(c,u.CATALOG_VISIBLE_CHANGED,r)},[r,c]),a.useImperativeHandle(e,()=>({on(o,p){switch(o){case"pageFullscreen":{u.bus.on(c,{name:u.PAGE_FULL_SCREEN_CHANGED,callback(i){p(i)}});break}case"fullscreen":{u.bus.on(c,{name:u.FULL_SCREEN_CHANGED,callback(i){p(i)}});break}case"preview":{u.bus.on(c,{name:u.PREVIEW_CHANGED,callback(i){p(i)}});break}case"previewOnly":{u.bus.on(c,{name:u.PREVIEW_ONLY_CHANGED,callback(i){p(i)}});break}case"htmlPreview":{u.bus.on(c,{name:u.HTML_PREVIEW_CHANGED,callback(i){p(i)}});break}case"catalog":{u.bus.on(c,{name:u.CATALOG_VISIBLE_CHANGED,callback(i){p(i)}});break}}},togglePageFullscreen(o){s("pageFullscreen",o)},toggleFullscreen(o){u.bus.emit(c,u.CHANGE_FULL_SCREEN,o)},togglePreview(o){s("preview",o)},togglePreviewOnly(o){s("previewOnly",o)},toggleHtmlPreview(o){s("htmlPreview",o)},toggleCatalog(o){u.bus.emit(c,u.CHANGE_CATALOG_VISIBLE,o)},triggerSave(){u.bus.emit(c,u.ON_SAVE)},insert(o){u.bus.emit(c,u.REPLACE,"universal",{generate:o})},focus(o){f.current?.focus(o)},rerender(){u.bus.emit(c,u.RERENDER)},getSelectedText(){return f.current?.getSelectedText()},resetHistory(){f.current?.resetHistory()},domEventHandlers(o){u.bus.emit(c,u.EVENT_LISTENER,o)},execCommand(o){u.bus.emit(c,u.REPLACE,o)},getEditorView(){return f.current?.getEditorView()}}),[f,c,s])},pt=e=>{const t=a.useId();return e.id||e.editorId||h.prefix+"-"+t.replaceAll(":","")};exports.CDN_IDS=_;exports.ContentPreview=ot;exports.useCatalog=ut;exports.useConfig=dt;exports.useEditorId=pt;exports.useErrorCatcher=lt;exports.useExpansion=it;exports.useExpose=ft;exports.useMdPreviewConfig=fe;exports.useOnSave=ct;exports.useUploadImg=at;