md-editor-v3
Version:
Markdown editor for vue3, 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) • 34.7 kB
JavaScript
;const n=require("vue"),j=require("@vavt/util"),h=require("./config.cjs"),f=require("./event-bus.cjs"),S=require("./dom.cjs"),re=require("@vavt/copy2clipboard"),ie=require("markdown-it"),ae=require("markdown-it-image-figures"),le=require("markdown-it-sub"),se=require("markdown-it-sup"),ce=require("./index5.cjs"),de=require("lru-cache"),ue=require("medium-zoom"),A={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`},me=(e,t,a)=>{const{editorId:o}=a,r=n.reactive({buildFinished:!1,html:""});n.watch(()=>e.modelValue,()=>{r.buildFinished=!1}),n.onMounted(()=>{f.bus.on(o,{name:f.BUILD_FINISHED,callback(m){r.buildFinished=!0,r.html=m}}),f.bus.on(o,{name:f.ON_SAVE,callback(){const m=new Promise(d=>{if(r.buildFinished)d(r.html);else{const p=c=>{d(c),f.bus.remove(o,f.BUILD_FINISHED,p)};f.bus.on(o,{name:f.BUILD_FINISHED,callback:p})}});e.onSave?e.onSave(e.modelValue,m):t.emit("onSave",e.modelValue,m)}})})},Y=(e,{editorId:t,rootRef:a,setting:o})=>{const r=h.globalConfig.editorExtensions.highlight,m=h.globalConfig.editorExtensionsAttrs.highlight;n.provide("editorId",t),n.provide("rootRef",a),n.provide("theme",n.computed(()=>e.theme)),n.provide("language",n.computed(()=>e.language)),n.provide("highlight",n.computed(()=>{const{js:p}=r,c={...h.codeCss,...r.css},{js:l,css:s={}}=m||{},i=e.codeStyleReverse&&e.codeStyleReverseList.includes(e.previewTheme)?"dark":e.theme,u=c[e.codeTheme]?c[e.codeTheme][i]:h.codeCss.atom[i],w=c[e.codeTheme]&&s[e.codeTheme]?s[e.codeTheme][i]:s.atom?s.atom[i]:{};return{js:{src:p,...l},css:{href:u,...w}}})),n.provide("showCodeRowNumber",e.showCodeRowNumber);const d=n.computed(()=>{const p={...h.staticTextDefault,...h.globalConfig.editorConfig.languageUserDefined};return j.deepMerge(j.deepClone(h.staticTextDefault["en-US"]),p[e.language]||{})});return n.provide("usedLanguageText",d),n.provide("previewTheme",n.computed(()=>e.previewTheme)),n.provide("customIcon",n.computed(()=>e.customIcon)),n.provide("setting",n.computed(()=>o?{...o}:{preview:!0,htmlPreview:!1,previewOnly:!1,pageFullscreen:!1,fullscreen:!1})),{editorId:t}},pe=(e,t)=>(n.provide("tabWidth",e.tabWidth),n.provide("disabled",n.computed(()=>e.disabled)),n.provide("showToolbarName",n.computed(()=>e.showToolbarName)),n.provide("noUploadImg",e.noUploadImg),n.provide("tableShape",n.computed(()=>e.tableShape)),n.provide("noPrettier",e.noPrettier),n.provide("codeTheme",n.computed(()=>e.codeTheme)),n.provide("updateSetting",t.updateSetting),n.provide("catalogVisible",n.computed(()=>t.catalogVisible.value)),n.provide("defToolbars",t.defToolbars),n.provide("floatingToolbars",n.computed(()=>e.floatingToolbars)),Y(e,t)),fe=e=>{const{noPrettier:t,noUploadImg:a}=e,{editorExtensions:o,editorExtensionsAttrs:r}=h.globalConfig,m=t||o.prettier.prettierInstance,d=t||o.prettier.parserMarkdownInstance,p=a||o.cropper.instance;n.onMounted(()=>{if(!p){const{js:c={},css:l={}}=r.cropper||{};S.appendHandler("link",{...l,rel:"stylesheet",href:o.cropper.css,id:A.croppercss}),S.appendHandler("script",{...c,src:o.cropper.js,id:A.cropperjs})}if(!m){const{standaloneJs:c={}}=r.prettier||{};S.appendHandler("script",{...c,src:o.prettier.standaloneJs,id:A.prettier})}if(!d){const{parserMarkdownJs:c={}}=r.prettier||{};S.appendHandler("script",{...c,src:o.prettier.parserMarkdownJs,id:A.prettierMD})}})},he=(e,t,a)=>{const{editorId:o}=a;n.onMounted(()=>{f.bus.on(o,{name:f.ERROR_CATCHER,callback:r=>{e.onError?.(r),t.emit("onError",r)}})})},ge=(e,t,a)=>{const{editorId:o}=a,r=n.reactive({pageFullscreen:e.pageFullscreen,fullscreen:!1,preview:e.preview,htmlPreview:e.preview?!1:e.htmlPreview,previewOnly:!1}),m=n.reactive({...r}),d=(l,s)=>{const i=s===void 0?!r[l]:s;switch(l){case"preview":{r.htmlPreview=!1,r.previewOnly=!1;break}case"htmlPreview":{r.preview=!1,r.previewOnly=!1;break}case"previewOnly":{i?!r.preview&&!r.htmlPreview&&(r.preview=!0):(m.preview||(r.preview=!1),m.htmlPreview||(r.htmlPreview=!1));break}}m[l]=i,r[l]=i};let p="";const c=()=>{r.pageFullscreen||r.fullscreen?document.body.style.overflow="hidden":document.body.style.overflow=p};return n.watch(()=>[r.pageFullscreen,r.fullscreen],c),n.onMounted(()=>{f.bus.on(o,{name:f.UPLOAD_IMAGE,callback(l,s){const i=u=>{f.bus.emit(o,f.REPLACE,"image",{desc:"",urls:u}),s?.()};e.onUploadImg?e.onUploadImg(l,i):t.emit("onUploadImg",l,i)}}),p=document.body.style.overflow,c()}),[r,d]},ve=(e,t)=>{const{editorId:a}=t,o=n.ref(!1);return n.onMounted(()=>{f.bus.on(a,{name:f.CHANGE_CATALOG_VISIBLE,callback:r=>{r===void 0?o.value=!o.value:o.value=r}})}),o},be=(e,t,a)=>{const{editorId:o,catalogVisible:r,setting:m,updateSetting:d,codeRef:p}=a;n.watch(()=>m.pageFullscreen,l=>{f.bus.emit(o,f.PAGE_FULL_SCREEN_CHANGED,l)}),n.watch(()=>m.fullscreen,l=>{f.bus.emit(o,f.FULL_SCREEN_CHANGED,l)}),n.watch(()=>m.preview,l=>{f.bus.emit(o,f.PREVIEW_CHANGED,l)}),n.watch(()=>m.previewOnly,l=>{f.bus.emit(o,f.PREVIEW_ONLY_CHANGED,l)}),n.watch(()=>m.htmlPreview,l=>{f.bus.emit(o,f.HTML_PREVIEW_CHANGED,l)}),n.watch(r,l=>{f.bus.emit(o,f.CATALOG_VISIBLE_CHANGED,l)});const c={on(l,s){switch(l){case"pageFullscreen":{f.bus.on(o,{name:f.PAGE_FULL_SCREEN_CHANGED,callback(i){s(i)}});break}case"fullscreen":{f.bus.on(o,{name:f.FULL_SCREEN_CHANGED,callback(i){s(i)}});break}case"preview":{f.bus.on(o,{name:f.PREVIEW_CHANGED,callback(i){s(i)}});break}case"previewOnly":{f.bus.on(o,{name:f.PREVIEW_ONLY_CHANGED,callback(i){s(i)}});break}case"htmlPreview":{f.bus.on(o,{name:f.HTML_PREVIEW_CHANGED,callback(i){s(i)}});break}case"catalog":{f.bus.on(o,{name:f.CATALOG_VISIBLE_CHANGED,callback(i){s(i)}});break}}},togglePageFullscreen(l){d("pageFullscreen",l)},toggleFullscreen(l){f.bus.emit(o,f.CHANGE_FULL_SCREEN,l)},togglePreview(l){d("preview",l)},togglePreviewOnly(l){d("previewOnly",l)},toggleHtmlPreview(l){d("htmlPreview",l)},toggleCatalog(l){f.bus.emit(o,f.CHANGE_CATALOG_VISIBLE,l)},triggerSave(){f.bus.emit(o,f.ON_SAVE)},insert(l){f.bus.emit(o,f.REPLACE,"universal",{generate:l})},focus(l){p.value?.focus(l)},rerender(){f.bus.emit(o,f.RERENDER)},getSelectedText(){return p.value?.getSelectedText()},resetHistory(){p.value?.resetHistory()},domEventHandlers(l){f.bus.emit(o,f.EVENT_LISTENER,l)},execCommand(l){f.bus.emit(o,f.REPLACE,l)},getEditorView(){return p.value?.getEditorView()}};t.expose(c)},Q=e=>{const t=n.useId();return e.id||e.editorId||`${h.prefix}-${t}`},ye=(e,t,a)=>{const o=n.inject("editorId"),r=n.inject("rootRef"),m=n.inject("usedLanguageText"),d=n.inject("setting"),p=()=>{r.value.querySelectorAll(`#${o} .${h.prefix}-preview .${h.prefix}-code`).forEach(s=>{let i=-1;const u=s.querySelector(`.${h.prefix}-copy-button:not([data-processed])`);u&&(u.onclick=w=>{w.preventDefault(),clearTimeout(i);const v=(s.querySelector("input:checked + pre code")||s.querySelector("pre code")).textContent,{text:b,successTips:$,failTips:y}=m.value.copyCode;let x=$;re(e.formatCopiedText(v||"")).catch(()=>{x=y}).finally(()=>{u.dataset.isIcon?u.dataset.tips=x:u.innerHTML=x,i=window.setTimeout(()=>{u.dataset.isIcon?u.dataset.tips=b:u.innerHTML=b},1500)})},u.setAttribute("data-processed","true"))})},c=()=>{n.nextTick(p)},l=s=>{s&&n.nextTick(p)};n.watch([t,a],c),n.watch(()=>d.value.preview,l),n.watch(()=>d.value.htmlPreview,l),n.onMounted(p)},Ce=e=>{const t=n.inject("editorId"),a=n.inject("theme"),o=n.inject("rootRef"),{editorExtensions:r,editorExtensionsAttrs:m}=h.globalConfig;let d=r.echarts.instance;const p=n.shallowRef(-1),c=()=>{!e.noEcharts&&d&&(p.value=p.value+1)};n.watch(()=>a.value,()=>{c()}),n.onMounted(()=>{if(e.noEcharts||d)return;const g=r.echarts.js;S.appendHandler("script",{...m.echarts?.js,src:g,id:A.echarts,onload(){d=window.echarts,c()}},"echarts")});let l=[],s=[],i=[];const u=(g=!1)=>{if(!l.length){g&&(s.forEach(y=>{y.dispose?.()}),i.forEach(y=>{y.disconnect?.()}),s=[],i=[]);return}const v=[],b=[],$=[];l.forEach((y,x)=>{const T=s[x],C=i[x];if(g||!y||!y.isConnected||(o?.value?!o.value.contains(y):!1)){T?.dispose?.(),C?.disconnect?.();return}v.push(y),T&&b.push(T),C&&$.push(C)}),l=v,s=b,i=$},w=()=>{u(),!e.noEcharts&&d&&Array.from(o.value.querySelectorAll(`#${t} div.${h.prefix}-echarts:not([data-processed])`)).forEach(v=>{if(v.dataset.closed==="false")return!1;try{const b=new Function(`return ${v.innerText}`)(),$=d.init(v,a.value);$.setOption(b),v.setAttribute("data-processed",""),l.push(v),s.push($);const y=new ResizeObserver(()=>{$.resize()});y.observe(v),i.push(y)}catch(b){f.bus.emit(t,f.ERROR_CATCHER,{name:"echarts",message:b?.message,error:b})}})};return n.onBeforeUnmount(()=>{u(!0)}),{reRenderEcharts:p,replaceEcharts:w}},we=e=>{const t=n.inject("highlight"),a=n.shallowRef(h.globalConfig.editorExtensions.highlight.instance);return n.onMounted(()=>{e.noHighlight||a.value||(S.appendHandler("link",{...t.value.css,rel:"stylesheet",id:A.hlcss}),S.appendHandler("script",{...t.value.js,id:A.hljs,onload(){a.value=window.hljs}},"hljs"))}),n.watch(()=>t.value.css,()=>{e.noHighlight||h.globalConfig.editorExtensions.highlight.instance||S.updateHandler("link",{...t.value.css,rel:"stylesheet",id:A.hlcss})}),a},xe=e=>{const t=n.shallowRef(h.globalConfig.editorExtensions.katex.instance);return n.onMounted(()=>{if(e.noKatex||t.value)return;const{editorExtensions:a,editorExtensionsAttrs:o}=h.globalConfig;S.appendHandler("script",{...o.katex?.js,src:a.katex.js,id:A.katexjs,onload(){t.value=window.katex}},"katex"),S.appendHandler("link",{...o.katex?.css,rel:"stylesheet",href:a.katex.css,id:A.katexcss})}),t},U=new de.LRUCache({max:1e3,ttl:6e5}),Ee=e=>{const t=n.inject("editorId"),a=n.inject("theme"),o=n.inject("rootRef"),{editorExtensions:r,editorExtensionsAttrs:m,mermaidConfig:d}=h.globalConfig;let p=r.mermaid.instance;const c=n.shallowRef(-1),l=()=>{!e.noMermaid&&p&&(p.initialize(d({startOnLoad:!1,theme:a.value==="dark"?"dark":"default"})),c.value=c.value+1)};return n.watch(()=>a.value,()=>{U.clear(),l()}),n.onMounted(()=>{if(e.noMermaid||p)return;const i=r.mermaid.js;/\.mjs/.test(i)?(S.appendHandler("link",{...m.mermaid?.js,rel:"modulepreload",href:i,id:A.mermaidM}),import(i).then(u=>{p=u.default,l()}).catch(u=>{f.bus.emit(t,f.ERROR_CATCHER,{name:"mermaid",message:`Failed to load mermaid module: ${u.message}`,error:u})})):S.appendHandler("script",{...m.mermaid?.js,src:i,id:A.mermaid,onload(){p=window.mermaid,l()}},"mermaid")}),{reRenderRef:c,replaceMermaid:async()=>{if(!e.noMermaid&&p){const i=o.value.querySelectorAll(`div.${h.prefix}-mermaid`),u=document.createElement("div"),w=document.body.offsetWidth>1366?document.body.offsetWidth:1366,g=document.body.offsetHeight>768?document.body.offsetHeight:768;u.style.width=w+"px",u.style.height=g+"px",u.style.position="fixed",u.style.zIndex="-10000",u.style.top="-10000";let v=i.length;v>0&&document.body.appendChild(u),await Promise.allSettled(Array.from(i).map(b=>(async y=>{if(y.dataset.closed==="false")return!1;const x=y.innerText;let T=U.get(x);if(!T){const C=j.randomId();let k={svg:""};try{k=await p.render(C,x,u),T=await e.sanitizeMermaid(k.svg);const I=document.createElement("p");I.className=`${h.prefix}-mermaid`,I.setAttribute("data-processed",""),I.setAttribute("data-content",x),I.innerHTML=T,I.children[0]?.removeAttribute("height"),U.set(x,I.innerHTML),y.dataset.line!==void 0&&(I.dataset.line=y.dataset.line),y.replaceWith(I)}catch(I){f.bus.emit(t,f.ERROR_CATCHER,{name:"mermaid",message:I.message,error:I})}--v===0&&u.remove()}})(b)))}}}},$e=(e,t)=>{t=t||{};const a=3,o=t.marker||"!",r=o.charCodeAt(0),m=o.length;let d="",p="";const c=(s,i,u,w,g)=>{const v=s[i];return v.type==="admonition_open"?s[i].attrPush(["class",`${h.prefix}-admonition ${h.prefix}-admonition-${v.info}`]):v.type==="admonition_title_open"&&s[i].attrPush(["class",`${h.prefix}-admonition-title`]),g.renderToken(s,i,u)},l=s=>{const i=s.trim().split(" ",2);p="",d=i[0],i.length>1&&(p=s.substring(d.length+2))};e.block.ruler.before("code","admonition",(s,i,u,w)=>{let g,v,b,$=!1,y=s.bMarks[i]+s.tShift[i],x=s.eMarks[i];if(r!==s.src.charCodeAt(y))return!1;for(g=y+1;g<=x&&o[(g-y)%m]===s.src[g];g++);const T=Math.floor((g-y)/m);if(T!==a)return!1;g-=(g-y)%m;const C=s.src.slice(y,g),k=s.src.slice(g,x);if(l(k),w)return!0;for(v=i;v++,!(v>=u||(y=s.bMarks[v]+s.tShift[v],x=s.eMarks[v],y<x&&s.sCount[v]<s.blkIndent));)if(r===s.src.charCodeAt(y)&&!(s.sCount[v]-s.blkIndent>=4)){for(g=y+1;g<=x&&o[(g-y)%m]===s.src[g];g++);if(!(Math.floor((g-y)/m)<T)&&(g-=(g-y)%m,g=s.skipSpaces(g),!(g<x))){$=!0;break}}const I=s.parentType,H=s.lineMax;return s.parentType="root",s.lineMax=v,b=s.push("admonition_open","div",1),b.markup=C,b.block=!0,b.info=d,b.map=[i,v],p&&(b=s.push("admonition_title_open","p",1),b.markup=C+" "+d,b.map=[i,v],b=s.push("inline","",0),b.content=p,b.map=[i,s.line-1],b.children=[],b=s.push("admonition_title_close","p",-1),b.markup=C+" "+d),s.md.block.tokenize(s,i+1,v),b=s.push("admonition_close","div",-1),b.markup=s.src.slice(y,g),b.block=!0,s.parentType=I,s.lineMax=H,s.line=v+($?1:0),!0},{alt:["paragraph","reference","blockquote","list"]}),e.renderer.rules.admonition_open=c,e.renderer.rules.admonition_title_open=c,e.renderer.rules.admonition_title_close=c,e.renderer.rules.admonition_close=c},z=(e,t)=>{const a=e.attrs?e.attrs.slice():[];return t.forEach(o=>{const r=e.attrIndex(o[0]);r<0?a.push(o):(a[r]=a[r].slice(),a[r][1]+=` ${o[1]}`)}),a},Ie=(e,t)=>{const a=e.renderer.rules.fence,o=e.utils.unescapeAll,r=/\[(\w*)(?::([\w ]*))?\]/,m=/::(open|close)/,d=i=>i.info?o(i.info).trim():"",p=i=>{const u=d(i),[w=null,g=""]=(r.exec(u)||[]).slice(1);return[w,g]},c=i=>{const u=d(i);return u?u.split(/(\s+)/g)[0]:""},l=i=>{const u=i.info.match(m)||[],w=u[1]==="open"||u[1]!=="close"&&t.codeFoldable&&i.content.trim().split(`
`).length<t.autoFoldThreshold,g=u[1]||t.codeFoldable?"details":"div",v=u[1]||t.codeFoldable?"summary":"div";return{open:w,tagContainer:g,tagHeader:v}},s=(i,u,w,g,v)=>{if(i[u].hidden)return"";const b=t.usedLanguageTextRef.value?.copyCode.text,$=t.customIconRef.value.copy||b,y=!!t.customIconRef.value.copy,x=`<span class="${h.prefix}-collapse-tips">${S.StrIcon("collapse-tips",t.customIconRef.value)}</span>`,[T]=p(i[u]);if(T===null){const{open:E,tagContainer:R,tagHeader:G}=l(i[u]),M=[["class",`${h.prefix}-code`]];E&&M.push(["open",""]);const W={attrs:z(i[u],M)};i[u].info=i[u].info.replace(m,"");const O=a(i,u,w,g,v);return`
<${R} ${v.renderAttrs(W)}>
<${G} 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(i[u].info.trim())}</span>
<span class="${h.prefix}-copy-button" data-tips="${b}"${y?" data-is-icon=true":""}>${$}</span>
${t.extraTools instanceof Function?t.extraTools({lang:i[u].info.trim()}):t.extraTools||""}
${R==="details"?x:""}
</div>
</${G}>
${O}
</${R}>
`}let C,k,I,H,F="",L="",P="";const{open:D,tagContainer:_,tagHeader:N}=l(i[u]),B=[["class",`${h.prefix}-code`]];D&&B.push(["open",""]);const V={attrs:z(i[u],B)};for(let E=u;E<i.length&&(C=i[E],[k,I]=p(C),k===T);E++){C.info=C.info.replace(r,"").replace(m,""),C.hidden=!0;const R=`${h.prefix}-codetab-${t.editorId}-${u}-${E-u}`;H=E-u>0?"":"checked",F+=`
<li>
<input
type="radio"
id="label-${h.prefix}-codetab-label-1-${t.editorId}-${u}-${E-u}"
name="${h.prefix}-codetab-label-${t.editorId}-${u}"
class="${R}"
${H}
>
<label
for="label-${h.prefix}-codetab-label-1-${t.editorId}-${u}-${E-u}"
onclick="this.getRootNode().querySelectorAll('.${R}').forEach(e => e.click())"
>
${e.utils.escapeHtml(I||c(C))}
</label>
</li>`,L+=`
<div role="tabpanel">
<input
type="radio"
name="${h.prefix}-codetab-pre-${t.editorId}-${u}"
class="${R}"
${H}
role="presentation">
${a(i,E,w,g,v)}
</div>`,P+=`
<input
type="radio"
name="${h.prefix}-codetab-lang-${t.editorId}-${u}"
class="${R}"
${H}
role="presentation">
<span class=${h.prefix}-code-lang role="note">${e.utils.escapeHtml(c(C))}</span>`}return`
<${_} ${v.renderAttrs(V)}>
<${N} 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">${P}</span>
<span class="${h.prefix}-copy-button" data-tips="${b}"${y?" data-is-icon=true":""}>${$}</span>
${t.extraTools instanceof Function?t.extraTools({lang:i[u].info.trim()}):t.extraTools||""}
${_==="details"?x:""}
</div>
</${N}>
${L}
</${_}>
`};e.renderer.rules.fence=s,e.renderer.rules.code_block=s},Te=(e,t)=>{const a=e.renderer.rules.fence.bind(e.renderer.rules);e.renderer.rules.fence=(o,r,m,d,p)=>{const c=o[r],l=c.content.trim();if(c.info==="echarts"){if(c.attrSet("class",`${h.prefix}-echarts`),c.attrSet("data-echarts-theme",t.themeRef.value),c.map&&c.level===0){const s=c.map[1]-1,u=!!d.srcLines[s]?.trim()?.startsWith("```");c.attrSet("data-closed",`${u}`),c.attrSet("data-line",String(c.map[0]))}return`<div ${p.renderAttrs(c)} style="width: 100%; aspect-ratio: 4 / 3;">${e.utils.escapeHtml(l)}</div>`}return a(o,r,m,d,p)}},ke=(e,t)=>{e.renderer.rules.heading_open=(a,o)=>{const r=a[o],m=a[o+1].children?.reduce((p,c)=>p+(["text","code_inline","math_inline"].includes(c.type)&&c.content||""),"")||"",d=r.markup.length;return t.headsRef.value.push({text:m,level:d,line:r.map[0],currentToken:r,nextToken:a[o+1]}),r.map&&r.level===0&&r.attrSet("id",t.mdHeadingId({text:m,level:d,index:t.headsRef.value.length,currentToken:r,nextToken:a[o+1]})),e.renderer.renderToken(a,o,t)},e.renderer.rules.heading_close=(a,o,r,m,d)=>d.renderToken(a,o,r)},K={block:[{open:"$$",close:"$$"},{open:"\\[",close:"\\]"}],inline:[{open:"$$",close:"$$"},{open:"$",close:"$"},{open:"\\[",close:"\\]"},{open:"\\(",close:"\\)"}]},Se=e=>(t,a)=>{const o=e.delimiters;for(const r of o){if(!t.src.startsWith(r.open,t.pos))continue;const m=t.pos+r.open.length;let d=m;for(;(d=t.src.indexOf(r.close,d))!==-1;){let p=0,c=d-1;for(;c>=0&&t.src[c]==="\\";)p++,c--;if(p%2===0)break;d+=r.close.length}if(d!==-1){if(d-m===0)return a||(t.pending+=r.open+r.close),t.pos=d+r.close.length,!0;if(!a){const p=t.push("math_inline","math",0);p.markup=r.open,p.content=t.src.slice(m,d)}return t.pos=d+r.close.length,!0}}return!1},Re=e=>(t,a,o,r)=>{const m=e.delimiters,d=t.bMarks[a]+t.tShift[a],p=t.eMarks[a],c=(l,s,i)=>{t.line=s;const u=t.push("math_block","math",0);return u.block=!0,u.content=l,u.map=[a,t.line],u.markup=i,!0};for(const l of m){const s=d;if(t.src.slice(s,s+l.open.length)!==l.open)continue;const i=s+l.open.length,u=t.src.slice(i,p).trim(),w=u==="",g=u===l.close,v=u.endsWith(l.close);if(!w&&!g&&!v)continue;if(r)return!0;if(g)return c("",a+1,l.open);if(!w&&v){const C=u.slice(0,-l.close.length);return c(C,a+1,l.open)}let b=a+1,$=!1,y="";for(;b<o;b++){const C=t.bMarks[b]+t.tShift[b],k=t.eMarks[b];if(C<k&&t.tShift[b]<t.blkIndent)break;if(t.src.slice(C,k).trim().endsWith(l.close)){const H=t.src.slice(0,k).lastIndexOf(l.close);y=t.src.slice(C,H),$=!0;break}}if(!$)continue;const T=t.getLines(a+1,b,t.tShift[a],!0)+(y.trim()?y:"");return c(T,b+1,l.open)}return!1},Ae=(e,{katexRef:t,inlineDelimiters:a,blockDelimiters:o})=>{const r=(p,c,l,s,i=!1)=>{const u={attrs:z(p,[["class",c]])},w=s.renderAttrs(u);if(!t.value)return`<${l} ${w}>${p.content}</${l}>`;const g=t.value.renderToString(p.content,h.globalConfig.katexConfig({throwOnError:!1,displayMode:i}));return`<${l} ${w} data-processed>${g}</${l}>`},m=(p,c,l,s,i)=>r(p[c],`${h.prefix}-katex-inline`,"span",i),d=(p,c,l,s,i)=>r(p[c],`${h.prefix}-katex-block`,"p",i,!0);e.inline.ruler.before("escape","math_inline",Se({delimiters:a||K.inline})),e.block.ruler.after("blockquote","math_block",Re({delimiters:o||K.block}),{alt:["paragraph","reference","blockquote","list"]}),e.renderer.rules.math_inline=m,e.renderer.rules.math_block=d},He=(e,t)=>{const a=e.renderer.rules.fence.bind(e.renderer.rules);e.renderer.rules.fence=(o,r,m,d,p)=>{const c=o[r],l=c.content.trim();if(c.info==="mermaid"){if(c.attrSet("class",`${h.prefix}-mermaid`),c.attrSet("data-mermaid-theme",t.themeRef.value),c.map&&c.level===0){const i=c.map[1]-1,w=!!d.srcLines[i]?.trim()?.startsWith("```");c.attrSet("data-closed",`${w}`),c.attrSet("data-line",String(c.map[0]))}const s=U.get(l);return s?(c.attrSet("data-processed",""),c.attrSet("data-content",l),`<p ${p.renderAttrs(c)}>${s}</p>`):`<div ${p.renderAttrs(c)}>${e.utils.escapeHtml(l)}</div>`}return a(o,r,m,d,p)}},Z=(e,t,a)=>{const o=e.attrIndex(t),r=[t,a];o<0?e.attrPush(r):(e.attrs=e.attrs||[],e.attrs[o]=r)},Fe=e=>e.type==="inline",Me=e=>e.type==="paragraph_open",Le=e=>e.type==="list_item_open",Pe=e=>e.content.indexOf("[ ] ")===0||e.content.indexOf("[x] ")===0||e.content.indexOf("[X] ")===0,_e=(e,t)=>Fe(e[t])&&Me(e[t-1])&&Le(e[t-2])&&Pe(e[t]),je=(e,t)=>{const a=e[t].level-1;for(let o=t-1;o>=0;o--)if(e[o].level===a)return o;return-1},Ne=e=>{const t=new e("html_inline","",0);return t.content="<label>",t},Oe=e=>{const t=new e("html_inline","",0);return t.content="</label>",t},De=(e,t,a)=>{const o=new a("html_inline","",0);return o.content='<label class="task-list-item-label" for="'+t+'">'+e+"</label>",o.attrs=[["for",t]],o},Be=(e,t,a)=>{const o=new t("html_inline","",0),r=a.enabled?" ":' disabled="" ';return e.content.indexOf("[ ] ")===0?o.content='<input class="task-list-item-checkbox"'+r+'type="checkbox">':(e.content.indexOf("[x] ")===0||e.content.indexOf("[X] ")===0)&&(o.content='<input class="task-list-item-checkbox" checked=""'+r+'type="checkbox">'),o},Ve=(e,t,a)=>{if(e.children=e.children||[],e.children.unshift(Be(e,t,a)),e.children[1].content=e.children[1].content.slice(3),e.content=e.content.slice(3),a.label)if(a.labelAfter){e.children.pop();const o="task-item-"+Math.ceil(Math.random()*(1e4*1e3)-1e3);e.children[0].content=e.children[0].content.slice(0,-1)+' id="'+o+'">',e.children.push(De(e.content,o,t))}else e.children.unshift(Ne(t)),e.children.push(Oe(t))},Ge=(e,t={})=>{e.core.ruler.after("inline","github-task-lists",a=>{const o=a.tokens;for(let r=2;r<o.length;r++)_e(o,r)&&(Ve(o[r],a.Token,t),Z(o[r-2],"class","task-list-item"+(t.enabled?" enabled":" ")),Z(o[je(o,r-2)],"class","contains-task-list"))})},Ue=e=>{e.core.ruler.push("init-line-number",t=>(t.tokens.forEach(a=>{a.map&&(a.attrs||(a.attrs=[]),a.attrs.push(["data-line",a.map[0].toString()]))}),!0))},qe=(e,t)=>{const{editorConfig:a,markdownItConfig:o,markdownItPlugins:r,editorExtensions:m}=h.globalConfig,d=n.inject("editorId"),p=n.inject("language"),c=n.inject("usedLanguageText"),l=n.inject("showCodeRowNumber"),s=n.inject("theme"),i=n.inject("customIcon"),u=n.inject("rootRef"),w=n.inject("setting"),g=n.ref([]),v=we(e),b=xe(e),{reRenderRef:$,replaceMermaid:y}=Ee(e),{reRenderEcharts:x,replaceEcharts:T}=Ce(e),C=ie({html:!0,breaks:!0,linkify:!0});o(C,{editorId:d});const k=[{type:"image",plugin:ae,options:{figcaption:!0,classes:"md-zoom"}},{type:"admonition",plugin:$e,options:{}},{type:"taskList",plugin:Ge,options:{}},{type:"heading",plugin:ke,options:{mdHeadingId:e.mdHeadingId,headsRef:g}},{type:"code",plugin:Ie,options:{editorId:d,usedLanguageTextRef:c,codeFoldable:e.codeFoldable,autoFoldThreshold:e.autoFoldThreshold,customIconRef:i}},{type:"sub",plugin:le,options:{}},{type:"sup",plugin:se,options:{}}];e.noKatex||k.push({type:"katex",plugin:Ae,options:{katexRef:b}}),e.noMermaid||k.push({type:"mermaid",plugin:He,options:{themeRef:s}}),e.noEcharts||k.push({type:"echarts",plugin:Te,options:{themeRef:s}}),r(k,{editorId:d}).forEach(E=>{C.use(E.plugin,E.options)});const I=C.options.highlight;C.set({highlight:(E,R,G)=>{if(I){const O=I(E,R,G);if(O)return O}let M;!e.noHighlight&&v.value?v.value.getLanguage(R)?M=v.value.highlight(E,{language:R,ignoreIllegals:!0}).value:M=v.value.highlightAuto(E).value:M=C.utils.escapeHtml(E);const W=l?ce.generateCodeRowNumber(M.replace(/^\n+|\n+$/g,""),E.replace(/^\n+|\n+$/g,"")):`<span class="${h.prefix}-code-block">${M.replace(/^\n+|\n+$/g,"")}</span>`;return`<pre><code class="language-${R}" language=${R}>${W}</code></pre>`}}),Ue(C);const H=n.ref(`_article-key_${j.randomId()}`),F=n.ref(e.sanitize(C.render(e.modelValue,{srcLines:e.modelValue.split(`
`)})));let L=()=>{},P=()=>{};const D=()=>{const E=u.value?.querySelectorAll(`#${d} p.${h.prefix}-mermaid:not([data-closed=false])`);P(),P=S.copyMermaid(E,{customIcon:i.value}),m.mermaid?.enableZoom&&(L(),L=S.zoomMermaid(E,{customIcon:i.value}))},_=()=>{f.bus.emit(d,f.BUILD_FINISHED,F.value),e.onHtmlChanged(F.value),e.onGetCatalog(g.value),f.bus.emit(d,f.CATALOG_CHANGED,g.value),n.nextTick(()=>{y().then(D),T()})},N=()=>{g.value=[],F.value=e.sanitize(C.render(e.modelValue,{srcLines:e.modelValue.split(`
`)}))},B=n.computed(()=>(e.noKatex||!!b.value)&&(e.noHighlight||!!v.value));let V=-1;return n.watch([n.toRef(e,"modelValue"),B,$,p],()=>{V=window.setTimeout(()=>{N()},t?0:a.renderDelay)}),n.watch(()=>w.value.preview,()=>{w.value.preview&&n.nextTick(()=>{y().then(D),T(),f.bus.emit(d,f.CATALOG_CHANGED,g.value)})}),n.watch([F,x],()=>{_()}),n.onMounted(_),n.onMounted(()=>{f.bus.on(d,{name:f.PUSH_CATALOG,callback(){f.bus.emit(d,f.CATALOG_CHANGED,g.value)}}),f.bus.on(d,{name:f.RERENDER,callback:()=>{H.value=`_article-key_${j.randomId()}`,N()}})}),n.onBeforeUnmount(()=>{L(),P(),clearTimeout(V)}),{html:F,key:H}},We=(e,t)=>{const a=n.inject("editorId"),o=n.inject("setting"),{noImgZoomIn:r}=e,m=j.debounce(()=>{const d=document.querySelectorAll(`#${a}-preview img:not(.not-zoom):not(.medium-zoom-image)`);d.length!==0&&ue(d,{background:"#00000073"})});n.onMounted(async()=>{!r&&o.value.preview&&await m()}),n.watch([t,()=>o.value.preview],async()=>{!r&&o.value.preview&&await m()})},J={checked:{regexp:/- \[x\]/,value:"- [ ]"},unChecked:{regexp:/- \[\s\]/,value:"- [x]"}},ze=(e,t)=>{const a=n.inject("editorId"),o=n.inject("rootRef");let r=()=>{};const m=()=>{if(!o.value)return!1;const d=o.value.querySelectorAll(".task-list-item.enabled"),p=c=>{c.preventDefault();const l=c.target.checked?"unChecked":"checked",s=c.target.parentElement?.dataset.line;if(!s)return;const i=Number(s),u=e.modelValue.split(`
`),w=u[Number(i)].replace(J[l].regexp,J[l].value);e.previewOnly?(u[Number(i)]=w,e.onChange(u.join(`
`))):f.bus.emit(a,f.TASK_STATE_CHANGED,i+1,w)};d.forEach(c=>{c.addEventListener("click",p)}),r=()=>{d.forEach(c=>{c.removeEventListener("click",p)})}};n.onBeforeUnmount(()=>{r()}),n.watch([t],()=>{r(),n.nextTick(m)},{immediate:!0})},Ke=(e,t,a)=>{const o=n.inject("setting"),r=()=>{n.nextTick(()=>{e.onRemount?.()})},m=d=>{d&&r()};n.watch([t,a],r),n.watch(()=>o.value.preview,m),n.watch(()=>o.value.htmlPreview,m),n.onMounted(r)},ee={modelValue:{type:String,default:""},onChange:{type:Function,default:()=>{}},onHtmlChanged:{type:Function,default:()=>{}},onGetCatalog:{type:Function,default:()=>{}},mdHeadingId:{type:Function,default:()=>""},noMermaid:{type:Boolean,default:!1},sanitize:{type:Function,default:e=>e},noKatex:{type:Boolean,default:!1},formatCopiedText:{type:Function,default:e=>e},noHighlight:{type:Boolean,default:!1},previewOnly:{type:Boolean,default:!1},noImgZoomIn:{type:Boolean},sanitizeMermaid:{type:Function},codeFoldable:{type:Boolean},autoFoldThreshold:{type:Number},onRemount:{type:Function},noEcharts:{type:Boolean},previewComponent:{type:[Object,Function],default:void 0}},Ze={...ee,updateModelValue:{type:Function,default:()=>{}},placeholder:{type:String,default:""},scrollAuto:{type:Boolean},autofocus:{type:Boolean},readonly:{type:Boolean},maxlength:{type:Number},autoDetectCode:{type:Boolean},onBlur:{type:Function,default:()=>{}},onFocus:{type:Function,default:()=>{}},completions:{type:Array},onInput:{type:Function},onDrop:{type:Function,default:()=>{}},inputBoxWidth:{type:String},oninputBoxWidthChange:{type:Function},transformImgUrl:{type:Function,default:e=>e},catalogLayout:{type:String},catalogMaxDepth:{type:Number}},X=e=>{const a=new DOMParser().parseFromString(e,"text/html");return Array.from(a.body.childNodes)},Je=(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,Xe=n.defineComponent({name:"UpdateOnDemand",props:{id:{type:String,required:!0},class:{type:[String,Array,Object],required:!0},html:{type:String,required:!0}},setup(e){const t=n.ref(),a=e.html,o=(r,m)=>{if(!t.value)return;const d=t.value,p=Array.from(d.childNodes),c=Math.min(r.length,m.length);let l=-1;for(let i=0;i<c;i++)if(!Je(r[i],m[i])){l=i;break}if(l===-1)if(m.length>r.length)l=r.length;else if(r.length>m.length)l=m.length;else return;const s=Math.min(l,p.length);for(let i=p.length-1;i>=s;i--)p[i].remove();for(let i=l;i<r.length;i++)d.appendChild(r[i].cloneNode(!0))};return n.watch(()=>e.html,(r,m)=>{const d=X(r),p=X(m||"");o(d,p)}),()=>n.createVNode("div",{id:e.id,class:e.class,innerHTML:a,ref:t},null)}}),te=n.defineComponent({name:"ContentPreview",props:ee,setup(e){const t=n.inject("editorId"),a=n.inject("setting"),o=n.inject("previewTheme"),r=n.inject("showCodeRowNumber"),{html:m,key:d}=qe(e,e.previewOnly);ye(e,m,d),We(e,m),ze(e,m),Ke(e,m,d);const p=n.computed(()=>[`${h.prefix}-preview`,`${o?.value}-theme`,r&&`${h.prefix}-scrn`].filter(Boolean)),c=()=>{const l=`${t}-preview`;return e.previewComponent?n.h(e.previewComponent,{key:d.value,html:m.value,id:l,class:p.value}):n.createVNode(Xe,{key:d.value,html:m.value,id:l,class:p.value},null)};return()=>n.createVNode(n.Fragment,null,[a.value.preview&&(e.previewOnly?c():n.createVNode("div",{id:`${t}-preview-wrapper`,class:`${h.prefix}-preview-wrapper`,key:"content-preview-wrapper"},[c()])),a.value.htmlPreview&&n.createVNode("div",{id:`${t}-html-wrapper`,class:`${h.prefix}-preview-wrapper`,key:"html-preview-wrapper"},[n.createVNode("div",{class:`${h.prefix}-html`},[m.value])])])}}),Ye=({text:e})=>e,ne={modelValue:{type:String,default:""},onChange:{type:Function,default:void 0},theme:{type:String,default:"light"},class:{type:String,default:""},language:{type:String,default:"zh-CN"},onHtmlChanged:{type:Function,default:void 0},onGetCatalog:{type:Function,default:void 0},editorId:{type:String,default:void 0},id:{type:String,default:void 0},showCodeRowNumber:{type:Boolean,default:!0},previewTheme:{type:String,default:"default"},style:{type:Object,default:()=>({})},mdHeadingId:{type:Function,default:Ye},sanitize:{type:Function,default:e=>e},noMermaid:{type:Boolean,default:!1},noKatex:{type:Boolean,default:!1},codeTheme:{type:String,default:"atom"},formatCopiedText:{type:Function,default:e=>e},codeStyleReverse:{type:Boolean,default:!0},codeStyleReverseList:{type:Array,default:["default","mk-cute"]},noHighlight:{type:Boolean,default:!1},noImgZoomIn:{type:Boolean,default:!1},customIcon:{type:Object,default:{}},sanitizeMermaid:{type:Function,default:e=>Promise.resolve(e)},codeFoldable:{type:Boolean,default:!0},autoFoldThreshold:{type:Number,default:30},onRemount:{type:Function,default:void 0},noEcharts:{type:Boolean,default:!1},previewComponent:{type:[Object,Function],default:void 0}},Qe={...ne,onSave:{type:Function,default:void 0},onUploadImg:{type:Function,default:void 0},pageFullscreen:{type:Boolean,default:!1},preview:{type:Boolean,default:!0},htmlPreview:{type:Boolean,default:!1},toolbars:{type:Array,default:h.allToolbar},floatingToolbars:{type:Array,default:[]},toolbarsExclude:{type:Array,default:[]},noPrettier:{type:Boolean,default:!1},tabWidth:{type:Number,default:2},tableShape:{type:Array,default:[6,4]},placeholder:{type:String,default:""},defToolbars:{type:[String,Object],default:void 0},onError:{type:Function,default:void 0},footers:{type:Array,default:h.allFooter},scrollAuto:{type:Boolean,default:!0},defFooters:{type:[String,Object],default:void 0},noUploadImg:{type:Boolean,default:!1},autoFocus:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},readOnly:{type:Boolean,default:!1},maxLength:{type:Number,default:void 0},autoDetectCode:{type:Boolean,default:!1},onBlur:{type:Function,default:void 0},onFocus:{type:Function,default:void 0},completions:{type:Array,default:void 0},showToolbarName:{type:Boolean,default:!1},onInput:{type:Function,default:void 0},onDrop:{type:Function,default:void 0},inputBoxWidth:{type:String,default:"50%"},oninputBoxWidthChange:{type:Function,default:void 0},transformImgUrl:{type:Function,default:e=>e},catalogLayout:{type:String,default:"fixed"},catalogMaxDepth:{type:Number,default:void 0}},oe=["onHtmlChanged","onGetCatalog","onChange","onRemount","update:modelValue"],et=[...oe,"onSave","onUploadImg","onError","onBlur","onFocus","onInput","onDrop","oninputBoxWidthChange"],tt=(e,t,a)=>{const{editorId:o}=a,r={rerender(){f.bus.emit(o,f.RERENDER)}};t.expose(r)},q=n.defineComponent({name:"MdPreview",props:ne,emits:oe,setup(e,t){const{noKatex:a,noMermaid:o,noHighlight:r}=e,m=n.ref(),d=Q(e);Y(e,{rootRef:m,editorId:d}),tt(e,t,{editorId:d}),n.onBeforeUnmount(()=>{f.bus.clear(d)});const p=i=>{e.onChange?.(i),t.emit("onChange",i),t.emit("update:modelValue",i)},c=i=>{e.onHtmlChanged?.(i),t.emit("onHtmlChanged",i)},l=i=>{e.onGetCatalog?.(i),t.emit("onGetCatalog",i)},s=()=>{e.onRemount?.(),t.emit("onRemount")};return()=>n.createVNode("div",{id:d,class:[h.prefix,e.class,e.theme==="dark"&&`${h.prefix}-dark`,`${h.prefix}-previewOnly`],style:e.style,ref:m},[n.createVNode(te,{modelValue:e.modelValue,onChange:p,onHtmlChanged:c,onGetCatalog:l,mdHeadingId:e.mdHeadingId,noMermaid:o,sanitize:e.sanitize,noKatex:a,formatCopiedText:e.formatCopiedText,noHighlight:r,noImgZoomIn:e.noImgZoomIn,previewOnly:!0,sanitizeMermaid:e.sanitizeMermaid,codeFoldable:e.codeFoldable,autoFoldThreshold:e.autoFoldThreshold,onRemount:s,noEcharts:e.noEcharts,previewComponent:e.previewComponent},null)])}});q.install=e=>(e.component(q.name,q),e);exports.CDN_IDS=A;exports.ContentPreview=te;exports.MdPreview=q;exports.contentProps=Ze;exports.editorEmits=et;exports.editorProps=Qe;exports.useCatalog=ve;exports.useConfig=ge;exports.useEditorId=Q;exports.useErrorCatcher=he;exports.useExpansion=fe;exports.useExpose=be;exports.useOnSave=me;exports.useProvide=pe;