@bhsd/codemirror-mediawiki 2.4.1 → 2.4.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,2 +1,2 @@
1
- import{CodeMirror6 as le,CDN as Z}from"https://testingcf.jsdelivr.net/npm/@bhsd/codemirror-mediawiki@2.4.1/dist/main.min.js";var I=mw.loader.getState("ext.CodeMirror")!==null,te=mw.loader.getState("ext.CodeMirror.data")?"ext.CodeMirror.data":"ext.CodeMirror",L=JSON.parse(localStorage.getItem("InPageEditMwConfig"))||{},J=`${mw.config.get("wgServerName")}${mw.config.get("wgScriptPath")}`,h=L[J],z=Number(h==null?void 0:h.time)>Date.now()-86400*1e3*30,C=(t,e,i)=>{let n=t.filter(e).filter(({"case-sensitive":s})=>s!==i).flatMap(({aliases:s,name:r,"case-sensitive":l})=>s.map(c=>({alias:(l?c:c.toLowerCase()).replace(/:$/u,""),name:r}))),o={};for(let{alias:s,name:r}of n)o[s]=r;return o},j=(t,e)=>[!0,!1].map(i=>C(t,e,i)),H=t=>{mw.config.set("extCodeMirrorConfig",t)},E=async()=>{I&&!z&&await mw.loader.using(te);let t=mw.config.get("extCodeMirrorConfig");!t&&z&&({config:t}=h,H(t));let e=t&&Object.values(t.functionSynonyms[0]).includes(!0);if(t!=null&&t.img&&t.variants&&!e)return{...t,nsid:mw.config.get("wgNamespaceIds")};await mw.loader.using("mediawiki.api");let{query:{general:{variants:i},magicwords:n,extensiontags:o,functionhooks:s,variables:r}}=await new mw.Api().get({meta:"siteinfo",siprop:["general","magicwords",...t&&!e?[]:["extensiontags","functionhooks","variables"]],formatversion:"2"}),l=new Set(["msg","raw","msgnw","subst","safesubst"]);if(t&&!e){let{functionSynonyms:[c]}=t;"subst"in c||Object.assign(c,C(n,({name:g})=>l.has(g)))}else{t={tagModes:{tab:"text/mediawiki",indicator:"text/mediawiki",poem:"text/mediawiki",ref:"text/mediawiki",option:"text/mediawiki",combooption:"text/mediawiki",tabs:"text/mediawiki",poll:"text/mediawiki",gallery:"text/mediawiki"},tags:{},urlProtocols:mw.config.get("wgUrlProtocols")};for(let g of o)t.tags[g.slice(1,-1)]=!0;let c=new Set([...s,...r,...l]);t.functionSynonyms=j(n,({name:g})=>c.has(g)),t.doubleUnderscore=j(n,({aliases:g})=>g.some(ee=>/^__.+__$/u.test(ee)))}return t.img=C(n,({name:c})=>c.startsWith("img_")),t.variants=i?i.map(({code:c})=>c):[],t.nsid=mw.config.get("wgNamespaceIds"),H(t),L[J]={config:t,time:Date.now()},localStorage.setItem("InPageEditMwConfig",JSON.stringify(L)),t},W=(t,e)=>{let i={...t,ext:Object.keys(e.tags),namespaces:mw.config.get("wgFormattedNamespaces"),nsid:e.nsid,doubleUnderscore:e.doubleUnderscore.map(n=>Object.keys(n).map(o=>o.slice(2,-2))),variants:e.variants,protocol:e.urlProtocols.replace(/\\:/gu,":")};if([i.parserFunction[0]]=e.functionSynonyms,!I)for(let[n,o]of Object.entries(e.functionSynonyms[0]))n.startsWith("#")||(i.parserFunction[0][`#${n}`]=o);i.parserFunction[1]=[...Object.keys(e.functionSynonyms[1]),"="];for(let n of Object.keys(e.img))i.img[n]=e.img[n].slice(4);return i};var w="npm/@bhsd/codemirror-mediawiki@2.4.1",{vendor:ie,userAgent:ne,maxTouchPoints:oe,platform:se}=navigator,A=ie.includes("Apple Computer")&&(ne.includes("Mobile/")||oe>2)||se.includes("Mac"),N="codemirror-mediawiki-i18n",re={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"},S=re[mw.config.get("wgUserLanguage")]||"en",d=JSON.parse(localStorage.getItem(N))||{},{version:O}=d,Q=w.slice(w.lastIndexOf("@")+1),_=async t=>{if(d.lang!==S||O!==Q)try{Object.assign(d,await(await fetch(`${t}/${w}/i18n/${S}.json`)).json()),localStorage.setItem(N,JSON.stringify(d))}catch(e){mw.notify(a("i18n-failed",S),{type:"error"}),console.error(e)}for(let[e,i]of Object.entries(d))e.endsWith("-mac")?A&&mw.messages.set(`cm-mw-${e.slice(0,-4)}`,i):mw.messages.set(`cm-mw-${e}`,i)},a=(t,...e)=>mw.msg(`cm-mw-${t}`,...e),R=t=>t.split(".",2).map(Number),D=async(t,...e)=>{let i=$("<p>",{html:a(t,...e)});return await mw.notify(i,{type:"success",autoHideSeconds:"long"}),i},V=async(t,e)=>{let i;if(!O)i=await D("welcome");else if(e.length>0){let[n,o]=R(t),[s,r]=R(O);(s<n||s===n&&r<o)&&(i=await D("welcome-addons",Q,String(e.length),e.map(l=>`<li>${a(`addon-${l}`)}</li>`).join("")))}i==null||i.find("#settings").click(n=>{n.preventDefault(),document.getElementById("cm-settings").dispatchEvent(new MouseEvent("click"))})},F=t=>{let e={};for(let[i,n]of Object.entries(d))i.startsWith("phrase-")&&(e[i.slice(7).replace(/-/gu," ")]=n);t.localize(e)};var ae=A?"metaKey":"ctrlKey",y=".cm-mw-template-name, .cm-mw-link-pagename",U=function(t){if(!t[ae])return;t.preventDefault();let e=this.textContent,{previousSibling:i,nextSibling:n}=this;for(;i&&(i.nodeType===Node.TEXT_NODE||i.matches(y));)e=i.textContent+e,{previousSibling:i}=i;for(;n&&(n.nodeType===Node.TEXT_NODE||n.matches(y));)e+=n.textContent,{nextSibling:n}=n;e=e.trim(),e.startsWith("/")&&(e=`:${mw.config.get("wgPageName")}${e}`),open(new mw.Title(e,this.classList.contains("cm-mw-template-name")?10:0).getUrl(void 0),"_blank")},K=(t,e)=>{e?(mw.loader.load("mediawiki.Title"),$(t).on("click",y,U).css("--codemirror-cursor","pointer")):e===!1&&$(t).off("click",y,U).css("--codemirror-cursor","")};var u=new WeakMap,m=t=>u.get(t[0]);function ce(t){let{view:{state:{selection:{main:e}}}}=m(this);return t!=null&&t.startAndEnd?[e.from,e.to]:e.head}var P={getContents(){return m(this).view.state.doc.toString()},setContents(t){return m(this).setContent(t),this},getSelection(){let{view:{state:t}}=m(this);return t.sliceDoc(t.selection.main.from,t.selection.main.to)},setSelection({start:t,end:e}){let{view:i}=m(this);return i.dispatch({selection:{anchor:t,head:e!=null?e:t}}),i.focus(),this},replaceSelection(t){let{view:e}=m(this);return e.dispatch(e.state.replaceSelection(t)),this},getCaretPosition:ce,scrollToCaretPosition(){return m(this).view.dispatch({scrollIntoView:!0}),this}};var B="codemirror-mediawiki-addons",v="codemirror-mediawiki-indent",f=new Set(JSON.parse(localStorage.getItem(B))),b,M,x,q,X,p=localStorage.getItem(v)||"",G=async t=>{if(await mw.loader.using(["oojs-ui-windows","oojs-ui.styles.icons-content"]),b)M.setValue([...f]),x.setValue(p);else{b=new OO.ui.MessageDialog;let i=new OO.ui.WindowManager;i.$element.appendTo(document.body),i.addWindows([b]),M=new OO.ui.CheckboxMultiselectInputWidget({options:Object.keys(d).filter(n=>n!=="addon-indent"&&n.startsWith("addon-")&&!n.endsWith("-mac")).map(n=>({data:n.slice(6),label:$($.parseHTML(a(n)))})),value:[...f]}),q=new OO.ui.FieldLayout(M,{label:a("label"),align:"top"}),x=new OO.ui.TextInputWidget({value:p,placeholder:"\\t"}),X=new OO.ui.FieldLayout(x,{label:a("addon-indent")})}let e=await b.open({title:a("title"),message:q.$element.add(X.$element).add($("<p>",{html:a("feedback")})),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 e=="object"&&e.action==="accept"){let i=M.getValue();p=x.getValue(),f.clear();for(let n of i)f.add(n);for(let n of t)n==null||n.prefer(i),n==null||n.setIndent(p||" ");localStorage.setItem(B,JSON.stringify(i)),localStorage.setItem(v,p)}};var de="2.4",ge=["tagMatching"];mw.loader.load(`${Z}/${w}/mediawiki.min.css`,"text/css");$.valHooks.textarea={get(t){let e=u.get(t);return e!=null&&e.visible?e.view.state.doc.toString():t.value},set(t,e){let i=u.get(t);i!=null&&i.visible?i.setContent(e):t.value=e}};var k={},T=class t extends le{constructor(e,i,n,o){super(e,i,o),this.ns=n,u.set(e,this),mw.loader.getState("jquery.textSelection")==="ready"&&$(e).data("jquery.textSelection",P),mw.hook("wiki-codemirror6").fire(this)}toggle(e=!this.visible){super.toggle(e),$(this.textarea).data("jquery.textSelection",e&&P)}async getLinter(e){let i=await super.getLinter(e);return k[this.lang]=i,i}async defaultLint(e,i=this.ns){if(!e){this.lint();return}let{lang:n}=this,o;if(typeof i=="number"?n==="mediawiki"&&(i===10||i===828||i===2)?o={include:!0}:n==="javascript"&&(i===8||i===2300)&&(o={env:{browser:!0,es6:!0},parserOptions:{ecmaVersion:6}}):o=i,n in k)o&&await this.getLinter(o);else{if(n==="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),n==="mediawiki"){let[s,r]=await Promise.all([E(),wikiparse.getConfig()]);wikiparse.setConfig(W(r,s))}}k[n]&&this.lint(k[n])}prefer(e){super.prefer(e);let i=Array.isArray(e)?o=>e.includes(o):o=>e[o],n=i("lint");n!==void 0&&this.defaultLint(n),K(this.view.contentDOM,i("openLinks"))}static async fromTextArea(e,i,n){let o=i==="mediawiki"||i==="html",s=new t(e,o?void 0:i,n),r=localStorage.getItem(v);if(o){let l=await E();s.setLanguage(i,l)}return s.prefer([...f]),r&&s.setIndent(r),s}},Y={"sanitized-css":"css",js:"javascript",scribunto:"lua",wikitext:"mediawiki"};document.body.addEventListener("click",t=>{t.target instanceof HTMLTextAreaElement&&t.shiftKey&&!u.has(t.target)&&(t.preventDefault(),(async()=>{var r;let{wgAction:e,wgNamespaceNumber:i,wgPageContentModel:n}=mw.config.get(),o,s;e==="edit"||e==="submit"?(s=i,o=i===274?"html":n.toLowerCase()):(await mw.loader.using("oojs-ui-windows"),o=(r=await OO.ui.prompt(a("contentmodel"))||void 0)==null?void 0:r.toLowerCase()),o&&o in Y&&(o=Y[o]),T.fromTextArea(t.target,o,s)})())});(async()=>{let t={minerva:"page-actions-overflow",moeskin:"ca-more-actions"};await Promise.all([mw.loader.using("mediawiki.util"),_(Z)]),mw.hook("wiki-codemirror6").add(F),mw.util.addPortletLink(t[mw.config.get("skin")]||"p-cactions","#",a("title"),"cm-settings").addEventListener("click",e=>{e.preventDefault();let i=[...document.querySelectorAll(".cm-editor + textarea")];G(i.map(n=>u.get(n)))}),V(de,ge)})();Object.assign(window,{CodeMirror6:T});export{T as CodeMirror};
1
+ import{CodeMirror6 as ge,CDN as te}from"https://testingcf.jsdelivr.net/npm/@bhsd/codemirror-mediawiki@2.4.3/dist/main.min.js";var W=mw.loader.getState("ext.CodeMirror")!==null,ie=mw.loader.getState("ext.CodeMirror.data")?"ext.CodeMirror.data":"ext.CodeMirror",E=JSON.parse(localStorage.getItem("InPageEditMwConfig")||"{}"),J=`${mw.config.get("wgServerName")}${mw.config.get("wgScriptPath")}`,y=E[J],j=Number(y==null?void 0:y.time)>Date.now()-86400*1e3*30,C=(e,t,i)=>{let n=e.filter(t).filter(({"case-sensitive":r})=>r!==i).flatMap(({aliases:r,name:s,"case-sensitive":d})=>r.map(a=>({alias:(d?a:a.toLowerCase()).replace(/:$/u,""),name:s}))),o={};for(let{alias:r,name:s}of n)o[r]=s;return o},I=(e,t)=>[!0,!1].map(i=>C(e,t,i)),H=e=>{mw.config.set("extCodeMirrorConfig",e)},T=async()=>{W&&!j&&await mw.loader.using(ie);let e=mw.config.get("extCodeMirrorConfig");!e&&j&&({config:e}=y,H(e));let t=e&&Object.values(e.functionSynonyms[0]).includes(!0);if(e!=null&&e.img&&e.variants&&!t)return{...e,nsid:mw.config.get("wgNamespaceIds")};await mw.loader.using("mediawiki.api");let{query:{general:{variants:i},magicwords:n,extensiontags:o,functionhooks:r,variables:s}}=await new mw.Api().get({meta:"siteinfo",siprop:["general","magicwords",...e&&!t?[]:["extensiontags","functionhooks","variables"]],formatversion:"2"}),d=new Set(["msg","raw","msgnw","subst","safesubst"]);if(e&&!t){let{functionSynonyms:[a]}=e;"subst"in a||Object.assign(a,C(n,({name:l})=>d.has(l)))}else{e={tagModes:{tab:"text/mediawiki",indicator:"text/mediawiki",poem:"text/mediawiki",ref:"text/mediawiki",option:"text/mediawiki",combooption:"text/mediawiki",tabs:"text/mediawiki",poll:"text/mediawiki",gallery:"text/mediawiki"},tags:{},urlProtocols:mw.config.get("wgUrlProtocols")};for(let l of o)e.tags[l.slice(1,-1)]=!0;let a=new Set([...r,...s,...d]);e.functionSynonyms=I(n,({name:l})=>a.has(l)),e.doubleUnderscore=I(n,({aliases:l})=>l.some(h=>/^__.+__$/u.test(h)))}return e.img=C(n,({name:a})=>a.startsWith("img_")),e.variants=i?i.map(({code:a})=>a):[],e.nsid=mw.config.get("wgNamespaceIds"),H(e),E[J]={config:e,time:Date.now()},localStorage.setItem("InPageEditMwConfig",JSON.stringify(E)),e},D=(e,t)=>{let i={...e,ext:Object.keys(t.tags),namespaces:mw.config.get("wgFormattedNamespaces"),nsid:t.nsid,doubleUnderscore:t.doubleUnderscore.map(n=>Object.keys(n).map(o=>o.slice(2,-2))),variants:t.variants,protocol:t.urlProtocols.replace(/\\:/gu,":")};if([i.parserFunction[0]]=t.functionSynonyms,!W)for(let[n,o]of Object.entries(t.functionSynonyms[0]))n.startsWith("#")||(i.parserFunction[0][`#${n}`]=o);i.parserFunction[1]=[...Object.keys(t.functionSynonyms[1]),"="];for(let n of Object.keys(t.img))i.img[n]=t.img[n].slice(4);return i};var w="npm/@bhsd/codemirror-mediawiki@2.4.3",{vendor:ne,userAgent:oe,maxTouchPoints:re,platform:se}=navigator,O=ne.includes("Apple Computer")&&(oe.includes("Mobile/")||re>2)||se.includes("Mac"),N="codemirror-mediawiki-i18n",ae={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"},S=ae[mw.config.get("wgUserLanguage")]||"en",m=JSON.parse(localStorage.getItem(N)||"{}"),{version:A}=m,_=w.slice(w.lastIndexOf("@")+1),V=async e=>{if(m.lang!==S||A!==_)try{Object.assign(m,await(await fetch(`${e}/${w}/i18n/${S}.json`)).json()),localStorage.setItem(N,JSON.stringify(m))}catch(t){mw.notify(c("i18n-failed",S),{type:"error"}),console.error(t)}for(let[t,i]of Object.entries(m))t.endsWith("-mac")?O&&mw.messages.set(`cm-mw-${t.slice(0,-4)}`,i):mw.messages.set(`cm-mw-${t}`,i)},c=(e,...t)=>mw.msg(`cm-mw-${e}`,...t),R=e=>e.split(".",2).map(Number),Q=async(e,...t)=>{let i=$("<p>",{html:c(e,...t)});return await mw.notify(i,{type:"success",autoHideSeconds:"long"}),i},F=async(e,t)=>{let i;if(!A)i=await Q("welcome");else if(t.length>0){let[n,o]=R(e),[r,s]=R(A);(r<n||r===n&&s<o)&&(i=await Q("welcome-addons",_,String(t.length),t.map(d=>`<li>${c(`addon-${d}`)}</li>`).join("")))}i==null||i.find("#settings").click(n=>{n.preventDefault(),document.getElementById("cm-settings").dispatchEvent(new MouseEvent("click"))})},U=e=>{let t={};for(let[i,n]of Object.entries(m))i.startsWith("phrase-")&&(t[i.slice(7).replace(/-/gu," ")]=n);e.localize(t)};var ce=O?"metaKey":"ctrlKey",de=/-template-name|-link-pagename/u,P=new WeakMap,K=e=>{if(P.has(e))return P.get(e);let t=i=>{var l,h;if(!i[ce])return;let{view:n}=e,o=e.getNodeAt(n.posAtCoords(i));if(!o||!de.test(o.name))return;i.preventDefault();let{name:r}=o,s=o,d=o;for(;((l=s.prevSibling)==null?void 0:l.name)===r;)s=s.prevSibling;for(;((h=d.nextSibling)==null?void 0:h.name)===r;)d=d.nextSibling;let a=n.state.sliceDoc(s.from,d.to).trim();a.startsWith("/")&&(a=`:${mw.config.get("wgPageName")}${a}`),open(new mw.Title(a,r.includes("-template-name")?10:0).getUrl(void 0),"_blank")};return P.set(e,t),t},q=(e,t)=>{let{view:{contentDOM:i}}=e;t?(mw.loader.load("mediawiki.Title"),i.addEventListener("click",K(e)),i.style.setProperty("--codemirror-cursor","pointer")):t===!1&&(i.removeEventListener("click",K(e)),i.style.removeProperty("--codemirror-cursor"))};var f=new WeakMap,u=e=>f.get(e[0]);function le(e){let{view:{state:{selection:{main:t}}}}=u(this);return e!=null&&e.startAndEnd?[t.from,t.to]:t.head}var z={getContents(){return u(this).view.state.doc.toString()},setContents(e){return u(this).setContent(e),this},getSelection(){let{view:{state:e}}=u(this);return e.sliceDoc(e.selection.main.from,e.selection.main.to)},setSelection({start:e,end:t}){let{view:i}=u(this);return i.dispatch({selection:{anchor:e,head:t!=null?t:e}}),i.focus(),this},replaceSelection(e){let{view:t}=u(this);return t.dispatch(t.state.replaceSelection(e)),this},getCaretPosition:le,scrollToCaretPosition(){return u(this).view.dispatch({scrollIntoView:!0}),this}};var X="codemirror-mediawiki-addons",M="codemirror-mediawiki-indent",g=new Set(JSON.parse(String(localStorage.getItem(X)))),b,k,v,B,G,p=localStorage.getItem(M)||"",Y=async e=>{if(await mw.loader.using(["oojs-ui-windows","oojs-ui.styles.icons-content"]),b)k.setValue([...g]),v.setValue(p);else{b=new OO.ui.MessageDialog;let i=new OO.ui.WindowManager;i.$element.appendTo(document.body),i.addWindows([b]),k=new OO.ui.CheckboxMultiselectInputWidget({options:Object.keys(m).filter(n=>n!=="addon-indent"&&n.startsWith("addon-")&&!n.endsWith("-mac")).map(n=>({data:n.slice(6),label:$($.parseHTML(c(n))),disabled:n==="addon-wikiEditor"&&!mw.loader.getState("ext.wikiEditor")})),value:[...g]}),B=new OO.ui.FieldLayout(k,{label:c("label"),align:"top"}),v=new OO.ui.TextInputWidget({value:p,placeholder:"\\t"}),G=new OO.ui.FieldLayout(v,{label:c("addon-indent")})}let t=await b.open({title:c("title"),message:B.$element.add(G.$element).add($("<p>",{html:c("feedback")})),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 t=="object"&&t.action==="accept"){let i=k.getValue();p=v.getValue(),g.clear();for(let n of i)g.add(n);for(let n of e)n==null||n.prefer(i),n==null||n.setIndent(p||" ");localStorage.setItem(X,JSON.stringify(i)),localStorage.setItem(M,p)}};var Z=async e=>{if(mw.loader.getState("ext.wikiEditor")){if(e.data("wikiEditorContext"))return}else{g.delete("wikiEditor"),mw.notify(c("no-wikiEditor"),{type:"error"});return}if(await mw.loader.using("ext.wikiEditor"),typeof mw.addWikiEditor=="function")mw.addWikiEditor(e);else{let{wikiEditor:{modules:{dialogs:{config:t}}}}=$;e.wikiEditor("addModule",{...$.wikiEditor.modules.toolbar.config.getDefaultConfig(),...t.getDefaultConfig()}),t.replaceIcons(e)}await new Promise(t=>{e.on("wikiEditor-toolbar-doneInitialSections",t)})};var me="2.4",ue=["tagMatching"];mw.loader.load(`${te}/${w}/mediawiki.min.css`,"text/css");$.valHooks.textarea={get(e){let t=f.get(e);return t!=null&&t.visible?t.view.state.doc.toString():e.value},set(e,t){let i=f.get(e);i!=null&&i.visible?i.setContent(t):e.value=t}};var x={},L=class e extends ge{constructor(t,i,n,o){super(t,i,o),this.ns=n,f.set(t,this),mw.loader.getState("jquery.textSelection")==="ready"&&$(t).data("jquery.textSelection",z),mw.hook("wiki-codemirror6").fire(this)}toggle(t=!this.visible){super.toggle(t),$(this.textarea).data("jquery.textSelection",t&&z)}async getLinter(t){let i=await super.getLinter(t);return x[this.lang]=i,i}async defaultLint(t,i=this.ns){if(!t){this.lint();return}let{lang:n}=this,o;if(typeof i=="number"?n==="mediawiki"&&(i===10||i===828||i===2)?o={include:!0}:n==="javascript"&&(i===8||i===2300)&&(o={env:{browser:!0,es6:!0},parserOptions:{ecmaVersion:6}}):o=i,n in x)o&&await this.getLinter(o);else{if(n==="mediawiki"){let r=mw.config.get("wgUserLanguage");["zh","zh-hans","zh-cn","zh-sg","zh-my"].includes(r)?o={...o,i18n:"zh-hans"}:["zh-hant","zh-tw","zh-hk","zh-mo"].includes(r)&&(o={...o,i18n:"zh-hant"})}if(await this.getLinter(o),n==="mediawiki"){let[r,s]=await Promise.all([T(),wikiparse.getConfig()]);wikiparse.setConfig(D(s,r))}}x[n]&&this.lint(x[n])}prefer(t){super.prefer(t);let i=Array.isArray(t)?o=>t.includes(o):o=>t[o],n=i("lint");n!==void 0&&this.defaultLint(n),q(this,i("openLinks"))}static async fromTextArea(t,i,n){g.has("wikiEditor")&&await Z($(t));let o=i==="mediawiki"||i==="html",r=new e(t,o?void 0:i,n),s=localStorage.getItem(M);if(o){let d=await T();r.setLanguage(i,d)}return r.prefer([...g]),s&&r.setIndent(s),r}},ee={"sanitized-css":"css",js:"javascript",scribunto:"lua",wikitext:"mediawiki"};document.body.addEventListener("click",e=>{e.target instanceof HTMLTextAreaElement&&e.shiftKey&&!f.has(e.target)&&(e.preventDefault(),(async()=>{var s;let{wgAction:t,wgNamespaceNumber:i,wgPageContentModel:n}=mw.config.get(),o,r;t==="edit"||t==="submit"?(r=i,o=i===274?"html":n.toLowerCase()):(await mw.loader.using("oojs-ui-windows"),o=(s=await OO.ui.prompt(c("contentmodel"))||void 0)==null?void 0:s.toLowerCase()),o&&o in ee&&(o=ee[o]),L.fromTextArea(e.target,o,r)})())});(async()=>{let e={minerva:"page-actions-overflow",moeskin:"ca-more-actions",citizen:"p-tb"};await Promise.all([mw.loader.using("mediawiki.util"),V(te)]),mw.hook("wiki-codemirror6").add(U),mw.util.addPortletLink(e[mw.config.get("skin")]||"p-cactions","#",c("title"),"cm-settings").addEventListener("click",t=>{t.preventDefault();let i=[...document.querySelectorAll(".cm-editor + textarea")];Y(i.map(n=>f.get(n)))}),F(me,ue)})();Object.assign(window,{CodeMirror6:L});export{L as CodeMirror};
2
2
  //# sourceMappingURL=mw.min.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../mw/base.ts", "../mw/config.ts", "../mw/msg.ts", "../mw/openLinks.ts", "../mw/textSelection.ts", "../mw/preference.ts"],
4
- "sourcesContent": ["import {CodeMirror6, CDN} from 'https://testingcf.jsdelivr.net/npm/@bhsd/codemirror-mediawiki@2.4.1/dist/main.min.js';\nimport {getMwConfig, getParserConfig} from './config';\nimport {openLinks} from './openLinks';\nimport {instances, textSelection} from './textSelection';\nimport {openPreference, prefs, indentKey} from './preference';\nimport {msg, setI18N, welcome, REPO_CDN, localize} from './msg';\nimport type {LintSource} from '../src/codemirror';\n\n// \u6BCF\u6B21\u65B0\u589E\u63D2\u4EF6\u90FD\u9700\u8981\u4FEE\u6539\u8FD9\u91CC\nconst baseVersion = '2.4',\n\taddons = ['tagMatching'];\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.view.state.doc.toString() : 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\nexport class CodeMirror extends CodeMirror6 {\n\tns;\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 */\n\tconstructor(textarea: HTMLTextAreaElement, lang?: string, ns?: number, config?: unknown) {\n\t\tsuper(textarea, lang, config);\n\t\tthis.ns = ns;\n\t\tinstances.set(textarea, this);\n\t\tif (mw.loader.getState('jquery.textSelection') === 'ready') {\n\t\t\t$(textarea).data('jquery.textSelection', textSelection);\n\t\t}\n\t\tmw.hook('wiki-codemirror6').fire(this);\n\t}\n\n\toverride toggle(show = !this.visible): void {\n\t\tsuper.toggle(show);\n\t\t$(this.textarea).data('jquery.textSelection', show && textSelection);\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\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' && (optOrNs === 8 || optOrNs === 2300)) {\n\t\t\t\topt = {\n\t\t\t\t\tenv: {browser: true, es6: true},\n\t\t\t\t\tparserOptions: {ecmaVersion: 6},\n\t\t\t\t};\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\tthis.lint(linters[lang]);\n\t\t}\n\t}\n\n\toverride prefer(extensions: string[] | Record<string, boolean>): void {\n\t\tsuper.prefer(extensions);\n\t\tconst hasExtension = Array.isArray(extensions)\n\t\t\t\t? (ext: string): boolean => extensions.includes(ext)\n\t\t\t\t: (ext: string): boolean | undefined => extensions[ext],\n\t\t\thasLint = hasExtension('lint');\n\t\tif (hasLint !== undefined) {\n\t\t\tvoid this.defaultLint(hasLint);\n\t\t}\n\t\topenLinks(this.view.contentDOM, hasExtension('openLinks'));\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\tconst isWiki = lang === 'mediawiki' || lang === 'html',\n\t\t\tcm = new CodeMirror(textarea, isWiki ? undefined : lang, ns),\n\t\t\tindent = localStorage.getItem(indentKey);\n\t\tif (isWiki) {\n\t\t\tconst config = await getMwConfig();\n\t\t\tcm.setLanguage(lang, config);\n\t\t}\n\t\tcm.prefer([...prefs]);\n\t\tif (indent) {\n\t\t\tcm.setIndent(indent);\n\t\t}\n\t\treturn cm;\n\t}\n}\n\nconst langMap: Record<string, string> = {\n\t'sanitized-css': 'css',\n\tjs: 'javascript',\n\tscribunto: 'lua',\n\twikitext: 'mediawiki',\n};\ndocument.body.addEventListener('click', e => {\n\tif (e.target instanceof HTMLTextAreaElement && e.shiftKey && !instances.has(e.target)) {\n\t\te.preventDefault();\n\t\t(async () => {\n\t\t\tconst {wgAction, wgNamespaceNumber, wgPageContentModel} = mw.config.get();\n\t\t\tlet lang: string | undefined,\n\t\t\t\tns: number | undefined;\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\tif (lang && lang in langMap) {\n\t\t\t\tlang = langMap[lang];\n\t\t\t}\n\t\t\tvoid CodeMirror.fromTextArea(e.target as HTMLTextAreaElement, lang, ns);\n\t\t})();\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};\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", "import type {Config} from 'wikilint';\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 USING_LOCAL = mw.loader.getState('ext.CodeMirror') !== null,\n\tDATA_MODULE = mw.loader.getState('ext.CodeMirror.data') ? 'ext.CodeMirror.data' : 'ext.CodeMirror',\n\tALL_SETTINGS_CACHE: Record<string, {time: number, config: MwConfig}>\n\t\t= JSON.parse(localStorage.getItem('InPageEditMwConfig')!) || {},\n\tSITE_ID = `${mw.config.get('wgServerName')}${mw.config.get('wgScriptPath')}`,\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 (USING_LOCAL && !VALID) { // \u53EA\u5728localStorage\u8FC7\u671F\u65F6\u624D\u4F1A\u91CD\u65B0\u52A0\u8F7Dext.CodeMirror.data\n\t\tawait mw.loader.using(DATA_MODULE);\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// \u60C5\u5F621\uFF1Aconfig\u5DF2\u66F4\u65B0\uFF0C\u53EF\u80FD\u6765\u81EAlocalStorage\n\tif (config?.img && config.variants && !isIPE) {\n\t\treturn {\n\t\t\t...config,\n\t\t\tnsid: mw.config.get('wgNamespaceIds'),\n\t\t};\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\t\ttab: 'text/mediawiki',\n\t\t\t\tindicator: 'text/mediawiki',\n\t\t\t\tpoem: 'text/mediawiki',\n\t\t\t\tref: 'text/mediawiki',\n\t\t\t\toption: 'text/mediawiki',\n\t\t\t\tcombooption: 'text/mediawiki',\n\t\t\t\ttabs: 'text/mediawiki',\n\t\t\t\tpoll: 'text/mediawiki',\n\t\t\t\tgallery: 'text/mediawiki',\n\t\t\t},\n\t\t\ttags: {},\n\t\t\turlProtocols: mw.config.get('wgUrlProtocols'),\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}\n\tconfig!.img = getConfig(magicwords, ({name}) => name.startsWith('img_'));\n\tconfig!.variants = variants ? variants.map(({code}) => code) : [];\n\tconfig!.nsid = mw.config.get('wgNamespaceIds');\n\tsetConfig(config!);\n\tALL_SETTINGS_CACHE[SITE_ID] = {config: config!, time: Date.now()};\n\tlocalStorage.setItem('InPageEditMwConfig', JSON.stringify(ALL_SETTINGS_CACHE));\n\treturn config!;\n};\n\n/**\n * \u5C06MwConfig\u8F6C\u6362\u4E3AConfig\n * @param minConfig \u57FA\u7840Config\n * @param mwConfig MwConfig\n */\nexport const getParserConfig = (minConfig: Config, mwConfig: MwConfig): Config => {\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.replace(/\\\\:/gu, ':'),\n\t};\n\t[config.parserFunction[0]] = mwConfig.functionSynonyms;\n\tif (!USING_LOCAL) {\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 of Object.keys(mwConfig.img!)) {\n\t\tconfig.img[key] = mwConfig.img![key]!.slice(4);\n\t}\n\treturn config;\n};\n", "import type {CodeMirror} from './base';\n\nexport const REPO_CDN = 'npm/@bhsd/codemirror-mediawiki@2.4.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> = JSON.parse(localStorage.getItem(storageKey)!) || {};\n\nconst {version} = i18n,\n\tcurVersion = REPO_CDN.slice(REPO_CDN.lastIndexOf('@') + 1);\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\tlocalStorage.setItem(storageKey, JSON.stringify(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 * \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 = $('<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>${msg(`addon-${addon}`)}</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 \u7F16\u8F91\u5668\u5B9E\u4F8B\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';\n\nconst modKey = isMac ? 'metaKey' : 'ctrlKey',\n\tpageSelector = '.cm-mw-template-name, .cm-mw-link-pagename';\n\n/**\n * \u70B9\u51FB\u65F6\u5728\u65B0\u9875\u9762\u6253\u5F00\u94FE\u63A5\u3001\u6A21\u677F\u7B49\n * @param e \u70B9\u51FB\u4E8B\u4EF6\n */\nconst handler = function(this: HTMLElement, e: JQuery.ClickEvent): void {\n\tif (!e[modKey]) {\n\t\treturn;\n\t}\n\te.preventDefault();\n\tlet page = this.textContent!,\n\t\t{previousSibling, nextSibling} = this;\n\twhile (\n\t\tpreviousSibling\n\t\t&& (previousSibling.nodeType === Node.TEXT_NODE || (previousSibling as Element).matches(pageSelector))\n\t) {\n\t\tpage = previousSibling.textContent! + page;\n\t\t({previousSibling} = previousSibling);\n\t}\n\twhile (\n\t\tnextSibling\n\t\t&& (nextSibling.nodeType === Node.TEXT_NODE || (nextSibling as Element).matches(pageSelector))\n\t) {\n\t\tpage += nextSibling.textContent!;\n\t\t({nextSibling} = nextSibling);\n\t}\n\tpage = page.trim();\n\tif (page.startsWith('/')) {\n\t\tpage = `:${mw.config.get('wgPageName')}${page}`;\n\t}\n\topen(new mw.Title(page, this.classList.contains('cm-mw-template-name') ? 10 : 0).getUrl(undefined), '_blank');\n};\n\n/**\n * \u6DFB\u52A0\u6216\u79FB\u9664\u6253\u5F00\u94FE\u63A5\u7684\u4E8B\u4EF6\n * @param ele \u7F16\u8F91\u5668DOM\n * @param on \u662F\u5426\u6DFB\u52A0\n */\nexport const openLinks = (ele: HTMLElement, on?: boolean): void => {\n\tif (on) {\n\t\tmw.loader.load('mediawiki.Title');\n\t\t$(ele).on('click', pageSelector, handler).css('--codemirror-cursor', 'pointer');\n\t} else if (on === false) {\n\t\t$(ele).off('click', pageSelector, handler).css('--codemirror-cursor', '');\n\t}\n};\n", "import type {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\nfunction getCaretPosition(this: JQuery<HTMLTextAreaElement>, option: {startAndEnd: true}): [number, number];\nfunction getCaretPosition(this: JQuery<HTMLTextAreaElement>, option?: {startAndEnd?: false}): number;\nfunction getCaretPosition(\n\tthis: JQuery<HTMLTextAreaElement>,\n\toption?: {startAndEnd?: boolean},\n): [number, number] | number {\n\tconst {view: {state: {selection: {main}}}} = getInstance(this);\n\treturn option?.startAndEnd ? [main.from, main.to] : main.head;\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 {view: {state}} = getInstance(this);\n\t\treturn state.sliceDoc(state.selection.main.from, state.selection.main.to);\n\t},\n\tsetSelection(\n\t\tthis: JQuery<HTMLTextAreaElement>,\n\t\t{start, end}: {start: number, end?: number},\n\t): JQuery<HTMLTextAreaElement> {\n\t\tconst {view} = getInstance(this);\n\t\tview.dispatch({\n\t\t\tselection: {anchor: start, head: end ?? start},\n\t\t});\n\t\tview.focus();\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\tgetCaretPosition,\n\tscrollToCaretPosition(this: JQuery<HTMLTextAreaElement>): JQuery<HTMLTextAreaElement> {\n\t\tgetInstance(this).view.dispatch({scrollIntoView: true});\n\t\treturn this;\n\t},\n};\n", "import {msg, i18n} from './msg';\nimport type {CodeMirror} from './base';\n\nconst storageKey = 'codemirror-mediawiki-addons';\nexport const indentKey = 'codemirror-mediawiki-indent',\n\tprefs = new Set<string>(JSON.parse(localStorage.getItem(storageKey)!) as string[] | null);\n\n// OOUI\u7EC4\u4EF6\nlet dialog: OO.ui.MessageDialog | undefined,\n\twidget: OO.ui.CheckboxMultiselectInputWidget,\n\tindentWidget: OO.ui.TextInputWidget,\n\tfield: OO.ui.FieldLayout,\n\tindentField: OO.ui.FieldLayout,\n\tindent = localStorage.getItem(indentKey) || '';\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(['oojs-ui-windows', 'oojs-ui.styles.icons-content']);\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();\n\t\tconst windowManager = new OO.ui.WindowManager();\n\t\twindowManager.$element.appendTo(document.body);\n\t\twindowManager.addWindows([dialog]);\n\t\twidget = new OO.ui.CheckboxMultiselectInputWidget({\n\t\t\toptions: Object.keys(i18n)\n\t\t\t\t.filter(k => k !== 'addon-indent' && k.startsWith('addon-') && !k.endsWith('-mac'))\n\t\t\t\t.map(k => ({data: k.slice(6), label: $($.parseHTML(msg(k)))})),\n\t\t\tvalue: [...prefs] as unknown as string,\n\t\t});\n\t\tfield = new OO.ui.FieldLayout(widget, {\n\t\t\tlabel: msg('label'),\n\t\t\talign: 'top',\n\t\t});\n\t\tindentWidget = new OO.ui.TextInputWidget({value: indent, placeholder: '\\\\t'});\n\t\tindentField = new OO.ui.FieldLayout(indentWidget, {label: msg('addon-indent')});\n\t}\n\n\tconst data = await (dialog.open({\n\t\ttitle: msg('title'),\n\t\tmessage: field.$element.add(indentField.$element).add($('<p>', {html: msg('feedback')})),\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\tconst value = widget.getValue() as unknown as string[];\n\t\tindent = indentWidget.getValue(); // eslint-disable-line require-atomic-updates\n\t\tprefs.clear();\n\t\tfor (const option of value) {\n\t\t\tprefs.add(option);\n\t\t}\n\t\tfor (const cm of editors) {\n\t\t\tcm?.prefer(value);\n\t\t\tcm?.setIndent(indent || '\\t');\n\t\t}\n\t\tlocalStorage.setItem(storageKey, JSON.stringify(value));\n\t\tlocalStorage.setItem(indentKey, indent);\n\t}\n};\n"],
5
- "mappings": "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",
6
- "names": ["CodeMirror6", "CDN", "USING_LOCAL", "DATA_MODULE", "ALL_SETTINGS_CACHE", "SITE_ID", "SITE_SETTINGS", "VALID", "getConfig", "magicWords", "rule", "flip", "words", "i", "aliases", "name", "alias", "obj", "getConfigPair", "bool", "setConfig", "config", "getMwConfig", "isIPE", "variants", "magicwords", "extensiontags", "functionhooks", "variables", "others", "insensitive", "tag", "functions", "code", "getParserConfig", "minConfig", "mwConfig", "s", "key", "val", "REPO_CDN", "vendor", "userAgent", "maxTouchPoints", "platform", "isMac", "storageKey", "languages", "lang", "i18n", "version", "curVersion", "setI18N", "CDN", "msg", "k", "v", "key", "args", "parseVersion", "notify", "$p", "welcome", "baseVersion", "addons", "notification", "baseMajor", "baseMinor", "major", "minor", "addon", "e", "localize", "cm", "obj", "modKey", "isMac", "pageSelector", "handler", "e", "page", "previousSibling", "nextSibling", "openLinks", "ele", "on", "instances", "getInstance", "$ele", "getCaretPosition", "option", "main", "textSelection", "content", "state", "start", "end", "view", "value", "storageKey", "indentKey", "prefs", "dialog", "widget", "indentWidget", "field", "indentField", "indent", "openPreference", "editors", "windowManager", "i18n", "k", "msg", "data", "value", "option", "cm", "baseVersion", "addons", "CDN", "REPO_CDN", "elem", "cm", "instances", "value", "linters", "CodeMirror", "_CodeMirror", "CodeMirror6", "textarea", "lang", "ns", "config", "textSelection", "show", "opt", "linter", "on", "optOrNs", "i18n", "mwConfig", "minConfig", "getMwConfig", "getParserConfig", "extensions", "hasExtension", "ext", "hasLint", "openLinks", "isWiki", "indent", "indentKey", "prefs", "langMap", "e", "_a", "wgAction", "wgNamespaceNumber", "wgPageContentModel", "msg", "portletContainer", "setI18N", "localize", "textareas", "openPreference", "welcome"]
3
+ "sources": ["../mw/base.ts", "../mw/config.ts", "../mw/msg.ts", "../mw/openLinks.ts", "../mw/textSelection.ts", "../mw/preference.ts", "../mw/wikiEditor.ts"],
4
+ "sourcesContent": ["import {CodeMirror6, CDN} from 'https://testingcf.jsdelivr.net/npm/@bhsd/codemirror-mediawiki@2.4.3/dist/main.min.js';\nimport {getMwConfig, getParserConfig} from './config';\nimport {openLinks} from './openLinks';\nimport {instances, textSelection} from './textSelection';\nimport {openPreference, prefs, indentKey} from './preference';\nimport {msg, setI18N, welcome, REPO_CDN, localize} from './msg';\nimport {wikiEditor} from './wikiEditor';\nimport type {LintSource} from '../src/codemirror';\n\n// \u6BCF\u6B21\u65B0\u589E\u63D2\u4EF6\u90FD\u9700\u8981\u4FEE\u6539\u8FD9\u91CC\nconst baseVersion = '2.4',\n\taddons = ['tagMatching'];\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.view.state.doc.toString() : 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\nexport class CodeMirror extends CodeMirror6 {\n\tns;\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 */\n\tconstructor(textarea: HTMLTextAreaElement, lang?: string, ns?: number, config?: unknown) {\n\t\tsuper(textarea, lang, config);\n\t\tthis.ns = ns;\n\t\tinstances.set(textarea, this);\n\t\tif (mw.loader.getState('jquery.textSelection') === 'ready') {\n\t\t\t$(textarea).data('jquery.textSelection', textSelection);\n\t\t}\n\t\tmw.hook('wiki-codemirror6').fire(this);\n\t}\n\n\toverride toggle(show = !this.visible): void {\n\t\tsuper.toggle(show);\n\t\t$(this.textarea).data('jquery.textSelection', show && textSelection);\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\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' && (optOrNs === 8 || optOrNs === 2300)) {\n\t\t\t\topt = {\n\t\t\t\t\tenv: {browser: true, es6: true},\n\t\t\t\t\tparserOptions: {ecmaVersion: 6},\n\t\t\t\t};\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\tthis.lint(linters[lang]);\n\t\t}\n\t}\n\n\toverride prefer(extensions: string[] | Record<string, boolean>): void {\n\t\tsuper.prefer(extensions);\n\t\tconst hasExtension = Array.isArray(extensions)\n\t\t\t\t? (ext: string): boolean => extensions.includes(ext)\n\t\t\t\t: (ext: string): boolean | undefined => extensions[ext],\n\t\t\thasLint = hasExtension('lint');\n\t\tif (hasLint !== undefined) {\n\t\t\tvoid this.defaultLint(hasLint);\n\t\t}\n\t\topenLinks(this, hasExtension('openLinks'));\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')) {\n\t\t\tawait wikiEditor($(textarea));\n\t\t}\n\t\tconst isWiki = lang === 'mediawiki' || lang === 'html',\n\t\t\tcm = new CodeMirror(textarea, isWiki ? undefined : lang, ns),\n\t\t\tindent = localStorage.getItem(indentKey);\n\t\tif (isWiki) {\n\t\t\tconst config = await getMwConfig();\n\t\t\tcm.setLanguage(lang, config);\n\t\t}\n\t\tcm.prefer([...prefs]);\n\t\tif (indent) {\n\t\t\tcm.setIndent(indent);\n\t\t}\n\t\treturn cm;\n\t}\n}\n\nconst langMap: Record<string, string> = {\n\t'sanitized-css': 'css',\n\tjs: 'javascript',\n\tscribunto: 'lua',\n\twikitext: 'mediawiki',\n};\ndocument.body.addEventListener('click', e => {\n\tif (e.target instanceof HTMLTextAreaElement && e.shiftKey && !instances.has(e.target)) {\n\t\te.preventDefault();\n\t\t(async () => {\n\t\t\tconst {wgAction, wgNamespaceNumber, wgPageContentModel} = mw.config.get();\n\t\t\tlet lang: string | undefined,\n\t\t\t\tns: number | undefined;\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\tif (lang && lang in langMap) {\n\t\t\t\tlang = langMap[lang];\n\t\t\t}\n\t\t\tvoid CodeMirror.fromTextArea(e.target as HTMLTextAreaElement, lang, ns);\n\t\t})();\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", "import type {Config} from 'wikilint';\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 USING_LOCAL = mw.loader.getState('ext.CodeMirror') !== null,\n\tDATA_MODULE = mw.loader.getState('ext.CodeMirror.data') ? 'ext.CodeMirror.data' : 'ext.CodeMirror',\n\tALL_SETTINGS_CACHE: Record<string, {time: number, config: MwConfig}>\n\t\t= JSON.parse(localStorage.getItem('InPageEditMwConfig') || '{}'),\n\tSITE_ID = `${mw.config.get('wgServerName')}${mw.config.get('wgScriptPath')}`,\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 (USING_LOCAL && !VALID) { // \u53EA\u5728localStorage\u8FC7\u671F\u65F6\u624D\u4F1A\u91CD\u65B0\u52A0\u8F7Dext.CodeMirror.data\n\t\tawait mw.loader.using(DATA_MODULE);\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// \u60C5\u5F621\uFF1Aconfig\u5DF2\u66F4\u65B0\uFF0C\u53EF\u80FD\u6765\u81EAlocalStorage\n\tif (config?.img && config.variants && !isIPE) {\n\t\treturn {\n\t\t\t...config,\n\t\t\tnsid: mw.config.get('wgNamespaceIds'),\n\t\t};\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\t\ttab: 'text/mediawiki',\n\t\t\t\tindicator: 'text/mediawiki',\n\t\t\t\tpoem: 'text/mediawiki',\n\t\t\t\tref: 'text/mediawiki',\n\t\t\t\toption: 'text/mediawiki',\n\t\t\t\tcombooption: 'text/mediawiki',\n\t\t\t\ttabs: 'text/mediawiki',\n\t\t\t\tpoll: 'text/mediawiki',\n\t\t\t\tgallery: 'text/mediawiki',\n\t\t\t},\n\t\t\ttags: {},\n\t\t\turlProtocols: mw.config.get('wgUrlProtocols'),\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}\n\tconfig!.img = getConfig(magicwords, ({name}) => name.startsWith('img_'));\n\tconfig!.variants = variants ? variants.map(({code}) => code) : [];\n\tconfig!.nsid = mw.config.get('wgNamespaceIds');\n\tsetConfig(config!);\n\tALL_SETTINGS_CACHE[SITE_ID] = {config: config!, time: Date.now()};\n\tlocalStorage.setItem('InPageEditMwConfig', JSON.stringify(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\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.replace(/\\\\:/gu, ':'),\n\t};\n\t[config.parserFunction[0]] = mwConfig.functionSynonyms;\n\tif (!USING_LOCAL) {\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 of Object.keys(mwConfig.img!)) {\n\t\tconfig.img[key] = mwConfig.img![key]!.slice(4);\n\t}\n\treturn config;\n};\n", "import type {CodeMirror} from './base';\n\nexport const REPO_CDN = 'npm/@bhsd/codemirror-mediawiki@2.4.3';\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> = JSON.parse(localStorage.getItem(storageKey) || '{}');\n\nconst {version} = i18n,\n\tcurVersion = REPO_CDN.slice(REPO_CDN.lastIndexOf('@') + 1);\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\tlocalStorage.setItem(storageKey, JSON.stringify(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 * \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 = $('<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>${msg(`addon-${addon}`)}</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 {CodeMirror} from './base';\n\ndeclare type MouseEventListener = (e: MouseEvent) => void;\n\nconst modKey = isMac ? 'metaKey' : 'ctrlKey',\n\tregex = /-template-name|-link-pagename/u,\n\thandlers = new WeakMap<CodeMirror, MouseEventListener>();\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\tnode = cm.getNodeAt(view.posAtCoords(e)!);\n\t\tif (!node || !regex.test(node.name)) {\n\t\t\treturn;\n\t\t}\n\t\te.preventDefault();\n\t\tconst {name} = node;\n\t\tlet prev = node,\n\t\t\tnext = node;\n\t\twhile (prev.prevSibling?.name === name) {\n\t\t\tprev = prev.prevSibling!;\n\t\t}\n\t\twhile (next.nextSibling?.name === name) {\n\t\t\tnext = next.nextSibling!;\n\t\t}\n\t\tlet page = view.state.sliceDoc(prev.from, next.to).trim();\n\t\tif (page.startsWith('/')) {\n\t\t\tpage = `:${mw.config.get('wgPageName')}${page}`;\n\t\t}\n\t\topen(new mw.Title(page, name.includes('-template-name') ? 10 : 0).getUrl(undefined), '_blank');\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 {view: {contentDOM}} = cm;\n\tif (on) {\n\t\tmw.loader.load('mediawiki.Title');\n\t\tcontentDOM.addEventListener('click', getHandler(cm));\n\t\tcontentDOM.style.setProperty('--codemirror-cursor', 'pointer');\n\t} else if (on === false) {\n\t\tcontentDOM.removeEventListener('click', getHandler(cm));\n\t\tcontentDOM.style.removeProperty('--codemirror-cursor');\n\t}\n};\n", "import type {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\nfunction getCaretPosition(this: JQuery<HTMLTextAreaElement>, option: {startAndEnd: true}): [number, number];\nfunction getCaretPosition(this: JQuery<HTMLTextAreaElement>, option?: {startAndEnd?: false}): number;\nfunction getCaretPosition(\n\tthis: JQuery<HTMLTextAreaElement>,\n\toption?: {startAndEnd?: boolean},\n): [number, number] | number {\n\tconst {view: {state: {selection: {main}}}} = getInstance(this);\n\treturn option?.startAndEnd ? [main.from, main.to] : main.head;\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 {view: {state}} = getInstance(this);\n\t\treturn state.sliceDoc(state.selection.main.from, state.selection.main.to);\n\t},\n\tsetSelection(\n\t\tthis: JQuery<HTMLTextAreaElement>,\n\t\t{start, end}: {start: number, end?: number},\n\t): JQuery<HTMLTextAreaElement> {\n\t\tconst {view} = getInstance(this);\n\t\tview.dispatch({\n\t\t\tselection: {anchor: start, head: end ?? start},\n\t\t});\n\t\tview.focus();\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\tgetCaretPosition,\n\tscrollToCaretPosition(this: JQuery<HTMLTextAreaElement>): JQuery<HTMLTextAreaElement> {\n\t\tgetInstance(this).view.dispatch({scrollIntoView: true});\n\t\treturn this;\n\t},\n};\n", "import {msg, i18n} from './msg';\nimport type {CodeMirror} from './base';\n\nconst storageKey = 'codemirror-mediawiki-addons';\nexport const indentKey = 'codemirror-mediawiki-indent',\n\tprefs = new Set<string>(JSON.parse(String(localStorage.getItem(storageKey))) as string[] | null);\n\n// OOUI\u7EC4\u4EF6\nlet dialog: OO.ui.MessageDialog | undefined,\n\twidget: OO.ui.CheckboxMultiselectInputWidget,\n\tindentWidget: OO.ui.TextInputWidget,\n\tfield: OO.ui.FieldLayout,\n\tindentField: OO.ui.FieldLayout,\n\tindent = localStorage.getItem(indentKey) || '';\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(['oojs-ui-windows', 'oojs-ui.styles.icons-content']);\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();\n\t\tconst windowManager = new OO.ui.WindowManager();\n\t\twindowManager.$element.appendTo(document.body);\n\t\twindowManager.addWindows([dialog]);\n\t\twidget = new OO.ui.CheckboxMultiselectInputWidget({\n\t\t\toptions: Object.keys(i18n)\n\t\t\t\t.filter(k => k !== 'addon-indent' && k.startsWith('addon-') && !k.endsWith('-mac'))\n\t\t\t\t.map(k => ({\n\t\t\t\t\tdata: k.slice(6),\n\t\t\t\t\tlabel: $($.parseHTML(msg(k))),\n\t\t\t\t\tdisabled: k === 'addon-wikiEditor' && !mw.loader.getState('ext.wikiEditor'),\n\t\t\t\t})),\n\t\t\tvalue: [...prefs] as unknown as string,\n\t\t});\n\t\tfield = new OO.ui.FieldLayout(widget, {\n\t\t\tlabel: msg('label'),\n\t\t\talign: 'top',\n\t\t});\n\t\tindentWidget = new OO.ui.TextInputWidget({value: indent, placeholder: '\\\\t'});\n\t\tindentField = new OO.ui.FieldLayout(indentWidget, {label: msg('addon-indent')});\n\t}\n\n\tconst data = await (dialog.open({\n\t\ttitle: msg('title'),\n\t\tmessage: field.$element.add(indentField.$element).add($('<p>', {html: msg('feedback')})),\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\tconst value = widget.getValue() as unknown as string[];\n\t\tindent = indentWidget.getValue(); // eslint-disable-line require-atomic-updates\n\t\tprefs.clear();\n\t\tfor (const option of value) {\n\t\t\tprefs.add(option);\n\t\t}\n\t\tfor (const cm of editors) {\n\t\t\tcm?.prefer(value);\n\t\t\tcm?.setIndent(indent || '\\t');\n\t\t}\n\t\tlocalStorage.setItem(storageKey, JSON.stringify(value));\n\t\tlocalStorage.setItem(indentKey, indent);\n\t}\n};\n", "import {msg} from './msg';\nimport {prefs} from './preference';\n\nexport const wikiEditor = async ($textarea: JQuery<HTMLTextAreaElement>): Promise<void> => {\n\tif (!mw.loader.getState('ext.wikiEditor')) {\n\t\tprefs.delete('wikiEditor');\n\t\tvoid mw.notify(msg('no-wikiEditor'), {type: 'error'});\n\t\treturn;\n\t} else if ($textarea.data('wikiEditorContext')) {\n\t\treturn;\n\t}\n\tawait mw.loader.using('ext.wikiEditor');\n\tif (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", "USING_LOCAL", "DATA_MODULE", "ALL_SETTINGS_CACHE", "SITE_ID", "SITE_SETTINGS", "VALID", "getConfig", "magicWords", "rule", "flip", "words", "i", "aliases", "name", "alias", "obj", "getConfigPair", "bool", "setConfig", "config", "getMwConfig", "isIPE", "variants", "magicwords", "extensiontags", "functionhooks", "variables", "others", "insensitive", "tag", "functions", "code", "getParserConfig", "minConfig", "mwConfig", "s", "key", "val", "REPO_CDN", "vendor", "userAgent", "maxTouchPoints", "platform", "isMac", "storageKey", "languages", "lang", "i18n", "version", "curVersion", "setI18N", "CDN", "e", "msg", "k", "v", "key", "args", "parseVersion", "notify", "$p", "welcome", "baseVersion", "addons", "notification", "baseMajor", "baseMinor", "major", "minor", "addon", "localize", "cm", "obj", "modKey", "isMac", "regex", "handlers", "getHandler", "cm", "handler", "e", "_a", "_b", "view", "node", "name", "prev", "next", "page", "openLinks", "on", "contentDOM", "instances", "getInstance", "$ele", "getCaretPosition", "option", "main", "textSelection", "content", "state", "start", "end", "view", "value", "storageKey", "indentKey", "prefs", "dialog", "widget", "indentWidget", "field", "indentField", "indent", "openPreference", "editors", "windowManager", "i18n", "k", "msg", "data", "value", "option", "cm", "wikiEditor", "$textarea", "prefs", "msg", "config", "resolve", "baseVersion", "addons", "CDN", "REPO_CDN", "elem", "cm", "instances", "value", "linters", "CodeMirror", "_CodeMirror", "CodeMirror6", "textarea", "lang", "ns", "config", "textSelection", "show", "opt", "linter", "on", "optOrNs", "i18n", "mwConfig", "minConfig", "getMwConfig", "getParserConfig", "extensions", "hasExtension", "ext", "hasLint", "openLinks", "prefs", "wikiEditor", "isWiki", "indent", "indentKey", "langMap", "_a", "wgAction", "wgNamespaceNumber", "wgPageContentModel", "msg", "portletContainer", "setI18N", "localize", "e", "textareas", "openPreference", "welcome"]
7
7
  }
package/i18n/en.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2.4.1",
2
+ "version": "2.4.3",
3
3
  "lang": "en",
4
4
  "i18n-failed": "Failed to fetch the translation file in $1.",
5
5
  "title": "CodeMirror Addons",
@@ -22,6 +22,8 @@
22
22
  "addon-openLinks": "Open the wikilink or template page with CTRL-click",
23
23
  "addon-openLinks-mac": "Open the wikilink or template page with CMD-click",
24
24
  "addon-tagMatching": "Highlight matching/non-matching tags",
25
+ "addon-wikiEditor": "Load WikiEditor toolbar",
26
+ "no-wikiEditor": "WikiEditor is not available.",
25
27
  "welcome": "Welcome to <b>codemirror-mediawiki</b>!<br>You can change your local settings <a id=\"settings\" href=\"#\">here</a>.",
26
28
  "welcome-addons": "<b>codemirror-mediawiki</b> has been upgraded to $1. This version introduces $2 new {{plural:$2|addon|addons}}: <ul>$3</ul>You may update your local settings <a id=\"settings\" href=\"#\">here</a>.",
27
29
  "phrase-Find": "Find",
@@ -35,4 +37,4 @@
35
37
  "phrase-replace": "replace",
36
38
  "phrase-replace-all": "replace all",
37
39
  "phrase-Fold-template-parameters": "Fold template parameters"
38
- }
40
+ }
package/i18n/zh-hans.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2.4.1",
2
+ "version": "2.4.3",
3
3
  "lang": "zh-hans",
