wikiplus-highlight 2.7.4 → 2.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # Wikiplus-highlight
2
- [![jsdelivr hits](https://img.shields.io/jsdelivr/gh/hd/bhsd-harry/Wikiplus-highlight.svg)](https://github.com/bhsd-harry/Wikiplus-highlight)
3
2
  [![npm version](https://badge.fury.io/js/wikiplus-highlight.svg)](https://www.npmjs.com/package/wikiplus-highlight)
4
3
  [![npm downloads](https://img.shields.io/npm/dw/wikiplus-highlight.svg)](https://www.npmjs.com/package/wikiplus-highlight)
4
+ [![jsdelivr hits](https://img.shields.io/jsdelivr/npm/hd/wikiplus-highlight.svg)](https://www.npmjs.com/package/wikiplus-highlight)
5
5
 
6
6
  **Wikiplus-highlight** 是由 Bhsd 编写的一款 [Wikiplus](https://github.com/Wikiplus/Wikiplus) 语法高亮插件,它主要基于 MediaWiki 内置的 [JavaScript 模块](https://www.mediawiki.org/wiki/ResourceLoader/Core_modules)和 [CodeMirror](https://codemirror.net/) 编写。
7
7
 
@@ -12,13 +12,13 @@
12
12
  在*个人 JS 页*添加以下代码:
13
13
 
14
14
  ```javascript
15
- mw.loader.load('//cdn.jsdelivr.net/npm/wikiplus-highlight@2.7.4');
15
+ mw.loader.load('//cdn.jsdelivr.net/npm/wikiplus-highlight@2.8.0');
16
16
  ```
17
17
 
18
18
 
19
19
 
20
20
  ```javascript
21
- mw.loader.load('//unpkg.com/wikiplus-highlight@2.7.4/dist/main.min.js');
21
+ mw.loader.load('//unpkg.com/wikiplus-highlight@2.8.0/dist/main.min.js');
22
22
  ```
23
23
 
24
24
  ### 稳定版本
@@ -39,7 +39,7 @@ mw.loader.load('//unpkg.com/wikiplus-highlight/dist/main.min.js');
39
39
 
40
40
  ## 更多插件
41
41
 
42
- 使用 *Vector* 皮肤时,在右上角的【更多】菜单将添加一个【Wikiplus高亮设置】选项,点击后可以选择想要加载的 CodeMirror 插件。默认加载【搜索】插件。
42
+ 使用 *[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
43
 
44
44
  ### 搜索
45
45
 
@@ -49,7 +49,37 @@ mw.loader.load('//unpkg.com/wikiplus-highlight/dist/main.min.js');
49
49
  - Ctrl(Cmd)-G: 搜索下一处
50
50
  - Shift-Ctrl(Cmd)-G: 搜索上一处
51
51
 
52
- 搜索可以使用字符串,也可以使用形如 `/re/` 或 `/re/i` 的正则表达式。正则表达式仅接受可选的 `i` 修饰符,暂不接受其他修饰符。
52
+ 除了使用以上快捷键,也可以通过在搜索框中按下 `Enter` 键或点击搜索框右侧的 `▼` 按钮来执行搜索下一处的命令,点击 `▲` 按钮将执行搜索上一处的命令。搜索可以使用字符串,也可以使用形如 `/re/` 或 `/re/i` 的正则表达式。正则表达式仅接受可选的 `i` 修饰符,暂不接受其他修饰符。全文中匹配的字符都会添加淡粉色背景。如果没有匹配的结果,搜索框会添加粉色背景。
53
+
54
+ ### 高亮当前行
55
+
56
+ 使用这一插件时,如果当前没有选中的文字,光标所在行将添加浅蓝色背景。
57
+
58
+ ### 尾随空格
59
+
60
+ 使用这一插件时,每一行的尾随空格将添加红色波浪下划线。
61
+
62
+ ### 匹配括号
63
+
64
+ 与 MediaWiki 官方提供的 [CodeMirror](https://www.mediawiki.org/wiki/Extension:CodeMirror) 扩展不同,这一插件只会在光标位于括号(包括 `{}`、`[]`,JavaScript、CSS 和 Lua 模式下还包括 `()`)处时才会生效,但括号匹配时会考虑其语法含义。以下是一个简单的例子:
65
+
66
+ ```wikitext
67
+ <!--[-->]
68
+ ```
69
+
70
+ CodeMirror 扩展会错误地匹配 `<!-- -->` 注释内外的括号,而这个插件不会。匹配的括号对会添加绿色边框,未匹配的单个括号会添加黄色边框。
71
+
72
+ ### 匹配标签
73
+
74
+ 匹配的标签对或自封闭标签会添加浅绿色背景,未匹配的标签会添加浅黄色背景。注意被高亮标记为错误的标签不会进行匹配。
75
+
76
+ ### 快速打开模板
77
+
78
+ 右键点击被高亮标记为模板标题或 `#invoke` 魔术字的第一个参数(即模块标题)时,会在新标签页打开对应页面。如果当前站点安装了 [Widget](https://www.mediawiki.org/wiki/Extension:Widget) 扩展,则当右键点击 `#widget` 魔术字的第一个参数(即小部件标题)时会在新标签页打开对应小部件的编辑界面(即 `action=edit`)。
79
+
80
+ ### 调整缩进
81
+
82
+ 这不是一个真正意义上的插件,而是一个设置选项。默认设置下使用 Tab 进行缩进。勾选这一选项时,会出现一个新的文本框以设置缩进对应的空格个数,初始值为 `4`。
53
83
 
54
84
  ## Supported languages
55
85
 
package/bump.sh CHANGED
@@ -1,16 +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 -o dist/main.min.js
4
- echo -n "
5
- //# sourceMappingURL=https://unpkg.com/wikiplus-highlight@$1/dist/main.min.js.map" >> dist/main.min.js
6
- sed -i '' -E "s/\"version\": \".+\"/\"version\": \"$1\"/" package.json
7
- perl -pi -e "s|wikiplus-highlight@\d+\..+?(['/])|wikiplus-highlight\@$1\$1|" README.md
8
- for file in i18n/*
9
- do
10
- sed -i '' -E "s/\"wphl-version\": \".+\"/\"wphl-version\": \"$1\"/" $file
11
- done
12
- git add -A
13
- git commit -m "chore: bump version to $1"
14
- git push
15
- git tag $1
16
- 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.4";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")})})();
8
- //# sourceMappingURL=https://unpkg.com/wikiplus-highlight@2.7.4/dist/main.min.js.map
7
+ (async()=>{"use strict";var e="2.8";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",l="npm/codemirror@5.65.3",r="gh/bhsd-harry/codemirror-mediawiki@1.1.3",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")||{},f=""+P+E,k=d[f]||{},b=k.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:l+"/mode/lua/lua.min.js",mediawiki:b?"ext.CodeMirror.data":[],htmlmixed:"ext.CodeMirror.lib.mode.htmlmixed",xml:[]}:{lib:l+"/lib/codemirror.min.js",css:l+"/mode/css/css.min.js",javascript:l+"/mode/javascript/javascript.min.js",lua:l+"/mode/lua/lua.min.js",mediawiki:[],htmlmixed:l+"/mode/htmlmixed/htmlmixed.min.js",xml:l+"/mode/xml/xml.min.js"},v={searchcursor:l+"/addon/search/searchcursor.min.js",search:s+"/search.min.js",activeLine:l+"/addon/selection/active-line.min.js",markSelection:l+"/addon/selection/mark-selection.min.js",trailingspace:l+"/addon/edit/trailingspace.min.js",matchBrackets:l+"/addon/edit/matchbrackets.min.js",matchTags:s+"/matchtags.min.js",foldCode:l+"/addon/fold/foldcode.min.js",fold:s+"/fold.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}/${r}/mediawiki.min.css`,"text/css"),(w?t:i).push(r+"/mediawiki.min.js")),"mediawiki"===e&&"object"==typeof k.config&&k.config.tags.html&&(e="html"),n||((w?i:a).push(x.lib),w||mw.loader.load(`${o}/${l}/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),!s.prototype.foldCode&&j.includes("fold")&&a.push(v.foldCode),!s.optionHandlers.fold&&j.includes("fold")&&a.push(v.fold),["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[f]={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}=k,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"],l=["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[r]=e["functionSynonyms"];r.subst||i(a.filter(({name:e})=>l.includes(e))).forEach(({alias:e,name:i})=>{r[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,...l]),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 l=z.getWrapperElement();if(l.id="Wikiplus-CodeMirror",["mediawiki","widget"].includes(t)&&j.includes("contextmenu")){C.disabled=!1;const[r]=mw.config.get("extCodeMirrorConfig")["functionSynonyms"];e=i=>Object.keys(r).filter(e=>r[e]===i).map(e=>e.startsWith("#")?e:"#"+e);const c=e("invoke"),d=e("widget");await mw.loader.using("mediawiki.Title"),$(l).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,H,B;const G=(e=j)=>{B.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}),H=new OO.ui.FieldLayout(L,{label:m("addon-label"),notices:[m("addon-notice")],align:"top"}),B=new OO.ui.FieldLayout(I,{label:m("addon-indent")}),G()}T.open({title:m("addon-title"),message:H.$element.add(B.$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=>{H.$element.detach(),B.$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
+ //# sourceMappingURL=main.min.js.map
@@ -1 +1 @@
1
- {"version":3,"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":"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"}
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","foldCode","fold","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":"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"}
package/i18n/en.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "wphl-version": "2.7.4",
2
+ "wphl-version": "2.8",
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.4",
2
+ "wphl-version": "2.8",
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.4",
2
+ "wphl-version": "2.8",
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.4';
11
+ const version = '2.8';
12
12
 
13
13
  /**
14
14
  * polyfill for mw.storage
15
- * @type {Object.<string, function>}
15
+ * @type {{getObject: (key: string) => ?any, setObject: (key: string, value: 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 {(entries: Iterable<[string, any]>) => Object<string, any>}
46
44
  */
47
45
  const fromEntries = Object.fromEntries || (entries => {
48
- const obj = {};
46
+ const /** @type {Object<string, 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.3',
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,
@@ -107,14 +106,26 @@
107
106
  skin,
108
107
  } = mw.config.values;
109
108
 
109
+ /**
110
+ * @typedef {object} mwConfig
111
+ * @property {Object<string, string>} tagModes
112
+ * @property {Object<string, boolean>} tags
113
+ * @property {string} urlProtocols
114
+ * @property {[Object<string, string>, Object<string, string>]} doubleUnderscore
115
+ * @property {[Object<string, string>, Object<string, string>]} functionSynonyms
116
+ * @property {string[]} redirect
117
+ * @property {Object<string, string>} img
118
+ */
119
+
110
120
  // 和本地缓存有关的常数
111
121
  const USING_LOCAL = mw.loader.getState('ext.CodeMirror') !== null,
112
- ALL_SETTINGS_CACHE = storage.getObject('InPageEditMwConfig') || {}, // @type {?Object.<string, Object>}
122
+ /** @type {Object<string, {time: number, config: mwConfig}>} */
123
+ ALL_SETTINGS_CACHE = storage.getObject('InPageEditMwConfig') || {},
113
124
  SITE_ID = `${server}${scriptPath}`,
114
- SITE_SETTINGS = ALL_SETTINGS_CACHE[SITE_ID] || {}, // @type {?Object}
125
+ /** @type {{time: number, config: mwConfig}} */ SITE_SETTINGS = ALL_SETTINGS_CACHE[SITE_ID] || {},
115
126
  EXPIRED = SITE_SETTINGS.time < Date.now() - 86400 * 1000 * 30;
116
127
 
117
- const CONTENTMODEL = {
128
+ const /** @type {Object<string, string>} */ CONTENTMODEL = {
118
129
  css: 'css',
119
130
  'sanitized-css': 'css',
120
131
  javascript: 'javascript',
@@ -122,7 +133,7 @@
122
133
  wikitext: 'mediawiki',
123
134
  };
124
135
 
125
- const MODE_LIST = USING_LOCAL
136
+ const /** @type {Object<string, string|[]>} */ MODE_LIST = USING_LOCAL
126
137
  ? {
127
138
  lib: 'ext.CodeMirror.lib',
128
139
  css: 'ext.CodeMirror.lib.mode.css',
@@ -150,21 +161,23 @@
150
161
  trailingspace: `${CM_CDN}/addon/edit/trailingspace.min.js`,
151
162
  matchBrackets: `${CM_CDN}/addon/edit/matchbrackets.min.js`,
152
163
  matchTags: `${REPO_CDN}/matchtags.min.js`,
164
+ foldCode: `${CM_CDN}/addon/fold/foldcode.min.js`,
165
+ fold: `${REPO_CDN}/fold.min.js`,
153
166
  };
154
167
 
155
168
  const defaultAddons = ['search'],
156
169
  defaultIndent = '4';
157
- let addons = storage.getObject('Wikiplus-highlight-addons') || defaultAddons, // @type {?string[]}
158
- indent = storage.getObject('Wikiplus-highlight-indent') || defaultIndent; // @type {string}
170
+ let /** @type {string[]} */ addons = storage.getObject('Wikiplus-highlight-addons') || defaultAddons,
171
+ /** @type {string} */ indent = storage.getObject('Wikiplus-highlight-indent') || defaultIndent;
159
172
 
160
173
  // 用于contextMenu插件
161
- const contextmenuStyle = document.getElementById('wphl-contextmenu') // @type {?HTMLStyleElement}
174
+ const /** @type {HTMLStyleElement} */ contextmenuStyle = document.getElementById('wphl-contextmenu')
162
175
  || mw.loader.addStyleTag('#Wikiplus-CodeMirror .cm-mw-template-name{cursor:pointer}');
163
176
  contextmenuStyle.id = 'wphl-contextmenu';
164
177
  contextmenuStyle.disabled = true;
165
178
 
166
- let i18n = storage.getObject('Wikiplus-highlight-i18n'), // @type {?Object.<string, string>}
167
- welcome; // @type {function: jQuery.<?HTMLParagraphElement>}
179
+ let /** @type {Object<string, string>} */ i18n = storage.getObject('Wikiplus-highlight-i18n'),
180
+ /** @type {() => JQuery<HTMLParagraphElement>} */ welcome;
168
181
  if (!i18n) { // 首次安装
169
182
  i18n = {};
170
183
  welcome = notify('welcome');
@@ -172,18 +185,15 @@
172
185
  welcome = notify('welcome-upgrade', version);
173
186
  }
174
187
 
175
- const i18nLanguages = {
188
+ const /** @type {Object<string, string>} */ i18nLanguages = {
176
189
  zh: 'zh-hans', 'zh-hans': 'zh-hans', 'zh-cn': 'zh-hans', 'zh-my': 'zh-hans', 'zh-sg': 'zh-hans',
177
190
  'zh-hant': 'zh-hant', 'zh-tw': 'zh-hant', 'zh-hk': 'zh-hant', 'zh-mo': 'zh-hant',
178
191
  },
179
- i18nLang = i18nLanguages[userLang] || 'en', // @type {?string}
192
+ i18nLang = i18nLanguages[userLang] || 'en',
180
193
  I18N_CDN = `${CDN}/${REPO_CDN}/i18n/${i18nLang}.json`,
181
194
  isLatest = i18n['wphl-version'] === majorVersion;
182
195
 
183
- /**
184
- * 加载 I18N
185
- * @returns {promise}
186
- */
196
+ /** 加载 I18N */
187
197
  const setI18N = async () => {
188
198
  if (!isLatest || i18n['wphl-lang'] !== i18nLang) {
189
199
  i18n = await $.ajax(`${I18N_CDN}`, { // eslint-disable-line require-atomic-updates
@@ -195,7 +205,7 @@
195
205
  mw.messages.set(i18n);
196
206
  };
197
207
 
198
- const i18nPromise = Promise.all([ // 提前加载I18N
208
+ const /** @type {Promise<[void, void]>} */ i18nPromise = Promise.all([ // 提前加载I18N
199
209
  mw.loader.using('mediawiki.util'),
200
210
  setI18N(),
201
211
  ]);
@@ -203,12 +213,12 @@
203
213
  /**
204
214
  * 下载脚本
205
215
  * @param {string[]} urls 脚本路径
206
- * @param {boolean=false} local 是否从本地下载
207
- * @returns {promise}
216
+ * @param {boolean} local 是否从本地下载
217
+ * @returns {Promise<void>}
208
218
  */
209
219
  const getScript = (urls, local) => {
210
220
  if (urls.length === 0) {
211
- return;
221
+ return Promise.resolve();
212
222
  }
213
223
  return local
214
224
  ? mw.loader.using(urls)
@@ -219,22 +229,21 @@
219
229
  };
220
230
 
221
231
  // 以下进入CodeMirror相关内容
222
- let cm;
232
+ let /** @type {CodeMirror.Editor} */ cm;
223
233
 
224
234
  /**
225
235
  * 根据文本的高亮模式加载依赖项
226
236
  * @param {string} type
227
- * @returns {promise}
228
237
  */
229
238
  const initMode = async type => {
230
- let scripts = [];
231
- const externalScript = [],
232
- addonScript = [],
239
+ let /** @type {string[]} */ scripts = [];
240
+ const /** @type {string[]} */ externalScript = [],
241
+ /** @type {string[]} */ addonScript = [],
233
242
  loaded = typeof window.CodeMirror === 'function';
234
243
 
235
244
  /**
236
245
  * 代替CodeMirror的局部变量
237
- * @type {(function|Object.<string, Object>)}
246
+ * @type {CodeMirror}
238
247
  */
239
248
  const CM = loaded
240
249
  ? window.CodeMirror
@@ -281,6 +290,12 @@
281
290
  if (!CM.optionHandlers.matchTags && addons.includes('matchTags')) {
282
291
  addonScript.push(ADDON_LIST.matchTags);
283
292
  }
293
+ if (!CM.prototype.foldCode && addons.includes('fold')) {
294
+ addonScript.push(ADDON_LIST.foldCode);
295
+ }
296
+ if (!CM.optionHandlers.fold && addons.includes('fold')) {
297
+ addonScript.push(ADDON_LIST.fold);
298
+ }
284
299
  if (['widget', 'html'].includes(type)) {
285
300
  ['css', 'javascript', 'mediawiki', 'htmlmixed', 'xml'].forEach(lang => {
286
301
  if (!CM.modes[lang]) {
@@ -315,7 +330,7 @@
315
330
 
316
331
  /**
317
332
  * 更新缓存的设置数据
318
- * @param {Object} config
333
+ * @param {mwConfig} config
319
334
  */
320
335
  const updateCachedConfig = config => {
321
336
  ALL_SETTINGS_CACHE[SITE_ID] = {
@@ -328,8 +343,7 @@
328
343
  /**
329
344
  * 加载CodeMirror的mediawiki模块需要的设置数据
330
345
  * @param {string} type
331
- * @param {promise} initModePromise 使用本地CodeMirror扩展时大部分数据来自ext.CodeMirror.data模块
332
- * @returns {promise}
346
+ * @param {Promise<void>} initModePromise 使用本地CodeMirror扩展时大部分数据来自ext.CodeMirror.data模块
333
347
  */
334
348
  const getMwConfig = async (type, initModePromise) => {
335
349
  if (!['mediawiki', 'widget'].includes(type)) {
@@ -340,7 +354,7 @@
340
354
  await initModePromise;
341
355
  }
342
356
 
343
- let config = mw.config.get('extCodeMirrorConfig');
357
+ let /** @type {mwConfig} */ config = mw.config.get('extCodeMirrorConfig');
344
358
  if (!config && !EXPIRED && isLatest) {
345
359
  ({config} = SITE_SETTINGS);
346
360
  mw.config.set('extCodeMirrorConfig', config);
@@ -351,13 +365,21 @@
351
365
  return config;
352
366
  }
353
367
 
368
+ /**
369
+ * @typedef {object} siteInfoQuery
370
+ * @property {{name: string, aliases: string[], 'case-sensitive': boolean}[]} magicwords
371
+ * @property {string[]} extensiontags
372
+ * @property {string[]} functionhooks
373
+ * @property {string[]} variables
374
+ */
375
+
354
376
  /**
355
377
  * 以下情形均需要发送API请求
356
378
  * 情形2:localStorage未过期但不包含新设置
357
379
  * 情形3:新加载的 ext.CodeMirror.data
358
380
  * 情形4:config === null
359
381
  */
360
- const {
382
+ const /** @type {{query: siteInfoQuery}} */ {
361
383
  query: {magicwords, extensiontags, functionhooks, variables},
362
384
  } = await new mw.Api().get({
363
385
  meta: 'siteinfo',
@@ -367,21 +389,22 @@
367
389
  const otherMagicwords = ['msg', 'raw', 'msgnw', 'subst', 'safesubst'];
368
390
 
369
391
  /**
370
- * @param {Object[]} words
371
- * @property <string[]> aliases
372
- * @property <string> name
373
- * @returns {Object.<('alias'|'name'), string>[]}
392
+ * @param {{aliases: string[], name: string}[]} words
393
+ * @returns {{alias: string, name: string}[]}
374
394
  */
375
- const getAliases = words => words.flatMap(({aliases, name}) => aliases.map(alias => ({alias, name})));
395
+ const getAliases = words => words.flatMap(
396
+ /** @param {{aliases: string[], name: string}} */
397
+ ({aliases, name}) => aliases.map(alias => ({alias, name})),
398
+ );
376
399
  /**
377
- * @param {Object.<('alias'|'name'), string>[]} aliases
378
- * @returns {Object.<string, string>}
400
+ * @param {{alias: string, name: string}[]} aliases
401
+ * @returns {Object<string, string>}
379
402
  */
380
403
  const getConfig = aliases => fromEntries(
381
404
  aliases.map(({alias, name}) => [alias.replace(/:$/, ''), name]),
382
405
  );
383
406
 
384
- if (!config) { // 情形4:config === null
407
+ if (!config) { // 情形4:config === null\
385
408
  config = {
386
409
  tagModes: {
387
410
  pre: 'mw-tag-pre',
@@ -393,9 +416,11 @@
393
416
  ),
394
417
  urlProtocols: mw.config.get('wgUrlProtocols'),
395
418
  };
419
+ /** @type {Set<string>} */
396
420
  const realMagicwords = new Set([...functionhooks, ...variables, ...otherMagicwords]),
397
- allMagicwords = magicwords.filter(({name, aliases}) =>
398
- aliases.some(alias => /^__.+__$/.test(alias)) || realMagicwords.has(name),
421
+ allMagicwords = magicwords.filter(
422
+ /** @returns {boolean} */
423
+ ({name, aliases}) => aliases.some(alias => /^__.+__$/.test(alias)) || realMagicwords.has(name),
399
424
  ),
400
425
  sensitive = getAliases(
401
426
  allMagicwords.filter(word => word['case-sensitive']),
@@ -415,30 +440,27 @@
415
440
  const {functionSynonyms: [insensitive]} = config;
416
441
  if (!insensitive.subst) {
417
442
  getAliases(
418
- magicwords.filter(({name}) => otherMagicwords.includes(name)),
443
+ magicwords.filter(/** @return {boolean} */ ({name}) => otherMagicwords.includes(name)),
419
444
  ).forEach(({alias, name}) => {
420
445
  insensitive[alias.replace(/:$/, '')] = name;
421
446
  });
422
447
  }
423
448
  }
424
- config.redirect = magicwords.find(({name}) => name === 'redirect').aliases;
449
+ config.redirect = magicwords.find(/** @param {{name: string}} */ ({name}) => name === 'redirect').aliases;
425
450
  config.img = getConfig(
426
- getAliases(magicwords.filter(({name}) => name.startsWith('img_'))),
451
+ getAliases(magicwords.filter(/** @returns {boolean} */ ({name}) => name.startsWith('img_'))),
427
452
  );
428
453
  mw.config.set('extCodeMirrorConfig', config);
429
454
  updateCachedConfig(config);
430
455
  return config;
431
456
  };
432
457
 
433
- /**
434
- * 检查页面语言类型
435
- * @returns {promise}
436
- */
458
+ /** 检查页面语言类型 */
437
459
  const getPageMode = async () => {
438
460
  if ([274, 828].includes(ns) && !page.endsWith('/doc')) {
439
461
  const pageMode = ns === 274 ? 'Widget' : 'Lua';
440
462
  await mw.loader.using(['oojs-ui-windows', 'oojs-ui.styles.icons-content']);
441
- const bool = await OO.ui.confirm(msg('contentmodel'), {
463
+ const /** @type {boolean} */ bool = await OO.ui.confirm(msg('contentmodel'), {
442
464
  actions: [
443
465
  {label: pageMode},
444
466
  {label: 'Wikitext', action: 'accept'},
@@ -453,13 +475,13 @@
453
475
 
454
476
  /**
455
477
  * 渲染编辑器
456
- * @param {jQuery.<HTMLTextAreaElement>} $target 目标编辑框
478
+ * @param {JQuery<HTMLTextAreaElement>} $target 目标编辑框
457
479
  * @param {boolean} setting 是否是Wikiplus设置(使用json语法)
458
480
  */
459
481
  const renderEditor = async ($target, setting) => {
460
482
  const mode = setting ? 'javascript' : await getPageMode();
461
483
  const initModePromise = initMode(mode);
462
- const [mwConfig] = await Promise.all([
484
+ const /** @type {[mwConfig]} */ [mwConfig] = await Promise.all([
463
485
  getMwConfig(mode, initModePromise),
464
486
  initModePromise,
465
487
  ]);
@@ -484,7 +506,7 @@
484
506
  }
485
507
 
486
508
  const json = setting || contentmodel === 'json',
487
- {name} = $.client.profile();
509
+ /** @type {{name: string}} */ {name} = $.client.profile();
488
510
  cm = CodeMirror.fromTextArea($target[0], $.extend({
489
511
  inputStyle: name === 'safari' ? 'textarea' : 'contenteditable',
490
512
  lineNumbers: true,
@@ -514,20 +536,17 @@
514
536
  wrapper.id = 'Wikiplus-CodeMirror';
515
537
  if (['mediawiki', 'widget'].includes(mode) && addons.includes('contextmenu')) {
516
538
  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)
539
+ const /** @type {mwConfig} */ {functionSynonyms: [synonyms]} = mw.config.get('extCodeMirrorConfig');
540
+ /** @param {string} str */
541
+ const getSysnonyms = str => Object.keys(synonyms).filter(key => synonyms[key] === str)
523
542
  .map(key => key.startsWith('#') ? key : `#${key}`);
524
543
  const invoke = getSysnonyms('invoke'),
525
544
  widget = getSysnonyms('widget');
526
545
 
527
546
  await mw.loader.using('mediawiki.Title');
528
547
  $(wrapper).on('contextmenu', '.cm-mw-template-name', function() {
529
- const text = this.textContent.replace(/\u200e/g, '').trim(),
530
- title = new mw.Title(text);
548
+ const /** @type {string} */ text = this.textContent.replace(/\u200e/g, '').trim(),
549
+ /** @type {{namespace: number, getUrl: () => string}} */ title = new mw.Title(text);
531
550
  if (title.namespace !== 0 || text.startsWith(':')) {
532
551
  open(title.getUrl(), '_blank');
533
552
  } else {
@@ -538,6 +557,7 @@
538
557
  'contextmenu',
539
558
  '.cm-mw-parserfunction-name + .cm-mw-parserfunction-delimiter + .cm-mw-parserfunction',
540
559
  function() {
560
+ /** @type {string} */
541
561
  const parserFunction = this.previousSibling.previousSibling.textContent.trim().toLowerCase();
542
562
  if (invoke.includes(parserFunction)) {
543
563
  open(mw.util.getUrl(`Module:${this.textContent}`), '_blank');
@@ -581,8 +601,13 @@
581
601
 
582
602
  // 监视 Wikiplus 编辑框
583
603
  const observer = new MutationObserver(records => {
584
- const $editArea = $(records.flatMap(({addedNodes}) => [...addedNodes]))
585
- .find('#Wikiplus-Quickedit, #Wikiplus-Setting-Input');
604
+ const $editArea = $(records.flatMap(
605
+ /**
606
+ * @param {{addedNodes: NodeList}}
607
+ * @returns {Node[]}
608
+ */
609
+ ({addedNodes}) => [...addedNodes],
610
+ )).find('#Wikiplus-Quickedit, #Wikiplus-Setting-Input');
586
611
  if ($editArea.length === 0) {
587
612
  return;
588
613
  }
@@ -591,8 +616,9 @@
591
616
  observer.observe(document.body, {childList: true});
592
617
 
593
618
  // 添加样式
594
- const wphlStyle = document.getElementById('wphl-style') || mw.loader.addStyleTag(
595
- '#Wikiplus-Quickedit+.CodeMirror,#Wikiplus-Setting-Input+.CodeMirror{border:1px solid #c8ccd1;line-height:1.3;clear:both}'
619
+ const /** @type {HTMLStyleElement} */ wphlStyle = document.getElementById('wphl-style') || mw.loader.addStyleTag(
620
+ '#Wikiplus-Quickedit+.CodeMirror,#Wikiplus-Setting-Input+.CodeMirror'
621
+ + '{border:1px solid #c8ccd1;line-height:1.3;clear:both}'
596
622
  + 'div.Wikiplus-InterBox{font-size:14px;z-index:100}'
597
623
  + '.skin-minerva .Wikiplus-InterBox{font-size:16px}'
598
624
  + '.cm-trailingspace{text-decoration:underline wavy red}'
@@ -603,7 +629,10 @@
603
629
  );
604
630
  wphlStyle.id = 'wphl-style';
605
631
 
606
- // 对编辑框调用jQuery.val方法时从CodeMirror获取文本
632
+ /**
633
+ * 对编辑框调用jQuery.val方法时从CodeMirror获取文本
634
+ * @type {{get: (elem: HTMLTextAreaElement) => string, set: (elem: HTMLTextAreaElement, value: string) => void}}
635
+ */
607
636
  const {
608
637
  get = function(elem) {
609
638
  return elem.value;
@@ -611,7 +640,11 @@
611
640
  set = function(elem, value) {
612
641
  elem.value = value;
613
642
  },
614
- } = $.valHooks.textarea || {}; // @type {?Object.<string, function>}
643
+ } = $.valHooks.textarea || {};
644
+ /**
645
+ * @param {HTMLTextAreaElement} elem
646
+ * @returns {boolean}
647
+ */
615
648
  const isWikiplus = elem => ['Wikiplus-Quickedit', 'Wikiplus-Setting-Input'].includes(elem.id);
616
649
  $.valHooks.textarea = {
617
650
  get(elem) {
@@ -628,8 +661,21 @@
628
661
 
629
662
  await i18nPromise; // 以下内容依赖I18N
630
663
 
664
+ /**
665
+ * @typedef {object} OOUI.widget
666
+ * @property {(data: any) => {closing: Promise<{action: string}>}} open
667
+ * @property {() => string|string[]} getValue
668
+ * @property {JQuery<HTMLDivElement>} $element
669
+ * @property {(show: boolean) => OOUI.widget} toggle
670
+ * @property {(windows: OOUI.widget[]) => void} addWindows
671
+ */
672
+
631
673
  // 设置对话框
632
- let dialog, widget, indentWidget, field, indentField;
674
+ let /** @type {OOUI.widget} */ dialog,
675
+ /** @type {OOUI.widget} */ widget,
676
+ /** @type {OOUI.widget} */ indentWidget,
677
+ /** @type {OOUI.widget} */ field,
678
+ /** @type {OOUI.widget} */ indentField;
633
679
  const toggleIndent = (value = addons) => {
634
680
  indentField.toggle(value.includes('indentWithSpace'));
635
681
  };
@@ -637,7 +683,7 @@
637
683
  minerva: 'page-actions-overflow',
638
684
  citizen: 'p-actions',
639
685
  };
640
- const $portlet = $(mw.util.addPortletLink(
686
+ const /** @type {JQuery<HTMLLIElement} */ $portlet = $(mw.util.addPortletLink(
641
687
  portletContainer[skin] || 'p-cactions', '#', msg('portlet'), 'wphl-settings',
642
688
  )).click(async e => {
643
689
  e.preventDefault();
@@ -645,7 +691,7 @@
645
691
  await mw.loader.using(['oojs-ui-windows', 'oojs-ui.styles.icons-content']);
646
692
  // eslint-disable-next-line require-atomic-updates
647
693
  dialog = new OO.ui.MessageDialog({id: 'Wikiplus-highlight-dialog'});
648
- const windowManager = new OO.ui.WindowManager();
694
+ const /** @type {OOUI.widget} */ windowManager = new OO.ui.WindowManager();
649
695
  windowManager.$element.appendTo(document.body);
650
696
  windowManager.addWindows([dialog]);
651
697
  widget = new OO.ui.CheckboxMultiselectInputWidget({
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);
@@ -61,14 +67,11 @@
61
67
  if (gt === -1) {
62
68
  return;
63
69
  }
70
+ this.ch = gt + 1;
64
71
  if (!this.bracketAt(gt)) {
65
- this.ch = gt + 1;
66
72
  continue;
67
73
  }
68
- const lastSlash = this.text.lastIndexOf('/', gt);
69
- const selfClose = lastSlash > -1 && !/\S/.test(this.text.slice(lastSlash + 1, gt));
70
- this.ch = gt + 1;
71
- return selfClose ? 'selfClose' : 'regular';
74
+ return this.text[gt - 1] === '/' ? 'selfClose' : 'regular';
72
75
  }
73
76
  }
74
77
 
@@ -135,8 +138,9 @@
135
138
  }
136
139
  }
137
140
 
141
+ /** @param {string} tag */
138
142
  findMatchingClose(tag) {
139
- const stack = [];
143
+ const /** @type {string[]} */ stack = [];
140
144
  for (;;) {
141
145
  const next = this.toNextTag();
142
146
  if (!next) {
@@ -172,8 +176,9 @@
172
176
  }
173
177
  }
174
178
 
179
+ /** @param {string} tag */
175
180
  findMatchingOpen(tag) {
176
- const stack = [];
181
+ const /** @type {string[]} */ stack = [];
177
182
  for (;;) {
178
183
  const prev = this.toPrevTag();
179
184
  if (!prev) {
@@ -210,7 +215,7 @@
210
215
  }
211
216
  }
212
217
 
213
- CodeMirror.defineExtension('findMatchingTag', function(pos) {
218
+ CodeMirror.defineExtension('findMatchingTag', /** @param {CodeMirror.Position} pos */ function(pos) {
214
219
  let iter = new Iter(this, pos);
215
220
  if (!iter.isTag()) {
216
221
  return;
@@ -234,20 +239,32 @@
234
239
  return {open: here, close: iter.findMatchingClose(tag), at: 'open'};
235
240
  });
236
241
 
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
- });
242
+ CodeMirror.defineExtension(
243
+ 'findEnclosingTag',
244
+ /**
245
+ * @param {CodeMirror.Position} pos
246
+ * @param {string} tag
247
+ */
248
+ function(pos, tag) {
249
+ const iter = new Iter(this, pos);
250
+ const open = iter.findMatchingOpen(tag);
251
+ if (!open) {
252
+ return;
253
+ }
254
+ const forward = new Iter(this, pos);
255
+ const close = forward.findMatchingClose(open.tag);
256
+ if (close) {
257
+ return {open, close};
258
+ }
259
+ },
260
+ );
249
261
 
250
- // Used by addon/edit/closetag.js
262
+ /**
263
+ * Used by addon/edit/closetag.js
264
+ * @param {CodeMirror.Editor} cm
265
+ * @param {CodeMirror.Position} pos
266
+ * @param {string} name
267
+ */
251
268
  CodeMirror.scanForClosingTag = function(cm, pos, name) {
252
269
  const iter = new Iter(cm, pos);
253
270
  return iter.findMatchingClose(name);
@@ -265,6 +282,7 @@
265
282
  }
266
283
  });
267
284
 
285
+ /** @param {CodeMirror.Editor} cm */
268
286
  function clear(cm) {
269
287
  if (cm.state.tagHit) {
270
288
  cm.state.tagHit.clear();
@@ -276,13 +294,22 @@
276
294
  cm.state.tagOther = null;
277
295
  }
278
296
 
297
+ /** @param {CodeMirror.Editor} cm */
279
298
  function doMatchTags(cm) {
280
299
  cm.operation(() => {
281
300
  clear(cm);
282
301
  if (cm.somethingSelected()) {
283
302
  return;
284
303
  }
285
- const match = cm.findMatchingTag(cm.getCursor());
304
+
305
+ /**
306
+ * @typedef {object} matchingTag
307
+ * @property {string} at
308
+ * @property {{from: CodeMirror.Position, to: CodeMirror.Position}} open
309
+ * @property {{from: CodeMirror.Position, to: CodeMirror.Position}} close
310
+ */
311
+
312
+ const /** @type {matchingTag}} */ match = cm.findMatchingTag(cm.getCursor());
286
313
  if (!match) {
287
314
  return;
288
315
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wikiplus-highlight",
3
- "version": "2.7.4",
3
+ "version": "2.8.0",
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,18 +46,19 @@
42
46
  text: msg('addon-search'),
43
47
  });
44
48
 
45
- const escapeRegExp = mw.util.escapeRegExp || mw.RegExp.escape; // @type {(function|undefined)}
46
- const overlay = {token: () => {}};
49
+ const /** @type {(str: string) => string} */ escapeRegExp = mw.util.escapeRegExp || mw.RegExp.escape;
50
+ const /** @type {{token: (stream: CodeMirror.StringStream) => string}} */ 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
  }
56
- return stream => {
61
+ return /** @param {CodeMirror.StringStream} stream */ stream => {
57
62
  if (stream.match(str, true, true)) {
58
63
  return 'search';
59
64
  }
@@ -69,10 +74,23 @@
69
74
  $search.css('background-color', '').off('input', onInput);
70
75
  };
71
76
 
77
+ /**
78
+ * @typedef {object} SearchCursor
79
+ * @property {() => boolean} findNext
80
+ * @property {() => boolean} findPrevious
81
+ * @property {() => CodeMirror.Position} from
82
+ * @property {() => CodeMirror.Position} to
83
+ */
84
+
72
85
  // keyboard event handler of $search
73
- let lastPtn, cursor;
86
+ let /** @type {string|RegExp} */ lastPtn,
87
+ /** @type {SearchCursor} */ cursor;
88
+ /**
89
+ * @param {CodeMirror.Editor} cm
90
+ * @param {boolean} dir
91
+ */
74
92
  const findNext = (cm, dir) => {
75
- let ptn = $search.val();
93
+ let /** @type {string|RegExp} */ ptn = $search.val();
76
94
  if (!ptn) {
77
95
  return;
78
96
  }
@@ -119,27 +137,32 @@
119
137
  .scrollIntoView({behavior: 'smooth'});
120
138
  };
121
139
 
122
- // click event handler of $searchClose
140
+ /**
141
+ * click event handler of $searchClose
142
+ * @param {CodeMirror.Editor} cm
143
+ */
123
144
  const reset = cm => {
124
145
  cm.removeOverlay(overlay);
125
146
  $searchContainer.hide();
126
147
  lastPtn = '';
127
148
  };
128
149
 
150
+ /** @param {CodeMirror.Editor} doc */
129
151
  CodeMirror.commands.findForward = doc => {
130
152
  findNext(doc, true);
131
153
  };
154
+ /** @param {CodeMirror.Editor} doc */
132
155
  CodeMirror.commands.findBackward = doc => {
133
156
  findNext(doc, false);
134
157
  };
135
158
 
136
- const {name} = $.client.profile(),
159
+ const /** @type {{name: string}} */ {name} = $.client.profile(),
137
160
  focus = name === 'safari'
138
- ? cm => {
161
+ ? /** @param {CodeMirror.Editor} cm */ cm => {
139
162
  cm.focus();
140
163
  }
141
164
  : () => {};
142
- mw.hook('wiki-codemirror').add(cm => {
165
+ mw.hook('wiki-codemirror').add(/** @param {CodeMirror.Editor} cm */ cm => {
143
166
  const $textarea = $(cm.getWrapperElement()).prev('#Wikiplus-Quickedit');
144
167
  if ($textarea.length === 0) {
145
168
  return;