@bhsd/codemirror-mediawiki 2.2.0 → 2.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/mw.min.js CHANGED
@@ -1,2 +1,2 @@
1
- import{CodeMirror6 as oe,CDN as j}from"https://testingcf.jsdelivr.net/npm/@bhsd/codemirror-mediawiki@2.2.0/dist/main.min.js";var C=mw.loader.getState("ext.CodeMirror")!==null,K=mw.loader.getState("ext.CodeMirror.data")?"ext.CodeMirror.data":"ext.CodeMirror",M=JSON.parse(localStorage.getItem("InPageEditMwConfig"))||{},P=`${mw.config.get("wgServerName")}${mw.config.get("wgScriptPath")}`,w=M[P],A=Number(w==null?void 0:w.time)>Date.now()-86400*1e3*30,v=(e,t,i)=>{let o=e.filter(t).filter(({"case-sensitive":r})=>r!==i).flatMap(({aliases:r,name:s,"case-sensitive":c})=>r.map(a=>({alias:(c?a:a.toLowerCase()).replace(/:$/u,""),name:s}))),n={};for(let{alias:r,name:s}of o)n[r]=s;return n},z=(e,t)=>[!0,!1].map(i=>v(e,t,i)),I=e=>{mw.config.set("extCodeMirrorConfig",e)},L=async()=>{C&&!A&&await mw.loader.using(K);let e=mw.config.get("extCodeMirrorConfig");!e&&A&&({config:e}=w,I(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:o,extensiontags:n,functionhooks:r,variables:s}}=await new mw.Api().get({meta:"siteinfo",siprop:["general","magicwords",...e&&!t?[]:["extensiontags","functionhooks","variables"]],formatversion:"2"}),c=new Set(["msg","raw","msgnw","subst","safesubst"]);if(e&&!t){let{functionSynonyms:[a]}=e;"subst"in a||Object.assign(a,v(o,({name:l})=>c.has(l)))}else{e={tagModes:{tab:"text/mediawiki",indicator:"text/mediawiki",poem:"text/mediawiki",ref:"text/mediawiki",option:"text/mediawiki",combooption:"text/mediawiki",tabs:"text/mediawiki",poll:"text/mediawiki",gallery:"text/mediawiki"},tags:{},urlProtocols:mw.config.get("wgUrlProtocols")};for(let l of n)e.tags[l.slice(1,-1)]=!0;let a=new Set([...r,...s,...c]);e.functionSynonyms=z(o,({name:l})=>a.has(l)),e.doubleUnderscore=z(o,({aliases:l})=>l.some(U=>/^__.+__$/u.test(U)))}return e.img=v(o,({name:a})=>a.startsWith("img_")),e.variants=i?i.map(({code:a})=>a):[],e.nsid=mw.config.get("wgNamespaceIds"),I(e),M[P]={config:e,time:Date.now()},localStorage.setItem("InPageEditMwConfig",JSON.stringify(M)),e};var{vendor:F,userAgent:q,maxTouchPoints:V,platform:B}=navigator,G=F.includes("Apple Computer")&&(q.includes("Mobile/")||V>2)||B.includes("Mac")?"metaKey":"ctrlKey",u=".cm-mw-template-name, .cm-mw-link-pagename",T=function(e){if(!e[G])return;e.preventDefault();let t=this.textContent,{previousSibling:i,nextSibling:o}=this;for(;i&&(i.nodeType===Node.TEXT_NODE||i.matches(u));)t=i.textContent+t,{previousSibling:i}=i;for(;o&&(o.nodeType===Node.TEXT_NODE||o.matches(u));)t+=o.textContent,{nextSibling:o}=o;t=t.trim(),t.startsWith("/")&&(t=`:${mw.config.get("wgPageName")}${t}`),open(new mw.Title(t,this.classList.contains("cm-mw-template-name")?10:0).getUrl(void 0),"_blank")};var d=new WeakMap,m=e=>d.get(e[0]);function X(e){let{view:{state:{selection:{main:t}}}}=m(this);return e!=null&&e.startAndEnd?[t.from,t.to]:t.head}var S={getContents(){return m(this).view.state.doc.toString()},setContents(e){return m(this).setContent(e),this},getSelection(){let{view:{state:e}}=m(this);return e.sliceDoc(e.selection.main.from,e.selection.main.to)},setSelection({start:e,end:t}){let{view:i}=m(this);return i.dispatch({selection:{anchor:e,head:t!=null?t:e}}),i.focus(),this},replaceSelection(e){let{view:t}=m(this);return t.dispatch(t.state.replaceSelection(e)),this},getCaretPosition:X,scrollToCaretPosition(){return m(this).view.dispatch({scrollIntoView:!0}),this}};var Y="codemirror-mediawiki-i18n",ge=JSON.parse(localStorage.getItem(Y))||{},Z={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"},le=Z[mw.config.get("wgUserLanguage")]||"en";var g=(e,...t)=>mw.msg(`cm-mw-${e}`,...t);var E="codemirror-mediawiki-addons",b="codemirror-mediawiki-indent",ee=["allowMultipleSelections","bracketMatching","closeBrackets","highlightActiveLine","highlightSpecialChars","highlightWhitespace","highlightTrailingWhitespace","lint","openLinks","escape"],p,h,y,R,J,k=localStorage.getItem(b)||"",D=async(e,t)=>{if(await mw.loader.using(["oojs-ui-windows","oojs-ui.styles.icons-content"]),p)h.setValue([...e]),y.setValue(k);else{p=new OO.ui.MessageDialog;let o=new OO.ui.WindowManager;o.$element.appendTo(document.body),o.addWindows([p]),h=new OO.ui.CheckboxMultiselectInputWidget({options:ee.map(n=>({data:n,label:g(`addon-${n}`)})),value:[...e]}),R=new OO.ui.FieldLayout(h,{label:g("label"),align:"top"}),y=new OO.ui.TextInputWidget({placeholder:"\\t"}),J=new OO.ui.FieldLayout(y,{label:g("addon-indent"),notices:[g("notice")]})}let i=await p.open({title:g("title"),message:R.$element.add(J.$element).add($("<p>",{html:g("feedback")})),actions:[{action:"reject",label:mw.msg("ooui-dialog-message-reject")},{action:"accept",label:mw.msg("ooui-dialog-message-accept"),flags:"progressive"}],size:"medium"}).closing;if(typeof i=="object"&&i.action==="accept"){let o=h.getValue();k=y.getValue(),e.clear();for(let n of o)e.add(n);for(let n of t)n==null||n.prefer(o),n==null||n.setIndent(k||" ");localStorage.setItem(E,JSON.stringify(o)),localStorage.setItem(b,k)}};var W={'"':"quot","'":"apos","<":"lt",">":"gt","&":"amp"," ":"nbsp"},O=e=>t=>(f.replaceSelections(t,e),!0),te=O(e=>[...e].map(t=>{if(t in W)return`&${W[t]};`;let i=t.codePointAt(0);return i<256?`&#${i};`:`&#x${i.toString(16)};`}).join("")),ie=O(e=>{if(e.includes("%"))try{return decodeURIComponent(e)}catch(t){}return encodeURIComponent(e)}),ne=O(e=>{try{return decodeURIComponent(e.replace(/\.(?=[\da-f]{2})/giu,"%"))}catch(t){return e}}),N=[{key:"Mod-/",run:te},{key:"Mod-\\",run:ie},{key:"Shift-Mod-\\",run:ne}];var H="npm/@bhsd/codemirror-mediawiki@2.1.15";mw.loader.load(`${j}/${H}/mediawiki.min.css`,"text/css");$.valHooks.textarea={get(e){let t=d.get(e);return t!=null&&t.visible?t.view.state.doc.toString():e.value},set(e,t){let i=d.get(e);i!=null&&i.visible?i.setContent(t):e.value=t}};var x={},_=new Set(JSON.parse(localStorage.getItem(E)));mw.loader.addStyleTag(`.wikiEditor-ui-toolbar{z-index:7}${u}{cursor:var(--codemirror-cursor)}`);var f=class e extends oe{constructor(t,i,o,n){super(t,i,n),this.ns=o,d.set(t,this),mw.loader.getState("jquery.textSelection")==="ready"&&$(t).data("jquery.textSelection",S),mw.hook("wiki-codemirror6").fire(this)}toggle(t=!this.visible){super.toggle(t),$(this.textarea).data("jquery.textSelection",t&&S)}async getLinter(t){let i=await super.getLinter(t);return x[this.lang]=i,i}async defaultLint(t,i=this.ns){if(!t){this.lint();return}let{lang:o}=this,n;if(typeof i=="number"?o==="mediawiki"&&(i===10||i===828||i===2)?n={include:!0}:o==="javascript"&&(i===8||i===2300)&&(n={env:{browser:!0,es6:!0},parserOptions:{ecmaVersion:6}}):n=i,o in x)n&&await this.getLinter(n);else{if(o==="mediawiki"){let r=mw.config.get("wgUserLanguage");["zh","zh-hans","zh-cn","zh-sg","zh-my"].includes(r)?n={...n,i18n:"zh-hans"}:["zh-hant","zh-tw","zh-hk","zh-mo"].includes(r)&&(n={...n,i18n:"zh-hant"})}if(await this.getLinter(n),o==="mediawiki"){let r=await L(),s={...await wikiparse.getConfig(),ext:Object.keys(r.tags),namespaces:mw.config.get("wgFormattedNamespaces"),nsid:r.nsid,doubleUnderscore:r.doubleUnderscore.map(c=>Object.keys(c).map(a=>a.slice(2,-2))),variants:r.variants,protocol:r.urlProtocols.replace(/\\:/gu,":")};if([s.parserFunction[0]]=r.functionSynonyms,!C)for(let[c,a]of Object.entries(r.functionSynonyms[0]))c.startsWith("#")||(s.parserFunction[0][`#${c}`]=a);s.parserFunction[1]=[...Object.keys(r.functionSynonyms[1]),"="];for(let c of Object.keys(r.img))s.img[c]=r.img[c].slice(4);wikiparse.setConfig(s)}}x[o]&&this.lint(x[o])}prefer(t){super.prefer(t);let i=Array.isArray(t)?s=>t.includes(s):s=>t[s],o=i("openLinks"),n=i("lint"),r=i("escape");o?(mw.loader.load("mediawiki.Title"),$(this.view.contentDOM).on("click",u,T).css("--codemirror-cursor","pointer")):o===!1&&$(this.view.contentDOM).off("click",u,T).css("--codemirror-cursor",""),n!==void 0&&this.defaultLint(n),r?this.extraKeys(N):r===!1&&this.extraKeys([])}static async fromTextArea(t,i,o){let n=i==="mediawiki"||i==="html",r=new e(t,n?void 0:i,o),s=localStorage.getItem(b);if(n){let c=await L();r.setLanguage(i,c)}return r.prefer([..._]),s&&r.setIndent(s),r}},Q={"sanitized-css":"css",js:"javascript",scribunto:"lua",wikitext:"mediawiki"};document.body.addEventListener("click",e=>{e.target instanceof HTMLTextAreaElement&&e.shiftKey&&!d.has(e.target)&&(e.preventDefault(),(async()=>{var s;let{wgAction:t,wgNamespaceNumber:i,wgPageContentModel:o}=mw.config.get(),n,r;t==="edit"||t==="submit"?(r=i,n=i===274?"html":o.toLowerCase()):(await mw.loader.using("oojs-ui-windows"),n=(s=await OO.ui.prompt(g("contentmodel"))||void 0)==null?void 0:s.toLowerCase()),n&&n in Q&&(n=Q[n]),f.fromTextArea(e.target,n,r)})())});(async()=>{let e={minerva:"page-actions-overflow",moeskin:"ca-more-actions"};await mw.loader.using("mediawiki.util"),mw.util.addPortletLink(e[mw.config.get("skin")]||"p-cactions","#",g("title"),"cm-settings").addEventListener("click",t=>{t.preventDefault();let i=[...document.querySelectorAll(".cm-editor + textarea")];D(_,i.map(o=>d.get(o)))})})();Object.assign(window,{CodeMirror6:f});export{j as CDN,f as CodeMirror,H as REPO_CDN};
1
+ import{CodeMirror6 as ee,CDN as A}from"https://testingcf.jsdelivr.net/npm/@bhsd/codemirror-mediawiki@2.2.2/dist/main.min.js";var T=mw.loader.getState("ext.CodeMirror")!==null,F=mw.loader.getState("ext.CodeMirror.data")?"ext.CodeMirror.data":"ext.CodeMirror",M=JSON.parse(localStorage.getItem("InPageEditMwConfig"))||{},H=`${mw.config.get("wgServerName")}${mw.config.get("wgScriptPath")}`,f=M[H],P=Number(f==null?void 0:f.time)>Date.now()-86400*1e3*30,L=(e,t,i)=>{let o=e.filter(t).filter(({"case-sensitive":s})=>s!==i).flatMap(({aliases:s,name:r,"case-sensitive":c})=>s.map(a=>({alias:(c?a:a.toLowerCase()).replace(/:$/u,""),name:r}))),n={};for(let{alias:s,name:r}of o)n[s]=r;return n},I=(e,t)=>[!0,!1].map(i=>L(e,t,i)),j=e=>{mw.config.set("extCodeMirrorConfig",e)},C=async()=>{T&&!P&&await mw.loader.using(F);let e=mw.config.get("extCodeMirrorConfig");!e&&P&&({config:e}=f,j(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:o,extensiontags:n,functionhooks:s,variables:r}}=await new mw.Api().get({meta:"siteinfo",siprop:["general","magicwords",...e&&!t?[]:["extensiontags","functionhooks","variables"]],formatversion:"2"}),c=new Set(["msg","raw","msgnw","subst","safesubst"]);if(e&&!t){let{functionSynonyms:[a]}=e;"subst"in a||Object.assign(a,L(o,({name:g})=>c.has(g)))}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 g of n)e.tags[g.slice(1,-1)]=!0;let a=new Set([...s,...r,...c]);e.functionSynonyms=I(o,({name:g})=>a.has(g)),e.doubleUnderscore=I(o,({aliases:g})=>g.some(U=>/^__.+__$/u.test(U)))}return e.img=L(o,({name:a})=>a.startsWith("img_")),e.variants=i?i.map(({code:a})=>a):[],e.nsid=mw.config.get("wgNamespaceIds"),j(e),M[H]={config:e,time:Date.now()},localStorage.setItem("InPageEditMwConfig",JSON.stringify(M)),e};var{vendor:K,userAgent:V,maxTouchPoints:q,platform:G}=navigator,X=K.includes("Apple Computer")&&(V.includes("Mobile/")||q>2)||G.includes("Mac")?"metaKey":"ctrlKey",u=".cm-mw-template-name, .cm-mw-link-pagename",S=function(e){if(!e[X])return;e.preventDefault();let t=this.textContent,{previousSibling:i,nextSibling:o}=this;for(;i&&(i.nodeType===Node.TEXT_NODE||i.matches(u));)t=i.textContent+t,{previousSibling:i}=i;for(;o&&(o.nodeType===Node.TEXT_NODE||o.matches(u));)t+=o.textContent,{nextSibling:o}=o;t=t.trim(),t.startsWith("/")&&(t=`:${mw.config.get("wgPageName")}${t}`),open(new mw.Title(t,this.classList.contains("cm-mw-template-name")?10:0).getUrl(void 0),"_blank")};var d=new WeakMap,m=e=>d.get(e[0]);function B(e){let{view:{state:{selection:{main:t}}}}=m(this);return e!=null&&e.startAndEnd?[t.from,t.to]:t.head}var E={getContents(){return m(this).view.state.doc.toString()},setContents(e){return m(this).setContent(e),this},getSelection(){let{view:{state:e}}=m(this);return e.sliceDoc(e.selection.main.from,e.selection.main.to)},setSelection({start:e,end:t}){let{view:i}=m(this);return i.dispatch({selection:{anchor:e,head:t!=null?t:e}}),i.focus(),this},replaceSelection(e){let{view:t}=m(this);return t.dispatch(t.state.replaceSelection(e)),this},getCaretPosition:B,scrollToCaretPosition(){return m(this).view.dispatch({scrollIntoView:!0}),this}};var J="codemirror-mediawiki-i18n",Y={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"},O=Y[mw.config.get("wgUserLanguage")]||"en",D=async()=>{let e=JSON.parse(localStorage.getItem(J))||{};if(e.lang!==O||e.version!==w.split("@")[1].split(".",2).join("."))try{Object.assign(e,await(await fetch(`${A}/${w}/i18n/${O}.json`)).json()),localStorage.setItem(J,JSON.stringify(e))}catch(t){mw.notify(l("i18n-failed",O)),console.error(t)}for(let[t,i]of Object.entries(e))mw.messages.set(`cm-mw-${t}`,i)},l=(e,...t)=>mw.msg(`cm-mw-${e}`,...t);var z="codemirror-mediawiki-addons",k="codemirror-mediawiki-indent",Z=["allowMultipleSelections","bracketMatching","closeBrackets","highlightActiveLine","highlightSpecialChars","highlightWhitespace","highlightTrailingWhitespace","lint","openLinks","escape"],h,p,y,N,W,b=localStorage.getItem(k)||"",R=async(e,t)=>{if(await mw.loader.using(["oojs-ui-windows","oojs-ui.styles.icons-content"]),h)p.setValue([...e]),y.setValue(b);else{h=new OO.ui.MessageDialog;let o=new OO.ui.WindowManager;o.$element.appendTo(document.body),o.addWindows([h]),p=new OO.ui.CheckboxMultiselectInputWidget({options:Z.map(n=>({data:n,label:l(`addon-${n}`)})),value:[...e]}),N=new OO.ui.FieldLayout(p,{label:l("label"),align:"top"}),y=new OO.ui.TextInputWidget({placeholder:"\\t"}),W=new OO.ui.FieldLayout(y,{label:l("addon-indent"),notices:[l("notice")]})}let i=await h.open({title:l("title"),message:N.$element.add(W.$element).add($("<p>",{html:l("feedback")})),actions:[{action:"reject",label:mw.msg("ooui-dialog-message-reject")},{action:"accept",label:mw.msg("ooui-dialog-message-accept"),flags:"progressive"}],size:"medium"}).closing;if(typeof i=="object"&&i.action==="accept"){let o=p.getValue();b=y.getValue(),e.clear();for(let n of o)e.add(n);for(let n of t)n==null||n.prefer(o),n==null||n.setIndent(b||" ");localStorage.setItem(z,JSON.stringify(o)),localStorage.setItem(k,b)}};var w="npm/@bhsd/codemirror-mediawiki@2.2.2";mw.loader.load(`${A}/${w}/mediawiki.min.css`,"text/css");$.valHooks.textarea={get(e){let t=d.get(e);return t!=null&&t.visible?t.view.state.doc.toString():e.value},set(e,t){let i=d.get(e);i!=null&&i.visible?i.setContent(t):e.value=t}};var x={},_=new Set(JSON.parse(localStorage.getItem(z)));mw.loader.addStyleTag(`.wikiEditor-ui-toolbar{z-index:7}${u}{cursor:var(--codemirror-cursor)}`);var v=class e extends ee{constructor(t,i,o,n){super(t,i,n),this.ns=o,d.set(t,this),mw.loader.getState("jquery.textSelection")==="ready"&&$(t).data("jquery.textSelection",E),mw.hook("wiki-codemirror6").fire(this)}toggle(t=!this.visible){super.toggle(t),$(this.textarea).data("jquery.textSelection",t&&E)}async getLinter(t){let i=await super.getLinter(t);return x[this.lang]=i,i}async defaultLint(t,i=this.ns){if(!t){this.lint();return}let{lang:o}=this,n;if(typeof i=="number"?o==="mediawiki"&&(i===10||i===828||i===2)?n={include:!0}:o==="javascript"&&(i===8||i===2300)&&(n={env:{browser:!0,es6:!0},parserOptions:{ecmaVersion:6}}):n=i,o in x)n&&await this.getLinter(n);else{if(o==="mediawiki"){let s=mw.config.get("wgUserLanguage");["zh","zh-hans","zh-cn","zh-sg","zh-my"].includes(s)?n={...n,i18n:"zh-hans"}:["zh-hant","zh-tw","zh-hk","zh-mo"].includes(s)&&(n={...n,i18n:"zh-hant"})}if(await this.getLinter(n),o==="mediawiki"){let s=await C(),r={...await wikiparse.getConfig(),ext:Object.keys(s.tags),namespaces:mw.config.get("wgFormattedNamespaces"),nsid:s.nsid,doubleUnderscore:s.doubleUnderscore.map(c=>Object.keys(c).map(a=>a.slice(2,-2))),variants:s.variants,protocol:s.urlProtocols.replace(/\\:/gu,":")};if([r.parserFunction[0]]=s.functionSynonyms,!T)for(let[c,a]of Object.entries(s.functionSynonyms[0]))c.startsWith("#")||(r.parserFunction[0][`#${c}`]=a);r.parserFunction[1]=[...Object.keys(s.functionSynonyms[1]),"="];for(let c of Object.keys(s.img))r.img[c]=s.img[c].slice(4);wikiparse.setConfig(r)}}x[o]&&this.lint(x[o])}prefer(t){super.prefer(t);let i=Array.isArray(t)?s=>t.includes(s):s=>t[s],o=i("openLinks"),n=i("lint");o?(mw.loader.load("mediawiki.Title"),$(this.view.contentDOM).on("click",u,S).css("--codemirror-cursor","pointer")):o===!1&&$(this.view.contentDOM).off("click",u,S).css("--codemirror-cursor",""),n!==void 0&&this.defaultLint(n)}static async fromTextArea(t,i,o){let n=i==="mediawiki"||i==="html",s=new e(t,n?void 0:i,o),r=localStorage.getItem(k);if(n){let c=await C();s.setLanguage(i,c)}return s.prefer([..._]),r&&s.setIndent(r),s}},Q={"sanitized-css":"css",js:"javascript",scribunto:"lua",wikitext:"mediawiki"};document.body.addEventListener("click",e=>{e.target instanceof HTMLTextAreaElement&&e.shiftKey&&!d.has(e.target)&&(e.preventDefault(),(async()=>{var r;let{wgAction:t,wgNamespaceNumber:i,wgPageContentModel:o}=mw.config.get(),n,s;t==="edit"||t==="submit"?(s=i,n=i===274?"html":o.toLowerCase()):(await mw.loader.using("oojs-ui-windows"),n=(r=await OO.ui.prompt(l("contentmodel"))||void 0)==null?void 0:r.toLowerCase()),n&&n in Q&&(n=Q[n]),v.fromTextArea(e.target,n,s)})())});(async()=>{let e={minerva:"page-actions-overflow",moeskin:"ca-more-actions"};await Promise.all([mw.loader.using("mediawiki.util"),D()]),mw.util.addPortletLink(e[mw.config.get("skin")]||"p-cactions","#",l("title"),"cm-settings").addEventListener("click",t=>{t.preventDefault();let i=[...document.querySelectorAll(".cm-editor + textarea")];R(_,i.map(o=>d.get(o)))})})();Object.assign(window,{CodeMirror6:v});export{A as CDN,v as CodeMirror,w as REPO_CDN};
2
2
  //# sourceMappingURL=mw.min.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../mw/base.ts", "../mw/config.ts", "../mw/openLinks.ts", "../mw/textSelection.ts", "../mw/msg.ts", "../mw/preference.ts", "../mw/escape.ts"],
4
- "sourcesContent": ["import {CodeMirror6, CDN} from 'https://testingcf.jsdelivr.net/npm/@bhsd/codemirror-mediawiki@2.2.0/dist/main.min.js';\nimport {getMwConfig, USING_LOCAL} from './config';\nimport {openLinks, pageSelector} from './openLinks';\nimport {instances, textSelection} from './textSelection';\nimport {openPreference, storageKey, indentKey} from './preference';\nimport {msg} from './msg';\nimport {keymap} from './escape';\nimport type {Config} from 'wikilint';\nimport type {LintSource} from '../src/codemirror';\n\nconst REPO_CDN = 'npm/@bhsd/codemirror-mediawiki@2.1.15';\nexport {CDN, REPO_CDN};\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\tprefs = new Set<string>(JSON.parse(localStorage.getItem(storageKey)!) as string[] | null);\n\nmw.loader.addStyleTag(`.wikiEditor-ui-toolbar{z-index:7}${pageSelector}{cursor:var(--codemirror-cursor)}`);\n\nexport class CodeMirror extends CodeMirror6 {\n\tns;\n\n\t/**\n\t * @param textarea \u6587\u672C\u6846\n\t * @param lang \u8BED\u8A00\n\t * @param ns \u547D\u540D\u7A7A\u95F4\n\t * @param config \u8BED\u8A00\u8BBE\u7F6E\n\t */\n\tconstructor(textarea: HTMLTextAreaElement, lang?: string, ns?: number, config?: unknown) {\n\t\tsuper(textarea, lang, config);\n\t\tthis.ns = ns;\n\t\tinstances.set(textarea, this);\n\t\tif (mw.loader.getState('jquery.textSelection') === 'ready') {\n\t\t\t$(textarea).data('jquery.textSelection', textSelection);\n\t\t}\n\t\tmw.hook('wiki-codemirror6').fire(this);\n\t}\n\n\toverride toggle(show = !this.visible): void {\n\t\tsuper.toggle(show);\n\t\t$(this.textarea).data('jquery.textSelection', show && textSelection);\n\t}\n\n\toverride async getLinter(opt?: Record<string, unknown>): Promise<LintSource | undefined> {\n\t\tconst linter = await super.getLinter(opt);\n\t\tlinters[this.lang] = linter;\n\t\treturn linter;\n\t}\n\n\t/**\n\t * \u6DFB\u52A0\u6216\u79FB\u9664\u9ED8\u8BA4 linter\n\t * @param on \u662F\u5426\u6DFB\u52A0\n\t * @param opt linter\u9009\u9879\n\t * @param ns \u547D\u540D\u7A7A\u95F4\n\t */\n\tdefaultLint(on: boolean, opt: Record<string, unknown>): Promise<void>;\n\tdefaultLint(on: boolean, ns?: number): Promise<void>;\n\tasync defaultLint(on: boolean, optOrNs: Record<string, unknown> | number | undefined = this.ns): Promise<void> {\n\t\tif (!on) {\n\t\t\tthis.lint();\n\t\t\treturn;\n\t\t}\n\t\tconst {lang} = this;\n\t\tlet opt: Record<string, unknown> | undefined;\n\t\tif (typeof optOrNs === 'number') {\n\t\t\tif (lang === 'mediawiki' && (optOrNs === 10 || optOrNs === 828 || optOrNs === 2)) {\n\t\t\t\topt = {include: true};\n\t\t\t} else if (lang === 'javascript' && (optOrNs === 8 || optOrNs === 2300)) {\n\t\t\t\topt = {\n\t\t\t\t\tenv: {browser: true, es6: true},\n\t\t\t\t\tparserOptions: {ecmaVersion: 6},\n\t\t\t\t};\n\t\t\t}\n\t\t} else {\n\t\t\topt = optOrNs;\n\t\t}\n\t\tif (!(lang in linters)) {\n\t\t\tif (lang === 'mediawiki') {\n\t\t\t\tconst i18n = mw.config.get('wgUserLanguage');\n\t\t\t\tif (['zh', 'zh-hans', 'zh-cn', 'zh-sg', 'zh-my'].includes(i18n)) {\n\t\t\t\t\topt = {...opt, i18n: 'zh-hans'};\n\t\t\t\t} else if (['zh-hant', 'zh-tw', 'zh-hk', 'zh-mo'].includes(i18n)) {\n\t\t\t\t\topt = {...opt, i18n: 'zh-hant'};\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait this.getLinter(opt);\n\t\t\tif (lang === 'mediawiki') {\n\t\t\t\tconst mwConfig = await getMwConfig(),\n\t\t\t\t\tconfig: Config = {\n\t\t\t\t\t\t...await wikiparse.getConfig(),\n\t\t\t\t\t\text: Object.keys(mwConfig.tags),\n\t\t\t\t\t\tnamespaces: mw.config.get('wgFormattedNamespaces'),\n\t\t\t\t\t\tnsid: mwConfig.nsid,\n\t\t\t\t\t\tdoubleUnderscore: mwConfig.doubleUnderscore.map(\n\t\t\t\t\t\t\tobj => Object.keys(obj).map(s => s.slice(2, -2)),\n\t\t\t\t\t\t) as [string[], string[]],\n\t\t\t\t\t\tvariants: mwConfig.variants!,\n\t\t\t\t\t\tprotocol: mwConfig.urlProtocols.replace(/\\\\:/gu, ':'),\n\t\t\t\t\t};\n\t\t\t\t[config.parserFunction[0]] = mwConfig.functionSynonyms;\n\t\t\t\tif (!USING_LOCAL) {\n\t\t\t\t\tfor (const [key, val] of Object.entries(mwConfig.functionSynonyms[0])) {\n\t\t\t\t\t\tif (!key.startsWith('#')) {\n\t\t\t\t\t\t\tconfig.parserFunction[0][`#${key}`] = val;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconfig.parserFunction[1] = [\n\t\t\t\t\t...Object.keys(mwConfig.functionSynonyms[1]),\n\t\t\t\t\t'=',\n\t\t\t\t];\n\t\t\t\tfor (const key of Object.keys(mwConfig.img!)) {\n\t\t\t\t\tconfig.img[key] = mwConfig.img![key]!.slice(4);\n\t\t\t\t}\n\t\t\t\twikiparse.setConfig(config);\n\t\t\t}\n\t\t} else if (opt) {\n\t\t\tawait this.getLinter(opt);\n\t\t}\n\t\tif (linters[lang]) {\n\t\t\tthis.lint(linters[lang]);\n\t\t}\n\t}\n\n\t/** @override */\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\thasOpenLinks = hasExtension('openLinks'),\n\t\t\thasLint = hasExtension('lint'),\n\t\t\thasEscape = hasExtension('escape');\n\t\tif (hasOpenLinks) {\n\t\t\tmw.loader.load('mediawiki.Title');\n\t\t\t$(this.view.contentDOM).on('click', pageSelector, openLinks).css('--codemirror-cursor', 'pointer');\n\t\t} else if (hasOpenLinks === false) {\n\t\t\t$(this.view.contentDOM).off('click', pageSelector, openLinks).css('--codemirror-cursor', '');\n\t\t}\n\t\tif (hasLint !== undefined) {\n\t\t\tvoid this.defaultLint(hasLint);\n\t\t}\n\t\tif (hasEscape) {\n\t\t\tthis.extraKeys(keymap);\n\t\t} else if (hasEscape === false) {\n\t\t\tthis.extraKeys([]);\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\tconst isWiki = lang === 'mediawiki' || lang === 'html',\n\t\t\tcm = new CodeMirror(textarea, isWiki ? undefined : lang, ns),\n\t\t\tindent = localStorage.getItem(indentKey);\n\t\tif (isWiki) {\n\t\t\tconst config = await getMwConfig();\n\t\t\tcm.setLanguage(lang, config);\n\t\t}\n\t\tcm.prefer([...prefs]);\n\t\tif (indent) {\n\t\t\tcm.setIndent(indent);\n\t\t}\n\t\treturn cm;\n\t}\n}\n\nconst langMap: Record<string, string> = {\n\t'sanitized-css': 'css',\n\tjs: 'javascript',\n\tscribunto: 'lua',\n\twikitext: 'mediawiki',\n};\ndocument.body.addEventListener('click', e => {\n\tif (e.target instanceof HTMLTextAreaElement && e.shiftKey && !instances.has(e.target)) {\n\t\te.preventDefault();\n\t\t(async () => {\n\t\t\tconst {wgAction, wgNamespaceNumber, wgPageContentModel} = mw.config.get();\n\t\t\tlet lang: string | undefined,\n\t\t\t\tns: number | undefined;\n\t\t\tif (wgAction === 'edit' || wgAction === 'submit') {\n\t\t\t\tns = wgNamespaceNumber;\n\t\t\t\tlang = wgNamespaceNumber === 274 ? 'html' : wgPageContentModel.toLowerCase();\n\t\t\t} else {\n\t\t\t\tawait mw.loader.using('oojs-ui-windows');\n\t\t\t\tlang = (await OO.ui.prompt(msg('contentmodel')) || undefined)?.toLowerCase();\n\t\t\t}\n\t\t\tif (lang && lang in langMap) {\n\t\t\t\tlang = langMap[lang];\n\t\t\t}\n\t\t\tvoid CodeMirror.fromTextArea(e.target as HTMLTextAreaElement, lang, ns);\n\t\t})();\n\t}\n});\n\n(async () => {\n\tconst portletContainer: Record<string, string> = {\n\t\tminerva: 'page-actions-overflow',\n\t\tmoeskin: 'ca-more-actions',\n\t};\n\tawait mw.loader.using('mediawiki.util');\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(prefs, textareas.map(textarea => instances.get(textarea)));\n\t});\n})();\n\nObject.assign(window, {CodeMirror6: CodeMirror});\n", "import type {MwConfig} from '../src/mediawiki';\n\ndeclare interface MagicWord {\n\tname: string;\n\taliases: string[];\n\t'case-sensitive': boolean;\n}\n\nexport const USING_LOCAL = mw.loader.getState('ext.CodeMirror') !== null;\n\n// \u548C\u672C\u5730\u7F13\u5B58\u6709\u5173\u7684\u5E38\u6570\nconst DATA_MODULE = mw.loader.getState('ext.CodeMirror.data') ? 'ext.CodeMirror.data' : 'ext.CodeMirror',\n\tALL_SETTINGS_CACHE: Record<string, {time: number, config: MwConfig}>\n\t\t= JSON.parse(localStorage.getItem('InPageEditMwConfig')!) || {},\n\tSITE_ID = `${mw.config.get('wgServerName')}${mw.config.get('wgScriptPath')}`,\n\tSITE_SETTINGS = ALL_SETTINGS_CACHE[SITE_ID],\n\tVALID = Number(SITE_SETTINGS?.time) > Date.now() - 86_400 * 1000 * 30;\n\n/**\n * \u5C06\u9B54\u672F\u5B57\u4FE1\u606F\u8F6C\u6362\u4E3ACodeMirror\u63A5\u53D7\u7684\u8BBE\u7F6E\n * @param magicWords \u5B8C\u6574\u9B54\u672F\u5B57\u5217\u8868\n * @param rule \u8FC7\u6EE4\u51FD\u6570\n * @param flip \u662F\u5426\u53CD\u5411\u7B5B\u9009\u5BF9\u5927\u5C0F\u5199\u654F\u611F\u7684\u9B54\u672F\u5B57\n */\nconst getConfig = (\n\tmagicWords: MagicWord[],\n\trule: (word: MagicWord) => boolean,\n\tflip?: boolean,\n): Record<string, string> => {\n\tconst words = magicWords.filter(rule).filter(({'case-sensitive': i}) => i !== flip)\n\t\t\t.flatMap(({aliases, name, 'case-sensitive': i}) => aliases.map(alias => ({\n\t\t\t\talias: (i ? alias : alias.toLowerCase()).replace(/:$/u, ''),\n\t\t\t\tname,\n\t\t\t}))),\n\t\tobj: Record<string, string> = {};\n\tfor (const {alias, name} of words) {\n\t\tobj[alias] = name;\n\t}\n\treturn obj;\n};\n\n/**\n * \u5C06\u9B54\u672F\u5B57\u4FE1\u606F\u8F6C\u6362\u4E3ACodeMirror\u63A5\u53D7\u7684\u8BBE\u7F6E\n * @param magicWords \u5B8C\u6574\u9B54\u672F\u5B57\u5217\u8868\n * @param rule \u8FC7\u6EE4\u51FD\u6570\n */\nconst getConfigPair = (\n\tmagicWords: MagicWord[],\n\trule: (word: MagicWord) => boolean,\n): [Record<string, string>, Record<string, string>] => [true, false]\n\t.map(bool => getConfig(magicWords, rule, bool)) as [Record<string, string>, Record<string, string>];\n\n/** \u5C06\u8BBE\u7F6E\u4FDD\u5B58\u5230mw.config */\nconst setConfig = (config: MwConfig): void => {\n\tmw.config.set('extCodeMirrorConfig', config);\n};\n\n/** \u52A0\u8F7DCodeMirror\u7684mediawiki\u6A21\u5757\u9700\u8981\u7684\u8BBE\u7F6E */\nexport const getMwConfig = async (): Promise<MwConfig> => {\n\tif (USING_LOCAL && !VALID) { // \u53EA\u5728localStorage\u8FC7\u671F\u65F6\u624D\u4F1A\u91CD\u65B0\u52A0\u8F7Dext.CodeMirror.data\n\t\tawait mw.loader.using(DATA_MODULE);\n\t}\n\n\tlet config = mw.config.get('extCodeMirrorConfig') as MwConfig | null;\n\tif (!config && VALID) {\n\t\t({config} = SITE_SETTINGS!);\n\t\tsetConfig(config);\n\t}\n\tconst isIPE = config && Object.values(config.functionSynonyms[0]).includes(true as unknown as string);\n\t// \u60C5\u5F621\uFF1Aconfig\u5DF2\u66F4\u65B0\uFF0C\u53EF\u80FD\u6765\u81EAlocalStorage\n\tif (config?.img && config.variants && !isIPE) {\n\t\treturn {\n\t\t\t...config,\n\t\t\tnsid: mw.config.get('wgNamespaceIds'),\n\t\t};\n\t}\n\n\t// \u4EE5\u4E0B\u60C5\u5F62\u5747\u9700\u8981\u53D1\u9001API\u8BF7\u6C42\n\t// \u60C5\u5F622\uFF1AlocalStorage\u672A\u8FC7\u671F\u4F46\u4E0D\u5305\u542B\u65B0\u8BBE\u7F6E\n\t// \u60C5\u5F623\uFF1A\u65B0\u52A0\u8F7D\u7684 ext.CodeMirror.data\n\t// \u60C5\u5F624\uFF1A`config === null`\n\tawait mw.loader.using('mediawiki.api');\n\tconst {\n\t\tquery: {general: {variants}, magicwords, extensiontags, functionhooks, variables},\n\t}: {\n\t\tquery: {\n\t\t\tgeneral: {variants?: {code: string}[]};\n\t\t\tmagicwords: MagicWord[];\n\t\t\textensiontags: string[];\n\t\t\tfunctionhooks: string[];\n\t\t\tvariables: string[];\n\t\t};\n\t} = await new mw.Api().get({\n\t\tmeta: 'siteinfo',\n\t\tsiprop: [\n\t\t\t'general',\n\t\t\t'magicwords',\n\t\t\t...config && !isIPE ? [] : ['extensiontags', 'functionhooks', 'variables'],\n\t\t],\n\t\tformatversion: '2',\n\t}) as any; // eslint-disable-line @typescript-eslint/no-explicit-any\n\tconst others = new Set(['msg', 'raw', 'msgnw', 'subst', 'safesubst']);\n\n\t// \u5148\u5904\u7406\u9B54\u672F\u5B57\u548C\u72B6\u6001\u5F00\u5173\n\tif (config && !isIPE) { // \u60C5\u5F622\u62163\n\t\tconst {functionSynonyms: [insensitive]} = config;\n\t\tif (!('subst' in insensitive)) {\n\t\t\tObject.assign(insensitive, getConfig(magicwords, ({name}) => others.has(name)));\n\t\t}\n\t} else { // \u60C5\u5F624\uFF1A`config === null`\n\t\t// @ts-expect-error incomplete properties\n\t\tconfig = {\n\t\t\ttagModes: {\n\t\t\t\ttab: 'text/mediawiki',\n\t\t\t\tindicator: 'text/mediawiki',\n\t\t\t\tpoem: 'text/mediawiki',\n\t\t\t\tref: 'text/mediawiki',\n\t\t\t\toption: 'text/mediawiki',\n\t\t\t\tcombooption: 'text/mediawiki',\n\t\t\t\ttabs: 'text/mediawiki',\n\t\t\t\tpoll: 'text/mediawiki',\n\t\t\t\tgallery: 'text/mediawiki',\n\t\t\t},\n\t\t\ttags: {},\n\t\t\turlProtocols: mw.config.get('wgUrlProtocols'),\n\t\t};\n\t\tfor (const tag of extensiontags) {\n\t\t\tconfig!.tags[tag.slice(1, -1)] = true;\n\t\t}\n\t\tconst functions = new Set([\n\t\t\t...functionhooks,\n\t\t\t...variables,\n\t\t\t...others,\n\t\t]);\n\t\tconfig!.functionSynonyms = getConfigPair(magicwords, ({name}) => functions.has(name));\n\t\tconfig!.doubleUnderscore = getConfigPair(\n\t\t\tmagicwords,\n\t\t\t({aliases}) => aliases.some(alias => /^__.+__$/u.test(alias)),\n\t\t);\n\t}\n\tconfig!.img = getConfig(magicwords, ({name}) => name.startsWith('img_'));\n\tconfig!.variants = variants ? variants.map(({code}) => code) : [];\n\tconfig!.nsid = mw.config.get('wgNamespaceIds');\n\tsetConfig(config!);\n\tALL_SETTINGS_CACHE[SITE_ID] = {config: config!, time: Date.now()};\n\tlocalStorage.setItem('InPageEditMwConfig', JSON.stringify(ALL_SETTINGS_CACHE));\n\treturn config!;\n};\n", "const {vendor, userAgent, maxTouchPoints, platform} = navigator,\n\tmodKey = vendor.includes('Apple Computer') && (userAgent.includes('Mobile/') || maxTouchPoints > 2)\n\t|| platform.includes('Mac')\n\t\t? 'metaKey'\n\t\t: 'ctrlKey';\n\nexport const pageSelector = '.cm-mw-template-name, .cm-mw-link-pagename';\n\n/** \u70B9\u51FB\u65F6\u5728\u65B0\u9875\u9762\u6253\u5F00\u94FE\u63A5\u3001\u6A21\u677F\u7B49 */\nexport const openLinks = function(this: HTMLElement, e: JQuery.ClickEvent): void {\n\tif (!e[modKey]) {\n\t\treturn;\n\t}\n\te.preventDefault();\n\tlet page = this.textContent!,\n\t\t{previousSibling, nextSibling} = this;\n\twhile (\n\t\tpreviousSibling\n\t\t&& (previousSibling.nodeType === Node.TEXT_NODE || (previousSibling as Element).matches(pageSelector))\n\t) {\n\t\tpage = previousSibling.textContent! + page;\n\t\t({previousSibling} = previousSibling);\n\t}\n\twhile (\n\t\tnextSibling\n\t\t&& (nextSibling.nodeType === Node.TEXT_NODE || (nextSibling as Element).matches(pageSelector))\n\t) {\n\t\tpage += nextSibling.textContent!;\n\t\t({nextSibling} = nextSibling);\n\t}\n\tpage = page.trim();\n\tif (page.startsWith('/')) {\n\t\tpage = `:${mw.config.get('wgPageName')}${page}`;\n\t}\n\topen(new mw.Title(page, this.classList.contains('cm-mw-template-name') ? 10 : 0).getUrl(undefined), '_blank');\n};\n", "import type {CodeMirror} from './base';\n\nexport const instances = new WeakMap<HTMLTextAreaElement, CodeMirror>();\n\nconst getInstance = ($ele: JQuery<HTMLTextAreaElement>): CodeMirror => instances.get($ele[0]!)!;\n\nfunction getCaretPosition(this: JQuery<HTMLTextAreaElement>, option: {startAndEnd: true}): [number, number];\nfunction getCaretPosition(this: JQuery<HTMLTextAreaElement>, option?: {startAndEnd?: false}): number;\nfunction getCaretPosition(\n\tthis: JQuery<HTMLTextAreaElement>,\n\toption?: {startAndEnd?: boolean},\n): [number, number] | number {\n\tconst {view: {state: {selection: {main}}}} = getInstance(this);\n\treturn option?.startAndEnd ? [main.from, main.to] : main.head;\n}\n\n/**\n * jQuery.textSelection overrides for CodeMirror.\n * See jQuery.textSelection.js for method documentation\n */\nexport const textSelection = {\n\tgetContents(this: JQuery<HTMLTextAreaElement>): string {\n\t\treturn getInstance(this).view.state.doc.toString();\n\t},\n\tsetContents(this: JQuery<HTMLTextAreaElement>, content: string): JQuery<HTMLTextAreaElement> {\n\t\tgetInstance(this).setContent(content);\n\t\treturn this;\n\t},\n\tgetSelection(this: JQuery<HTMLTextAreaElement>): string {\n\t\tconst {view: {state}} = getInstance(this);\n\t\treturn state.sliceDoc(state.selection.main.from, state.selection.main.to);\n\t},\n\tsetSelection(\n\t\tthis: JQuery<HTMLTextAreaElement>,\n\t\t{start, end}: {start: number, end?: number},\n\t): JQuery<HTMLTextAreaElement> {\n\t\tconst {view} = getInstance(this);\n\t\tview.dispatch({\n\t\t\tselection: {anchor: start, head: end ?? start},\n\t\t});\n\t\tview.focus();\n\t\treturn this;\n\t},\n\treplaceSelection(this: JQuery<HTMLTextAreaElement>, value: string): JQuery<HTMLTextAreaElement> {\n\t\tconst {view} = getInstance(this);\n\t\tview.dispatch(view.state.replaceSelection(value));\n\t\treturn this;\n\t},\n\tgetCaretPosition,\n\tscrollToCaretPosition(this: JQuery<HTMLTextAreaElement>): JQuery<HTMLTextAreaElement> {\n\t\tgetInstance(this).view.dispatch({scrollIntoView: true});\n\t\treturn this;\n\t},\n};\n", "import {CDN, REPO_CDN} from './base';\n\nconst storageKey = 'codemirror-mediawiki-i18n',\n\ti18n: Record<string, string> = JSON.parse(localStorage.getItem(storageKey)!) || {},\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/** \u52A0\u8F7D I18N */\nexport const setI18N = async (): Promise<void> => {\n\tif (i18n['lang'] !== lang || i18n['version'] !== REPO_CDN.split('@')[1]!.split('.', 2).join('.')) {\n\t\tObject.assign(i18n, await (await fetch(`${CDN}/${REPO_CDN}/i18n/${lang}.json`)).json());\n\t\tlocalStorage.setItem(storageKey, JSON.stringify(i18n));\n\t}\n\tfor (const [k, v] of Object.entries(i18n)) {\n\t\tmw.messages.set(`cm-mw-${k}`, v);\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", "import {msg} from './msg';\nimport type {CodeMirror} from './base';\n\nexport const storageKey = 'codemirror-mediawiki-addons',\n\tindentKey = 'codemirror-mediawiki-indent';\n\nconst options = [\n\t'allowMultipleSelections',\n\t'bracketMatching',\n\t'closeBrackets',\n\t'highlightActiveLine',\n\t'highlightSpecialChars',\n\t'highlightWhitespace',\n\t'highlightTrailingWhitespace',\n\t'lint',\n\t'openLinks',\n\t'escape',\n];\n\n// OOUI\u7EC4\u4EF6\nlet dialog: OO.ui.MessageDialog | undefined,\n\twidget: OO.ui.CheckboxMultiselectInputWidget,\n\tindentWidget: OO.ui.TextInputWidget,\n\tfield: OO.ui.FieldLayout,\n\tindentField: OO.ui.FieldLayout,\n\tindent = localStorage.getItem(indentKey) || '';\n\n/**\n * \u6253\u5F00\u8BBE\u7F6E\u5BF9\u8BDD\u6846\n * @param addons \u9884\u8BBE\u7684\u6269\u5C55\n * @param editors CodeMirror\u5B9E\u4F8B\n */\nexport const openPreference = async (addons: Set<string>, editors: (CodeMirror | undefined)[]): Promise<void> => {\n\tawait mw.loader.using(['oojs-ui-windows', 'oojs-ui.styles.icons-content']);\n\tif (dialog) {\n\t\twidget.setValue([...addons] as unknown as string);\n\t\tindentWidget.setValue(indent);\n\t} else {\n\t\tdialog = new OO.ui.MessageDialog();\n\t\tconst windowManager = new OO.ui.WindowManager();\n\t\twindowManager.$element.appendTo(document.body);\n\t\twindowManager.addWindows([dialog]);\n\t\twidget = new OO.ui.CheckboxMultiselectInputWidget({\n\t\t\toptions: options.map(option => ({data: option, label: msg(`addon-${option}`)})),\n\t\t\tvalue: [...addons] as unknown as string,\n\t\t});\n\t\tfield = new OO.ui.FieldLayout(widget, {\n\t\t\tlabel: msg('label'),\n\t\t\talign: 'top',\n\t\t});\n\t\tindentWidget = new OO.ui.TextInputWidget({placeholder: '\\\\t'});\n\t\tindentField = new OO.ui.FieldLayout(indentWidget, {\n\t\t\tlabel: msg('addon-indent'),\n\t\t\tnotices: [msg('notice')],\n\t\t});\n\t}\n\n\tconst data = await (dialog.open({\n\t\ttitle: msg('title'),\n\t\tmessage: field.$element.add(indentField.$element).add($('<p>', {html: msg('feedback')})),\n\t\tactions: [\n\t\t\t{action: 'reject', label: mw.msg('ooui-dialog-message-reject')},\n\t\t\t{action: 'accept', label: mw.msg('ooui-dialog-message-accept'), flags: 'progressive'},\n\t\t],\n\t\tsize: 'medium',\n\t}).closing as unknown as Promise<{action?: unknown} | undefined>);\n\tif (typeof data === 'object' && data.action === 'accept') {\n\t\tconst value = widget.getValue() as unknown as string[];\n\t\tindent = indentWidget.getValue(); // eslint-disable-line require-atomic-updates\n\t\taddons.clear();\n\t\tfor (const option of value) {\n\t\t\taddons.add(option);\n\t\t}\n\t\tfor (const cm of editors) {\n\t\t\tcm?.prefer(value);\n\t\t\tcm?.setIndent(indent || '\\t');\n\t\t}\n\t\tlocalStorage.setItem(storageKey, JSON.stringify(value));\n\t\tlocalStorage.setItem(indentKey, indent);\n\t}\n};\n", "import {CodeMirror} from './base';\nimport type {KeyBinding, Command} from '@codemirror/view';\n\nconst entity = {'\"': 'quot', \"'\": 'apos', '<': 'lt', '>': 'gt', '&': 'amp', ' ': 'nbsp'};\nconst convert = (func: (str: string) => string): Command => (view): true => {\n\t\tCodeMirror.replaceSelections(view, func);\n\t\treturn true;\n\t},\n\tescapeHTML = convert(str => [...str].map(c => {\n\t\tif (c in entity) {\n\t\t\treturn `&${entity[c as keyof typeof entity]};`;\n\t\t}\n\t\tconst code = c.codePointAt(0)!;\n\t\treturn code < 256 ? `&#${code};` : `&#x${code.toString(16)};`;\n\t}).join('')),\n\tescapeURI = convert(str => {\n\t\tif (str.includes('%')) {\n\t\t\ttry {\n\t\t\t\treturn decodeURIComponent(str);\n\t\t\t} catch {}\n\t\t}\n\t\treturn encodeURIComponent(str);\n\t}),\n\tescapeHash = convert(str => {\n\t\ttry {\n\t\t\treturn decodeURIComponent(str.replace(/\\.(?=[\\da-f]{2})/giu, '%'));\n\t\t} catch {\n\t\t\treturn str;\n\t\t}\n\t});\n\nexport const keymap: KeyBinding[] = [\n\t{key: 'Mod-/', run: escapeHTML},\n\t{key: 'Mod-\\\\', run: escapeURI},\n\t{key: 'Shift-Mod-\\\\', run: escapeHash},\n];\n"],
5
- "mappings": "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",
6
- "names": ["CodeMirror6", "CDN", "USING_LOCAL", "DATA_MODULE", "ALL_SETTINGS_CACHE", "SITE_ID", "SITE_SETTINGS", "VALID", "getConfig", "magicWords", "rule", "flip", "words", "i", "aliases", "name", "alias", "obj", "getConfigPair", "bool", "setConfig", "config", "getMwConfig", "isIPE", "variants", "magicwords", "extensiontags", "functionhooks", "variables", "others", "insensitive", "tag", "functions", "code", "vendor", "userAgent", "maxTouchPoints", "platform", "modKey", "pageSelector", "openLinks", "page", "previousSibling", "nextSibling", "instances", "getInstance", "$ele", "getCaretPosition", "option", "main", "textSelection", "content", "state", "start", "end", "view", "value", "storageKey", "i18n", "languages", "lang", "msg", "key", "args", "storageKey", "indentKey", "options", "dialog", "widget", "indentWidget", "field", "indentField", "indent", "openPreference", "addons", "editors", "windowManager", "option", "msg", "data", "value", "cm", "entity", "convert", "func", "view", "CodeMirror", "escapeHTML", "str", "c", "code", "escapeURI", "e", "escapeHash", "keymap", "REPO_CDN", "CDN", "REPO_CDN", "elem", "cm", "instances", "value", "linters", "prefs", "storageKey", "pageSelector", "CodeMirror", "_CodeMirror", "CodeMirror6", "textarea", "lang", "ns", "config", "textSelection", "show", "opt", "linter", "on", "optOrNs", "i18n", "mwConfig", "getMwConfig", "obj", "s", "USING_LOCAL", "key", "val", "extensions", "hasExtension", "ext", "hasOpenLinks", "hasLint", "hasEscape", "openLinks", "keymap", "isWiki", "indent", "indentKey", "langMap", "_a", "wgAction", "wgNamespaceNumber", "wgPageContentModel", "msg", "portletContainer", "e", "textareas", "openPreference"]
3
+ "sources": ["../mw/base.ts", "../mw/config.ts", "../mw/openLinks.ts", "../mw/textSelection.ts", "../mw/msg.ts", "../mw/preference.ts"],
4
+ "sourcesContent": ["import {CodeMirror6, CDN} from 'https://testingcf.jsdelivr.net/npm/@bhsd/codemirror-mediawiki@2.2.2/dist/main.min.js';\nimport {getMwConfig, USING_LOCAL} from './config';\nimport {openLinks, pageSelector} from './openLinks';\nimport {instances, textSelection} from './textSelection';\nimport {openPreference, storageKey, indentKey} from './preference';\nimport {msg, setI18N} from './msg';\nimport type {Config} from 'wikilint';\nimport type {LintSource} from '../src/codemirror';\n\nconst REPO_CDN = 'npm/@bhsd/codemirror-mediawiki@2.2.2';\nexport {CDN, REPO_CDN};\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\tprefs = new Set<string>(JSON.parse(localStorage.getItem(storageKey)!) as string[] | null);\n\nmw.loader.addStyleTag(`.wikiEditor-ui-toolbar{z-index:7}${pageSelector}{cursor:var(--codemirror-cursor)}`);\n\nexport class CodeMirror extends CodeMirror6 {\n\tns;\n\n\t/**\n\t * @param textarea \u6587\u672C\u6846\n\t * @param lang \u8BED\u8A00\n\t * @param ns \u547D\u540D\u7A7A\u95F4\n\t * @param config \u8BED\u8A00\u8BBE\u7F6E\n\t */\n\tconstructor(textarea: HTMLTextAreaElement, lang?: string, ns?: number, config?: unknown) {\n\t\tsuper(textarea, lang, config);\n\t\tthis.ns = ns;\n\t\tinstances.set(textarea, this);\n\t\tif (mw.loader.getState('jquery.textSelection') === 'ready') {\n\t\t\t$(textarea).data('jquery.textSelection', textSelection);\n\t\t}\n\t\tmw.hook('wiki-codemirror6').fire(this);\n\t}\n\n\toverride toggle(show = !this.visible): void {\n\t\tsuper.toggle(show);\n\t\t$(this.textarea).data('jquery.textSelection', show && textSelection);\n\t}\n\n\toverride async getLinter(opt?: Record<string, unknown>): Promise<LintSource | undefined> {\n\t\tconst linter = await super.getLinter(opt);\n\t\tlinters[this.lang] = linter;\n\t\treturn linter;\n\t}\n\n\t/**\n\t * \u6DFB\u52A0\u6216\u79FB\u9664\u9ED8\u8BA4 linter\n\t * @param on \u662F\u5426\u6DFB\u52A0\n\t * @param opt linter\u9009\u9879\n\t * @param ns \u547D\u540D\u7A7A\u95F4\n\t */\n\tdefaultLint(on: boolean, opt: Record<string, unknown>): Promise<void>;\n\tdefaultLint(on: boolean, ns?: number): Promise<void>;\n\tasync defaultLint(on: boolean, optOrNs: Record<string, unknown> | number | undefined = this.ns): Promise<void> {\n\t\tif (!on) {\n\t\t\tthis.lint();\n\t\t\treturn;\n\t\t}\n\t\tconst {lang} = this;\n\t\tlet opt: Record<string, unknown> | undefined;\n\t\tif (typeof optOrNs === 'number') {\n\t\t\tif (lang === 'mediawiki' && (optOrNs === 10 || optOrNs === 828 || optOrNs === 2)) {\n\t\t\t\topt = {include: true};\n\t\t\t} else if (lang === 'javascript' && (optOrNs === 8 || optOrNs === 2300)) {\n\t\t\t\topt = {\n\t\t\t\t\tenv: {browser: true, es6: true},\n\t\t\t\t\tparserOptions: {ecmaVersion: 6},\n\t\t\t\t};\n\t\t\t}\n\t\t} else {\n\t\t\topt = optOrNs;\n\t\t}\n\t\tif (!(lang in linters)) {\n\t\t\tif (lang === 'mediawiki') {\n\t\t\t\tconst i18n = mw.config.get('wgUserLanguage');\n\t\t\t\tif (['zh', 'zh-hans', 'zh-cn', 'zh-sg', 'zh-my'].includes(i18n)) {\n\t\t\t\t\topt = {...opt, i18n: 'zh-hans'};\n\t\t\t\t} else if (['zh-hant', 'zh-tw', 'zh-hk', 'zh-mo'].includes(i18n)) {\n\t\t\t\t\topt = {...opt, i18n: 'zh-hant'};\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait this.getLinter(opt);\n\t\t\tif (lang === 'mediawiki') {\n\t\t\t\tconst mwConfig = await getMwConfig(),\n\t\t\t\t\tconfig: Config = {\n\t\t\t\t\t\t...await wikiparse.getConfig(),\n\t\t\t\t\t\text: Object.keys(mwConfig.tags),\n\t\t\t\t\t\tnamespaces: mw.config.get('wgFormattedNamespaces'),\n\t\t\t\t\t\tnsid: mwConfig.nsid,\n\t\t\t\t\t\tdoubleUnderscore: mwConfig.doubleUnderscore.map(\n\t\t\t\t\t\t\tobj => Object.keys(obj).map(s => s.slice(2, -2)),\n\t\t\t\t\t\t) as [string[], string[]],\n\t\t\t\t\t\tvariants: mwConfig.variants!,\n\t\t\t\t\t\tprotocol: mwConfig.urlProtocols.replace(/\\\\:/gu, ':'),\n\t\t\t\t\t};\n\t\t\t\t[config.parserFunction[0]] = mwConfig.functionSynonyms;\n\t\t\t\tif (!USING_LOCAL) {\n\t\t\t\t\tfor (const [key, val] of Object.entries(mwConfig.functionSynonyms[0])) {\n\t\t\t\t\t\tif (!key.startsWith('#')) {\n\t\t\t\t\t\t\tconfig.parserFunction[0][`#${key}`] = val;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconfig.parserFunction[1] = [\n\t\t\t\t\t...Object.keys(mwConfig.functionSynonyms[1]),\n\t\t\t\t\t'=',\n\t\t\t\t];\n\t\t\t\tfor (const key of Object.keys(mwConfig.img!)) {\n\t\t\t\t\tconfig.img[key] = mwConfig.img![key]!.slice(4);\n\t\t\t\t}\n\t\t\t\twikiparse.setConfig(config);\n\t\t\t}\n\t\t} else if (opt) {\n\t\t\tawait this.getLinter(opt);\n\t\t}\n\t\tif (linters[lang]) {\n\t\t\tthis.lint(linters[lang]);\n\t\t}\n\t}\n\n\toverride prefer(extensions: string[] | Record<string, boolean>): void {\n\t\tsuper.prefer(extensions);\n\t\tconst hasExtension = Array.isArray(extensions)\n\t\t\t\t? (ext: string): boolean => extensions.includes(ext)\n\t\t\t\t: (ext: string): boolean | undefined => extensions[ext],\n\t\t\thasOpenLinks = hasExtension('openLinks'),\n\t\t\thasLint = hasExtension('lint');\n\t\tif (hasOpenLinks) {\n\t\t\tmw.loader.load('mediawiki.Title');\n\t\t\t$(this.view.contentDOM).on('click', pageSelector, openLinks).css('--codemirror-cursor', 'pointer');\n\t\t} else if (hasOpenLinks === false) {\n\t\t\t$(this.view.contentDOM).off('click', pageSelector, openLinks).css('--codemirror-cursor', '');\n\t\t}\n\t\tif (hasLint !== undefined) {\n\t\t\tvoid this.defaultLint(hasLint);\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\tconst isWiki = lang === 'mediawiki' || lang === 'html',\n\t\t\tcm = new CodeMirror(textarea, isWiki ? undefined : lang, ns),\n\t\t\tindent = localStorage.getItem(indentKey);\n\t\tif (isWiki) {\n\t\t\tconst config = await getMwConfig();\n\t\t\tcm.setLanguage(lang, config);\n\t\t}\n\t\tcm.prefer([...prefs]);\n\t\tif (indent) {\n\t\t\tcm.setIndent(indent);\n\t\t}\n\t\treturn cm;\n\t}\n}\n\nconst langMap: Record<string, string> = {\n\t'sanitized-css': 'css',\n\tjs: 'javascript',\n\tscribunto: 'lua',\n\twikitext: 'mediawiki',\n};\ndocument.body.addEventListener('click', e => {\n\tif (e.target instanceof HTMLTextAreaElement && e.shiftKey && !instances.has(e.target)) {\n\t\te.preventDefault();\n\t\t(async () => {\n\t\t\tconst {wgAction, wgNamespaceNumber, wgPageContentModel} = mw.config.get();\n\t\t\tlet lang: string | undefined,\n\t\t\t\tns: number | undefined;\n\t\t\tif (wgAction === 'edit' || wgAction === 'submit') {\n\t\t\t\tns = wgNamespaceNumber;\n\t\t\t\tlang = wgNamespaceNumber === 274 ? 'html' : wgPageContentModel.toLowerCase();\n\t\t\t} else {\n\t\t\t\tawait mw.loader.using('oojs-ui-windows');\n\t\t\t\tlang = (await OO.ui.prompt(msg('contentmodel')) || undefined)?.toLowerCase();\n\t\t\t}\n\t\t\tif (lang && lang in langMap) {\n\t\t\t\tlang = langMap[lang];\n\t\t\t}\n\t\t\tvoid CodeMirror.fromTextArea(e.target as HTMLTextAreaElement, lang, ns);\n\t\t})();\n\t}\n});\n\n(async () => {\n\tconst portletContainer: Record<string, string> = {\n\t\tminerva: 'page-actions-overflow',\n\t\tmoeskin: 'ca-more-actions',\n\t};\n\tawait Promise.all([\n\t\tmw.loader.using('mediawiki.util'),\n\t\tsetI18N(),\n\t]);\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(prefs, textareas.map(textarea => instances.get(textarea)));\n\t});\n})();\n\nObject.assign(window, {CodeMirror6: CodeMirror});\n", "import type {MwConfig} from '../src/mediawiki';\n\ndeclare interface MagicWord {\n\tname: string;\n\taliases: string[];\n\t'case-sensitive': boolean;\n}\n\nexport const USING_LOCAL = mw.loader.getState('ext.CodeMirror') !== null;\n\n// \u548C\u672C\u5730\u7F13\u5B58\u6709\u5173\u7684\u5E38\u6570\nconst DATA_MODULE = mw.loader.getState('ext.CodeMirror.data') ? 'ext.CodeMirror.data' : 'ext.CodeMirror',\n\tALL_SETTINGS_CACHE: Record<string, {time: number, config: MwConfig}>\n\t\t= JSON.parse(localStorage.getItem('InPageEditMwConfig')!) || {},\n\tSITE_ID = `${mw.config.get('wgServerName')}${mw.config.get('wgScriptPath')}`,\n\tSITE_SETTINGS = ALL_SETTINGS_CACHE[SITE_ID],\n\tVALID = Number(SITE_SETTINGS?.time) > Date.now() - 86_400 * 1000 * 30;\n\n/**\n * \u5C06\u9B54\u672F\u5B57\u4FE1\u606F\u8F6C\u6362\u4E3ACodeMirror\u63A5\u53D7\u7684\u8BBE\u7F6E\n * @param magicWords \u5B8C\u6574\u9B54\u672F\u5B57\u5217\u8868\n * @param rule \u8FC7\u6EE4\u51FD\u6570\n * @param flip \u662F\u5426\u53CD\u5411\u7B5B\u9009\u5BF9\u5927\u5C0F\u5199\u654F\u611F\u7684\u9B54\u672F\u5B57\n */\nconst getConfig = (\n\tmagicWords: MagicWord[],\n\trule: (word: MagicWord) => boolean,\n\tflip?: boolean,\n): Record<string, string> => {\n\tconst words = magicWords.filter(rule).filter(({'case-sensitive': i}) => i !== flip)\n\t\t\t.flatMap(({aliases, name, 'case-sensitive': i}) => aliases.map(alias => ({\n\t\t\t\talias: (i ? alias : alias.toLowerCase()).replace(/:$/u, ''),\n\t\t\t\tname,\n\t\t\t}))),\n\t\tobj: Record<string, string> = {};\n\tfor (const {alias, name} of words) {\n\t\tobj[alias] = name;\n\t}\n\treturn obj;\n};\n\n/**\n * \u5C06\u9B54\u672F\u5B57\u4FE1\u606F\u8F6C\u6362\u4E3ACodeMirror\u63A5\u53D7\u7684\u8BBE\u7F6E\n * @param magicWords \u5B8C\u6574\u9B54\u672F\u5B57\u5217\u8868\n * @param rule \u8FC7\u6EE4\u51FD\u6570\n */\nconst getConfigPair = (\n\tmagicWords: MagicWord[],\n\trule: (word: MagicWord) => boolean,\n): [Record<string, string>, Record<string, string>] => [true, false]\n\t.map(bool => getConfig(magicWords, rule, bool)) as [Record<string, string>, Record<string, string>];\n\n/** \u5C06\u8BBE\u7F6E\u4FDD\u5B58\u5230mw.config */\nconst setConfig = (config: MwConfig): void => {\n\tmw.config.set('extCodeMirrorConfig', config);\n};\n\n/** \u52A0\u8F7DCodeMirror\u7684mediawiki\u6A21\u5757\u9700\u8981\u7684\u8BBE\u7F6E */\nexport const getMwConfig = async (): Promise<MwConfig> => {\n\tif (USING_LOCAL && !VALID) { // \u53EA\u5728localStorage\u8FC7\u671F\u65F6\u624D\u4F1A\u91CD\u65B0\u52A0\u8F7Dext.CodeMirror.data\n\t\tawait mw.loader.using(DATA_MODULE);\n\t}\n\n\tlet config = mw.config.get('extCodeMirrorConfig') as MwConfig | null;\n\tif (!config && VALID) {\n\t\t({config} = SITE_SETTINGS!);\n\t\tsetConfig(config);\n\t}\n\tconst isIPE = config && Object.values(config.functionSynonyms[0]).includes(true as unknown as string);\n\t// \u60C5\u5F621\uFF1Aconfig\u5DF2\u66F4\u65B0\uFF0C\u53EF\u80FD\u6765\u81EAlocalStorage\n\tif (config?.img && config.variants && !isIPE) {\n\t\treturn {\n\t\t\t...config,\n\t\t\tnsid: mw.config.get('wgNamespaceIds'),\n\t\t};\n\t}\n\n\t// \u4EE5\u4E0B\u60C5\u5F62\u5747\u9700\u8981\u53D1\u9001API\u8BF7\u6C42\n\t// \u60C5\u5F622\uFF1AlocalStorage\u672A\u8FC7\u671F\u4F46\u4E0D\u5305\u542B\u65B0\u8BBE\u7F6E\n\t// \u60C5\u5F623\uFF1A\u65B0\u52A0\u8F7D\u7684 ext.CodeMirror.data\n\t// \u60C5\u5F624\uFF1A`config === null`\n\tawait mw.loader.using('mediawiki.api');\n\tconst {\n\t\tquery: {general: {variants}, magicwords, extensiontags, functionhooks, variables},\n\t}: {\n\t\tquery: {\n\t\t\tgeneral: {variants?: {code: string}[]};\n\t\t\tmagicwords: MagicWord[];\n\t\t\textensiontags: string[];\n\t\t\tfunctionhooks: string[];\n\t\t\tvariables: string[];\n\t\t};\n\t} = await new mw.Api().get({\n\t\tmeta: 'siteinfo',\n\t\tsiprop: [\n\t\t\t'general',\n\t\t\t'magicwords',\n\t\t\t...config && !isIPE ? [] : ['extensiontags', 'functionhooks', 'variables'],\n\t\t],\n\t\tformatversion: '2',\n\t}) as any; // eslint-disable-line @typescript-eslint/no-explicit-any\n\tconst others = new Set(['msg', 'raw', 'msgnw', 'subst', 'safesubst']);\n\n\t// \u5148\u5904\u7406\u9B54\u672F\u5B57\u548C\u72B6\u6001\u5F00\u5173\n\tif (config && !isIPE) { // \u60C5\u5F622\u62163\n\t\tconst {functionSynonyms: [insensitive]} = config;\n\t\tif (!('subst' in insensitive)) {\n\t\t\tObject.assign(insensitive, getConfig(magicwords, ({name}) => others.has(name)));\n\t\t}\n\t} else { // \u60C5\u5F624\uFF1A`config === null`\n\t\t// @ts-expect-error incomplete properties\n\t\tconfig = {\n\t\t\ttagModes: {\n\t\t\t\ttab: 'text/mediawiki',\n\t\t\t\tindicator: 'text/mediawiki',\n\t\t\t\tpoem: 'text/mediawiki',\n\t\t\t\tref: 'text/mediawiki',\n\t\t\t\toption: 'text/mediawiki',\n\t\t\t\tcombooption: 'text/mediawiki',\n\t\t\t\ttabs: 'text/mediawiki',\n\t\t\t\tpoll: 'text/mediawiki',\n\t\t\t\tgallery: 'text/mediawiki',\n\t\t\t},\n\t\t\ttags: {},\n\t\t\turlProtocols: mw.config.get('wgUrlProtocols'),\n\t\t};\n\t\tfor (const tag of extensiontags) {\n\t\t\tconfig!.tags[tag.slice(1, -1)] = true;\n\t\t}\n\t\tconst functions = new Set([\n\t\t\t...functionhooks,\n\t\t\t...variables,\n\t\t\t...others,\n\t\t]);\n\t\tconfig!.functionSynonyms = getConfigPair(magicwords, ({name}) => functions.has(name));\n\t\tconfig!.doubleUnderscore = getConfigPair(\n\t\t\tmagicwords,\n\t\t\t({aliases}) => aliases.some(alias => /^__.+__$/u.test(alias)),\n\t\t);\n\t}\n\tconfig!.img = getConfig(magicwords, ({name}) => name.startsWith('img_'));\n\tconfig!.variants = variants ? variants.map(({code}) => code) : [];\n\tconfig!.nsid = mw.config.get('wgNamespaceIds');\n\tsetConfig(config!);\n\tALL_SETTINGS_CACHE[SITE_ID] = {config: config!, time: Date.now()};\n\tlocalStorage.setItem('InPageEditMwConfig', JSON.stringify(ALL_SETTINGS_CACHE));\n\treturn config!;\n};\n", "const {vendor, userAgent, maxTouchPoints, platform} = navigator,\n\tmodKey = vendor.includes('Apple Computer') && (userAgent.includes('Mobile/') || maxTouchPoints > 2)\n\t|| platform.includes('Mac')\n\t\t? 'metaKey'\n\t\t: 'ctrlKey';\n\nexport const pageSelector = '.cm-mw-template-name, .cm-mw-link-pagename';\n\n/** \u70B9\u51FB\u65F6\u5728\u65B0\u9875\u9762\u6253\u5F00\u94FE\u63A5\u3001\u6A21\u677F\u7B49 */\nexport const openLinks = function(this: HTMLElement, e: JQuery.ClickEvent): void {\n\tif (!e[modKey]) {\n\t\treturn;\n\t}\n\te.preventDefault();\n\tlet page = this.textContent!,\n\t\t{previousSibling, nextSibling} = this;\n\twhile (\n\t\tpreviousSibling\n\t\t&& (previousSibling.nodeType === Node.TEXT_NODE || (previousSibling as Element).matches(pageSelector))\n\t) {\n\t\tpage = previousSibling.textContent! + page;\n\t\t({previousSibling} = previousSibling);\n\t}\n\twhile (\n\t\tnextSibling\n\t\t&& (nextSibling.nodeType === Node.TEXT_NODE || (nextSibling as Element).matches(pageSelector))\n\t) {\n\t\tpage += nextSibling.textContent!;\n\t\t({nextSibling} = nextSibling);\n\t}\n\tpage = page.trim();\n\tif (page.startsWith('/')) {\n\t\tpage = `:${mw.config.get('wgPageName')}${page}`;\n\t}\n\topen(new mw.Title(page, this.classList.contains('cm-mw-template-name') ? 10 : 0).getUrl(undefined), '_blank');\n};\n", "import type {CodeMirror} from './base';\n\nexport const instances = new WeakMap<HTMLTextAreaElement, CodeMirror>();\n\nconst getInstance = ($ele: JQuery<HTMLTextAreaElement>): CodeMirror => instances.get($ele[0]!)!;\n\nfunction getCaretPosition(this: JQuery<HTMLTextAreaElement>, option: {startAndEnd: true}): [number, number];\nfunction getCaretPosition(this: JQuery<HTMLTextAreaElement>, option?: {startAndEnd?: false}): number;\nfunction getCaretPosition(\n\tthis: JQuery<HTMLTextAreaElement>,\n\toption?: {startAndEnd?: boolean},\n): [number, number] | number {\n\tconst {view: {state: {selection: {main}}}} = getInstance(this);\n\treturn option?.startAndEnd ? [main.from, main.to] : main.head;\n}\n\n/**\n * jQuery.textSelection overrides for CodeMirror.\n * See jQuery.textSelection.js for method documentation\n */\nexport const textSelection = {\n\tgetContents(this: JQuery<HTMLTextAreaElement>): string {\n\t\treturn getInstance(this).view.state.doc.toString();\n\t},\n\tsetContents(this: JQuery<HTMLTextAreaElement>, content: string): JQuery<HTMLTextAreaElement> {\n\t\tgetInstance(this).setContent(content);\n\t\treturn this;\n\t},\n\tgetSelection(this: JQuery<HTMLTextAreaElement>): string {\n\t\tconst {view: {state}} = getInstance(this);\n\t\treturn state.sliceDoc(state.selection.main.from, state.selection.main.to);\n\t},\n\tsetSelection(\n\t\tthis: JQuery<HTMLTextAreaElement>,\n\t\t{start, end}: {start: number, end?: number},\n\t): JQuery<HTMLTextAreaElement> {\n\t\tconst {view} = getInstance(this);\n\t\tview.dispatch({\n\t\t\tselection: {anchor: start, head: end ?? start},\n\t\t});\n\t\tview.focus();\n\t\treturn this;\n\t},\n\treplaceSelection(this: JQuery<HTMLTextAreaElement>, value: string): JQuery<HTMLTextAreaElement> {\n\t\tconst {view} = getInstance(this);\n\t\tview.dispatch(view.state.replaceSelection(value));\n\t\treturn this;\n\t},\n\tgetCaretPosition,\n\tscrollToCaretPosition(this: JQuery<HTMLTextAreaElement>): JQuery<HTMLTextAreaElement> {\n\t\tgetInstance(this).view.dispatch({scrollIntoView: true});\n\t\treturn this;\n\t},\n};\n", "import {CDN, REPO_CDN} from './base';\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/** \u52A0\u8F7D I18N */\nexport const setI18N = async (): Promise<void> => {\n\tconst i18n: Record<string, string> = JSON.parse(localStorage.getItem(storageKey)!) || {};\n\tif (i18n['lang'] !== lang || i18n['version'] !== REPO_CDN.split('@')[1]!.split('.', 2).join('.')) {\n\t\ttry {\n\t\t\tObject.assign(i18n, await (await fetch(`${CDN}/${REPO_CDN}/i18n/${lang}.json`)).json());\n\t\t\tlocalStorage.setItem(storageKey, JSON.stringify(i18n));\n\t\t} catch (e) {\n\t\t\tvoid mw.notify(msg('i18n-failed', lang));\n\t\t\tconsole.error(e);\n\t\t}\n\t}\n\tfor (const [k, v] of Object.entries(i18n)) {\n\t\tmw.messages.set(`cm-mw-${k}`, v);\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", "import {msg} from './msg';\nimport type {CodeMirror} from './base';\n\nexport const storageKey = 'codemirror-mediawiki-addons',\n\tindentKey = 'codemirror-mediawiki-indent';\n\nconst options = [\n\t'allowMultipleSelections',\n\t'bracketMatching',\n\t'closeBrackets',\n\t'highlightActiveLine',\n\t'highlightSpecialChars',\n\t'highlightWhitespace',\n\t'highlightTrailingWhitespace',\n\t'lint',\n\t'openLinks',\n\t'escape',\n];\n\n// OOUI\u7EC4\u4EF6\nlet dialog: OO.ui.MessageDialog | undefined,\n\twidget: OO.ui.CheckboxMultiselectInputWidget,\n\tindentWidget: OO.ui.TextInputWidget,\n\tfield: OO.ui.FieldLayout,\n\tindentField: OO.ui.FieldLayout,\n\tindent = localStorage.getItem(indentKey) || '';\n\n/**\n * \u6253\u5F00\u8BBE\u7F6E\u5BF9\u8BDD\u6846\n * @param addons \u9884\u8BBE\u7684\u6269\u5C55\n * @param editors CodeMirror\u5B9E\u4F8B\n */\nexport const openPreference = async (addons: Set<string>, editors: (CodeMirror | undefined)[]): Promise<void> => {\n\tawait mw.loader.using(['oojs-ui-windows', 'oojs-ui.styles.icons-content']);\n\tif (dialog) {\n\t\twidget.setValue([...addons] as unknown as string);\n\t\tindentWidget.setValue(indent);\n\t} else {\n\t\tdialog = new OO.ui.MessageDialog();\n\t\tconst windowManager = new OO.ui.WindowManager();\n\t\twindowManager.$element.appendTo(document.body);\n\t\twindowManager.addWindows([dialog]);\n\t\twidget = new OO.ui.CheckboxMultiselectInputWidget({\n\t\t\toptions: options.map(option => ({data: option, label: msg(`addon-${option}`)})),\n\t\t\tvalue: [...addons] as unknown as string,\n\t\t});\n\t\tfield = new OO.ui.FieldLayout(widget, {\n\t\t\tlabel: msg('label'),\n\t\t\talign: 'top',\n\t\t});\n\t\tindentWidget = new OO.ui.TextInputWidget({placeholder: '\\\\t'});\n\t\tindentField = new OO.ui.FieldLayout(indentWidget, {\n\t\t\tlabel: msg('addon-indent'),\n\t\t\tnotices: [msg('notice')],\n\t\t});\n\t}\n\n\tconst data = await (dialog.open({\n\t\ttitle: msg('title'),\n\t\tmessage: field.$element.add(indentField.$element).add($('<p>', {html: msg('feedback')})),\n\t\tactions: [\n\t\t\t{action: 'reject', label: mw.msg('ooui-dialog-message-reject')},\n\t\t\t{action: 'accept', label: mw.msg('ooui-dialog-message-accept'), flags: 'progressive'},\n\t\t],\n\t\tsize: 'medium',\n\t}).closing as unknown as Promise<{action?: unknown} | undefined>);\n\tif (typeof data === 'object' && data.action === 'accept') {\n\t\tconst value = widget.getValue() as unknown as string[];\n\t\tindent = indentWidget.getValue(); // eslint-disable-line require-atomic-updates\n\t\taddons.clear();\n\t\tfor (const option of value) {\n\t\t\taddons.add(option);\n\t\t}\n\t\tfor (const cm of editors) {\n\t\t\tcm?.prefer(value);\n\t\t\tcm?.setIndent(indent || '\\t');\n\t\t}\n\t\tlocalStorage.setItem(storageKey, JSON.stringify(value));\n\t\tlocalStorage.setItem(indentKey, indent);\n\t}\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["CodeMirror6", "CDN", "USING_LOCAL", "DATA_MODULE", "ALL_SETTINGS_CACHE", "SITE_ID", "SITE_SETTINGS", "VALID", "getConfig", "magicWords", "rule", "flip", "words", "i", "aliases", "name", "alias", "obj", "getConfigPair", "bool", "setConfig", "config", "getMwConfig", "isIPE", "variants", "magicwords", "extensiontags", "functionhooks", "variables", "others", "insensitive", "tag", "functions", "code", "vendor", "userAgent", "maxTouchPoints", "platform", "modKey", "pageSelector", "openLinks", "page", "previousSibling", "nextSibling", "instances", "getInstance", "$ele", "getCaretPosition", "option", "main", "textSelection", "content", "state", "start", "end", "view", "value", "storageKey", "languages", "lang", "setI18N", "i18n", "REPO_CDN", "CDN", "e", "msg", "k", "v", "key", "args", "storageKey", "indentKey", "options", "dialog", "widget", "indentWidget", "field", "indentField", "indent", "openPreference", "addons", "editors", "windowManager", "option", "msg", "data", "value", "cm", "REPO_CDN", "CDN", "REPO_CDN", "elem", "cm", "instances", "value", "linters", "prefs", "storageKey", "pageSelector", "CodeMirror", "_CodeMirror", "CodeMirror6", "textarea", "lang", "ns", "config", "textSelection", "show", "opt", "linter", "on", "optOrNs", "i18n", "mwConfig", "getMwConfig", "obj", "s", "USING_LOCAL", "key", "val", "extensions", "hasExtension", "ext", "hasOpenLinks", "hasLint", "openLinks", "isWiki", "indent", "indentKey", "langMap", "_a", "wgAction", "wgNamespaceNumber", "wgPageContentModel", "msg", "portletContainer", "setI18N", "e", "textareas", "openPreference"]
7
7
  }
package/i18n/en.json ADDED
@@ -0,0 +1,21 @@
1
+ {
2
+ "version": "2.2.2",
3
+ "lang": "en",
4
+ "i18n-failed": "Failed to fetch the translation file in $1.",
5
+ "title": "CodeMirror Addons",
6
+ "label": "Please select the addons you wish to load",
7
+ "notice": "Changes will apply immediately.",
8
+ "feedback": "Bug reports or suggestions are welcome at <a href=\"https://github.com/bhsd-harry/codemirror-mediawiki/issues\" target=\"_blank\">GitHub</a> .",
9
+ "contentmodel": "Please indicate the content model:",
10
+ "addon-indent": "Indent",
11
+ "addon-allowMultipleSelections": "Allow multiple selections",
12
+ "addon-bracketMatching": "Highlight matching/non-matching brackets",
13
+ "addon-closeBrackets": "Auto-close brackets and quotes",
14
+ "addon-highlightActiveLine": "Show the active line",
15
+ "addon-highlightSpecialChars": "Show special characters",
16
+ "addon-highlightWhitespace": "Show whitespace characters",
17
+ "addon-highlightTrailingWhitespace": "Show trailing spaces",
18
+ "addon-lint": "Wikitext linter",
19
+ "addon-openLinks": "Open the wikilink or template page with CTRL/CMD-click",
20
+ "addon-escape": "<span title=\"Ctrl/Cmd + [ : HTML encoding\nCtrl/Cmd + ] : URL decoding or encoding\">Keyboard shortcuts for HTML/URL encoding</span>"
21
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "version": "2.2.2",
3
+ "lang": "zh-hans",
4
+ "i18n-failed": "获取 $1 的语言文件失败。",
5
+ "title": "CodeMirror插件",
6
+ "label": "请选择您希望加载的插件",
7
+ "notice": "更改将立即生效。",
8
+ "feedback": "欢迎将错误报告或是改进建议提交到 <a href=\"https://github.com/bhsd-harry/codemirror-mediawiki/issues\" target=\"_blank\">GitHub</a> !",
9
+ "contentmodel": "请输入内容模型:",
10
+ "addon-indent": "缩进",
11
+ "addon-allowMultipleSelections": "允许选择多个片段",
12
+ "addon-bracketMatching": "高亮显示匹配和未匹配的括号",
13
+ "addon-closeBrackets": "自动闭合括号和引号",
14
+ "addon-highlightActiveLine": "高亮显示光标所在行",
15
+ "addon-highlightSpecialChars": "显示特殊字符",
16
+ "addon-highlightWhitespace": "显示空白字符",
17
+ "addon-highlightTrailingWhitespace": "显示尾随空格",
18
+ "addon-lint": "维基语法检查",
19
+ "addon-openLinks": "CTRL/CMD+点击可打开内部链接或模板页面",
20
+ "addon-escape": "<span title=\"Ctrl/Cmd + [ : HTML编码\nCtrl/Cmd + ] : URL解码或编码\">添加HTML和URL编码快捷键</span>"
21
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "version": "2.2.2",
3
+ "lang": "zh-hant",
4
+ "i18n-failed": "取得 $1 的語言檔案失敗。",
5
+ "title": "CodeMirror外掛程式",
6
+ "label": "請選擇您希望載入的外掛程式",
7
+ "notice": "更改將立即生效。",
8
+ "feedback": "歡迎將錯誤報告或是改進建議提交到 <a href=\"https://github.com/bhsd-harry/codemirror-mediawiki/issues\" target=\"_blank\">GitHub</a> !",
9
+ "contentmodel": "請輸入內容模型:",
10
+ "addon-indent": "縮排",
11
+ "addon-allowMultipleSelections": "允許選擇多個片段",
12
+ "addon-bracketMatching": "突出顯示匹配和未匹配的括號",
13
+ "addon-closeBrackets": "自動閉合括號和引號",
14
+ "addon-highlightActiveLine": "突出顯示游標所在行",
15
+ "addon-highlightSpecialChars": "顯示特殊字符",
16
+ "addon-highlightWhitespace": "顯示空白字符",
17
+ "addon-highlightTrailingWhitespace": "顯示尾隨空格",
18
+ "addon-lint": "維基語法檢查",
19
+ "addon-openLinks": "CTRL/CMD+點擊可打開內部連結或模板頁面",
20
+ "addon-escape": "<span title=\"Ctrl/Cmd + [ : HTML編碼\nCtrl/Cmd + ] : URL解碼或編碼\">添加HTML和URL編碼快速鍵</span>"
21
+ }
package/mw/base.ts CHANGED
@@ -1,14 +1,13 @@
1
- import {CodeMirror6, CDN} from 'https://testingcf.jsdelivr.net/npm/@bhsd/codemirror-mediawiki@2.2.0/dist/main.min.js';
1
+ import {CodeMirror6, CDN} from 'https://testingcf.jsdelivr.net/npm/@bhsd/codemirror-mediawiki@2.2.2/dist/main.min.js';
2
2
  import {getMwConfig, USING_LOCAL} from './config';
3
3
  import {openLinks, pageSelector} from './openLinks';
4
4
  import {instances, textSelection} from './textSelection';
5
5
  import {openPreference, storageKey, indentKey} from './preference';
6
- import {msg} from './msg';
7
- import {keymap} from './escape';
6
+ import {msg, setI18N} from './msg';
8
7
  import type {Config} from 'wikilint';
9
8
  import type {LintSource} from '../src/codemirror';
10
9
 
11
- const REPO_CDN = 'npm/@bhsd/codemirror-mediawiki@2.1.15';
10
+ const REPO_CDN = 'npm/@bhsd/codemirror-mediawiki@2.2.2';
12
11
  export {CDN, REPO_CDN};
13
12
 
14
13
  mw.loader.load(`${CDN}/${REPO_CDN}/mediawiki.min.css`, 'text/css');
@@ -141,15 +140,13 @@ export class CodeMirror extends CodeMirror6 {
141
140
  }
142
141
  }