4
4
  "i18n-failed": "获取 $1 的语言文件失败。",
5
5
  "title": "CodeMirror插件",
@@ -22,6 +22,8 @@
22
22
  "addon-openLinks": "CTRL+点击可打开内部链接或模板页面",
23
23
  "addon-openLinks-mac": "CMD+点击可打开内部链接或模板页面",
24
24
  "addon-tagMatching": "高亮显示匹配和未匹配的标签",
25
+ "addon-wikiEditor": "加载WikiEditor工具栏",
26
+ "no-wikiEditor": "未找到WikiEditor扩展。",
25
27
  "welcome": "欢迎使用 <b>codemirror-mediawiki</b>!<br>您可以点击 <a id=\"settings\" href=\"#\">这里</a> 更改本地设置。",
26
28
  "welcome-addons": "<b>codemirror-mediawiki</b> 已升级到 $1。新版本添加了 $2 个插件:<ul>$3</ul>您可以点击 <a id=\"settings\" href=\"#\">这里</a> 更新本地设置。",
27
29
  "phrase-Find": "查找",
@@ -35,4 +37,4 @@
35
37
  "phrase-replace": "替换",
36
38
  "phrase-replace-all": "替换所有",
37
39
  "phrase-Fold-template-parameters": "折叠模板参数"
