跳转到内容

User:Lopullinen/gadgets/toolsredirect-videogame.js

维基百科,自由的百科全书
注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google ChromeFirefoxMicrosoft EdgeSafari:按住⇧ 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);
  });
});