diff --git a/.gitattributes b/.gitattributes index 47e7deac..54ed91ec 100644 --- a/.gitattributes +++ b/.gitattributes @@ -16,3 +16,31 @@ src/gadgets/libip/MediaWiki:Gadget-libip.js linguist-generated=true # From prefetch src/gadgets/libJSON5/MediaWiki:Gadget-libJSON5.js linguist-generated=true src/gadgets/localforage/MediaWiki:Gadget-localforage.js linguist-generated=true +src/gadgets/prism-language-clike/MediaWiki:Gadget-prism-language-clike.js linguist-generated=true +src/gadgets/prism-core/MediaWiki:Gadget-prism-core.js linguist-generated=true +src/gadgets/prism-core/MediaWiki:Gadget-prism-coy.css linguist-generated=true +src/gadgets/prism-core/MediaWiki:Gadget-prism-line-numbers.js linguist-generated=true +src/gadgets/prism-core/MediaWiki:Gadget-prism-line-numbers.css linguist-generated=true +src/gadgets/prism-core/MediaWiki:Gadget-prism-inline-color.js linguist-generated=true +src/gadgets/prism-core/MediaWiki:Gadget-prism-inline-color.css linguist-generated=true +src/gadgets/prism-language-css/MediaWiki:Gadget-prism-language-css.js linguist-generated=true +src/gadgets/prism-language-css/MediaWiki:Gadget-prism-language-css-extras.js linguist-generated=true +src/gadgets/prism-language-javascript/MediaWiki:Gadget-prism-language-javascript.js linguist-generated=true +src/gadgets/prism-language-javascript/MediaWiki:Gadget-prism-language-javascript-extras.js linguist-generated=true +src/gadgets/prism-language-json/MediaWiki:Gadget-prism-language-json.js linguist-generated=true +src/gadgets/prism-language-json/MediaWiki:Gadget-prism-language-json5.js linguist-generated=true +src/gadgets/prism-language-latex/MediaWiki:Gadget-prism-language-latex.js linguist-generated=true +src/gadgets/prism-language-lua/MediaWiki:Gadget-prism-language-lua.js linguist-generated=true +src/gadgets/prism-language-markup/MediaWiki:Gadget-prism-language-markup.js linguist-generated=true +src/gadgets/prism-language-php/MediaWiki:Gadget-prism-language-php.js linguist-generated=true +src/gadgets/prism-language-php/MediaWiki:Gadget-prism-language-php-extras.js linguist-generated=true +src/gadgets/prism-language-regex/MediaWiki:Gadget-prism-language-regex.js linguist-generated=true +src/gadgets/prism-language-typescript/MediaWiki:Gadget-prism-language-typescript.js linguist-generated=true +src/gadgets/prism-language-yaml/MediaWiki:Gadget-prism-language-yaml.js linguist-generated=true +src/gadgets/prism-plugin-javadoclike/MediaWiki:Gadget-prism-plugin-javadoclike.js linguist-generated=true +src/gadgets/prism-plugin-jsdoc/MediaWiki:Gadget-prism-plugin-jsdoc.js linguist-generated=true +src/gadgets/prism-plugin-match-braces/MediaWiki:Gadget-prism-plugin-match-braces.js linguist-generated=true +src/gadgets/prism-plugin-match-braces/MediaWiki:Gadget-prism-plugin-match-braces.css linguist-generated=true +src/gadgets/prism-plugin-phpdoc/MediaWiki:Gadget-prism-plugin-phpdoc.js linguist-generated=true +src/gadgets/prism-plugin-previewers/MediaWiki:Gadget-prism-plugin-previewers.js linguist-generated=true +src/gadgets/prism-plugin-previewers/MediaWiki:Gadget-prism-plugin-previewers.css linguist-generated=true diff --git a/.stylelintrc.yaml b/.stylelintrc.yaml index b61693e8..a4845ad0 100644 --- a/.stylelintrc.yaml +++ b/.stylelintrc.yaml @@ -8,6 +8,11 @@ reportNeedlessDisables: true ignoreFiles: - dist/**/*.css + - src/gadgets/prism-core/MediaWiki:Gadget-prism-coy.css + - src/gadgets/prism-core/MediaWiki:Gadget-prism-line-numbers.css + - src/gadgets/prism-core/MediaWiki:Gadget-prism-inline-color.css + - src/gadgets/prism-plugin-match-braces/MediaWiki:Gadget-prism-plugin-match-braces.css + - src/gadgets/prism-plugin-previewers/MediaWiki:Gadget-prism-plugin-previewers.css rules: selector-id-pattern: null diff --git a/.vscode/json-schemas/user-rights-definition.json b/.vscode/json-schemas/user-rights-definition.json index 473d86bb..8247e6f8 100644 --- a/.vscode/json-schemas/user-rights-definition.json +++ b/.vscode/json-schemas/user-rights-definition.json @@ -6,12 +6,14 @@ "additionalProperties": false, "definitions": { "fabricatedUserRights": { + "$comment": "虚拟权限,hidden 用于隐藏小工具,disabled 用于禁用小工具", "enum": [ "hidden", "disabled" ] }, "userRights": { + "$comment": "自动从萌娘百科获取的权限列表", "enum": [ "abusefilter-hidden-log", "abusefilter-hide-log", diff --git a/.vscode/settings.json b/.vscode/settings.json index 6ae25d43..c66570eb 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -96,6 +96,25 @@ "Gadget/noticeActivity", "Gadget/patrolCount", "Gadget/patrolPlus", + "Gadget/prism", + "Gadget/prism-core", + "Gadget/prism-language-clike", + "Gadget/prism-language-css", + "Gadget/prism-language-javascript", + "Gadget/prism-language-json", + "Gadget/prism-language-latex", + "Gadget/prism-language-lua", + "Gadget/prism-language-markup", + "Gadget/prism-language-php", + "Gadget/prism-language-regex", + "Gadget/prism-language-typescript", + "Gadget/prism-language-wiki", + "Gadget/prism-language-yaml", + "Gadget/prism-plugin-javadoclike", + "Gadget/prism-plugin-jsdoc", + "Gadget/prism-plugin-match-braces", + "Gadget/prism-plugin-phpdoc", + "Gadget/prism-plugin-previewers", "Gadget/Purgecache", "Gadget/queryContributions", "Gadget/queryWhatlinkshere", diff --git a/eslint.config.js b/eslint.config.js index ca13bfd0..84eeaf11 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -85,6 +85,7 @@ const config = [ ace: false, libCachedCode: false, CodeMirror: false, + Prism: false, }, }, }, diff --git a/package-lock.json b/package-lock.json index 153aded4..226d97d5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,6 +22,7 @@ "@types/jquery": "^3.5.29", "@types/moment": "^2.13.0", "@types/oojs-ui": "^0.49.0", + "@types/prismjs": "^1.26.3", "autoprefixer": "^10.4.19", "browser-pack-flat": "^3.5.0", "browserify": "^17.0.0", @@ -2160,6 +2161,11 @@ "@types/oojs": "*" } }, + "node_modules/@types/prismjs": { + "version": "1.26.3", + "resolved": "https://mirrors.cloud.tencent.com/npm/@types/prismjs/-/prismjs-1.26.3.tgz", + "integrity": "sha512-A0D0aTXvjlqJ5ZILMz3rNfDBOx9hHxLZYv2by47Sm/pqW35zzjusrZTryatjN/Rf8Us2gZrJD+KeHbUSTux1Cw==" + }, "node_modules/@types/semver": { "version": "7.5.8", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", diff --git a/package.json b/package.json index c3395fc9..e4606d19 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "@types/jquery": "^3.5.29", "@types/moment": "^2.13.0", "@types/oojs-ui": "^0.49.0", + "@types/prismjs": "^1.26.3", "autoprefixer": "^10.4.19", "browser-pack-flat": "^3.5.0", "browserify": "^17.0.0", diff --git a/scripts/prefetch/index.js b/scripts/prefetch/index.js index 6e478b99..6e545e7e 100644 --- a/scripts/prefetch/index.js +++ b/scripts/prefetch/index.js @@ -14,7 +14,16 @@ const labels = ["ci:prefetch"]; const prefetchTargetsPath = "scripts/prefetch/targets.yaml"; /** - * @type {({ type: "npm", moduleName: string, gadget: { name: string, fileName: string }, distFilePath: string, version?: string, appendCode?: string, ignoreSemverDiff?: semver.ReleaseType[] } | { type: "custom", gadget: { name: string, fileName: string }, url: string })[]} + * @typedef { { gadget: { name: string, fileName: string }, appendCode?: string, removeCode?: string[] } } prefetchTargetBase + */ +/** + * @typedef { prefetchTargetBase & { type: "npm", moduleName: string, distFilePath: string, version?: string, ignoreSemverDiff?: semver.ReleaseType[] } } prefetchTargetFromNPM + */ +/** + * @typedef { prefetchTargetBase & { type: "custom", url: string } } prefetchTargetFromCustom + */ +/** + * @type {(prefetchTargetFromNPM | prefetchTargetFromCustom)[]} */ const prefetchTargets = await yamlModule.readFile(prefetchTargetsPath); startGroup("prefetchTargets:"); @@ -23,7 +32,7 @@ endGroup(); const fileList = []; for (const prefetchTarget of prefetchTargets) { console.info("target:", prefetchTarget); - const { type, moduleName, gadget: { name, fileName }, distFilePath, version, appendCode, ignoreSemverDiff, url } = prefetchTarget; + const { type, moduleName, gadget: { name, fileName }, distFilePath, version, appendCode, removeCode = [], ignoreSemverDiff, url } = prefetchTarget; const file = path.join("src/gadgets", name, fileName); fileList.push(file); console.info(`[${name}]`, "Start to fetch..."); @@ -33,6 +42,7 @@ for (const prefetchTarget of prefetchTargets) { const filePath = path.posix.join("npm", packageName, distFilePath); const url = new URL(filePath, "https://cdn.jsdelivr.net/"); console.info(`[${name}]`, `url: ${url}`); + prefetchTarget.jsdelivrUrl = url; const response = await fetch(url, { method: "GET", }); @@ -46,6 +56,9 @@ for (const prefetchTarget of prefetchTargets) { return await response.text(); } })(); + if (data.startsWith("Couldn't find the requested file")) { + throw new Error(`[${name}] Couldn't find the requested file.`); + } console.info(`[${name}]`, "Successfully fetched."); const code = [ "/**", @@ -55,7 +68,7 @@ for (const prefetchTarget of prefetchTargets) { for (const [k, v] of Object.entries(prefetchTarget)) { code.push(` * ${k}: ${JSON.stringify(v, null, 1).replace(/\n */g, " ")}`); } - code.push(" */", data.replace(/(?<=\n)\/\/\/ * p.replaceAll(c, ""), data.replace(/(?<=\n)\/\/\/ * + +var _self = (typeof window !== 'undefined') + ? window // if in browser + : ( + (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope) + ? self // if in worker + : {} // if in node js + ); + +/** + * Prism: Lightweight, robust, elegant syntax highlighting + * + * @license MIT + * @author Lea Verou + * @namespace + * @public + */ +var Prism = (function (_self) { + + // Private helper vars + var lang = /(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i; + var uniqueId = 0; + + // The grammar object for plaintext + var plainTextGrammar = {}; + + + var _ = { + /** + * By default, Prism will attempt to highlight all code elements (by calling {@link Prism.highlightAll}) on the + * current page after the page finished loading. This might be a problem if e.g. you wanted to asynchronously load + * additional languages or plugins yourself. + * + * By setting this value to `true`, Prism will not automatically highlight all code elements on the page. + * + * You obviously have to change this value before the automatic highlighting started. To do this, you can add an + * empty Prism object into the global scope before loading the Prism script like this: + * + * ```js + * window.Prism = window.Prism || {}; + * Prism.manual = true; + * // add a new