38
- }
40
+ }
package/i18n/zh-hant.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2.4.1",
2
+ "version": "2.4.3",
3
3
  "lang": "zh-hant",
4
4
  "i18n-failed": "取得 $1 的語言檔案失敗。",
5
5
  "title": "CodeMirror外掛程式",
@@ -22,6 +22,8 @@
22
22
  "addon-lint": "維基語法檢查",
23
23
  "addon-openLinks": "CTRL+點擊可打開內部連結或模板頁面",
24
24
  "addon-openLinks-mac": "CMD+點擊可打開內部連結或模板頁面",
25
+ "addon-wikiEditor": "載入WikiEditor工具列",
26
+ "no-wikiEditor": "未找到WikiEditor擴展。",
25
27
  "welcome": "歡迎使用 <b>codemirror-mediawiki</b>!<br>您可以點擊 <a id=\"settings\" href=\"#\">這裡</a> 更改本地設定。",
26
28
  "welcome-addons": "<b>codemirror-mediawiki</b> 已升級到 $1。新版本添加了 $2 個外掛程式:<ul>$3</ul>您可以點擊 <a id=\"settings\" href=\"#\">這裡</a> 更新本地設定。",
27
29
  "phrase-Find": "搜尋",
@@ -35,4 +37,4 @@
35
37
  "phrase-replace": "取代",
