wikiplus-highlight 2.7.3 → 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/.eslintrc.json +3 -0
- package/README.md +35 -4
- package/bump.sh +21 -12
- package/dist/main.min.js +2 -1
- package/dist/main.min.js.map +1 -0
- package/i18n/en.json +1 -1
- package/i18n/zh-hans.json +1 -1
- package/i18n/zh-hant.json +1 -1
- package/jsconfig.json +8 -0
- package/main.js +101 -79
- package/matchtags.js +45 -16
- package/package.json +7 -3
- package/search.js +23 -8
package/.eslintrc.json
CHANGED
package/README.md
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
# Wikiplus-highlight
|
|
2
2
|
[](https://github.com/bhsd-harry/Wikiplus-highlight)
|
|
3
|
+
[](https://www.npmjs.com/package/wikiplus-highlight)
|
|
3
4
|
[](https://www.npmjs.com/package/wikiplus-highlight)
|
|
4
5
|
[](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.
|
|
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.
|
|
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
|
-
|
|
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,13 +1,22 @@
|
|
|
1
1
|
#!/usr/local/bin/bash
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
perl -pi -e "s|wikiplus-highlight@\d+\..+?(['/])|wikiplus-highlight\@$1\$1|" README.md
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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,4 +4,5 @@
|
|
|
4
4
|
* @author 机智的小鱼君 <https://github.com/Dragon-Fish>
|
|
5
5
|
* @license GPL-3.0
|
|
6
6
|
*/
|
|
7
|
-
(async()=>{"use strict";const e="2.7.2",i="object"==typeof mw.storage&&"function"==typeof mw.storage.getObject?mw.storage:{getObject(e){const i=localStorage.getItem(e);if(!1===i)return!1;try{return JSON.parse(i)}catch(e){return null}},setObject(e,i){let t;try{return t=JSON.stringify(i),localStorage.setItem(e,t)}catch(e){return!1}}},t=Object.fromEntries||(e=>{const i={};for(const[t,a]of e)i[t]=a;return i}),a=e=>e.split(".").map((e=>Number(e))),n=(e,...i)=>mw.msg(`wphl-${e}`,...i),s=(...e)=>()=>{const i=$("<p>",{html:n(...e)});return mw.notify(i,{type:"success",autoHideSeconds:"long"}),i},o=a(e).slice(0,2).join("."),l="//fastly.jsdelivr.net",r="npm/codemirror@5.65.3",c="gh/bhsd-harry/codemirror-mediawiki@1.0",d=`npm/wikiplus-highlight@${o}`,{wgPageName:m,wgNamespaceNumber:u,wgPageContentModel:g,wgServerName:h,wgScriptPath:p,wgUserLanguage:w,skin:k}=mw.config.values,f=null!==mw.loader.getState("ext.CodeMirror"),b=i.getObject("InPageEditMwConfig")||{},x=`${h}${p}`,j=b[x]||{},y=j.time<Date.now()-2592e6,v={css:"css","sanitized-css":"css",javascript:"javascript",json:"javascript",wikitext:"mediawiki"},C=f?{lib:"ext.CodeMirror.lib",css:"ext.CodeMirror.lib.mode.css",javascript:"ext.CodeMirror.lib.mode.javascript",lua:`${r}/mode/lua/lua.min.js`,mediawiki:y?"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`},W={searchcursor:`${r}/addon/search/searchcursor.min.js`,search:`${d}/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:`${d}/matchtags.min.js`};let S=i.getObject("Wikiplus-highlight-addons")||["search"],M=i.getObject("Wikiplus-highlight-indent")||"4";const O=document.getElementById("wphl-contextmenu")||mw.loader.addStyleTag("#Wikiplus-CodeMirror .cm-mw-template-name{cursor:pointer}");O.id="wphl-contextmenu",O.disabled=!0;let _,z=i.getObject("Wikiplus-highlight-i18n");z?((e,i)=>{const[t,n]=a(e),[s,o]=a(i);return t<s||t===s&&n<o})(z["wphl-version"],e)&&(_=s("welcome-upgrade",e)):(z={},_=s("welcome"));const T={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"}[w]||"en",L=`${l}/${d}/i18n/${T}.json`,I=z["wphl-version"]===o,B=Promise.all([mw.loader.using("mediawiki.util"),(async()=>{I&&z["wphl-lang"]===T||(z=await $.ajax(`${L}`,{dataType:"json",cache:!0}),i.setObject("Wikiplus-highlight-i18n",z)),mw.messages.set(z)})()]),H=(e,i)=>{if(0!==e.length)return i?mw.loader.using(e):$.ajax(`${l}/${e.length>1?"combine/":""}${e.join()}`,{dataType:"script",cache:!0})};let E;const P=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(`${l}/${c}/mediawiki.min.css`,"text/css"),(f?t:i).push(`${c}/mediawiki.min.js`)),"mediawiki"===e&&"object"==typeof j.config&&j.config.tags.html&&(e="html"),n||((f?i:a).push(C.lib),f||mw.loader.load(`${l}/${r}/lib/codemirror.min.css`,"text/css")),!s.prototype.getSearchCursor&&S.includes("search")&&a.push(W.searchcursor),!s.commands.findForward&&S.includes("search")&&a.push(W.search),!s.optionHandlers.styleActiveLine&&S.includes("activeLine")&&a.push(W.activeLine),!s.optionHandlers.styleSelectedText&&S.includes("search")&&a.push(W.markSelection),!s.optionHandlers.showTrailingSpace&&S.includes("trailingspace")&&a.push(W.trailingspace),!s.optionHandlers.matchBrackets&&S.includes("matchBrackets")&&a.push(W.matchBrackets),!s.optionHandlers.matchTags&&S.includes("matchTags")&&a.push(W.matchTags),["widget","html"].includes(e)?["css","javascript","mediawiki","htmlmixed","xml"].forEach((e=>{s.modes[e]||(i=i.concat(C[e]))})):s.modes[e]||("lua"===e?(f?t:i).push(C.lua):i=i.concat(C[e])),n?await Promise.all([H(i,f),H(t),H(a)]):f?(await H(i,!0),await Promise.all([H(t),H(a)])):(await H(a),await H(i))},N=async(e,a)=>{if(!["mediawiki","widget"].includes(e))return;f&&y&&await a;let n=mw.config.get("extCodeMirrorConfig");if(n||y||!I||(({config:n}=j),mw.config.set("extCodeMirrorConfig",n)),n&&n.redirect&&n.img)return n;if(n)return n;const{query:{magicwords:s,extensiontags:o,functionhooks:l,variables:r}}=await(new mw.Api).get({meta:"siteinfo",siprop:n?"magicwords":"magicwords|extensiontags|functionhooks|variables",formatversion:2}),c=["msg","raw","msgnw","subst","safesubst"],d=e=>e.flatMap((({aliases:e,name:i})=>e.map((e=>({alias:e,name:i}))))),m=e=>t(e.map((({alias:e,name:i})=>[e.replace(/:$/,""),i])));if(n){const{functionSynonyms:[e]}=n;e.subst||d(s.filter((({name:e})=>c.includes(e)))).forEach((({alias:i,name:t})=>{e[i.replace(/:$/,"")]=t}))}else{n={tagModes:{pre:"mw-tag-pre",nowiki:"mw-tag-nowiki",ref:"text/mediawiki"},tags:t(o.map((e=>[e.slice(1,-1),!0]))),urlProtocols:mw.config.get("wgUrlProtocols")};const e=new Set([...l,...r,...c]),i=s.filter((({name:i,aliases:t})=>t.some((e=>/^__.+__$/.test(e)))||e.has(i))),a=d(i.filter((e=>e["case-sensitive"]))),u=d(i.filter((e=>!e["case-sensitive"]))).map((({alias:e,name:i})=>({alias:e.toLowerCase(),name:i})));n.doubleUnderscore=[m(u.filter((({alias:e})=>/^__.+__$/.test(e)))),m(a.filter((({alias:e})=>/^__.+__$/.test(e))))],n.functionSynonyms=[m(u.filter((({alias:e})=>!/^__.+__|^#$/.test(e)))),m(a.filter((({alias:e})=>!/^__.+__|^#$/.test(e))))]}return n.redirect=s.find((({name:e})=>"redirect"===e)).aliases,n.img=m(d(s.filter((({name:e})=>e.startsWith("img_"))))),mw.config.set("extCodeMirrorConfig",n),(e=>{b[x]={config:e,time:Date.now()},i.setObject("InPageEditMwConfig",b)})(n),n},Q=async(e,i)=>{const t=i?"javascript":await(async()=>{if([274,828].includes(u)&&!m.endsWith("/doc")){const e=274===u?"Widget":"Lua";return await mw.loader.using(["oojs-ui-windows","oojs-ui.styles.icons-content"]),await OO.ui.confirm(n("contentmodel"),{actions:[{label:e},{label:"Wikitext",action:"accept"}]})?"mediawiki":e.toLowerCase()}return m.endsWith("/doc")?"mediawiki":v[g]})(),a=P(t),[s]=await Promise.all([N(t,a),a]);"mediawiki"===t&&s.tags.html?(s.tagModes.html="htmlmixed",await P("html")):"widget"!==t||CodeMirror.mimeModes.widget||CodeMirror.defineMIME("widget",{name:"htmlmixed",tags:{noinclude:[[null,null,"mediawiki"]]}});const o=e.height();E&&E.toTextArea();const l=i||"json"===g,{name:r}=$.client.profile();E=CodeMirror.fromTextArea(e[0],$.extend({inputStyle:"safari"===r?"textarea":"contenteditable",lineNumbers:!0,lineWrapping:!0,mode:t,mwConfig:s,json:l,styleActiveLine:S.includes("activeLine"),styleSelectedText:S.includes("search"),showTrailingSpace:S.includes("trailingspace"),matchBrackets:S.includes("matchBrackets")&&("mediawiki"!==t&&!l||{bracketRegex:/[{}[\]]/}),matchTags:S.includes("matchBrackets")&&["mediawiki","widget"].includes(t)},"mediawiki"===t?{}:{indentUnit:S.includes("indentWithSpace")?M:"4",indentWithTabs:!S.includes("indentWithSpace")})),E.setSize(null,o),E.refresh();const c=E.getWrapperElement();if(c.id="Wikiplus-CodeMirror",["mediawiki","widget"].includes(t)&&S.includes("contextmenu")){O.disabled=!1;const{functionSynonyms:[e]}=mw.config.get("extCodeMirrorConfig"),i=i=>Object.keys(e).filter((t=>e[t]===i)).map((e=>e.startsWith("#")?e:`#${e}`)),t=i("invoke"),a=i("widget");await mw.loader.using("mediawiki.Title"),$(c).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(){const e=this.previousSibling.previousSibling.textContent.trim().toLowerCase();return t.includes(e)?open(mw.util.getUrl(`Module:${this.textContent}`),"_blank"):a.includes(e)&&open(mw.util.getUrl(`Widget:${this.textContent}`,{action:"edit"}),"_blank"),!1}))}else O.disabled=!0;if($("#Wikiplus-Quickedit-Jump").children("a").attr("href","#Wikiplus-CodeMirror"),!i){const e=()=>{$("#Wikiplus-Quickedit-Submit").triggerHandler("click")},i=()=>{$("#Wikiplus-Quickedit-MinorEdit").click(),$("#Wikiplus-Quickedit-Submit").triggerHandler("click")};E.addKeyMap($.extend({"Ctrl-S":e,"Cmd-S":e,"Shift-Ctrl-S":i,"Shift-Cmd-S":i},Wikiplus.getSetting("esc_to_exit_quickedit")?{Esc(){$("#Wikiplus-Quickedit-Back").triggerHandler("click")}}:{}))}mw.hook("wiki-codemirror").fire(E)};new MutationObserver((e=>{const i=$(e.flatMap((({addedNodes:e})=>[...e]))).find("#Wikiplus-Quickedit, #Wikiplus-Setting-Input");0!==i.length&&Q(i,"Wikiplus-Setting-Input"===i.attr("id"))})).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}")).id="wphl-style";const{get:U=function(e){return e.value},set:D=function(e,i){e.value=i}}=$.valHooks.textarea||{},A=e=>["Wikiplus-Quickedit","Wikiplus-Setting-Input"].includes(e.id);let V,F,J,q,K;$.valHooks.textarea={get:e=>A(e)&&E?E.getValue():U(e),set(e,i){A(e)&&E?E.setValue(i):D(e,i)}},await B;const R=(e=S)=>{K.toggle(e.includes("indentWithSpace"))},G=$(mw.util.addPortletLink({minerva:"page-actions-overflow",citizen:"p-actions"}[k]||"p-cactions","#",n("portlet"),"wphl-settings")).click((async e=>{if(e.preventDefault(),!V){await mw.loader.using(["oojs-ui-windows","oojs-ui.styles.icons-content"]),V=new OO.ui.MessageDialog({id:"Wikiplus-highlight-dialog"});const e=new OO.ui.WindowManager;e.$element.appendTo(document.body),e.addWindows([V]),F=new OO.ui.CheckboxMultiselectInputWidget({options:[{data:"search",label:n("addon-search")},{data:"activeLine",label:n("addon-active-line")},{data:"trailingspace",label:n("addon-trailingspace")},{data:"matchBrackets",label:n("addon-matchbrackets")},{data:"matchTags",label:n("addon-matchtags")},{data:"contextmenu",label:n("addon-contextmenu")},{data:"indentWithSpace",label:n("addon-indentwithspace")}],value:S}).on("change",R),J=new OO.ui.NumberInputWidget({min:0,value:M}),q=new OO.ui.FieldLayout(F,{label:n("addon-label"),notices:[n("addon-notice")],align:"top"}),K=new OO.ui.FieldLayout(J,{label:n("addon-indent")}),R()}V.open({title:n("addon-title"),message:q.$element.add(K.$element).add($("<p>",{html:n("feedback")})),actions:[{action:"reject",label:mw.msg("ooui-dialog-message-reject")},{action:"accept",label:mw.msg("ooui-dialog-message-accept"),flags:"progressive"}],size:"en"===T?"medium":"small"}).closing.then((e=>{q.$element.detach(),K.$element.detach(),"object"==typeof e&&"accept"===e.action&&(S=F.getValue(),M=J.getValue(),i.setObject("Wikiplus-highlight-addons",S),i.setObject("Wikiplus-highlight-indent",M))}))}));"minerva"===k&&G.find("a").addClass("mw-ui-icon-minerva-settings"),"function"==typeof _&&_().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
|
+
//# sourceMappingURL=main.min.js.map
|
|
@@ -0,0 +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","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
package/i18n/zh-hans.json
CHANGED
package/i18n/zh-hant.json
CHANGED
package/jsconfig.json
ADDED
package/main.js
CHANGED
|
@@ -8,11 +8,11 @@
|
|
|
8
8
|
(async () => {
|
|
9
9
|
'use strict';
|
|
10
10
|
|
|
11
|
-
const version = '2.7.
|
|
11
|
+
const version = '2.7.6';
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* polyfill for mw.storage
|
|
15
|
-
* @type {
|
|
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
|
|
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.
|
|
92
|
+
MW_CDN = 'gh/bhsd-harry/codemirror-mediawiki@1.1.1',
|
|
97
93
|
REPO_CDN = `npm/wikiplus-highlight@${majorVersion}`;
|
|
98
94
|
|
|
99
|
-
|
|
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') || {},
|
|
111
|
+
ALL_SETTINGS_CACHE = storage.getObject('InPageEditMwConfig') || {},
|
|
113
112
|
SITE_ID = `${server}${scriptPath}`,
|
|
114
|
-
SITE_SETTINGS = ALL_SETTINGS_CACHE[SITE_ID] || {},
|
|
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,
|
|
158
|
-
indent = storage.getObject('Wikiplus-highlight-indent') || defaultIndent;
|
|
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')
|
|
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'),
|
|
167
|
-
|
|
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',
|
|
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
|
|
207
|
-
* @returns {
|
|
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
|
-
|
|
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 {
|
|
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 {
|
|
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 {
|
|
371
|
-
* @
|
|
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(
|
|
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 {
|
|
378
|
-
* @returns {Object
|
|
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(
|
|
398
|
-
|
|
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 {
|
|
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
|
-
|
|
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(
|
|
585
|
-
|
|
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
|
-
|
|
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 || {};
|
|
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
|
|
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(
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
"
|
|
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;
|
|
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,
|
|
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
|
-
|
|
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;
|