@bhsd/codemirror-mediawiki 2.11.1 → 2.11.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/mw.min.js CHANGED
@@ -1,10 +1,10 @@
1
- var ie=(e,i,t)=>{if(!i.has(e))throw TypeError("Cannot "+t)};var g=(e,i,t)=>(ie(e,i,"read from private field"),t?t.call(e):i.get(e)),L=(e,i,t)=>{if(i.has(e))throw TypeError("Cannot add the same private member more than once");i instanceof WeakSet?i.add(e):i.set(e,t)},j=(e,i,t,n)=>(ie(e,i,"write to private field"),n?n.call(e,t):i.set(e,t),t);var q=(e,i,t)=>(ie(e,i,"access private method"),t);import{CodeMirror6 as Ne,CDN as Z}from"https://testingcf.jsdelivr.net/npm/@bhsd/codemirror-mediawiki@2.11.1/dist/main.min.js";var S=e=>JSON.parse(String(localStorage.getItem(e))),C=(e,i)=>{localStorage.setItem(e,JSON.stringify(i))};var ne=S("InPageEditMwConfig")||{},ve=typeof mw=="object"?`${mw.config.get("wgServerName")}${mw.config.get("wgScriptPath")}`:location.origin,F=ne[ve],ye=Number(F==null?void 0:F.time)>Date.now()-86400*1e3*30,re=(e,i,t)=>{let n=e.filter(i).filter(({"case-sensitive":a})=>a!==t).flatMap(({aliases:a,name:l,"case-sensitive":o})=>a.map(s=>({alias:(o?s:s.toLowerCase()).replace(/:$/u,""),name:l}))),r={};for(let{alias:a,name:l}of n)r[a]=l;return r},he=(e,i)=>[!0,!1].map(t=>re(e,i,t)),be=e=>{mw.config.set("extCodeMirrorConfig",e)},oe=async()=>{mw.loader.getState("ext.CodeMirror")!==null&&!ye&&await mw.loader.using(mw.loader.getState("ext.CodeMirror.data")?"ext.CodeMirror.data":"ext.CodeMirror");let e=mw.config.get("extCodeMirrorConfig");!e&&ye&&({config:e}=F,be(e));let i=e&&Object.values(e.functionSynonyms[0]).includes(!0),t=mw.config.get("wgNamespaceIds");if(e!=null&&e.img&&e.variants&&!i)return e.urlProtocols=e.urlProtocols.replace(/\\:/gu,":"),{...e,nsid:t};await mw.loader.using("mediawiki.api");let{query:{general:{variants:n},magicwords:r,extensiontags:a,functionhooks:l,variables:o}}=await new mw.Api().get({meta:"siteinfo",siprop:["general","magicwords",...e&&!i?[]:["extensiontags","functionhooks","variables"]],formatversion:"2"}),s=new Set(["msg","raw","msgnw","subst","safesubst"]);if(e&&!i){let{functionSynonyms:[d]}=e;"subst"in d||Object.assign(d,re(r,({name:c})=>s.has(c)))}else{e={tagModes:{},tags:{}};for(let c of a)e.tags[c.slice(1,-1)]=!0;let d=new Set([...l,...o,...s]);e.functionSynonyms=he(r,({name:c})=>d.has(c)),e.doubleUnderscore=he(r,({aliases:c})=>c.some(m=>/^__.+__$/u.test(m))),e.fromApi=!0}return e.img=re(r,({name:d})=>d.startsWith("img_")),e.variants=n?n.map(({code:d})=>d):[],e.nsid=t,e.urlProtocols=mw.config.get("wgUrlProtocols").replace(/\\:/gu,":"),be(e),ne[ve]={config:e,time:Date.now()},C("InPageEditMwConfig",ne),e},xe=(e,i)=>{if(mw.config.exists("wikilintConfig"))return mw.config.get("wikilintConfig");let t={...e,ext:Object.keys(i.tags),namespaces:mw.config.get("wgFormattedNamespaces"),nsid:i.nsid,doubleUnderscore:i.doubleUnderscore.map(n=>Object.keys(n).map(r=>r.slice(2,-2))),variants:i.variants,protocol:i.urlProtocols};if([t.parserFunction[0]]=i.functionSynonyms,mw.loader.getState("ext.CodeMirror")===null)for(let[n,r]of Object.entries(i.functionSynonyms[0]))n.startsWith("#")||(t.parserFunction[0][`#${n}`]=r);t.parserFunction[1]=[...Object.keys(i.functionSynonyms[1]),"="];for(let[n,r]of Object.entries(i.img))t.img[n]=r.slice(4);return t};var I="npm/@bhsd/codemirror-mediawiki@2.11.1",K=I.slice(I.lastIndexOf("@")+1),{vendor:Ke,userAgent:_e,maxTouchPoints:Ue,platform:Be}=navigator,le=Ke.includes("Apple Computer")&&(_e.includes("Mobile/")||Ue>2)||Be.includes("Mac"),Te="codemirror-mediawiki-i18n",Ge={zh:"zh-hans","zh-hans":"zh-hans","zh-cn":"zh-hans","zh-my":"zh-hans","zh-sg":"zh-hans","zh-hant":"zh-hant","zh-tw":"zh-hant","zh-hk":"zh-hant","zh-mo":"zh-hant"},se=Ge[mw.config.get("wgUserLanguage")]||"en",O=S(Te)||{},{version:ae}=O,Ee=async e=>{if(O.lang!==se||ae!==K)try{Object.assign(O,await(await fetch(`${e}/${I}/i18n/${se}.json`)).json()),C(Te,O)}catch(i){mw.notify(u("i18n-failed",se),{type:"error"}),console.error(i)}for(let[i,t]of Object.entries(O))i.endsWith("-mac")?le&&mw.messages.set(`cm-mw-${i.slice(0,-4)}`,t):mw.messages.set(`cm-mw-${i}`,t)},u=(e,...i)=>mw.msg(`cm-mw-${e}`,...i),Le=e=>(e.find("a").add(e.filter("a")).attr("target","_blank"),e);function _(e,i){let t=mw.message(`cm-mw-${e}`);return i?t.parse():Le(t.parseDom())}var ke=e=>e.split(".",2).map(Number),Me=async(e,...i)=>{let t=Le($("<p>",{html:u(e,...i)}));return await mw.notify(t,{type:"success",autoHideSeconds:"long"}),t},Se=async(e,i)=>{let t;if(!ae)t=await Me("welcome");else if(i.length>0){let[n,r]=ke(e),[a,l]=ke(ae);(a<n||a===n&&l<r)&&(t=await Me("welcome-addons",K,String(i.length),i.map(o=>`<li>${_(`addon-${o}`,!0)}</li>`).join("")))}t==null||t.find("#settings").click(n=>{n.preventDefault(),document.getElementById("cm-settings").dispatchEvent(new MouseEvent("click"))})},Ce=e=>{let i={};for(let[t,n]of Object.entries(O))t.startsWith("phrase-")&&(i[t.slice(7).replace(/-/gu," ")]=n);e.localize(i)};var Xe=le?"metaKey":"ctrlKey",ce=new WeakMap;function U(e){return e==null?void 0:e.name.replace(/_+/gu," ").trim()}var z=(e,i,t=U(e))=>{for(;U(e[i])===t;)e=e[i];return e},Ye=e=>{if(ce.has(e))return ce.get(e);let i=t=>{if(!t[Xe])return;let{view:n}=e,{state:r}=n,a=e.getNodeAt(n.posAtCoords(t));if(a){if(a.name.includes("mw-pagename")){t.preventDefault(),t.stopPropagation();let l=U(a),o=r.sliceDoc(z(a,"prevSibling",l).from,z(a,"nextSibling",l).to).trim();o.startsWith("/")&&(o=`:${mw.config.get("wgPageName")}${o}`);let s=0;l.includes("-template-name")?s=10:l.includes("-parserfunction")&&(s=828),open(new mw.Title(o,s).getUrl(void 0),"_blank")}else if(/-extlink-protocol/u.test(a.name))t.preventDefault(),open(r.sliceDoc(a.from,z(a.nextSibling,"nextSibling").to),"_blank");else if(/-extlink(?:_|$)/u.test(a.name)){t.preventDefault();let l=U(a),o=z(a,"prevSibling",l).prevSibling,s=z(a,"nextSibling",l);open(r.sliceDoc(o.from,s.to),"_blank")}}};return ce.set(e,i),i},Oe=(e,i)=>{let{contentDOM:t}=e.view,n=Ye(e);i?(mw.loader.load("mediawiki.Title"),t.addEventListener("mousedown",n,{capture:!0}),t.style.setProperty("--codemirror-cursor","pointer")):i===!1&&(t.removeEventListener("mousedown",n,{capture:!0}),t.style.removeProperty("--codemirror-cursor"))};var x=new WeakMap,p=e=>x.get(e[0]),de={getContents(){return p(this).view.state.doc.toString()},setContents(e){return p(this).setContent(e),this},getSelection(){let{state:e}=p(this).view,{selection:{main:{from:i,to:t}}}=e;return e.sliceDoc(i,t)},setSelection({start:e,end:i=e}){return p(this).view.dispatch({selection:{anchor:e,head:i}}),this},replaceSelection(e){let{view:i}=p(this);return i.dispatch(i.state.replaceSelection(e)),this},encapsulateSelection({pre:e="",peri:i="",post:t="",ownline:n,replace:r,selectPeri:a=!0,splitlines:l,selectionStart:o,selectionEnd:s=o}){let{view:d}=p(this),{state:c}=d,m=(y,f,h)=>{let V=0,J=0;return n&&(y>0&&!/[\n\r]/u.test(c.sliceDoc(y-1,y))&&(h=`
2
- ${h}`,V=1),/[\n\r]/u.test(c.sliceDoc(f,f+1))||(h+=`
3
- `,J=1)),[h,V,J]};if(n&&r&&!e&&!t&&o===void 0&&/^\s*=.*=\s*$/u.test(i)){let{selection:{main:{from:y,to:f}}}=c,[h]=m(y,f,i);return d.dispatch({changes:{from:y,to:f,insert:h},selection:{anchor:y+h.length}}),this}return A.replaceSelections(d,(y,{from:f,to:h})=>{o!==void 0&&(f=o,h=s);let V=a&&f===h,J=r||f===h?i:c.sliceDoc(f,h),[te,Ve,qe]=m(f,h,l?J.split(`
4
- `).map(Fe=>`${e}${Fe}${t}`).join(`
5
- `):`${e}${J}${t}`),we=f+te.length;return V?[te,f+e.length+Ve,we-t.length-qe]:[te,we]}),this},getCaretPosition(e){let{state:{selection:{main:{from:i,to:t,head:n}}}}=p(this).view;return e!=null&&e.startAndEnd?[i,t]:n},scrollToCaretPosition(){return p(this).scrollTo(),this}},ge={getContents(){return p(this).model.getValue()},setContents(e){return p(this).model.setValue(e),this},getSelection(){let{model:e,editor:i}=p(this);return e.getValueInRange(i.getSelection())},setSelection({start:e,end:i=e}){let{model:t,editor:n}=p(this),{lineNumber:r,column:a}=t.getPositionAt(e),{lineNumber:l,column:o}=t.getPositionAt(i);return n.setSelection({startLineNumber:r,startColumn:a,endLineNumber:l,endColumn:o}),this},replaceSelection(e){let{editor:i}=p(this);return i.executeEdits("replaceSelection",[{range:i.getSelection(),text:e,forceMoveMarkers:!0}]),this},encapsulateSelection({pre:e="",peri:i="",post:t="",ownline:n,replace:r,splitlines:a,selectionStart:l,selectionEnd:o=l}){l!==void 0&&de.setSelection.call(this,{start:l,end:o});let{model:s,editor:d}=p(this),c=d.getSelection(),m=r||c.isEmpty()?i:s.getValueInRange(c),y=`${n&&c.startColumn>1?`
1
+ var ne=(e,i,t)=>{if(!i.has(e))throw TypeError("Cannot "+t)};var g=(e,i,t)=>(ne(e,i,"read from private field"),t?t.call(e):i.get(e)),M=(e,i,t)=>{if(i.has(e))throw TypeError("Cannot add the same private member more than once");i instanceof WeakSet?i.add(e):i.set(e,t)},P=(e,i,t,n)=>(ne(e,i,"write to private field"),n?n.call(e,t):i.set(e,t),t);var F=(e,i,t)=>(ne(e,i,"access private method"),t);import{CodeMirror6 as We,CDN as ee}from"https://testingcf.jsdelivr.net/npm/@bhsd/codemirror-mediawiki@2.11.3/dist/main.min.js";var S=e=>JSON.parse(String(localStorage.getItem(e))),C=(e,i)=>{localStorage.setItem(e,JSON.stringify(i))};var re=S("InPageEditMwConfig")||{},xe=typeof mw=="object"?`${mw.config.get("wgServerName")}${mw.config.get("wgScriptPath")}`:location.origin,K=re[xe],ye=Number(K==null?void 0:K.time)>Date.now()-86400*1e3*30,oe=(e,i,t)=>{let n=e.filter(i).filter(({"case-sensitive":a})=>a!==t).flatMap(({aliases:a,name:l,"case-sensitive":o})=>a.map(s=>({alias:(o?s:s.toLowerCase()).replace(/:$/u,""),name:l}))),r={};for(let{alias:a,name:l}of n)r[a]=l;return r},be=(e,i)=>[!0,!1].map(t=>oe(e,i,t)),ve=e=>{mw.config.set("extCodeMirrorConfig",e)},se=async()=>{mw.loader.getState("ext.CodeMirror")!==null&&!ye&&await mw.loader.using(mw.loader.getState("ext.CodeMirror.data")?"ext.CodeMirror.data":"ext.CodeMirror");let e=mw.config.get("extCodeMirrorConfig");!e&&ye&&({config:e}=K,ve(e));let i=e&&Object.values(e.functionSynonyms[0]).includes(!0),t=mw.config.get("wgNamespaceIds");if(e!=null&&e.img&&e.variants&&!i)return e.urlProtocols=e.urlProtocols.replace(/\\:/gu,":"),{...e,nsid:t};await mw.loader.using("mediawiki.api");let{query:{general:{variants:n},magicwords:r,extensiontags:a,functionhooks:l,variables:o}}=await new mw.Api().get({meta:"siteinfo",siprop:["general","magicwords",...e&&!i?[]:["extensiontags","functionhooks","variables"]],formatversion:"2"}),s=new Set(["msg","raw","msgnw","subst","safesubst"]);if(e&&!i){let{functionSynonyms:[d]}=e;"subst"in d||Object.assign(d,oe(r,({name:c})=>s.has(c)))}else{e={tagModes:{},tags:{}};for(let c of a)e.tags[c.slice(1,-1)]=!0;let d=new Set([...l,...o,...s]);e.functionSynonyms=be(r,({name:c})=>d.has(c)),e.doubleUnderscore=be(r,({aliases:c})=>c.some(m=>/^__.+__$/u.test(m))),e.fromApi=!0}return e.img=oe(r,({name:d})=>d.startsWith("img_")),e.variants=n?n.map(({code:d})=>d):[],e.nsid=t,e.urlProtocols=mw.config.get("wgUrlProtocols").replace(/\\:/gu,":"),ve(e),re[xe]={config:e,time:Date.now()},C("InPageEditMwConfig",re),e},ke=(e,i)=>{if(mw.config.exists("wikilintConfig"))return mw.config.get("wikilintConfig");let t={...e,ext:Object.keys(i.tags),namespaces:mw.config.get("wgFormattedNamespaces"),nsid:i.nsid,doubleUnderscore:i.doubleUnderscore.map(n=>Object.keys(n).map(r=>r.slice(2,-2))),variants:i.variants,protocol:i.urlProtocols};if([t.parserFunction[0]]=i.functionSynonyms,mw.loader.getState("ext.CodeMirror")===null)for(let[n,r]of Object.entries(i.functionSynonyms[0]))n.startsWith("#")||(t.parserFunction[0][`#${n}`]=r);t.parserFunction[1]=[...Object.keys(i.functionSynonyms[1]),"="];for(let[n,r]of Object.entries(i.img))t.img[n]=r.slice(4);return t};var I="npm/@bhsd/codemirror-mediawiki@2.11.3",_=I.slice(I.lastIndexOf("@")+1),{vendor:_e,userAgent:Ue,maxTouchPoints:Be,platform:Ge}=navigator,ce=_e.includes("Apple Computer")&&(Ue.includes("Mobile/")||Be>2)||Ge.includes("Mac"),Ee="codemirror-mediawiki-i18n",Xe={zh:"zh-hans","zh-hans":"zh-hans","zh-cn":"zh-hans","zh-my":"zh-hans","zh-sg":"zh-hans","zh-hant":"zh-hant","zh-tw":"zh-hant","zh-hk":"zh-hant","zh-mo":"zh-hant"},ae=Xe[mw.config.get("wgUserLanguage")]||"en",O=S(Ee)||{},{version:le}=O,Le=async e=>{if(O.lang!==ae||le!==_)try{Object.assign(O,await(await fetch(`${e}/${I}/i18n/${ae}.json`)).json()),C(Ee,O)}catch(i){mw.notify(u("i18n-failed",ae),{type:"error"}),console.error(i)}for(let[i,t]of Object.entries(O))i.endsWith("-mac")?ce&&mw.messages.set(`cm-mw-${i.slice(0,-4)}`,t):mw.messages.set(`cm-mw-${i}`,t)},u=(e,...i)=>mw.msg(`cm-mw-${e}`,...i),Se=e=>(e.find("a").add(e.filter("a")).attr("target","_blank"),e);function U(e,i){let t=mw.message(`cm-mw-${e}`);return i?t.parse():Se(t.parseDom())}var Me=e=>e.split(".",2).map(Number),Te=async(e,...i)=>{let t=Se($("<p>",{html:u(e,...i)}));return await mw.notify(t,{type:"success",autoHideSeconds:"long"}),t},Ce=async(e,i)=>{let t;if(!le)t=await Te("welcome");else if(i.length>0){let[n,r]=Me(e),[a,l]=Me(le);(a<n||a===n&&l<r)&&(t=await Te("welcome-addons",_,String(i.length),i.map(o=>`<li>${U(`addon-${o}`,!0)}</li>`).join("")))}t==null||t.find("#settings").click(n=>{n.preventDefault(),document.getElementById("cm-settings").dispatchEvent(new MouseEvent("click"))})},Oe=e=>{let i={};for(let[t,n]of Object.entries(O))t.startsWith("phrase-")&&(i[t.slice(7).replace(/-/gu," ")]=n);e.localize(i)};var Ye=ce?"metaKey":"ctrlKey",de=new WeakMap;function B(e){return e==null?void 0:e.name.replace(/_+/gu," ").trim()}var N=(e,i,t=B(e))=>{for(;B(e[i])===t;)e=e[i];return e},Ze=e=>{if(de.has(e))return de.get(e);let i=t=>{if(!t[Ye])return;let{view:n}=e,{state:r}=n,a=e.getNodeAt(n.posAtCoords(t));if(a){if(a.name.includes("mw-pagename")){t.preventDefault(),t.stopPropagation();let l=B(a),o=r.sliceDoc(N(a,"prevSibling",l).from,N(a,"nextSibling",l).to).trim();o.startsWith("/")&&(o=`:${mw.config.get("wgPageName")}${o}`);let s=0;l.includes("-template-name")?s=10:l.includes("-parserfunction")&&(s=828),open(new mw.Title(o,s).getUrl(void 0),"_blank")}else if(/-extlink-protocol/u.test(a.name))t.preventDefault(),open(r.sliceDoc(a.from,N(a.nextSibling,"nextSibling").to),"_blank");else if(/-extlink(?:_|$)/u.test(a.name)){t.preventDefault();let l=B(a),o=N(a,"prevSibling",l).prevSibling,s=N(a,"nextSibling",l);open(r.sliceDoc(o.from,s.to),"_blank")}}};return de.set(e,i),i},Ae=(e,i)=>{let{contentDOM:t}=e.view,n=Ze(e);i?(mw.loader.load("mediawiki.Title"),t.addEventListener("mousedown",n,{capture:!0}),t.style.setProperty("--codemirror-cursor","pointer")):i===!1&&(t.removeEventListener("mousedown",n,{capture:!0}),t.style.removeProperty("--codemirror-cursor"))};var x=new WeakMap,w=e=>x.get(e[0]),ge={getContents(){return w(this).view.state.doc.toString()},setContents(e){return w(this).setContent(e),this},getSelection(){let{state:e}=w(this).view,{selection:{main:{from:i,to:t}}}=e;return e.sliceDoc(i,t)},setSelection({start:e,end:i=e}){return w(this).view.dispatch({selection:{anchor:e,head:i}}),this},replaceSelection(e){let{view:i}=w(this);return i.dispatch(i.state.replaceSelection(e)),this},encapsulateSelection({pre:e="",peri:i="",post:t="",ownline:n,replace:r,selectPeri:a=!0,splitlines:l,selectionStart:o,selectionEnd:s=o}){let{view:d}=w(this),{state:c}=d,m=(y,f,p)=>{let q=0,J=0;return n&&(y>0&&!/[\n\r]/u.test(c.sliceDoc(y-1,y))&&(p=`
2
+ ${p}`,q=1),/[\n\r]/u.test(c.sliceDoc(f,f+1))||(p+=`
3
+ `,J=1)),[p,q,J]};if(n&&r&&!e&&!t&&o===void 0&&/^\s*=.*=\s*$/u.test(i)){let{selection:{main:{from:y,to:f}}}=c,[p]=m(y,f,i);return d.dispatch({changes:{from:y,to:f,insert:p},selection:{anchor:y+p.length}}),this}return A.replaceSelections(d,(y,{from:f,to:p})=>{o!==void 0&&(f=o,p=s);let q=a&&f===p,J=r||f===p?i:c.sliceDoc(f,p),[ie,qe,Fe]=m(f,p,l?J.split(`
4
+ `).map(Ke=>`${e}${Ke}${t}`).join(`
5
+ `):`${e}${J}${t}`),he=f+ie.length;return q?[ie,f+e.length+qe,he-t.length-Fe]:[ie,he]}),this},getCaretPosition(e){let{state:{selection:{main:{from:i,to:t,head:n}}}}=w(this).view;return e!=null&&e.startAndEnd?[i,t]:n},scrollToCaretPosition(){return w(this).scrollTo(),this}},me={getContents(){return w(this).model.getValue()},setContents(e){return w(this).model.setValue(e),this},getSelection(){let{model:e,editor:i}=w(this);return e.getValueInRange(i.getSelection())},setSelection({start:e,end:i=e}){let{model:t,editor:n}=w(this),{lineNumber:r,column:a}=t.getPositionAt(e),{lineNumber:l,column:o}=t.getPositionAt(i);return n.setSelection({startLineNumber:r,startColumn:a,endLineNumber:l,endColumn:o}),this},replaceSelection(e){let{editor:i}=w(this);return i.executeEdits("replaceSelection",[{range:i.getSelection(),text:e,forceMoveMarkers:!0}]),this},encapsulateSelection({pre:e="",peri:i="",post:t="",ownline:n,replace:r,splitlines:a,selectionStart:l,selectionEnd:o=l}){l!==void 0&&ge.setSelection.call(this,{start:l,end:o});let{model:s,editor:d}=w(this),c=d.getSelection(),m=r||c.isEmpty()?i:s.getValueInRange(c),y=`${n&&c.startColumn>1?`
6
6
  `:""}${a?m.split(`
7
7
  `).map(f=>`${e}${f}${t}`).join(`
8
8
  `):`${e}${m}${t}`}${n&&c.endColumn<=s.getLineLength(c.endLineNumber)?`
9
- `:""}`;return d.executeEdits("encapsulateSelection",[{range:c,text:y,forceMoveMarkers:!0}]),this},getCaretPosition(e){let{editor:i,model:t}=p(this),n=i.getSelection(),r=t.getOffsetAt(n.getEndPosition());return e!=null&&e.startAndEnd?[t.getOffsetAt(n.getStartPosition()),r]:r},scrollToCaretPosition(){let{editor:e}=p(this);return e.revealPosition(e.getPosition()),this}};var Ae=["bold-header","format-leakage","fostered-content","h1","illegal-attr","insecure-style","invalid-gallery","invalid-imagemap","invalid-invoke","lonely-apos","lonely-bracket","lonely-http","nested-link","no-arg","no-duplicate","no-ignored","obsolete-attr","obsolete-tag","parsing-order","pipe-like","table-layout","tag-like","unbalanced-header","unclosed-comment","unclosed-quote","unclosed-table","unescaped","unknown-page","unmatched-tag","unterminated-url","url-encoding","var-anchor","void-ext"];var $e="codemirror-mediawiki-addons",je="codemirror-mediawiki-wikilint",Y=["ESLint","Stylelint"],H=mw.config.get("wgUserName"),He=H&&`User:${H}/codemirror-mediawiki.json`;var N="codemirror-mediawiki-indent",w=new Set(S($e)),v=S(je)||{},T=new Map(Y.map(e=>[e,S(`codemirror-mediawiki-${e}`)])),B,me,G,X,M=localStorage.getItem(N)||"",ue={},Pe=new Map,Re=(e,i)=>{let t=e==="http"||e==="okay-but-empty"?`MediaWiki API request failed: ${e}`:$("<ul>",{html:i.errors.map(({html:n})=>$("<li>",{html:n}))});mw.notify(t,{type:"error",autoHideSeconds:"long"})},Je=(async()=>{if(H)return await mw.loader.using("mediawiki.api"),new mw.Api({parameters:{errorformat:"html",formatversion:"2"}})})(),fe=(async()=>{if(!H)return;let e={action:"query",prop:"revisions",titles:He,rvprop:"content",rvlimit:1};(await Je).get(e).then(i=>{var n;let{query:{pages:[t]}}=i;if(t!=null&&t.revisions){let r=JSON.parse(t.revisions[0].content);if(!((n=r.addons)!=null&&n.includes("save")))return;w.clear();for(let a of r.addons)w.add(a);r.indent&&localStorage.setItem(N,r.indent);for(let a of Y)r[a]&&T.set(a,r[a]);r.wikilint&&Object.assign(v,r.wikilint)}},Re)})(),Ie=async e=>{if(await mw.loader.using(["oojs-ui-windows","oojs-ui-widgets","oojs-ui.styles.icons-content","mediawiki.jqueryMsg"]),await fe,B)G.setValue([...w]),X.setValue(M);else{B=new OO.ui.MessageDialog({id:"cm-preference"});let t=new OO.ui.WindowManager;t.$element.appendTo(document.body),t.addWindows([B]),me=new OO.ui.IndexLayout;let n=new OO.ui.TabPanelLayout("main",{label:u("title")}),r=new OO.ui.TabPanelLayout("wikilint",{label:"WikiLint"}),a={};for(let s of Y){let d=T.get(s);ue[s]=new OO.ui.MultilineTextInputWidget({value:d?JSON.stringify(d,null,M||" "):""});let c=new OO.ui.FieldLayout(ue[s],{label:u(`${s}-config`),align:"top"}),m=new OO.ui.TabPanelLayout(s,{label:s,$content:c.$element});m.on("active",y=>{let[f]=m.$element.find("textarea");y&&!x.has(f)&&A.fromTextArea(f,"json")}),a[s]=m}me.addTabPanels([n,r,...Object.values(a)],0),G=new OO.ui.CheckboxMultiselectInputWidget({options:[{disabled:!0},...Object.keys(O).filter(s=>s!=="addon-indent"&&s.startsWith("addon-")&&!s.endsWith("-mac")).map(s=>({data:s.slice(6),label:_(s),disabled:s==="addon-wikiEditor"&&!mw.loader.getState("ext.wikiEditor")||s==="addon-save"&&!H}))],value:[...w]}),X=new OO.ui.TextInputWidget({value:M,placeholder:"\\t"});let l=new OO.ui.FieldLayout(G,{label:u("label"),align:"top"}),o=new OO.ui.FieldLayout(X,{label:u("addon-indent")});n.$element.append(l.$element,o.$element,$("<p>",{html:u("feedback","codemirror-mediawiki")})),r.$element.append(...Ae.map(s=>{let d=s==="no-arg"?"0":"1",c=new OO.ui.DropdownInputWidget({options:[{data:"0",label:u("wikilint-off")},{data:"1",label:u("wikilint-error")},{data:"2",label:u("wikilint-on")}],value:v[s]||d}),m=new OO.ui.FieldLayout(c,{label:s});return Pe.set(s,c),v[s]||(v[s]=d),m.$element}),$("<p>",{html:u("feedback","wikiparser-node")}))}let i=await B.open({message:me.$element,actions:[{action:"reject",label:mw.msg("ooui-dialog-message-reject")},{action:"accept",label:mw.msg("ooui-dialog-message-accept"),flags:"progressive"}],size:"medium"}).closing;if(typeof i=="object"&&i.action==="accept"){let t=M,n=w.has("save");M=X.getValue();let r=M!==t;if(r){for(let o of e)o==null||o.setIndent(M||" ");localStorage.setItem(N,M)}for(let[o,s]of Pe){let d=s.getValue();r||(r=d!==v[o]),v[o]=d}C(je,v);let a=[];for(let o of Y)try{let s=JSON.parse(ue[o].getValue().trim()||"null");r||(r=JSON.stringify(s)!==JSON.stringify(T.get(o))),T.set(o,s),C(`codemirror-mediawiki-${o}`,s)}catch(s){a.push(o)}a.length>0&&OO.ui.alert(u("json-error",a.join(u("and"))));let l=G.getValue();if(l.length!==w.size||!l.every(o=>w.has(o))){r=!0,w.clear();for(let o of l)w.add(o);for(let o of e)o==null||o.prefer(l);C($e,l)}if(r&&H&&(n||w.has("save"))){let o={action:"edit",title:He,text:JSON.stringify({addons:[...w],indent:M,wikilint:v,ESLint:T.get("ESLint"),Stylelint:T.get("Stylelint")}),summary:u("save-summary")};(await Je).postWithToken("csrf",o).then(()=>{mw.notify(_("save-success"),{type:"success"})},Re)}}};var ze=async e=>{if(!mw.loader.getState("ext.wikiEditor"))throw new Error("no-wikiEditor");if(await mw.loader.using("ext.wikiEditor"),!e.data("wikiEditorContext")){if(typeof mw.addWikiEditor=="function")mw.addWikiEditor(e);else{let{wikiEditor:{modules:{dialogs:{config:i}}}}=$;e.wikiEditor("addModule",{...$.wikiEditor.modules.toolbar.config.getDefaultConfig(),...i.getDefaultConfig()}),i.replaceIcons(e)}await new Promise(i=>{e.on("wikiEditor-toolbar-doneInitialSections",i)})}};var Ze="2.11",et=["useMonaco"];mw.loader.load(`${Z}/${I}/mediawiki.min.css`,"text/css");$.valHooks.textarea={get(e){let i=x.get(e);return i!=null&&i.visible?i.getContent():e.value},set(e,i){let t=x.get(e);t!=null&&t.visible?t.setContent(i):e.value=i}};var W={},We={"sanitized-css":"css",js:"javascript",scribunto:"lua",wikitext:"mediawiki"},tt={mediawiki:"wikitext",template:"wikitext",gadget:"javascript",plain:"plaintext"},Qe=e=>!e.closest("#cm-preference"),E,k,b,P,R,ee,De,D,pe,Q=class Q extends Ne{constructor(t,n,r,a,l=!0){var o,s;if((o=x.get(t))!=null&&o.visible)throw new RangeError("The textarea has already been replaced by CodeMirror.");super(t,n,a,!1);L(this,ee);L(this,D);L(this,E,!1);L(this,k,void 0);L(this,b,void 0);L(this,P,void 0);L(this,R," ");this.ns=r,x.set(t,this),l?this.initialize(a):(q(this,ee,De).call(this),$(t).data("jquery.textSelection",ge)),Qe(t)&&(mw.hook("wiki-codemirror6").fire(this),t.id==="wpTextbox1"&&((s=t.form)==null||s.addEventListener("submit",()=>{let d=document.querySelector("#wpScrolltop");d&&this.view&&g(this,E)&&(d.value=String(this.view.scrollDOM.scrollTop))})))}get visible(){return g(this,E)}get model(){return g(this,b)}get editor(){return g(this,P)}toggle(t=!g(this,E)){let{textarea:n}=this;g(this,b)?t&&!g(this,E)?(g(this,b).setValue(n.value),q(this,D,pe).call(this),g(this,k).style.display="",n.style.display="none",$(n).data("jquery.textSelection",ge)):!t&&g(this,E)&&(g(this,k).style.display="none",n.style.display="",$(n).removeData("jquery.textSelection")):(super.toggle(t),$(n).data("jquery.textSelection",t&&de)),j(this,E,t)}setContent(t){g(this,b)?g(this,b).setValue(t):super.setContent(t)}getContent(){return this.view?this.view.state.doc.toString():g(this,b).getValue()}setIndent(t){if(g(this,P)){j(this,R,t);let n=t.includes(" ");g(this,P).updateOptions({tabSize:n?4:Number(t),insertSpaces:!n})}else super.setIndent(t)}async getLinter(t){let n=await super.getLinter(t);return W[this.lang]=n,n}async defaultLint(t,n=this.ns){if(!t){this.lint();return}let{lang:r}=this,a=T.get("ESLint"),l=T.get("Stylelint"),o;if(typeof n=="number"?r==="mediawiki"&&(n===10||n===828||n===2)?o={include:!0}:r==="javascript"?o={env:{browser:!0,es2024:!0,jquery:!0},globals:{mw:"readonly",mediaWiki:"readonly",OO:"readonly"},...n===8||n===2300?{parserOptions:{ecmaVersion:8}}:{},...a}:r==="css"&&l&&(o=l):o=n,r in W)o&&await this.getLinter(o);else{if(r==="mediawiki"){let s=mw.config.get("wgUserLanguage");["zh","zh-hans","zh-cn","zh-sg","zh-my"].includes(s)?o={...o,i18n:"zh-hans"}:["zh-hant","zh-tw","zh-hk","zh-mo"].includes(s)&&(o={...o,i18n:"zh-hant"})}if(await this.getLinter(o),r==="mediawiki"){let[s,d]=await Promise.all([oe(),wikiparse.getConfig()]);wikiparse.setConfig(xe(d,s))}}W[r]&&(r==="mediawiki"?this.lint(async s=>(await W[r](s)).filter(({rule:d,severity:c})=>Number(v[d])>+(c==="warning"))):this.lint(W[r]))}prefer(t){if(this.view){super.prefer(t);let n=Array.isArray(t)?a=>t.includes(a):a=>t[a],r=n("lint");r!==void 0&&this.defaultLint(r),Oe(this,n("openLinks"))}}static async fromTextArea(t,n,r){var d;if(w.has("wikiEditor")&&Qe(t))try{await ze($(t))}catch(c){c instanceof Error&&c.message==="no-wikiEditor"&&mw.notify(u(c.message),{type:"error"}),w.delete("wikiEditor")}if(!n&&r===void 0){let{wgAction:c,wgNamespaceNumber:m,wgPageContentModel:y}=mw.config.get();c==="edit"||c==="submit"?(r=m,n=m===274?"html":y.toLowerCase()):(await mw.loader.using("oojs-ui-windows"),n=(d=await OO.ui.prompt(u("contentmodel"))||void 0)==null?void 0:d.toLowerCase())}n&&n in We&&(n=We[n]);let a=!w.has("useMonaco"),l=a&&(n==="mediawiki"||n==="html"),o=new Q(t,l?void 0:n,r,void 0,a);if(l){let c;if(mw.config.get("wgServerName").endsWith(".moegirl.org.cn"))if(mw.config.exists("wikilintConfig"))c=mw.config.get("extCodeMirrorConfig");else{let m=await(await fetch(`${Z}/npm/wikiparser-node@browser/config/moegirl.json`)).json();mw.config.set("wikilintConfig",m),c=Ne.getMwConfig(m),mw.config.set("extCodeMirrorConfig",c)}else c=await oe();o.setLanguage(n,{...c,tagModes:Q.mwTagModes})}await fe,o.prefer([...w]);let s=localStorage.getItem(N);return s&&o.setIndent(s),o}};E=new WeakMap,k=new WeakMap,b=new WeakMap,P=new WeakMap,R=new WeakMap,ee=new WeakSet,De=async function(){"monaco"in window||await $.ajax(`${Z}/npm/monaco-wiki/dist/all.min.js`,{dataType:"script",scriptAttrs:{type:"module"}});let{textarea:t,lang:n}=this,r=tt[n]||n,a=g(this,R).includes(" ");j(this,b,(await monaco).editor.createModel(t.value,r)),j(this,k,document.createElement("div")),q(this,D,pe).call(this),g(this,k).style.minHeight="2em",t.after(g(this,k)),t.style.display="none",j(this,P,monaco.editor.create(g(this,k),{model:g(this,b),automaticLayout:!0,theme:"monokai",readOnly:t.readOnly,wordWrap:r==="wikitext"||r==="html"||r==="plaintext"?"on":"off",wordBreak:"keepAll",tabSize:a?4:Number(g(this,R)),insertSpaces:!a,glyphMargin:!0,fontSize:parseFloat(getComputedStyle(t).fontSize),unicodeHighlight:{ambiguousCharacters:r!=="wikitext"&&r!=="html"&&r!=="plaintext"}}));let l;g(this,b).onDidChangeContent(()=>{clearTimeout(l),l=window.setTimeout(()=>{t.value=g(this,b).getValue()},400)})},D=new WeakSet,pe=function(){let{textarea:{offsetHeight:t,style:{height:n}}}=this;g(this,k).style.height=t?`${t}px`:n},Q.version=K;var A=Q;document.body.addEventListener("click",e=>{e.target instanceof HTMLTextAreaElement&&e.shiftKey&&!x.has(e.target)&&(e.preventDefault(),A.fromTextArea(e.target))});(async()=>{let e={minerva:"page-actions-overflow",moeskin:"ca-more-actions",citizen:"p-tb"};await Promise.all([mw.loader.using("mediawiki.util"),Ee(Z)]),mw.hook("wiki-codemirror6").add(Ce),mw.util.addPortletLink(e[mw.config.get("skin")]||"p-cactions","#",u("title"),"cm-settings").addEventListener("click",i=>{i.preventDefault();let t=[...document.querySelectorAll(".cm-editor + textarea")];Ie(t.map(n=>x.get(n)))}),Se(Ze,et)})();Object.assign(window,{CodeMirror6:A});export{A as CodeMirror};
9
+ `:""}`;return d.executeEdits("encapsulateSelection",[{range:c,text:y,forceMoveMarkers:!0}]),this},getCaretPosition(e){let{editor:i,model:t}=w(this),n=i.getSelection(),r=t.getOffsetAt(n.getEndPosition());return e!=null&&e.startAndEnd?[t.getOffsetAt(n.getStartPosition()),r]:r},scrollToCaretPosition(){let{editor:e}=w(this);return e.revealPosition(e.getPosition()),this}};var Pe=["bold-header","format-leakage","fostered-content","h1","illegal-attr","insecure-style","invalid-gallery","invalid-imagemap","invalid-invoke","lonely-apos","lonely-bracket","lonely-http","nested-link","no-arg","no-duplicate","no-ignored","obsolete-attr","obsolete-tag","parsing-order","pipe-like","table-layout","tag-like","unbalanced-header","unclosed-comment","unclosed-quote","unclosed-table","unescaped","unknown-page","unmatched-tag","unterminated-url","url-encoding","var-anchor","void-ext"];var je="codemirror-mediawiki-addons",He="codemirror-mediawiki-wikilint",Z=["ESLint","Stylelint"],H=mw.config.get("wgUserName"),Re=H&&`User:${H}/codemirror-mediawiki.json`;var z="codemirror-mediawiki-indent",h=new Set(S(je)),v=S(He)||{},E=new Map(Z.map(e=>[e,S(`codemirror-mediawiki-${e}`)])),G,ue,X,Y,T=localStorage.getItem(z)||"",fe={},$e=new Map,Je=(e,i)=>{let t=e==="http"||e==="okay-but-empty"?`MediaWiki API request failed: ${e}`:$("<ul>",{html:i.errors.map(({html:n})=>$("<li>",{html:n}))});mw.notify(t,{type:"error",autoHideSeconds:"long"})},Ie=(async()=>{if(H)return await mw.loader.using("mediawiki.api"),new mw.Api({parameters:{errorformat:"html",formatversion:"2"}})})(),pe=(async()=>{if(!H)return;let e={action:"query",prop:"revisions",titles:Re,rvprop:"content",rvlimit:1};(await Ie).get(e).then(i=>{var n;let{query:{pages:[t]}}=i;if(t!=null&&t.revisions){let r=JSON.parse(t.revisions[0].content);if(!((n=r.addons)!=null&&n.includes("save")))return;h.clear();for(let a of r.addons)h.add(a);r.indent&&localStorage.setItem(z,r.indent);for(let a of Z)r[a]&&E.set(a,r[a]);r.wikilint&&Object.assign(v,r.wikilint)}},Je)})(),Ne=async e=>{if(await mw.loader.using(["oojs-ui-windows","oojs-ui-widgets","oojs-ui.styles.icons-content","mediawiki.jqueryMsg"]),await pe,G)X.setValue([...h]),Y.setValue(T);else{G=new OO.ui.MessageDialog({id:"cm-preference"});let t=new OO.ui.WindowManager;t.$element.appendTo(document.body),t.addWindows([G]),ue=new OO.ui.IndexLayout;let n=new OO.ui.TabPanelLayout("main",{label:u("title")}),r=new OO.ui.TabPanelLayout("wikilint",{label:"WikiLint"}),a={};for(let s of Z){let d=E.get(s);fe[s]=new OO.ui.MultilineTextInputWidget({value:d?JSON.stringify(d,null,T||" "):""});let c=new OO.ui.FieldLayout(fe[s],{label:u(`${s}-config`),align:"top"}),m=new OO.ui.TabPanelLayout(s,{label:s,$content:c.$element});m.on("active",y=>{let[f]=m.$element.find("textarea");y&&!x.has(f)&&(async()=>{let{editor:p}=await A.fromTextArea(f,"json");p&&(p.getContainerDomNode().style.height=`${Math.max(p.getContentHeight(),400)}px`)})()}),a[s]=m}ue.addTabPanels([n,r,...Object.values(a)],0),X=new OO.ui.CheckboxMultiselectInputWidget({options:[{disabled:!0},...Object.keys(O).filter(s=>s!=="addon-indent"&&s.startsWith("addon-")&&!s.endsWith("-mac")).map(s=>({data:s.slice(6),label:U(s),disabled:s==="addon-wikiEditor"&&!mw.loader.getState("ext.wikiEditor")||s==="addon-save"&&!H}))],value:[...h]}),Y=new OO.ui.TextInputWidget({value:T,placeholder:"\\t"});let l=new OO.ui.FieldLayout(X,{label:u("label"),align:"top"}),o=new OO.ui.FieldLayout(Y,{label:u("addon-indent")});n.$element.append(l.$element,o.$element,$("<p>",{html:u("feedback","codemirror-mediawiki")})),r.$element.append(...Pe.map(s=>{let d=s==="no-arg"?"0":"1",c=new OO.ui.DropdownInputWidget({options:[{data:"0",label:u("wikilint-off")},{data:"1",label:u("wikilint-error")},{data:"2",label:u("wikilint-on")}],value:v[s]||d}),m=new OO.ui.FieldLayout(c,{label:s});return $e.set(s,c),v[s]||(v[s]=d),m.$element}),$("<p>",{html:u("feedback","wikiparser-node")}))}let i=await G.open({message:ue.$element,actions:[{action:"reject",label:mw.msg("ooui-dialog-message-reject")},{action:"accept",label:mw.msg("ooui-dialog-message-accept"),flags:"progressive"}],size:"medium"}).closing;if(typeof i=="object"&&i.action==="accept"){let t=T,n=h.has("save");T=Y.getValue();let r=T!==t;if(r){for(let o of e)o==null||o.setIndent(T||" ");localStorage.setItem(z,T)}for(let[o,s]of $e){let d=s.getValue();r||(r=d!==v[o]),v[o]=d}C(He,v);let a=[];for(let o of Z)try{let s=JSON.parse(fe[o].getValue().trim()||"null");r||(r=JSON.stringify(s)!==JSON.stringify(E.get(o))),E.set(o,s),C(`codemirror-mediawiki-${o}`,s)}catch(s){a.push(o)}a.length>0&&OO.ui.alert(u("json-error",a.join(u("and"))));let l=X.getValue();if(l.length!==h.size||!l.every(o=>h.has(o))){r=!0,h.clear();for(let o of l)h.add(o);for(let o of e)o==null||o.prefer(l);C(je,l)}if(r&&H&&(n||h.has("save"))){let o={action:"edit",title:Re,text:JSON.stringify({addons:[...h],indent:T,wikilint:v,ESLint:E.get("ESLint"),Stylelint:E.get("Stylelint")}),summary:u("save-summary")};(await Ie).postWithToken("csrf",o).then(()=>{mw.notify(U("save-success"),{type:"success"})},Je)}}};var ze=async e=>{if(!mw.loader.getState("ext.wikiEditor"))throw new Error("no-wikiEditor");if(await mw.loader.using("ext.wikiEditor"),!e.data("wikiEditorContext")){if(typeof mw.addWikiEditor=="function")mw.addWikiEditor(e);else{let{wikiEditor:{modules:{dialogs:{config:i}}}}=$;e.wikiEditor("addModule",{...$.wikiEditor.modules.toolbar.config.getDefaultConfig(),...i.getDefaultConfig()}),i.replaceIcons(e)}await new Promise(i=>{e.on("wikiEditor-toolbar-doneInitialSections",i)})}};var et="2.11",tt=["useMonaco"];mw.loader.load(`${ee}/${I}/mediawiki.min.css`,"text/css");$.valHooks.textarea={get(e){let i=x.get(e);return i!=null&&i.visible?i.getContent():e.value},set(e,i){let t=x.get(e);t!=null&&t.visible?t.setContent(i):e.value=i}};var W={},Qe={"sanitized-css":"css",js:"javascript",scribunto:"lua",wikitext:"mediawiki"},it={mediawiki:"wikitext",template:"wikitext",gadget:"javascript",plain:"plaintext"},De=e=>!e.closest("#cm-preference"),L,k,b,j,D,R,te,Ve,V,we,Q=class Q extends We{constructor(t,n,r,a,l=!0){var o,s;if((o=x.get(t))!=null&&o.visible)throw new RangeError("The textarea has already been replaced by CodeMirror.");super(t,n,a,!1);M(this,te);M(this,V);M(this,L,!0);M(this,k,void 0);M(this,b,void 0);M(this,j,void 0);M(this,D,void 0);M(this,R," ");this.ns=r,x.set(t,this),l?this.initialize(a):(P(this,D,F(this,te,Ve).call(this)),$(t).data("jquery.textSelection",me)),De(t)&&(mw.hook("wiki-codemirror6").fire(this),t.id==="wpTextbox1"&&((s=t.form)==null||s.addEventListener("submit",()=>{let d=document.querySelector("#wpScrolltop");d&&this.view&&g(this,L)&&(d.value=String(this.view.scrollDOM.scrollTop))})))}get visible(){return g(this,L)}get model(){return g(this,b)}get editor(){return g(this,j)}toggle(t=!g(this,L)){let{textarea:n}=this;g(this,b)?t&&!g(this,L)?(g(this,b).setValue(n.value),F(this,V,we).call(this),g(this,k).style.display="",n.style.display="none",$(n).data("jquery.textSelection",me)):!t&&g(this,L)&&(g(this,k).style.display="none",n.style.display="",$(n).removeData("jquery.textSelection")):(super.toggle(t),$(n).data("jquery.textSelection",t&&ge)),P(this,L,t)}setContent(t){g(this,b)?g(this,b).setValue(t):super.setContent(t)}getContent(){return this.view?this.view.state.doc.toString():g(this,b).getValue()}setIndent(t){if(g(this,j)){P(this,R,t);let n=t.includes(" ");g(this,j).updateOptions({tabSize:n?4:Number(t),insertSpaces:!n})}else super.setIndent(t)}async getLinter(t){let n=await super.getLinter(t);return W[this.lang]=n,n}async defaultLint(t,n=this.ns){if(!t){this.lint();return}let{lang:r}=this,a=E.get("ESLint"),l=E.get("Stylelint"),o;if(typeof n=="number"?r==="mediawiki"&&(n===10||n===828||n===2)?o={include:!0}:r==="javascript"?o={env:{browser:!0,es2024:!0,jquery:!0},globals:{mw:"readonly",mediaWiki:"readonly",OO:"readonly"},...n===8||n===2300?{parserOptions:{ecmaVersion:8}}:{},...a}:r==="css"&&l&&(o=l):o=n,r in W)o&&await this.getLinter(o);else{if(r==="mediawiki"){let s=mw.config.get("wgUserLanguage");["zh","zh-hans","zh-cn","zh-sg","zh-my"].includes(s)?o={...o,i18n:"zh-hans"}:["zh-hant","zh-tw","zh-hk","zh-mo"].includes(s)&&(o={...o,i18n:"zh-hant"})}if(await this.getLinter(o),r==="mediawiki"){let[s,d]=await Promise.all([se(),wikiparse.getConfig()]);wikiparse.setConfig(ke(d,s))}}W[r]&&(r==="mediawiki"?this.lint(async s=>(await W[r](s)).filter(({rule:d,severity:c})=>Number(v[d])>+(c==="warning"))):this.lint(W[r]))}prefer(t){if(this.view){super.prefer(t);let n=Array.isArray(t)?a=>t.includes(a):a=>t[a],r=n("lint");r!==void 0&&this.defaultLint(r),Ae(this,n("openLinks"))}}static async fromTextArea(t,n,r){var d;if(h.has("wikiEditor")&&De(t))try{await ze($(t))}catch(c){c instanceof Error&&c.message==="no-wikiEditor"&&mw.notify(u(c.message),{type:"error"}),h.delete("wikiEditor")}if(!n&&r===void 0){let{wgAction:c,wgNamespaceNumber:m,wgPageContentModel:y}=mw.config.get();c==="edit"||c==="submit"?(r=m,n=m===274?"html":y.toLowerCase()):(await mw.loader.using("oojs-ui-windows"),n=(d=await OO.ui.prompt(u("contentmodel"))||void 0)==null?void 0:d.toLowerCase())}n&&n in Qe&&(n=Qe[n]);let a=!h.has("useMonaco"),l=a&&(n==="mediawiki"||n==="html"),o=new Q(t,l?void 0:n,r,void 0,a);if(l){let c;if(mw.config.get("wgServerName").endsWith(".moegirl.org.cn"))if(mw.config.exists("wikilintConfig"))c=mw.config.get("extCodeMirrorConfig");else{let m=await(await fetch(`${ee}/npm/wikiparser-node@browser/config/moegirl.json`)).json();mw.config.set("wikilintConfig",m),c=We.getMwConfig(m),mw.config.set("extCodeMirrorConfig",c)}else c=await se();o.setLanguage(n,{...c,tagModes:Q.mwTagModes})}await Promise.all([pe,g(o,D)]),o.prefer([...h]);let s=localStorage.getItem(z);return s&&o.setIndent(s),o}};L=new WeakMap,k=new WeakMap,b=new WeakMap,j=new WeakMap,D=new WeakMap,R=new WeakMap,te=new WeakSet,Ve=async function(){"monaco"in window||await $.ajax(`${ee}/npm/monaco-wiki/dist/all.min.js`,{dataType:"script",scriptAttrs:{type:"module"}});let{textarea:t,lang:n}=this,r=it[n]||n,a=g(this,R).includes(" ");P(this,b,(await monaco).editor.createModel(t.value,r)),P(this,k,document.createElement("div")),F(this,V,we).call(this),g(this,k).style.minHeight="2em",t.after(g(this,k)),t.style.display="none",P(this,j,monaco.editor.create(g(this,k),{model:g(this,b),automaticLayout:!0,theme:"monokai",readOnly:t.readOnly,wordWrap:r==="wikitext"||r==="html"||r==="plaintext"?"on":"off",wordBreak:"keepAll",tabSize:a?4:Number(g(this,R)),insertSpaces:!a,glyphMargin:!0,fontSize:parseFloat(getComputedStyle(t).fontSize),unicodeHighlight:{ambiguousCharacters:r!=="wikitext"&&r!=="html"&&r!=="plaintext"}}));let l;g(this,b).onDidChangeContent(()=>{clearTimeout(l),l=window.setTimeout(()=>{t.value=g(this,b).getValue()},400)})},V=new WeakSet,we=function(){let{textarea:{offsetHeight:t,style:{height:n}}}=this;g(this,k).style.height=t?`${t}px`:n},Q.version=_;var A=Q;document.body.addEventListener("click",e=>{e.target instanceof HTMLTextAreaElement&&e.shiftKey&&!x.has(e.target)&&(e.preventDefault(),A.fromTextArea(e.target))});(async()=>{let e={minerva:"page-actions-overflow",moeskin:"ca-more-actions",citizen:"p-tb"};await Promise.all([mw.loader.using("mediawiki.util"),Le(ee)]),mw.hook("wiki-codemirror6").add(Oe),mw.util.addPortletLink(e[mw.config.get("skin")]||"p-cactions","#",u("title"),"cm-settings").addEventListener("click",i=>{i.preventDefault();let t=[...document.querySelectorAll(".cm-editor + textarea")];Ne(t.map(n=>x.get(n)))}),Ce(et,tt)})();Object.assign(window,{CodeMirror6:A});export{A as CodeMirror};
10
10
  //# sourceMappingURL=mw.min.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../mw/base.ts", "../mw/util.ts", "../mw/config.ts", "../mw/msg.ts", "../mw/openLinks.ts", "../mw/textSelection.ts", "../../wikiparser-node/base.ts", "../mw/preference.ts", "../mw/wikiEditor.ts"],