36
38
  "phrase-replace-all": "全部取代",
37
39
  "phrase-Fold-template-parameters": "摺疊模板參數"
38
- }
40
+ }
package/mw/base.ts CHANGED
@@ -1,9 +1,10 @@
1
- import {CodeMirror6, CDN} from 'https://testingcf.jsdelivr.net/npm/@bhsd/codemirror-mediawiki@2.4.1/dist/main.min.js';
1
+ import {CodeMirror6, CDN} from 'https://testingcf.jsdelivr.net/npm/@bhsd/codemirror-mediawiki@2.4.3/dist/main.min.js';
2
2
  import {getMwConfig, getParserConfig} from './config';
3
3
  import {openLinks} from './openLinks';
4
4
  import {instances, textSelection} from './textSelection';
5
5
  import {openPreference, prefs, indentKey} from './preference';
6
6
  import {msg, setI18N, welcome, REPO_CDN, localize} from './msg';
7
+ import {wikiEditor} from './wikiEditor';
7
8
  import type {LintSource} from '../src/codemirror';
8
9
 
9
10
  // 每次新增插件都需要修改这里
@@ -120,7 +121,7 @@ export class CodeMirror extends CodeMirror6 {
120
121
  if (hasLint !== undefined) {
121
122
  void this.defaultLint(hasLint);
122
123
  }
123
- openLinks(this.view.contentDOM, hasExtension('openLinks'));
124
+ openLinks(this, hasExtension('openLinks'));
124
125
  }
