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