4
- "sourcesContent": ["import {CodeMirror6, CDN} from 'https://testingcf.jsdelivr.net/npm/@bhsd/codemirror-mediawiki@2.11.1/dist/main.min.js';\nimport {getMwConfig, getParserConfig} from './config';\nimport {openLinks} from './openLinks';\nimport {instances, textSelection, monacoTextSelection} from './textSelection';\nimport {openPreference, prefs, indentKey, wikilintConfig, codeConfigs, loadJSON} from './preference';\nimport {msg, setI18N, welcome, REPO_CDN, curVersion, localize} from './msg';\nimport {wikiEditor} from './wikiEditor';\nimport type {Diagnostic} from '@codemirror/lint';\nimport type {Config, LintError} from 'wikiparser-node';\nimport type {Linter} from 'eslint';\nimport type * as Monaco from 'monaco-editor';\nimport type {LintSource, MwConfig} from '../src/codemirror';\n\ndeclare global {\n\tconst monaco: typeof Monaco;\n}\n\n// \u6BCF\u6B21\u65B0\u589E\u63D2\u4EF6\u90FD\u9700\u8981\u4FEE\u6539\u8FD9\u91CC\nconst baseVersion = '2.11',\n\taddons = ['useMonaco'];\n\nmw.loader.load(`${CDN}/${REPO_CDN}/mediawiki.min.css`, 'text/css');\n\n/**\n * jQuery.val overrides for CodeMirror.\n */\n$.valHooks['textarea'] = {\n\tget(elem: HTMLTextAreaElement): string {\n\t\tconst cm = instances.get(elem);\n\t\treturn cm?.visible ? cm.getContent() : elem.value;\n\t},\n\tset(elem: HTMLTextAreaElement, value: string): void {\n\t\tconst cm = instances.get(elem);\n\t\tif (cm?.visible) {\n\t\t\tcm.setContent(value);\n\t\t} else {\n\t\t\telem.value = value;\n\t\t}\n\t},\n};\n\nconst linters: Record<string, LintSource | undefined> = {},\n\tlangMap: Record<string, string> = {\n\t\t'sanitized-css': 'css',\n\t\tjs: 'javascript',\n\t\tscribunto: 'lua',\n\t\twikitext: 'mediawiki',\n\t},\n\tmonacoLangs: Record<string, string> = {\n\t\tmediawiki: 'wikitext',\n\t\ttemplate: 'wikitext',\n\t\tgadget: 'javascript',\n\t\tplain: 'plaintext',\n\t};\n\n/**\n * \u5224\u65AD\u662F\u5426\u4E3A\u666E\u901A\u7F16\u8F91\u5668\n * @param textarea \u6587\u672C\u6846\n */\nconst isEditor = (textarea: HTMLTextAreaElement): boolean => !textarea.closest('#cm-preference');\n\n/** \u4E13\u7528\u4E8EMW\u73AF\u5883\u7684 CodeMirror 6 \u7F16\u8F91\u5668 */\nexport class CodeMirror extends CodeMirror6 {\n\tstatic version = curVersion;\n\n\tdeclare ns;\n\t#visible = false;\n\t#container: HTMLDivElement | undefined;\n\t#model: Monaco.editor.ITextModel | undefined;\n\t#editor: Monaco.editor.IStandaloneCodeEditor | undefined;\n\t#indentStr = '\\t';\n\n\toverride get visible(): boolean {\n\t\treturn this.#visible;\n\t}\n\n\tget model(): Monaco.editor.ITextModel | undefined {\n\t\treturn this.#model;\n\t}\n\n\tget editor(): Monaco.editor.IStandaloneCodeEditor | undefined {\n\t\treturn this.#editor;\n\t}\n\n\t/**\n\t * @param textarea \u6587\u672C\u6846\n\t * @param lang \u8BED\u8A00\n\t * @param ns \u547D\u540D\u7A7A\u95F4\n\t * @param config \u8BED\u8A00\u8BBE\u7F6E\n\t * @param isCM \u662F\u5426\u4F7F\u7528 CodeMirror\n\t */\n\tconstructor(textarea: HTMLTextAreaElement, lang?: string, ns?: number, config?: unknown, isCM = true) {\n\t\tif (instances.get(textarea)?.visible) {\n\t\t\tthrow new RangeError('The textarea has already been replaced by CodeMirror.');\n\t\t}\n\t\tsuper(textarea, lang, config, false);\n\t\tthis.ns = ns;\n\t\tinstances.set(textarea, this);\n\t\tif (isCM) {\n\t\t\tthis.initialize(config);\n\t\t} else {\n\t\t\tvoid this.#initMonaco();\n\t\t\t$(textarea).data('jquery.textSelection', monacoTextSelection);\n\t\t}\n\t\tif (isEditor(textarea)) {\n\t\t\tmw.hook('wiki-codemirror6').fire(this);\n\t\t\tif (textarea.id === 'wpTextbox1') {\n\t\t\t\ttextarea.form?.addEventListener('submit', () => {\n\t\t\t\t\tconst scrollTop = document.querySelector<HTMLInputElement>('#wpScrolltop');\n\t\t\t\t\tif (scrollTop && this.view && this.#visible) {\n\t\t\t\t\t\tscrollTop.value = String(this.view.scrollDOM.scrollTop);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t/** \u521D\u59CB\u5316 Monaco \u7F16\u8F91\u5668 */\n\tasync #initMonaco(): Promise<void> {\n\t\tif (!('monaco' in window)) {\n\t\t\tawait $.ajax(\n\t\t\t\t`${CDN}/npm/monaco-wiki/dist/all.min.js`,\n\t\t\t\t{dataType: 'script', scriptAttrs: {type: 'module'}} as JQuery.AjaxSettings,\n\t\t\t);\n\t\t}\n\t\tconst {textarea, lang: cmLang} = this,\n\t\t\tlang = monacoLangs[cmLang] || cmLang,\n\t\t\ttab = this.#indentStr.includes('\\t');\n\t\t// eslint-disable-next-line @typescript-eslint/await-thenable\n\t\tthis.#model = (await monaco).editor.createModel(textarea.value, lang);\n\t\tthis.#container = document.createElement('div');\n\t\tthis.#refresh();\n\t\tthis.#container.style.minHeight = '2em';\n\t\ttextarea.after(this.#container);\n\t\ttextarea.style.display = 'none';\n\t\tthis.#editor = monaco.editor.create(this.#container, {\n\t\t\tmodel: this.#model,\n\t\t\tautomaticLayout: true,\n\t\t\ttheme: 'monokai',\n\t\t\treadOnly: textarea.readOnly,\n\t\t\twordWrap: lang === 'wikitext' || lang === 'html' || lang === 'plaintext' ? 'on' : 'off',\n\t\t\twordBreak: 'keepAll',\n\t\t\ttabSize: tab ? 4 : Number(this.#indentStr),\n\t\t\tinsertSpaces: !tab,\n\t\t\tglyphMargin: true,\n\t\t\tfontSize: parseFloat(getComputedStyle(textarea).fontSize),\n\t\t\tunicodeHighlight: {\n\t\t\t\tambiguousCharacters: lang !== 'wikitext' && lang !== 'html' && lang !== 'plaintext',\n\t\t\t},\n\t\t});\n\t\tlet timer: number;\n\t\tthis.#model.onDidChangeContent(() => {\n\t\t\tclearTimeout(timer);\n\t\t\ttimer = window.setTimeout(() => {\n\t\t\t\ttextarea.value = this.#model!.getValue();\n\t\t\t}, 400);\n\t\t});\n\t}\n\n\t/** \u5237\u65B0 Monaco \u7F16\u8F91\u5668\u9AD8\u5EA6 */\n\t#refresh(): void {\n\t\tconst {textarea: {offsetHeight, style: {height}}} = this;\n\t\tthis.#container!.style.height = offsetHeight ? `${offsetHeight}px` : height;\n\t}\n\n\toverride toggle(show = !this.#visible): void {\n\t\tconst {textarea} = this;\n\t\tif (!this.#model) {\n\t\t\tsuper.toggle(show);\n\t\t\t$(textarea).data('jquery.textSelection', show && textSelection);\n\t\t} else if (show && !this.#visible) {\n\t\t\tthis.#model.setValue(textarea.value);\n\t\t\tthis.#refresh();\n\t\t\tthis.#container!.style.display = '';\n\t\t\ttextarea.style.display = 'none';\n\t\t\t$(textarea).data('jquery.textSelection', monacoTextSelection);\n\t\t} else if (!show && this.#visible) {\n\t\t\tthis.#container!.style.display = 'none';\n\t\t\ttextarea.style.display = '';\n\t\t\t$(textarea).removeData('jquery.textSelection');\n\t\t}\n\t\tthis.#visible = show;\n\t}\n\n\toverride setContent(content: string): void {\n\t\tif (this.#model) {\n\t\t\tthis.#model.setValue(content);\n\t\t} else {\n\t\t\tsuper.setContent(content);\n\t\t}\n\t}\n\n\t/** \u83B7\u53D6\u7F16\u8F91\u5668\u5185\u5BB9 */\n\tgetContent(): string {\n\t\treturn this.view ? this.view.state.doc.toString() : this.#model!.getValue();\n\t}\n\n\toverride setIndent(indent: string): void {\n\t\tif (this.#editor) {\n\t\t\tthis.#indentStr = indent;\n\t\t\tconst tab = indent.includes('\\t');\n\t\t\tthis.#editor.updateOptions({tabSize: tab ? 4 : Number(indent), insertSpaces: !tab});\n\t\t} else {\n\t\t\tsuper.setIndent(indent);\n\t\t}\n\t}\n\n\toverride async getLinter(opt?: Record<string, unknown>): Promise<LintSource | undefined> {\n\t\tconst linter = await super.getLinter(opt);\n\t\tlinters[this.lang] = linter;\n\t\treturn linter;\n\t}\n\n\t/**\n\t * \u6DFB\u52A0\u6216\u79FB\u9664\u9ED8\u8BA4 linter\n\t * @param on \u662F\u5426\u6DFB\u52A0\n\t * @param opt linter\u9009\u9879\n\t * @param ns \u547D\u540D\u7A7A\u95F4\n\t */\n\tdefaultLint(on: boolean, opt: Record<string, unknown>): Promise<void>;\n\tdefaultLint(on: boolean, ns?: number): Promise<void>;\n\tasync defaultLint(on: boolean, optOrNs: Record<string, unknown> | number | undefined = this.ns): Promise<void> {\n\t\tif (!on) {\n\t\t\tthis.lint();\n\t\t\treturn;\n\t\t}\n\t\tconst {lang} = this,\n\t\t\teslint = codeConfigs.get('ESLint'),\n\t\t\tstylelint = codeConfigs.get('Stylelint');\n\t\tlet opt: Record<string, unknown> | undefined;\n\t\tif (typeof optOrNs === 'number') {\n\t\t\tif (lang === 'mediawiki' && (optOrNs === 10 || optOrNs === 828 || optOrNs === 2)) {\n\t\t\t\topt = {include: true};\n\t\t\t} else if (lang === 'javascript') {\n\t\t\t\topt = {\n\t\t\t\t\tenv: {browser: true, es2024: true, jquery: true},\n\t\t\t\t\tglobals: {mw: 'readonly', mediaWiki: 'readonly', OO: 'readonly'},\n\t\t\t\t\t...optOrNs === 8 || optOrNs === 2300 ? {parserOptions: {ecmaVersion: 8}} : {},\n\t\t\t\t\t...eslint,\n\t\t\t\t} as Linter.Config as Record<string, unknown>;\n\t\t\t} else if (lang === 'css' && stylelint) {\n\t\t\t\topt = stylelint;\n\t\t\t}\n\t\t} else {\n\t\t\topt = optOrNs;\n\t\t}\n\t\tif (!(lang in linters)) {\n\t\t\tif (lang === 'mediawiki') {\n\t\t\t\tconst i18n = mw.config.get('wgUserLanguage');\n\t\t\t\tif (['zh', 'zh-hans', 'zh-cn', 'zh-sg', 'zh-my'].includes(i18n)) {\n\t\t\t\t\topt = {...opt, i18n: 'zh-hans'};\n\t\t\t\t} else if (['zh-hant', 'zh-tw', 'zh-hk', 'zh-mo'].includes(i18n)) {\n\t\t\t\t\topt = {...opt, i18n: 'zh-hant'};\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait this.getLinter(opt);\n\t\t\tif (lang === 'mediawiki') {\n\t\t\t\tconst [mwConfig, minConfig] = await Promise.all([getMwConfig(), wikiparse.getConfig()]);\n\t\t\t\twikiparse.setConfig(getParserConfig(minConfig, mwConfig));\n\t\t\t}\n\t\t} else if (opt) {\n\t\t\tawait this.getLinter(opt);\n\t\t}\n\t\tif (linters[lang]) {\n\t\t\tif (lang === 'mediawiki') {\n\t\t\t\tthis.lint(\n\t\t\t\t\tasync doc => (await linters[lang]!(doc) as (Diagnostic & {rule: LintError.Rule})[])\n\t\t\t\t\t\t.filter(({rule, severity}) => Number(wikilintConfig[rule]) > Number(severity === 'warning')),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthis.lint(linters[lang]);\n\t\t\t}\n\t\t}\n\t}\n\n\toverride prefer(extensions: string[] | Record<string, boolean>): void {\n\t\tif (this.view) {\n\t\t\tsuper.prefer(extensions);\n\t\t\tconst hasExtension = Array.isArray(extensions)\n\t\t\t\t\t? (ext: string): boolean => extensions.includes(ext)\n\t\t\t\t\t: (ext: string): boolean | undefined => extensions[ext],\n\t\t\t\thasLint = hasExtension('lint');\n\t\t\tif (hasLint !== undefined) {\n\t\t\t\tvoid this.defaultLint(hasLint);\n\t\t\t}\n\t\t\topenLinks(this, hasExtension('openLinks'));\n\t\t}\n\t}\n\n\t/**\n\t * \u5C06 textarea \u66FF\u6362\u4E3A CodeMirror\n\t * @param textarea textarea \u5143\u7D20\n\t * @param lang \u8BED\u8A00\n\t * @param ns \u547D\u540D\u7A7A\u95F4\n\t */\n\tstatic async fromTextArea(textarea: HTMLTextAreaElement, lang?: string, ns?: number): Promise<CodeMirror> {\n\t\tif (prefs.has('wikiEditor') && isEditor(textarea)) {\n\t\t\ttry {\n\t\t\t\tawait wikiEditor($(textarea));\n\t\t\t} catch (e) {\n\t\t\t\tif (e instanceof Error && e.message === 'no-wikiEditor') {\n\t\t\t\t\tvoid mw.notify(msg(e.message), {type: 'error'});\n\t\t\t\t}\n\t\t\t\tprefs.delete('wikiEditor');\n\t\t\t}\n\t\t}\n\t\t/* eslint-disable no-param-reassign */\n\t\tif (!lang && ns === undefined) {\n\t\t\tconst {wgAction, wgNamespaceNumber, wgPageContentModel} = mw.config.get();\n\t\t\tif (wgAction === 'edit' || wgAction === 'submit') {\n\t\t\t\tns = wgNamespaceNumber;\n\t\t\t\tlang = wgNamespaceNumber === 274 ? 'html' : wgPageContentModel.toLowerCase();\n\t\t\t} else {\n\t\t\t\tawait mw.loader.using('oojs-ui-windows');\n\t\t\t\tlang = (await OO.ui.prompt(msg('contentmodel')) || undefined)?.toLowerCase();\n\t\t\t}\n\t\t}\n\t\tif (lang && lang in langMap) {\n\t\t\tlang = langMap[lang];\n\t\t}\n\t\t/* eslint-enable no-param-reassign */\n\t\tconst isCM = !prefs.has('useMonaco'),\n\t\t\tisWiki = isCM && (lang === 'mediawiki' || lang === 'html'),\n\t\t\tcm = new CodeMirror(textarea, isWiki ? undefined : lang, ns, undefined, isCM);\n\t\tif (isWiki) {\n\t\t\tlet config: MwConfig;\n\t\t\tif (mw.config.get('wgServerName').endsWith('.moegirl.org.cn')) {\n\t\t\t\tif (mw.config.exists('wikilintConfig')) {\n\t\t\t\t\tconfig = mw.config.get('extCodeMirrorConfig') as MwConfig;\n\t\t\t\t} else {\n\t\t\t\t\tconst parserConfig: Config = await (await fetch(\n\t\t\t\t\t\t`${CDN}/npm/wikiparser-node@browser/config/moegirl.json`,\n\t\t\t\t\t)).json();\n\t\t\t\t\tmw.config.set('wikilintConfig', parserConfig);\n\t\t\t\t\tconfig = CodeMirror6.getMwConfig(parserConfig);\n\t\t\t\t\tmw.config.set('extCodeMirrorConfig', config);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconfig = await getMwConfig();\n\t\t\t}\n\t\t\tcm.setLanguage(lang, {...config, tagModes: CodeMirror.mwTagModes});\n\t\t}\n\t\tawait loadJSON;\n\t\tcm.prefer([...prefs]);\n\t\tconst indent = localStorage.getItem(indentKey);\n\t\tif (indent) {\n\t\t\tcm.setIndent(indent);\n\t\t}\n\t\treturn cm;\n\t}\n}\n\ndocument.body.addEventListener('click', e => {\n\tif (e.target instanceof HTMLTextAreaElement && e.shiftKey && !instances.has(e.target)) {\n\t\te.preventDefault();\n\t\tvoid CodeMirror.fromTextArea(e.target);\n\t}\n});\n\n(async () => {\n\tconst portletContainer: Record<string, string> = {\n\t\tminerva: 'page-actions-overflow',\n\t\tmoeskin: 'ca-more-actions',\n\t\tcitizen: 'p-tb',\n\t};\n\tawait Promise.all([\n\t\tmw.loader.using('mediawiki.util'),\n\t\tsetI18N(CDN),\n\t]);\n\tmw.hook('wiki-codemirror6').add(localize);\n\tmw.util.addPortletLink(\n\t\tportletContainer[mw.config.get('skin')] || 'p-cactions',\n\t\t'#',\n\t\tmsg('title'),\n\t\t'cm-settings',\n\t)!.addEventListener('click', e => {\n\t\te.preventDefault();\n\t\tconst textareas = [...document.querySelectorAll<HTMLTextAreaElement>('.cm-editor + textarea')];\n\t\tvoid openPreference(textareas.map(textarea => instances.get(textarea)));\n\t});\n\tvoid welcome(baseVersion, addons);\n})();\n\nObject.assign(window, {CodeMirror6: CodeMirror});\n", "// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const getObject = (key: string): any => JSON.parse(String(localStorage.getItem(key)));\nexport const setObject = (key: string, value: unknown): void => {\n\tlocalStorage.setItem(key, JSON.stringify(value));\n};\n", "import {setObject, getObject} from './util';\nimport type {Config} from 'wikiparser-node';\nimport type {MwConfig} from '../src/mediawiki';\n\ndeclare interface MagicWord {\n\tname: string;\n\taliases: string[];\n\t'case-sensitive': boolean;\n}\n\n// \u548C\u672C\u5730\u7F13\u5B58\u6709\u5173\u7684\u5E38\u6570\nconst ALL_SETTINGS_CACHE: Record<string, {time: number, config: MwConfig}>\n\t\t= getObject('InPageEditMwConfig') || {},\n\tSITE_ID = typeof mw === 'object'\n\t\t? `${mw.config.get('wgServerName')}${mw.config.get('wgScriptPath')}`\n\t\t: location.origin,\n\tSITE_SETTINGS = ALL_SETTINGS_CACHE[SITE_ID],\n\tVALID = Number(SITE_SETTINGS?.time) > Date.now() - 86_400 * 1000 * 30;\n\n/**\n * \u5C06\u9B54\u672F\u5B57\u4FE1\u606F\u8F6C\u6362\u4E3ACodeMirror\u63A5\u53D7\u7684\u8BBE\u7F6E\n * @param magicWords \u5B8C\u6574\u9B54\u672F\u5B57\u5217\u8868\n * @param rule \u8FC7\u6EE4\u51FD\u6570\n * @param flip \u662F\u5426\u53CD\u5411\u7B5B\u9009\u5BF9\u5927\u5C0F\u5199\u654F\u611F\u7684\u9B54\u672F\u5B57\n */\nconst getConfig = (\n\tmagicWords: MagicWord[],\n\trule: (word: MagicWord) => boolean,\n\tflip?: boolean,\n): Record<string, string> => {\n\tconst words = magicWords.filter(rule).filter(({'case-sensitive': i}) => i !== flip)\n\t\t\t.flatMap(({aliases, name, 'case-sensitive': i}) => aliases.map(alias => ({\n\t\t\t\talias: (i ? alias : alias.toLowerCase()).replace(/:$/u, ''),\n\t\t\t\tname,\n\t\t\t}))),\n\t\tobj: Record<string, string> = {};\n\tfor (const {alias, name} of words) {\n\t\tobj[alias] = name;\n\t}\n\treturn obj;\n};\n\n/**\n * \u5C06\u9B54\u672F\u5B57\u4FE1\u606F\u8F6C\u6362\u4E3ACodeMirror\u63A5\u53D7\u7684\u8BBE\u7F6E\n * @param magicWords \u5B8C\u6574\u9B54\u672F\u5B57\u5217\u8868\n * @param rule \u8FC7\u6EE4\u51FD\u6570\n */\nconst getConfigPair = (\n\tmagicWords: MagicWord[],\n\trule: (word: MagicWord) => boolean,\n): [Record<string, string>, Record<string, string>] => [true, false]\n\t.map(bool => getConfig(magicWords, rule, bool)) as [Record<string, string>, Record<string, string>];\n\n/**\n * \u5C06\u8BBE\u7F6E\u4FDD\u5B58\u5230mw.config\n * @param config \u8BBE\u7F6E\n */\nconst setConfig = (config: MwConfig): void => {\n\tmw.config.set('extCodeMirrorConfig', config);\n};\n\n/** \u52A0\u8F7DCodeMirror\u7684mediawiki\u6A21\u5757\u9700\u8981\u7684\u8BBE\u7F6E */\nexport const getMwConfig = async (): Promise<MwConfig> => {\n\tif (mw.loader.getState('ext.CodeMirror') !== null && !VALID) { // \u53EA\u5728localStorage\u8FC7\u671F\u65F6\u624D\u4F1A\u91CD\u65B0\u52A0\u8F7Dext.CodeMirror.data\n\t\tawait mw.loader.using(mw.loader.getState('ext.CodeMirror.data') ? 'ext.CodeMirror.data' : 'ext.CodeMirror');\n\t}\n\n\tlet config = mw.config.get('extCodeMirrorConfig') as MwConfig | null;\n\tif (!config && VALID) {\n\t\t({config} = SITE_SETTINGS!);\n\t\tsetConfig(config);\n\t}\n\tconst isIPE = config && Object.values(config.functionSynonyms[0]).includes(true as unknown as string),\n\t\tnsid = mw.config.get('wgNamespaceIds');\n\t// \u60C5\u5F621\uFF1Aconfig\u5DF2\u66F4\u65B0\uFF0C\u53EF\u80FD\u6765\u81EAlocalStorage\n\tif (config?.img && config.variants && !isIPE) {\n\t\tconfig.urlProtocols = config.urlProtocols.replace(/\\\\:/gu, ':');\n\t\treturn {...config, nsid};\n\t}\n\n\t// \u4EE5\u4E0B\u60C5\u5F62\u5747\u9700\u8981\u53D1\u9001API\u8BF7\u6C42\n\t// \u60C5\u5F622\uFF1AlocalStorage\u672A\u8FC7\u671F\u4F46\u4E0D\u5305\u542B\u65B0\u8BBE\u7F6E\n\t// \u60C5\u5F623\uFF1A\u65B0\u52A0\u8F7D\u7684 ext.CodeMirror.data\n\t// \u60C5\u5F624\uFF1A`config === null`\n\tawait mw.loader.using('mediawiki.api');\n\tconst {\n\t\tquery: {general: {variants}, magicwords, extensiontags, functionhooks, variables},\n\t}: {\n\t\tquery: {\n\t\t\tgeneral: {variants?: {code: string}[]};\n\t\t\tmagicwords: MagicWord[];\n\t\t\textensiontags: string[];\n\t\t\tfunctionhooks: string[];\n\t\t\tvariables: string[];\n\t\t};\n\t} = await new mw.Api().get({\n\t\tmeta: 'siteinfo',\n\t\tsiprop: [\n\t\t\t'general',\n\t\t\t'magicwords',\n\t\t\t...config && !isIPE ? [] : ['extensiontags', 'functionhooks', 'variables'],\n\t\t],\n\t\tformatversion: '2',\n\t}) as any; // eslint-disable-line @typescript-eslint/no-explicit-any\n\tconst others = new Set(['msg', 'raw', 'msgnw', 'subst', 'safesubst']);\n\n\t// \u5148\u5904\u7406\u9B54\u672F\u5B57\u548C\u72B6\u6001\u5F00\u5173\n\tif (config && !isIPE) { // \u60C5\u5F622\u62163\n\t\tconst {functionSynonyms: [insensitive]} = config;\n\t\tif (!('subst' in insensitive)) {\n\t\t\tObject.assign(insensitive, getConfig(magicwords, ({name}) => others.has(name)));\n\t\t}\n\t} else { // \u60C5\u5F624\uFF1A`config === null`\n\t\t// @ts-expect-error incomplete properties\n\t\tconfig = {\n\t\t\ttagModes: {},\n\t\t\ttags: {},\n\t\t};\n\t\tfor (const tag of extensiontags) {\n\t\t\tconfig!.tags[tag.slice(1, -1)] = true;\n\t\t}\n\t\tconst functions = new Set([\n\t\t\t...functionhooks,\n\t\t\t...variables,\n\t\t\t...others,\n\t\t]);\n\t\tconfig!.functionSynonyms = getConfigPair(magicwords, ({name}) => functions.has(name));\n\t\tconfig!.doubleUnderscore = getConfigPair(\n\t\t\tmagicwords,\n\t\t\t({aliases}) => aliases.some(alias => /^__.+__$/u.test(alias)),\n\t\t);\n\t\tconfig!.fromApi = true;\n\t}\n\tconfig!.img = getConfig(magicwords, ({name}) => name.startsWith('img_'));\n\tconfig!.variants = variants ? variants.map(({code}) => code) : [];\n\tconfig!.nsid = nsid;\n\tconfig!.urlProtocols = mw.config.get('wgUrlProtocols').replace(/\\\\:/gu, ':');\n\tsetConfig(config!);\n\tALL_SETTINGS_CACHE[SITE_ID] = {config: config!, time: Date.now()};\n\tsetObject('InPageEditMwConfig', ALL_SETTINGS_CACHE);\n\treturn config!;\n};\n\n/**\n * \u5C06MwConfig\u8F6C\u6362\u4E3AConfig\n * @param minConfig \u57FA\u7840Config\n * @param mwConfig\n */\nexport const getParserConfig = (minConfig: Config, mwConfig: MwConfig): Config => {\n\tif (mw.config.exists('wikilintConfig')) {\n\t\treturn mw.config.get('wikilintConfig') as Config;\n\t}\n\tconst config: Config = {\n\t\t...minConfig,\n\t\text: Object.keys(mwConfig.tags),\n\t\tnamespaces: mw.config.get('wgFormattedNamespaces'),\n\t\tnsid: mwConfig.nsid,\n\t\tdoubleUnderscore: mwConfig.doubleUnderscore.map(\n\t\t\tobj => Object.keys(obj).map(s => s.slice(2, -2)),\n\t\t) as [string[], string[]],\n\t\tvariants: mwConfig.variants!,\n\t\tprotocol: mwConfig.urlProtocols,\n\t};\n\t[config.parserFunction[0]] = mwConfig.functionSynonyms;\n\tif (mw.loader.getState('ext.CodeMirror') === null) {\n\t\tfor (const [key, val] of Object.entries(mwConfig.functionSynonyms[0])) {\n\t\t\tif (!key.startsWith('#')) {\n\t\t\t\tconfig.parserFunction[0][`#${key}`] = val;\n\t\t\t}\n\t\t}\n\t}\n\tconfig.parserFunction[1] = [\n\t\t...Object.keys(mwConfig.functionSynonyms[1]),\n\t\t'=',\n\t];\n\tfor (const [key, val] of Object.entries(mwConfig.img!)) {\n\t\tconfig.img[key] = val.slice(4);\n\t}\n\treturn config;\n};\n", "import {getObject, setObject} from './util';\nimport type {CodeMirror} from './base';\n\nexport const REPO_CDN = 'npm/@bhsd/codemirror-mediawiki@2.11.1',\n\tcurVersion = REPO_CDN.slice(REPO_CDN.lastIndexOf('@') + 1);\n\nconst {vendor, userAgent, maxTouchPoints, platform} = navigator;\n\nexport const isMac = vendor.includes('Apple Computer') && (userAgent.includes('Mobile/') || maxTouchPoints > 2)\n\t|| platform.includes('Mac');\n\nconst storageKey = 'codemirror-mediawiki-i18n',\n\tlanguages: Record<string, string> = {\n\t\tzh: 'zh-hans',\n\t\t'zh-hans': 'zh-hans',\n\t\t'zh-cn': 'zh-hans',\n\t\t'zh-my': 'zh-hans',\n\t\t'zh-sg': 'zh-hans',\n\t\t'zh-hant': 'zh-hant',\n\t\t'zh-tw': 'zh-hant',\n\t\t'zh-hk': 'zh-hant',\n\t\t'zh-mo': 'zh-hant',\n\t},\n\tlang = languages[mw.config.get('wgUserLanguage')] || 'en';\n\n/** \u9884\u5B58\u7684I18N\uFF0C\u53EF\u4EE5\u7528\u4E8E\u5224\u65AD\u662F\u5426\u662F\u9996\u6B21\u5B89\u88C5 */\nexport const i18n: Record<string, string> = getObject(storageKey) || {};\n\nconst {version} = i18n;\n\n/**\n * \u52A0\u8F7D I18N\n * @param CDN CDN\u5730\u5740\n */\nexport const setI18N = async (CDN: string): Promise<void> => {\n\tif (i18n['lang'] !== lang || version !== curVersion) {\n\t\ttry {\n\t\t\tObject.assign(i18n, await (await fetch(`${CDN}/${REPO_CDN}/i18n/${lang}.json`)).json());\n\t\t\tsetObject(storageKey, i18n);\n\t\t} catch (e) {\n\t\t\tvoid mw.notify(msg('i18n-failed', lang), {type: 'error'});\n\t\t\tconsole.error(e);\n\t\t}\n\t}\n\tfor (const [k, v] of Object.entries(i18n)) {\n\t\tif (!k.endsWith('-mac')) {\n\t\t\tmw.messages.set(`cm-mw-${k}`, v);\n\t\t} else if (isMac) {\n\t\t\tmw.messages.set(`cm-mw-${k.slice(0, -4)}`, v);\n\t\t}\n\t}\n};\n\n/**\n * \u83B7\u53D6I18N\u6D88\u606F\n * @param key \u6D88\u606F\u952E\uFF0C\u7701\u7565`cm-mw-`\u524D\u7F00\n * @param args \u66FF\u6362`$1`\u7B49\u7684\u53C2\u6570\n */\nexport const msg = (key: string, ...args: string[]): string => mw.msg(`cm-mw-${key}`, ...args);\n\n/**\n * \u4E3A\u6240\u6709\u94FE\u63A5\u6DFB\u52A0`target=\"_blank\"`\n * @param $dom \u5BB9\u5668\n */\nconst blankTarget = ($dom: JQuery<HTMLElement>): JQuery<HTMLElement> => {\n\t$dom.find('a').add($dom.filter('a')).attr('target', '_blank');\n\treturn $dom;\n};\n\n/**\n * \u89E3\u6790I18N\u6D88\u606F\n * @param key \u6D88\u606F\u952E\uFF0C\u7701\u7565`cm-mw-`\u524D\u7F00\n * @param text \u662F\u5426\u8F93\u51FA\u4E3A\u6587\u672C\n */\nfunction parseMsg(key: string): JQuery<HTMLElement>;\nfunction parseMsg(key: string, text: true): string;\nfunction parseMsg(key: string, text?: boolean): string | JQuery<HTMLElement> {\n\tconst message = mw.message(`cm-mw-${key}`);\n\treturn text ? message.parse() : blankTarget(message.parseDom());\n}\nexport {parseMsg};\n\n/**\n * \u89E3\u6790\u7248\u672C\u53F7\n * @param v \u7248\u672C\u53F7\n */\nconst parseVersion = (v: string): [number, number] => v.split('.', 2).map(Number) as [number, number];\n\n/**\n * \u521B\u5EFA\u6C14\u6CE1\u63D0\u793A\u6D88\u606F\n * @param key \u6D88\u606F\u952E\uFF0C\u7701\u7565`cm-mw-`\u524D\u7F00\n * @param args \u66FF\u6362`$1`\u7B49\u7684\u53C2\u6570\n */\nconst notify = async (key: string, ...args: string[]): Promise<JQuery<HTMLElement>> => {\n\tconst $p = blankTarget($('<p>', {html: msg(key, ...args)}));\n\tawait mw.notify($p, {type: 'success', autoHideSeconds: 'long'});\n\treturn $p;\n};\n\n/**\n * \u6B22\u8FCE\u6D88\u606F\n * @param baseVersion \u9996\u6B21\u52A0\u5165\u65B0\u63D2\u4EF6\u7684\u7248\u672C\n * @param addons \u65B0\u63D2\u4EF6\n */\nexport const welcome = async (baseVersion: string, addons: string[]): Promise<void> => {\n\tlet notification: JQuery<HTMLElement> | undefined;\n\tif (!version) { // \u9996\u6B21\u5B89\u88C5\n\t\tnotification = await notify('welcome');\n\t} else if (addons.length > 0) { // \u66F4\u65B0\u7248\u672C\n\t\tconst [baseMajor, baseMinor] = parseVersion(baseVersion),\n\t\t\t[major, minor] = parseVersion(version);\n\t\tif (major < baseMajor || major === baseMajor && minor < baseMinor) {\n\t\t\tnotification = await notify(\n\t\t\t\t'welcome-addons',\n\t\t\t\tcurVersion,\n\t\t\t\tString(addons.length),\n\t\t\t\taddons.map(addon => `<li>${parseMsg(`addon-${addon}`, true)}</li>`).join(''),\n\t\t\t);\n\t\t}\n\t}\n\tnotification?.find('#settings').click(e => {\n\t\te.preventDefault();\n\t\tdocument.getElementById('cm-settings')!.dispatchEvent(new MouseEvent('click'));\n\t});\n};\n\n/**\n * \u672C\u5730\u5316\n * @param cm\n */\nexport const localize = (cm: CodeMirror): void => {\n\tconst obj: Record<string, string> = {};\n\tfor (const [k, v] of Object.entries(i18n)) {\n\t\tif (k.startsWith('phrase-')) {\n\t\t\tobj[k.slice(7).replace(/-/gu, ' ')] = v;\n\t\t}\n\t}\n\tcm.localize(obj);\n};\n", "import {isMac} from './msg';\nimport type {SyntaxNode} from '@lezer/common';\nimport type {CodeMirror} from './base';\n\ndeclare type MouseEventListener = (e: MouseEvent) => void;\n\nconst modKey = isMac ? 'metaKey' : 'ctrlKey',\n\thandlers = new WeakMap<CodeMirror, MouseEventListener>();\n\n/**\n * \u83B7\u53D6\u8282\u70B9\u7684\u540D\u79F0\n * @param node \u8BED\u6CD5\u6811\u8282\u70B9\n */\nfunction getName(node: SyntaxNode): string;\nfunction getName(node: null): undefined;\nfunction getName(node: SyntaxNode | null): string | undefined {\n\treturn node?.name.replace(/_+/gu, ' ').trim();\n}\n\n/**\n * \u67E5\u627E\u8FDE\u7EED\u540C\u540D\u8282\u70B9\n * @param node \u8D77\u59CB\u8282\u70B9\n * @param dir \u65B9\u5411\n * @param name \u8282\u70B9\u540D\u79F0\n */\nconst search = (node: SyntaxNode, dir: 'prevSibling' | 'nextSibling', name = getName(node)): SyntaxNode => {\n\twhile (getName(node[dir]!) === name) {\n\t\tnode = node[dir]!; // eslint-disable-line no-param-reassign\n\t}\n\treturn node;\n};\n\n/**\n * \u70B9\u51FB\u65F6\u5728\u65B0\u9875\u9762\u6253\u5F00\u94FE\u63A5\u3001\u6A21\u677F\u7B49\n * @param cm\n * @param e \u70B9\u51FB\u4E8B\u4EF6\n */\nconst getHandler = (cm: CodeMirror): MouseEventListener => {\n\tif (handlers.has(cm)) {\n\t\treturn handlers.get(cm)!;\n\t}\n\tconst handler: MouseEventListener = (e): void => {\n\t\tif (!e[modKey]) {\n\t\t\treturn;\n\t\t}\n\t\tconst {view} = cm,\n\t\t\t{state} = view!,\n\t\t\tnode = cm.getNodeAt(view!.posAtCoords(e)!);\n\t\tif (!node) {\n\t\t\t// pass\n\t\t} else if (node.name.includes('mw-pagename')) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tconst name = getName(node);\n\t\t\tlet page = state.sliceDoc(\n\t\t\t\tsearch(node, 'prevSibling', name).from,\n\t\t\t\tsearch(node, 'nextSibling', name).to,\n\t\t\t).trim();\n\t\t\tif (page.startsWith('/')) {\n\t\t\t\tpage = `:${mw.config.get('wgPageName')}${page}`;\n\t\t\t}\n\t\t\tlet ns = 0;\n\t\t\tif (name.includes('-template-name')) {\n\t\t\t\tns = 10;\n\t\t\t} else if (name.includes('-parserfunction')) {\n\t\t\t\tns = 828;\n\t\t\t}\n\t\t\topen(new mw.Title(page, ns).getUrl(undefined), '_blank');\n\t\t} else if (/-extlink-protocol/u.test(node.name)) {\n\t\t\te.preventDefault();\n\t\t\topen(state.sliceDoc(node.from, search(node.nextSibling!, 'nextSibling').to), '_blank');\n\t\t} else if (/-extlink(?:_|$)/u.test(node.name)) {\n\t\t\te.preventDefault();\n\t\t\tconst name = getName(node),\n\t\t\t\tprev = search(node, 'prevSibling', name).prevSibling!,\n\t\t\t\tnext = search(node, 'nextSibling', name);\n\t\t\topen(state.sliceDoc(prev.from, next.to), '_blank');\n\t\t}\n\t};\n\thandlers.set(cm, handler);\n\treturn handler;\n};\n\n/**\n * \u6DFB\u52A0\u6216\u79FB\u9664\u6253\u5F00\u94FE\u63A5\u7684\u4E8B\u4EF6\n * @param cm\n * @param on \u662F\u5426\u6DFB\u52A0\n */\nexport const openLinks = (cm: CodeMirror, on?: boolean): void => {\n\tconst {contentDOM} = cm.view!,\n\t\thandler = getHandler(cm);\n\tif (on) {\n\t\tmw.loader.load('mediawiki.Title');\n\t\tcontentDOM.addEventListener('mousedown', handler, {capture: true});\n\t\tcontentDOM.style.setProperty('--codemirror-cursor', 'pointer');\n\t} else if (on === false) {\n\t\tcontentDOM.removeEventListener('mousedown', handler, {capture: true});\n\t\tcontentDOM.style.removeProperty('--codemirror-cursor');\n\t}\n};\n", "import {CodeMirror} from './base';\n\nexport const instances = new WeakMap<HTMLTextAreaElement, CodeMirror>();\n\n/**\n * \u83B7\u53D6CodeMirror\u5B9E\u4F8B\n * @param $ele textarea\u5143\u7D20\u7684jQuery\u5BF9\u8C61\n */\nconst getInstance = ($ele: JQuery<HTMLTextAreaElement>): CodeMirror => instances.get($ele[0]!)!;\n\ndeclare interface EncapsulateOptions {\n\tpre?: string;\n\tperi?: string;\n\tpost?: string;\n\townline?: boolean;\n\treplace?: boolean;\n\tselectPeri?: boolean;\n\tsplitlines?: boolean;\n\tselectionStart?: number;\n\tselectionEnd?: number;\n}\n\n/**\n * jQuery.textSelection overrides for CodeMirror.\n * See jQuery.textSelection.js for method documentation\n */\nexport const textSelection = {\n\tgetContents(this: JQuery<HTMLTextAreaElement>): string {\n\t\treturn getInstance(this).view!.state.doc.toString();\n\t},\n\tsetContents(this: JQuery<HTMLTextAreaElement>, content: string): JQuery<HTMLTextAreaElement> {\n\t\tgetInstance(this).setContent(content);\n\t\treturn this;\n\t},\n\tgetSelection(this: JQuery<HTMLTextAreaElement>): string {\n\t\tconst {state} = getInstance(this).view!,\n\t\t\t{selection: {main: {from, to}}} = state;\n\t\treturn state.sliceDoc(from, to);\n\t},\n\tsetSelection(\n\t\tthis: JQuery<HTMLTextAreaElement>,\n\t\t{start, end = start}: {start: number, end?: number},\n\t): JQuery<HTMLTextAreaElement> {\n\t\tgetInstance(this).view!.dispatch({\n\t\t\tselection: {anchor: start, head: end},\n\t\t});\n\t\treturn this;\n\t},\n\treplaceSelection(this: JQuery<HTMLTextAreaElement>, value: string): JQuery<HTMLTextAreaElement> {\n\t\tconst {view} = getInstance(this);\n\t\tview!.dispatch(view!.state.replaceSelection(value));\n\t\treturn this;\n\t},\n\tencapsulateSelection(this: JQuery<HTMLTextAreaElement>, {\n\t\tpre = '',\n\t\tperi = '',\n\t\tpost = '',\n\t\townline,\n\t\treplace,\n\t\tselectPeri = true,\n\t\tsplitlines,\n\t\tselectionStart,\n\t\tselectionEnd = selectionStart,\n\t}: EncapsulateOptions): JQuery<HTMLTextAreaElement> {\n\t\tconst {view} = getInstance(this),\n\t\t\t{state} = view!;\n\t\tconst handleOwnline = (from: number, to: number, text: string): [string, number, number] => {\n\t\t\tlet start = 0,\n\t\t\t\tend = 0;\n\t\t\tif (ownline) {\n\t\t\t\tif (from > 0 && !/[\\n\\r]/u.test(state.sliceDoc(from - 1, from))) {\n\t\t\t\t\ttext = `\\n${text}`; // eslint-disable-line no-param-reassign\n\t\t\t\t\tstart = 1;\n\t\t\t\t}\n\t\t\t\tif (!/[\\n\\r]/u.test(state.sliceDoc(to, to + 1))) {\n\t\t\t\t\ttext += '\\n'; // eslint-disable-line no-param-reassign\n\t\t\t\t\tend = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn [text, start, end];\n\t\t};\n\t\tif (ownline && replace && !pre && !post && selectionStart === undefined && /^\\s*=.*=\\s*$/u.test(peri)) {\n\t\t\t// \u5355\u72EC\u5904\u7406\u6539\u53D8\u6807\u9898\u5C42\u7EA7\n\t\t\tconst {selection: {main: {from, to}}} = state,\n\t\t\t\t[insertText] = handleOwnline(from, to, peri);\n\t\t\tview!.dispatch({\n\t\t\t\tchanges: {from, to, insert: insertText},\n\t\t\t\tselection: {anchor: from + insertText.length},\n\t\t\t});\n\t\t\treturn this;\n\t\t}\n\t\tCodeMirror.replaceSelections(view!, (_, {from, to}) => {\n\t\t\tif (selectionStart !== undefined) {\n\t\t\t\t/* eslint-disable no-param-reassign */\n\t\t\t\tfrom = selectionStart;\n\t\t\t\tto = selectionEnd!;\n\t\t\t\t/* eslint-enable no-param-reassign */\n\t\t\t}\n\t\t\tconst isSample = selectPeri && from === to,\n\t\t\t\tselText = replace || from === to ? peri : state.sliceDoc(from, to),\n\t\t\t\t[insertText, start, end] = handleOwnline(\n\t\t\t\t\tfrom,\n\t\t\t\t\tto,\n\t\t\t\t\tsplitlines\n\t\t\t\t\t\t? selText.split('\\n').map(line => `${pre}${line}${post}`).join('\\n')\n\t\t\t\t\t\t: `${pre}${selText}${post}`,\n\t\t\t\t),\n\t\t\t\thead = from + insertText.length;\n\t\t\treturn isSample ? [insertText, from + pre.length + start, head - post.length - end] : [insertText, head];\n\t\t});\n\t\treturn this;\n\t},\n\tgetCaretPosition(this: JQuery<HTMLTextAreaElement>, option?: {startAndEnd?: boolean}): [number, number] | number {\n\t\tconst {state: {selection: {main: {from, to, head}}}} = getInstance(this).view!;\n\t\treturn option?.startAndEnd ? [from, to] : head;\n\t},\n\tscrollToCaretPosition(this: JQuery<HTMLTextAreaElement>): JQuery<HTMLTextAreaElement> {\n\t\tconst cm = getInstance(this);\n\t\tcm.scrollTo();\n\t\treturn this;\n\t},\n};\n\n/**\n * jQuery.textSelection overrides for Monaco Editor.\n * See jQuery.textSelection.js for method documentation\n */\nexport const monacoTextSelection = {\n\tgetContents(this: JQuery<HTMLTextAreaElement>): string {\n\t\treturn getInstance(this).model!.getValue();\n\t},\n\tsetContents(this: JQuery<HTMLTextAreaElement>, content: string): JQuery<HTMLTextAreaElement> {\n\t\tgetInstance(this).model!.setValue(content);\n\t\treturn this;\n\t},\n\tgetSelection(this: JQuery<HTMLTextAreaElement>): string {\n\t\tconst {model, editor} = getInstance(this);\n\t\treturn model!.getValueInRange(editor!.getSelection()!);\n\t},\n\tsetSelection(\n\t\tthis: JQuery<HTMLTextAreaElement>,\n\t\t{start, end = start}: {start: number, end?: number},\n\t): JQuery<HTMLTextAreaElement> {\n\t\tconst {model, editor} = getInstance(this),\n\t\t\t{lineNumber: startLineNumber, column: startColumn} = model!.getPositionAt(start),\n\t\t\t{lineNumber: endLineNumber, column: endColumn} = model!.getPositionAt(end);\n\t\teditor!.setSelection({startLineNumber, startColumn, endLineNumber, endColumn});\n\t\treturn this;\n\t},\n\treplaceSelection(this: JQuery<HTMLTextAreaElement>, value: string): JQuery<HTMLTextAreaElement> {\n\t\tconst {editor} = getInstance(this);\n\t\teditor!.executeEdits(\n\t\t\t'replaceSelection',\n\t\t\t[{range: editor!.getSelection()!, text: value, forceMoveMarkers: true}],\n\t\t);\n\t\treturn this;\n\t},\n\tencapsulateSelection(this: JQuery<HTMLTextAreaElement>, {\n\t\tpre = '',\n\t\tperi = '',\n\t\tpost = '',\n\t\townline,\n\t\treplace,\n\t\tsplitlines,\n\t\tselectionStart,\n\t\tselectionEnd = selectionStart,\n\t}: EncapsulateOptions): JQuery<HTMLTextAreaElement> {\n\t\tif (selectionStart !== undefined) {\n\t\t\ttextSelection.setSelection.call(this, {start: selectionStart, end: selectionEnd!});\n\t\t}\n\t\tconst {model, editor} = getInstance(this),\n\t\t\tselection = editor!.getSelection()!,\n\t\t\tselText = replace || selection.isEmpty() ? peri : model!.getValueInRange(selection),\n\t\t\tinsertText = `${ownline && selection.startColumn > 1 ? '\\n' : ''}${splitlines\n\t\t\t\t? selText.split('\\n').map(line => `${pre}${line}${post}`).join('\\n')\n\t\t\t\t: `${pre}${selText}${post}`\n\t\t\t}${ownline && selection.endColumn <= model!.getLineLength(selection.endLineNumber) ? '\\n' : ''}`;\n\t\teditor!.executeEdits('encapsulateSelection', [{range: selection, text: insertText, forceMoveMarkers: true}]);\n\t\treturn this;\n\t},\n\tgetCaretPosition(this: JQuery<HTMLTextAreaElement>, option?: {startAndEnd?: boolean}): [number, number] | number {\n\t\tconst {editor, model} = getInstance(this),\n\t\t\tselection = editor!.getSelection()!,\n\t\t\tto = model!.getOffsetAt(selection.getEndPosition());\n\t\treturn option?.startAndEnd ? [model!.getOffsetAt(selection.getStartPosition()), to] : to;\n\t},\n\tscrollToCaretPosition(this: JQuery<HTMLTextAreaElement>): JQuery<HTMLTextAreaElement> {\n\t\tconst {editor} = getInstance(this);\n\t\teditor!.revealPosition(editor!.getPosition()!);\n\t\treturn this;\n\t},\n};\n\n", "export interface Config {\n\text: string[];\n\treadonly html: [string[], string[], string[]];\n\treadonly namespaces: Record<string, string>;\n\treadonly nsid: Record<string, number>;\n\treadonly parserFunction: [Record<string, string>, string[], string[], string[]];\n\treadonly doubleUnderscore: [string[], string[]];\n\treadonly protocol: string;\n\treadonly img: Record<string, string>;\n\treadonly redirection: string[];\n\treadonly variants: string[];\n\treadonly excludes?: string[];\n\n\t/* NOT FOR BROWSER */\n\n\treadonly interwiki: string[];\n\treadonly conversionTable?: [string, string][];\n\treadonly redirects?: [string, string][];\n}\n\nexport type TokenTypes = 'root'\n\t| 'plain'\n\t| 'redirect'\n\t| 'redirect-syntax'\n\t| 'redirect-target'\n\t| 'onlyinclude'\n\t| 'noinclude'\n\t| 'include'\n\t| 'comment'\n\t| 'ext'\n\t| 'ext-attrs'\n\t| 'ext-attr-dirty'\n\t| 'ext-attr'\n\t| 'attr-key'\n\t| 'attr-value'\n\t| 'ext-inner'\n\t| 'arg'\n\t| 'arg-name'\n\t| 'arg-default'\n\t| 'hidden'\n\t| 'magic-word'\n\t| 'magic-word-name'\n\t| 'invoke-function'\n\t| 'invoke-module'\n\t| 'template'\n\t| 'template-name'\n\t| 'parameter'\n\t| 'parameter-key'\n\t| 'parameter-value'\n\t| 'heading'\n\t| 'heading-title'\n\t| 'heading-trail'\n\t| 'html'\n\t| 'html-attrs'\n\t| 'html-attr-dirty'\n\t| 'html-attr'\n\t| 'table'\n\t| 'tr'\n\t| 'td'\n\t| 'table-syntax'\n\t| 'table-attrs'\n\t| 'table-attr-dirty'\n\t| 'table-attr'\n\t| 'table-inter'\n\t| 'td-inner'\n\t| 'hr'\n\t| 'double-underscore'\n\t| 'link'\n\t| 'link-target'\n\t| 'link-text'\n\t| 'category'\n\t| 'file'\n\t| 'gallery-image'\n\t| 'imagemap-image'\n\t| 'image-parameter'\n\t| 'quote'\n\t| 'ext-link'\n\t| 'ext-link-text'\n\t| 'ext-link-url'\n\t| 'free-ext-link'\n\t| 'list'\n\t| 'dd'\n\t| 'converter'\n\t| 'converter-flags'\n\t| 'converter-flag'\n\t| 'converter-rule'\n\t| 'converter-rule-variant'\n\t| 'converter-rule-to'\n\t| 'converter-rule-from'\n\t| 'param-line'\n\t| 'imagemap-link';\n\nexport const rules = [\n\t'bold-header',\n\t'format-leakage',\n\t'fostered-content',\n\t'h1',\n\t'illegal-attr',\n\t'insecure-style',\n\t'invalid-gallery',\n\t'invalid-imagemap',\n\t'invalid-invoke',\n\t'lonely-apos',\n\t'lonely-bracket',\n\t'lonely-http',\n\t'nested-link',\n\t'no-arg',\n\t'no-duplicate',\n\t'no-ignored',\n\t'obsolete-attr',\n\t'obsolete-tag',\n\t'parsing-order',\n\t'pipe-like',\n\t'table-layout',\n\t'tag-like',\n\t'unbalanced-header',\n\t'unclosed-comment',\n\t'unclosed-quote',\n\t'unclosed-table',\n\t'unescaped',\n\t'unknown-page',\n\t'unmatched-tag',\n\t'unterminated-url',\n\t'url-encoding',\n\t'var-anchor',\n\t'void-ext',\n] as const;\n\nexport namespace LintError {\n\texport type Severity = 'error' | 'warning';\n\n\texport type Rule = typeof rules[number];\n\n\texport interface Fix {\n\t\treadonly range: [number, number];\n\t\ttext: string;\n\t}\n}\n\nexport interface LintError {\n\trule: LintError.Rule;\n\tmessage: string;\n\tseverity: LintError.Severity;\n\tstartIndex: number;\n\tendIndex: number;\n\tstartLine: number;\n\tstartCol: number;\n\tendLine: number;\n\tendCol: number;\n\tfix?: LintError.Fix;\n\tsuggestions?: (LintError.Fix & {desc: string})[];\n}\n\nexport type AST = Record<string, string | number | boolean> & {\n\trange: [number, number];\n\ttype?: TokenTypes;\n\tchildNodes?: AST[];\n};\n\n/** \u7C7B\u4F3CNode */\nexport interface AstNode {\n\ttype: string;\n\treadonly childNodes: readonly AstNode[];\n\n\t/** Linter */\n\tlint(): LintError[];\n\n\t/** \u4EE5HTML\u683C\u5F0F\u6253\u5370 */\n\tprint(): string;\n}\n\n/** \u7C7B\u4F3CHTMLElement */\ninterface AstElement extends AstNode {\n\n\t/** \u4FDD\u5B58\u4E3AJSON */\n\tjson(): AST;\n}\n\nexport interface Parser {\n\tconfig: string | Config;\n\ti18n: string | Record<string, string> | undefined;\n\n\t/** @private */\n\tgetConfig(): Config;\n\n\t/**\n\t * \u89E3\u6790wikitext\n\t * @param include \u662F\u5426\u5D4C\u5165\n\t * @param maxStage \u6700\u5927\u89E3\u6790\u5C42\u7EA7\n\t */\n\tparse(wikitext: string, include?: boolean, maxStage?: number, config?: Config): AstElement;\n}\n", "import {rules} from 'wikiparser-node/base';\nimport {CodeMirror} from './base';\nimport {getObject, setObject} from './util';\nimport {msg, parseMsg, i18n} from './msg';\nimport {instances} from './textSelection';\nimport type {LintError} from 'wikiparser-node';\nimport type {ApiEditPageParams, ApiQueryRevisionsParams} from 'types-mediawiki/api_params';\n\nconst storageKey = 'codemirror-mediawiki-addons',\n\twikilintKey = 'codemirror-mediawiki-wikilint',\n\tcodeKeys = ['ESLint', 'Stylelint'] as const,\n\tuser = mw.config.get('wgUserName'),\n\tuserPage = user && `User:${user}/codemirror-mediawiki.json`;\n\ndeclare type codeKey = typeof codeKeys[number];\n\ndeclare type Preferences = {\n\taddons?: string[];\n\tindent?: string;\n\twikilint?: Record<LintError.Rule, RuleState>;\n} & Record<codeKey, unknown>;\n\ndeclare interface MediaWikiPage {\n\treadonly revisions?: {\n\t\treadonly content: string;\n\t}[];\n}\ndeclare interface MediaWikiResponse {\n\treadonly query: {\n\t\treadonly pages: MediaWikiPage[];\n\t};\n}\n\nconst enum RuleState {\n\toff = '0',\n\terror = '1',\n\ton = '2',\n}\n\nexport const indentKey = 'codemirror-mediawiki-indent',\n\tprefs = new Set(getObject(storageKey) as string[] | null),\n\twikilintConfig = (getObject(wikilintKey) || {}) as Record<LintError.Rule, RuleState | undefined>,\n\tcodeConfigs = new Map(codeKeys.map(k => [k, getObject(`codemirror-mediawiki-${k}`)]));\n\n// OOUI\u7EC4\u4EF6\nlet dialog: OO.ui.MessageDialog | undefined,\n\tlayout: OO.ui.IndexLayout,\n\twidget: OO.ui.CheckboxMultiselectInputWidget,\n\tindentWidget: OO.ui.TextInputWidget,\n\tindent = localStorage.getItem(indentKey) || '';\nconst widgets: Partial<Record<codeKey, OO.ui.MultilineTextInputWidget>> = {},\n\twikilintWidgets = new Map<LintError.Rule, OO.ui.DropdownInputWidget>();\n\n/**\n * \u5904\u7406Api\u8BF7\u6C42\u9519\u8BEF\n * @param code \u9519\u8BEF\u4EE3\u7801\n * @param e \u9519\u8BEF\u4FE1\u606F\n */\nconst apiErr = (code: string, e: any): void => { // eslint-disable-line @typescript-eslint/no-explicit-any\n\tconst message = code === 'http' || code === 'okay-but-empty'\n\t\t? `MediaWiki API request failed: ${code}`\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t: $('<ul>', {html: (e.errors as {html: string}[]).map(({html}) => $('<li>', {html}))});\n\tvoid mw.notify(message as string | HTMLElement[], {type: 'error', autoHideSeconds: 'long'});\n};\n\nconst api = (async () => {\n\tif (user) {\n\t\tawait mw.loader.using('mediawiki.api');\n\t\treturn new mw.Api({parameters: {errorformat: 'html', formatversion: '2'}});\n\t}\n\treturn undefined;\n})();\n\nexport const loadJSON = (async () => {\n\tif (!user) {\n\t\treturn;\n\t}\n\tconst params: ApiQueryRevisionsParams = {\n\t\taction: 'query',\n\t\tprop: 'revisions',\n\t\ttitles: userPage!,\n\t\trvprop: 'content',\n\t\trvlimit: 1,\n\t};\n\t(await api)!.get(params as Record<string, string>).then( // eslint-disable-line promise/prefer-await-to-then\n\t\tres => {\n\t\t\tconst {query: {pages: [page]}} = res as MediaWikiResponse;\n\t\t\tif (page?.revisions) {\n\t\t\t\tconst json: Preferences = JSON.parse(page.revisions[0]!.content);\n\t\t\t\tif (!json.addons?.includes('save')) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tprefs.clear();\n\t\t\t\tfor (const option of json.addons) {\n\t\t\t\t\tprefs.add(option);\n\t\t\t\t}\n\t\t\t\tif (json.indent) {\n\t\t\t\t\tlocalStorage.setItem(indentKey, json.indent);\n\t\t\t\t}\n\t\t\t\tfor (const key of codeKeys) {\n\t\t\t\t\tif (json[key]) {\n\t\t\t\t\t\tcodeConfigs.set(key, json[key]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (json.wikilint) {\n\t\t\t\t\tObject.assign(wikilintConfig, json.wikilint);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tapiErr,\n\t);\n})();\n\n/**\n * \u6253\u5F00\u8BBE\u7F6E\u5BF9\u8BDD\u6846\n * @param editors CodeMirror\u5B9E\u4F8B\n */\nexport const openPreference = async (editors: (CodeMirror | undefined)[]): Promise<void> => {\n\tawait mw.loader.using([\n\t\t'oojs-ui-windows',\n\t\t'oojs-ui-widgets',\n\t\t'oojs-ui.styles.icons-content',\n\t\t'mediawiki.jqueryMsg',\n\t]);\n\tawait loadJSON;\n\tif (dialog) {\n\t\twidget.setValue([...prefs] as unknown as string);\n\t\tindentWidget.setValue(indent);\n\t} else {\n\t\tdialog = new OO.ui.MessageDialog({id: 'cm-preference'});\n\t\tconst windowManager = new OO.ui.WindowManager();\n\t\twindowManager.$element.appendTo(document.body);\n\t\twindowManager.addWindows([dialog]);\n\t\tlayout = new OO.ui.IndexLayout();\n\t\tconst panelMain = new OO.ui.TabPanelLayout('main', {label: msg('title')}),\n\t\t\tpanelWikilint = new OO.ui.TabPanelLayout('wikilint', {label: 'WikiLint'}),\n\t\t\tpanels: Partial<Record<codeKey, OO.ui.TabPanelLayout>> = {};\n\t\tfor (const key of codeKeys) {\n\t\t\tconst c = codeConfigs.get(key);\n\t\t\twidgets[key] = new OO.ui.MultilineTextInputWidget({\n\t\t\t\tvalue: c ? JSON.stringify(c, null, indent || '\\t') : '',\n\t\t\t});\n\t\t\tconst codeField = new OO.ui.FieldLayout(widgets[key]!, {label: msg(`${key}-config`), align: 'top'}),\n\t\t\t\tpanel = new OO.ui.TabPanelLayout(key, {label: key, $content: codeField.$element});\n\t\t\tpanel.on('active', active => {\n\t\t\t\tconst [textarea] = panel.$element.find('textarea') as unknown as [HTMLTextAreaElement];\n\t\t\t\tif (active && !instances.has(textarea)) {\n\t\t\t\t\tvoid CodeMirror.fromTextArea(textarea, 'json');\n\t\t\t\t}\n\t\t\t});\n\t\t\tpanels[key] = panel;\n\t\t}\n\t\tlayout.addTabPanels([panelMain, panelWikilint, ...Object.values(panels)], 0);\n\t\twidget = new OO.ui.CheckboxMultiselectInputWidget({\n\t\t\toptions: [\n\t\t\t\t{disabled: true},\n\t\t\t\t...Object.keys(i18n)\n\t\t\t\t\t.filter(k => k !== 'addon-indent' && k.startsWith('addon-') && !k.endsWith('-mac'))\n\t\t\t\t\t.map(k => ({\n\t\t\t\t\t\tdata: k.slice(6),\n\t\t\t\t\t\tlabel: parseMsg(k),\n\t\t\t\t\t\tdisabled: k === 'addon-wikiEditor' && !mw.loader.getState('ext.wikiEditor')\n\t\t\t\t\t\t|| k === 'addon-save' && !user,\n\t\t\t\t\t})),\n\t\t\t],\n\t\t\tvalue: [...prefs] as unknown as string,\n\t\t});\n\t\tindentWidget = new OO.ui.TextInputWidget({value: indent, placeholder: '\\\\t'});\n\t\tconst field = new OO.ui.FieldLayout(widget, {\n\t\t\t\tlabel: msg('label'),\n\t\t\t\talign: 'top',\n\t\t\t}),\n\t\t\tindentField = new OO.ui.FieldLayout(indentWidget, {label: msg('addon-indent')});\n\t\tpanelMain.$element.append(\n\t\t\tfield.$element,\n\t\t\tindentField.$element,\n\t\t\t$('<p>', {html: msg('feedback', 'codemirror-mediawiki')}),\n\t\t);\n\t\tpanelWikilint.$element.append(\n\t\t\t...rules.map(rule => {\n\t\t\t\tconst state = rule === 'no-arg' ? RuleState.off : RuleState.error,\n\t\t\t\t\tdropdown = new OO.ui.DropdownInputWidget({\n\t\t\t\t\t\toptions: [\n\t\t\t\t\t\t\t{data: RuleState.off, label: msg('wikilint-off')},\n\t\t\t\t\t\t\t{data: RuleState.error, label: msg('wikilint-error')},\n\t\t\t\t\t\t\t{data: RuleState.on, label: msg('wikilint-on')},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tvalue: wikilintConfig[rule] || state,\n\t\t\t\t\t}),\n\t\t\t\t\tf = new OO.ui.FieldLayout(dropdown, {label: rule});\n\t\t\t\twikilintWidgets.set(rule, dropdown);\n\t\t\t\twikilintConfig[rule] ||= state;\n\t\t\t\treturn f.$element;\n\t\t\t}),\n\t\t\t$('<p>', {html: msg('feedback', 'wikiparser-node')}),\n\t\t);\n\t}\n\n\tconst data = await (dialog.open({\n\t\tmessage: layout!.$element,\n\t\tactions: [\n\t\t\t{action: 'reject', label: mw.msg('ooui-dialog-message-reject')},\n\t\t\t{action: 'accept', label: mw.msg('ooui-dialog-message-accept'), flags: 'progressive'},\n\t\t],\n\t\tsize: 'medium',\n\t}).closing as unknown as Promise<{action?: unknown} | undefined>);\n\tif (typeof data === 'object' && data.action === 'accept') {\n\t\t// \u7F29\u8FDB\n\t\tconst oldIndent = indent,\n\t\t\tsave = prefs.has('save');\n\t\tindent = indentWidget.getValue(); // eslint-disable-line require-atomic-updates\n\t\tlet changed = indent !== oldIndent;\n\t\tif (changed) {\n\t\t\tfor (const cm of editors) {\n\t\t\t\tcm?.setIndent(indent || '\\t');\n\t\t\t}\n\t\t\tlocalStorage.setItem(indentKey, indent);\n\t\t}\n\n\t\t// WikiLint\n\t\tfor (const [rule, dropdown] of wikilintWidgets) {\n\t\t\tconst val = dropdown.getValue() as RuleState;\n\t\t\tchanged ||= val !== wikilintConfig[rule];\n\t\t\twikilintConfig[rule] = val;\n\t\t}\n\t\tsetObject(wikilintKey, wikilintConfig);\n\n\t\t// ESLint & Stylelint\n\t\tconst jsonErrors: string[] = [];\n\t\tfor (const key of codeKeys) {\n\t\t\ttry {\n\t\t\t\tconst config = JSON.parse(widgets[key]!.getValue().trim() || 'null');\n\t\t\t\tchanged ||= JSON.stringify(config) !== JSON.stringify(codeConfigs.get(key));\n\t\t\t\tcodeConfigs.set(key, config);\n\t\t\t\tsetObject(`codemirror-mediawiki-${key}`, config);\n\t\t\t} catch {\n\t\t\t\tjsonErrors.push(key);\n\t\t\t}\n\t\t}\n\t\tif (jsonErrors.length > 0) {\n\t\t\tvoid OO.ui.alert(msg('json-error', jsonErrors.join(msg('and'))));\n\t\t}\n\n\t\t// \u63D2\u4EF6\n\t\tconst value = widget.getValue() as unknown as string[];\n\t\tif (value.length !== prefs.size || !value.every(option => prefs.has(option))) {\n\t\t\tchanged = true;\n\t\t\tprefs.clear();\n\t\t\tfor (const option of value) {\n\t\t\t\tprefs.add(option);\n\t\t\t}\n\t\t\tfor (const cm of editors) {\n\t\t\t\tcm?.prefer(value);\n\t\t\t}\n\t\t\tsetObject(storageKey, value);\n\t\t}\n\n\t\t// \u4FDD\u5B58\u81F3\u7528\u6237\u5B50\u9875\u9762\n\t\tif (changed && user && (save || prefs.has('save'))) {\n\t\t\tconst params: ApiEditPageParams = {\n\t\t\t\taction: 'edit',\n\t\t\t\ttitle: userPage!,\n\t\t\t\ttext: JSON.stringify({\n\t\t\t\t\taddons: [...prefs],\n\t\t\t\t\tindent,\n\t\t\t\t\twikilint: wikilintConfig,\n\t\t\t\t\tESLint: codeConfigs.get('ESLint'),\n\t\t\t\t\tStylelint: codeConfigs.get('Stylelint'),\n\t\t\t\t} as Preferences),\n\t\t\t\tsummary: msg('save-summary'),\n\t\t\t};\n\t\t\t// eslint-disable-next-line promise/prefer-await-to-then\n\t\t\t(await api)!.postWithToken('csrf', params as Record<string, string>).then(\n\t\t\t\t() => {\n\t\t\t\t\tvoid mw.notify(parseMsg('save-success'), {type: 'success'});\n\t\t\t\t},\n\t\t\t\tapiErr,\n\t\t\t);\n\t\t}\n\t}\n};\n", "/**\n * \u6DFB\u52A0WikiEditor\u5DE5\u5177\u680F\n * @param $textarea \u6587\u672C\u6846\n */\nexport const wikiEditor = async ($textarea: JQuery<HTMLTextAreaElement>): Promise<void> => {\n\tif (!mw.loader.getState('ext.wikiEditor')) {\n\t\tthrow new Error('no-wikiEditor');\n\t}\n\tawait mw.loader.using('ext.wikiEditor');\n\tif ($textarea.data('wikiEditorContext')) {\n\t\treturn;\n\t} else if (typeof mw.addWikiEditor === 'function') { // MW >= 1.34\n\t\tmw.addWikiEditor($textarea);\n\t} else { // MW <= 1.33\n\t\tconst {wikiEditor: {modules: {dialogs: {config}}}} = $;\n\t\t$textarea.wikiEditor('addModule', {\n\t\t\t...$.wikiEditor.modules.toolbar.config.getDefaultConfig(),\n\t\t\t...config.getDefaultConfig(),\n\t\t});\n\t\tconfig.replaceIcons($textarea);\n\t}\n\tawait new Promise(resolve => { // MW >= 1.21\n\t\t$textarea.on('wikiEditor-toolbar-doneInitialSections', resolve);\n\t});\n};\n"],
5
- "mappings": "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",
6
- "names": ["CodeMirror6", "CDN", "getObject", "key", "setObject", "value", "ALL_SETTINGS_CACHE", "getObject", "SITE_ID", "SITE_SETTINGS", "VALID", "getConfig", "magicWords", "rule", "flip", "words", "i", "aliases", "name", "alias", "obj", "getConfigPair", "bool", "setConfig", "config", "getMwConfig", "isIPE", "nsid", "variants", "magicwords", "extensiontags", "functionhooks", "variables", "others", "insensitive", "tag", "functions", "code", "setObject", "getParserConfig", "minConfig", "mwConfig", "s", "key", "val", "REPO_CDN", "curVersion", "vendor", "userAgent", "maxTouchPoints", "platform", "isMac", "storageKey", "languages", "lang", "i18n", "getObject", "version", "setI18N", "CDN", "setObject", "e", "msg", "k", "v", "key", "args", "blankTarget", "$dom", "parseMsg", "text", "message", "parseVersion", "v", "notify", "key", "args", "$p", "blankTarget", "msg", "welcome", "baseVersion", "addons", "notification", "version", "baseMajor", "baseMinor", "major", "minor", "curVersion", "addon", "parseMsg", "e", "localize", "cm", "obj", "k", "i18n", "modKey", "isMac", "handlers", "getName", "node", "search", "dir", "name", "getHandler", "cm", "handler", "e", "view", "state", "page", "ns", "prev", "next", "openLinks", "on", "contentDOM", "instances", "getInstance", "$ele", "textSelection", "content", "state", "from", "to", "start", "end", "value", "view", "pre", "peri", "post", "ownline", "replace", "selectPeri", "splitlines", "selectionStart", "selectionEnd", "handleOwnline", "text", "insertText", "CodeMirror", "_", "isSample", "selText", "line", "head", "option", "monacoTextSelection", "model", "editor", "startLineNumber", "startColumn", "endLineNumber", "endColumn", "selection", "rules", "storageKey", "wikilintKey", "codeKeys", "user", "userPage", "indentKey", "prefs", "getObject", "storageKey", "wikilintConfig", "wikilintKey", "codeConfigs", "codeKeys", "k", "dialog", "layout", "widget", "indentWidget", "indent", "widgets", "wikilintWidgets", "apiErr", "code", "e", "message", "html", "api", "user", "loadJSON", "params", "userPage", "res", "_a", "page", "json", "option", "key", "openPreference", "editors", "windowManager", "panelMain", "msg", "panelWikilint", "panels", "c", "codeField", "panel", "active", "textarea", "instances", "CodeMirror", "i18n", "parseMsg", "field", "indentField", "rules", "rule", "state", "dropdown", "f", "data", "oldIndent", "save", "changed", "cm", "val", "setObject", "jsonErrors", "config", "value", "wikiEditor", "$textarea", "config", "resolve", "baseVersion", "addons", "CDN", "REPO_CDN", "elem", "cm", "instances", "value", "linters", "langMap", "monacoLangs", "isEditor", "textarea", "_visible", "_container", "_model", "_editor", "_indentStr", "_initMonaco", "initMonaco_fn", "_refresh", "refresh_fn", "_CodeMirror", "CodeMirror6", "lang", "ns", "config", "isCM", "_a", "_b", "__privateAdd", "__privateMethod", "monacoTextSelection", "scrollTop", "__privateGet", "show", "textSelection", "__privateSet", "content", "indent", "tab", "opt", "linter", "on", "optOrNs", "eslint", "codeConfigs", "stylelint", "i18n", "mwConfig", "minConfig", "getMwConfig", "getParserConfig", "doc", "rule", "severity", "wikilintConfig", "extensions", "hasExtension", "ext", "hasLint", "openLinks", "prefs", "wikiEditor", "e", "msg", "wgAction", "wgNamespaceNumber", "wgPageContentModel", "isWiki", "parserConfig", "loadJSON", "indentKey", "cmLang", "timer", "offsetHeight", "height", "curVersion", "CodeMirror", "portletContainer", "setI18N", "localize", "textareas", "openPreference", "welcome"]
4
+ "sourcesContent": ["import {CodeMirror6, CDN} from 'https://testingcf.jsdelivr.net/npm/@bhsd/codemirror-mediawiki@2.11.3/dist/main.min.js';\nimport {getMwConfig, getParserConfig} from './config';\nimport {openLinks} from './openLinks';\nimport {instances, textSelection, monacoTextSelection} from './textSelection';\nimport {openPreference, prefs, indentKey, wikilintConfig, codeConfigs, loadJSON} from './preference';\nimport {msg, setI18N, welcome, REPO_CDN, curVersion, localize} from './msg';\nimport {wikiEditor} from './wikiEditor';\nimport type {Diagnostic} from '@codemirror/lint';\nimport type {Config, LintError} from 'wikiparser-node';\nimport type {Linter} from 'eslint';\nimport type * as Monaco from 'monaco-editor';\nimport type {LintSource, MwConfig} from '../src/codemirror';\n\ndeclare global {\n\tconst monaco: typeof Monaco;\n}\n\n// \u6BCF\u6B21\u65B0\u589E\u63D2\u4EF6\u90FD\u9700\u8981\u4FEE\u6539\u8FD9\u91CC\nconst baseVersion = '2.11',\n\taddons = ['useMonaco'];\n\nmw.loader.load(`${CDN}/${REPO_CDN}/mediawiki.min.css`, 'text/css');\n\n/**\n * jQuery.val overrides for CodeMirror.\n */\n$.valHooks['textarea'] = {\n\tget(elem: HTMLTextAreaElement): string {\n\t\tconst cm = instances.get(elem);\n\t\treturn cm?.visible ? cm.getContent() : elem.value;\n\t},\n\tset(elem: HTMLTextAreaElement, value: string): void {\n\t\tconst cm = instances.get(elem);\n\t\tif (cm?.visible) {\n\t\t\tcm.setContent(value);\n\t\t} else {\n\t\t\telem.value = value;\n\t\t}\n\t},\n};\n\nconst linters: Record<string, LintSource | undefined> = {},\n\tlangMap: Record<string, string> = {\n\t\t'sanitized-css': 'css',\n\t\tjs: 'javascript',\n\t\tscribunto: 'lua',\n\t\twikitext: 'mediawiki',\n\t},\n\tmonacoLangs: Record<string, string> = {\n\t\tmediawiki: 'wikitext',\n\t\ttemplate: 'wikitext',\n\t\tgadget: 'javascript',\n\t\tplain: 'plaintext',\n\t};\n\n/**\n * \u5224\u65AD\u662F\u5426\u4E3A\u666E\u901A\u7F16\u8F91\u5668\n * @param textarea \u6587\u672C\u6846\n */\nconst isEditor = (textarea: HTMLTextAreaElement): boolean => !textarea.closest('#cm-preference');\n\n/** \u4E13\u7528\u4E8EMW\u73AF\u5883\u7684 CodeMirror 6 \u7F16\u8F91\u5668 */\nexport class CodeMirror extends CodeMirror6 {\n\tstatic version = curVersion;\n\n\tdeclare ns;\n\t#visible = true;\n\t#container: HTMLDivElement | undefined;\n\t#model: Monaco.editor.ITextModel | undefined;\n\t#editor: Monaco.editor.IStandaloneCodeEditor | undefined;\n\t#init;\n\t#indentStr = '\\t';\n\n\toverride get visible(): boolean {\n\t\treturn this.#visible;\n\t}\n\n\tget model(): Monaco.editor.ITextModel | undefined {\n\t\treturn this.#model;\n\t}\n\n\tget editor(): Monaco.editor.IStandaloneCodeEditor | undefined {\n\t\treturn this.#editor;\n\t}\n\n\t/**\n\t * @param textarea \u6587\u672C\u6846\n\t * @param lang \u8BED\u8A00\n\t * @param ns \u547D\u540D\u7A7A\u95F4\n\t * @param config \u8BED\u8A00\u8BBE\u7F6E\n\t * @param isCM \u662F\u5426\u4F7F\u7528 CodeMirror\n\t */\n\tconstructor(textarea: HTMLTextAreaElement, lang?: string, ns?: number, config?: unknown, isCM = true) {\n\t\tif (instances.get(textarea)?.visible) {\n\t\t\tthrow new RangeError('The textarea has already been replaced by CodeMirror.');\n\t\t}\n\t\tsuper(textarea, lang, config, false);\n\t\tthis.ns = ns;\n\t\tinstances.set(textarea, this);\n\t\tif (isCM) {\n\t\t\tthis.initialize(config);\n\t\t} else {\n\t\t\tthis.#init = this.#initMonaco();\n\t\t\t$(textarea).data('jquery.textSelection', monacoTextSelection);\n\t\t}\n\t\tif (isEditor(textarea)) {\n\t\t\tmw.hook('wiki-codemirror6').fire(this);\n\t\t\tif (textarea.id === 'wpTextbox1') {\n\t\t\t\ttextarea.form?.addEventListener('submit', () => {\n\t\t\t\t\tconst scrollTop = document.querySelector<HTMLInputElement>('#wpScrolltop');\n\t\t\t\t\tif (scrollTop && this.view && this.#visible) {\n\t\t\t\t\t\tscrollTop.value = String(this.view.scrollDOM.scrollTop);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t/** \u521D\u59CB\u5316 Monaco \u7F16\u8F91\u5668 */\n\tasync #initMonaco(): Promise<void> {\n\t\tif (!('monaco' in window)) {\n\t\t\tawait $.ajax(\n\t\t\t\t`${CDN}/npm/monaco-wiki/dist/all.min.js`,\n\t\t\t\t{dataType: 'script', scriptAttrs: {type: 'module'}} as JQuery.AjaxSettings,\n\t\t\t);\n\t\t}\n\t\tconst {textarea, lang: cmLang} = this,\n\t\t\tlang = monacoLangs[cmLang] || cmLang,\n\t\t\ttab = this.#indentStr.includes('\\t');\n\t\t// eslint-disable-next-line @typescript-eslint/await-thenable\n\t\tthis.#model = (await monaco).editor.createModel(textarea.value, lang);\n\t\tthis.#container = document.createElement('div');\n\t\tthis.#refresh();\n\t\tthis.#container.style.minHeight = '2em';\n\t\ttextarea.after(this.#container);\n\t\ttextarea.style.display = 'none';\n\t\tthis.#editor = monaco.editor.create(this.#container, {\n\t\t\tmodel: this.#model,\n\t\t\tautomaticLayout: true,\n\t\t\ttheme: 'monokai',\n\t\t\treadOnly: textarea.readOnly,\n\t\t\twordWrap: lang === 'wikitext' || lang === 'html' || lang === 'plaintext' ? 'on' : 'off',\n\t\t\twordBreak: 'keepAll',\n\t\t\ttabSize: tab ? 4 : Number(this.#indentStr),\n\t\t\tinsertSpaces: !tab,\n\t\t\tglyphMargin: true,\n\t\t\tfontSize: parseFloat(getComputedStyle(textarea).fontSize),\n\t\t\tunicodeHighlight: {\n\t\t\t\tambiguousCharacters: lang !== 'wikitext' && lang !== 'html' && lang !== 'plaintext',\n\t\t\t},\n\t\t});\n\t\tlet timer: number;\n\t\tthis.#model.onDidChangeContent(() => {\n\t\t\tclearTimeout(timer);\n\t\t\ttimer = window.setTimeout(() => {\n\t\t\t\ttextarea.value = this.#model!.getValue();\n\t\t\t}, 400);\n\t\t});\n\t}\n\n\t/** \u5237\u65B0 Monaco \u7F16\u8F91\u5668\u9AD8\u5EA6 */\n\t#refresh(): void {\n\t\tconst {textarea: {offsetHeight, style: {height}}} = this;\n\t\tthis.#container!.style.height = offsetHeight ? `${offsetHeight}px` : height;\n\t}\n\n\toverride toggle(show = !this.#visible): void {\n\t\tconst {textarea} = this;\n\t\tif (!this.#model) {\n\t\t\tsuper.toggle(show);\n\t\t\t$(textarea).data('jquery.textSelection', show && textSelection);\n\t\t} else if (show && !this.#visible) {\n\t\t\tthis.#model.setValue(textarea.value);\n\t\t\tthis.#refresh();\n\t\t\tthis.#container!.style.display = '';\n\t\t\ttextarea.style.display = 'none';\n\t\t\t$(textarea).data('jquery.textSelection', monacoTextSelection);\n\t\t} else if (!show && this.#visible) {\n\t\t\tthis.#container!.style.display = 'none';\n\t\t\ttextarea.style.display = '';\n\t\t\t$(textarea).removeData('jquery.textSelection');\n\t\t}\n\t\tthis.#visible = show;\n\t}\n\n\toverride setContent(content: string): void {\n\t\tif (this.#model) {\n\t\t\tthis.#model.setValue(content);\n\t\t} else {\n\t\t\tsuper.setContent(content);\n\t\t}\n\t}\n\n\t/** \u83B7\u53D6\u7F16\u8F91\u5668\u5185\u5BB9 */\n\tgetContent(): string {\n\t\treturn this.view ? this.view.state.doc.toString() : this.#model!.getValue();\n\t}\n\n\toverride setIndent(indent: string): void {\n\t\tif (this.#editor) {\n\t\t\tthis.#indentStr = indent;\n\t\t\tconst tab = indent.includes('\\t');\n\t\t\tthis.#editor.updateOptions({tabSize: tab ? 4 : Number(indent), insertSpaces: !tab});\n\t\t} else {\n\t\t\tsuper.setIndent(indent);\n\t\t}\n\t}\n\n\toverride async getLinter(opt?: Record<string, unknown>): Promise<LintSource | undefined> {\n\t\tconst linter = await super.getLinter(opt);\n\t\tlinters[this.lang] = linter;\n\t\treturn linter;\n\t}\n\n\t/**\n\t * \u6DFB\u52A0\u6216\u79FB\u9664\u9ED8\u8BA4 linter\n\t * @param on \u662F\u5426\u6DFB\u52A0\n\t * @param opt linter\u9009\u9879\n\t * @param ns \u547D\u540D\u7A7A\u95F4\n\t */\n\tdefaultLint(on: boolean, opt: Record<string, unknown>): Promise<void>;\n\tdefaultLint(on: boolean, ns?: number): Promise<void>;\n\tasync defaultLint(on: boolean, optOrNs: Record<string, unknown> | number | undefined = this.ns): Promise<void> {\n\t\tif (!on) {\n\t\t\tthis.lint();\n\t\t\treturn;\n\t\t}\n\t\tconst {lang} = this,\n\t\t\teslint = codeConfigs.get('ESLint'),\n\t\t\tstylelint = codeConfigs.get('Stylelint');\n\t\tlet opt: Record<string, unknown> | undefined;\n\t\tif (typeof optOrNs === 'number') {\n\t\t\tif (lang === 'mediawiki' && (optOrNs === 10 || optOrNs === 828 || optOrNs === 2)) {\n\t\t\t\topt = {include: true};\n\t\t\t} else if (lang === 'javascript') {\n\t\t\t\topt = {\n\t\t\t\t\tenv: {browser: true, es2024: true, jquery: true},\n\t\t\t\t\tglobals: {mw: 'readonly', mediaWiki: 'readonly', OO: 'readonly'},\n\t\t\t\t\t...optOrNs === 8 || optOrNs === 2300 ? {parserOptions: {ecmaVersion: 8}} : {},\n\t\t\t\t\t...eslint,\n\t\t\t\t} as Linter.Config as Record<string, unknown>;\n\t\t\t} else if (lang === 'css' && stylelint) {\n\t\t\t\topt = stylelint;\n\t\t\t}\n\t\t} else {\n\t\t\topt = optOrNs;\n\t\t}\n\t\tif (!(lang in linters)) {\n\t\t\tif (lang === 'mediawiki') {\n\t\t\t\tconst i18n = mw.config.get('wgUserLanguage');\n\t\t\t\tif (['zh', 'zh-hans', 'zh-cn', 'zh-sg', 'zh-my'].includes(i18n)) {\n\t\t\t\t\topt = {...opt, i18n: 'zh-hans'};\n\t\t\t\t} else if (['zh-hant', 'zh-tw', 'zh-hk', 'zh-mo'].includes(i18n)) {\n\t\t\t\t\topt = {...opt, i18n: 'zh-hant'};\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait this.getLinter(opt);\n\t\t\tif (lang === 'mediawiki') {\n\t\t\t\tconst [mwConfig, minConfig] = await Promise.all([getMwConfig(), wikiparse.getConfig()]);\n\t\t\t\twikiparse.setConfig(getParserConfig(minConfig, mwConfig));\n\t\t\t}\n\t\t} else if (opt) {\n\t\t\tawait this.getLinter(opt);\n\t\t}\n\t\tif (linters[lang]) {\n\t\t\tif (lang === 'mediawiki') {\n\t\t\t\tthis.lint(\n\t\t\t\t\tasync doc => (await linters[lang]!(doc) as (Diagnostic & {rule: LintError.Rule})[])\n\t\t\t\t\t\t.filter(({rule, severity}) => Number(wikilintConfig[rule]) > Number(severity === 'warning')),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthis.lint(linters[lang]);\n\t\t\t}\n\t\t}\n\t}\n\n\toverride prefer(extensions: string[] | Record<string, boolean>): void {\n\t\tif (this.view) {\n\t\t\tsuper.prefer(extensions);\n\t\t\tconst hasExtension = Array.isArray(extensions)\n\t\t\t\t\t? (ext: string): boolean => extensions.includes(ext)\n\t\t\t\t\t: (ext: string): boolean | undefined => extensions[ext],\n\t\t\t\thasLint = hasExtension('lint');\n\t\t\tif (hasLint !== undefined) {\n\t\t\t\tvoid this.defaultLint(hasLint);\n\t\t\t}\n\t\t\topenLinks(this, hasExtension('openLinks'));\n\t\t}\n\t}\n\n\t/**\n\t * \u5C06 textarea \u66FF\u6362\u4E3A CodeMirror\n\t * @param textarea textarea \u5143\u7D20\n\t * @param lang \u8BED\u8A00\n\t * @param ns \u547D\u540D\u7A7A\u95F4\n\t */\n\tstatic async fromTextArea(textarea: HTMLTextAreaElement, lang?: string, ns?: number): Promise<CodeMirror> {\n\t\tif (prefs.has('wikiEditor') && isEditor(textarea)) {\n\t\t\ttry {\n\t\t\t\tawait wikiEditor($(textarea));\n\t\t\t} catch (e) {\n\t\t\t\tif (e instanceof Error && e.message === 'no-wikiEditor') {\n\t\t\t\t\tvoid mw.notify(msg(e.message), {type: 'error'});\n\t\t\t\t}\n\t\t\t\tprefs.delete('wikiEditor');\n\t\t\t}\n\t\t}\n\t\t/* eslint-disable no-param-reassign */\n\t\tif (!lang && ns === undefined) {\n\t\t\tconst {wgAction, wgNamespaceNumber, wgPageContentModel} = mw.config.get();\n\t\t\tif (wgAction === 'edit' || wgAction === 'submit') {\n\t\t\t\tns = wgNamespaceNumber;\n\t\t\t\tlang = wgNamespaceNumber === 274 ? 'html' : wgPageContentModel.toLowerCase();\n\t\t\t} else {\n\t\t\t\tawait mw.loader.using('oojs-ui-windows');\n\t\t\t\tlang = (await OO.ui.prompt(msg('contentmodel')) || undefined)?.toLowerCase();\n\t\t\t}\n\t\t}\n\t\tif (lang && lang in langMap) {\n\t\t\tlang = langMap[lang];\n\t\t}\n\t\t/* eslint-enable no-param-reassign */\n\t\tconst isCM = !prefs.has('useMonaco'),\n\t\t\tisWiki = isCM && (lang === 'mediawiki' || lang === 'html'),\n\t\t\tcm = new CodeMirror(textarea, isWiki ? undefined : lang, ns, undefined, isCM);\n\t\tif (isWiki) {\n\t\t\tlet config: MwConfig;\n\t\t\tif (mw.config.get('wgServerName').endsWith('.moegirl.org.cn')) {\n\t\t\t\tif (mw.config.exists('wikilintConfig')) {\n\t\t\t\t\tconfig = mw.config.get('extCodeMirrorConfig') as MwConfig;\n\t\t\t\t} else {\n\t\t\t\t\tconst parserConfig: Config = await (await fetch(\n\t\t\t\t\t\t`${CDN}/npm/wikiparser-node@browser/config/moegirl.json`,\n\t\t\t\t\t)).json();\n\t\t\t\t\tmw.config.set('wikilintConfig', parserConfig);\n\t\t\t\t\tconfig = CodeMirror6.getMwConfig(parserConfig);\n\t\t\t\t\tmw.config.set('extCodeMirrorConfig', config);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconfig = await getMwConfig();\n\t\t\t}\n\t\t\tcm.setLanguage(lang, {...config, tagModes: CodeMirror.mwTagModes});\n\t\t}\n\t\tawait Promise.all([loadJSON, cm.#init]);\n\t\tcm.prefer([...prefs]);\n\t\tconst indent = localStorage.getItem(indentKey);\n\t\tif (indent) {\n\t\t\tcm.setIndent(indent);\n\t\t}\n\t\treturn cm;\n\t}\n}\n\ndocument.body.addEventListener('click', e => {\n\tif (e.target instanceof HTMLTextAreaElement && e.shiftKey && !instances.has(e.target)) {\n\t\te.preventDefault();\n\t\tvoid CodeMirror.fromTextArea(e.target);\n\t}\n});\n\n(async () => {\n\tconst portletContainer: Record<string, string> = {\n\t\tminerva: 'page-actions-overflow',\n\t\tmoeskin: 'ca-more-actions',\n\t\tcitizen: 'p-tb',\n\t};\n\tawait Promise.all([\n\t\tmw.loader.using('mediawiki.util'),\n\t\tsetI18N(CDN),\n\t]);\n\tmw.hook('wiki-codemirror6').add(localize);\n\tmw.util.addPortletLink(\n\t\tportletContainer[mw.config.get('skin')] || 'p-cactions',\n\t\t'#',\n\t\tmsg('title'),\n\t\t'cm-settings',\n\t)!.addEventListener('click', e => {\n\t\te.preventDefault();\n\t\tconst textareas = [...document.querySelectorAll<HTMLTextAreaElement>('.cm-editor + textarea')];\n\t\tvoid openPreference(textareas.map(textarea => instances.get(textarea)));\n\t});\n\tvoid welcome(baseVersion, addons);\n})();\n\nObject.assign(window, {CodeMirror6: CodeMirror});\n", "// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const getObject = (key: string): any => JSON.parse(String(localStorage.getItem(key)));\nexport const setObject = (key: string, value: unknown): void => {\n\tlocalStorage.setItem(key, JSON.stringify(value));\n};\n", "import {setObject, getObject} from './util';\nimport type {Config} from 'wikiparser-node';\nimport type {MwConfig} from '../src/mediawiki';\n\ndeclare interface MagicWord {\n\tname: string;\n\taliases: string[];\n\t'case-sensitive': boolean;\n}\n\n// \u548C\u672C\u5730\u7F13\u5B58\u6709\u5173\u7684\u5E38\u6570\nconst ALL_SETTINGS_CACHE: Record<string, {time: number, config: MwConfig}>\n\t\t= getObject('InPageEditMwConfig') || {},\n\tSITE_ID = typeof mw === 'object'\n\t\t? `${mw.config.get('wgServerName')}${mw.config.get('wgScriptPath')}`\n\t\t: location.origin,\n\tSITE_SETTINGS = ALL_SETTINGS_CACHE[SITE_ID],\n\tVALID = Number(SITE_SETTINGS?.time) > Date.now() - 86_400 * 1000 * 30;\n\n/**\n * \u5C06\u9B54\u672F\u5B57\u4FE1\u606F\u8F6C\u6362\u4E3ACodeMirror\u63A5\u53D7\u7684\u8BBE\u7F6E\n * @param magicWords \u5B8C\u6574\u9B54\u672F\u5B57\u5217\u8868\n * @param rule \u8FC7\u6EE4\u51FD\u6570\n * @param flip \u662F\u5426\u53CD\u5411\u7B5B\u9009\u5BF9\u5927\u5C0F\u5199\u654F\u611F\u7684\u9B54\u672F\u5B57\n */\nconst getConfig = (\n\tmagicWords: MagicWord[],\n\trule: (word: MagicWord) => boolean,\n\tflip?: boolean,\n): Record<string, string> => {\n\tconst words = magicWords.filter(rule).filter(({'case-sensitive': i}) => i !== flip)\n\t\t\t.flatMap(({aliases, name, 'case-sensitive': i}) => aliases.map(alias => ({\n\t\t\t\talias: (i ? alias : alias.toLowerCase()).replace(/:$/u, ''),\n\t\t\t\tname,\n\t\t\t}))),\n\t\tobj: Record<string, string> = {};\n\tfor (const {alias, name} of words) {\n\t\tobj[alias] = name;\n\t}\n\treturn obj;\n};\n\n/**\n * \u5C06\u9B54\u672F\u5B57\u4FE1\u606F\u8F6C\u6362\u4E3ACodeMirror\u63A5\u53D7\u7684\u8BBE\u7F6E\n * @param magicWords \u5B8C\u6574\u9B54\u672F\u5B57\u5217\u8868\n * @param rule \u8FC7\u6EE4\u51FD\u6570\n */\nconst getConfigPair = (\n\tmagicWords: MagicWord[],\n\trule: (word: MagicWord) => boolean,\n): [Record<string, string>, Record<string, string>] => [true, false]\n\t.map(bool => getConfig(magicWords, rule, bool)) as [Record<string, string>, Record<string, string>];\n\n/**\n * \u5C06\u8BBE\u7F6E\u4FDD\u5B58\u5230mw.config\n * @param config \u8BBE\u7F6E\n */\nconst setConfig = (config: MwConfig): void => {\n\tmw.config.set('extCodeMirrorConfig', config);\n};\n\n/** \u52A0\u8F7DCodeMirror\u7684mediawiki\u6A21\u5757\u9700\u8981\u7684\u8BBE\u7F6E */\nexport const getMwConfig = async (): Promise<MwConfig> => {\n\tif (mw.loader.getState('ext.CodeMirror') !== null && !VALID) { // \u53EA\u5728localStorage\u8FC7\u671F\u65F6\u624D\u4F1A\u91CD\u65B0\u52A0\u8F7Dext.CodeMirror.data\n\t\tawait mw.loader.using(mw.loader.getState('ext.CodeMirror.data') ? 'ext.CodeMirror.data' : 'ext.CodeMirror');\n\t}\n\n\tlet config = mw.config.get('extCodeMirrorConfig') as MwConfig | null;\n\tif (!config && VALID) {\n\t\t({config} = SITE_SETTINGS!);\n\t\tsetConfig(config);\n\t}\n\tconst isIPE = config && Object.values(config.functionSynonyms[0]).includes(true as unknown as string),\n\t\tnsid = mw.config.get('wgNamespaceIds');\n\t// \u60C5\u5F621\uFF1Aconfig\u5DF2\u66F4\u65B0\uFF0C\u53EF\u80FD\u6765\u81EAlocalStorage\n\tif (config?.img && config.variants && !isIPE) {\n\t\tconfig.urlProtocols = config.urlProtocols.replace(/\\\\:/gu, ':');\n\t\treturn {...config, nsid};\n\t}\n\n\t// \u4EE5\u4E0B\u60C5\u5F62\u5747\u9700\u8981\u53D1\u9001API\u8BF7\u6C42\n\t// \u60C5\u5F622\uFF1AlocalStorage\u672A\u8FC7\u671F\u4F46\u4E0D\u5305\u542B\u65B0\u8BBE\u7F6E\n\t// \u60C5\u5F623\uFF1A\u65B0\u52A0\u8F7D\u7684 ext.CodeMirror.data\n\t// \u60C5\u5F624\uFF1A`config === null`\n\tawait mw.loader.using('mediawiki.api');\n\tconst {\n\t\tquery: {general: {variants}, magicwords, extensiontags, functionhooks, variables},\n\t}: {\n\t\tquery: {\n\t\t\tgeneral: {variants?: {code: string}[]};\n\t\t\tmagicwords: MagicWord[];\n\t\t\textensiontags: string[];\n\t\t\tfunctionhooks: string[];\n\t\t\tvariables: string[];\n\t\t};\n\t} = await new mw.Api().get({\n\t\tmeta: 'siteinfo',\n\t\tsiprop: [\n\t\t\t'general',\n\t\t\t'magicwords',\n\t\t\t...config && !isIPE ? [] : ['extensiontags', 'functionhooks', 'variables'],\n\t\t],\n\t\tformatversion: '2',\n\t}) as any; // eslint-disable-line @typescript-eslint/no-explicit-any\n\tconst others = new Set(['msg', 'raw', 'msgnw', 'subst', 'safesubst']);\n\n\t// \u5148\u5904\u7406\u9B54\u672F\u5B57\u548C\u72B6\u6001\u5F00\u5173\n\tif (config && !isIPE) { // \u60C5\u5F622\u62163\n\t\tconst {functionSynonyms: [insensitive]} = config;\n\t\tif (!('subst' in insensitive)) {\n\t\t\tObject.assign(insensitive, getConfig(magicwords, ({name}) => others.has(name)));\n\t\t}\n\t} else { // \u60C5\u5F624\uFF1A`config === null`\n\t\t// @ts-expect-error incomplete properties\n\t\tconfig = {\n\t\t\ttagModes: {},\n\t\t\ttags: {},\n\t\t};\n\t\tfor (const tag of extensiontags) {\n\t\t\tconfig!.tags[tag.slice(1, -1)] = true;\n\t\t}\n\t\tconst functions = new Set([\n\t\t\t...functionhooks,\n\t\t\t...variables,\n\t\t\t...others,\n\t\t]);\n\t\tconfig!.functionSynonyms = getConfigPair(magicwords, ({name}) => functions.has(name));\n\t\tconfig!.doubleUnderscore = getConfigPair(\n\t\t\tmagicwords,\n\t\t\t({aliases}) => aliases.some(alias => /^__.+__$/u.test(alias)),\n\t\t);\n\t\tconfig!.fromApi = true;\n\t}\n\tconfig!.img = getConfig(magicwords, ({name}) => name.startsWith('img_'));\n\tconfig!.variants = variants ? variants.map(({code}) => code) : [];\n\tconfig!.nsid = nsid;\n\tconfig!.urlProtocols = mw.config.get('wgUrlProtocols').replace(/\\\\:/gu, ':');\n\tsetConfig(config!);\n\tALL_SETTINGS_CACHE[SITE_ID] = {config: config!, time: Date.now()};\n\tsetObject('InPageEditMwConfig', ALL_SETTINGS_CACHE);\n\treturn config!;\n};\n\n/**\n * \u5C06MwConfig\u8F6C\u6362\u4E3AConfig\n * @param minConfig \u57FA\u7840Config\n * @param mwConfig\n */\nexport const getParserConfig = (minConfig: Config, mwConfig: MwConfig): Config => {\n\tif (mw.config.exists('wikilintConfig')) {\n\t\treturn mw.config.get('wikilintConfig') as Config;\n\t}\n\tconst config: Config = {\n\t\t...minConfig,\n\t\text: Object.keys(mwConfig.tags),\n\t\tnamespaces: mw.config.get('wgFormattedNamespaces'),\n\t\tnsid: mwConfig.nsid,\n\t\tdoubleUnderscore: mwConfig.doubleUnderscore.map(\n\t\t\tobj => Object.keys(obj).map(s => s.slice(2, -2)),\n\t\t) as [string[], string[]],\n\t\tvariants: mwConfig.variants!,\n\t\tprotocol: mwConfig.urlProtocols,\n\t};\n\t[config.parserFunction[0]] = mwConfig.functionSynonyms;\n\tif (mw.loader.getState('ext.CodeMirror') === null) {\n\t\tfor (const [key, val] of Object.entries(mwConfig.functionSynonyms[0])) {\n\t\t\tif (!key.startsWith('#')) {\n\t\t\t\tconfig.parserFunction[0][`#${key}`] = val;\n\t\t\t}\n\t\t}\n\t}\n\tconfig.parserFunction[1] = [\n\t\t...Object.keys(mwConfig.functionSynonyms[1]),\n\t\t'=',\n\t];\n\tfor (const [key, val] of Object.entries(mwConfig.img!)) {\n\t\tconfig.img[key] = val.slice(4);\n\t}\n\treturn config;\n};\n", "import {getObject, setObject} from './util';\nimport type {CodeMirror} from './base';\n\nexport const REPO_CDN = 'npm/@bhsd/codemirror-mediawiki@2.11.3',\n\tcurVersion = REPO_CDN.slice(REPO_CDN.lastIndexOf('@') + 1);\n\nconst {vendor, userAgent, maxTouchPoints, platform} = navigator;\n\nexport const isMac = vendor.includes('Apple Computer') && (userAgent.includes('Mobile/') || maxTouchPoints > 2)\n\t|| platform.includes('Mac');\n\nconst storageKey = 'codemirror-mediawiki-i18n',\n\tlanguages: Record<string, string> = {\n\t\tzh: 'zh-hans',\n\t\t'zh-hans': 'zh-hans',\n\t\t'zh-cn': 'zh-hans',\n\t\t'zh-my': 'zh-hans',\n\t\t'zh-sg': 'zh-hans',\n\t\t'zh-hant': 'zh-hant',\n\t\t'zh-tw': 'zh-hant',\n\t\t'zh-hk': 'zh-hant',\n\t\t'zh-mo': 'zh-hant',\n\t},\n\tlang = languages[mw.config.get('wgUserLanguage')] || 'en';\n\n/** \u9884\u5B58\u7684I18N\uFF0C\u53EF\u4EE5\u7528\u4E8E\u5224\u65AD\u662F\u5426\u662F\u9996\u6B21\u5B89\u88C5 */\nexport const i18n: Record<string, string> = getObject(storageKey) || {};\n\nconst {version} = i18n;\n\n/**\n * \u52A0\u8F7D I18N\n * @param CDN CDN\u5730\u5740\n */\nexport const setI18N = async (CDN: string): Promise<void> => {\n\tif (i18n['lang'] !== lang || version !== curVersion) {\n\t\ttry {\n\t\t\tObject.assign(i18n, await (await fetch(`${CDN}/${REPO_CDN}/i18n/${lang}.json`)).json());\n\t\t\tsetObject(storageKey, i18n);\n\t\t} catch (e) {\n\t\t\tvoid mw.notify(msg('i18n-failed', lang), {type: 'error'});\n\t\t\tconsole.error(e);\n\t\t}\n\t}\n\tfor (const [k, v] of Object.entries(i18n)) {\n\t\tif (!k.endsWith('-mac')) {\n\t\t\tmw.messages.set(`cm-mw-${k}`, v);\n\t\t} else if (isMac) {\n\t\t\tmw.messages.set(`cm-mw-${k.slice(0, -4)}`, v);\n\t\t}\n\t}\n};\n\n/**\n * \u83B7\u53D6I18N\u6D88\u606F\n * @param key \u6D88\u606F\u952E\uFF0C\u7701\u7565`cm-mw-`\u524D\u7F00\n * @param args \u66FF\u6362`$1`\u7B49\u7684\u53C2\u6570\n */\nexport const msg = (key: string, ...args: string[]): string => mw.msg(`cm-mw-${key}`, ...args);\n\n/**\n * \u4E3A\u6240\u6709\u94FE\u63A5\u6DFB\u52A0`target=\"_blank\"`\n * @param $dom \u5BB9\u5668\n */\nconst blankTarget = ($dom: JQuery<HTMLElement>): JQuery<HTMLElement> => {\n\t$dom.find('a').add($dom.filter('a')).attr('target', '_blank');\n\treturn $dom;\n};\n\n/**\n * \u89E3\u6790I18N\u6D88\u606F\n * @param key \u6D88\u606F\u952E\uFF0C\u7701\u7565`cm-mw-`\u524D\u7F00\n * @param text \u662F\u5426\u8F93\u51FA\u4E3A\u6587\u672C\n */\nfunction parseMsg(key: string): JQuery<HTMLElement>;\nfunction parseMsg(key: string, text: true): string;\nfunction parseMsg(key: string, text?: boolean): string | JQuery<HTMLElement> {\n\tconst message = mw.message(`cm-mw-${key}`);\n\treturn text ? message.parse() : blankTarget(message.parseDom());\n}\nexport {parseMsg};\n\n/**\n * \u89E3\u6790\u7248\u672C\u53F7\n * @param v \u7248\u672C\u53F7\n */\nconst parseVersion = (v: string): [number, number] => v.split('.', 2).map(Number) as [number, number];\n\n/**\n * \u521B\u5EFA\u6C14\u6CE1\u63D0\u793A\u6D88\u606F\n * @param key \u6D88\u606F\u952E\uFF0C\u7701\u7565`cm-mw-`\u524D\u7F00\n * @param args \u66FF\u6362`$1`\u7B49\u7684\u53C2\u6570\n */\nconst notify = async (key: string, ...args: string[]): Promise<JQuery<HTMLElement>> => {\n\tconst $p = blankTarget($('<p>', {html: msg(key, ...args)}));\n\tawait mw.notify($p, {type: 'success', autoHideSeconds: 'long'});\n\treturn $p;\n};\n\n/**\n * \u6B22\u8FCE\u6D88\u606F\n * @param baseVersion \u9996\u6B21\u52A0\u5165\u65B0\u63D2\u4EF6\u7684\u7248\u672C\n * @param addons \u65B0\u63D2\u4EF6\n */\nexport const welcome = async (baseVersion: string, addons: string[]): Promise<void> => {\n\tlet notification: JQuery<HTMLElement> | undefined;\n\tif (!version) { // \u9996\u6B21\u5B89\u88C5\n\t\tnotification = await notify('welcome');\n\t} else if (addons.length > 0) { // \u66F4\u65B0\u7248\u672C\n\t\tconst [baseMajor, baseMinor] = parseVersion(baseVersion),\n\t\t\t[major, minor] = parseVersion(version);\n\t\tif (major < baseMajor || major === baseMajor && minor < baseMinor) {\n\t\t\tnotification = await notify(\n\t\t\t\t'welcome-addons',\n\t\t\t\tcurVersion,\n\t\t\t\tString(addons.length),\n\t\t\t\taddons.map(addon => `<li>${parseMsg(`addon-${addon}`, true)}</li>`).join(''),\n\t\t\t);\n\t\t}\n\t}\n\tnotification?.find('#settings').click(e => {\n\t\te.preventDefault();\n\t\tdocument.getElementById('cm-settings')!.dispatchEvent(new MouseEvent('click'));\n\t});\n};\n\n/**\n * \u672C\u5730\u5316\n * @param cm\n */\nexport const localize = (cm: CodeMirror): void => {\n\tconst obj: Record<string, string> = {};\n\tfor (const [k, v] of Object.entries(i18n)) {\n\t\tif (k.startsWith('phrase-')) {\n\t\t\tobj[k.slice(7).replace(/-/gu, ' ')] = v;\n\t\t}\n\t}\n\tcm.localize(obj);\n};\n", "import {isMac} from './msg';\nimport type {SyntaxNode} from '@lezer/common';\nimport type {CodeMirror} from './base';\n\ndeclare type MouseEventListener = (e: MouseEvent) => void;\n\nconst modKey = isMac ? 'metaKey' : 'ctrlKey',\n\thandlers = new WeakMap<CodeMirror, MouseEventListener>();\n\n/**\n * \u83B7\u53D6\u8282\u70B9\u7684\u540D\u79F0\n * @param node \u8BED\u6CD5\u6811\u8282\u70B9\n */\nfunction getName(node: SyntaxNode): string;\nfunction getName(node: null): undefined;\nfunction getName(node: SyntaxNode | null): string | undefined {\n\treturn node?.name.replace(/_+/gu, ' ').trim();\n}\n\n/**\n * \u67E5\u627E\u8FDE\u7EED\u540C\u540D\u8282\u70B9\n * @param node \u8D77\u59CB\u8282\u70B9\n * @param dir \u65B9\u5411\n * @param name \u8282\u70B9\u540D\u79F0\n */\nconst search = (node: SyntaxNode, dir: 'prevSibling' | 'nextSibling', name = getName(node)): SyntaxNode => {\n\twhile (getName(node[dir]!) === name) {\n\t\tnode = node[dir]!; // eslint-disable-line no-param-reassign\n\t}\n\treturn node;\n};\n\n/**\n * \u70B9\u51FB\u65F6\u5728\u65B0\u9875\u9762\u6253\u5F00\u94FE\u63A5\u3001\u6A21\u677F\u7B49\n * @param cm\n * @param e \u70B9\u51FB\u4E8B\u4EF6\n */\nconst getHandler = (cm: CodeMirror): MouseEventListener => {\n\tif (handlers.has(cm)) {\n\t\treturn handlers.get(cm)!;\n\t}\n\tconst handler: MouseEventListener = (e): void => {\n\t\tif (!e[modKey]) {\n\t\t\treturn;\n\t\t}\n\t\tconst {view} = cm,\n\t\t\t{state} = view!,\n\t\t\tnode = cm.getNodeAt(view!.posAtCoords(e)!);\n\t\tif (!node) {\n\t\t\t// pass\n\t\t} else if (node.name.includes('mw-pagename')) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tconst name = getName(node);\n\t\t\tlet page = state.sliceDoc(\n\t\t\t\tsearch(node, 'prevSibling', name).from,\n\t\t\t\tsearch(node, 'nextSibling', name).to,\n\t\t\t).trim();\n\t\t\tif (page.startsWith('/')) {\n\t\t\t\tpage = `:${mw.config.get('wgPageName')}${page}`;\n\t\t\t}\n\t\t\tlet ns = 0;\n\t\t\tif (name.includes('-template-name')) {\n\t\t\t\tns = 10;\n\t\t\t} else if (name.includes('-parserfunction')) {\n\t\t\t\tns = 828;\n\t\t\t}\n\t\t\topen(new mw.Title(page, ns).getUrl(undefined), '_blank');\n\t\t} else if (/-extlink-protocol/u.test(node.name)) {\n\t\t\te.preventDefault();\n\t\t\topen(state.sliceDoc(node.from, search(node.nextSibling!, 'nextSibling').to), '_blank');\n\t\t} else if (/-extlink(?:_|$)/u.test(node.name)) {\n\t\t\te.preventDefault();\n\t\t\tconst name = getName(node),\n\t\t\t\tprev = search(node, 'prevSibling', name).prevSibling!,\n\t\t\t\tnext = search(node, 'nextSibling', name);\n\t\t\topen(state.sliceDoc(prev.from, next.to), '_blank');\n\t\t}\n\t};\n\thandlers.set(cm, handler);\n\treturn handler;\n};\n\n/**\n * \u6DFB\u52A0\u6216\u79FB\u9664\u6253\u5F00\u94FE\u63A5\u7684\u4E8B\u4EF6\n * @param cm\n * @param on \u662F\u5426\u6DFB\u52A0\n */\nexport const openLinks = (cm: CodeMirror, on?: boolean): void => {\n\tconst {contentDOM} = cm.view!,\n\t\thandler = getHandler(cm);\n\tif (on) {\n\t\tmw.loader.load('mediawiki.Title');\n\t\tcontentDOM.addEventListener('mousedown', handler, {capture: true});\n\t\tcontentDOM.style.setProperty('--codemirror-cursor', 'pointer');\n\t} else if (on === false) {\n\t\tcontentDOM.removeEventListener('mousedown', handler, {capture: true});\n\t\tcontentDOM.style.removeProperty('--codemirror-cursor');\n\t}\n};\n", "import {CodeMirror} from './base';\n\nexport const instances = new WeakMap<HTMLTextAreaElement, CodeMirror>();\n\n/**\n * \u83B7\u53D6CodeMirror\u5B9E\u4F8B\n * @param $ele textarea\u5143\u7D20\u7684jQuery\u5BF9\u8C61\n */\nconst getInstance = ($ele: JQuery<HTMLTextAreaElement>): CodeMirror => instances.get($ele[0]!)!;\n\ndeclare interface EncapsulateOptions {\n\tpre?: string;\n\tperi?: string;\n\tpost?: string;\n\townline?: boolean;\n\treplace?: boolean;\n\tselectPeri?: boolean;\n\tsplitlines?: boolean;\n\tselectionStart?: number;\n\tselectionEnd?: number;\n}\n\n/**\n * jQuery.textSelection overrides for CodeMirror.\n * See jQuery.textSelection.js for method documentation\n */\nexport const textSelection = {\n\tgetContents(this: JQuery<HTMLTextAreaElement>): string {\n\t\treturn getInstance(this).view!.state.doc.toString();\n\t},\n\tsetContents(this: JQuery<HTMLTextAreaElement>, content: string): JQuery<HTMLTextAreaElement> {\n\t\tgetInstance(this).setContent(content);\n\t\treturn this;\n\t},\n\tgetSelection(this: JQuery<HTMLTextAreaElement>): string {\n\t\tconst {state} = getInstance(this).view!,\n\t\t\t{selection: {main: {from, to}}} = state;\n\t\treturn state.sliceDoc(from, to);\n\t},\n\tsetSelection(\n\t\tthis: JQuery<HTMLTextAreaElement>,\n\t\t{start, end = start}: {start: number, end?: number},\n\t): JQuery<HTMLTextAreaElement> {\n\t\tgetInstance(this).view!.dispatch({\n\t\t\tselection: {anchor: start, head: end},\n\t\t});\n\t\treturn this;\n\t},\n\treplaceSelection(this: JQuery<HTMLTextAreaElement>, value: string): JQuery<HTMLTextAreaElement> {\n\t\tconst {view} = getInstance(this);\n\t\tview!.dispatch(view!.state.replaceSelection(value));\n\t\treturn this;\n\t},\n\tencapsulateSelection(this: JQuery<HTMLTextAreaElement>, {\n\t\tpre = '',\n\t\tperi = '',\n\t\tpost = '',\n\t\townline,\n\t\treplace,\n\t\tselectPeri = true,\n\t\tsplitlines,\n\t\tselectionStart,\n\t\tselectionEnd = selectionStart,\n\t}: EncapsulateOptions): JQuery<HTMLTextAreaElement> {\n\t\tconst {view} = getInstance(this),\n\t\t\t{state} = view!;\n\t\tconst handleOwnline = (from: number, to: number, text: string): [string, number, number] => {\n\t\t\tlet start = 0,\n\t\t\t\tend = 0;\n\t\t\tif (ownline) {\n\t\t\t\tif (from > 0 && !/[\\n\\r]/u.test(state.sliceDoc(from - 1, from))) {\n\t\t\t\t\ttext = `\\n${text}`; // eslint-disable-line no-param-reassign\n\t\t\t\t\tstart = 1;\n\t\t\t\t}\n\t\t\t\tif (!/[\\n\\r]/u.test(state.sliceDoc(to, to + 1))) {\n\t\t\t\t\ttext += '\\n'; // eslint-disable-line no-param-reassign\n\t\t\t\t\tend = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn [text, start, end];\n\t\t};\n\t\tif (ownline && replace && !pre && !post && selectionStart === undefined && /^\\s*=.*=\\s*$/u.test(peri)) {\n\t\t\t// \u5355\u72EC\u5904\u7406\u6539\u53D8\u6807\u9898\u5C42\u7EA7\n\t\t\tconst {selection: {main: {from, to}}} = state,\n\t\t\t\t[insertText] = handleOwnline(from, to, peri);\n\t\t\tview!.dispatch({\n\t\t\t\tchanges: {from, to, insert: insertText},\n\t\t\t\tselection: {anchor: from + insertText.length},\n\t\t\t});\n\t\t\treturn this;\n\t\t}\n\t\tCodeMirror.replaceSelections(view!, (_, {from, to}) => {\n\t\t\tif (selectionStart !== undefined) {\n\t\t\t\t/* eslint-disable no-param-reassign */\n\t\t\t\tfrom = selectionStart;\n\t\t\t\tto = selectionEnd!;\n\t\t\t\t/* eslint-enable no-param-reassign */\n\t\t\t}\n\t\t\tconst isSample = selectPeri && from === to,\n\t\t\t\tselText = replace || from === to ? peri : state.sliceDoc(from, to),\n\t\t\t\t[insertText, start, end] = handleOwnline(\n\t\t\t\t\tfrom,\n\t\t\t\t\tto,\n\t\t\t\t\tsplitlines\n\t\t\t\t\t\t? selText.split('\\n').map(line => `${pre}${line}${post}`).join('\\n')\n\t\t\t\t\t\t: `${pre}${selText}${post}`,\n\t\t\t\t),\n\t\t\t\thead = from + insertText.length;\n\t\t\treturn isSample ? [insertText, from + pre.length + start, head - post.length - end] : [insertText, head];\n\t\t});\n\t\treturn this;\n\t},\n\tgetCaretPosition(this: JQuery<HTMLTextAreaElement>, option?: {startAndEnd?: boolean}): [number, number] | number {\n\t\tconst {state: {selection: {main: {from, to, head}}}} = getInstance(this).view!;\n\t\treturn option?.startAndEnd ? [from, to] : head;\n\t},\n\tscrollToCaretPosition(this: JQuery<HTMLTextAreaElement>): JQuery<HTMLTextAreaElement> {\n\t\tconst cm = getInstance(this);\n\t\tcm.scrollTo();\n\t\treturn this;\n\t},\n};\n\n/**\n * jQuery.textSelection overrides for Monaco Editor.\n * See jQuery.textSelection.js for method documentation\n */\nexport const monacoTextSelection = {\n\tgetContents(this: JQuery<HTMLTextAreaElement>): string {\n\t\treturn getInstance(this).model!.getValue();\n\t},\n\tsetContents(this: JQuery<HTMLTextAreaElement>, content: string): JQuery<HTMLTextAreaElement> {\n\t\tgetInstance(this).model!.setValue(content);\n\t\treturn this;\n\t},\n\tgetSelection(this: JQuery<HTMLTextAreaElement>): string {\n\t\tconst {model, editor} = getInstance(this);\n\t\treturn model!.getValueInRange(editor!.getSelection()!);\n\t},\n\tsetSelection(\n\t\tthis: JQuery<HTMLTextAreaElement>,\n\t\t{start, end = start}: {start: number, end?: number},\n\t): JQuery<HTMLTextAreaElement> {\n\t\tconst {model, editor} = getInstance(this),\n\t\t\t{lineNumber: startLineNumber, column: startColumn} = model!.getPositionAt(start),\n\t\t\t{lineNumber: endLineNumber, column: endColumn} = model!.getPositionAt(end);\n\t\teditor!.setSelection({startLineNumber, startColumn, endLineNumber, endColumn});\n\t\treturn this;\n\t},\n\treplaceSelection(this: JQuery<HTMLTextAreaElement>, value: string): JQuery<HTMLTextAreaElement> {\n\t\tconst {editor} = getInstance(this);\n\t\teditor!.executeEdits(\n\t\t\t'replaceSelection',\n\t\t\t[{range: editor!.getSelection()!, text: value, forceMoveMarkers: true}],\n\t\t);\n\t\treturn this;\n\t},\n\tencapsulateSelection(this: JQuery<HTMLTextAreaElement>, {\n\t\tpre = '',\n\t\tperi = '',\n\t\tpost = '',\n\t\townline,\n\t\treplace,\n\t\tsplitlines,\n\t\tselectionStart,\n\t\tselectionEnd = selectionStart,\n\t}: EncapsulateOptions): JQuery<HTMLTextAreaElement> {\n\t\tif (selectionStart !== undefined) {\n\t\t\ttextSelection.setSelection.call(this, {start: selectionStart, end: selectionEnd!});\n\t\t}\n\t\tconst {model, editor} = getInstance(this),\n\t\t\tselection = editor!.getSelection()!,\n\t\t\tselText = replace || selection.isEmpty() ? peri : model!.getValueInRange(selection),\n\t\t\tinsertText = `${ownline && selection.startColumn > 1 ? '\\n' : ''}${splitlines\n\t\t\t\t? selText.split('\\n').map(line => `${pre}${line}${post}`).join('\\n')\n\t\t\t\t: `${pre}${selText}${post}`\n\t\t\t}${ownline && selection.endColumn <= model!.getLineLength(selection.endLineNumber) ? '\\n' : ''}`;\n\t\teditor!.executeEdits('encapsulateSelection', [{range: selection, text: insertText, forceMoveMarkers: true}]);\n\t\treturn this;\n\t},\n\tgetCaretPosition(this: JQuery<HTMLTextAreaElement>, option?: {startAndEnd?: boolean}): [number, number] | number {\n\t\tconst {editor, model} = getInstance(this),\n\t\t\tselection = editor!.getSelection()!,\n\t\t\tto = model!.getOffsetAt(selection.getEndPosition());\n\t\treturn option?.startAndEnd ? [model!.getOffsetAt(selection.getStartPosition()), to] : to;\n\t},\n\tscrollToCaretPosition(this: JQuery<HTMLTextAreaElement>): JQuery<HTMLTextAreaElement> {\n\t\tconst {editor} = getInstance(this);\n\t\teditor!.revealPosition(editor!.getPosition()!);\n\t\treturn this;\n\t},\n};\n\n", "export interface Config {\n\text: string[];\n\treadonly html: [string[], string[], string[]];\n\treadonly namespaces: Record<string, string>;\n\treadonly nsid: Record<string, number>;\n\treadonly parserFunction: [Record<string, string>, string[], string[], string[]];\n\treadonly doubleUnderscore: [string[], string[]];\n\treadonly protocol: string;\n\treadonly img: Record<string, string>;\n\treadonly redirection: string[];\n\treadonly variants: string[];\n\treadonly excludes?: string[];\n\n\t/* NOT FOR BROWSER */\n\n\treadonly interwiki: string[];\n\treadonly conversionTable?: [string, string][];\n\treadonly redirects?: [string, string][];\n}\n\nexport type TokenTypes = 'root'\n\t| 'plain'\n\t| 'redirect'\n\t| 'redirect-syntax'\n\t| 'redirect-target'\n\t| 'onlyinclude'\n\t| 'noinclude'\n\t| 'include'\n\t| 'comment'\n\t| 'ext'\n\t| 'ext-attrs'\n\t| 'ext-attr-dirty'\n\t| 'ext-attr'\n\t| 'attr-key'\n\t| 'attr-value'\n\t| 'ext-inner'\n\t| 'arg'\n\t| 'arg-name'\n\t| 'arg-default'\n\t| 'hidden'\n\t| 'magic-word'\n\t| 'magic-word-name'\n\t| 'invoke-function'\n\t| 'invoke-module'\n\t| 'template'\n\t| 'template-name'\n\t| 'parameter'\n\t| 'parameter-key'\n\t| 'parameter-value'\n\t| 'heading'\n\t| 'heading-title'\n\t| 'heading-trail'\n\t| 'html'\n\t| 'html-attrs'\n\t| 'html-attr-dirty'\n\t| 'html-attr'\n\t| 'table'\n\t| 'tr'\n\t| 'td'\n\t| 'table-syntax'\n\t| 'table-attrs'\n\t| 'table-attr-dirty'\n\t| 'table-attr'\n\t| 'table-inter'\n\t| 'td-inner'\n\t| 'hr'\n\t| 'double-underscore'\n\t| 'link'\n\t| 'link-target'\n\t| 'link-text'\n\t| 'category'\n\t| 'file'\n\t| 'gallery-image'\n\t| 'imagemap-image'\n\t| 'image-parameter'\n\t| 'quote'\n\t| 'ext-link'\n\t| 'ext-link-text'\n\t| 'ext-link-url'\n\t| 'free-ext-link'\n\t| 'list'\n\t| 'dd'\n\t| 'converter'\n\t| 'converter-flags'\n\t| 'converter-flag'\n\t| 'converter-rule'\n\t| 'converter-rule-variant'\n\t| 'converter-rule-to'\n\t| 'converter-rule-from'\n\t| 'param-line'\n\t| 'imagemap-link';\n\nexport const rules = [\n\t'bold-header',\n\t'format-leakage',\n\t'fostered-content',\n\t'h1',\n\t'illegal-attr',\n\t'insecure-style',\n\t'invalid-gallery',\n\t'invalid-imagemap',\n\t'invalid-invoke',\n\t'lonely-apos',\n\t'lonely-bracket',\n\t'lonely-http',\n\t'nested-link',\n\t'no-arg',\n\t'no-duplicate',\n\t'no-ignored',\n\t'obsolete-attr',\n\t'obsolete-tag',\n\t'parsing-order',\n\t'pipe-like',\n\t'table-layout',\n\t'tag-like',\n\t'unbalanced-header',\n\t'unclosed-comment',\n\t'unclosed-quote',\n\t'unclosed-table',\n\t'unescaped',\n\t'unknown-page',\n\t'unmatched-tag',\n\t'unterminated-url',\n\t'url-encoding',\n\t'var-anchor',\n\t'void-ext',\n] as const;\n\nexport namespace LintError {\n\texport type Severity = 'error' | 'warning';\n\n\texport type Rule = typeof rules[number];\n\n\texport interface Fix {\n\t\treadonly range: [number, number];\n\t\ttext: string;\n\t}\n}\n\nexport interface LintError {\n\trule: LintError.Rule;\n\tmessage: string;\n\tseverity: LintError.Severity;\n\tstartIndex: number;\n\tendIndex: number;\n\tstartLine: number;\n\tstartCol: number;\n\tendLine: number;\n\tendCol: number;\n\tfix?: LintError.Fix;\n\tsuggestions?: (LintError.Fix & {desc: string})[];\n}\n\nexport type AST = Record<string, string | number | boolean> & {\n\trange: [number, number];\n\ttype?: TokenTypes;\n\tchildNodes?: AST[];\n};\n\n/** \u7C7B\u4F3CNode */\nexport interface AstNode {\n\ttype: string;\n\treadonly childNodes: readonly AstNode[];\n\n\t/** Linter */\n\tlint(): LintError[];\n\n\t/** \u4EE5HTML\u683C\u5F0F\u6253\u5370 */\n\tprint(): string;\n}\n\n/** \u7C7B\u4F3CHTMLElement */\ninterface AstElement extends AstNode {\n\n\t/** \u4FDD\u5B58\u4E3AJSON */\n\tjson(): AST;\n}\n\nexport interface Parser {\n\tconfig: string | Config;\n\ti18n: string | Record<string, string> | undefined;\n\n\t/** @private */\n\tgetConfig(): Config;\n\n\t/**\n\t * \u89E3\u6790wikitext\n\t * @param include \u662F\u5426\u5D4C\u5165\n\t * @param maxStage \u6700\u5927\u89E3\u6790\u5C42\u7EA7\n\t */\n\tparse(wikitext: string, include?: boolean, maxStage?: number, config?: Config): AstElement;\n}\n", "import {rules} from 'wikiparser-node/base';\nimport {CodeMirror} from './base';\nimport {getObject, setObject} from './util';\nimport {msg, parseMsg, i18n} from './msg';\nimport {instances} from './textSelection';\nimport type {LintError} from 'wikiparser-node';\nimport type {ApiEditPageParams, ApiQueryRevisionsParams} from 'types-mediawiki/api_params';\n\nconst storageKey = 'codemirror-mediawiki-addons',\n\twikilintKey = 'codemirror-mediawiki-wikilint',\n\tcodeKeys = ['ESLint', 'Stylelint'] as const,\n\tuser = mw.config.get('wgUserName'),\n\tuserPage = user && `User:${user}/codemirror-mediawiki.json`;\n\ndeclare type codeKey = typeof codeKeys[number];\n\ndeclare type Preferences = {\n\taddons?: string[];\n\tindent?: string;\n\twikilint?: Record<LintError.Rule, RuleState>;\n} & Record<codeKey, unknown>;\n\ndeclare interface MediaWikiPage {\n\treadonly revisions?: {\n\t\treadonly content: string;\n\t}[];\n}\ndeclare interface MediaWikiResponse {\n\treadonly query: {\n\t\treadonly pages: MediaWikiPage[];\n\t};\n}\n\nconst enum RuleState {\n\toff = '0',\n\terror = '1',\n\ton = '2',\n}\n\nexport const indentKey = 'codemirror-mediawiki-indent',\n\tprefs = new Set(getObject(storageKey) as string[] | null),\n\twikilintConfig = (getObject(wikilintKey) || {}) as Record<LintError.Rule, RuleState | undefined>,\n\tcodeConfigs = new Map(codeKeys.map(k => [k, getObject(`codemirror-mediawiki-${k}`)]));\n\n// OOUI\u7EC4\u4EF6\nlet dialog: OO.ui.MessageDialog | undefined,\n\tlayout: OO.ui.IndexLayout,\n\twidget: OO.ui.CheckboxMultiselectInputWidget,\n\tindentWidget: OO.ui.TextInputWidget,\n\tindent = localStorage.getItem(indentKey) || '';\nconst widgets: Partial<Record<codeKey, OO.ui.MultilineTextInputWidget>> = {},\n\twikilintWidgets = new Map<LintError.Rule, OO.ui.DropdownInputWidget>();\n\n/**\n * \u5904\u7406Api\u8BF7\u6C42\u9519\u8BEF\n * @param code \u9519\u8BEF\u4EE3\u7801\n * @param e \u9519\u8BEF\u4FE1\u606F\n */\nconst apiErr = (code: string, e: any): void => { // eslint-disable-line @typescript-eslint/no-explicit-any\n\tconst message = code === 'http' || code === 'okay-but-empty'\n\t\t? `MediaWiki API request failed: ${code}`\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\t: $('<ul>', {html: (e.errors as {html: string}[]).map(({html}) => $('<li>', {html}))});\n\tvoid mw.notify(message as string | HTMLElement[], {type: 'error', autoHideSeconds: 'long'});\n};\n\nconst api = (async () => {\n\tif (user) {\n\t\tawait mw.loader.using('mediawiki.api');\n\t\treturn new mw.Api({parameters: {errorformat: 'html', formatversion: '2'}});\n\t}\n\treturn undefined;\n})();\n\nexport const loadJSON = (async () => {\n\tif (!user) {\n\t\treturn;\n\t}\n\tconst params: ApiQueryRevisionsParams = {\n\t\taction: 'query',\n\t\tprop: 'revisions',\n\t\ttitles: userPage!,\n\t\trvprop: 'content',\n\t\trvlimit: 1,\n\t};\n\t(await api)!.get(params as Record<string, string>).then( // eslint-disable-line promise/prefer-await-to-then\n\t\tres => {\n\t\t\tconst {query: {pages: [page]}} = res as MediaWikiResponse;\n\t\t\tif (page?.revisions) {\n\t\t\t\tconst json: Preferences = JSON.parse(page.revisions[0]!.content);\n\t\t\t\tif (!json.addons?.includes('save')) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tprefs.clear();\n\t\t\t\tfor (const option of json.addons) {\n\t\t\t\t\tprefs.add(option);\n\t\t\t\t}\n\t\t\t\tif (json.indent) {\n\t\t\t\t\tlocalStorage.setItem(indentKey, json.indent);\n\t\t\t\t}\n\t\t\t\tfor (const key of codeKeys) {\n\t\t\t\t\tif (json[key]) {\n\t\t\t\t\t\tcodeConfigs.set(key, json[key]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (json.wikilint) {\n\t\t\t\t\tObject.assign(wikilintConfig, json.wikilint);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tapiErr,\n\t);\n})();\n\n/**\n * \u6253\u5F00\u8BBE\u7F6E\u5BF9\u8BDD\u6846\n * @param editors CodeMirror\u5B9E\u4F8B\n */\nexport const openPreference = async (editors: (CodeMirror | undefined)[]): Promise<void> => {\n\tawait mw.loader.using([\n\t\t'oojs-ui-windows',\n\t\t'oojs-ui-widgets',\n\t\t'oojs-ui.styles.icons-content',\n\t\t'mediawiki.jqueryMsg',\n\t]);\n\tawait loadJSON;\n\tif (dialog) {\n\t\twidget.setValue([...prefs] as unknown as string);\n\t\tindentWidget.setValue(indent);\n\t} else {\n\t\tdialog = new OO.ui.MessageDialog({id: 'cm-preference'});\n\t\tconst windowManager = new OO.ui.WindowManager();\n\t\twindowManager.$element.appendTo(document.body);\n\t\twindowManager.addWindows([dialog]);\n\t\tlayout = new OO.ui.IndexLayout();\n\t\tconst panelMain = new OO.ui.TabPanelLayout('main', {label: msg('title')}),\n\t\t\tpanelWikilint = new OO.ui.TabPanelLayout('wikilint', {label: 'WikiLint'}),\n\t\t\tpanels: Partial<Record<codeKey, OO.ui.TabPanelLayout>> = {};\n\t\tfor (const key of codeKeys) {\n\t\t\tconst c = codeConfigs.get(key);\n\t\t\twidgets[key] = new OO.ui.MultilineTextInputWidget({\n\t\t\t\tvalue: c ? JSON.stringify(c, null, indent || '\\t') : '',\n\t\t\t});\n\t\t\tconst codeField = new OO.ui.FieldLayout(widgets[key]!, {label: msg(`${key}-config`), align: 'top'}),\n\t\t\t\tpanel = new OO.ui.TabPanelLayout(key, {label: key, $content: codeField.$element});\n\t\t\tpanel.on('active', active => {\n\t\t\t\tconst [textarea] = panel.$element.find('textarea') as unknown as [HTMLTextAreaElement];\n\t\t\t\tif (active && !instances.has(textarea)) {\n\t\t\t\t\t(async () => {\n\t\t\t\t\t\tconst {editor} = await CodeMirror.fromTextArea(textarea, 'json');\n\t\t\t\t\t\tif (editor) {\n\t\t\t\t\t\t\teditor.getContainerDomNode().style.height = `${Math.max(editor.getContentHeight(), 400)}px`;\n\t\t\t\t\t\t}\n\t\t\t\t\t})();\n\t\t\t\t}\n\t\t\t});\n\t\t\tpanels[key] = panel;\n\t\t}\n\t\tlayout.addTabPanels([panelMain, panelWikilint, ...Object.values(panels)], 0);\n\t\twidget = new OO.ui.CheckboxMultiselectInputWidget({\n\t\t\toptions: [\n\t\t\t\t{disabled: true},\n\t\t\t\t...Object.keys(i18n)\n\t\t\t\t\t.filter(k => k !== 'addon-indent' && k.startsWith('addon-') && !k.endsWith('-mac'))\n\t\t\t\t\t.map(k => ({\n\t\t\t\t\t\tdata: k.slice(6),\n\t\t\t\t\t\tlabel: parseMsg(k),\n\t\t\t\t\t\tdisabled: k === 'addon-wikiEditor' && !mw.loader.getState('ext.wikiEditor')\n\t\t\t\t\t\t|| k === 'addon-save' && !user,\n\t\t\t\t\t})),\n\t\t\t],\n\t\t\tvalue: [...prefs] as unknown as string,\n\t\t});\n\t\tindentWidget = new OO.ui.TextInputWidget({value: indent, placeholder: '\\\\t'});\n\t\tconst field = new OO.ui.FieldLayout(widget, {\n\t\t\t\tlabel: msg('label'),\n\t\t\t\talign: 'top',\n\t\t\t}),\n\t\t\tindentField = new OO.ui.FieldLayout(indentWidget, {label: msg('addon-indent')});\n\t\tpanelMain.$element.append(\n\t\t\tfield.$element,\n\t\t\tindentField.$element,\n\t\t\t$('<p>', {html: msg('feedback', 'codemirror-mediawiki')}),\n\t\t);\n\t\tpanelWikilint.$element.append(\n\t\t\t...rules.map(rule => {\n\t\t\t\tconst state = rule === 'no-arg' ? RuleState.off : RuleState.error,\n\t\t\t\t\tdropdown = new OO.ui.DropdownInputWidget({\n\t\t\t\t\t\toptions: [\n\t\t\t\t\t\t\t{data: RuleState.off, label: msg('wikilint-off')},\n\t\t\t\t\t\t\t{data: RuleState.error, label: msg('wikilint-error')},\n\t\t\t\t\t\t\t{data: RuleState.on, label: msg('wikilint-on')},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tvalue: wikilintConfig[rule] || state,\n\t\t\t\t\t}),\n\t\t\t\t\tf = new OO.ui.FieldLayout(dropdown, {label: rule});\n\t\t\t\twikilintWidgets.set(rule, dropdown);\n\t\t\t\twikilintConfig[rule] ||= state;\n\t\t\t\treturn f.$element;\n\t\t\t}),\n\t\t\t$('<p>', {html: msg('feedback', 'wikiparser-node')}),\n\t\t);\n\t}\n\n\tconst data = await (dialog.open({\n\t\tmessage: layout!.$element,\n\t\tactions: [\n\t\t\t{action: 'reject', label: mw.msg('ooui-dialog-message-reject')},\n\t\t\t{action: 'accept', label: mw.msg('ooui-dialog-message-accept'), flags: 'progressive'},\n\t\t],\n\t\tsize: 'medium',\n\t}).closing as unknown as Promise<{action?: unknown} | undefined>);\n\tif (typeof data === 'object' && data.action === 'accept') {\n\t\t// \u7F29\u8FDB\n\t\tconst oldIndent = indent,\n\t\t\tsave = prefs.has('save');\n\t\tindent = indentWidget.getValue(); // eslint-disable-line require-atomic-updates\n\t\tlet changed = indent !== oldIndent;\n\t\tif (changed) {\n\t\t\tfor (const cm of editors) {\n\t\t\t\tcm?.setIndent(indent || '\\t');\n\t\t\t}\n\t\t\tlocalStorage.setItem(indentKey, indent);\n\t\t}\n\n\t\t// WikiLint\n\t\tfor (const [rule, dropdown] of wikilintWidgets) {\n\t\t\tconst val = dropdown.getValue() as RuleState;\n\t\t\tchanged ||= val !== wikilintConfig[rule];\n\t\t\twikilintConfig[rule] = val;\n\t\t}\n\t\tsetObject(wikilintKey, wikilintConfig);\n\n\t\t// ESLint & Stylelint\n\t\tconst jsonErrors: string[] = [];\n\t\tfor (const key of codeKeys) {\n\t\t\ttry {\n\t\t\t\tconst config = JSON.parse(widgets[key]!.getValue().trim() || 'null');\n\t\t\t\tchanged ||= JSON.stringify(config) !== JSON.stringify(codeConfigs.get(key));\n\t\t\t\tcodeConfigs.set(key, config);\n\t\t\t\tsetObject(`codemirror-mediawiki-${key}`, config);\n\t\t\t} catch {\n\t\t\t\tjsonErrors.push(key);\n\t\t\t}\n\t\t}\n\t\tif (jsonErrors.length > 0) {\n\t\t\tvoid OO.ui.alert(msg('json-error', jsonErrors.join(msg('and'))));\n\t\t}\n\n\t\t// \u63D2\u4EF6\n\t\tconst value = widget.getValue() as unknown as string[];\n\t\tif (value.length !== prefs.size || !value.every(option => prefs.has(option))) {\n\t\t\tchanged = true;\n\t\t\tprefs.clear();\n\t\t\tfor (const option of value) {\n\t\t\t\tprefs.add(option);\n\t\t\t}\n\t\t\tfor (const cm of editors) {\n\t\t\t\tcm?.prefer(value);\n\t\t\t}\n\t\t\tsetObject(storageKey, value);\n\t\t}\n\n\t\t// \u4FDD\u5B58\u81F3\u7528\u6237\u5B50\u9875\u9762\n\t\tif (changed && user && (save || prefs.has('save'))) {\n\t\t\tconst params: ApiEditPageParams = {\n\t\t\t\taction: 'edit',\n\t\t\t\ttitle: userPage!,\n\t\t\t\ttext: JSON.stringify({\n\t\t\t\t\taddons: [...prefs],\n\t\t\t\t\tindent,\n\t\t\t\t\twikilint: wikilintConfig,\n\t\t\t\t\tESLint: codeConfigs.get('ESLint'),\n\t\t\t\t\tStylelint: codeConfigs.get('Stylelint'),\n\t\t\t\t} as Preferences),\n\t\t\t\tsummary: msg('save-summary'),\n\t\t\t};\n\t\t\t// eslint-disable-next-line promise/prefer-await-to-then\n\t\t\t(await api)!.postWithToken('csrf', params as Record<string, string>).then(\n\t\t\t\t() => {\n\t\t\t\t\tvoid mw.notify(parseMsg('save-success'), {type: 'success'});\n\t\t\t\t},\n\t\t\t\tapiErr,\n\t\t\t);\n\t\t}\n\t}\n};\n", "/**\n * \u6DFB\u52A0WikiEditor\u5DE5\u5177\u680F\n * @param $textarea \u6587\u672C\u6846\n */\nexport const wikiEditor = async ($textarea: JQuery<HTMLTextAreaElement>): Promise<void> => {\n\tif (!mw.loader.getState('ext.wikiEditor')) {\n\t\tthrow new Error('no-wikiEditor');\n\t}\n\tawait mw.loader.using('ext.wikiEditor');\n\tif ($textarea.data('wikiEditorContext')) {\n\t\treturn;\n\t} else if (typeof mw.addWikiEditor === 'function') { // MW >= 1.34\n\t\tmw.addWikiEditor($textarea);\n\t} else { // MW <= 1.33\n\t\tconst {wikiEditor: {modules: {dialogs: {config}}}} = $;\n\t\t$textarea.wikiEditor('addModule', {\n\t\t\t...$.wikiEditor.modules.toolbar.config.getDefaultConfig(),\n\t\t\t...config.getDefaultConfig(),\n\t\t});\n\t\tconfig.replaceIcons($textarea);\n\t}\n\tawait new Promise(resolve => { // MW >= 1.21\n\t\t$textarea.on('wikiEditor-toolbar-doneInitialSections', resolve);\n\t});\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["CodeMirror6", "CDN", "getObject", "key", "setObject", "value", "ALL_SETTINGS_CACHE", "getObject", "SITE_ID", "SITE_SETTINGS", "VALID", "getConfig", "magicWords", "rule", "flip", "words", "i", "aliases", "name", "alias", "obj", "getConfigPair", "bool", "setConfig", "config", "getMwConfig", "isIPE", "nsid", "variants", "magicwords", "extensiontags", "functionhooks", "variables", "others", "insensitive", "tag", "functions", "code", "setObject", "getParserConfig", "minConfig", "mwConfig", "s", "key", "val", "REPO_CDN", "curVersion", "vendor", "userAgent", "maxTouchPoints", "platform", "isMac", "storageKey", "languages", "lang", "i18n", "getObject", "version", "setI18N", "CDN", "setObject", "e", "msg", "k", "v", "key", "args", "blankTarget", "$dom", "parseMsg", "text", "message", "parseVersion", "v", "notify", "key", "args", "$p", "blankTarget", "msg", "welcome", "baseVersion", "addons", "notification", "version", "baseMajor", "baseMinor", "major", "minor", "curVersion", "addon", "parseMsg", "e", "localize", "cm", "obj", "k", "i18n", "modKey", "isMac", "handlers", "getName", "node", "search", "dir", "name", "getHandler", "cm", "handler", "e", "view", "state", "page", "ns", "prev", "next", "openLinks", "on", "contentDOM", "instances", "getInstance", "$ele", "textSelection", "content", "state", "from", "to", "start", "end", "value", "view", "pre", "peri", "post", "ownline", "replace", "selectPeri", "splitlines", "selectionStart", "selectionEnd", "handleOwnline", "text", "insertText", "CodeMirror", "_", "isSample", "selText", "line", "head", "option", "monacoTextSelection", "model", "editor", "startLineNumber", "startColumn", "endLineNumber", "endColumn", "selection", "rules", "storageKey", "wikilintKey", "codeKeys", "user", "userPage", "indentKey", "prefs", "getObject", "storageKey", "wikilintConfig", "wikilintKey", "codeConfigs", "codeKeys", "k", "dialog", "layout", "widget", "indentWidget", "indent", "widgets", "wikilintWidgets", "apiErr", "code", "e", "message", "html", "api", "user", "loadJSON", "params", "userPage", "res", "_a", "page", "json", "option", "key", "openPreference", "editors", "windowManager", "panelMain", "msg", "panelWikilint", "panels", "c", "codeField", "panel", "active", "textarea", "instances", "editor", "CodeMirror", "i18n", "parseMsg", "field", "indentField", "rules", "rule", "state", "dropdown", "f", "data", "oldIndent", "save", "changed", "cm", "val", "setObject", "jsonErrors", "config", "value", "wikiEditor", "$textarea", "config", "resolve", "baseVersion", "addons", "CDN", "REPO_CDN", "elem", "cm", "instances", "value", "linters", "langMap", "monacoLangs", "isEditor", "textarea", "_visible", "_container", "_model", "_editor", "_init", "_indentStr", "_initMonaco", "initMonaco_fn", "_refresh", "refresh_fn", "_CodeMirror", "CodeMirror6", "lang", "ns", "config", "isCM", "_a", "_b", "__privateAdd", "__privateSet", "__privateMethod", "monacoTextSelection", "scrollTop", "__privateGet", "show", "textSelection", "content", "indent", "tab", "opt", "linter", "on", "optOrNs", "eslint", "codeConfigs", "stylelint", "i18n", "mwConfig", "minConfig", "getMwConfig", "getParserConfig", "doc", "rule", "severity", "wikilintConfig", "extensions", "hasExtension", "ext", "hasLint", "openLinks", "prefs", "wikiEditor", "e", "msg", "wgAction", "wgNamespaceNumber", "wgPageContentModel", "isWiki", "parserConfig", "loadJSON", "indentKey", "cmLang", "timer", "offsetHeight", "height", "curVersion", "CodeMirror", "portletContainer", "setI18N", "localize", "textareas", "openPreference", "welcome"]
7
7
  }
