wikiplus-highlight 3.2.4 → 3.2.5
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 +2 -0
- package/dist/main.min.js +1 -1
- package/dist/main.min.js.map +4 -4
- package/package.json +6 -3
package/README.md
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/wikiplus-highlight)
|
|
4
4
|
[](https://github.com/bhsd-harry/Wikiplus-highlight/actions/workflows/codeql.yml)
|
|
5
|
+
[](https://www.npmjs.com/package/wikiplus-highlight)
|
|
6
|
+
[](https://codebeat.co/projects/github-com-bhsd-harry-wikiplus-highlight-main)
|
|
5
7
|
|
|
6
8
|
**Wikiplus-highlight** 是由 Bhsd 编写的一款 [Wikiplus](https://github.com/Wikiplus/Wikiplus) 语法高亮插件,它主要基于 MediaWiki 内置的 [JavaScript 模块](https://www.mediawiki.org/wiki/ResourceLoader/Core_modules)和 [CodeMirror](https://codemirror.net/) 编写。
|
|
7
9
|
|
package/dist/main.min.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";(()=>{var
|
|
1
|
+
"use strict";(()=>{var u="https://testingcf.jsdelivr.net",b;typeof document=="object"&&(b=document.createElement("span"));var w=t=>JSON.parse(String(localStorage.getItem(t)));var{wgPageName:E,wgNamespaceNumber:c,wgPageContentModel:l}=mw.config.get(),y={"sanitized-css":"css",wikitext:"mediawiki"},j={css:"css",js:"javascript",json:"json"},M={828:"lua",274:"html"},x=async t=>{var n;let e;if(typeof _WikiplusPages=="object"?e=_WikiplusPages:typeof Pages=="object"&&(e=Pages),e){let o=Object.values(e).filter(({sectionCache:i})=>Object.values(i).includes(t));o.some(({title:i})=>!i.endsWith("/doc"))&&await mw.loader.using("mediawiki.Title");let r=new Set(o.map(({title:i})=>{var p,g,f;if(i.endsWith("/doc"))return"template";let a=new mw.Title(i),s=a.getNamespaceId();if(s%2)return"mediawiki";let d=(f=j[(g=(p=a.getExtension())==null?void 0:p.toLowerCase())!=null?g:""])!=null?f:M[s];return d?d==="javascript"&&(s===8||s===2300)?"gadget":d:s===10||s===2?"template":"mediawiki"}));if(r.size===1){let[i]=r,a=o.length===1?o[0].title:void 0;return i==="gadget"?["javascript",8]:i==="template"?["mediawiki",10,a]:[i,void 0,a]}else if(r.size===2){if(r.has("javascript")&&r.has("gadget"))return["javascript"];if(r.has("mediawiki")&&r.has("template"))return["mediawiki"]}}return c!==274&&l!=="Scribunto"||E.endsWith("/doc")?[(n=y[l])!=null?n:l,l==="javascript"?c:void 0]:(await mw.loader.using("oojs-ui-windows"),await OO.ui.confirm(mw.msg("cm-mw-contentmodel"),{actions:[{label:c===274?"Widget":"Lua"},{label:"Wikitext",action:"accept"}]})?["mediawiki"]:[c===274?"html":"lua"])},m=()=>(document.getElementById("Wikiplus-Quickedit-Submit").dispatchEvent(new MouseEvent("click")),!0),h=()=>(document.querySelector("#Wikiplus-Quickedit-MinorEdit").checked=!0,m()),k=()=>{let t=w("Wikiplus_Settings"),e=t&&(t.esc_to_exit_quickedit||t.escToExitQuickEdit);return e===!0||e==="true"?(document.getElementById("Wikiplus-Quickedit-Back").dispatchEvent(new MouseEvent("click")),!0):!1},S=async(t,e)=>{var r,i;let n=await CodeMirror6.fromTextArea(t[0],...e?["json"]:await x(t.val()));((i=(r=n.view)==null?void 0:r.dom)!=null?i:n.editor.getDomNode()).id="Wikiplus-CodeMirror",e||(n.editor?(n.editor.addCommand(monaco.KeyMod.CtrlCmd|monaco.KeyCode.KeyS,m),n.editor.addCommand(monaco.KeyMod.CtrlCmd|monaco.KeyMod.Shift|monaco.KeyCode.KeyS,h),n.editor.addCommand(monaco.KeyCode.Escape,k)):n.extraKeys([{key:"Mod-S",run:m},{key:"Shift-Mod-S",run:h},{key:"Esc",run:k}]));let o=document.querySelector("#Wikiplus-Quickedit-Jump > a");o&&(o.href="#Wikiplus-CodeMirror")};(async()=>{let{libs:t}=mw,{wphl:e}=t;if(!(e!=null&&e.version)){let n="3.2.5";t.wphl={version:n,...e};let o=`npm/@bhsd/codemirror-mediawiki@${t.wphl.cmVersion||"latest"}/dist/wiki.min.js`,r="npm/wikiplus-highlight";"CodeMirror6"in globalThis||await $.ajax(`${u}/${o}`,{dataType:"script"}),new MutationObserver(a=>{let s=$(a.flatMap(({addedNodes:d})=>[...d])).find("#Wikiplus-Quickedit, #Wikiplus-Setting-Input");s.length>0&&S(s,s.attr("id")==="Wikiplus-Setting-Input")}).observe(document.body,{childList:!0}),mediaWiki.loader.load(`${u}/${r}@${n}/styles.min.css`,"text/css")}})();})();
|
|
2
2
|
/**
|
|
3
3
|
* @name Wikiplus-highlight Wikiplus编辑器的CodeMirror语法高亮扩展
|
|
4
4
|
* @author Bhsd <https://github.com/bhsd-harry>
|
package/dist/main.min.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../code-standard/dist/index.
|
|
4
|
-
"sourcesContent": ["\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\nvar src_exports = {};\n__export(src_exports, {\n CDN: () => CDN,\n getObject: () => getObject,\n loadScript: () => loadScript,\n normalizeTitle: () => normalizeTitle,\n numToHex: () => numToHex,\n parseVersion: () => parseVersion,\n rawurldecode: () => rawurldecode,\n setObject: () => setObject,\n splitColors: () => splitColors\n});\nmodule.exports = __toCommonJS(src_exports);\nconst CDN = \"https://testingcf.jsdelivr.net\";\nconst hexColor = String.raw`#(?:[\\da-f]{3,4}|(?:[\\da-f]{2}){3,4})(?![\\p{L}\\d_])`, rgbValue = String.raw`(?:\\d*\\.)?\\d+%?`, hue = String.raw`(?:\\d*\\.)?\\d+(?:deg|grad|rad|turn)?`, rgbColor = String.raw`rgba?\\(\\s*(?:${String.raw`${new Array(3).fill(rgbValue).join(String.raw`\\s+`)}(?:\\s*\\/\\s*${rgbValue})?`}|${String.raw`${new Array(3).fill(rgbValue).join(String.raw`\\s*,\\s*`)}(?:\\s*,\\s*${rgbValue})?`})\\s*\\)`, hslColor = String.raw`hsla?\\(\\s*(?:${String.raw`${hue}\\s+${rgbValue}\\s+${rgbValue}(?:\\s*\\/\\s*${rgbValue})?`}|${String.raw`${hue}${String.raw`\\s*,\\s*(?:\\d*\\.)?\\d+%`.repeat(2)}(?:\\s*,\\s*${rgbValue})?`})\\s*\\)`, reFull = new RegExp(String.raw`(^|[^\\p{L}\\d_])(${hexColor}|${rgbColor}|${hslColor})`, \"giu\"), reRGB = new RegExp(String.raw`(^|[^\\p{L}\\d_])(${hexColor}|${rgbColor})`, \"giu\");\nlet span;\nif (typeof document === \"object\") {\n span = document.createElement(\"span\");\n}\nconst rawurldecode = (str) => decodeURIComponent(str.replace(/%(?![\\da-f]{2})/giu, \"%25\"));\nconst normalizeTitle = (title) => {\n const decoded = rawurldecode(title);\n if (/[<>[\\]|{}]/u.test(decoded)) {\n return decoded;\n }\n span.innerHTML = decoded;\n return span.textContent;\n};\nconst numToHex = (d) => Math.round(d * 255).toString(16).padStart(2, \"0\");\nconst splitColors = (str, hsl = true) => {\n const pieces = [], re = hsl ? reFull : reRGB;\n re.lastIndex = 0;\n let mt = re.exec(str), lastIndex = 0;\n while (mt) {\n const index = mt.index + mt[1].length;\n if (index > lastIndex) {\n pieces.push([str.slice(lastIndex, index), lastIndex, index, false]);\n }\n ({ lastIndex } = re);\n pieces.push([mt[2], index, lastIndex, true]);\n mt = re.exec(str);\n }\n if (str.length > lastIndex) {\n pieces.push([str.slice(lastIndex), lastIndex, str.length, false]);\n }\n return pieces;\n};\nconst loadScript = (src, globalConst, amd) => new Promise((resolve) => {\n const path = `${CDN}/${src}`;\n let obj = globalThis;\n for (const prop of globalConst.split(\".\")) {\n obj = obj?.[prop];\n }\n if (obj) {\n resolve();\n } else if (amd && typeof define === \"function\" && \"amd\" in define) {\n const requirejs = globalThis.require;\n requirejs.config({ paths: { [globalConst]: path } });\n requirejs([globalConst], (exports) => {\n Object.assign(globalThis, { [globalConst]: exports });\n resolve();\n });\n } else {\n const script = document.createElement(\"script\");\n script.src = path;\n script.onload = () => {\n resolve();\n };\n document.head.append(script);\n }\n});\nconst getObject = (key) => JSON.parse(String(localStorage.getItem(key)));\nconst setObject = (key, value) => {\n localStorage.setItem(key, JSON.stringify(value));\n};\nconst parseVersion = (v) => v.split(\".\", 3).map(Number);\n", "/**\n * @name Wikiplus-highlight Wikiplus编辑器的CodeMirror语法高亮扩展\n * @author Bhsd <https://github.com/bhsd-harry>\n * @license GPL-3.0\n */\nimport {CDN} from '@bhsd/common';\nimport {renderEditor} from './core';\n\ndeclare namespace mw.libs {\n\tlet wphl: {version?: string, cmVersion?: string} | undefined;\n}\n\n(async () => {\n\tconst {libs} = mw,\n\t\t{wphl} = libs;\n\tif (!wphl?.version) {\n\t\tconst version = '3.2.4';\n\t\tlibs.wphl = {version, ...wphl}; // 开始加载\n\n\t\t// 路径\n\t\tconst MW_CDN = `npm/@bhsd/codemirror-mediawiki@${libs.wphl.cmVersion || 'latest'}/dist/wiki.min.js`,\n\t\t\tREPO_CDN = 'npm/wikiplus-highlight';\n\n\t\tif (!('CodeMirror6' in globalThis)) {\n\t\t\tawait $.ajax(`${CDN}/${MW_CDN}`, {dataType: 'script'});\n\t\t}\n\n\t\t// 监视 Wikiplus 编辑框\n\t\tconst observer = new MutationObserver(records => {\n\t\t\tconst $editArea = $(records.flatMap(({addedNodes}) => [...addedNodes]))\n\t\t\t\t.find<HTMLTextAreaElement>('#Wikiplus-Quickedit, #Wikiplus-Setting-Input');\n\t\t\tif ($editArea.length > 0) {\n\t\t\t\tvoid renderEditor($editArea, $editArea.attr('id') === 'Wikiplus-Setting-Input');\n\t\t\t}\n\t\t});\n\t\tobserver.observe(document.body, {childList: true});\n\n\t\tmediaWiki.loader.load(`${CDN}/${REPO_CDN}@${version}/styles.min.css`, 'text/css');\n\t}\n})();\n", "import {getObject} from '@bhsd/common';\n\nconst {\n\twgPageName: page,\n\twgNamespaceNumber: ns,\n\twgPageContentModel: contentmodel,\n} = mw.config.get();\n\nconst CONTENTMODELS: Record<string, string> = {\n\t\t'sanitized-css': 'css',\n\t\twikitext: 'mediawiki',\n\t},\n\tEXTS: Record<string, string> = {\n\t\tcss: 'css',\n\t\tjs: 'javascript',\n\t\tjson: 'json',\n\t},\n\tNAMESPACES: Record<number, string> = {\n\t\t828: 'lua',\n\t\t274: 'html',\n\t};\n\n/**\n * 检查页面语言类型\n * @param value 页面内容\n */\nconst getPageMode = async (value: string): Promise<[string, (number | undefined)?, (string | undefined)?]> => {\n\tlet WikiplusPages;\n\tif (typeof _WikiplusPages === 'object') {\n\t\tWikiplusPages = _WikiplusPages;\n\t} else if (typeof Pages === 'object') {\n\t\tWikiplusPages = Pages;\n\t}\n\tif (WikiplusPages) {\n\t\tconst pages = Object.values(WikiplusPages)\n\t\t\t.filter(({sectionCache}) => Object.values(sectionCache).includes(value));\n\t\tif (pages.some(({title}) => !title.endsWith('/doc'))) {\n\t\t\tawait mw.loader.using('mediawiki.Title');\n\t\t}\n\t\tconst modes = new Set(pages.map(({title}) => {\n\t\t\tif (title.endsWith('/doc')) {\n\t\t\t\treturn 'template';\n\t\t\t}\n\t\t\tconst t = new mw.Title(title),\n\t\t\t\tnamespace = t.getNamespaceId();\n\t\t\tif (namespace % 2) {\n\t\t\t\treturn 'mediawiki';\n\t\t\t}\n\t\t\tconst mode = EXTS[t.getExtension()?.toLowerCase() ?? ''] ?? NAMESPACES[namespace];\n\t\t\tif (mode) {\n\t\t\t\treturn mode === 'javascript' && (namespace === 8 || namespace === 2300) ? 'gadget' : mode;\n\t\t\t}\n\t\t\treturn namespace === 10 || namespace === 2 ? 'template' : 'mediawiki';\n\t\t}));\n\t\tif (modes.size === 1) {\n\t\t\tconst [mode] = modes,\n\t\t\t\ttitle = pages.length === 1 ? pages[0]!.title : undefined;\n\t\t\tif (mode === 'gadget') {\n\t\t\t\treturn ['javascript', 8];\n\t\t\t}\n\t\t\treturn mode === 'template' ? ['mediawiki', 10, title] : [mode!, undefined, title];\n\t\t} else if (modes.size === 2) {\n\t\t\tif (modes.has('javascript') && modes.has('gadget')) {\n\t\t\t\treturn ['javascript'];\n\t\t\t} else if (modes.has('mediawiki') && modes.has('template')) {\n\t\t\t\treturn ['mediawiki'];\n\t\t\t}\n\t\t}\n\t}\n\tif (ns !== 274 && contentmodel !== 'Scribunto' || page.endsWith('/doc')) {\n\t\treturn [CONTENTMODELS[contentmodel] ?? contentmodel, contentmodel === 'javascript' ? ns : undefined];\n\t}\n\tawait mw.loader.using('oojs-ui-windows');\n\tif (\n\t\tawait OO.ui.confirm(mw.msg('cm-mw-contentmodel'), {\n\t\t\tactions: [{label: ns === 274 ? 'Widget' : 'Lua'}, {label: 'Wikitext', action: 'accept'}],\n\t\t})\n\t) {\n\t\treturn ['mediawiki'];\n\t}\n\treturn [ns === 274 ? 'html' : 'lua'];\n};\n\nconst submit = /** 提交编辑 */ (): true => {\n\t\tdocument.getElementById('Wikiplus-Quickedit-Submit')!.dispatchEvent(new MouseEvent('click'));\n\t\treturn true;\n\t},\n\tsubmitMinor = /** 提交小编辑 */ (): true => {\n\t\tdocument.querySelector<HTMLInputElement>('#Wikiplus-Quickedit-MinorEdit')!.checked = true;\n\t\treturn submit();\n\t},\n\tescapeEdit = /** 按下Esc键退出编辑 */ (): boolean => {\n\t\tconst settings: Record<string, unknown> | null = getObject('Wikiplus_Settings'),\n\t\t\tescToExitQuickEdit = settings && (settings['esc_to_exit_quickedit'] || settings['escToExitQuickEdit']);\n\t\tif (escToExitQuickEdit === true || escToExitQuickEdit === 'true') {\n\t\t\tdocument.getElementById('Wikiplus-Quickedit-Back')!.dispatchEvent(new MouseEvent('click'));\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t};\n\n/**\n * 渲染编辑器\n * @param $target 目标编辑框\n * @param setting 是否是Wikiplus设置(使用json语法)\n */\nexport const renderEditor = async ($target: JQuery<HTMLTextAreaElement>, setting: boolean): Promise<void> => {\n\tconst cm = await CodeMirror6.fromTextArea(\n\t\t$target[0]!,\n\t\t...setting ? ['json'] as [string] : await getPageMode($target.val()!),\n\t);\n\t(cm.view?.dom ?? cm.editor!.getDomNode()!).id = 'Wikiplus-CodeMirror';\n\n\tif (!setting) { // 普通Wikiplus编辑区\n\t\tif (cm.editor) {\n\t\t\t/* eslint-disable no-bitwise */\n\t\t\tcm.editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyS, submit);\n\t\t\tcm.editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyMod.Shift | monaco.KeyCode.KeyS, submitMinor);\n\t\t\t/* eslint-enable no-bitwise */\n\t\t\tcm.editor.addCommand(monaco.KeyCode.Escape, escapeEdit);\n\t\t} else {\n\t\t\tcm.extraKeys([\n\t\t\t\t{key: 'Mod-S', run: submit},\n\t\t\t\t{key: 'Shift-Mod-S', run: submitMinor},\n\t\t\t\t{key: 'Esc', run: escapeEdit},\n\t\t\t]);\n\t\t}\n\t}\n\n\t/** @todo 以下过渡代码添加于2024-02-07,将于一段时间后弃用 */\n\tconst oldKey = 'Wikiplus-highlight-addons',\n\t\toldPrefs: string[] | null = getObject(oldKey),\n\t\tmapping: Record<string, string> = {\n\t\t\tactiveLine: 'highlightActiveLine',\n\t\t\ttrailingspace: 'highlightTrailingWhitespace',\n\t\t\tmatchBrackets: 'bracketMatching',\n\t\t\tcloseBrackets: 'closeBrackets',\n\t\t\tmatchTags: 'tagMatching',\n\t\t\tfold: 'codeFolding',\n\t\t\twikiEditor: 'wikiEditor',\n\t\t\tescape: 'escape',\n\t\t\tcontextmenu: 'openLinks',\n\t\t\tlint: 'lint',\n\t\t};\n\tlocalStorage.removeItem(oldKey);\n\tif (oldPrefs) {\n\t\tcm.prefer(Object.fromEntries(oldPrefs.filter(k => k in mapping).map(k => [mapping[k]!, true])));\n\t}\n\n\tconst jump = document.querySelector<HTMLAnchorElement>('#Wikiplus-Quickedit-Jump > a');\n\tif (jump) {\n\t\tjump.href = '#Wikiplus-CodeMirror';\n\t}\n};\n"],
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["
|
|
3
|
+
"sources": ["../../code-standard/dist/index.mjs", "../src/core.ts", "../src/main.ts"],
|
|
4
|
+
"sourcesContent": ["const CDN = \"https://testingcf.jsdelivr.net\";\nlet span;\nif (typeof document === \"object\") {\n span = document.createElement(\"span\");\n}\nconst rawurldecode = (str) => decodeURIComponent(str.replace(/%(?![\\da-f]{2})/giu, \"%25\"));\nconst normalizeTitle = (title) => {\n const decoded = rawurldecode(title);\n if (/[<>[\\]|{}]/u.test(decoded)) {\n return decoded;\n }\n span.innerHTML = decoded;\n return span.textContent;\n};\nconst numToHex = (d) => Math.round(d * 255).toString(16).padStart(2, \"0\");\nconst splitColors = (str, hsl = true) => {\n const hexColor = String.raw`#(?:[\\da-f]{3,4}|(?:[\\da-f]{2}){3,4})(?![\\p{L}\\d_])`, rgbValue = String.raw`(?:\\d*\\.)?\\d+%?`, hue = String.raw`(?:\\d*\\.)?\\d+(?:deg|grad|rad|turn)?`, rgbColor = String.raw`rgba?\\(\\s*(?:${String.raw`${new Array(3).fill(rgbValue).join(String.raw`\\s+`)}(?:\\s*\\/\\s*${rgbValue})?`}|${String.raw`${new Array(3).fill(rgbValue).join(String.raw`\\s*,\\s*`)}(?:\\s*,\\s*${rgbValue})?`})\\s*\\)`, hslColor = String.raw`hsla?\\(\\s*(?:${String.raw`${hue}\\s+${rgbValue}\\s+${rgbValue}(?:\\s*\\/\\s*${rgbValue})?`}|${String.raw`${hue}${String.raw`\\s*,\\s*(?:\\d*\\.)?\\d+%`.repeat(2)}(?:\\s*,\\s*${rgbValue})?`})\\s*\\)`, reFull = new RegExp(String.raw`(^|[^\\p{L}\\d_])(${hexColor}|${rgbColor}|${hslColor})`, \"giu\"), reRGB = new RegExp(String.raw`(^|[^\\p{L}\\d_])(${hexColor}|${rgbColor})`, \"giu\"), pieces = [], re = hsl ? reFull : reRGB;\n re.lastIndex = 0;\n let mt = re.exec(str), lastIndex = 0;\n while (mt) {\n const index = mt.index + mt[1].length;\n if (index > lastIndex) {\n pieces.push([str.slice(lastIndex, index), lastIndex, index, false]);\n }\n ({ lastIndex } = re);\n pieces.push([mt[2], index, lastIndex, true]);\n mt = re.exec(str);\n }\n if (str.length > lastIndex) {\n pieces.push([str.slice(lastIndex), lastIndex, str.length, false]);\n }\n return pieces;\n};\nconst loadScript = (src, globalConst, amd) => new Promise((resolve) => {\n const path = `${CDN}/${src}`;\n let obj = globalThis;\n for (const prop of globalConst.split(\".\")) {\n obj = obj?.[prop];\n }\n if (obj) {\n resolve();\n } else if (amd && typeof define === \"function\" && \"amd\" in define) {\n const requirejs = globalThis.require;\n requirejs.config({ paths: { [globalConst]: path } });\n requirejs([globalConst], (exports) => {\n Object.assign(globalThis, { [globalConst]: exports });\n resolve();\n });\n } else {\n const script = document.createElement(\"script\");\n script.src = path;\n script.onload = () => {\n resolve();\n };\n document.head.append(script);\n }\n});\nconst getObject = (key) => JSON.parse(String(localStorage.getItem(key)));\nconst setObject = (key, value) => {\n localStorage.setItem(key, JSON.stringify(value));\n};\nconst parseVersion = (version) => version.split(\".\", 3).map(Number);\nconst compareVersion = (version, baseVersion) => {\n const [major, minor] = parseVersion(version), [baseMajor, baseMinor] = parseVersion(baseVersion);\n return major > baseMajor || major === baseMajor && minor >= baseMinor;\n};\nexport {\n CDN,\n compareVersion,\n getObject,\n loadScript,\n normalizeTitle,\n numToHex,\n rawurldecode,\n setObject,\n splitColors\n};\n", "import {getObject} from '@bhsd/common';\n\nconst {\n\twgPageName: page,\n\twgNamespaceNumber: ns,\n\twgPageContentModel: contentmodel,\n} = mw.config.get();\n\nconst CONTENTMODELS: Record<string, string> = {\n\t\t'sanitized-css': 'css',\n\t\twikitext: 'mediawiki',\n\t},\n\tEXTS: Record<string, string> = {\n\t\tcss: 'css',\n\t\tjs: 'javascript',\n\t\tjson: 'json',\n\t},\n\tNAMESPACES: Record<number, string> = {\n\t\t828: 'lua',\n\t\t274: 'html',\n\t};\n\n/**\n * 检查页面语言类型\n * @param value 页面内容\n */\nconst getPageMode = async (value: string): Promise<[string, (number | undefined)?, (string | undefined)?]> => {\n\tlet WikiplusPages;\n\tif (typeof _WikiplusPages === 'object') {\n\t\tWikiplusPages = _WikiplusPages;\n\t} else if (typeof Pages === 'object') {\n\t\tWikiplusPages = Pages;\n\t}\n\tif (WikiplusPages) {\n\t\tconst pages = Object.values(WikiplusPages)\n\t\t\t.filter(({sectionCache}) => Object.values(sectionCache).includes(value));\n\t\tif (pages.some(({title}) => !title.endsWith('/doc'))) {\n\t\t\tawait mw.loader.using('mediawiki.Title');\n\t\t}\n\t\tconst modes = new Set(pages.map(({title}) => {\n\t\t\tif (title.endsWith('/doc')) {\n\t\t\t\treturn 'template';\n\t\t\t}\n\t\t\tconst t = new mw.Title(title),\n\t\t\t\tnamespace = t.getNamespaceId();\n\t\t\tif (namespace % 2) {\n\t\t\t\treturn 'mediawiki';\n\t\t\t}\n\t\t\tconst mode = EXTS[t.getExtension()?.toLowerCase() ?? ''] ?? NAMESPACES[namespace];\n\t\t\tif (mode) {\n\t\t\t\treturn mode === 'javascript' && (namespace === 8 || namespace === 2300) ? 'gadget' : mode;\n\t\t\t}\n\t\t\treturn namespace === 10 || namespace === 2 ? 'template' : 'mediawiki';\n\t\t}));\n\t\tif (modes.size === 1) {\n\t\t\tconst [mode] = modes,\n\t\t\t\ttitle = pages.length === 1 ? pages[0]!.title : undefined;\n\t\t\tif (mode === 'gadget') {\n\t\t\t\treturn ['javascript', 8];\n\t\t\t}\n\t\t\treturn mode === 'template' ? ['mediawiki', 10, title] : [mode!, undefined, title];\n\t\t} else if (modes.size === 2) {\n\t\t\tif (modes.has('javascript') && modes.has('gadget')) {\n\t\t\t\treturn ['javascript'];\n\t\t\t} else if (modes.has('mediawiki') && modes.has('template')) {\n\t\t\t\treturn ['mediawiki'];\n\t\t\t}\n\t\t}\n\t}\n\tif (ns !== 274 && contentmodel !== 'Scribunto' || page.endsWith('/doc')) {\n\t\treturn [CONTENTMODELS[contentmodel] ?? contentmodel, contentmodel === 'javascript' ? ns : undefined];\n\t}\n\tawait mw.loader.using('oojs-ui-windows');\n\tif (\n\t\tawait OO.ui.confirm(mw.msg('cm-mw-contentmodel'), {\n\t\t\tactions: [{label: ns === 274 ? 'Widget' : 'Lua'}, {label: 'Wikitext', action: 'accept'}],\n\t\t})\n\t) {\n\t\treturn ['mediawiki'];\n\t}\n\treturn [ns === 274 ? 'html' : 'lua'];\n};\n\nconst submit = /** 提交编辑 */ (): true => {\n\t\tdocument.getElementById('Wikiplus-Quickedit-Submit')!.dispatchEvent(new MouseEvent('click'));\n\t\treturn true;\n\t},\n\tsubmitMinor = /** 提交小编辑 */ (): true => {\n\t\tdocument.querySelector<HTMLInputElement>('#Wikiplus-Quickedit-MinorEdit')!.checked = true;\n\t\treturn submit();\n\t},\n\tescapeEdit = /** 按下Esc键退出编辑 */ (): boolean => {\n\t\tconst settings: Record<string, unknown> | null = getObject('Wikiplus_Settings'),\n\t\t\tescToExitQuickEdit = settings && (settings['esc_to_exit_quickedit'] || settings['escToExitQuickEdit']);\n\t\tif (escToExitQuickEdit === true || escToExitQuickEdit === 'true') {\n\t\t\tdocument.getElementById('Wikiplus-Quickedit-Back')!.dispatchEvent(new MouseEvent('click'));\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t};\n\n/**\n * 渲染编辑器\n * @param $target 目标编辑框\n * @param setting 是否是Wikiplus设置(使用json语法)\n */\nexport const renderEditor = async ($target: JQuery<HTMLTextAreaElement>, setting: boolean): Promise<void> => {\n\tconst cm = await CodeMirror6.fromTextArea(\n\t\t$target[0]!,\n\t\t...setting ? ['json'] satisfies [string] : await getPageMode($target.val()!),\n\t);\n\t(cm.view?.dom ?? cm.editor!.getDomNode()!).id = 'Wikiplus-CodeMirror';\n\n\tif (!setting) { // 普通Wikiplus编辑区\n\t\tif (cm.editor) {\n\t\t\t/* eslint-disable no-bitwise */\n\t\t\tcm.editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyS, submit);\n\t\t\tcm.editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyMod.Shift | monaco.KeyCode.KeyS, submitMinor);\n\t\t\t/* eslint-enable no-bitwise */\n\t\t\tcm.editor.addCommand(monaco.KeyCode.Escape, escapeEdit);\n\t\t} else {\n\t\t\tcm.extraKeys([\n\t\t\t\t{key: 'Mod-S', run: submit},\n\t\t\t\t{key: 'Shift-Mod-S', run: submitMinor},\n\t\t\t\t{key: 'Esc', run: escapeEdit},\n\t\t\t]);\n\t\t}\n\t}\n\n\tconst jump = document.querySelector<HTMLAnchorElement>('#Wikiplus-Quickedit-Jump > a');\n\tif (jump) {\n\t\tjump.href = '#Wikiplus-CodeMirror';\n\t}\n};\n", "/**\n * @name Wikiplus-highlight Wikiplus编辑器的CodeMirror语法高亮扩展\n * @author Bhsd <https://github.com/bhsd-harry>\n * @license GPL-3.0\n */\nimport {CDN} from '@bhsd/common';\nimport {renderEditor} from './core';\n\ndeclare namespace mw.libs {\n\tlet wphl: {version?: string, cmVersion?: string} | undefined;\n}\n\n(async () => {\n\tconst {libs} = mw,\n\t\t{wphl} = libs;\n\tif (!wphl?.version) {\n\t\tconst version = '3.2.5';\n\t\tlibs.wphl = {version, ...wphl}; // 开始加载\n\n\t\t// 路径\n\t\tconst MW_CDN = `npm/@bhsd/codemirror-mediawiki@${libs.wphl.cmVersion || 'latest'}/dist/wiki.min.js`,\n\t\t\tREPO_CDN = 'npm/wikiplus-highlight';\n\n\t\tif (!('CodeMirror6' in globalThis)) {\n\t\t\tawait $.ajax(`${CDN}/${MW_CDN}`, {dataType: 'script'});\n\t\t}\n\n\t\t// 监视 Wikiplus 编辑框\n\t\tconst observer = new MutationObserver(records => {\n\t\t\tconst $editArea = $(records.flatMap(({addedNodes}) => [...addedNodes]))\n\t\t\t\t.find<HTMLTextAreaElement>('#Wikiplus-Quickedit, #Wikiplus-Setting-Input');\n\t\t\tif ($editArea.length > 0) {\n\t\t\t\tvoid renderEditor($editArea, $editArea.attr('id') === 'Wikiplus-Setting-Input');\n\t\t\t}\n\t\t});\n\t\tobserver.observe(document.body, {childList: true});\n\n\t\tmediaWiki.loader.load(`${CDN}/${REPO_CDN}@${version}/styles.min.css`, 'text/css');\n\t}\n})();\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["CDN", "span", "getObject", "key", "page", "ns", "contentmodel", "CONTENTMODELS", "EXTS", "NAMESPACES", "getPageMode", "value", "_a", "WikiplusPages", "pages", "sectionCache", "title", "modes", "_b", "_c", "t", "namespace", "mode", "submit", "submitMinor", "escapeEdit", "settings", "getObject", "escToExitQuickEdit", "renderEditor", "$target", "setting", "cm", "jump", "libs", "wphl", "version", "MW_CDN", "REPO_CDN", "CDN", "records", "$editArea", "addedNodes", "renderEditor"]
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "wikiplus-highlight",
|
|
3
|
-
"version": "3.2.
|
|
3
|
+
"version": "3.2.5",
|
|
4
4
|
"description": "A plugin for the MediaWiki front-end add-on \"Wikiplus\"",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"mediawiki",
|
|
@@ -23,17 +23,19 @@
|
|
|
23
23
|
"url": "git+https://github.com/bhsd-harry/Wikiplus-highlight.git"
|
|
24
24
|
},
|
|
25
25
|
"scripts": {
|
|
26
|
+
"prepublishOnly": "npm run build",
|
|
26
27
|
"lint:ts": "tsc --noEmit && eslint --cache .",
|
|
27
28
|
"lint:css": "stylelint *.css",
|
|
28
29
|
"lint": "npm run lint:ts && npm run lint:css",
|
|
29
30
|
"build": "esbuild ./src/main.ts --charset=utf8 --bundle --minify --target=es2019 --format=iife --sourcemap --outfile=dist/main.min.js && eslint --no-eslintrc -c .eslintrc.dist.cjs dist/*.js"
|
|
30
31
|
},
|
|
31
32
|
"devDependencies": {
|
|
32
|
-
"@bhsd/codemirror-mediawiki": "^2.
|
|
33
|
-
"@bhsd/common": "^0.
|
|
33
|
+
"@bhsd/codemirror-mediawiki": "^2.20.1",
|
|
34
|
+
"@bhsd/common": "^0.6.0",
|
|
34
35
|
"@stylistic/eslint-plugin": "^2.11.0",
|
|
35
36
|
"@stylistic/stylelint-plugin": "^3.1.1",
|
|
36
37
|
"@types/jquery": "^3.5.32",
|
|
38
|
+
"@types/mocha": "^10.0.10",
|
|
37
39
|
"@types/oojs-ui": "^0.49.0",
|
|
38
40
|
"@typescript-eslint/eslint-plugin": "^8.16.0",
|
|
39
41
|
"@typescript-eslint/parser": "^8.16.0",
|
|
@@ -49,6 +51,7 @@
|
|
|
49
51
|
"eslint-plugin-regexp": "^2.6.0",
|
|
50
52
|
"eslint-plugin-unicorn": "^56.0.1",
|
|
51
53
|
"http-server": "^14.1.0",
|
|
54
|
+
"mocha": "^10.8.2",
|
|
52
55
|
"monaco-editor": "^0.52.0",
|
|
53
56
|
"stylelint": "^16.11.0",
|
|
54
57
|
"stylelint-config-recommended": "^14.0.0",
|