143
142
 
144
- /** @override */
145
143
  override prefer(extensions: string[] | Record<string, boolean>): void {
146
144
  super.prefer(extensions);
147
145
  const hasExtension = Array.isArray(extensions)
148
146
  ? (ext: string): boolean => extensions.includes(ext)
149
147
  : (ext: string): boolean | undefined => extensions[ext],
150
148
  hasOpenLinks = hasExtension('openLinks'),
151
- hasLint = hasExtension('lint'),
152
- hasEscape = hasExtension('escape');
149
+ hasLint = hasExtension('lint');
153
150
  if (hasOpenLinks) {
154
151
  mw.loader.load('mediawiki.Title');
155
152
  $(this.view.contentDOM).on('click', pageSelector, openLinks).css('--codemirror-cursor', 'pointer');
@@ -159,11 +156,6 @@ export class CodeMirror extends CodeMirror6 {
159
156
  if (hasLint !== undefined) {
160
157
  void this.defaultLint(hasLint);
161
158
  }
162
- if (hasEscape) {
163
- this.extraKeys(keymap);
164
- } else if (hasEscape === false) {
165
- this.extraKeys([]);
166
- }
167
159
  }
168
160
 
169
161
  /**
@@ -221,7 +213,10 @@ document.body.addEventListener('click', e => {
221
213
  minerva: 'page-actions-overflow',
222
214
  moeskin: 'ca-more-actions',
223
215
  };
224
- await mw.loader.using('mediawiki.util');
216
+ await Promise.all([
217
+ mw.loader.using('mediawiki.util'),
218
+ setI18N(),
219
+ ]);
225
220
  mw.util.addPortletLink(
226
221
  portletContainer[mw.config.get('skin')] || 'p-cactions',
227
222
  '#',
package/mw/msg.ts CHANGED
@@ -1,7 +1,6 @@
1
1
  import {CDN, REPO_CDN} from './base';
2
2
 
3
3
  const storageKey = 'codemirror-mediawiki-i18n',
4
- i18n: Record<string, string> = JSON.parse(localStorage.getItem(storageKey)!) || {},
5
4
  languages: Record<string, string> = {
6
5
  zh: 'zh-hans',
7
6
  'zh-hans': 'zh-hans',
@@ -17,9 +16,15 @@ const storageKey = 'codemirror-mediawiki-i18n',
17
16
 
18
17
  /** 加载 I18N */
19
18
  export const setI18N = async (): Promise<void> => {
19
+ const i18n: Record<string, string> = JSON.parse(localStorage.getItem(storageKey)!) || {};
20
20
  if (i18n['lang'] !== lang || i18n['version'] !== REPO_CDN.split('@')[1]!.split('.', 2).join('.')) {
21
- Object.assign(i18n, await (await fetch(`${CDN}/${REPO_CDN}/i18n/${lang}.json`)).json());
22
- localStorage.setItem(storageKey, JSON.stringify(i18n));
21
+ try {
22
+ Object.assign(i18n, await (await fetch(`${CDN}/${REPO_CDN}/i18n/${lang}.json`)).json());
23
+ localStorage.setItem(storageKey, JSON.stringify(i18n));
24
+ } catch (e) {
25
+ void mw.notify(msg('i18n-failed', lang));
26
+ console.error(e);
27
+ }
23
28
  }
24
29
  for (const [k, v] of Object.entries(i18n)) {
25
30
  mw.messages.set(`cm-mw-${k}`, v);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bhsd/codemirror-mediawiki",
3
- "version": "2.2.0",
3
+ "version": "2.2.2",
4
4
  "description": "Modified CodeMirror mode based on wikimedia/mediawiki-extensions-CodeMirror",
5
5
  "keywords": [
6
6
  "mediawiki",
@@ -12,6 +12,7 @@
12
12
  },
13
13
  "license": "GPL-2.0",
14
14
  "files":[
15
+ "/i18n/",
15
16
  "/src/",
16
17
  "!/src/gh-page.ts",
17
18
  "!/src/plugins.ts",
@@ -31,13 +32,13 @@
31
32
  "scripts": {
32
33
  "build:core": "esbuild ./src/codemirror.ts --bundle --minify --target=es2018 --format=esm --sourcemap --outfile=dist/main.min.js && tsc --emitDeclarationOnly && rm dist/gh-page.d.ts",
33
34
  "build:mw": "esbuild ./mw/base.ts --bundle --minify --target=es2018 --format=esm --sourcemap --outfile=dist/mw.min.js",
34
- "build:gh-page": "tsc --project tsconfig.gh-page.json &>/dev/null",
35
+ "build:gh-page": "bash build.sh",
35
36
  "build": "npm run build:core && npm run build:mw",
36
37
  "lint:ts": "tsc --noEmit && tsc --project mw/tsconfig.json --noEmit && eslint --cache .",
37
38
  "lint:css": "stylelint *.css",
38
39
  "lint": "npm run lint:ts && npm run lint:css",
39
40
  "server": "npm run test:end; http-server .. -c-1 --cors &",
40
- "test": "npm run build:core && npm run build:gh-page; npm run server",
41
+ "test": "npm run build:core && npm run build:gh-page && npm run server",
41
42
  "test:end": "pkill -x http-server"
42
43
  },
43
44
  "engines": {
package/src/codemirror.ts CHANGED
@@ -23,6 +23,7 @@ import {searchKeymap} from '@codemirror/search';
23
23
  import {linter, lintGutter, openLintPanel, closeLintPanel, lintKeymap} from '@codemirror/lint';
24
24
  import {closeBrackets} from '@codemirror/autocomplete';
25
25
  import {mediawiki, html} from './mediawiki';
26
+ import {keyMap} from './escape';
26
27
  import * as plugins from './plugins';
27
28
  import type {ViewPlugin, KeyBinding} from '@codemirror/view';
28
29
  import type {Extension, Text, StateEffect} from '@codemirror/state';
@@ -60,6 +61,10 @@ const avail: Record<string, [(config?: any) => Extension, Record<string, unknown
60
61
  ],
61
62
  {},
62
63
  ],
64
+ escape: [
65
+ (keys: KeyBinding[] = []): Extension => keymap.of(keys),
66
+ {mediawiki: keyMap},
67
+ ],
63
68
  };
64
69
 
65
70
  export const CDN = 'https://testingcf.jsdelivr.net';
@@ -220,6 +225,7 @@ export class CodeMirror6 {
220
225
  ]);
221
226
  this.#lang = lang;
222
227
  this.#toggleLintPanel(Boolean(linters[lang]));
228
+ this.prefer({});
223
229
  }
224
230
 
225
231
  /**
@@ -1,9 +1,9 @@
1
- import {CodeMirror} from './base';
1
+ import {CodeMirror6} from './codemirror';
2
2
  import type {KeyBinding, Command} from '@codemirror/view';
3
3
 
4
4
  const entity = {'"': 'quot', "'": 'apos', '<': 'lt', '>': 'gt', '&': 'amp', ' ': 'nbsp'};
5
5
  const convert = (func: (str: string) => string): Command => (view): true => {
6
- CodeMirror.replaceSelections(view, func);
6
+ CodeMirror6.replaceSelections(view, func);
7
7
  return true;
8
8
  },
9
9
  escapeHTML = convert(str => [...str].map(c => {
@@ -20,17 +20,9 @@ const convert = (func: (str: string) => string): Command => (view): true => {
20
20
  } catch {}
21
21
  }
22
22
  return encodeURIComponent(str);
23
- }),
24
- escapeHash = convert(str => {
25
- try {
26
- return decodeURIComponent(str.replace(/\.(?=[\da-f]{2})/giu, '%'));
27
- } catch {
28
- return str;
29
- }
30
23
  });
31
24
 
32
- export const keymap: KeyBinding[] = [
33
- {key: 'Mod-/', run: escapeHTML},
34
- {key: 'Mod-\\', run: escapeURI},
35
- {key: 'Shift-Mod-\\', run: escapeHash},
25
+ export const keyMap: KeyBinding[] = [
26
+ {key: 'Mod-[', run: escapeHTML},
27
+ {key: 'Mod-]', run: escapeURI},
36
28
  ];