125
126
 
126
127
  /**
@@ -130,6 +131,9 @@ export class CodeMirror extends CodeMirror6 {
130
131
  * @param ns 命名空间
131
132
  */
132
133
  static async fromTextArea(textarea: HTMLTextAreaElement, lang?: string, ns?: number): Promise<CodeMirror> {
134
+ if (prefs.has('wikiEditor')) {
135
+ await wikiEditor($(textarea));
136
+ }
133
137
  const isWiki = lang === 'mediawiki' || lang === 'html',
134
138
  cm = new CodeMirror(textarea, isWiki ? undefined : lang, ns),
135
139
  indent = localStorage.getItem(indentKey);
@@ -177,6 +181,7 @@ document.body.addEventListener('click', e => {
177
181
  const portletContainer: Record<string, string> = {
178
182
  minerva: 'page-actions-overflow',
179
183
  moeskin: 'ca-more-actions',
184
+ citizen: 'p-tb',
180
185
  };
181
186
  await Promise.all([
182
187
  mw.loader.using('mediawiki.util'),
package/mw/config.ts CHANGED
@@ -11,7 +11,7 @@ declare interface MagicWord {
11
11
  const USING_LOCAL = mw.loader.getState('ext.CodeMirror') !== null,
12
12
  DATA_MODULE = mw.loader.getState('ext.CodeMirror.data') ? 'ext.CodeMirror.data' : 'ext.CodeMirror',
13
13
  ALL_SETTINGS_CACHE: Record<string, {time: number, config: MwConfig}>
14
- = JSON.parse(localStorage.getItem('InPageEditMwConfig')!) || {},
14
+ = JSON.parse(localStorage.getItem('InPageEditMwConfig') || '{}'),
15
15
  SITE_ID = `${mw.config.get('wgServerName')}${mw.config.get('wgScriptPath')}`,
16
16
  SITE_SETTINGS = ALL_SETTINGS_CACHE[SITE_ID],
17
17
  VALID = Number(SITE_SETTINGS?.time) > Date.now() - 86_400 * 1000 * 30;
@@ -153,7 +153,7 @@ export const getMwConfig = async (): Promise<MwConfig> => {
153
153
  /**
154
154
  * 将MwConfig转换为Config
155
155
  * @param minConfig 基础Config
156
- * @param mwConfig MwConfig
156
+ * @param mwConfig
157
157
  */
158
158
  export const getParserConfig = (minConfig: Config, mwConfig: MwConfig): Config => {
159
159
  const config: Config = {
package/mw/msg.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import type {CodeMirror} from './base';
2
2
 
3
- export const REPO_CDN = 'npm/@bhsd/codemirror-mediawiki@2.4.1';
3
+ export const REPO_CDN = 'npm/@bhsd/codemirror-mediawiki@2.4.3';
4
4
 
5
5
  const {vendor, userAgent, maxTouchPoints, platform} = navigator;
6
6
 
@@ -22,7 +22,7 @@ const storageKey = 'codemirror-mediawiki-i18n',
22
22
  lang = languages[mw.config.get('wgUserLanguage')] || 'en';
23
23
 
24
24
  /** 预存的I18N,可以用于判断是否是首次安装 */
25
- export const i18n: Record<string, string> = JSON.parse(localStorage.getItem(storageKey)!) || {};
25
+ export const i18n: Record<string, string> = JSON.parse(localStorage.getItem(storageKey) || '{}');
26
26
 
27
27
  const {version} = i18n,
28
28
  curVersion = REPO_CDN.slice(REPO_CDN.lastIndexOf('@') + 1);
@@ -103,7 +103,7 @@ export const welcome = async (baseVersion: string, addons: string[]): Promise<vo
103
103
 
104
104
  /**
105
105
  * 本地化
106
- * @param cm 编辑器实例
106
+ * @param cm
107
107
  */
108
108
  export const localize = (cm: CodeMirror): void => {
109
109
  const obj: Record<string, string> = {};
package/mw/openLinks.ts CHANGED
@@ -1,50 +1,63 @@
1
1
  import {isMac} from './msg';
2
+ import type {CodeMirror} from './base';
3
+
4
+ declare type MouseEventListener = (e: MouseEvent) => void;
2
5
 
3
6
  const modKey = isMac ? 'metaKey' : 'ctrlKey',
4
- pageSelector = '.cm-mw-template-name, .cm-mw-link-pagename';
7
+ regex = /-template-name|-link-pagename/u,
8
+ handlers = new WeakMap<CodeMirror, MouseEventListener>();
5
9
 
6
10
  /**
7
11
  * 点击时在新页面打开链接、模板等
12
+ * @param cm
8
13
  * @param e 点击事件
9
14
  */
10
- const handler = function(this: HTMLElement, e: JQuery.ClickEvent): void {
11
- if (!e[modKey]) {
12
- return;
13
- }
14
- e.preventDefault();
15
- let page = this.textContent!,
16
- {previousSibling, nextSibling} = this;
17
- while (
18
- previousSibling
19
- && (previousSibling.nodeType === Node.TEXT_NODE || (previousSibling as Element).matches(pageSelector))
20
- ) {
21
- page = previousSibling.textContent! + page;
22
- ({previousSibling} = previousSibling);
23
- }
24
- while (
25
- nextSibling
26
- && (nextSibling.nodeType === Node.TEXT_NODE || (nextSibling as Element).matches(pageSelector))
27
- ) {
28
- page += nextSibling.textContent!;
29
- ({nextSibling} = nextSibling);
30
- }
31
- page = page.trim();
32
- if (page.startsWith('/')) {
33
- page = `:${mw.config.get('wgPageName')}${page}`;
15
+ const getHandler = (cm: CodeMirror): MouseEventListener => {
16
+ if (handlers.has(cm)) {
17
+ return handlers.get(cm)!;
34
18
  }
35
- open(new mw.Title(page, this.classList.contains('cm-mw-template-name') ? 10 : 0).getUrl(undefined), '_blank');
19
+ const handler: MouseEventListener = (e): void => {
20
+ if (!e[modKey]) {
21
+ return;
22
+ }
23
+ const {view} = cm,
24
+ node = cm.getNodeAt(view.posAtCoords(e)!);
25
+ if (!node || !regex.test(node.name)) {
26
+ return;
27
+ }
28
+ e.preventDefault();
29
+ const {name} = node;
30
+ let prev = node,
31
+ next = node;
32
+ while (prev.prevSibling?.name === name) {
33
+ prev = prev.prevSibling!;
34
+ }
35
+ while (next.nextSibling?.name === name) {
36
+ next = next.nextSibling!;
37
+ }
38
+ let page = view.state.sliceDoc(prev.from, next.to).trim();
39
+ if (page.startsWith('/')) {
40
+ page = `:${mw.config.get('wgPageName')}${page}`;
41
+ }
42
+ open(new mw.Title(page, name.includes('-template-name') ? 10 : 0).getUrl(undefined), '_blank');
43
+ };
44
+ handlers.set(cm, handler);
45
+ return handler;
36
46
  };
37
47
 
38
48
  /**
39
49
  * 添加或移除打开链接的事件
40
- * @param ele 编辑器DOM
50
+ * @param cm
41
51
  * @param on 是否添加
42
52
  */
43
- export const openLinks = (ele: HTMLElement, on?: boolean): void => {
53
+ export const openLinks = (cm: CodeMirror, on?: boolean): void => {
54
+ const {view: {contentDOM}} = cm;
44
55
  if (on) {
45
56
  mw.loader.load('mediawiki.Title');
46
- $(ele).on('click', pageSelector, handler).css('--codemirror-cursor', 'pointer');
57
+ contentDOM.addEventListener('click', getHandler(cm));
58
+ contentDOM.style.setProperty('--codemirror-cursor', 'pointer');
47
59
  } else if (on === false) {
48
- $(ele).off('click', pageSelector, handler).css('--codemirror-cursor', '');
60
+ contentDOM.removeEventListener('click', getHandler(cm));
61
+ contentDOM.style.removeProperty('--codemirror-cursor');
49
62
  }
50
63
  };
package/mw/preference.ts CHANGED
@@ -3,7 +3,7 @@ import type {CodeMirror} from './base';
3
3
 
4
4
  const storageKey = 'codemirror-mediawiki-addons';
5
5
  export const indentKey = 'codemirror-mediawiki-indent',
6
- prefs = new Set<string>(JSON.parse(localStorage.getItem(storageKey)!) as string[] | null);
6
+ prefs = new Set<string>(JSON.parse(String(localStorage.getItem(storageKey))) as string[] | null);
7
7
 
8
8
  // OOUI组件
9
9
  let dialog: OO.ui.MessageDialog | undefined,
@@ -30,7 +30,11 @@ export const openPreference = async (editors: (CodeMirror | undefined)[]): Promi
30
30
  widget = new OO.ui.CheckboxMultiselectInputWidget({
31
31
  options: Object.keys(i18n)
32
32
  .filter(k => k !== 'addon-indent' && k.startsWith('addon-') && !k.endsWith('-mac'))
33
- .map(k => ({data: k.slice(6), label: $($.parseHTML(msg(k)))})),
33
+ .map(k => ({
34
+ data: k.slice(6),
35
+ label: $($.parseHTML(msg(k))),
36
+ disabled: k === 'addon-wikiEditor' && !mw.loader.getState('ext.wikiEditor'),
37
+ })),
34
38
  value: [...prefs] as unknown as string,
35
39
  });
36
40
  field = new OO.ui.FieldLayout(widget, {
@@ -0,0 +1,26 @@
1
+ import {msg} from './msg';
2
+ import {prefs} from './preference';
3
+
4
+ export const wikiEditor = async ($textarea: JQuery<HTMLTextAreaElement>): Promise<void> => {
5
+ if (!mw.loader.getState('ext.wikiEditor')) {
6
+ prefs.delete('wikiEditor');
7
+ void mw.notify(msg('no-wikiEditor'), {type: 'error'});
8
+ return;
9
+ } else if ($textarea.data('wikiEditorContext')) {
10
+ return;
11
+ }
12
+ await mw.loader.using('ext.wikiEditor');
13
+ if (typeof mw.addWikiEditor === 'function') { // MW >= 1.34
14
+ mw.addWikiEditor($textarea);
15
+ } else { // MW <= 1.33
16
+ const {wikiEditor: {modules: {dialogs: {config}}}} = $;
17
+ $textarea.wikiEditor('addModule', {
18
+ ...$.wikiEditor.modules.toolbar.config.getDefaultConfig(),
19
+ ...config.getDefaultConfig(),
20
+ });
21
+ config.replaceIcons($textarea);
22
+ }
23
+ await new Promise(resolve => { // MW >= 1.21
24
+ $textarea.on('wikiEditor-toolbar-doneInitialSections', resolve);
25
+ });
26
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bhsd/codemirror-mediawiki",
3
- "version": "2.4.1",
3
+ "version": "2.4.3",
4
4
  "description": "Modified CodeMirror mode based on wikimedia/mediawiki-extensions-CodeMirror",
5
5
  "keywords": [
6
6
  "mediawiki",
@@ -11,7 +11,7 @@
11
11
  "url": "https://github.com/bhsd-harry/codemirror-mediawiki/issues"
12
12
  },
13
13
  "license": "GPL-2.0",
14
- "files":[
14
+ "files": [
15
15
  "/i18n/",
16
16
  "/mw/*.ts",
17
17
  "!/mw/*.d.ts",
@@ -65,6 +65,7 @@
65
65
  "eslint-plugin-es-x": "^7.5.0",
66
66
  "eslint-plugin-eslint-comments": "^3.2.0",
67
67
  "eslint-plugin-jsdoc": "^48.0.2",
68
+ "eslint-plugin-json-es": "^1.5.7",
68
69
  "eslint-plugin-promise": "^6.1.1",
69
70
  "eslint-plugin-regexp": "^2.2.0",
70
71
  "eslint-plugin-unicorn": "^50.0.1",