User:Lopullinen/gadgets/toolsredirect-videogame.js
注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google Chrome、Firefox、Microsoft Edge及Safari:按住⇧ Shift键并单击工具栏的“刷新”按钮。参阅Help:绕过浏览器缓存以获取更多帮助。
mw.loader.using(["ext.gadget.ToolsRedirect"], function () {
"use strict";
mw.toolsRedirect.findRedirectCallback(function (pagename, $content) {
let retTitles = [];
/* ======================== 定义数字转换 ======================== */
// 将各类数字转换为阿拉伯数字的函数
const replaceWithArabicNumeral = function (ret, title, map) {
for (let i = 0; i < map.oldStr.length; i++) {
if (title.match(map.oldStr[i])) {
ret.push(title.replace(map.oldStr[i], map.newStr[i]));
return;
}
}
};
// 罗马数字转换表,支持2至19(注意IX和X的顺序是颠倒的)
const romanNumeralsMap = {
pattern: /^.+[IXV]{1,5}(\s+|$)/i,
oldStr: ["XIX", "XVIII", "XVII", "XVI", "XV", "XIV", "XIII", "XII", "XI", "IX", "X", "VIII", "VII", "VI", "IV", "V", "III", "II"],
newStr: [19, 18, 17, 16, 15, 14, 13, 12, 11, 9, 10, 8, 7, 6, 4, 5, 3, 2]
};
// 汇总转换表(暂只有罗马数字)
const numeralsMapArray = [
romanNumeralsMap
];
/* ======================== 定义标点符号转换 ======================== */
const titleTrimPatternList = [
// 冒号
{
oldStr: /^([^:]+):(.+)$/,
newStr: "$1 $2"
},
// 波浪线、横线(对)
{
oldStr: /^([^--~]+?)\s*(?<punct>[--~])\s*([^--~]+?)\s*\k<punct>\s*(.+)$/,
newStr: "$1 $3 $4"
},
{
oldStr: /^([^--~]+?)\s*(?<punct>[--~])\s*([^--~]+?)\s*\k<punct>?$/,
newStr: "$1 $3"
}
// 还需要定义三层标题
];
/* ======================== 正片开始 ======================== */
$('#content').find("p>b, h1").each(function () {
let title;
/* ====== 上半场,检测完整标题 ====== */
// 提取标题
title = jQuery(this).text();
title = title.replace(/[《》]/g, "").trim(); //清理书名号
retTitles.push(title);
// 提取标题
// 将各类数字替换为亚拉伯数字
for (let k = 0; k < numeralsMapArray.length; k++) {
let map = numeralsMapArray[k];
if (title.match(map.pattern)) {
replaceWithArabicNumeral(retTitles, title, map);
break;
}
}
// 清理副标题标点符号,转换为纯空格分割
for (let k = 0; k < titleTrimPatternList.length; k++) {
if (title.match(titleTrimPatternList[k].oldStr)) {
title = title.replace(titleTrimPatternList[k].oldStr, titleTrimPatternList[k].newStr);
retTitles.push(title);
break;
}
}
/* ====== 下半场,检测主副标题 ====== */
let titleFragments, _title;
// 以空格为标记,将标题分割为若干子串
titleFragments = title.split(/\s+/);
// 如果标题没有空格,可以直接走了
if (titleFragments.length == 1) {
return;
}
// 提取主标题
_title = titleFragments[0];
// 如果主标题含阿拉伯数字,直接创建重定向,结束新增标题
if (_title.match(/^.+\d+/)) {
retTitles.push(_title);
return;
}
// 检测其他格式数字主标题
for (let k = 0; k < numeralsMapArray.length; k++) {
let map = numeralsMapArray[k];
if (_title.match(map.pattern)) {
replaceWithArabicNumeral(retTitles, _title, map);
return;
}
}
});
/* ============ 输出转换结果 ============ */
return jQuery.unique(retTitles);
});
});