@bhsd/codemirror-mediawiki 2.6.10 → 2.7.0
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 +1 -1
- package/dist/mw.min.js.map +3 -3
- package/i18n/en.json +2 -2
- package/i18n/zh-hans.json +2 -1
- package/i18n/zh-hant.json +3 -2
- package/mw/base.ts +4 -4
- package/mw/msg.ts +9 -3
- package/mw/preference.ts +92 -68
- package/package.json +1 -1
package/dist/mw.min.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var Oe=Object.create;var G=Object.defineProperty;var Ce=Object.getOwnPropertyDescriptor;var Ee=Object.getOwnPropertyNames;var Se=Object.getPrototypeOf,Te=Object.prototype.hasOwnProperty;var Pe=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var je=(e,t,i,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Ee(t))!Te.call(e,o)&&o!==i&&G(e,o,{get:()=>t[o],enumerable:!(n=Ce(t,o))||n.enumerable});return e};var Ae=(e,t,i)=>(i=e!=null?Oe(Se(e)):{},je(t||!e||!e.__esModule?G(i,"default",{value:e,enumerable:!0}):i,e));var me=Pe(S=>{"use strict";Object.defineProperty(S,"__esModule",{value:!0});S.rules=void 0;S.rules=["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"]});import{CodeMirror6 as ve,CDN as F}from"https://testingcf.jsdelivr.net/npm/@bhsd/codemirror-mediawiki@2.6.10/dist/main.min.js";var x="npm/@bhsd/codemirror-mediawiki@2.6.10",C=x.slice(x.lastIndexOf("@")+1),{vendor:$e,userAgent:Re,maxTouchPoints:ze,platform:We}=navigator,I=$e.includes("Apple Computer")&&(Re.includes("Mobile/")||ze>2)||We.includes("Mac"),Z="codemirror-mediawiki-i18n",Ie={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"},z=Ie[mw.config.get("wgUserLanguage")]||"en",y=e=>JSON.parse(String(localStorage.getItem(e))),h=(e,t)=>{localStorage.setItem(e,JSON.stringify(t))},w=y(Z)||{},{version:W}=w,ee=async e=>{if(w.lang!==z||W!==C)try{Object.assign(w,await(await fetch(`${e}/${x}/i18n/${z}.json`)).json()),h(Z,w)}catch(t){mw.notify(d("i18n-failed",z),{type:"error"}),console.error(t)}for(let[t,i]of Object.entries(w))t.endsWith("-mac")?I&&mw.messages.set(`cm-mw-${t.slice(0,-4)}`,i):mw.messages.set(`cm-mw-${t}`,i)},d=(e,...t)=>mw.msg(`cm-mw-${e}`,...t),H=e=>mw.message(`cm-mw-${e}`).parseDom(),X=e=>e.split(".",2).map(Number),Y=async(e,...t)=>{let i=$("<p>",{html:d(e,...t)});return await mw.notify(i,{type:"success",autoHideSeconds:"long"}),i},te=async(e,t)=>{let i;if(!W)i=await Y("welcome");else if(t.length>0){let[n,o]=X(e),[s,a]=X(W);(s<n||s===n&&a<o)&&(i=await Y("welcome-addons",C,String(t.length),t.map(l=>`<li>${d(`addon-${l}`)}</li>`).join("")))}i==null||i.find("#settings").click(n=>{n.preventDefault(),document.getElementById("cm-settings").dispatchEvent(new MouseEvent("click"))})},ie=e=>{let t={};for(let[i,n]of Object.entries(w))i.startsWith("phrase-")&&(t[i.slice(7).replace(/-/gu," ")]=n);e.localize(t)};var se=mw.loader.getState("ext.CodeMirror")!==null,He=mw.loader.getState("ext.CodeMirror.data")?"ext.CodeMirror.data":"ext.CodeMirror",D=y("InPageEditMwConfig")||{},ae=`${mw.config.get("wgServerName")}${mw.config.get("wgScriptPath")}`,E=D[ae],ne=Number(E==null?void 0:E.time)>Date.now()-86400*1e3*30,N=(e,t,i)=>{let n=e.filter(t).filter(({"case-sensitive":s})=>s!==i).flatMap(({aliases:s,name:a,"case-sensitive":l})=>s.map(r=>({alias:(l?r:r.toLowerCase()).replace(/:$/u,""),name:a}))),o={};for(let{alias:s,name:a}of n)o[s]=a;return o},oe=(e,t)=>[!0,!1].map(i=>N(e,t,i)),re=e=>{mw.config.set("extCodeMirrorConfig",e)},J=async()=>{se&&!ne&&await mw.loader.using(He);let e=mw.config.get("extCodeMirrorConfig");!e&&ne&&({config:e}=E,re(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:s,variables:a}}=await new mw.Api().get({meta:"siteinfo",siprop:["general","magicwords",...e&&!t?[]:["extensiontags","functionhooks","variables"]],formatversion:"2"}),l=new Set(["msg","raw","msgnw","subst","safesubst"]);if(e&&!t){let{functionSynonyms:[r]}=e;"subst"in r||Object.assign(r,N(n,({name:c})=>l.has(c)))}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 c of o)e.tags[c.slice(1,-1)]=!0;let r=new Set([...s,...a,...l]);e.functionSynonyms=oe(n,({name:c})=>r.has(c)),e.doubleUnderscore=oe(n,({aliases:c})=>c.some(f=>/^__.+__$/u.test(f)))}return e.img=N(n,({name:r})=>r.startsWith("img_")),e.variants=i?i.map(({code:r})=>r):[],e.nsid=mw.config.get("wgNamespaceIds"),re(e),D[ae]={config:e,time:Date.now()},h("InPageEditMwConfig",D),e},le=(e,t)=>{if(mw.config.exists("wikilintConfig"))return mw.config.get("wikilintConfig");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,!se)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,o]of Object.entries(t.img))i.img[n]=o.slice(4);return i};var De=I?"metaKey":"ctrlKey",Ne=/-template-name|-link-pagename/u,Q=new WeakMap;function _(e){return e==null?void 0:e.name.replace(/_+/gu," ").trim()}var ce=e=>{if(Q.has(e))return Q.get(e);let t=i=>{if(!i[De])return;let{view:n}=e,o=e.getNodeAt(n.posAtCoords(i));if(!o||!Ne.test(o.name))return;i.preventDefault();let s=_(o),a=o,l=o;for(;_(a.prevSibling)===s;)a=a.prevSibling;for(;_(l.nextSibling)===s;)l=l.nextSibling;let r=n.state.sliceDoc(a.from,l.to).trim();r.startsWith("/")&&(r=`:${mw.config.get("wgPageName")}${r}`),open(new mw.Title(r,s.includes("-template-name")?10:0).getUrl(void 0),"_blank")};return Q.set(e,t),t},de=(e,t)=>{let{view:{contentDOM:i}}=e;t?(mw.loader.load("mediawiki.Title"),i.addEventListener("click",ce(e)),i.style.setProperty("--codemirror-cursor","pointer")):t===!1&&(i.removeEventListener("click",ce(e)),i.style.removeProperty("--codemirror-cursor"))};var g=new WeakMap,k=e=>g.get(e[0]),K={getContents(){return k(this).view.state.doc.toString()},setContents(e){let t=k(this),{view:{scrollDOM:i}}=t,{scrollTop:n}=i;return t.setContent(e),i.scrollTop=n,this},getSelection(){let{view:{state:e}}=k(this),{selection:{main:{from:t,to:i}}}=e;return e.sliceDoc(t,i)},setSelection({start:e,end:t=e}){return k(this).view.dispatch({selection:{anchor:e,head:t}}),this},replaceSelection(e){let{view:t}=k(this);return t.dispatch({selection:t.state.selection.asSingle()}),t.dispatch(t.state.replaceSelection(e)),this},getCaretPosition(e){let{view:{state:{selection:{main:{from:t,to:i,head:n}}}}}=k(this);return e!=null&&e.startAndEnd?[t,i]:n},scrollToCaretPosition(){return k(this).scrollTo(),this}};var ue=Ae(me());var fe="codemirror-mediawiki-addons",we="codemirror-mediawiki-wikilint",A=["ESLint","Stylelint"],U=mw.config.get("wgUserName"),pe=U&&`User:${U}/codemirror-mediawiki.json`,L="codemirror-mediawiki-indent",m=new Set(y(fe)),u=y(we)||{},p=new Map(A.map(e=>[e,y(`codemirror-mediawiki-${e}`)])),T,q,P,j,b=localStorage.getItem(L)||"",V={};var ge=new Map,ye=(e,t)=>{let i=e==="http"||e==="okay-but-empty"?`MediaWiki API request failed: ${e}`:$("<ul>",{html:t.errors.map(({html:n})=>$("<li>",{html:n}))});mw.notify(i,{type:"error",autoHideSeconds:"long"})},he=(async()=>(await mw.loader.using("mediawiki.api"),new mw.Api({parameters:{errorformat:"html",formatversion:"2"}})))(),ke=async e=>{if(await mw.loader.using(["oojs-ui-windows","oojs-ui-widgets","oojs-ui.styles.icons-content","mediawiki.jqueryMsg"]),T)P.setValue([...m]),j.setValue(b);else{T=new OO.ui.MessageDialog({id:"cm-preference"});let i=new OO.ui.WindowManager;i.$element.appendTo(document.body),i.addWindows([T]),q=new OO.ui.IndexLayout;let n=new OO.ui.TabPanelLayout("main",{label:d("title")}),o=new OO.ui.TabPanelLayout("wikilint",{label:"WikiLint"}),s={};for(let r of A){let c=p.get(r);V[r]=new OO.ui.MultilineTextInputWidget({value:c?JSON.stringify(c,null,b||" "):""});let f=new OO.ui.FieldLayout(V[r],{label:d(`${r}-config`),align:"top"}),M=new OO.ui.TabPanelLayout(r,{label:r,$content:f.$element});M.on("active",Le=>{let[B]=M.$element.find("textarea");Le&&!g.has(B)&&v.fromTextArea(B,"json")}),s[r]=M}q.addTabPanels([n,o,...Object.values(s)],0),P=new OO.ui.CheckboxMultiselectInputWidget({options:[{disabled:!0},...Object.keys(w).filter(r=>r!=="addon-indent"&&r.startsWith("addon-")&&!r.endsWith("-mac")).map(r=>({data:r.slice(6),label:H(r),disabled:r==="addon-wikiEditor"&&!mw.loader.getState("ext.wikiEditor")||r==="addon-save"&&!U}))],value:[...m]}),j=new OO.ui.TextInputWidget({value:b,placeholder:"\\t"});let a=new OO.ui.FieldLayout(P,{label:d("label"),align:"top"}),l=new OO.ui.FieldLayout(j,{label:d("addon-indent")});n.$element.append(a.$element,l.$element,$("<p>",{html:d("feedback","codemirror-mediawiki")})),o.$element.append(...ue.rules.map(r=>{let c=r==="no-arg"?"0":"1",f=new OO.ui.DropdownInputWidget({options:[{data:"0",label:d("wikilint-off")},{data:"1",label:d("wikilint-error")},{data:"2",label:d("wikilint-on")}],value:u[r]||c}),M=new OO.ui.FieldLayout(f,{label:r});return ge.set(r,f),u[r]||(u[r]=c),M.$element}),$("<p>",{html:d("feedback","wikiparser-node")}))}let t=await T.open({message:q.$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 t=="object"&&t.action==="accept"){let i=[];for(let o of A)try{let s=JSON.parse(V[o].getValue().trim()||"null");p.set(o,s),h(`codemirror-mediawiki-${o}`,s)}catch(s){i.push(o)}i.length>0&&OO.ui.alert(d("json-error",i.join(d("and"))));for(let[o,s]of ge)u[o]=s.getValue();h(we,u);let n=P.getValue();b=j.getValue(),m.clear();for(let o of n)m.add(o);for(let o of e)o==null||o.prefer(n),o==null||o.setIndent(b||" ");if(h(fe,n),localStorage.setItem(L,b),m.has("save")){let o={action:"edit",title:pe,text:JSON.stringify({addons:[...m],indent:b,wikilint:u,ESLint:p.get("ESLint"),Stylelint:p.get("Stylelint")}),summary:d("save-summary")};(await he).postWithToken("csrf",o).then(()=>{mw.notify(H("save-success"),{type:"success"})},ye)}}};(async()=>{let e={action:"query",prop:"revisions",titles:pe,rvprop:"content",rvlimit:1};(await he).get(e).then(t=>{let{query:{pages:[i]}}=t;if(i!=null&&i.revisions){let n=JSON.parse(i.revisions[0].content);for(let o of A)n[o]&&p.set(o,n[o]);if(n.wikilint&&Object.assign(u,n.wikilint),n.addons){m.clear();for(let o of n.addons)m.add(o)}n.indent&&localStorage.setItem(L,n.indent)}},ye)})();var be=async e=>{if(!mw.loader.getState("ext.wikiEditor")){m.delete("wikiEditor"),mw.notify(d("no-wikiEditor"),{type:"error"});return}if(await mw.loader.using("ext.wikiEditor"),!e.data("wikiEditorContext")){if(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 Je="2.5",Qe=["autocompletion"];mw.loader.load(`${F}/${x}/mediawiki.min.css`,"text/css");$.valHooks.textarea={get(e){let t=g.get(e);return t!=null&&t.visible?t.view.state.doc.toString():e.value},set(e,t){let i=g.get(e);i!=null&&i.visible?i.setContent(t):e.value=t}};var O={},Me=e=>!e.closest("#cm-preference"),R=class R extends ve{constructor(t,i,n,o){var s,a;(s=g.get(t))!=null&&s.visible||(super(t,i,o),this.ns=n,g.set(t,this),mw.loader.getState("jquery.textSelection")==="ready"&&$(t).data("jquery.textSelection",K),Me(t)&&(mw.hook("wiki-codemirror6").fire(this),t.id==="wpTextbox1"&&((a=t.form)==null||a.addEventListener("submit",()=>{let l=document.querySelector("#wpScrolltop");l&&(l.value=String(this.view.scrollDOM.scrollTop))}))))}toggle(t=!this.visible){super.toggle(t),$(this.textarea).data("jquery.textSelection",t&&K)}async getLinter(t){let i=await super.getLinter(t);return O[this.lang]=i,i}async defaultLint(t,i=this.ns){if(!t){this.lint();return}let{lang:n}=this,o=p.get("ESLint"),s=p.get("Stylelint"),a;if(typeof i=="number"?n==="mediawiki"&&(i===10||i===828||i===2)?a={include:!0}:n==="javascript"?a={env:{browser:!0,es2024:!0,jquery:!0},globals:{mw:"readonly",mediaWiki:"readonly",OO:"readonly"},...i===8||i===2300?{parserOptions:{ecmaVersion:8}}:{},...o}:n==="css"&&s&&(a=s):a=i,n in O)a&&await this.getLinter(a);else{if(n==="mediawiki"){let l=mw.config.get("wgUserLanguage");["zh","zh-hans","zh-cn","zh-sg","zh-my"].includes(l)?a={...a,i18n:"zh-hans"}:["zh-hant","zh-tw","zh-hk","zh-mo"].includes(l)&&(a={...a,i18n:"zh-hant"})}if(await this.getLinter(a),n==="mediawiki"){let[l,r]=await Promise.all([J(),wikiparse.getConfig()]);wikiparse.setConfig(le(r,l))}}O[n]&&(n==="mediawiki"?this.lint(async l=>(await O[n](l)).filter(({rule:r,severity:c})=>Number(u[r])>+(c==="warning"))):this.lint(O[n]))}prefer(t){super.prefer(t);let i=Array.isArray(t)?o=>t.includes(o):o=>t[o],n=i("lint");if(n!==void 0&&this.defaultLint(n),de(this,i("openLinks")),!Array.isArray(t))for(let[o,s]of Object.entries(t))m[s?"add":"delete"](o)}static async fromTextArea(t,i,n){var l;if(m.has("wikiEditor")&&Me(t)&&await be($(t)),!i&&n===void 0){let{wgAction:r,wgNamespaceNumber:c,wgPageContentModel:f}=mw.config.get();r==="edit"||r==="submit"?(n=c,i=c===274?"html":f.toLowerCase()):(await mw.loader.using("oojs-ui-windows"),i=(l=await OO.ui.prompt(d("contentmodel"))||void 0)==null?void 0:l.toLowerCase()),i&&i in xe&&(i=xe[i])}let o=i==="mediawiki"||i==="html",s=new R(t,o?void 0:i,n),a=localStorage.getItem(L);if(o){let r;if(mw.config.get("wgServerName")==="zh.moegirl.org.cn")if(mw.config.exists("wikilintConfig"))r=mw.config.get("extCodeMirrorConfig");else{let c=await(await fetch(`${F}/npm/wikiparser-node@browser/config/moegirl.json`)).json();mw.config.set("wikilintConfig",c),r=ve.getMwConfig(c),mw.config.set("extCodeMirrorConfig",r)}else r=await J();s.setLanguage(i,r)}return s.prefer([...m]),a&&s.setIndent(a),s}};R.version=C;var v=R,xe={"sanitized-css":"css",js:"javascript",scribunto:"lua",wikitext:"mediawiki"};document.body.addEventListener("click",e=>{e.target instanceof HTMLTextAreaElement&&e.shiftKey&&!g.has(e.target)&&(e.preventDefault(),v.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(F)]),mw.hook("wiki-codemirror6").add(ie),mw.util.addPortletLink(e[mw.config.get("skin")]||"p-cactions","#",d("title"),"cm-settings").addEventListener("click",t=>{t.preventDefault();let i=[...document.querySelectorAll(".cm-editor + textarea")];ke(i.map(n=>g.get(n)))}),te(Je,Qe)})();Object.assign(window,{CodeMirror6:v});export{v as CodeMirror};
|
|
1
|
+
var Oe=Object.create;var G=Object.defineProperty;var Ce=Object.getOwnPropertyDescriptor;var Ee=Object.getOwnPropertyNames;var Se=Object.getPrototypeOf,Te=Object.prototype.hasOwnProperty;var Pe=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var je=(e,t,i,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Ee(t))!Te.call(e,s)&&s!==i&&G(e,s,{get:()=>t[s],enumerable:!(n=Ce(t,s))||n.enumerable});return e};var Ae=(e,t,i)=>(i=e!=null?Oe(Se(e)):{},je(t||!e||!e.__esModule?G(i,"default",{value:e,enumerable:!0}):i,e));var ge=Pe(P=>{"use strict";Object.defineProperty(P,"__esModule",{value:!0});P.rules=void 0;P.rules=["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"]});import{CodeMirror6 as ve,CDN as F}from"https://testingcf.jsdelivr.net/npm/@bhsd/codemirror-mediawiki@2.7.0/dist/main.min.js";var L="npm/@bhsd/codemirror-mediawiki@2.7.0",E=L.slice(L.lastIndexOf("@")+1),{vendor:$e,userAgent:Re,maxTouchPoints:ze,platform:We}=navigator,N=$e.includes("Apple Computer")&&(Re.includes("Mobile/")||ze>2)||We.includes("Mac"),Z="codemirror-mediawiki-i18n",Ie={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"},I=Ie[mw.config.get("wgUserLanguage")]||"en",h=e=>JSON.parse(String(localStorage.getItem(e))),k=(e,t)=>{localStorage.setItem(e,JSON.stringify(t))},y=h(Z)||{},{version:H}=y,ee=async e=>{if(y.lang!==I||H!==E)try{Object.assign(y,await(await fetch(`${e}/${L}/i18n/${I}.json`)).json()),k(Z,y)}catch(t){mw.notify(d("i18n-failed",I),{type:"error"}),console.error(t)}for(let[t,i]of Object.entries(y))t.endsWith("-mac")?N&&mw.messages.set(`cm-mw-${t.slice(0,-4)}`,i):mw.messages.set(`cm-mw-${t}`,i)},d=(e,...t)=>mw.msg(`cm-mw-${e}`,...t);function S(e,t){return mw.message(`cm-mw-${e}`)[t?"parse":"parseDom"]()}var X=e=>e.split(".",2).map(Number),Y=async(e,...t)=>{let i=$("<p>",{html:d(e,...t)});return await mw.notify(i,{type:"success",autoHideSeconds:"long"}),i},te=async(e,t)=>{let i;if(!H)i=await Y("welcome");else if(t.length>0){let[n,s]=X(e),[a,r]=X(H);(a<n||a===n&&r<s)&&(i=await Y("welcome-addons",E,String(t.length),t.map(l=>`<li>${S(`addon-${l}`,!0)}</li>`).join("")))}i==null||i.find("#settings").click(n=>{n.preventDefault(),document.getElementById("cm-settings").dispatchEvent(new MouseEvent("click"))})},ie=e=>{let t={};for(let[i,n]of Object.entries(y))i.startsWith("phrase-")&&(t[i.slice(7).replace(/-/gu," ")]=n);e.localize(t)};var se=mw.loader.getState("ext.CodeMirror")!==null,He=mw.loader.getState("ext.CodeMirror.data")?"ext.CodeMirror.data":"ext.CodeMirror",D=h("InPageEditMwConfig")||{},ae=`${mw.config.get("wgServerName")}${mw.config.get("wgScriptPath")}`,T=D[ae],ne=Number(T==null?void 0:T.time)>Date.now()-86400*1e3*30,J=(e,t,i)=>{let n=e.filter(t).filter(({"case-sensitive":a})=>a!==i).flatMap(({aliases:a,name:r,"case-sensitive":l})=>a.map(o=>({alias:(l?o:o.toLowerCase()).replace(/:$/u,""),name:r}))),s={};for(let{alias:a,name:r}of n)s[a]=r;return s},oe=(e,t)=>[!0,!1].map(i=>J(e,t,i)),re=e=>{mw.config.set("extCodeMirrorConfig",e)},Q=async()=>{se&&!ne&&await mw.loader.using(He);let e=mw.config.get("extCodeMirrorConfig");!e&&ne&&({config:e}=T,re(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:s,functionhooks:a,variables:r}}=await new mw.Api().get({meta:"siteinfo",siprop:["general","magicwords",...e&&!t?[]:["extensiontags","functionhooks","variables"]],formatversion:"2"}),l=new Set(["msg","raw","msgnw","subst","safesubst"]);if(e&&!t){let{functionSynonyms:[o]}=e;"subst"in o||Object.assign(o,J(n,({name:c})=>l.has(c)))}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 c of s)e.tags[c.slice(1,-1)]=!0;let o=new Set([...a,...r,...l]);e.functionSynonyms=oe(n,({name:c})=>o.has(c)),e.doubleUnderscore=oe(n,({aliases:c})=>c.some(p=>/^__.+__$/u.test(p)))}return e.img=J(n,({name:o})=>o.startsWith("img_")),e.variants=i?i.map(({code:o})=>o):[],e.nsid=mw.config.get("wgNamespaceIds"),re(e),D[ae]={config:e,time:Date.now()},k("InPageEditMwConfig",D),e},le=(e,t)=>{if(mw.config.exists("wikilintConfig"))return mw.config.get("wikilintConfig");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(s=>s.slice(2,-2))),variants:t.variants,protocol:t.urlProtocols.replace(/\\:/gu,":")};if([i.parserFunction[0]]=t.functionSynonyms,!se)for(let[n,s]of Object.entries(t.functionSynonyms[0]))n.startsWith("#")||(i.parserFunction[0][`#${n}`]=s);i.parserFunction[1]=[...Object.keys(t.functionSynonyms[1]),"="];for(let[n,s]of Object.entries(t.img))i.img[n]=s.slice(4);return i};var Ne=N?"metaKey":"ctrlKey",De=/-template-name|-link-pagename/u,K=new WeakMap;function _(e){return e==null?void 0:e.name.replace(/_+/gu," ").trim()}var ce=e=>{if(K.has(e))return K.get(e);let t=i=>{if(!i[Ne])return;let{view:n}=e,s=e.getNodeAt(n.posAtCoords(i));if(!s||!De.test(s.name))return;i.preventDefault();let a=_(s),r=s,l=s;for(;_(r.prevSibling)===a;)r=r.prevSibling;for(;_(l.nextSibling)===a;)l=l.nextSibling;let o=n.state.sliceDoc(r.from,l.to).trim();o.startsWith("/")&&(o=`:${mw.config.get("wgPageName")}${o}`),open(new mw.Title(o,a.includes("-template-name")?10:0).getUrl(void 0),"_blank")};return K.set(e,t),t},de=(e,t)=>{let{view:{contentDOM:i}}=e;t?(mw.loader.load("mediawiki.Title"),i.addEventListener("click",ce(e)),i.style.setProperty("--codemirror-cursor","pointer")):t===!1&&(i.removeEventListener("click",ce(e)),i.style.removeProperty("--codemirror-cursor"))};var u=new WeakMap,b=e=>u.get(e[0]),q={getContents(){return b(this).view.state.doc.toString()},setContents(e){let t=b(this),{view:{scrollDOM:i}}=t,{scrollTop:n}=i;return t.setContent(e),i.scrollTop=n,this},getSelection(){let{view:{state:e}}=b(this),{selection:{main:{from:t,to:i}}}=e;return e.sliceDoc(t,i)},setSelection({start:e,end:t=e}){return b(this).view.dispatch({selection:{anchor:e,head:t}}),this},replaceSelection(e){let{view:t}=b(this);return t.dispatch({selection:t.state.selection.asSingle()}),t.dispatch(t.state.replaceSelection(e)),this},getCaretPosition(e){let{view:{state:{selection:{main:{from:t,to:i,head:n}}}}}=b(this);return e!=null&&e.startAndEnd?[t,i]:n},scrollToCaretPosition(){return b(this).scrollTo(),this}};var ue=Ae(ge());var fe="codemirror-mediawiki-addons",we="codemirror-mediawiki-wikilint",z=["ESLint","Stylelint"],v=mw.config.get("wgUserName"),pe=v&&`User:${v}/codemirror-mediawiki.json`;var O="codemirror-mediawiki-indent",g=new Set(h(fe)),m=h(we)||{},w=new Map(z.map(e=>[e,h(`codemirror-mediawiki-${e}`)])),j,V,A,R,f=localStorage.getItem(O)||"",U={},me=new Map,ye=(e,t)=>{let i=e==="http"||e==="okay-but-empty"?`MediaWiki API request failed: ${e}`:$("<ul>",{html:t.errors.map(({html:n})=>$("<li>",{html:n}))});mw.notify(i,{type:"error",autoHideSeconds:"long"})},he=(async()=>{if(v)return await mw.loader.using("mediawiki.api"),new mw.Api({parameters:{errorformat:"html",formatversion:"2"}})})(),Je=(async()=>{if(!v)return;let e={action:"query",prop:"revisions",titles:pe,rvprop:"content",rvlimit:1};(await he).get(e).then(t=>{let{query:{pages:[i]}}=t;if(i!=null&&i.revisions){let n=JSON.parse(i.revisions[0].content);for(let s of z)n[s]&&w.set(s,n[s]);if(n.wikilint&&Object.assign(m,n.wikilint),n.addons){g.clear();for(let s of n.addons)g.add(s)}n.indent&&localStorage.setItem(O,n.indent)}},ye)})(),ke=async e=>{if(await mw.loader.using(["oojs-ui-windows","oojs-ui-widgets","oojs-ui.styles.icons-content","mediawiki.jqueryMsg"]),await Je,j)A.setValue([...g]),R.setValue(f);else{j=new OO.ui.MessageDialog({id:"cm-preference"});let i=new OO.ui.WindowManager;i.$element.appendTo(document.body),i.addWindows([j]),V=new OO.ui.IndexLayout;let n=new OO.ui.TabPanelLayout("main",{label:d("title")}),s=new OO.ui.TabPanelLayout("wikilint",{label:"WikiLint"}),a={};for(let o of z){let c=w.get(o);U[o]=new OO.ui.MultilineTextInputWidget({value:c?JSON.stringify(c,null,f||" "):""});let p=new OO.ui.FieldLayout(U[o],{label:d(`${o}-config`),align:"top"}),x=new OO.ui.TabPanelLayout(o,{label:o,$content:p.$element});x.on("active",Le=>{let[B]=x.$element.find("textarea");Le&&!u.has(B)&&M.fromTextArea(B,"json")}),a[o]=x}V.addTabPanels([n,s,...Object.values(a)],0),A=new OO.ui.CheckboxMultiselectInputWidget({options:[{disabled:!0},...Object.keys(y).filter(o=>o!=="addon-indent"&&o.startsWith("addon-")&&!o.endsWith("-mac")).map(o=>({data:o.slice(6),label:S(o),disabled:o==="addon-wikiEditor"&&!mw.loader.getState("ext.wikiEditor")||o==="addon-save"&&!v}))],value:[...g]}),R=new OO.ui.TextInputWidget({value:f,placeholder:"\\t"});let r=new OO.ui.FieldLayout(A,{label:d("label"),align:"top"}),l=new OO.ui.FieldLayout(R,{label:d("addon-indent")});n.$element.append(r.$element,l.$element,$("<p>",{html:d("feedback","codemirror-mediawiki")})),s.$element.append(...ue.rules.map(o=>{let c=o==="no-arg"?"0":"1",p=new OO.ui.DropdownInputWidget({options:[{data:"0",label:d("wikilint-off")},{data:"1",label:d("wikilint-error")},{data:"2",label:d("wikilint-on")}],value:m[o]||c}),x=new OO.ui.FieldLayout(p,{label:o});return me.set(o,p),m[o]||(m[o]=c),x.$element}),$("<p>",{html:d("feedback","wikiparser-node")}))}let t=await j.open({message:V.$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 t=="object"&&t.action==="accept"){let i=f;f=R.getValue();let n=f!==i;if(n){for(let r of e)r==null||r.setIndent(f||" ");localStorage.setItem(O,f)}let s=A.getValue();if(s.length!==g.size||!s.every(r=>g.has(r))){n=!0,g.clear();for(let r of s)g.add(r);for(let r of e)r==null||r.prefer(s);k(fe,s)}for(let[r,l]of me){let o=l.getValue();n||(n=o!==m[r]),m[r]=o}k(we,m);let a=[];for(let r of z)try{let l=JSON.parse(U[r].getValue().trim()||"null");n||(n=JSON.stringify(l)!==JSON.stringify(w.get(r))),w.set(r,l),k(`codemirror-mediawiki-${r}`,l)}catch(l){a.push(r)}if(a.length>0&&OO.ui.alert(d("json-error",a.join(d("and")))),n&&v&&g.has("save")){let r={action:"edit",title:pe,text:JSON.stringify({addons:[...g],indent:f,wikilint:m,ESLint:w.get("ESLint"),Stylelint:w.get("Stylelint")}),summary:d("save-summary")};(await he).postWithToken("csrf",r).then(()=>{mw.notify(S("save-success"),{type:"success"})},ye)}}};var be=async e=>{if(!mw.loader.getState("ext.wikiEditor")){g.delete("wikiEditor"),mw.notify(d("no-wikiEditor"),{type:"error"});return}if(await mw.loader.using("ext.wikiEditor"),!e.data("wikiEditorContext")){if(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 Qe="2.7",Ke=["save"];mw.loader.load(`${F}/${L}/mediawiki.min.css`,"text/css");$.valHooks.textarea={get(e){let t=u.get(e);return t!=null&&t.visible?t.view.state.doc.toString():e.value},set(e,t){let i=u.get(e);i!=null&&i.visible?i.setContent(t):e.value=t}};var C={},Me=e=>!e.closest("#cm-preference"),W=class W extends ve{constructor(t,i,n,s){var a,r;if((a=u.get(t))!=null&&a.visible)throw new RangeError("The textarea has already been replaced by CodeMirror.");super(t,i,s),this.ns=n,u.set(t,this),mw.loader.getState("jquery.textSelection")==="ready"&&$(t).data("jquery.textSelection",q),Me(t)&&(mw.hook("wiki-codemirror6").fire(this),t.id==="wpTextbox1"&&((r=t.form)==null||r.addEventListener("submit",()=>{let l=document.querySelector("#wpScrolltop");l&&(l.value=String(this.view.scrollDOM.scrollTop))})))}toggle(t=!this.visible){super.toggle(t),$(this.textarea).data("jquery.textSelection",t&&q)}async getLinter(t){let i=await super.getLinter(t);return C[this.lang]=i,i}async defaultLint(t,i=this.ns){if(!t){this.lint();return}let{lang:n}=this,s=w.get("ESLint"),a=w.get("Stylelint"),r;if(typeof i=="number"?n==="mediawiki"&&(i===10||i===828||i===2)?r={include:!0}:n==="javascript"?r={env:{browser:!0,es2024:!0,jquery:!0},globals:{mw:"readonly",mediaWiki:"readonly",OO:"readonly"},...i===8||i===2300?{parserOptions:{ecmaVersion:8}}:{},...s}:n==="css"&&a&&(r=a):r=i,n in C)r&&await this.getLinter(r);else{if(n==="mediawiki"){let l=mw.config.get("wgUserLanguage");["zh","zh-hans","zh-cn","zh-sg","zh-my"].includes(l)?r={...r,i18n:"zh-hans"}:["zh-hant","zh-tw","zh-hk","zh-mo"].includes(l)&&(r={...r,i18n:"zh-hant"})}if(await this.getLinter(r),n==="mediawiki"){let[l,o]=await Promise.all([Q(),wikiparse.getConfig()]);wikiparse.setConfig(le(o,l))}}C[n]&&(n==="mediawiki"?this.lint(async l=>(await C[n](l)).filter(({rule:o,severity:c})=>Number(m[o])>+(c==="warning"))):this.lint(C[n]))}prefer(t){super.prefer(t);let i=Array.isArray(t)?s=>t.includes(s):s=>t[s],n=i("lint");if(n!==void 0&&this.defaultLint(n),de(this,i("openLinks")),!Array.isArray(t))for(let[s,a]of Object.entries(t))g[a?"add":"delete"](s)}static async fromTextArea(t,i,n){var l;if(g.has("wikiEditor")&&Me(t)&&await be($(t)),!i&&n===void 0){let{wgAction:o,wgNamespaceNumber:c,wgPageContentModel:p}=mw.config.get();o==="edit"||o==="submit"?(n=c,i=c===274?"html":p.toLowerCase()):(await mw.loader.using("oojs-ui-windows"),i=(l=await OO.ui.prompt(d("contentmodel"))||void 0)==null?void 0:l.toLowerCase()),i&&i in xe&&(i=xe[i])}let s=i==="mediawiki"||i==="html",a=new W(t,s?void 0:i,n),r=localStorage.getItem(O);if(s){let o;if(mw.config.get("wgServerName")==="zh.moegirl.org.cn")if(mw.config.exists("wikilintConfig"))o=mw.config.get("extCodeMirrorConfig");else{let c=await(await fetch(`${F}/npm/wikiparser-node@browser/config/moegirl.json`)).json();mw.config.set("wikilintConfig",c),o=ve.getMwConfig(c),mw.config.set("extCodeMirrorConfig",o)}else o=await Q();a.setLanguage(i,o)}return a.prefer([...g]),r&&a.setIndent(r),a}};W.version=E;var M=W,xe={"sanitized-css":"css",js:"javascript",scribunto:"lua",wikitext:"mediawiki"};document.body.addEventListener("click",e=>{e.target instanceof HTMLTextAreaElement&&e.shiftKey&&!u.has(e.target)&&(e.preventDefault(),M.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(F)]),mw.hook("wiki-codemirror6").add(ie),mw.util.addPortletLink(e[mw.config.get("skin")]||"p-cactions","#",d("title"),"cm-settings").addEventListener("click",t=>{t.preventDefault();let i=[...document.querySelectorAll(".cm-editor + textarea")];ke(i.map(n=>u.get(n)))}),te(Qe,Ke)})();Object.assign(window,{CodeMirror6:M});export{M as CodeMirror};
|
|
2
2
|
//# sourceMappingURL=mw.min.js.map
|
package/dist/mw.min.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../wikiparser-node/dist/base.js", "../mw/base.ts", "../mw/msg.ts", "../mw/config.ts", "../mw/openLinks.ts", "../mw/textSelection.ts", "../mw/preference.ts", "../mw/wikiEditor.ts"],
|
|
4
|
-
"sourcesContent": ["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.rules = void 0;\nexports.rules = [\n 'bold-header',\n 'format-leakage',\n 'fostered-content',\n 'h1',\n 'illegal-attr',\n 'insecure-style',\n 'invalid-gallery',\n 'invalid-imagemap',\n 'invalid-invoke',\n 'lonely-apos',\n 'lonely-bracket',\n 'lonely-http',\n 'nested-link',\n 'no-arg',\n 'no-duplicate',\n 'no-ignored',\n 'obsolete-attr',\n 'obsolete-tag',\n 'parsing-order',\n 'pipe-like',\n 'table-layout',\n 'tag-like',\n 'unbalanced-header',\n 'unclosed-comment',\n 'unclosed-quote',\n 'unclosed-table',\n 'unescaped',\n 'unknown-page',\n 'unmatched-tag',\n 'unterminated-url',\n 'url-encoding',\n 'var-anchor',\n 'void-ext',\n];\n", "import {CodeMirror6, CDN} from 'https://testingcf.jsdelivr.net/npm/@bhsd/codemirror-mediawiki@2.6.10/dist/main.min.js';\nimport {getMwConfig, getParserConfig} from './config';\nimport {openLinks} from './openLinks';\nimport {instances, textSelection} from './textSelection';\nimport {openPreference, prefs, indentKey, wikilintConfig, codeConfigs} from './preference';\nimport {msg, setI18N, welcome, REPO_CDN, curVersion, localize} from './msg';\nimport {wikiEditor} from './wikiEditor';\nimport type {Config} from 'wikiparser-node';\nimport type {Linter} from 'eslint';\nimport type {LintSource, MwConfig} from '../src/codemirror';\n\n// \u6BCF\u6B21\u65B0\u589E\u63D2\u4EF6\u90FD\u9700\u8981\u4FEE\u6539\u8FD9\u91CC\nconst baseVersion = '2.5',\n\taddons = ['autocompletion'];\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\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\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\tif (instances.get(textarea)?.visible) {\n\t\t\treturn;\n\t\t}\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\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) {\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\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\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 WikiDiagnostic[])\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\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\tif (!Array.isArray(extensions)) {\n\t\t\tfor (const [k, v] of Object.entries(extensions)) {\n\t\t\t\tprefs[v ? 'add' : 'delete'](k);\n\t\t\t}\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\tawait wikiEditor($(textarea));\n\t\t}\n\t\tif (!lang && ns === undefined) {\n\t\t\t/* eslint-disable no-param-reassign */\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\tif (lang && lang in langMap) {\n\t\t\t\tlang = langMap[lang];\n\t\t\t}\n\t\t\t/* eslint-enable no-param-reassign */\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\tlet config: MwConfig;\n\t\t\tif (mw.config.get('wgServerName') === 'zh.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);\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\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", "import type {CodeMirror} from './base';\n\nexport const REPO_CDN = 'npm/@bhsd/codemirror-mediawiki@2.6.10',\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// 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\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 * \u89E3\u6790I18N\u6D88\u606F\n * @param key \u6D88\u606F\u952E\uFF0C\u7701\u7565`cm-mw-`\u524D\u7F00\n */\nexport const parseMsg = (key: string): JQuery<HTMLElement> => mw.message(`cm-mw-${key}`).parseDom();\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 {setObject, getObject} from './msg';\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 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= getObject('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\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.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, val] of Object.entries(mwConfig.img!)) {\n\t\tconfig.img[key] = val.slice(4);\n\t}\n\treturn config;\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\tregex = /-template-name|-link-pagename/u,\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 * \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 = getName(node);\n\t\tlet prev = node,\n\t\t\tnext = node;\n\t\twhile (getName(prev.prevSibling!) === name) {\n\t\t\tprev = prev.prevSibling!;\n\t\t}\n\t\twhile (getName(next.nextSibling!) === 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\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\tconst cm = getInstance(this),\n\t\t\t{view: {scrollDOM}} = cm,\n\t\t\t{scrollTop} = scrollDOM;\n\t\tcm.setContent(content);\n\t\tscrollDOM.scrollTop = scrollTop;\n\t\treturn this;\n\t},\n\tgetSelection(this: JQuery<HTMLTextAreaElement>): string {\n\t\tconst {view: {state}} = getInstance(this),\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({selection: view.state.selection.asSingle()});\n\t\tview.dispatch(view.state.replaceSelection(value));\n\t\treturn this;\n\t},\n\tgetCaretPosition(this: JQuery<HTMLTextAreaElement>, option?: {startAndEnd?: boolean}): [number, number] | number {\n\t\tconst {view: {state: {selection: {main: {from, to, head}}}}} = getInstance(this);\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", "import {rules} from 'wikiparser-node/dist/base';\nimport {CodeMirror} from './base';\nimport {msg, parseMsg, i18n, setObject, getObject} from './msg';\nimport {instances} from './textSelection';\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 interface Preferences {\n\taddons?: string[];\n\tindent?: string;\n\twikilint?: Record<Rule, RuleState>;\n\tESLint?: unknown;\n\tStylelint?: unknown;\n}\n\nexport const indentKey = 'codemirror-mediawiki-indent',\n\tprefs = new Set<string>(getObject(storageKey) as string[] | null),\n\twikilintConfig = (getObject(wikilintKey) || {}) as Record<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\nconst enum RuleState {\n\toff = '0',\n\terror = '1',\n\ton = '2',\n}\n\nconst wikilintWidgets = new Map<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\tawait mw.loader.using('mediawiki.api');\n\treturn new mw.Api({parameters: {errorformat: 'html', formatversion: '2'}});\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\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\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\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\t\tfor (const [rule, dropdown] of wikilintWidgets) {\n\t\t\twikilintConfig[rule] = dropdown.getValue() as RuleState;\n\t\t}\n\t\tsetObject(wikilintKey, wikilintConfig);\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\tsetObject(storageKey, value);\n\t\tlocalStorage.setItem(indentKey, indent);\n\n\t\tif (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(async () => {\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\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\tif (json.addons) {\n\t\t\t\t\tprefs.clear();\n\t\t\t\t\tfor (const option of json.addons) {\n\t\t\t\t\t\tprefs.add(option);\n\t\t\t\t\t}\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}\n\t\t},\n\t\tapiErr,\n\t);\n})();\n", "import {msg} from './msg';\nimport {prefs} from './preference';\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\tprefs.delete('wikiEditor');\n\t\tvoid mw.notify(msg('no-wikiEditor'), {type: 'error'});\n\t\treturn;\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": ["require_base", "__commonJSMin", "exports", "CodeMirror6", "CDN", "REPO_CDN", "curVersion", "vendor", "userAgent", "maxTouchPoints", "platform", "isMac", "storageKey", "languages", "lang", "getObject", "key", "setObject", "value", "i18n", "version", "setI18N", "CDN", "e", "msg", "k", "v", "args", "parseMsg", "parseVersion", "notify", "$p", "welcome", "baseVersion", "addons", "notification", "baseMajor", "baseMinor", "major", "minor", "addon", "localize", "cm", "obj", "USING_LOCAL", "DATA_MODULE", "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", "variants", "magicwords", "extensiontags", "functionhooks", "variables", "others", "insensitive", "tag", "functions", "code", "setObject", "getParserConfig", "minConfig", "mwConfig", "
|
|
4
|
+
"sourcesContent": ["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.rules = void 0;\nexports.rules = [\n 'bold-header',\n 'format-leakage',\n 'fostered-content',\n 'h1',\n 'illegal-attr',\n 'insecure-style',\n 'invalid-gallery',\n 'invalid-imagemap',\n 'invalid-invoke',\n 'lonely-apos',\n 'lonely-bracket',\n 'lonely-http',\n 'nested-link',\n 'no-arg',\n 'no-duplicate',\n 'no-ignored',\n 'obsolete-attr',\n 'obsolete-tag',\n 'parsing-order',\n 'pipe-like',\n 'table-layout',\n 'tag-like',\n 'unbalanced-header',\n 'unclosed-comment',\n 'unclosed-quote',\n 'unclosed-table',\n 'unescaped',\n 'unknown-page',\n 'unmatched-tag',\n 'unterminated-url',\n 'url-encoding',\n 'var-anchor',\n 'void-ext',\n];\n", "import {CodeMirror6, CDN} from 'https://testingcf.jsdelivr.net/npm/@bhsd/codemirror-mediawiki@2.7.0/dist/main.min.js';\nimport {getMwConfig, getParserConfig} from './config';\nimport {openLinks} from './openLinks';\nimport {instances, textSelection} from './textSelection';\nimport {openPreference, prefs, indentKey, wikilintConfig, codeConfigs} from './preference';\nimport {msg, setI18N, welcome, REPO_CDN, curVersion, localize} from './msg';\nimport {wikiEditor} from './wikiEditor';\nimport type {Config} from 'wikiparser-node';\nimport type {Linter} from 'eslint';\nimport type {LintSource, MwConfig} from '../src/codemirror';\n\n// \u6BCF\u6B21\u65B0\u589E\u63D2\u4EF6\u90FD\u9700\u8981\u4FEE\u6539\u8FD9\u91CC\nconst baseVersion = '2.7',\n\taddons = ['save'];\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\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\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\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);\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\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) {\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\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\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 WikiDiagnostic[])\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\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\tif (!Array.isArray(extensions)) {\n\t\t\tfor (const [k, v] of Object.entries(extensions)) {\n\t\t\t\tprefs[v ? 'add' : 'delete'](k);\n\t\t\t}\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\tawait wikiEditor($(textarea));\n\t\t}\n\t\tif (!lang && ns === undefined) {\n\t\t\t/* eslint-disable no-param-reassign */\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\tif (lang && lang in langMap) {\n\t\t\t\tlang = langMap[lang];\n\t\t\t}\n\t\t\t/* eslint-enable no-param-reassign */\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\tlet config: MwConfig;\n\t\t\tif (mw.config.get('wgServerName') === 'zh.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);\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\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", "import type {CodeMirror} from './base';\n\nexport const REPO_CDN = 'npm/@bhsd/codemirror-mediawiki@2.7.0',\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// 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\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 * \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\treturn mw.message(`cm-mw-${key}`)[text ? 'parse' : '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 = $('<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 {setObject, getObject} from './msg';\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 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= getObject('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\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.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, val] of Object.entries(mwConfig.img!)) {\n\t\tconfig.img[key] = val.slice(4);\n\t}\n\treturn config;\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\tregex = /-template-name|-link-pagename/u,\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 * \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 = getName(node);\n\t\tlet prev = node,\n\t\t\tnext = node;\n\t\twhile (getName(prev.prevSibling!) === name) {\n\t\t\tprev = prev.prevSibling!;\n\t\t}\n\t\twhile (getName(next.nextSibling!) === 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\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\tconst cm = getInstance(this),\n\t\t\t{view: {scrollDOM}} = cm,\n\t\t\t{scrollTop} = scrollDOM;\n\t\tcm.setContent(content);\n\t\tscrollDOM.scrollTop = scrollTop;\n\t\treturn this;\n\t},\n\tgetSelection(this: JQuery<HTMLTextAreaElement>): string {\n\t\tconst {view: {state}} = getInstance(this),\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({selection: view.state.selection.asSingle()});\n\t\tview.dispatch(view.state.replaceSelection(value));\n\t\treturn this;\n\t},\n\tgetCaretPosition(this: JQuery<HTMLTextAreaElement>, option?: {startAndEnd?: boolean}): [number, number] | number {\n\t\tconst {view: {state: {selection: {main: {from, to, head}}}}} = getInstance(this);\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", "import {rules} from 'wikiparser-node/dist/base';\nimport {CodeMirror} from './base';\nimport {msg, parseMsg, i18n, setObject, getObject} from './msg';\nimport {instances} from './textSelection';\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<Rule, RuleState>;\n} & Record<codeKey, unknown>;\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<string>(getObject(storageKey) as string[] | null),\n\twikilintConfig = (getObject(wikilintKey) || {}) as Record<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<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\nconst 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\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\tif (json.addons) {\n\t\t\t\t\tprefs.clear();\n\t\t\t\t\tfor (const option of json.addons) {\n\t\t\t\t\t\tprefs.add(option);\n\t\t\t\t\t}\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}\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\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// \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// 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// \u4FDD\u5B58\u81F3\u7528\u6237\u5B50\u9875\u9762\n\t\tif (changed && user && 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", "import {msg} from './msg';\nimport {prefs} from './preference';\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\tprefs.delete('wikiEditor');\n\t\tvoid mw.notify(msg('no-wikiEditor'), {type: 'error'});\n\t\treturn;\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": ["require_base", "__commonJSMin", "exports", "CodeMirror6", "CDN", "REPO_CDN", "curVersion", "vendor", "userAgent", "maxTouchPoints", "platform", "isMac", "storageKey", "languages", "lang", "getObject", "key", "setObject", "value", "i18n", "version", "setI18N", "CDN", "e", "msg", "k", "v", "args", "parseMsg", "text", "parseVersion", "v", "notify", "key", "args", "$p", "msg", "welcome", "baseVersion", "addons", "notification", "version", "baseMajor", "baseMinor", "major", "minor", "curVersion", "addon", "parseMsg", "e", "localize", "cm", "obj", "k", "i18n", "USING_LOCAL", "DATA_MODULE", "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", "variants", "magicwords", "extensiontags", "functionhooks", "variables", "others", "insensitive", "tag", "functions", "code", "setObject", "getParserConfig", "minConfig", "mwConfig", "key", "val", "modKey", "isMac", "regex", "handlers", "getName", "node", "getHandler", "cm", "handler", "e", "view", "name", "prev", "next", "page", "openLinks", "on", "contentDOM", "instances", "getInstance", "$ele", "textSelection", "content", "cm", "scrollDOM", "scrollTop", "state", "from", "to", "start", "end", "value", "view", "option", "head", "import_base", "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", "page", "json", "key", "option", "openPreference", "editors", "windowManager", "panelMain", "msg", "panelWikilint", "panels", "codeField", "panel", "active", "textarea", "instances", "CodeMirror", "i18n", "parseMsg", "field", "indentField", "rule", "state", "dropdown", "f", "data", "oldIndent", "changed", "cm", "value", "setObject", "val", "jsonErrors", "config", "wikiEditor", "$textarea", "prefs", "msg", "config", "resolve", "baseVersion", "addons", "CDN", "REPO_CDN", "elem", "cm", "instances", "value", "linters", "isEditor", "textarea", "_CodeMirror", "CodeMirror6", "lang", "ns", "config", "_a", "_b", "textSelection", "scrollTop", "show", "opt", "linter", "on", "optOrNs", "eslint", "codeConfigs", "stylelint", "i18n", "mwConfig", "minConfig", "getMwConfig", "getParserConfig", "doc", "rule", "severity", "wikilintConfig", "extensions", "hasExtension", "ext", "hasLint", "openLinks", "k", "v", "prefs", "wikiEditor", "wgAction", "wgNamespaceNumber", "wgPageContentModel", "msg", "langMap", "isWiki", "indent", "indentKey", "parserConfig", "curVersion", "CodeMirror", "portletContainer", "setI18N", "localize", "e", "textareas", "openPreference", "welcome"]
|
|
7
7
|
}
|
package/i18n/en.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "2.
|
|
2
|
+
"version": "2.7.0",
|
|
3
3
|
"lang": "en",
|
|
4
4
|
"i18n-failed": "Failed to fetch the translation file in $1.",
|
|
5
5
|
"title": "CodeMirror Addons",
|
|
@@ -26,8 +26,8 @@
|
|
|
26
26
|
"addon-tagMatching": "Highlight matching/non-matching tags",
|
|
27
27
|
"addon-wikiEditor": "Load WikiEditor toolbar",
|
|
28
28
|
"no-wikiEditor": "WikiEditor is not available.",
|
|
29
|
-
"save-summary": "Update settings",
|
|
30
29
|
"save-success": "Settings saved on [[special:mypage/codemirror-mediawiki.json|user subpage]].",
|
|
30
|
+
"save-summary": "Update settings",
|
|
31
31
|
"welcome": "Welcome to <b>CodeMirror-MediaWiki</b>!<br>You can change your local settings <a id=\"settings\" href=\"#\">here</a>.",
|
|
32
32
|
"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>.",
|
|
33
33
|
"wikilint-error": "Error only",
|
package/i18n/zh-hans.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "2.
|
|
2
|
+
"version": "2.7.0",
|
|
3
3
|
"lang": "zh-hans",
|
|
4
4
|
"i18n-failed": "获取 $1 的语言文件失败。",
|
|
5
5
|
"title": "CodeMirror插件",
|
|
@@ -26,6 +26,7 @@
|
|
|
26
26
|
"addon-tagMatching": "高亮显示匹配和未匹配的标签",
|
|
27
27
|
"addon-wikiEditor": "加载WikiEditor工具栏",
|
|
28
28
|
"no-wikiEditor": "未找到WikiEditor扩展。",
|
|
29
|
+
"save-success": "设置保存至[[special:mypage/codemirror-mediawiki.json|用户子页面]]。",
|
|
29
30
|
"save-summary": "更新设置",
|
|
30
31
|
"welcome": "欢迎使用 <b>CodeMirror-MediaWiki</b>!<br>您可以点击 <a id=\"settings\" href=\"#\">这里</a> 更改本地设置。",
|
|
31
32
|
"welcome-addons": "<b>CodeMirror-MediaWiki</b> 已升级到 $1。新版本添加了 $2 个插件:<ul>$3</ul>您可以点击 <a id=\"settings\" href=\"#\">这里</a> 更新本地设置。",
|
package/i18n/zh-hant.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "2.
|
|
2
|
+
"version": "2.7.0",
|
|
3
3
|
"lang": "zh-hant",
|
|
4
4
|
"i18n-failed": "取得 $1 的語言檔案失敗。",
|
|
5
5
|
"title": "CodeMirror外掛程式",
|
|
@@ -22,10 +22,11 @@
|
|
|
22
22
|
"addon-lint": "語法檢查",
|
|
23
23
|
"addon-openLinks": "CTRL+點擊可打開內部連結或模板頁面",
|
|
24
24
|
"addon-openLinks-mac": "CMD+點擊可打開內部連結或模板頁面",
|
|
25
|
-
"addon-save": "將設定儲存至[[special:mypage/codemirror-mediawiki.json
|
|
25
|
+
"addon-save": "將設定儲存至[[special:mypage/codemirror-mediawiki.json|使用者子頁面]]",
|
|
26
26
|
"addon-tagMatching": "突出顯示匹配和未匹配的標籤",
|
|
27
27
|
"addon-wikiEditor": "載入WikiEditor工具列",
|
|
28
28
|
"no-wikiEditor": "未找到WikiEditor擴展。",
|
|
29
|
+
"save-success": "設定儲存至[[special:mypage/codemirror-mediawiki.json|使用者子頁面]]。",
|
|
29
30
|
"save-summary": "更新設定",
|
|
30
31
|
"welcome": "歡迎使用 <b>CodeMirror-MediaWiki</b>!<br>您可以點擊 <a id=\"settings\" href=\"#\">這裡</a> 更改本地設定。",
|
|
31
32
|
"welcome-addons": "<b>CodeMirror-MediaWiki</b> 已升級到 $1。新版本添加了 $2 個外掛程式:<ul>$3</ul>您可以點擊 <a id=\"settings\" href=\"#\">這裡</a> 更新本地設定。",
|
package/mw/base.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {CodeMirror6, CDN} from 'https://testingcf.jsdelivr.net/npm/@bhsd/codemirror-mediawiki@2.
|
|
1
|
+
import {CodeMirror6, CDN} from 'https://testingcf.jsdelivr.net/npm/@bhsd/codemirror-mediawiki@2.7.0/dist/main.min.js';
|
|
2
2
|
import {getMwConfig, getParserConfig} from './config';
|
|
3
3
|
import {openLinks} from './openLinks';
|
|
4
4
|
import {instances, textSelection} from './textSelection';
|
|
@@ -10,8 +10,8 @@ import type {Linter} from 'eslint';
|
|
|
10
10
|
import type {LintSource, MwConfig} from '../src/codemirror';
|
|
11
11
|
|
|
12
12
|
// 每次新增插件都需要修改这里
|
|
13
|
-
const baseVersion = '2.
|
|
14
|
-
addons = ['
|
|
13
|
+
const baseVersion = '2.7',
|
|
14
|
+
addons = ['save'];
|
|
15
15
|
|
|
16
16
|
mw.loader.load(`${CDN}/${REPO_CDN}/mediawiki.min.css`, 'text/css');
|
|
17
17
|
|
|
@@ -55,7 +55,7 @@ export class CodeMirror extends CodeMirror6 {
|
|
|
55
55
|
*/
|
|
56
56
|
constructor(textarea: HTMLTextAreaElement, lang?: string, ns?: number, config?: unknown) {
|
|
57
57
|
if (instances.get(textarea)?.visible) {
|
|
58
|
-
|
|
58
|
+
throw new RangeError('The textarea has already been replaced by CodeMirror.');
|
|
59
59
|
}
|
|
60
60
|
super(textarea, lang, config);
|
|
61
61
|
this.ns = ns;
|
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.
|
|
3
|
+
export const REPO_CDN = 'npm/@bhsd/codemirror-mediawiki@2.7.0',
|
|
4
4
|
curVersion = REPO_CDN.slice(REPO_CDN.lastIndexOf('@') + 1);
|
|
5
5
|
|
|
6
6
|
const {vendor, userAgent, maxTouchPoints, platform} = navigator;
|
|
@@ -66,8 +66,14 @@ export const msg = (key: string, ...args: string[]): string => mw.msg(`cm-mw-${k
|
|
|
66
66
|
/**
|
|
67
67
|
* 解析I18N消息
|
|
68
68
|
* @param key 消息键,省略`cm-mw-`前缀
|
|
69
|
+
* @param text 是否输出为文本
|
|
69
70
|
*/
|
|
70
|
-
|
|
71
|
+
function parseMsg(key: string): JQuery<HTMLElement>;
|
|
72
|
+
function parseMsg(key: string, text: true): string;
|
|
73
|
+
function parseMsg(key: string, text?: boolean): string | JQuery<HTMLElement> {
|
|
74
|
+
return mw.message(`cm-mw-${key}`)[text ? 'parse' : 'parseDom']();
|
|
75
|
+
}
|
|
76
|
+
export {parseMsg};
|
|
71
77
|
|
|
72
78
|
/**
|
|
73
79
|
* 解析版本号
|
|
@@ -103,7 +109,7 @@ export const welcome = async (baseVersion: string, addons: string[]): Promise<vo
|
|
|
103
109
|
'welcome-addons',
|
|
104
110
|
curVersion,
|
|
105
111
|
String(addons.length),
|
|
106
|
-
addons.map(addon => `<li>${
|
|
112
|
+
addons.map(addon => `<li>${parseMsg(`addon-${addon}`, true)}</li>`).join(''),
|
|
107
113
|
);
|
|
108
114
|
}
|
|
109
115
|
}
|
package/mw/preference.ts
CHANGED
|
@@ -12,12 +12,16 @@ const storageKey = 'codemirror-mediawiki-addons',
|
|
|
12
12
|
|
|
13
13
|
declare type codeKey = typeof codeKeys[number];
|
|
14
14
|
|
|
15
|
-
declare
|
|
15
|
+
declare type Preferences = {
|
|
16
16
|
addons?: string[];
|
|
17
17
|
indent?: string;
|
|
18
18
|
wikilint?: Record<Rule, RuleState>;
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
} & Record<codeKey, unknown>;
|
|
20
|
+
|
|
21
|
+
const enum RuleState {
|
|
22
|
+
off = '0',
|
|
23
|
+
error = '1',
|
|
24
|
+
on = '2',
|
|
21
25
|
}
|
|
22
26
|
|
|
23
27
|
export const indentKey = 'codemirror-mediawiki-indent',
|
|
@@ -31,15 +35,8 @@ let dialog: OO.ui.MessageDialog | undefined,
|
|
|
31
35
|
widget: OO.ui.CheckboxMultiselectInputWidget,
|
|
32
36
|
indentWidget: OO.ui.TextInputWidget,
|
|
33
37
|
indent = localStorage.getItem(indentKey) || '';
|
|
34
|
-
const widgets: Partial<Record<codeKey, OO.ui.MultilineTextInputWidget>> = {}
|
|
35
|
-
|
|
36
|
-
const enum RuleState {
|
|
37
|
-
off = '0',
|
|
38
|
-
error = '1',
|
|
39
|
-
on = '2',
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const wikilintWidgets = new Map<Rule, OO.ui.DropdownInputWidget>();
|
|
38
|
+
const widgets: Partial<Record<codeKey, OO.ui.MultilineTextInputWidget>> = {},
|
|
39
|
+
wikilintWidgets = new Map<Rule, OO.ui.DropdownInputWidget>();
|
|
43
40
|
|
|
44
41
|
/**
|
|
45
42
|
* 处理Api请求错误
|
|
@@ -55,8 +52,50 @@ const apiErr = (code: string, e: any): void => { // eslint-disable-line @typescr
|
|
|
55
52
|
};
|
|
56
53
|
|
|
57
54
|
const api = (async () => {
|
|
58
|
-
|
|
59
|
-
|
|
55
|
+
if (user) {
|
|
56
|
+
await mw.loader.using('mediawiki.api');
|
|
57
|
+
return new mw.Api({parameters: {errorformat: 'html', formatversion: '2'}});
|
|
58
|
+
}
|
|
59
|
+
return undefined;
|
|
60
|
+
})();
|
|
61
|
+
|
|
62
|
+
const loadJSON = (async () => {
|
|
63
|
+
if (!user) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const params: ApiQueryRevisionsParams = {
|
|
67
|
+
action: 'query',
|
|
68
|
+
prop: 'revisions',
|
|
69
|
+
titles: userPage,
|
|
70
|
+
rvprop: 'content',
|
|
71
|
+
rvlimit: 1,
|
|
72
|
+
};
|
|
73
|
+
(await api)!.get(params as Record<string, string>).then( // eslint-disable-line promise/prefer-await-to-then
|
|
74
|
+
res => {
|
|
75
|
+
const {query: {pages: [page]}} = res as MediaWikiResponse;
|
|
76
|
+
if (page?.revisions) {
|
|
77
|
+
const json: Preferences = JSON.parse(page.revisions[0]!.content);
|
|
78
|
+
for (const key of codeKeys) {
|
|
79
|
+
if (json[key]) {
|
|
80
|
+
codeConfigs.set(key, json[key]);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (json.wikilint) {
|
|
84
|
+
Object.assign(wikilintConfig, json.wikilint);
|
|
85
|
+
}
|
|
86
|
+
if (json.addons) {
|
|
87
|
+
prefs.clear();
|
|
88
|
+
for (const option of json.addons) {
|
|
89
|
+
prefs.add(option);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (json.indent) {
|
|
93
|
+
localStorage.setItem(indentKey, json.indent);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
apiErr,
|
|
98
|
+
);
|
|
60
99
|
})();
|
|
61
100
|
|
|
62
101
|
/**
|
|
@@ -70,6 +109,7 @@ export const openPreference = async (editors: (CodeMirror | undefined)[]): Promi
|
|
|
70
109
|
'oojs-ui.styles.icons-content',
|
|
71
110
|
'mediawiki.jqueryMsg',
|
|
72
111
|
]);
|
|
112
|
+
await loadJSON;
|
|
73
113
|
if (dialog) {
|
|
74
114
|
widget.setValue([...prefs] as unknown as string);
|
|
75
115
|
indentWidget.setValue(indent);
|
|
@@ -152,10 +192,45 @@ export const openPreference = async (editors: (CodeMirror | undefined)[]): Promi
|
|
|
152
192
|
size: 'medium',
|
|
153
193
|
}).closing as unknown as Promise<{action?: unknown} | undefined>);
|
|
154
194
|
if (typeof data === 'object' && data.action === 'accept') {
|
|
195
|
+
// 缩进
|
|
196
|
+
const oldIndent = indent;
|
|
197
|
+
indent = indentWidget.getValue(); // eslint-disable-line require-atomic-updates
|
|
198
|
+
let changed = indent !== oldIndent;
|
|
199
|
+
if (changed) {
|
|
200
|
+
for (const cm of editors) {
|
|
201
|
+
cm?.setIndent(indent || '\t');
|
|
202
|
+
}
|
|
203
|
+
localStorage.setItem(indentKey, indent);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// 插件
|
|
207
|
+
const value = widget.getValue() as unknown as string[];
|
|
208
|
+
if (value.length !== prefs.size || !value.every(option => prefs.has(option))) {
|
|
209
|
+
changed = true;
|
|
210
|
+
prefs.clear();
|
|
211
|
+
for (const option of value) {
|
|
212
|
+
prefs.add(option);
|
|
213
|
+
}
|
|
214
|
+
for (const cm of editors) {
|
|
215
|
+
cm?.prefer(value);
|
|
216
|
+
}
|
|
217
|
+
setObject(storageKey, value);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// WikiLint
|
|
221
|
+
for (const [rule, dropdown] of wikilintWidgets) {
|
|
222
|
+
const val = dropdown.getValue() as RuleState;
|
|
223
|
+
changed ||= val !== wikilintConfig[rule];
|
|
224
|
+
wikilintConfig[rule] = val;
|
|
225
|
+
}
|
|
226
|
+
setObject(wikilintKey, wikilintConfig);
|
|
227
|
+
|
|
228
|
+
// ESLint & Stylelint
|
|
155
229
|
const jsonErrors: string[] = [];
|
|
156
230
|
for (const key of codeKeys) {
|
|
157
231
|
try {
|
|
158
232
|
const config = JSON.parse(widgets[key]!.getValue().trim() || 'null');
|
|
233
|
+
changed ||= JSON.stringify(config) !== JSON.stringify(codeConfigs.get(key));
|
|
159
234
|
codeConfigs.set(key, config);
|
|
160
235
|
setObject(`codemirror-mediawiki-${key}`, config);
|
|
161
236
|
} catch {
|
|
@@ -165,24 +240,9 @@ export const openPreference = async (editors: (CodeMirror | undefined)[]): Promi
|
|
|
165
240
|
if (jsonErrors.length > 0) {
|
|
166
241
|
void OO.ui.alert(msg('json-error', jsonErrors.join(msg('and'))));
|
|
167
242
|
}
|
|
168
|
-
for (const [rule, dropdown] of wikilintWidgets) {
|
|
169
|
-
wikilintConfig[rule] = dropdown.getValue() as RuleState;
|
|
170
|
-
}
|
|
171
|
-
setObject(wikilintKey, wikilintConfig);
|
|
172
|
-
const value = widget.getValue() as unknown as string[];
|
|
173
|
-
indent = indentWidget.getValue(); // eslint-disable-line require-atomic-updates
|
|
174
|
-
prefs.clear();
|
|
175
|
-
for (const option of value) {
|
|
176
|
-
prefs.add(option);
|
|
177
|
-
}
|
|
178
|
-
for (const cm of editors) {
|
|
179
|
-
cm?.prefer(value);
|
|
180
|
-
cm?.setIndent(indent || '\t');
|
|
181
|
-
}
|
|
182
|
-
setObject(storageKey, value);
|
|
183
|
-
localStorage.setItem(indentKey, indent);
|
|
184
243
|
|
|
185
|
-
|
|
244
|
+
// 保存至用户子页面
|
|
245
|
+
if (changed && user && prefs.has('save')) {
|
|
186
246
|
const params: ApiEditPageParams = {
|
|
187
247
|
action: 'edit',
|
|
188
248
|
title: userPage,
|
|
@@ -196,7 +256,7 @@ export const openPreference = async (editors: (CodeMirror | undefined)[]): Promi
|
|
|
196
256
|
summary: msg('save-summary'),
|
|
197
257
|
};
|
|
198
258
|
// eslint-disable-next-line promise/prefer-await-to-then
|
|
199
|
-
(await api)
|
|
259
|
+
(await api)!.postWithToken('csrf', params as Record<string, string>).then(
|
|
200
260
|
() => {
|
|
201
261
|
void mw.notify(parseMsg('save-success'), {type: 'success'});
|
|
202
262
|
},
|
|
@@ -205,39 +265,3 @@ export const openPreference = async (editors: (CodeMirror | undefined)[]): Promi
|
|
|
205
265
|
}
|
|
206
266
|
}
|
|
207
267
|
};
|
|
208
|
-
|
|
209
|
-
(async () => {
|
|
210
|
-
const params: ApiQueryRevisionsParams = {
|
|
211
|
-
action: 'query',
|
|
212
|
-
prop: 'revisions',
|
|
213
|
-
titles: userPage,
|
|
214
|
-
rvprop: 'content',
|
|
215
|
-
rvlimit: 1,
|
|
216
|
-
};
|
|
217
|
-
(await api).get(params as Record<string, string>).then( // eslint-disable-line promise/prefer-await-to-then
|
|
218
|
-
res => {
|
|
219
|
-
const {query: {pages: [page]}} = res as MediaWikiResponse;
|
|
220
|
-
if (page?.revisions) {
|
|
221
|
-
const json: Preferences = JSON.parse(page.revisions[0]!.content);
|
|
222
|
-
for (const key of codeKeys) {
|
|
223
|
-
if (json[key]) {
|
|
224
|
-
codeConfigs.set(key, json[key]);
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
if (json.wikilint) {
|
|
228
|
-
Object.assign(wikilintConfig, json.wikilint);
|
|
229
|
-
}
|
|
230
|
-
if (json.addons) {
|
|
231
|
-
prefs.clear();
|
|
232
|
-
for (const option of json.addons) {
|
|
233
|
-
prefs.add(option);
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
if (json.indent) {
|
|
237
|
-
localStorage.setItem(indentKey, json.indent);
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
},
|
|
241
|
-
apiErr,
|
|
242
|
-
);
|
|
243
|
-
})();
|