package/dist/plugins.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import type { Extension } from '@codemirror/state';
2
- export { css as cssLR } from '@codemirror/lang-css';
3
2
  export { json as jsonLR } from '@codemirror/lang-json';
4
3
  export { css } from '@codemirror/legacy-modes/mode/css';
5
4
  export { javascript } from '@codemirror/legacy-modes/mode/javascript';
6
5
  export { lua } from '@codemirror/legacy-modes/mode/lua';
7
6
  export declare const javascriptLR: () => Extension;
7
+ export declare const cssLR: () => Extension;
package/i18n/en.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2.11.1",
2
+ "version": "2.11.3",
3
3
  "lang": "en",
4
4
  "i18n-failed": "Failed to fetch the translation file in $1.",
5
5
  "title": "CodeMirror Addons",
package/i18n/zh-hans.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2.11.1",
2
+ "version": "2.11.3",
3
3
  "lang": "zh-hans",
4
4
  "i18n-failed": "获取 $1 的语言文件失败。",
5
5
  "title": "CodeMirror插件",
package/i18n/zh-hant.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2.11.1",
2
+ "version": "2.11.3",
3
3
  "lang": "zh-hant",
4
4
  "i18n-failed": "取得 $1 的語言檔案失敗。",
5
5
  "title": "CodeMirror外掛程式",