wikiplus-highlight 2.7.5 → 2.7.6

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/README.md CHANGED
@@ -1,5 +1,6 @@
1
1
  # Wikiplus-highlight
2
2
  [![jsdelivr hits](https://img.shields.io/jsdelivr/gh/hd/bhsd-harry/Wikiplus-highlight.svg)](https://github.com/bhsd-harry/Wikiplus-highlight)
3
+ [![jsdelivr hits](https://img.shields.io/jsdelivr/npm/hd/wikiplus-highlight.svg)](https://www.npmjs.com/package/wikiplus-highlight)
3
4
  [![npm version](https://badge.fury.io/js/wikiplus-highlight.svg)](https://www.npmjs.com/package/wikiplus-highlight)
4
5
  [![npm downloads](https://img.shields.io/npm/dw/wikiplus-highlight.svg)](https://www.npmjs.com/package/wikiplus-highlight)
5
6
 
@@ -12,13 +13,13 @@
12
13
  在*个人 JS 页*添加以下代码:
13
14
 
14
15
  ```javascript
15
- mw.loader.load('//cdn.jsdelivr.net/npm/wikiplus-highlight@2.7.5');
16
+ mw.loader.load('//cdn.jsdelivr.net/npm/wikiplus-highlight@2.7.6');
16
17
  ```
17
18
 
18
19
 
19
20
 
20
21
  ```javascript
21
- mw.loader.load('//unpkg.com/wikiplus-highlight@2.7.5/dist/main.min.js');
22
+ mw.loader.load('//unpkg.com/wikiplus-highlight@2.7.6/dist/main.min.js');
22
23
  ```
23
24
 
24
25
  ### 稳定版本
@@ -39,7 +40,7 @@ mw.loader.load('//unpkg.com/wikiplus-highlight/dist/main.min.js');
39
40
 
40
41
  ## 更多插件
41
42
 
42
- 使用 *Vector* 皮肤时,在右上角的【更多】菜单将添加一个【Wikiplus高亮设置】选项,点击后可以选择想要加载的 CodeMirror 插件。默认加载【搜索】插件。
43
+ 使用 *[Vector](https://www.mediawiki.org/wiki/Skin:Vector)* 皮肤或 MediaWiki 1.35 及以上的 *[Minerva Neue](https://www.mediawiki.org/wiki/Skin:Minerva_Neue)* 皮肤时,在右上角的【更多】菜单将添加一个【Wikiplus高亮设置】选项,点击后可以选择想要加载的 CodeMirror 插件。其他桌面版皮肤(包括 *[Timeless](https://www.mediawiki.org/wiki/Skin:Timeless)*、*[MonoBook](https://www.mediawiki.org/wiki/Skin:MonoBook)* 和 *[Citizen](https://www.mediawiki.org/wiki/Skin:Citizen)*)会在类似性质的菜单中插入这一选项。默认加载【搜索】插件。修改插件设置后,不需要重载页面,只需打开一个新的 Wikiplus 编辑框就会立刻生效。
43
44
 
44
45
  ### 搜索
45
46
 
@@ -49,7 +50,37 @@ mw.loader.load('//unpkg.com/wikiplus-highlight/dist/main.min.js');
49
50
  - Ctrl(Cmd)-G: 搜索下一处
50
51
  - Shift-Ctrl(Cmd)-G: 搜索上一处
51
52
 
52
- 搜索可以使用字符串,也可以使用形如 `/re/` 或 `/re/i` 的正则表达式。正则表达式仅接受可选的 `i` 修饰符,暂不接受其他修饰符。
53
+ 除了使用以上快捷键,也可以通过在搜索框中按下 `Enter` 键或点击搜索框右侧的 `▼` 按钮来执行搜索下一处的命令,点击 `▲` 按钮将执行搜索上一处的命令。搜索可以使用字符串,也可以使用形如 `/re/` 或 `/re/i` 的正则表达式。正则表达式仅接受可选的 `i` 修饰符,暂不接受其他修饰符。全文中匹配的字符都会添加淡粉色背景。如果没有匹配的结果,搜索框会添加粉色背景。
54
+
55
+ ### 高亮显示光标所在行
56
+
57
+ 使用这一插件时,如果当前没有选中的文字,光标所在行将添加浅蓝色背景。
58
+
59
+ ### 显示尾随空格
60
+
61
+ 使用这一插件时,每一行的尾随空格将添加红色波浪下划线。
62
+
63
+ ### 高亮显示匹配和未匹配的括号
64
+
65
+ 与 MediaWiki 官方提供的 [CodeMirror](https://www.mediawiki.org/wiki/Extension:CodeMirror) 扩展不同,这一插件只会在光标位于括号(包括 `{}`、`[]`,JavaScript、CSS 和 Lua 模式下还包括 `()`)处时才会生效,但括号匹配时会考虑其语法含义。以下是一个简单的例子:
66
+
67
+ ```wikitext
68
+ <!--[-->]
69
+ ```
70
+
71
+ CodeMirror 扩展会错误地匹配 `<!-- -->` 注释内外的括号,而这个插件不会。匹配的括号对会添加绿色边框,未匹配的单个括号会添加黄色边框。
72
+
73
+ ### 高亮显示匹配和未匹配的标签
74
+
75
+ 匹配的标签对或自封闭标签会添加浅绿色背景,未匹配的标签会添加浅黄色背景。注意被高亮标记为错误的标签不会进行匹配。
76
+
77
+ ### 右键点击可打开模板或模块页面
78
+
79
+ 右键点击被高亮标记为模板标题或 `#invoke` 魔术字的第一个参数(即模块标题)时,会在新标签页打开对应页面。如果当前站点安装了 [Widget](https://www.mediawiki.org/wiki/Extension:Widget) 扩展,则当右键点击 `#widget` 魔术字的第一个参数(即小部件标题)时会在新标签页打开对应小部件的编辑界面(即 `action=edit`)。
80
+
81
+ ### 代码缩进使用空格而非 Tab
82
+
83
+ 这不是一个真正意义上的插件,而是一个设置选项。默认设置下使用 Tab 进行缩进。勾选这一选项时,会出现一个新的文本框以设置缩进对应的空格个数,初始值为 `4`。
53
84
 
54
85
  ## Supported languages
55
86
 
package/bump.sh CHANGED
@@ -1,14 +1,22 @@
1
1
  #!/usr/local/bin/bash
2
- sed -i '' -E "s/version = '.+'/version = '$1'/" main.js
3
- uglifyjs main.js -c -m --comments --source-map 'url=main.min.js.map,root="../"' -o dist/main.min.js
4
- sed -i '' -E "s/\"version\": \".+\"/\"version\": \"$1\"/" package.json
5
- perl -pi -e "s|wikiplus-highlight@\d+\..+?(['/])|wikiplus-highlight\@$1\$1|" README.md
6
- for file in i18n/*
7
- do
8
- sed -i '' -E "s/\"wphl-version\": \".+\"/\"wphl-version\": \"$1\"/" $file
9
- done
10
- git add -A
11
- git commit -m "chore: bump version to $1"
12
- git push
13
- git tag $1
14
- git push origin $1
2
+ if [[ $2 == 'npm' ]]
3
+ then
4
+ perl -pi -e "s|wikiplus-highlight@\d+\..+?(['/])|wikiplus-highlight\@$1\$1|" README.md
5
+ sed -i '' -E "s/\"version\": \".+\"/\"version\": \"$1\"/" package.json
6
+ git add -A
7
+ git commit -m "chore: publish $1 to npm"
8
+ git push
9
+ npm publish
10
+ else
11
+ sed -i '' -E "s/version = '.+'/version = '$1'/" main.js
12
+ uglifyjs main.js -c -m --comments --source-map 'url=main.min.js.map,root="../"' -o dist/main.min.js
13
+ for file in i18n/*
14
+ do
15
+ sed -i '' -E "s/\"wphl-version\": \".+\"/\"wphl-version\": \"$1\"/" $file
16
+ done
17
+ git add -A
18
+ git commit -m "chore: bump version to $1"
19
+ git push
20
+ git tag $1
21
+ git push origin $1
22
+ fi
package/dist/main.min.js CHANGED
@@ -4,5 +4,5 @@
4
4
  * @author 机智的小鱼君 <https://github.com/Dragon-Fish>
5
5
  * @license GPL-3.0
6
6
  */
7
- (async()=>{"use strict";var e="2.7.5";const t="object"==typeof mw.storage&&"function"==typeof mw.storage.getObject?mw.storage:{getObject(e){e=localStorage.getItem(e);if(!1===e)return!1;try{return JSON.parse(e)}catch(e){return null}},setObject(e,i){var t;try{return t=JSON.stringify(i),localStorage.setItem(e,t)}catch(e){return!1}}},g=Object.fromEntries||(e=>{const i={};for(var[t,a]of e)i[t]=a;return i}),n=e=>e.split(".").map(e=>Number(e));const m=(e,...i)=>mw.msg("wphl-"+e,...i);var i=(...i)=>()=>{var e=$("<p>",{html:m(...i)});return mw.notify(e,{type:"success",autoHideSeconds:"long"}),e},a=n(e).slice(0,2).join(".");const o="//fastly.jsdelivr.net",r="npm/codemirror@5.65.3",l="gh/bhsd-harry/codemirror-mediawiki@1.0",s="npm/wikiplus-highlight@"+a,{wgPageName:u,wgNamespaceNumber:h,wgPageContentModel:p,wgServerName:E,wgScriptPath:P,wgUserLanguage:N,skin:c}=mw.config.values,w=null!==mw.loader.getState("ext.CodeMirror"),d=t.getObject("InPageEditMwConfig")||{},k=""+E+P,f=d[k]||{},b=f.time<Date.now()-2592e6,Q={css:"css","sanitized-css":"css",javascript:"javascript",json:"javascript",wikitext:"mediawiki"},x=w?{lib:"ext.CodeMirror.lib",css:"ext.CodeMirror.lib.mode.css",javascript:"ext.CodeMirror.lib.mode.javascript",lua:r+"/mode/lua/lua.min.js",mediawiki:b?"ext.CodeMirror.data":[],htmlmixed:"ext.CodeMirror.lib.mode.htmlmixed",xml:[]}:{lib:r+"/lib/codemirror.min.js",css:r+"/mode/css/css.min.js",javascript:r+"/mode/javascript/javascript.min.js",lua:r+"/mode/lua/lua.min.js",mediawiki:[],htmlmixed:r+"/mode/htmlmixed/htmlmixed.min.js",xml:r+"/mode/xml/xml.min.js"},v={searchcursor:r+"/addon/search/searchcursor.min.js",search:s+"/search.min.js",activeLine:r+"/addon/selection/active-line.min.js",markSelection:r+"/addon/selection/mark-selection.min.js",trailingspace:r+"/addon/edit/trailingspace.min.js",matchBrackets:r+"/addon/edit/matchbrackets.min.js",matchTags:s+"/matchtags.min.js"};let j=t.getObject("Wikiplus-highlight-addons")||["search"],y=t.getObject("Wikiplus-highlight-indent")||"4";const C=document.getElementById("wphl-contextmenu")||mw.loader.addStyleTag("#Wikiplus-CodeMirror .cm-mw-template-name{cursor:pointer}");C.id="wphl-contextmenu",C.disabled=!0;let W=t.getObject("Wikiplus-highlight-i18n"),S;W?((e,i)=>{var[e,t]=n(e),[i,a]=n(i);return e<i||e===i&&t<a})(W["wphl-version"],e)&&(S=i("welcome-upgrade",e)):(W={},S=i("welcome"));const M={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"}[N]||"en",U=`${o}/${s}/i18n/${M}.json`,O=W["wphl-version"]===a;e=Promise.all([mw.loader.using("mediawiki.util"),(async()=>{O&&W["wphl-lang"]===M||(W=await $.ajax(U,{dataType:"json",cache:!0}),t.setObject("Wikiplus-highlight-i18n",W)),mw.messages.set(W)})()]);const _=(e,i)=>{if(0!==e.length)return i?mw.loader.using(e):$.ajax(o+"/"+(1<e.length?"combine/":"")+e.join(),{dataType:"script",cache:!0})};let z;const D=async e=>{let i=[];const t=[],a=[],n="function"==typeof window.CodeMirror,s=n?window.CodeMirror:{modes:{},prototype:{},commands:{},optionHandlers:{}};["mediawiki","widget"].includes(e)&&!s.modes.mediawiki&&(mw.loader.load(`${o}/${l}/mediawiki.min.css`,"text/css"),(w?t:i).push(l+"/mediawiki.min.js")),"mediawiki"===e&&"object"==typeof f.config&&f.config.tags.html&&(e="html"),n||((w?i:a).push(x.lib),w||mw.loader.load(`${o}/${r}/lib/codemirror.min.css`,"text/css")),!s.prototype.getSearchCursor&&j.includes("search")&&a.push(v.searchcursor),!s.commands.findForward&&j.includes("search")&&a.push(v.search),!s.optionHandlers.styleActiveLine&&j.includes("activeLine")&&a.push(v.activeLine),!s.optionHandlers.styleSelectedText&&j.includes("search")&&a.push(v.markSelection),!s.optionHandlers.showTrailingSpace&&j.includes("trailingspace")&&a.push(v.trailingspace),!s.optionHandlers.matchBrackets&&j.includes("matchBrackets")&&a.push(v.matchBrackets),!s.optionHandlers.matchTags&&j.includes("matchTags")&&a.push(v.matchTags),["widget","html"].includes(e)?["css","javascript","mediawiki","htmlmixed","xml"].forEach(e=>{s.modes[e]||(i=i.concat(x[e]))}):s.modes[e]||("lua"===e?(w?t:i).push(x.lua):i=i.concat(x[e])),n?await Promise.all([_(i,w),_(t),_(a)]):w?(await _(i,!0),await Promise.all([_(t),_(a)])):(await _(a),await _(i))},A=e=>{d[k]={config:e,time:Date.now()},t.setObject("InPageEditMwConfig",d)},V=async(e,i)=>{var t=i?"javascript":await(async()=>{if(![274,828].includes(h)||u.endsWith("/doc"))return u.endsWith("/doc")?"mediawiki":Q[p];{const e=274===h?"Widget":"Lua";return await mw.loader.using(["oojs-ui-windows","oojs-ui.styles.icons-content"]),await OO.ui.confirm(m("contentmodel"),{actions:[{label:e},{label:"Wikitext",action:"accept"}]})?"mediawiki":e.toLowerCase()}})(),a=D(t);const[n]=await Promise.all([(async(i,t)=>{if(["mediawiki","widget"].includes(i)){w&&b&&await t;let e=mw.config.get("extCodeMirrorConfig");if(e||b||!O||({config:e}=f,mw.config.set("extCodeMirrorConfig",e)),e&&e.redirect&&e.img)return e;if(e)return e;const{magicwords:a,extensiontags:n,functionhooks:s,variables:o}=(await(new mw.Api).get({meta:"siteinfo",siprop:e?"magicwords":"magicwords|extensiontags|functionhooks|variables",formatversion:2}))["query"],r=["msg","raw","msgnw","subst","safesubst"];i=e=>e.flatMap(({aliases:e,name:i})=>e.map(e=>({alias:e,name:i}))),t=e=>g(e.map(({alias:e,name:i})=>[e.replace(/:$/,""),i]));if(e){const[l]=e["functionSynonyms"];l.subst||i(a.filter(({name:e})=>r.includes(e))).forEach(({alias:e,name:i})=>{l[e.replace(/:$/,"")]=i})}else{e={tagModes:{pre:"mw-tag-pre",nowiki:"mw-tag-nowiki",ref:"text/mediawiki"},tags:g(n.map(e=>[e.slice(1,-1),!0])),urlProtocols:mw.config.get("wgUrlProtocols")};const c=new Set([...s,...o,...r]),d=a.filter(({name:e,aliases:i})=>i.some(e=>/^__.+__$/.test(e))||c.has(e)),m=i(d.filter(e=>e["case-sensitive"])),u=i(d.filter(e=>!e["case-sensitive"])).map(({alias:e,name:i})=>({alias:e.toLowerCase(),name:i}));e.doubleUnderscore=[t(u.filter(({alias:e})=>/^__.+__$/.test(e))),t(m.filter(({alias:e})=>/^__.+__$/.test(e)))],e.functionSynonyms=[t(u.filter(({alias:e})=>!/^__.+__|^#$/.test(e))),t(m.filter(({alias:e})=>!/^__.+__|^#$/.test(e)))]}return e.redirect=a.find(({name:e})=>"redirect"===e).aliases,e.img=t(i(a.filter(({name:e})=>e.startsWith("img_")))),mw.config.set("extCodeMirrorConfig",e),A(e),e}})(t,a),a]);"mediawiki"===t&&n.tags.html?(n.tagModes.html="htmlmixed",await D("html")):"widget"!==t||CodeMirror.mimeModes.widget||CodeMirror.defineMIME("widget",{name:"htmlmixed",tags:{noinclude:[[null,null,"mediawiki"]]}});var a=e.height(),s=(z&&z.toTextArea(),i||"json"===p),o=$.client.profile()["name"];(z=CodeMirror.fromTextArea(e[0],$.extend({inputStyle:"safari"===o?"textarea":"contenteditable",lineNumbers:!0,lineWrapping:!0,mode:t,mwConfig:n,json:s,styleActiveLine:j.includes("activeLine"),styleSelectedText:j.includes("search"),showTrailingSpace:j.includes("trailingspace"),matchBrackets:j.includes("matchBrackets")&&("mediawiki"!==t&&!s||{bracketRegex:/[{}[\]]/}),matchTags:j.includes("matchBrackets")&&["mediawiki","widget"].includes(t)},"mediawiki"===t?{}:{indentUnit:j.includes("indentWithSpace")?y:"4",indentWithTabs:!j.includes("indentWithSpace")}))).setSize(null,a),z.refresh();const r=z.getWrapperElement();if(r.id="Wikiplus-CodeMirror",["mediawiki","widget"].includes(t)&&j.includes("contextmenu")){C.disabled=!1;const[l]=mw.config.get("extCodeMirrorConfig")["functionSynonyms"];e=i=>Object.keys(l).filter(e=>l[e]===i).map(e=>e.startsWith("#")?e:"#"+e);const c=e("invoke"),d=e("widget");await mw.loader.using("mediawiki.Title"),$(r).on("contextmenu",".cm-mw-template-name",function(){const e=this.textContent.replace(/\u200e/g,"").trim(),i=new mw.Title(e);return 0!==i.namespace||e.startsWith(":")?open(i.getUrl(),"_blank"):open(mw.util.getUrl("Template:"+e),"_blank"),!1}).on("contextmenu",".cm-mw-parserfunction-name + .cm-mw-parserfunction-delimiter + .cm-mw-parserfunction",function(){var e=this.previousSibling.previousSibling.textContent.trim().toLowerCase();return c.includes(e)?open(mw.util.getUrl("Module:"+this.textContent),"_blank"):d.includes(e)&&open(mw.util.getUrl("Widget:"+this.textContent,{action:"edit"}),"_blank"),!1})}else C.disabled=!0;$("#Wikiplus-Quickedit-Jump").children("a").attr("href","#Wikiplus-CodeMirror"),i||(o=()=>{$("#Wikiplus-Quickedit-Submit").triggerHandler("click")},s=()=>{$("#Wikiplus-Quickedit-MinorEdit").click(),$("#Wikiplus-Quickedit-Submit").triggerHandler("click")},z.addKeyMap($.extend({"Ctrl-S":o,"Cmd-S":o,"Shift-Ctrl-S":s,"Shift-Cmd-S":s},Wikiplus.getSetting("esc_to_exit_quickedit")?{Esc(){$("#Wikiplus-Quickedit-Back").triggerHandler("click")}}:{}))),mw.hook("wiki-codemirror").fire(z)},F=new MutationObserver(e=>{const i=$(e.flatMap(({addedNodes:e})=>[...e])).find("#Wikiplus-Quickedit, #Wikiplus-Setting-Input");0!==i.length&&V(i,"Wikiplus-Setting-Input"===i.attr("id"))}),J=(F.observe(document.body,{childList:!0}),document.getElementById("wphl-style")||mw.loader.addStyleTag("#Wikiplus-Quickedit+.CodeMirror,#Wikiplus-Setting-Input+.CodeMirror{border:1px solid #c8ccd1;line-height:1.3;clear:both}div.Wikiplus-InterBox{font-size:14px;z-index:100}.skin-minerva .Wikiplus-InterBox{font-size:16px}.cm-trailingspace{text-decoration:underline wavy red}div.CodeMirror span.CodeMirror-matchingbracket{box-shadow:0 0 0 2px #9aef98}div.CodeMirror span.CodeMirror-nonmatchingbracket{box-shadow:0 0 0 2px #eace64}#Wikiplus-highlight-dialog .oo-ui-messageDialog-title{margin-bottom:0.28571429em}#Wikiplus-highlight-dialog .oo-ui-flaggedElement-notice{font-weight:normal;margin:0}")),{get:q=function(e){return e.value},set:K=function(e,i){e.value=i}}=(J.id="wphl-style",$.valHooks.textarea||{}),R=e=>["Wikiplus-Quickedit","Wikiplus-Setting-Input"].includes(e.id);$.valHooks.textarea={get(e){return R(e)&&z?z.getValue():q(e)},set(e,i){R(e)&&z?z.setValue(i):K(e,i)}},await e;let T,L,I,B,H;const G=(e=j)=>{H.toggle(e.includes("indentWithSpace"))};const X=$(mw.util.addPortletLink({minerva:"page-actions-overflow",citizen:"p-actions"}[c]||"p-cactions","#",m("portlet"),"wphl-settings")).click(async e=>{if(e.preventDefault(),!T){await mw.loader.using(["oojs-ui-windows","oojs-ui.styles.icons-content"]),T=new OO.ui.MessageDialog({id:"Wikiplus-highlight-dialog"});const i=new OO.ui.WindowManager;i.$element.appendTo(document.body),i.addWindows([T]),L=new OO.ui.CheckboxMultiselectInputWidget({options:[{data:"search",label:m("addon-search")},{data:"activeLine",label:m("addon-active-line")},{data:"trailingspace",label:m("addon-trailingspace")},{data:"matchBrackets",label:m("addon-matchbrackets")},{data:"matchTags",label:m("addon-matchtags")},{data:"contextmenu",label:m("addon-contextmenu")},{data:"indentWithSpace",label:m("addon-indentwithspace")}],value:j}).on("change",G),I=new OO.ui.NumberInputWidget({min:0,value:y}),B=new OO.ui.FieldLayout(L,{label:m("addon-label"),notices:[m("addon-notice")],align:"top"}),H=new OO.ui.FieldLayout(I,{label:m("addon-indent")}),G()}T.open({title:m("addon-title"),message:B.$element.add(H.$element).add($("<p>",{html:m("feedback")})),actions:[{action:"reject",label:mw.msg("ooui-dialog-message-reject")},{action:"accept",label:mw.msg("ooui-dialog-message-accept"),flags:"progressive"}],size:"en"===M?"medium":"small"}).closing.then(e=>{B.$element.detach(),H.$element.detach(),"object"==typeof e&&"accept"===e.action&&(j=L.getValue(),y=I.getValue(),t.setObject("Wikiplus-highlight-addons",j),t.setObject("Wikiplus-highlight-indent",y))})});"minerva"===c&&X.find("a").addClass("mw-ui-icon-minerva-settings"),"function"==typeof S&&S().find("#wphl-settings-notify").click(e=>{e.preventDefault(),$("#wphl-settings").triggerHandler("click")})})();
7
+ (async()=>{"use strict";var e="2.7.6";const t="object"==typeof mw.storage&&"function"==typeof mw.storage.getObject?mw.storage:{getObject(e){e=localStorage.getItem(e);if(!1===e)return!1;try{return JSON.parse(e)}catch(e){return null}},setObject(e,i){var t;try{return t=JSON.stringify(i),localStorage.setItem(e,t)}catch(e){return!1}}},g=Object.fromEntries||(e=>{const i={};for(var[t,a]of e)i[t]=a;return i}),n=e=>e.split(".").map(e=>Number(e));const m=(e,...i)=>mw.msg("wphl-"+e,...i);var i=(...i)=>()=>{var e=$("<p>",{html:m(...i)});return mw.notify(e,{type:"success",autoHideSeconds:"long"}),e},a=n(e).slice(0,2).join(".");const o="//fastly.jsdelivr.net",r="npm/codemirror@5.65.3",l="gh/bhsd-harry/codemirror-mediawiki@1.1.1",s="npm/wikiplus-highlight@"+a,{wgPageName:u,wgNamespaceNumber:h,wgPageContentModel:p,wgServerName:P,wgScriptPath:E,wgUserLanguage:N,skin:c}=mw.config.values,w=null!==mw.loader.getState("ext.CodeMirror"),d=t.getObject("InPageEditMwConfig")||{},k=""+P+E,f=d[k]||{},b=f.time<Date.now()-2592e6,Q={css:"css","sanitized-css":"css",javascript:"javascript",json:"javascript",wikitext:"mediawiki"},x=w?{lib:"ext.CodeMirror.lib",css:"ext.CodeMirror.lib.mode.css",javascript:"ext.CodeMirror.lib.mode.javascript",lua:r+"/mode/lua/lua.min.js",mediawiki:b?"ext.CodeMirror.data":[],htmlmixed:"ext.CodeMirror.lib.mode.htmlmixed",xml:[]}:{lib:r+"/lib/codemirror.min.js",css:r+"/mode/css/css.min.js",javascript:r+"/mode/javascript/javascript.min.js",lua:r+"/mode/lua/lua.min.js",mediawiki:[],htmlmixed:r+"/mode/htmlmixed/htmlmixed.min.js",xml:r+"/mode/xml/xml.min.js"},v={searchcursor:r+"/addon/search/searchcursor.min.js",search:s+"/search.min.js",activeLine:r+"/addon/selection/active-line.min.js",markSelection:r+"/addon/selection/mark-selection.min.js",trailingspace:r+"/addon/edit/trailingspace.min.js",matchBrackets:r+"/addon/edit/matchbrackets.min.js",matchTags:s+"/matchtags.min.js"};let j=t.getObject("Wikiplus-highlight-addons")||["search"],y=t.getObject("Wikiplus-highlight-indent")||"4";const C=document.getElementById("wphl-contextmenu")||mw.loader.addStyleTag("#Wikiplus-CodeMirror .cm-mw-template-name{cursor:pointer}");C.id="wphl-contextmenu",C.disabled=!0;let W=t.getObject("Wikiplus-highlight-i18n"),S;W?((e,i)=>{var[e,t]=n(e),[i,a]=n(i);return e<i||e===i&&t<a})(W["wphl-version"],e)&&(S=i("welcome-upgrade",e)):(W={},S=i("welcome"));const M={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"}[N]||"en",U=`${o}/${s}/i18n/${M}.json`,O=W["wphl-version"]===a;e=Promise.all([mw.loader.using("mediawiki.util"),(async()=>{O&&W["wphl-lang"]===M||(W=await $.ajax(U,{dataType:"json",cache:!0}),t.setObject("Wikiplus-highlight-i18n",W)),mw.messages.set(W)})()]);const _=(e,i)=>0===e.length?Promise.resolve():i?mw.loader.using(e):$.ajax(o+"/"+(1<e.length?"combine/":"")+e.join(),{dataType:"script",cache:!0});let z;const D=async e=>{let i=[];const t=[],a=[],n="function"==typeof window.CodeMirror,s=n?window.CodeMirror:{modes:{},prototype:{},commands:{},optionHandlers:{}};["mediawiki","widget"].includes(e)&&!s.modes.mediawiki&&(mw.loader.load(`${o}/${l}/mediawiki.min.css`,"text/css"),(w?t:i).push(l+"/mediawiki.min.js")),"mediawiki"===e&&"object"==typeof f.config&&f.config.tags.html&&(e="html"),n||((w?i:a).push(x.lib),w||mw.loader.load(`${o}/${r}/lib/codemirror.min.css`,"text/css")),!s.prototype.getSearchCursor&&j.includes("search")&&a.push(v.searchcursor),!s.commands.findForward&&j.includes("search")&&a.push(v.search),!s.optionHandlers.styleActiveLine&&j.includes("activeLine")&&a.push(v.activeLine),!s.optionHandlers.styleSelectedText&&j.includes("search")&&a.push(v.markSelection),!s.optionHandlers.showTrailingSpace&&j.includes("trailingspace")&&a.push(v.trailingspace),!s.optionHandlers.matchBrackets&&j.includes("matchBrackets")&&a.push(v.matchBrackets),!s.optionHandlers.matchTags&&j.includes("matchTags")&&a.push(v.matchTags),["widget","html"].includes(e)?["css","javascript","mediawiki","htmlmixed","xml"].forEach(e=>{s.modes[e]||(i=i.concat(x[e]))}):s.modes[e]||("lua"===e?(w?t:i).push(x.lua):i=i.concat(x[e])),n?await Promise.all([_(i,w),_(t),_(a)]):w?(await _(i,!0),await Promise.all([_(t),_(a)])):(await _(a),await _(i))},A=e=>{d[k]={config:e,time:Date.now()},t.setObject("InPageEditMwConfig",d)},V=async(e,i)=>{var t=i?"javascript":await(async()=>{if(![274,828].includes(h)||u.endsWith("/doc"))return u.endsWith("/doc")?"mediawiki":Q[p];{const e=274===h?"Widget":"Lua";return await mw.loader.using(["oojs-ui-windows","oojs-ui.styles.icons-content"]),await OO.ui.confirm(m("contentmodel"),{actions:[{label:e},{label:"Wikitext",action:"accept"}]})?"mediawiki":e.toLowerCase()}})(),a=D(t);const[n]=await Promise.all([(async(i,t)=>{if(["mediawiki","widget"].includes(i)){w&&b&&await t;let e=mw.config.get("extCodeMirrorConfig");if(e||b||!O||({config:e}=f,mw.config.set("extCodeMirrorConfig",e)),e&&e.redirect&&e.img)return e;if(e)return e;const{magicwords:a,extensiontags:n,functionhooks:s,variables:o}=(await(new mw.Api).get({meta:"siteinfo",siprop:e?"magicwords":"magicwords|extensiontags|functionhooks|variables",formatversion:2}))["query"],r=["msg","raw","msgnw","subst","safesubst"];i=e=>e.flatMap(({aliases:e,name:i})=>e.map(e=>({alias:e,name:i}))),t=e=>g(e.map(({alias:e,name:i})=>[e.replace(/:$/,""),i]));if(e){const[l]=e["functionSynonyms"];l.subst||i(a.filter(({name:e})=>r.includes(e))).forEach(({alias:e,name:i})=>{l[e.replace(/:$/,"")]=i})}else{e={tagModes:{pre:"mw-tag-pre",nowiki:"mw-tag-nowiki",ref:"text/mediawiki"},tags:g(n.map(e=>[e.slice(1,-1),!0])),urlProtocols:mw.config.get("wgUrlProtocols")};const c=new Set([...s,...o,...r]),d=a.filter(({name:e,aliases:i})=>i.some(e=>/^__.+__$/.test(e))||c.has(e)),m=i(d.filter(e=>e["case-sensitive"])),u=i(d.filter(e=>!e["case-sensitive"])).map(({alias:e,name:i})=>({alias:e.toLowerCase(),name:i}));e.doubleUnderscore=[t(u.filter(({alias:e})=>/^__.+__$/.test(e))),t(m.filter(({alias:e})=>/^__.+__$/.test(e)))],e.functionSynonyms=[t(u.filter(({alias:e})=>!/^__.+__|^#$/.test(e))),t(m.filter(({alias:e})=>!/^__.+__|^#$/.test(e)))]}return e.redirect=a.find(({name:e})=>"redirect"===e).aliases,e.img=t(i(a.filter(({name:e})=>e.startsWith("img_")))),mw.config.set("extCodeMirrorConfig",e),A(e),e}})(t,a),a]);"mediawiki"===t&&n.tags.html?(n.tagModes.html="htmlmixed",await D("html")):"widget"!==t||CodeMirror.mimeModes.widget||CodeMirror.defineMIME("widget",{name:"htmlmixed",tags:{noinclude:[[null,null,"mediawiki"]]}});var a=e.height(),s=(z&&z.toTextArea(),i||"json"===p),o=$.client.profile()["name"];(z=CodeMirror.fromTextArea(e[0],$.extend({inputStyle:"safari"===o?"textarea":"contenteditable",lineNumbers:!0,lineWrapping:!0,mode:t,mwConfig:n,json:s,styleActiveLine:j.includes("activeLine"),styleSelectedText:j.includes("search"),showTrailingSpace:j.includes("trailingspace"),matchBrackets:j.includes("matchBrackets")&&("mediawiki"!==t&&!s||{bracketRegex:/[{}[\]]/}),matchTags:j.includes("matchBrackets")&&["mediawiki","widget"].includes(t)},"mediawiki"===t?{}:{indentUnit:j.includes("indentWithSpace")?y:"4",indentWithTabs:!j.includes("indentWithSpace")}))).setSize(null,a),z.refresh();const r=z.getWrapperElement();if(r.id="Wikiplus-CodeMirror",["mediawiki","widget"].includes(t)&&j.includes("contextmenu")){C.disabled=!1;const[l]=mw.config.get("extCodeMirrorConfig")["functionSynonyms"];e=i=>Object.keys(l).filter(e=>l[e]===i).map(e=>e.startsWith("#")?e:"#"+e);const c=e("invoke"),d=e("widget");await mw.loader.using("mediawiki.Title"),$(r).on("contextmenu",".cm-mw-template-name",function(){const e=this.textContent.replace(/\u200e/g,"").trim(),i=new mw.Title(e);return 0!==i.namespace||e.startsWith(":")?open(i.getUrl(),"_blank"):open(mw.util.getUrl("Template:"+e),"_blank"),!1}).on("contextmenu",".cm-mw-parserfunction-name + .cm-mw-parserfunction-delimiter + .cm-mw-parserfunction",function(){var e=this.previousSibling.previousSibling.textContent.trim().toLowerCase();return c.includes(e)?open(mw.util.getUrl("Module:"+this.textContent),"_blank"):d.includes(e)&&open(mw.util.getUrl("Widget:"+this.textContent,{action:"edit"}),"_blank"),!1})}else C.disabled=!0;$("#Wikiplus-Quickedit-Jump").children("a").attr("href","#Wikiplus-CodeMirror"),i||(o=()=>{$("#Wikiplus-Quickedit-Submit").triggerHandler("click")},s=()=>{$("#Wikiplus-Quickedit-MinorEdit").click(),$("#Wikiplus-Quickedit-Submit").triggerHandler("click")},z.addKeyMap($.extend({"Ctrl-S":o,"Cmd-S":o,"Shift-Ctrl-S":s,"Shift-Cmd-S":s},Wikiplus.getSetting("esc_to_exit_quickedit")?{Esc(){$("#Wikiplus-Quickedit-Back").triggerHandler("click")}}:{}))),mw.hook("wiki-codemirror").fire(z)},F=new MutationObserver(e=>{const i=$(e.flatMap(({addedNodes:e})=>[...e])).find("#Wikiplus-Quickedit, #Wikiplus-Setting-Input");0!==i.length&&V(i,"Wikiplus-Setting-Input"===i.attr("id"))}),J=(F.observe(document.body,{childList:!0}),document.getElementById("wphl-style")||mw.loader.addStyleTag("#Wikiplus-Quickedit+.CodeMirror,#Wikiplus-Setting-Input+.CodeMirror{border:1px solid #c8ccd1;line-height:1.3;clear:both}div.Wikiplus-InterBox{font-size:14px;z-index:100}.skin-minerva .Wikiplus-InterBox{font-size:16px}.cm-trailingspace{text-decoration:underline wavy red}div.CodeMirror span.CodeMirror-matchingbracket{box-shadow:0 0 0 2px #9aef98}div.CodeMirror span.CodeMirror-nonmatchingbracket{box-shadow:0 0 0 2px #eace64}#Wikiplus-highlight-dialog .oo-ui-messageDialog-title{margin-bottom:0.28571429em}#Wikiplus-highlight-dialog .oo-ui-flaggedElement-notice{font-weight:normal;margin:0}")),{get:q=function(e){return e.value},set:K=function(e,i){e.value=i}}=(J.id="wphl-style",$.valHooks.textarea||{}),R=e=>["Wikiplus-Quickedit","Wikiplus-Setting-Input"].includes(e.id);$.valHooks.textarea={get(e){return R(e)&&z?z.getValue():q(e)},set(e,i){R(e)&&z?z.setValue(i):K(e,i)}},await e;let T,L,I,B,H;const G=(e=j)=>{H.toggle(e.includes("indentWithSpace"))};const X=$(mw.util.addPortletLink({minerva:"page-actions-overflow",citizen:"p-actions"}[c]||"p-cactions","#",m("portlet"),"wphl-settings")).click(async e=>{if(e.preventDefault(),!T){await mw.loader.using(["oojs-ui-windows","oojs-ui.styles.icons-content"]),T=new OO.ui.MessageDialog({id:"Wikiplus-highlight-dialog"});const i=new OO.ui.WindowManager;i.$element.appendTo(document.body),i.addWindows([T]),L=new OO.ui.CheckboxMultiselectInputWidget({options:[{data:"search",label:m("addon-search")},{data:"activeLine",label:m("addon-active-line")},{data:"trailingspace",label:m("addon-trailingspace")},{data:"matchBrackets",label:m("addon-matchbrackets")},{data:"matchTags",label:m("addon-matchtags")},{data:"contextmenu",label:m("addon-contextmenu")},{data:"indentWithSpace",label:m("addon-indentwithspace")}],value:j}).on("change",G),I=new OO.ui.NumberInputWidget({min:0,value:y}),B=new OO.ui.FieldLayout(L,{label:m("addon-label"),notices:[m("addon-notice")],align:"top"}),H=new OO.ui.FieldLayout(I,{label:m("addon-indent")}),G()}T.open({title:m("addon-title"),message:B.$element.add(H.$element).add($("<p>",{html:m("feedback")})),actions:[{action:"reject",label:mw.msg("ooui-dialog-message-reject")},{action:"accept",label:mw.msg("ooui-dialog-message-accept"),flags:"progressive"}],size:"en"===M?"medium":"small"}).closing.then(e=>{B.$element.detach(),H.$element.detach(),"object"==typeof e&&"accept"===e.action&&(j=L.getValue(),y=I.getValue(),t.setObject("Wikiplus-highlight-addons",j),t.setObject("Wikiplus-highlight-indent",y))})});"minerva"===c&&X.find("a").addClass("mw-ui-icon-minerva-settings"),"function"==typeof S&&S().find("#wphl-settings-notify").click(e=>{e.preventDefault(),$("#wphl-settings").triggerHandler("click")})})();
8
8
  //# sourceMappingURL=main.min.js.map
@@ -1 +1 @@
1
- {"version":3,"sourceRoot":"../","sources":["main.js"],"names":["version","storage","mw","getObject","key","json","localStorage","getItem","JSON","parse","e","setObject","value","let","stringify","setItem","fromEntries","Object","entries","obj","getVersion","str","split","map","s","Number","msg","args","notify","$p","$","html","type","autoHideSeconds","majorVersion","slice","join","CDN","CM_CDN","MW_CDN","REPO_CDN","wgPageName","page","wgNamespaceNumber","ns","wgPageContentModel","contentmodel","wgServerName","server","wgScriptPath","scriptPath","wgUserLanguage","userLang","skin","config","values","USING_LOCAL","loader","getState","ALL_SETTINGS_CACHE","SITE_ID","SITE_SETTINGS","EXPIRED","time","Date","now","CONTENTMODEL","css","sanitized-css","javascript","wikitext","MODE_LIST","lib","lua","mediawiki","htmlmixed","xml","ADDON_LIST","searchcursor","search","activeLine","markSelection","trailingspace","matchBrackets","matchTags","addons","indent","contextmenuStyle","document","getElementById","addStyleTag","id","disabled","i18n","welcome","a","b","a0","a1","b0","b1","cmpVersion","i18nLang","zh","zh-hans","zh-cn","zh-my","zh-sg","zh-hant","zh-tw","zh-hk","zh-mo","I18N_CDN","isLatest","i18nPromise","Promise","all","using","async","ajax","dataType","cache","messages","set","setI18N","getScript","urls","local","length","cm","initMode","scripts","externalScript","addonScript","loaded","window","CodeMirror","CM","modes","prototype","commands","optionHandlers","includes","load","push","tags","getSearchCursor","findForward","styleActiveLine","styleSelectedText","showTrailingSpace","forEach","lang","concat","updateCachedConfig","renderEditor","$target","setting","mode","endsWith","pageMode","OO","ui","confirm","actions","label","action","toLowerCase","getPageMode","initModePromise","mwConfig","get","redirect","img","magicwords","extensiontags","functionhooks","variables","Api","meta","siprop","formatversion","query","otherMagicwords","getAliases","words","flatMap","aliases","name","alias","getConfig","replace","insensitive","functionSynonyms","subst","filter","tagModes","pre","nowiki","ref","tag","urlProtocols","realMagicwords","Set","allMagicwords","some","test","has","sensitive","word","doubleUnderscore","find","startsWith","getMwConfig","mimeModes","widget","defineMIME","noinclude","height","toTextArea","client","profile","fromTextArea","extend","inputStyle","lineNumbers","lineWrapping","bracketRegex","indentUnit","indentWithTabs","setSize","refresh","wrapper","getWrapperElement","synonyms","getSysnonyms","keys","invoke","on","text","this","textContent","trim","title","Title","namespace","open","getUrl","util","parserFunction","previousSibling","children","attr","submit","triggerHandler","submitMinor","click","addKeyMap","Ctrl-S","Cmd-S","Shift-Ctrl-S","Shift-Cmd-S","Wikiplus","getSetting","Esc","hook","fire","observer","MutationObserver","records","$editArea","addedNodes","wphlStyle","observe","body","childList","elem","valHooks","textarea","isWikiplus","getValue","setValue","dialog","indentWidget","field","indentField","toggleIndent","toggle","$portlet","addPortletLink","minerva","citizen","preventDefault","MessageDialog","windowManager","WindowManager","$element","appendTo","addWindows","CheckboxMultiselectInputWidget","options","data","NumberInputWidget","min","FieldLayout","notices","align","message","add","flags","size","closing","then","detach","addClass"],"mappings":";;;;;;CAOA,uBAGC,IAAMA,EAAU,QAMhB,MAAMC,EAAgC,iBAAfC,GAAGD,SAAwD,mBAAzBC,GAAGD,QAAQE,UACjED,GAAGD,QACH,CACDE,UAAUC,GACHC,EAAOC,aAAaC,QAAQH,GAClC,IAAa,IAATC,EACH,OAAO,EAER,IACC,OAAOG,KAAKC,MAAMJ,GACjB,MAAOK,GACR,OAAO,OAGTC,UAAUP,EAAKQ,GACdC,IAAIR,EACJ,IAEC,OADAA,EAAOG,KAAKM,UAAUF,GACfN,aAAaS,QAAQX,EAAKC,GAChC,MAAOK,GACR,OAAO,KAULM,EAAcC,OAAOD,cAAgBE,IAC1C,MAAMC,EAAM,GACZ,IAAK,GAAM,CAACf,EAAKQ,KAAUM,EAC1BC,EAAIf,GAAOQ,EAEZ,OAAOO,IAQFC,EAAaC,GAAOA,EAAIC,MAAM,KAAKC,IAAIC,GAAKC,OAAOD,IAkBzD,MAAME,EAAM,CAACtB,KAAQuB,IAASzB,GAAGwB,IAAI,QAAQtB,KAAUuB,GAMvD,IAAMC,EAAS,IAAID,IAAS,KAC3B,IAAME,EAAKC,EAAE,MAAO,CAACC,KAAML,KAAOC,KAElC,OADAzB,GAAG0B,OAAOC,EAAI,CAACG,KAAM,UAAWC,gBAAiB,SAC1CJ,GAIFK,EAAed,EAAWpB,GAASmC,MAAM,EAAG,GAAGC,KAAK,KAG1D,MAAMC,EAAM,wBACXC,EAAS,wBACTC,EAAS,yCACTC,EAAW,0BAA0BN,EAGhC,CACLO,WAAYC,EACZC,kBAAmBC,EACnBC,mBAAoBC,EACpBC,aAAcC,EACdC,aAAcC,EACdC,eAAgBC,EAChBC,KAAAA,GACGnD,GAAGoD,OAAOC,OAGRC,EAAuD,OAAzCtD,GAAGuD,OAAOC,SAAS,kBACtCC,EAAqB1D,EAAQE,UAAU,uBAAyB,GAChEyD,EAAU,GAAGZ,EAASE,EACtBW,EAAgBF,EAAmBC,IAAY,GAC/CE,EAAUD,EAAcE,KAAOC,KAAKC,MAAQ,OAEvCC,EAAe,CACpBC,IAAK,MACLC,gBAAiB,MACjBC,WAAY,aACZhE,KAAM,aACNiE,SAAU,aAGLC,EAAYf,EACf,CACDgB,IAAK,qBACLL,IAAK,8BACLE,WAAY,qCACZI,IAAQnC,EAAH,uBACLoC,UAAWZ,EAAU,sBAAwB,GAC7Ca,UAAW,oCACXC,IAAK,IAEJ,CACDJ,IAAQlC,EAAH,yBACL6B,IAAQ7B,EAAH,uBACL+B,WAAe/B,EAAH,qCACZmC,IAAQnC,EAAH,uBACLoC,UAAW,GACXC,UAAcrC,EAAH,mCACXsC,IAAQtC,EAAH,wBAGDuC,EAAa,CAClBC,aAAiBxC,EAAH,oCACdyC,OAAWvC,EAAH,iBACRwC,WAAe1C,EAAH,sCACZ2C,cAAkB3C,EAAH,yCACf4C,cAAkB5C,EAAH,mCACf6C,cAAkB7C,EAAH,mCACf8C,UAAc5C,EAAH,qBAKZ3B,IAAIwE,EAASpF,EAAQE,UAAU,8BAFT,CAAC,UAGtBmF,EAASrF,EAAQE,UAAU,8BAFX,IAKjB,MAAMoF,EAAmBC,SAASC,eAAe,qBAC7CvF,GAAGuD,OAAOiC,YAAY,6DAC1BH,EAAiBI,GAAK,mBACtBJ,EAAiBK,UAAW,EAE5B/E,IAAIgF,EAAO5F,EAAQE,UAAU,2BAC5B2F,EACID,GArGc,CAACE,EAAGC,KACtB,GAAM,CAACC,EAAIC,GAAM9E,EAAW2E,GAC3B,CAACI,EAAIC,GAAMhF,EAAW4E,GACvB,OAAOC,EAAKE,GAAMF,IAAOE,GAAMD,EAAKE,GAqG1BC,CAAWR,EAAK,gBAAiB7F,KAC3C8F,EAAUlE,EAAO,kBAAmB5B,KAHpC6F,EAAO,GACPC,EAAUlE,EAAO,YAKlB,MAIC0E,EAJqB,CACpBC,GAAI,UAAWC,UAAW,UAAWC,QAAS,UAAWC,QAAS,UAAWC,QAAS,UACtFC,UAAW,UAAWC,QAAS,UAAWC,QAAS,UAAWC,QAAS,WAE/C3D,IAAa,KACtC4D,KAAc3E,KAAOG,UAAiB8D,SACtCW,EAAWpB,EAAK,kBAAoB3D,EAiB/BgF,EAAcC,QAAQC,IAAI,CAC/BlH,GAAGuD,OAAO4D,MAAM,mBAZDC,UACVL,GAAYpB,EAAK,eAAiBS,IACtCT,QAAa/D,EAAEyF,KAAQP,EAAY,CAClCQ,SAAU,OACVC,OAAO,IAERxH,EAAQU,UAAU,0BAA2BkF,IAE9C3F,GAAGwH,SAASC,IAAI9B,IAKhB+B,KASD,MAAMC,EAAY,CAACC,EAAMC,KACxB,GAAoB,IAAhBD,EAAKE,OAGT,OAAOD,EACJ7H,GAAGuD,OAAO4D,MAAMS,GAChBhG,EAAEyF,KAAQlF,EAAH,KAAwB,EAAdyF,EAAKE,OAAa,WAAa,IAAKF,EAAK1F,OAAU,CACrEoF,SAAU,SACVC,OAAO,KAKV5G,IAAIoH,EAOJ,MAAMC,EAAiBlG,MAAAA,IACtBnB,IAAIsH,EAAU,GACd,MAAMC,EAAiB,GACtBC,EAAc,GACdC,EAAsC,mBAAtBC,OAAOC,WAMlBC,EAAKH,EACRC,OAAOC,WACP,CACDE,MAAO,GACPC,UAAW,GACXC,SAAU,GACVC,eAAgB,IAGd,CAAC,YAAa,UAAUC,SAAS9G,KAAUyG,EAAGC,MAAMhE,YAEvDxE,GAAGuD,OAAOsF,QAAQ1G,KAAOE,sBAA4B,aACpDiB,EAAc4E,EAAiBD,GAASa,KAAQzG,EAAH,sBAElC,cAATP,GAAwD,iBAAzB6B,EAAcP,QAAuBO,EAAcP,OAAO2F,KAAKlH,OAEjGC,EAAO,QAEHsG,KACH9E,EAAc2E,EAAUE,GAAaW,KAAKzE,EAAUC,KAChDhB,GACJtD,GAAGuD,OAAOsF,QAAQ1G,KAAOC,2BAAiC,cAGvDmG,EAAGE,UAAUO,iBAAmB7D,EAAOyD,SAAS,WACpDT,EAAYW,KAAKnE,EAAWC,eAExB2D,EAAGG,SAASO,aAAe9D,EAAOyD,SAAS,WAC/CT,EAAYW,KAAKnE,EAAWE,SAExB0D,EAAGI,eAAeO,iBAAmB/D,EAAOyD,SAAS,eACzDT,EAAYW,KAAKnE,EAAWG,aAExByD,EAAGI,eAAeQ,mBAAqBhE,EAAOyD,SAAS,WAC3DT,EAAYW,KAAKnE,EAAWI,gBAExBwD,EAAGI,eAAeS,mBAAqBjE,EAAOyD,SAAS,kBAC3DT,EAAYW,KAAKnE,EAAWK,gBAExBuD,EAAGI,eAAe1D,eAAiBE,EAAOyD,SAAS,kBACvDT,EAAYW,KAAKnE,EAAWM,gBAExBsD,EAAGI,eAAezD,WAAaC,EAAOyD,SAAS,cACnDT,EAAYW,KAAKnE,EAAWO,WAEzB,CAAC,SAAU,QAAQ0D,SAAS9G,GAC/B,CAAC,MAAO,aAAc,YAAa,YAAa,OAAOuH,QAAQC,IACzDf,EAAGC,MAAMc,KACbrB,EAAUA,EAAQsB,OAAOlF,EAAUiF,OAG1Bf,EAAGC,MAAM1G,KACP,QAATA,GACFwB,EAAc4E,EAAiBD,GAASa,KAAKzE,EAAUE,KAExD0D,EAAUA,EAAQsB,OAAOlF,EAAUvC,KAIjCsG,QACGnB,QAAQC,IAAI,CACjBS,EAAUM,EAAS3E,GACnBqE,EAAUO,GACVP,EAAUQ,KAED7E,SACJqE,EAAUM,GAAS,SACnBhB,QAAQC,IAAI,CACjBS,EAAUO,GACVP,EAAUQ,aAGLR,EAAUQ,SACVR,EAAUM,KAQZuB,EAAqBpG,IAC1BK,EAAmBC,GAAW,CAC7BN,OAAAA,EACAS,KAAMC,KAAKC,OAEZhE,EAAQU,UAAU,qBAAsBgD,IAsInCgG,EAAerC,MAAOsC,EAASC,KACpC,IAAMC,EAAOD,EAAU,mBAvBJvC,UACnB,IAAI,CAAC,IAAK,KAAKwB,SAASlG,IAAQF,EAAKqH,SAAS,QAUvC,OAAIrH,EAAKqH,SAAS,QACjB,YAED7F,EAAapB,GAbmC,CACtD,MAAMkH,EAAkB,MAAPpH,EAAa,SAAW,MAQzC,aAPM1C,GAAGuD,OAAO4D,MAAM,CAAC,kBAAmB,uCACvB4C,GAAGC,GAAGC,QAAQzI,EAAI,gBAAiB,CACrD0I,QAAS,CACR,CAACC,MAAOL,GACR,CAACK,MAAO,WAAYC,OAAQ,aAGhB,YAAcN,EAASO,gBAaMC,GACtCC,EAAkBvC,EAAS4B,GACjC,KAAM,CAACY,SAAkBvD,QAAQC,IAAI,EAhIlBE,MAAOtF,EAAMyI,KAChC,GAAK,CAAC,YAAa,UAAU3B,SAAS9G,GAAtC,CAIIwB,GAAeM,SACZ2G,EAGP5J,IAAIyC,EAASpD,GAAGoD,OAAOqH,IAAI,uBAK3B,GAJKrH,GAAWQ,IAAWmD,IACzB,CAAC3D,OAAAA,GAAUO,EACZ3D,GAAGoD,OAAOqE,IAAI,sBAAuBrE,IAElCA,GAAUA,EAAOsH,UAAYtH,EAAOuH,IACvC,OAAOvH,EACD,GAAIA,EACV,OAAOA,EASR,KACQ,CAACwH,WAAAA,EAAYC,cAAAA,EAAeC,cAAAA,EAAeC,UAAAA,UACzC,IAAI/K,GAAGgL,KAAMP,IAAI,CAC1BQ,KAAM,WACNC,OAAQ9H,EAAS,aAAe,mDAChC+H,cAAe,KAJfC,SAMKC,EAAkB,CAAC,MAAO,MAAO,QAAS,QAAS,aAQnDC,EAAaC,GAASA,EAAMC,QAAQ,CAAA,CAAEC,QAAAA,EAASC,KAAAA,KAAUD,EAAQpK,IAAIsK,IAAS,CAAEA,MAAAA,EAAOD,KAAAA,MAKvFE,EAAYH,GAAW3K,EAC5B2K,EAAQpK,IAAI,CAAA,CAAEsK,MAAAA,EAAOD,KAAAA,KAAU,CAACC,EAAME,QAAQ,KAAM,IAAKH,KAG1D,GAAKtI,EA8BE,CACN,KAAyB,CAAC0I,GAAgB1I,EAAnC2I,oBACFD,EAAYE,OAChBV,EACCV,EAAWqB,OAAO,CAAA,CAAEP,KAAAA,KAAUL,EAAgBzC,SAAS8C,KACtDrC,QAAQ,CAAA,CAAEsC,MAAAA,EAAOD,KAAAA,MAClBI,EAAYH,EAAME,QAAQ,KAAM,KAAOH,QApC7B,CACZtI,EAAS,CACR8I,SAAU,CACTC,IAAK,aACLC,OAAQ,gBACRC,IAAK,kBAENtD,KAAMjI,EACL+J,EAAcxJ,IAAIiL,GAAO,CAACA,EAAIrK,MAAM,GAAI,IAAI,KAE7CsK,aAAcvM,GAAGoD,OAAOqH,IAAI,mBAE7B,MAAM+B,EAAiB,IAAIC,IAAI,IAAI3B,KAAkBC,KAAcM,IAClEqB,EAAgB9B,EAAWqB,OAAO,CAAA,CAAEP,KAAAA,EAAMD,QAAAA,KACzCA,EAAQkB,KAAKhB,GAAS,WAAWiB,KAAKjB,KAAWa,EAAeK,IAAInB,IAErEoB,EAAYxB,EACXoB,EAAcT,OAAOc,GAAQA,EAAK,oBAEnCjB,EAAcR,EACboB,EAAcT,OAAOc,IAASA,EAAK,oBAClC1L,IAAI,CAAA,CAAEsK,MAAAA,EAAOD,KAAAA,MAAU,CAAEC,MAAOA,EAAMtB,cAAeqB,KAAAA,KACxDtI,EAAO4J,iBAAmB,CACzBpB,EAAUE,EAAYG,OAAO,CAAA,CAAEN,MAAAA,KAAW,WAAWiB,KAAKjB,KAC1DC,EAAUkB,EAAUb,OAAO,CAAA,CAAEN,MAAAA,KAAW,WAAWiB,KAAKjB,MAEzDvI,EAAO2I,iBAAmB,CACzBH,EAAUE,EAAYG,OAAO,CAAA,CAAEN,MAAAA,MAAY,cAAciB,KAAKjB,KAC9DC,EAAUkB,EAAUb,OAAO,CAAA,CAAEN,MAAAA,MAAY,cAAciB,KAAKjB,MAkB9D,OANAvI,EAAOsH,SAAWE,EAAWqC,KAAK,CAAA,CAAEvB,KAAAA,KAAmB,aAATA,GAAqBD,QACnErI,EAAOuH,IAAMiB,EACZN,EAAWV,EAAWqB,OAAO,CAAA,CAAEP,KAAAA,KAAUA,EAAKwB,WAAW,WAE1DlN,GAAGoD,OAAOqE,IAAI,sBAAuBrE,GACrCoG,EAAmBpG,GACZA,IAiCN+J,CAAYvD,EAAMW,GAClBA,IAGY,cAATX,GAAwBY,EAASzB,KAAKlH,MACzC2I,EAAS0B,SAASrK,KAAO,kBACnBmG,EAAS,SACI,WAAT4B,GAAsBtB,WAAW8E,UAAUC,QACrD/E,WAAWgF,WAAW,SAAU,CAC/B5B,KAAM,YACN3C,KAAM,CACLwE,UAAW,CAAC,CAAC,KAAM,KAAM,iBAM5B,IAAMC,EAAS9D,EAAQ8D,SAMjBrN,GAJF4H,GACHA,EAAG0F,aAGS9D,GAA4B,SAAjB/G,GACtB8I,EAAQ9J,EAAE8L,OAAOC,UAAjBjC,SACF3D,EAAKO,WAAWsF,aAAalE,EAAQ,GAAI9H,EAAEiM,OAAO,CACjDC,WAAqB,WAATpC,EAAoB,WAAa,kBAC7CqC,aAAa,EACbC,cAAc,EACdpE,KAAAA,EACAY,SAAAA,EACArK,KAAAA,EACA+I,gBAAiB/D,EAAOyD,SAAS,cACjCO,kBAAmBhE,EAAOyD,SAAS,UACnCQ,kBAAmBjE,EAAOyD,SAAS,iBACnC3D,cAAeE,EAAOyD,SAAS,mBAA8B,cAATgB,IAAwBzJ,GACzE,CAAC8N,aAAc,YAGlB/I,UAAWC,EAAOyD,SAAS,kBAAoB,CAAC,YAAa,UAAUA,SAASgB,IACrE,cAATA,EACA,GACA,CACDsE,WAAY/I,EAAOyD,SAAS,mBAAqBxD,EA9VnC,IA+Vd+I,gBAAiBhJ,EAAOyD,SAAS,uBAGhCwF,QAAQ,KAAMZ,GACjBzF,EAAGsG,UAEH,MAAMC,EAAUvG,EAAGwG,oBAEnB,GADAD,EAAQ7I,GAAK,sBACT,CAAC,YAAa,UAAUmD,SAASgB,IAASzE,EAAOyD,SAAS,eAAgB,CAC7EvD,EAAiBK,UAAW,EAC5B,KAAyB,CAAC8I,GAAaxO,GAAGoD,OAAOqH,IAAI,uBAA9CsB,oBAKD0C,EAAe/C,GAAQ3K,OAAO2N,KAAKF,GAAUvC,OAAO/L,GAAOsO,EAAStO,KAASwL,GACjFrK,IAAInB,GAAOA,EAAIgN,WAAW,KAAOhN,EAAM,IAAIA,GAC7C,MAAMyO,EAASF,EAAa,UAC3BpB,EAASoB,EAAa,gBAEjBzO,GAAGuD,OAAO4D,MAAM,mBACtBvF,EAAE0M,GAASM,GAAG,cAAe,uBAAwB,WACpD,MAAMC,EAAOC,KAAKC,YAAYlD,QAAQ,UAAW,IAAImD,OACpDC,EAAQ,IAAIjP,GAAGkP,MAAML,GAMtB,OALwB,IAApBI,EAAME,WAAmBN,EAAK3B,WAAW,KAC5CkC,KAAKH,EAAMI,SAAU,UAErBD,KAAKpP,GAAGsP,KAAKD,OAAO,YAAYR,GAAS,WAEnC,IACLD,GACF,cACA,uFACA,WACC,IAAMW,EAAiBT,KAAKU,gBAAgBA,gBAAgBT,YAAYC,OAAO3E,cAM/E,OALIsE,EAAO/F,SAAS2G,GACnBH,KAAKpP,GAAGsP,KAAKD,OAAO,UAAUP,KAAKC,aAAgB,UACzC1B,EAAOzE,SAAS2G,IAC1BH,KAAKpP,GAAGsP,KAAKD,OAAO,UAAUP,KAAKC,YAAe,CAAC3E,OAAQ,SAAU,WAE/D,SAIT/E,EAAiBK,UAAW,EAG7B9D,EAAE,4BAA4B6N,SAAS,KAAKC,KAAK,OAAQ,wBAEpD/F,IACEgG,EAAS,KACb/N,EAAE,8BAA8BgO,eAAe,UAEhDC,EAAc,KACbjO,EAAE,iCAAiCkO,QACnClO,EAAE,8BAA8BgO,eAAe,UAEjD7H,EAAGgI,UAAUnO,EAAEiM,OAAO,CACrBmC,SAAUL,EACVM,QAASN,EACTO,eAAgBL,EAChBM,cAAeN,GACbO,SAASC,WAAW,yBACpB,CACDC,MACC1O,EAAE,4BAA4BgO,eAAe,WAG7C,MAIJ5P,GAAGuQ,KAAK,mBAAmBC,KAAKzI,IAI3B0I,EAAW,IAAIC,iBAAiBC,IACrC,MAAMC,EAAYhP,EAAE+O,EAAQnF,QAAQ,CAAA,CAAEqF,WAAAA,KAAgB,IAAIA,KACxD5D,KAAK,gDACkB,IAArB2D,EAAU9I,QAGd2B,EAAamH,EAAoC,2BAAzBA,EAAUlB,KAAK,SAKlCoB,GAHNL,EAASM,QAAQzL,SAAS0L,KAAM,CAACC,WAAW,IAG1B3L,SAASC,eAAe,eAAiBvF,GAAGuD,OAAOiC,YACpE,mlBAYK,CACLiF,IAAAA,EAAM,SAASyG,GACd,OAAOA,EAAKxQ,OAEb+G,IAAAA,EAAM,SAASyJ,EAAMxQ,GACpBwQ,EAAKxQ,MAAQA,KARfoQ,EAAUrL,GAAK,aAUX7D,EAAEuP,SAASC,UAAY,IACrBC,EAAaH,GAAQ,CAAC,qBAAsB,0BAA0BtI,SAASsI,EAAKzL,IAC1F7D,EAAEuP,SAASC,SAAW,CACrB3G,IAAIyG,GACH,OAAOG,EAAWH,IAASnJ,EAAKA,EAAGuJ,WAAa7G,EAAIyG,IAErDzJ,IAAIyJ,EAAMxQ,GACL2Q,EAAWH,IAASnJ,EACvBA,EAAGwJ,SAAS7Q,GAEZ+G,EAAIyJ,EAAMxQ,WAKPsG,EAGNrG,IAAI6Q,EAAQnE,EAAQoE,EAAcC,EAAOC,EACzC,MAAMC,EAAe,CAAClR,EAAQyE,KAC7BwM,EAAYE,OAAOnR,EAAMkI,SAAS,qBAMnC,MAAMkJ,EAAWlQ,EAAE5B,GAAGsP,KAAKyC,eAJF,CACxBC,QAAS,wBACTC,QAAS,aAGQ9O,IAAS,aAAc,IAAK3B,EAAI,WAAY,kBAC3DsO,MAAYtP,MAAAA,IAEd,GADAA,EAAE0R,kBACGV,EAAQ,OACNxR,GAAGuD,OAAO4D,MAAM,CAAC,kBAAmB,iCAE1CqK,EAAS,IAAIzH,GAAGC,GAAGmI,cAAc,CAAC1M,GAAI,8BACtC,MAAM2M,EAAgB,IAAIrI,GAAGC,GAAGqI,cAChCD,EAAcE,SAASC,SAASjN,SAAS0L,MACzCoB,EAAcI,WAAW,CAAChB,IAC1BnE,EAAS,IAAItD,GAAGC,GAAGyI,+BAA+B,CACjDC,QAAS,CACR,CAACC,KAAM,SAAUxI,MAAO3I,EAAI,iBAC5B,CAACmR,KAAM,aAAcxI,MAAO3I,EAAI,sBAChC,CAACmR,KAAM,gBAAiBxI,MAAO3I,EAAI,wBACnC,CAACmR,KAAM,gBAAiBxI,MAAO3I,EAAI,wBACnC,CAACmR,KAAM,YAAaxI,MAAO3I,EAAI,oBAC/B,CAACmR,KAAM,cAAexI,MAAO3I,EAAI,sBACjC,CAACmR,KAAM,kBAAmBxI,MAAO3I,EAAI,2BAEtCd,MAAOyE,IACLyJ,GAAG,SAAUgD,GAChBH,EAAe,IAAI1H,GAAGC,GAAG4I,kBAAkB,CAACC,IAAK,EAAGnS,MAAO0E,IAC3DsM,EAAQ,IAAI3H,GAAGC,GAAG8I,YAAYzF,EAAQ,CACrClD,MAAO3I,EAAI,eACXuR,QAAS,CAACvR,EAAI,iBACdwR,MAAO,QAERrB,EAAc,IAAI5H,GAAGC,GAAG8I,YAAYrB,EAAc,CAACtH,MAAO3I,EAAI,kBAC9DoQ,IAEDJ,EAAOpC,KAAK,CACXH,MAAOzN,EAAI,eACXyR,QAASvB,EAAMY,SAASY,IAAIvB,EAAYW,UAAUY,IACjDtR,EAAE,MAAO,CAACC,KAAML,EAAI,eAErB0I,QAAS,CACR,CAACE,OAAQ,SAAUD,MAAOnK,GAAGwB,IAAI,+BACjC,CAAC4I,OAAQ,SAAUD,MAAOnK,GAAGwB,IAAI,8BAA+B2R,MAAO,gBAExEC,KAAmB,OAAbhN,EAAoB,SAAW,UACnCiN,QAAQC,KAAKX,IACfjB,EAAMY,SAASiB,SACf5B,EAAYW,SAASiB,SACD,iBAATZ,GAAqC,WAAhBA,EAAKvI,SACpCjF,EAASkI,EAAOiE,WAChBlM,EAASqM,EAAaH,WACtBvR,EAAQU,UAAU,4BAA6B0E,GAC/CpF,EAAQU,UAAU,4BAA6B2E,QAIrC,YAATjC,GACH2O,EAAS7E,KAAK,KAAKuG,SAAS,+BAIN,mBAAZ5N,GACVA,IAAUqH,KAAK,yBAAyB6C,MAAMtP,IAC7CA,EAAE0R,iBACFtQ,EAAE,kBAAkBgO,eAAe,YArrBtC"}
1
+ {"version":3,"sourceRoot":"../","sources":["main.js"],"names":["version","storage","mw","getObject","key","json","localStorage","getItem","JSON","parse","e","setObject","value","let","stringify","setItem","fromEntries","Object","entries","obj","getVersion","str","split","map","s","Number","msg","args","notify","$p","$","html","type","autoHideSeconds","majorVersion","slice","join","CDN","CM_CDN","MW_CDN","REPO_CDN","wgPageName","page","wgNamespaceNumber","ns","wgPageContentModel","contentmodel","wgServerName","server","wgScriptPath","scriptPath","wgUserLanguage","userLang","skin","config","values","USING_LOCAL","loader","getState","ALL_SETTINGS_CACHE","SITE_ID","SITE_SETTINGS","EXPIRED","time","Date","now","CONTENTMODEL","css","sanitized-css","javascript","wikitext","MODE_LIST","lib","lua","mediawiki","htmlmixed","xml","ADDON_LIST","searchcursor","search","activeLine","markSelection","trailingspace","matchBrackets","matchTags","addons","indent","contextmenuStyle","document","getElementById","addStyleTag","id","disabled","i18n","welcome","a","b","a0","a1","b0","b1","cmpVersion","i18nLang","zh","zh-hans","zh-cn","zh-my","zh-sg","zh-hant","zh-tw","zh-hk","zh-mo","I18N_CDN","isLatest","i18nPromise","Promise","all","using","async","ajax","dataType","cache","messages","set","setI18N","getScript","urls","local","length","resolve","cm","initMode","scripts","externalScript","addonScript","loaded","window","CodeMirror","CM","modes","prototype","commands","optionHandlers","includes","load","push","tags","getSearchCursor","findForward","styleActiveLine","styleSelectedText","showTrailingSpace","forEach","lang","concat","updateCachedConfig","renderEditor","$target","setting","mode","endsWith","pageMode","OO","ui","confirm","actions","label","action","toLowerCase","getPageMode","initModePromise","mwConfig","get","redirect","img","magicwords","extensiontags","functionhooks","variables","Api","meta","siprop","formatversion","query","otherMagicwords","getAliases","words","flatMap","aliases","name","alias","getConfig","replace","insensitive","functionSynonyms","subst","filter","tagModes","pre","nowiki","ref","tag","urlProtocols","realMagicwords","Set","allMagicwords","some","test","has","sensitive","word","doubleUnderscore","find","startsWith","getMwConfig","mimeModes","widget","defineMIME","noinclude","height","toTextArea","client","profile","fromTextArea","extend","inputStyle","lineNumbers","lineWrapping","bracketRegex","indentUnit","indentWithTabs","setSize","refresh","wrapper","getWrapperElement","synonyms","getSysnonyms","keys","invoke","on","text","this","textContent","trim","title","Title","namespace","open","getUrl","util","parserFunction","previousSibling","children","attr","submit","triggerHandler","submitMinor","click","addKeyMap","Ctrl-S","Cmd-S","Shift-Ctrl-S","Shift-Cmd-S","Wikiplus","getSetting","Esc","hook","fire","observer","MutationObserver","records","$editArea","addedNodes","wphlStyle","observe","body","childList","elem","valHooks","textarea","isWikiplus","getValue","setValue","dialog","indentWidget","field","indentField","toggleIndent","toggle","$portlet","addPortletLink","minerva","citizen","preventDefault","MessageDialog","windowManager","WindowManager","$element","appendTo","addWindows","CheckboxMultiselectInputWidget","options","data","NumberInputWidget","min","FieldLayout","notices","align","message","add","flags","size","closing","then","detach","addClass"],"mappings":";;;;;;CAOA,uBAGC,IAAMA,EAAU,QAMhB,MAAMC,EAAgC,iBAAfC,GAAGD,SAAwD,mBAAzBC,GAAGD,QAAQE,UACjED,GAAGD,QACH,CACDE,UAAUC,GACHC,EAAOC,aAAaC,QAAQH,GAClC,IAAa,IAATC,EACH,OAAO,EAER,IACC,OAAOG,KAAKC,MAAMJ,GACjB,MAAOK,GACR,OAAO,OAGTC,UAAUP,EAAKQ,GACdC,IAA0BR,EAC1B,IAEC,OADAA,EAAOG,KAAKM,UAAUF,GACfN,aAAaS,QAAQX,EAAKC,GAChC,MAAOK,GACR,OAAO,KAQLM,EAAcC,OAAOD,cAAgBE,IAC1C,MAAyBC,EAAM,GAC/B,IAAK,GAAM,CAACf,EAAKQ,KAAUM,EAC1BC,EAAIf,GAAOQ,EAEZ,OAAOO,IAOFC,EAAaC,GAAOA,EAAIC,MAAM,KAAKC,IAAIC,GAAKC,OAAOD,IAkBzD,MAAME,EAAM,CAACtB,KAAQuB,IAASzB,GAAGwB,IAAI,QAAQtB,KAAUuB,GAKvD,IAAMC,EAAS,IAAID,IAAS,KAC3B,IAAkDE,EAAKC,EAAE,MAAO,CAACC,KAAML,KAAOC,KAE9E,OADAzB,GAAG0B,OAAOC,EAAI,CAACG,KAAM,UAAWC,gBAAiB,SAC1CJ,GAIFK,EAAed,EAAWpB,GAASmC,MAAM,EAAG,GAAGC,KAAK,KAG1D,MAAMC,EAAM,wBACXC,EAAS,wBACTC,EAAS,2CACTC,EAAW,0BAA0BN,EAMhC,CACLO,WAAYC,EACZC,kBAAmBC,EACnBC,mBAAoBC,EACpBC,aAAcC,EACdC,aAAcC,EACdC,eAAgBC,EAChBC,KAAAA,GACGnD,GAAGoD,OAAOC,OAGRC,EAAuD,OAAzCtD,GAAGuD,OAAOC,SAAS,kBACtCC,EAAqB1D,EAAQE,UAAU,uBAAyB,GAChEyD,EAAU,GAAGZ,EAASE,EACtBW,EAAgBF,EAAmBC,IAAY,GAC/CE,EAAUD,EAAcE,KAAOC,KAAKC,MAAQ,OAEDC,EAAe,CAC1DC,IAAK,MACLC,gBAAiB,MACjBC,WAAY,aACZhE,KAAM,aACNiE,SAAU,aAILC,EAAYf,EACf,CACDgB,IAAK,qBACLL,IAAK,8BACLE,WAAY,qCACZI,IAAQnC,EAAH,uBACLoC,UAAWZ,EAAU,sBAAwB,GAC7Ca,UAAW,oCACXC,IAAK,IAEJ,CACDJ,IAAQlC,EAAH,yBACL6B,IAAQ7B,EAAH,uBACL+B,WAAe/B,EAAH,qCACZmC,IAAQnC,EAAH,uBACLoC,UAAW,GACXC,UAAcrC,EAAH,mCACXsC,IAAQtC,EAAH,wBAGDuC,EAAa,CAClBC,aAAiBxC,EAAH,oCACdyC,OAAWvC,EAAH,iBACRwC,WAAe1C,EAAH,sCACZ2C,cAAkB3C,EAAH,yCACf4C,cAAkB5C,EAAH,mCACf6C,cAAkB7C,EAAH,mCACf8C,UAAc5C,EAAH,qBAKZ3B,IAA4BwE,EAASpF,EAAQE,UAAU,8BAFjC,CAAC,UAGAmF,EAASrF,EAAQE,UAAU,8BAFjC,IAKjB,MAAsCoF,EAAmBC,SAASC,eAAe,qBAC7EvF,GAAGuD,OAAOiC,YAAY,6DAC1BH,EAAiBI,GAAK,mBACtBJ,EAAiBK,UAAW,EAE5B/E,IAA0CgF,EAAO5F,EAAQE,UAAU,2BACV2F,EACpDD,GAxGc,CAACE,EAAGC,KACtB,GAAM,CAACC,EAAIC,GAAM9E,EAAW2E,GAC3B,CAACI,EAAIC,GAAMhF,EAAW4E,GACvB,OAAOC,EAAKE,GAAMF,IAAOE,GAAMD,EAAKE,GAwG1BC,CAAWR,EAAK,gBAAiB7F,KAC3C8F,EAAUlE,EAAO,kBAAmB5B,KAHpC6F,EAAO,GACPC,EAAUlE,EAAO,YAKlB,MAIuB0E,EAJD,CACpBC,GAAI,UAAWC,UAAW,UAAWC,QAAS,UAAWC,QAAS,UAAWC,QAAS,UACtFC,UAAW,UAAWC,QAAS,UAAWC,QAAS,UAAWC,QAAS,WAEzB3D,IAAa,KAC5D4D,KAAc3E,KAAOG,UAAiB8D,SACtCW,EAAWpB,EAAK,kBAAoB3D,EAc/BgF,EAAcC,QAAQC,IAAI,CAC/BlH,GAAGuD,OAAO4D,MAAM,mBAZDC,UACVL,GAAYpB,EAAK,eAAiBS,IACtCT,QAAa/D,EAAEyF,KAAQP,EAAY,CAClCQ,SAAU,OACVC,OAAO,IAERxH,EAAQU,UAAU,0BAA2BkF,IAE9C3F,GAAGwH,SAASC,IAAI9B,IAKhB+B,KASD,MAAMC,EAAY,CAACC,EAAMC,IACJ,IAAhBD,EAAKE,OACDb,QAAQc,UAETF,EACJ7H,GAAGuD,OAAO4D,MAAMS,GAChBhG,EAAEyF,KAAQlF,EAAH,KAAwB,EAAdyF,EAAKE,OAAa,WAAa,IAAKF,EAAK1F,OAAU,CACrEoF,SAAU,SACVC,OAAO,IAKV5G,IAAqCqH,EAMrC,MAAMC,EAAiBnG,MAAAA,IACtBnB,IAA4BuH,EAAU,GACtC,MAA8BC,EAAiB,GACtBC,EAAc,GACtCC,EAAsC,mBAAtBC,OAAOC,WAGQC,EAAKH,EAClCC,OAAOC,WACP,CACDE,MAAO,GACPC,UAAW,GACXC,SAAU,GACVC,eAAgB,IAGd,CAAC,YAAa,UAAUC,SAAS/G,KAAU0G,EAAGC,MAAMjE,YAEvDxE,GAAGuD,OAAOuF,QAAQ3G,KAAOE,sBAA4B,aACpDiB,EAAc6E,EAAiBD,GAASa,KAAQ1G,EAAH,sBAElC,cAATP,GAAwD,iBAAzB6B,EAAcP,QAAuBO,EAAcP,OAAO4F,KAAKnH,OAEjGC,EAAO,QAEHuG,KACH/E,EAAc4E,EAAUE,GAAaW,KAAK1E,EAAUC,KAChDhB,GACJtD,GAAGuD,OAAOuF,QAAQ3G,KAAOC,2BAAiC,cAGvDoG,EAAGE,UAAUO,iBAAmB9D,EAAO0D,SAAS,WACpDT,EAAYW,KAAKpE,EAAWC,eAExB4D,EAAGG,SAASO,aAAe/D,EAAO0D,SAAS,WAC/CT,EAAYW,KAAKpE,EAAWE,SAExB2D,EAAGI,eAAeO,iBAAmBhE,EAAO0D,SAAS,eACzDT,EAAYW,KAAKpE,EAAWG,aAExB0D,EAAGI,eAAeQ,mBAAqBjE,EAAO0D,SAAS,WAC3DT,EAAYW,KAAKpE,EAAWI,gBAExByD,EAAGI,eAAeS,mBAAqBlE,EAAO0D,SAAS,kBAC3DT,EAAYW,KAAKpE,EAAWK,gBAExBwD,EAAGI,eAAe3D,eAAiBE,EAAO0D,SAAS,kBACvDT,EAAYW,KAAKpE,EAAWM,gBAExBuD,EAAGI,eAAe1D,WAAaC,EAAO0D,SAAS,cACnDT,EAAYW,KAAKpE,EAAWO,WAEzB,CAAC,SAAU,QAAQ2D,SAAS/G,GAC/B,CAAC,MAAO,aAAc,YAAa,YAAa,OAAOwH,QAAQC,IACzDf,EAAGC,MAAMc,KACbrB,EAAUA,EAAQsB,OAAOnF,EAAUkF,OAG1Bf,EAAGC,MAAM3G,KACP,QAATA,GACFwB,EAAc6E,EAAiBD,GAASa,KAAK1E,EAAUE,KAExD2D,EAAUA,EAAQsB,OAAOnF,EAAUvC,KAIjCuG,QACGpB,QAAQC,IAAI,CACjBS,EAAUO,EAAS5E,GACnBqE,EAAUQ,GACVR,EAAUS,KAED9E,SACJqE,EAAUO,GAAS,SACnBjB,QAAQC,IAAI,CACjBS,EAAUQ,GACVR,EAAUS,aAGLT,EAAUS,SACVT,EAAUO,KAmBZuB,EAAqBrG,IAC1BK,EAAmBC,GAAW,CAC7BN,OAAAA,EACAS,KAAMC,KAAKC,OAEZhE,EAAQU,UAAU,qBAAsBgD,IA4InCiG,EAAetC,MAAOuC,EAASC,KACpC,IAAMC,EAAOD,EAAU,mBAvBJxC,UACnB,IAAI,CAAC,IAAK,KAAKyB,SAASnG,IAAQF,EAAKsH,SAAS,QAUvC,OAAItH,EAAKsH,SAAS,QACjB,YAED9F,EAAapB,GAbmC,CACtD,MAAMmH,EAAkB,MAAPrH,EAAa,SAAW,MAQzC,aAPM1C,GAAGuD,OAAO4D,MAAM,CAAC,kBAAmB,uCACA6C,GAAGC,GAAGC,QAAQ1I,EAAI,gBAAiB,CAC5E2I,QAAS,CACR,CAACC,MAAOL,GACR,CAACK,MAAO,WAAYC,OAAQ,aAGhB,YAAcN,EAASO,gBAaMC,GACtCC,EAAkBvC,EAAS4B,GACjC,KAAM,CAACY,SAAkBxD,QAAQC,IAAI,EAvIlBE,MAAOtF,EAAM0I,KAChC,GAAK,CAAC,YAAa,UAAU3B,SAAS/G,GAAtC,CAIIwB,GAAeM,SACZ4G,EAGP7J,IAA0ByC,EAASpD,GAAGoD,OAAOsH,IAAI,uBAKjD,GAJKtH,GAAWQ,IAAWmD,IACzB,CAAC3D,OAAAA,GAAUO,EACZ3D,GAAGoD,OAAOqE,IAAI,sBAAuBrE,IAElCA,GAAUA,EAAOuH,UAAYvH,EAAOwH,IACvC,OAAOxH,EACD,GAAIA,EACV,OAAOA,EAiBR,KACQ,CAACyH,WAAAA,EAAYC,cAAAA,EAAeC,cAAAA,EAAeC,UAAAA,UACzC,IAAIhL,GAAGiL,KAAMP,IAAI,CAC1BQ,KAAM,WACNC,OAAQ/H,EAAS,aAAe,mDAChCgI,cAAe,KAJfC,SAMKC,EAAkB,CAAC,MAAO,MAAO,QAAS,QAAS,aAMnDC,EAAaC,GAASA,EAAMC,QAEjC,CAAA,CAAEC,QAAAA,EAASC,KAAAA,KAAUD,EAAQrK,IAAIuK,IAAS,CAAEA,MAAAA,EAAOD,KAAAA,MAM9CE,EAAYH,GAAW5K,EAC5B4K,EAAQrK,IAAI,CAAA,CAAEuK,MAAAA,EAAOD,KAAAA,KAAU,CAACC,EAAME,QAAQ,KAAM,IAAKH,KAG1D,GAAKvI,EA+BE,CACN,KAAyB,CAAC2I,GAAgB3I,EAAnC4I,oBACFD,EAAYE,OAChBV,EACCV,EAAWqB,OAAgC,CAAA,CAAEP,KAAAA,KAAUL,EAAgBzC,SAAS8C,KAC/ErC,QAAQ,CAAA,CAAEsC,MAAAA,EAAOD,KAAAA,MAClBI,EAAYH,EAAME,QAAQ,KAAM,KAAOH,QArC7B,CACZvI,EAAS,CACR+I,SAAU,CACTC,IAAK,aACLC,OAAQ,gBACRC,IAAK,kBAENtD,KAAMlI,EACLgK,EAAczJ,IAAIkL,GAAO,CAACA,EAAItK,MAAM,GAAI,IAAI,KAE7CuK,aAAcxM,GAAGoD,OAAOsH,IAAI,mBAE7B,MAAM+B,EAAiB,IAAIC,IAAI,IAAI3B,KAAkBC,KAAcM,IAClEqB,EAAgB9B,EAAWqB,OAE1B,CAAA,CAAEP,KAAAA,EAAMD,QAAAA,KAAaA,EAAQkB,KAAKhB,GAAS,WAAWiB,KAAKjB,KAAWa,EAAeK,IAAInB,IAE1FoB,EAAYxB,EACXoB,EAAcT,OAAOc,GAAQA,EAAK,oBAEnCjB,EAAcR,EACboB,EAAcT,OAAOc,IAASA,EAAK,oBAClC3L,IAAI,CAAA,CAAEuK,MAAAA,EAAOD,KAAAA,MAAU,CAAEC,MAAOA,EAAMtB,cAAeqB,KAAAA,KACxDvI,EAAO6J,iBAAmB,CACzBpB,EAAUE,EAAYG,OAAO,CAAA,CAAEN,MAAAA,KAAW,WAAWiB,KAAKjB,KAC1DC,EAAUkB,EAAUb,OAAO,CAAA,CAAEN,MAAAA,KAAW,WAAWiB,KAAKjB,MAEzDxI,EAAO4I,iBAAmB,CACzBH,EAAUE,EAAYG,OAAO,CAAA,CAAEN,MAAAA,MAAY,cAAciB,KAAKjB,KAC9DC,EAAUkB,EAAUb,OAAO,CAAA,CAAEN,MAAAA,MAAY,cAAciB,KAAKjB,MAkB9D,OANAxI,EAAOuH,SAAWE,EAAWqC,KAAoC,CAAA,CAAEvB,KAAAA,KAAmB,aAATA,GAAqBD,QAClGtI,EAAOwH,IAAMiB,EACZN,EAAWV,EAAWqB,OAAiC,CAAA,CAAEP,KAAAA,KAAUA,EAAKwB,WAAW,WAEpFnN,GAAGoD,OAAOqE,IAAI,sBAAuBrE,GACrCqG,EAAmBrG,GACZA,IA8BNgK,CAAYvD,EAAMW,GAClBA,IAGY,cAATX,GAAwBY,EAASzB,KAAKnH,MACzC4I,EAAS0B,SAAStK,KAAO,kBACnBoG,EAAS,SACI,WAAT4B,GAAsBtB,WAAW8E,UAAUC,QACrD/E,WAAWgF,WAAW,SAAU,CAC/B5B,KAAM,YACN3C,KAAM,CACLwE,UAAW,CAAC,CAAC,KAAM,KAAM,iBAM5B,IAAMC,EAAS9D,EAAQ8D,SAMjBtN,GAJF6H,GACHA,EAAG0F,aAGS9D,GAA4B,SAAjBhH,GACQ+I,EAAQ/J,EAAE+L,OAAOC,UAAjBjC,SAChC3D,EAAKO,WAAWsF,aAAalE,EAAQ,GAAI/H,EAAEkM,OAAO,CACjDC,WAAqB,WAATpC,EAAoB,WAAa,kBAC7CqC,aAAa,EACbC,cAAc,EACdpE,KAAAA,EACAY,SAAAA,EACAtK,KAAAA,EACAgJ,gBAAiBhE,EAAO0D,SAAS,cACjCO,kBAAmBjE,EAAO0D,SAAS,UACnCQ,kBAAmBlE,EAAO0D,SAAS,iBACnC5D,cAAeE,EAAO0D,SAAS,mBAA8B,cAATgB,IAAwB1J,GACzE,CAAC+N,aAAc,YAGlBhJ,UAAWC,EAAO0D,SAAS,kBAAoB,CAAC,YAAa,UAAUA,SAASgB,IACrE,cAATA,EACA,GACA,CACDsE,WAAYhJ,EAAO0D,SAAS,mBAAqBzD,EAxWnC,IAyWdgJ,gBAAiBjJ,EAAO0D,SAAS,uBAGhCwF,QAAQ,KAAMZ,GACjBzF,EAAGsG,UAEH,MAAMC,EAAUvG,EAAGwG,oBAEnB,GADAD,EAAQ9I,GAAK,sBACT,CAAC,YAAa,UAAUoD,SAASgB,IAAS1E,EAAO0D,SAAS,eAAgB,CAC7ExD,EAAiBK,UAAW,EAC5B,KAA+C,CAAC+I,GAAazO,GAAGoD,OAAOsH,IAAI,uBAA9CsB,oBAEvB0C,EAAevN,GAAOJ,OAAO4N,KAAKF,GAAUvC,OAAOhM,GAAOuO,EAASvO,KAASiB,GAChFE,IAAInB,GAAOA,EAAIiN,WAAW,KAAOjN,EAAM,IAAIA,GAC7C,MAAM0O,EAASF,EAAa,UAC3BpB,EAASoB,EAAa,gBAEjB1O,GAAGuD,OAAO4D,MAAM,mBACtBvF,EAAE2M,GAASM,GAAG,cAAe,uBAAwB,WACpD,MAA4BC,EAAOC,KAAKC,YAAYlD,QAAQ,UAAW,IAAImD,OACXC,EAAQ,IAAIlP,GAAGmP,MAAML,GAMrF,OALwB,IAApBI,EAAME,WAAmBN,EAAK3B,WAAW,KAC5CkC,KAAKH,EAAMI,SAAU,UAErBD,KAAKrP,GAAGuP,KAAKD,OAAO,YAAYR,GAAS,WAEnC,IACLD,GACF,cACA,uFACA,WAEC,IAAMW,EAAiBT,KAAKU,gBAAgBA,gBAAgBT,YAAYC,OAAO3E,cAM/E,OALIsE,EAAO/F,SAAS2G,GACnBH,KAAKrP,GAAGuP,KAAKD,OAAO,UAAUP,KAAKC,aAAgB,UACzC1B,EAAOzE,SAAS2G,IAC1BH,KAAKrP,GAAGuP,KAAKD,OAAO,UAAUP,KAAKC,YAAe,CAAC3E,OAAQ,SAAU,WAE/D,SAIThF,EAAiBK,UAAW,EAG7B9D,EAAE,4BAA4B8N,SAAS,KAAKC,KAAK,OAAQ,wBAEpD/F,IACEgG,EAAS,KACbhO,EAAE,8BAA8BiO,eAAe,UAEhDC,EAAc,KACblO,EAAE,iCAAiCmO,QACnCnO,EAAE,8BAA8BiO,eAAe,UAEjD7H,EAAGgI,UAAUpO,EAAEkM,OAAO,CACrBmC,SAAUL,EACVM,QAASN,EACTO,eAAgBL,EAChBM,cAAeN,GACbO,SAASC,WAAW,yBACpB,CACDC,MACC3O,EAAE,4BAA4BiO,eAAe,WAG7C,MAIJ7P,GAAGwQ,KAAK,mBAAmBC,KAAKzI,IAI3B0I,EAAW,IAAIC,iBAAiBC,IACrC,MAAMC,EAAYjP,EAAEgP,EAAQnF,QAK3B,CAAA,CAAEqF,WAAAA,KAAgB,IAAIA,KACpB5D,KAAK,gDACiB,IAArB2D,EAAU/I,QAGd4B,EAAamH,EAAoC,2BAAzBA,EAAUlB,KAAK,SAKFoB,GAHtCL,EAASM,QAAQ1L,SAAS2L,KAAM,CAACC,WAAW,IAGM5L,SAASC,eAAe,eAAiBvF,GAAGuD,OAAOiC,YACpG,mlBAeK,CACLkF,IAAAA,EAAM,SAASyG,GACd,OAAOA,EAAKzQ,OAEb+G,IAAAA,EAAM,SAAS0J,EAAMzQ,GACpByQ,EAAKzQ,MAAQA,KAXfqQ,EAAUtL,GAAK,aAaX7D,EAAEwP,SAASC,UAAY,IAErBC,EAAaH,GAAQ,CAAC,qBAAsB,0BAA0BtI,SAASsI,EAAK1L,IAC1F7D,EAAEwP,SAASC,SAAW,CACrB3G,IAAIyG,GACH,OAAOG,EAAWH,IAASnJ,EAAKA,EAAGuJ,WAAa7G,EAAIyG,IAErD1J,IAAI0J,EAAMzQ,GACL4Q,EAAWH,IAASnJ,EACvBA,EAAGwJ,SAAS9Q,GAEZ+G,EAAI0J,EAAMzQ,WAKPsG,EAGNrG,IAA8E8Q,EACzCnE,EACFoE,EACgBC,EACiCC,EACpF,MAAMC,EAAe,CAACnR,EAAQyE,KAC7ByM,EAAYE,OAAOpR,EAAMmI,SAAS,qBAMnC,MAA0CkJ,EAAWnQ,EAAE5B,GAAGuP,KAAKyC,eAJtC,CACxBC,QAAS,wBACTC,QAAS,aAGQ/O,IAAS,aAAc,IAAK3B,EAAI,WAAY,kBAC3DuO,MAAYvP,MAAAA,IAEd,GADAA,EAAE2R,kBACGV,EAAQ,OACNzR,GAAGuD,OAAO4D,MAAM,CAAC,kBAAmB,iCAE1CsK,EAAS,IAAIzH,GAAGC,GAAGmI,cAAc,CAAC3M,GAAI,8BAEtC,MAAM4M,EAAgB,IAAIrI,GAAGC,GAAGqI,cAChCD,EAAcE,SAASC,SAASlN,SAAS2L,MACzCoB,EAAcI,WAAW,CAAChB,IAC1BnE,EAAS,IAAItD,GAAGC,GAAGyI,+BAA+B,CACjDC,QAAS,CACR,CAACC,KAAM,SAAUxI,MAAO5I,EAAI,iBAC5B,CAACoR,KAAM,aAAcxI,MAAO5I,EAAI,sBAChC,CAACoR,KAAM,gBAAiBxI,MAAO5I,EAAI,wBACnC,CAACoR,KAAM,gBAAiBxI,MAAO5I,EAAI,wBACnC,CAACoR,KAAM,YAAaxI,MAAO5I,EAAI,oBAC/B,CAACoR,KAAM,cAAexI,MAAO5I,EAAI,sBACjC,CAACoR,KAAM,kBAAmBxI,MAAO5I,EAAI,2BAEtCd,MAAOyE,IACL0J,GAAG,SAAUgD,GAChBH,EAAe,IAAI1H,GAAGC,GAAG4I,kBAAkB,CAACC,IAAK,EAAGpS,MAAO0E,IAC3DuM,EAAQ,IAAI3H,GAAGC,GAAG8I,YAAYzF,EAAQ,CACrClD,MAAO5I,EAAI,eACXwR,QAAS,CAACxR,EAAI,iBACdyR,MAAO,QAERrB,EAAc,IAAI5H,GAAGC,GAAG8I,YAAYrB,EAAc,CAACtH,MAAO5I,EAAI,kBAC9DqQ,IAEDJ,EAAOpC,KAAK,CACXH,MAAO1N,EAAI,eACX0R,QAASvB,EAAMY,SAASY,IAAIvB,EAAYW,UAAUY,IACjDvR,EAAE,MAAO,CAACC,KAAML,EAAI,eAErB2I,QAAS,CACR,CAACE,OAAQ,SAAUD,MAAOpK,GAAGwB,IAAI,+BACjC,CAAC6I,OAAQ,SAAUD,MAAOpK,GAAGwB,IAAI,8BAA+B4R,MAAO,gBAExEC,KAAmB,OAAbjN,EAAoB,SAAW,UACnCkN,QAAQC,KAAKX,IACfjB,EAAMY,SAASiB,SACf5B,EAAYW,SAASiB,SACD,iBAATZ,GAAqC,WAAhBA,EAAKvI,SACpClF,EAASmI,EAAOiE,WAChBnM,EAASsM,EAAaH,WACtBxR,EAAQU,UAAU,4BAA6B0E,GAC/CpF,EAAQU,UAAU,4BAA6B2E,QAIrC,YAATjC,GACH4O,EAAS7E,KAAK,KAAKuG,SAAS,+BAIN,mBAAZ7N,GACVA,IAAUsH,KAAK,yBAAyB6C,MAAMvP,IAC7CA,EAAE2R,iBACFvQ,EAAE,kBAAkBiO,eAAe,YA3sBtC"}
package/i18n/en.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "wphl-version": "2.7.5",
2
+ "wphl-version": "2.7.6",
3
3
  "wphl-lang": "en",
4
4
  "wphl-addon-search": "Search",
5
5
  "wphl-addon-active-line": "Show active line",
package/i18n/zh-hans.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "wphl-version": "2.7.5",
2
+ "wphl-version": "2.7.6",
3
3
  "wphl-lang": "zh-hans",
4
4
  "wphl-addon-search": "搜索",
5
5
  "wphl-addon-active-line": "高亮显示光标所在行",
package/i18n/zh-hant.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "wphl-version": "2.7.5",
2
+ "wphl-version": "2.7.6",
3
3
  "wphl-lang": "zh-hant",
4
4
  "wphl-addon-search": "搜尋",
5
5
  "wphl-addon-active-line": "突出顯示游標所在行",
package/jsconfig.json ADDED
@@ -0,0 +1,8 @@
1
+ {
2
+ "typeAcquisition": {
3
+ "include": [
4
+ "jquery",
5
+ "codemirror"
6
+ ]
7
+ }
8
+ }
package/main.js CHANGED
@@ -8,11 +8,11 @@
8
8
  (async () => {
9
9
  'use strict';
10
10
 
11
- const version = '2.7.5';
11
+ const version = '2.7.6';
12
12
 
13
13
  /**
14
14
  * polyfill for mw.storage
15
- * @type {Object.<string, function>}
15
+ * @type {{getObject: function(string): ?any, setObject: function(string, any): boolean}}
16
16
  */
17
17
  const storage = typeof mw.storage === 'object' && typeof mw.storage.getObject === 'function'
18
18
  ? mw.storage
@@ -29,7 +29,7 @@
29
29
  }
30
30
  },
31
31
  setObject(key, value) {
32
- let json;
32
+ let /** @type {string} */ json;
33
33
  try {
34
34
  json = JSON.stringify(value);
35
35
  return localStorage.setItem(key, json);
@@ -40,12 +40,10 @@
40
40
  };
41
41
  /**
42
42
  * polyfill for Object.fromEntries
43
- * @type {function}
44
- * @param {Array.<[string, any]>} entries
45
- * @returns {Object}
43
+ * @type {function(Iterable<[string, any]>): object}
46
44
  */
47
45
  const fromEntries = Object.fromEntries || (entries => {
48
- const obj = {};
46
+ const /** @type {any} */ obj = {};
49
47
  for (const [key, value] of entries) {
50
48
  obj[key] = value;
51
49
  }
@@ -55,14 +53,13 @@
55
53
  /**
56
54
  * 解析版本号
57
55
  * @param {string} str 版本字符串
58
- * @returns {number[]}
59
56
  */
60
57
  const getVersion = str => str.split('.').map(s => Number(s));
61
58
  /**
62
59
  * 比较版本号
63
60
  * @param {string} a
64
61
  * @param {string} b
65
- * @returns {boolean} a的版本号是否小于b的版本号
62
+ * @returns a的版本号是否小于b的版本号
66
63
  */
67
64
  const cmpVersion = (a, b) => {
68
65
  const [a0, a1] = getVersion(a),
@@ -79,10 +76,9 @@
79
76
  /**
80
77
  * 提示消息
81
78
  * @param {string[]} args
82
- * @return {function: jQuery.<HTMLParagraphElement>}
83
79
  */
84
80
  const notify = (...args) => () => {
85
- const $p = $('<p>', {html: msg(...args)});
81
+ const /** @type {JQuery<HTMLParagraphElement>} */ $p = $('<p>', {html: msg(...args)});
86
82
  mw.notify($p, {type: 'success', autoHideSeconds: 'long'});
87
83
  return $p;
88
84
  };
@@ -93,10 +89,13 @@
93
89
  // 路径
94
90
  const CDN = '//fastly.jsdelivr.net',
95
91
  CM_CDN = 'npm/codemirror@5.65.3',
96
- MW_CDN = 'gh/bhsd-harry/codemirror-mediawiki@1.0',
92
+ MW_CDN = 'gh/bhsd-harry/codemirror-mediawiki@1.1.1',
97
93
  REPO_CDN = `npm/wikiplus-highlight@${majorVersion}`;
98
94
 
99
- // mw.config常数
95
+ /**
96
+ * mw.config常数
97
+ * @type {Object<string, string>}
98
+ */
100
99
  const {
101
100
  wgPageName: page,
102
101
  wgNamespaceNumber: ns,
@@ -109,12 +108,12 @@
109
108
 
110
109
  // 和本地缓存有关的常数
111
110
  const USING_LOCAL = mw.loader.getState('ext.CodeMirror') !== null,
112
- ALL_SETTINGS_CACHE = storage.getObject('InPageEditMwConfig') || {}, // @type {?Object.<string, Object>}
111
+ ALL_SETTINGS_CACHE = storage.getObject('InPageEditMwConfig') || {},
113
112
  SITE_ID = `${server}${scriptPath}`,
114
- SITE_SETTINGS = ALL_SETTINGS_CACHE[SITE_ID] || {}, // @type {?Object}
113
+ SITE_SETTINGS = ALL_SETTINGS_CACHE[SITE_ID] || {},
115
114
  EXPIRED = SITE_SETTINGS.time < Date.now() - 86400 * 1000 * 30;
116
115
 
117
- const CONTENTMODEL = {
116
+ const /** @type {Object<string, string>} */ CONTENTMODEL = {
118
117
  css: 'css',
119
118
  'sanitized-css': 'css',
120
119
  javascript: 'javascript',
@@ -122,6 +121,7 @@
122
121
  wikitext: 'mediawiki',
123
122
  };
124
123
 
124
+ /** @type {Object<string, string|[]>} */
125
125
  const MODE_LIST = USING_LOCAL
126
126
  ? {
127
127
  lib: 'ext.CodeMirror.lib',
@@ -154,17 +154,17 @@
154
154
 
155
155
  const defaultAddons = ['search'],
156
156
  defaultIndent = '4';
157
- let addons = storage.getObject('Wikiplus-highlight-addons') || defaultAddons, // @type {?string[]}
158
- indent = storage.getObject('Wikiplus-highlight-indent') || defaultIndent; // @type {string}
157
+ let /** @type {string[]} */ addons = storage.getObject('Wikiplus-highlight-addons') || defaultAddons,
158
+ /** @type {string} */ indent = storage.getObject('Wikiplus-highlight-indent') || defaultIndent;
159
159
 
160
160
  // 用于contextMenu插件
161
- const contextmenuStyle = document.getElementById('wphl-contextmenu') // @type {?HTMLStyleElement}
161
+ const /** @type {HTMLStyleElement} */ contextmenuStyle = document.getElementById('wphl-contextmenu')
162
162
  || mw.loader.addStyleTag('#Wikiplus-CodeMirror .cm-mw-template-name{cursor:pointer}');
163
163
  contextmenuStyle.id = 'wphl-contextmenu';
164
164
  contextmenuStyle.disabled = true;
165
165
 
166
- let i18n = storage.getObject('Wikiplus-highlight-i18n'), // @type {?Object.<string, string>}
167
- welcome; // @type {function: jQuery.<?HTMLParagraphElement>}
166
+ let /** @type {Object<string, string>} */ i18n = storage.getObject('Wikiplus-highlight-i18n'),
167
+ /** @type {function(): JQuery<HTMLParagraphElement>} */ welcome;
168
168
  if (!i18n) { // 首次安装
169
169
  i18n = {};
170
170
  welcome = notify('welcome');
@@ -176,14 +176,11 @@
176
176
  zh: 'zh-hans', 'zh-hans': 'zh-hans', 'zh-cn': 'zh-hans', 'zh-my': 'zh-hans', 'zh-sg': 'zh-hans',
177
177
  'zh-hant': 'zh-hant', 'zh-tw': 'zh-hant', 'zh-hk': 'zh-hant', 'zh-mo': 'zh-hant',
178
178
  },
179
- i18nLang = i18nLanguages[userLang] || 'en', // @type {?string}
179
+ /** @type {string} */ i18nLang = i18nLanguages[userLang] || 'en',
180
180
  I18N_CDN = `${CDN}/${REPO_CDN}/i18n/${i18nLang}.json`,
181
181
  isLatest = i18n['wphl-version'] === majorVersion;
182
182
 
183
- /**
184
- * 加载 I18N
185
- * @returns {promise}
186
- */
183
+ /** 加载 I18N */
187
184
  const setI18N = async () => {
188
185
  if (!isLatest || i18n['wphl-lang'] !== i18nLang) {
189
186
  i18n = await $.ajax(`${I18N_CDN}`, { // eslint-disable-line require-atomic-updates
@@ -203,12 +200,12 @@
203
200
  /**
204
201
  * 下载脚本
205
202
  * @param {string[]} urls 脚本路径
206
- * @param {boolean=false} local 是否从本地下载
207
- * @returns {promise}
203
+ * @param {boolean} local 是否从本地下载
204
+ * @returns {Promise<void>}
208
205
  */
209
206
  const getScript = (urls, local) => {
210
207
  if (urls.length === 0) {
211
- return;
208
+ return Promise.resolve();
212
209
  }
213
210
  return local
214
211
  ? mw.loader.using(urls)
@@ -219,24 +216,20 @@
219
216
  };
220
217
 
221
218
  // 以下进入CodeMirror相关内容
222
- let cm;
219
+ let /** @type {CodeMirror.Editor} */ cm;
223
220
 
224
221
  /**
225
222
  * 根据文本的高亮模式加载依赖项
226
223
  * @param {string} type
227
- * @returns {promise}
228
224
  */
229
225
  const initMode = async type => {
230
- let scripts = [];
231
- const externalScript = [],
232
- addonScript = [],
226
+ let /** @type {string[]} */ scripts = [];
227
+ const /** @type {string[]} */ externalScript = [],
228
+ /** @type {string[]} */ addonScript = [],
233
229
  loaded = typeof window.CodeMirror === 'function';
234
230
 
235
- /**
236
- * 代替CodeMirror的局部变量
237
- * @type {(function|Object.<string, Object>)}
238
- */
239
- const CM = loaded
231
+ /** 代替CodeMirror的局部变量 */
232
+ const /** @type {CodeMirror} */ CM = loaded
240
233
  ? window.CodeMirror
241
234
  : {
242
235
  modes: {},
@@ -313,9 +306,20 @@
313
306
  }
314
307
  };
315
308
 
309
+ /**
310
+ * @typedef {object} config
311
+ * @property {Object<string, string>} tagModes
312
+ * @property {Object<string, boolean>} tags
313
+ * @property {string} urlProtocols
314
+ * @property {[Object<string, string>, Object<string, string>]} doubleUnderscore
315
+ * @property {[Object<string, string>, Object<string, string>]} functionSynonyms
316
+ * @property {string[]} redirect
317
+ * @property {Object<string, string>} img
318
+ */
319
+
316
320
  /**
317
321
  * 更新缓存的设置数据
318
- * @param {Object} config
322
+ * @param {config} config
319
323
  */
320
324
  const updateCachedConfig = config => {
321
325
  ALL_SETTINGS_CACHE[SITE_ID] = {
@@ -328,8 +332,7 @@
328
332
  /**
329
333
  * 加载CodeMirror的mediawiki模块需要的设置数据
330
334
  * @param {string} type
331
- * @param {promise} initModePromise 使用本地CodeMirror扩展时大部分数据来自ext.CodeMirror.data模块
332
- * @returns {promise}
335
+ * @param {Promise<void>} initModePromise 使用本地CodeMirror扩展时大部分数据来自ext.CodeMirror.data模块
333
336
  */
334
337
  const getMwConfig = async (type, initModePromise) => {
335
338
  if (!['mediawiki', 'widget'].includes(type)) {
@@ -340,7 +343,7 @@
340
343
  await initModePromise;
341
344
  }
342
345
 
343
- let config = mw.config.get('extCodeMirrorConfig');
346
+ let /** @type {config} */ config = mw.config.get('extCodeMirrorConfig');
344
347
  if (!config && !EXPIRED && isLatest) {
345
348
  ({config} = SITE_SETTINGS);
346
349
  mw.config.set('extCodeMirrorConfig', config);
@@ -351,13 +354,21 @@
351
354
  return config;
352
355
  }
353
356
 
357
+ /**
358
+ * @typedef {object} query
359
+ * @property {{name: string, aliases: string[], 'case-sensitive': boolean}[]} magicwords
360
+ * @property {string[]} extensiontags
361
+ * @property {string[]} functionhooks
362
+ * @property {string[]} variables
363
+ */
364
+
354
365
  /**
355
366
  * 以下情形均需要发送API请求
356
367
  * 情形2:localStorage未过期但不包含新设置
357
368
  * 情形3:新加载的 ext.CodeMirror.data
358
369
  * 情形4:config === null
359
370
  */
360
- const {
371
+ const /** @type {{query: query}} */ {
361
372
  query: {magicwords, extensiontags, functionhooks, variables},
362
373
  } = await new mw.Api().get({
363
374
  meta: 'siteinfo',
@@ -367,21 +378,22 @@
367
378
  const otherMagicwords = ['msg', 'raw', 'msgnw', 'subst', 'safesubst'];
368
379
 
369
380
  /**
370
- * @param {Object[]} words
371
- * @property <string[]> aliases
372
- * @property <string> name
373
- * @returns {Object.<('alias'|'name'), string>[]}
381
+ * @param {{aliases: string[], name: string}[]} words
382
+ * @returns {{alias: string, name: string}[]}
374
383
  */
375
- const getAliases = words => words.flatMap(({aliases, name}) => aliases.map(alias => ({alias, name})));
384
+ const getAliases = words => words.flatMap(
385
+ /** @param {{aliases: string[], name: string}} */
386
+ ({aliases, name}) => aliases.map(alias => ({alias, name})),
387
+ );
376
388
  /**
377
- * @param {Object.<('alias'|'name'), string>[]} aliases
378
- * @returns {Object.<string, string>}
389
+ * @param {{alias: string, name: string}[]} aliases
390
+ * @returns {Object<string, string>}
379
391
  */
380
392
  const getConfig = aliases => fromEntries(
381
393
  aliases.map(({alias, name}) => [alias.replace(/:$/, ''), name]),
382
394
  );
383
395
 
384
- if (!config) { // 情形4:config === null
396
+ if (!config) { // 情形4:config === null\
385
397
  config = {
386
398
  tagModes: {
387
399
  pre: 'mw-tag-pre',
@@ -394,8 +406,9 @@
394
406
  urlProtocols: mw.config.get('wgUrlProtocols'),
395
407
  };
396
408
  const realMagicwords = new Set([...functionhooks, ...variables, ...otherMagicwords]),
397
- allMagicwords = magicwords.filter(({name, aliases}) =>
398
- aliases.some(alias => /^__.+__$/.test(alias)) || realMagicwords.has(name),
409
+ allMagicwords = magicwords.filter(
410
+ /** @returns {boolean} */
411
+ ({name, aliases}) => aliases.some(alias => /^__.+__$/.test(alias)) || realMagicwords.has(name),
399
412
  ),
400
413
  sensitive = getAliases(
401
414
  allMagicwords.filter(word => word['case-sensitive']),
@@ -415,30 +428,27 @@
415
428
  const {functionSynonyms: [insensitive]} = config;
416
429
  if (!insensitive.subst) {
417
430
  getAliases(
418
- magicwords.filter(({name}) => otherMagicwords.includes(name)),
431
+ magicwords.filter(/** @return {boolean} */ ({name}) => otherMagicwords.includes(name)),
419
432
  ).forEach(({alias, name}) => {
420
433
  insensitive[alias.replace(/:$/, '')] = name;
421
434
  });
422
435
  }
423
436
  }
424
- config.redirect = magicwords.find(({name}) => name === 'redirect').aliases;
437
+ config.redirect = magicwords.find(/** @param {{name: string}} */ ({name}) => name === 'redirect').aliases;
425
438
  config.img = getConfig(
426
- getAliases(magicwords.filter(({name}) => name.startsWith('img_'))),
439
+ getAliases(magicwords.filter(/** @returns {boolean} */ ({name}) => name.startsWith('img_'))),
427
440
  );
428
441
  mw.config.set('extCodeMirrorConfig', config);
429
442
  updateCachedConfig(config);
430
443
  return config;
431
444
  };
432
445
 
433
- /**
434
- * 检查页面语言类型
435
- * @returns {promise}
436
- */
446
+ /** 检查页面语言类型 */
437
447
  const getPageMode = async () => {
438
448
  if ([274, 828].includes(ns) && !page.endsWith('/doc')) {
439
449
  const pageMode = ns === 274 ? 'Widget' : 'Lua';
440
450
  await mw.loader.using(['oojs-ui-windows', 'oojs-ui.styles.icons-content']);
441
- const bool = await OO.ui.confirm(msg('contentmodel'), {
451
+ const /** @type {boolean} */ bool = await OO.ui.confirm(msg('contentmodel'), {
442
452
  actions: [
443
453
  {label: pageMode},
444
454
  {label: 'Wikitext', action: 'accept'},
@@ -453,7 +463,7 @@
453
463
 
454
464
  /**
455
465
  * 渲染编辑器
456
- * @param {jQuery.<HTMLTextAreaElement>} $target 目标编辑框
466
+ * @param {JQuery<HTMLTextAreaElement>} $target 目标编辑框
457
467
  * @param {boolean} setting 是否是Wikiplus设置(使用json语法)
458
468
  */
459
469
  const renderEditor = async ($target, setting) => {
@@ -484,7 +494,7 @@
484
494
  }
485
495
 
486
496
  const json = setting || contentmodel === 'json',
487
- {name} = $.client.profile();
497
+ /** @type {{name: string}} */ {name} = $.client.profile();
488
498
  cm = CodeMirror.fromTextArea($target[0], $.extend({
489
499
  inputStyle: name === 'safari' ? 'textarea' : 'contenteditable',
490
500
  lineNumbers: true,
@@ -514,20 +524,17 @@
514
524
  wrapper.id = 'Wikiplus-CodeMirror';
515
525
  if (['mediawiki', 'widget'].includes(mode) && addons.includes('contextmenu')) {
516
526
  contextmenuStyle.disabled = false;
517
- const {functionSynonyms: [synonyms]} = mw.config.get('extCodeMirrorConfig');
518
- /**
519
- * @param {string} name
520
- * @returns {string[]}
521
- */
522
- const getSysnonyms = name => Object.keys(synonyms).filter(key => synonyms[key] === name)
527
+ const /** @type {config} */ {functionSynonyms: [synonyms]} = mw.config.get('extCodeMirrorConfig');
528
+ /** @param {string} str */
529
+ const getSysnonyms = str => Object.keys(synonyms).filter(key => synonyms[key] === str)
523
530
  .map(key => key.startsWith('#') ? key : `#${key}`);
524
531
  const invoke = getSysnonyms('invoke'),
525
532
  widget = getSysnonyms('widget');
526
533
 
527
534
  await mw.loader.using('mediawiki.Title');
528
535
  $(wrapper).on('contextmenu', '.cm-mw-template-name', function() {
529
- const text = this.textContent.replace(/\u200e/g, '').trim(),
530
- title = new mw.Title(text);
536
+ const /** @type {string} */ text = this.textContent.replace(/\u200e/g, '').trim(),
537
+ /** @type {{namespace: number, getUrl: function(): string}} */ title = new mw.Title(text);
531
538
  if (title.namespace !== 0 || text.startsWith(':')) {
532
539
  open(title.getUrl(), '_blank');
533
540
  } else {
@@ -538,6 +545,7 @@
538
545
  'contextmenu',
539
546
  '.cm-mw-parserfunction-name + .cm-mw-parserfunction-delimiter + .cm-mw-parserfunction',
540
547
  function() {
548
+ /** @type {string} */
541
549
  const parserFunction = this.previousSibling.previousSibling.textContent.trim().toLowerCase();
542
550
  if (invoke.includes(parserFunction)) {
543
551
  open(mw.util.getUrl(`Module:${this.textContent}`), '_blank');
@@ -581,8 +589,13 @@
581
589
 
582
590
  // 监视 Wikiplus 编辑框
583
591
  const observer = new MutationObserver(records => {
584
- const $editArea = $(records.flatMap(({addedNodes}) => [...addedNodes]))
585
- .find('#Wikiplus-Quickedit, #Wikiplus-Setting-Input');
592
+ const $editArea = $(records.flatMap(
593
+ /**
594
+ * @param {{addedNodes: NodeList}}
595
+ * @returns {Node[]}
596
+ */
597
+ ({addedNodes}) => [...addedNodes],
598
+ )).find('#Wikiplus-Quickedit, #Wikiplus-Setting-Input');
586
599
  if ($editArea.length === 0) {
587
600
  return;
588
601
  }
@@ -591,7 +604,7 @@
591
604
  observer.observe(document.body, {childList: true});
592
605
 
593
606
  // 添加样式
594
- const wphlStyle = document.getElementById('wphl-style') || mw.loader.addStyleTag(
607
+ const /** @type {HTMLStyleElement} */ wphlStyle = document.getElementById('wphl-style') || mw.loader.addStyleTag(
595
608
  '#Wikiplus-Quickedit+.CodeMirror,#Wikiplus-Setting-Input+.CodeMirror{border:1px solid #c8ccd1;line-height:1.3;clear:both}'
596
609
  + 'div.Wikiplus-InterBox{font-size:14px;z-index:100}'
597
610
  + '.skin-minerva .Wikiplus-InterBox{font-size:16px}'
@@ -603,7 +616,10 @@
603
616
  );
604
617
  wphlStyle.id = 'wphl-style';
605
618
 
606
- // 对编辑框调用jQuery.val方法时从CodeMirror获取文本
619
+ /**
620
+ * 对编辑框调用jQuery.val方法时从CodeMirror获取文本
621
+ * @type {{get: function(HTMLTextAreaElement): string, set: function(HTMLTextAreaElement, string): void}}
622
+ */
607
623
  const {
608
624
  get = function(elem) {
609
625
  return elem.value;
@@ -611,7 +627,8 @@
611
627
  set = function(elem, value) {
612
628
  elem.value = value;
613
629
  },
614
- } = $.valHooks.textarea || {}; // @type {?Object.<string, function>}
630
+ } = $.valHooks.textarea || {};
631
+ /** @param {HTMLTextAreaElement} elem */
615
632
  const isWikiplus = elem => ['Wikiplus-Quickedit', 'Wikiplus-Setting-Input'].includes(elem.id);
616
633
  $.valHooks.textarea = {
617
634
  get(elem) {
@@ -629,7 +646,11 @@
629
646
  await i18nPromise; // 以下内容依赖I18N
630
647
 
631
648
  // 设置对话框
632
- let dialog, widget, indentWidget, field, indentField;
649
+ let /** @type {{open: function(any): {closing: Promise<{action: string}>}} */ dialog,
650
+ /** @type {{getValue: string[]}} */ widget,
651
+ /** @type {{getValue: string}} */ indentWidget,
652
+ /** @type {{$element: JQuery<HTMLDivElement>}} */ field,
653
+ /** @type {{$element: JQuery<HTMLDivElement>, toggle: function(boolean): void}} */ indentField;
633
654
  const toggleIndent = (value = addons) => {
634
655
  indentField.toggle(value.includes('indentWithSpace'));
635
656
  };
@@ -637,7 +658,7 @@
637
658
  minerva: 'page-actions-overflow',
638
659
  citizen: 'p-actions',
639
660
  };
640
- const $portlet = $(mw.util.addPortletLink(
661
+ const /** @type {JQuery<HTMLLIElement} */ $portlet = $(mw.util.addPortletLink(
641
662
  portletContainer[skin] || 'p-cactions', '#', msg('portlet'), 'wphl-settings',
642
663
  )).click(async e => {
643
664
  e.preventDefault();
@@ -645,6 +666,7 @@
645
666
  await mw.loader.using(['oojs-ui-windows', 'oojs-ui.styles.icons-content']);
646
667
  // eslint-disable-next-line require-atomic-updates
647
668
  dialog = new OO.ui.MessageDialog({id: 'Wikiplus-highlight-dialog'});
669
+ /** @type {{$element: JQuery<HTMLDivElement>, addWindows: function(array): void}} */
648
670
  const windowManager = new OO.ui.WindowManager();
649
671
  windowManager.$element.appendTo(document.body);
650
672
  windowManager.addWindows([dialog]);
package/matchtags.js CHANGED
@@ -13,8 +13,13 @@
13
13
  voidTags = ['br', 'wbr', 'hr', 'img'];
14
14
 
15
15
  class Iter {
16
+ /**
17
+ * @param {CodeMirror.Editor} cm
18
+ * @param {CodeMirror.Position} pos
19
+ */
16
20
  constructor(cm, pos) {
17
21
  const {line, ch} = pos,
22
+ /** @type {{state: {matchTags: {maxScanLines: number}}}} */
18
23
  {state: {matchTags: {maxScanLines = 1000}}} = cm;
19
24
  this.line = line;
20
25
  this.ch = ch;
@@ -29,6 +34,7 @@
29
34
  return /\b(?:mw-(?:html|ext)tag|tag\b)/.test(type);
30
35
  }
31
36
 
37
+ /** @param {number} ch */
32
38
  bracketAt(ch) {
33
39
  const type = this.cm.getTokenTypeAt(Pos(this.line, ch + 1));
34
40
  return /\b(?:mw-(?:html|ext)tag-)?bracket\b/.test(type);
@@ -135,8 +141,9 @@
135
141
  }
136
142
  }
137
143
 
144
+ /** @param {string} tag */
138
145
  findMatchingClose(tag) {
139
- const stack = [];
146
+ const /** @type {string[]} */ stack = [];
140
147
  for (;;) {
141
148
  const next = this.toNextTag();
142
149
  if (!next) {
@@ -172,8 +179,9 @@
172
179
  }
173
180
  }
174
181
 
182
+ /** @param {string} tag */
175
183
  findMatchingOpen(tag) {
176
- const stack = [];
184
+ const /** @type {string[]} */ stack = [];
177
185
  for (;;) {
178
186
  const prev = this.toPrevTag();
179
187
  if (!prev) {
@@ -210,7 +218,7 @@
210
218
  }
211
219
  }
212
220
 
213
- CodeMirror.defineExtension('findMatchingTag', function(pos) {
221
+ CodeMirror.defineExtension('findMatchingTag', /** @param {CodeMirror.Position} pos */ function(pos) {
214
222
  let iter = new Iter(this, pos);
215
223
  if (!iter.isTag()) {
216
224
  return;
@@ -234,20 +242,32 @@
234
242
  return {open: here, close: iter.findMatchingClose(tag), at: 'open'};
235
243
  });
236
244
 
237
- CodeMirror.defineExtension('findEnclosingTag', function(pos, tag) {
238
- const iter = new Iter(this, pos);
239
- const open = iter.findMatchingOpen(tag);
240
- if (!open) {
241
- return;
242
- }
243
- const forward = new Iter(this, pos);
244
- const close = forward.findMatchingClose(open.tag);
245
- if (close) {
246
- return {open, close};
247
- }
248
- });
245
+ CodeMirror.defineExtension(
246
+ 'findEnclosingTag',
247
+ /**
248
+ * @param {CodeMirror.Position} pos
249
+ * @param {string} tag
250
+ */
251
+ function(pos, tag) {
252
+ const iter = new Iter(this, pos);
253
+ const open = iter.findMatchingOpen(tag);
254
+ if (!open) {
255
+ return;
256
+ }
257
+ const forward = new Iter(this, pos);
258
+ const close = forward.findMatchingClose(open.tag);
259
+ if (close) {
260
+ return {open, close};
261
+ }
262
+ },
263
+ );
249
264
 
250
- // Used by addon/edit/closetag.js
265
+ /**
266
+ * Used by addon/edit/closetag.js
267
+ * @param {CodeMirror.Editor} cm
268
+ * @param {CodeMirror.Position} pos
269
+ * @param {string} name
270
+ */
251
271
  CodeMirror.scanForClosingTag = function(cm, pos, name) {
252
272
  const iter = new Iter(cm, pos);
253
273
  return iter.findMatchingClose(name);
@@ -265,6 +285,7 @@
265
285
  }
266
286
  });
267
287
 
288
+ /** @param {CodeMirror.Editor} cm */
268
289
  function clear(cm) {
269
290
  if (cm.state.tagHit) {
270
291
  cm.state.tagHit.clear();
@@ -276,12 +297,20 @@
276
297
  cm.state.tagOther = null;
277
298
  }
278
299
 
300
+ /** @param {CodeMirror.Editor} cm */
279
301
  function doMatchTags(cm) {
280
302
  cm.operation(() => {
281
303
  clear(cm);
282
304
  if (cm.somethingSelected()) {
283
305
  return;
284
306
  }
307
+ /**
308
+ * @typedef {object} match
309
+ * @property {string} at
310
+ * @property {{from: CodeMirror.Position, to: CodeMirror.Position}} open
311
+ * @property {{from: CodeMirror.Position, to: CodeMirror.Position}} close
312
+ */
313
+ /** @type {match}} */
285
314
  const match = cm.findMatchingTag(cm.getCursor());
286
315
  if (!match) {
287
316
  return;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wikiplus-highlight",
3
- "version": "2.7.5",
3
+ "version": "2.7.6",
4
4
  "description": "A plugin for the MediaWiki front-end add-on \"Wikiplus\"",
5
5
  "main": "main.js",
6
6
  "scripts": {
@@ -12,7 +12,7 @@
12
12
  },
13
13
  "keywords": [
14
14
  "mediawiki",
15
- "mediawiki-gadget",
15
+ "codemirror",
16
16
  "wikiplus"
17
17
  ],
18
18
  "author": "Bhsd",
@@ -20,5 +20,9 @@
20
20
  "bugs": {
21
21
  "url": "https://github.com/bhsd-harry/Wikiplus-highlight/issues"
22
22
  },
23
- "homepage": "https://github.com/bhsd-harry/Wikiplus-highlight#readme"
23
+ "homepage": "https://github.com/bhsd-harry/Wikiplus-highlight#readme",
24
+ "devDependencies": {
25
+ "eslint": "^8.8.0",
26
+ "uglify-js": "^3.15.5"
27
+ }
24
28
  }
package/search.js CHANGED
@@ -6,6 +6,10 @@
6
6
  (() => {
7
7
  'use strict';
8
8
 
9
+ /**
10
+ * @param {string} key
11
+ * @returns {string}
12
+ */
9
13
  const msg = key => mw.msg(`wphl-${key}`);
10
14
 
11
15
  // Prepare elements
@@ -42,14 +46,15 @@
42
46
  text: msg('addon-search'),
43
47
  });
44
48
 
45
- const escapeRegExp = mw.util.escapeRegExp || mw.RegExp.escape; // @type {(function|undefined)}
49
+ const /** @type {function(string): string} */ escapeRegExp = mw.util.escapeRegExp || mw.RegExp.escape;
46
50
  const overlay = {token: () => {}};
47
51
 
48
52
  /**
49
53
  * 根据搜索字符串生成高亮
54
+ * @param {string|RegExp} str
50
55
  */
51
56
  const token = str => {
52
- let initial;
57
+ let /** @type {RegExp} */ initial;
53
58
  if (typeof str === 'string') {
54
59
  initial = RegExp(`[^${escapeRegExp(str[0])}]`, 'i');
55
60
  }
@@ -70,9 +75,14 @@
70
75
  };
71
76
 
72
77
  // keyboard event handler of $search
73
- let lastPtn, cursor;
78
+ let /** @type {string|RegExp} */ lastPtn,
79
+ /** @type {Object<string, function(): number>} */ cursor;
80
+ /**
81
+ * @param {CodeMirror.Editor} cm
82
+ * @param {boolean} dir
83
+ */
74
84
  const findNext = (cm, dir) => {
75
- let ptn = $search.val();
85
+ let /** @type {string|RegExp} */ ptn = $search.val();
76
86
  if (!ptn) {
77
87
  return;
78
88
  }
@@ -119,27 +129,32 @@
119
129
  .scrollIntoView({behavior: 'smooth'});
120
130
  };
121
131
 
122
- // click event handler of $searchClose
132
+ /**
133
+ * click event handler of $searchClose
134
+ * @param {CodeMirror.Editor} cm
135
+ */
123
136
  const reset = cm => {
124
137
  cm.removeOverlay(overlay);
125
138
  $searchContainer.hide();
126
139
  lastPtn = '';
127
140
  };
128
141
 
142
+ /** @param {CodeMirror.Editor} doc */
129
143
  CodeMirror.commands.findForward = doc => {
130
144
  findNext(doc, true);
131
145
  };
146
+ /** @param {CodeMirror.Editor} doc */
132
147
  CodeMirror.commands.findBackward = doc => {
133
148
  findNext(doc, false);
134
149
  };
135
150
 
136
- const {name} = $.client.profile(),
151
+ const /** @type {{name: string}} */ {name} = $.client.profile(),
137
152
  focus = name === 'safari'
138
- ? cm => {
153
+ ? /** @param {CodeMirror.Editor} cm */ cm => {
139
154
  cm.focus();
140
155
  }
141
156
  : () => {};
142
- mw.hook('wiki-codemirror').add(cm => {
157
+ mw.hook('wiki-codemirror').add(/** @param {CodeMirror.Editor} cm */ cm => {
143
158
  const $textarea = $(cm.getWrapperElement()).prev('#Wikiplus-Quickedit');
144
159
  if ($textarea.length === 0) {
145
160
  return;