2023年政策修订增补工作正在进行中,欢迎参与!
  • Moegirl.ICU:萌娘百科流亡社群 581077156(QQ),欢迎对萌娘百科运营感到失望的编辑者加入
  • Moegirl.ICU:账号认领正在试运行,有意者请参照账号认领流程

User:8f23/maintain-railway-stations.js

萌娘百科,万物皆可萌的百科全书!转载请标注来源页面的网页链接,并声明引自萌娘百科。内容不可商用。
跳转到导航 跳转到搜索

注意:在保存之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。

  • Firefox/Safari:按住“Shift”的同时单击“刷新”,或按“Ctrl-F5”或“Ctrl-R”(Mac为“⌘-R”)
  • Google Chrome:按“Ctrl-Shift-R”(Mac为“⌘-Shift-R”)
  • Internet Explorer:按住“Ctrl”的同时单击“刷新”,或按“Ctrl-F5”
  • Opera:在“工具→首选项”中清除缓存
如果您已登录但该页面出现未登录状态,请尝试在地址栏的地址最后添加代码?_=1来访问最新页面。
添加代码后的本页地址如下:-{R|https://moegirl.icu/User:8f23/maintain-railway-stations.js?_=1}-
/*
--------
版本:0.2.1
--------
用于维护[ACGN作品中出场的铁路车站列表]页面。
启用本工具后在页面主标题末尾添加入口按钮。
在页面和控制台输出结果。
--------
wiki链接检查:✔ 已支持。
日文名称检查:✔ 已支持。
假名检查:✔ 已支持。但无法保证准确适应所有车站。
罗马字检查:✔ 已支持。但无法保证准确适应所有车站。注音的变种很多。
中文名检查:✔ 已支持。
显示名称的wiki版本:✔ 已支持。
--------
车站所在地提示:✔ 已支持。
车站所属公司提示:✔ 已支持。
车站所属线路提示:✗ 可能会实现的功能。
*/
$(function () {
	pathName = window.location.pathname;
    while(true){
        matcher = pathName.match(/(%[0-9A-Fa-f]{2})+/);
        if (matcher === null){
            break;
        }
        matchedContent = matcher[0];
        iterator = matchedContent.matchAll(/[0-9a-fA-F]{2}/g);
        buffer = new Array();
        while(true){
            next = iterator.next();
            if(next.done){
                break;
            }
            tValue = next.value[0];
            nValue = 0;
            hValue = tValue.charCodeAt(0)
            lValue = tValue.charCodeAt(1)
            if(hValue < 58){
                nValue += hValue - 48;
            }
            else if(hValue < 71){
                nValue += hValue - 55;
            }
            else if(hValue < 103){
                nValue += hValue - 87;
            }
            nValue = nValue * 16;
            if(lValue < 58){
                nValue += lValue - 48;
            }
            else if(lValue < 71){
                nValue += lValue - 55;
            }
            else if(lValue < 103){
                nValue += lValue - 87;
            }
            buffer[buffer.length] = nValue;
        }
        newText = new TextDecoder().decode(new Uint8Array(buffer));
        pathName = pathName.replaceAll(matchedContent, newText);
    }
    switch (pathName) {
        // 此处添加希望测试的页面路径:
        case "/ACGN作品中出场的铁路车站列表":
        case "/Template:铁路车站名":
            break;
        default:
            // 不操作未指定的页面。
            return;
    }
    headingClassName = (mw.config.get("skin") == 'moeskin') ? '.first-heading' : 
    					(mw.config.get("skin") == 'vector') ? '.firstHeading' : '';
    var button = $('<span/>', {
        id: 'test_page_acgn_railway_station',
        text: '[检测本页]',
        css: {
            'font-size': '14px',
            'color': '#0645AD'
        }
    }).appendTo(headingClassName).on('click', function () {
        if ($('body.page_station_in_testing').length !== 0) {
            return;
        }
        $(document.body).addClass('page_station_in_testing');
        $(".railway_station_name").each(function () {
            if ($('[href]', this).length === 0) {
                return;
            }
            let id = ($(this)).attr('id');
            let pageUrl = ($('[href]', this).attr("href")); // 获取wiki原始页面链接。
            let apiUrl = pageUrl.substring(0, pageUrl.indexOf(".")) + ".wikipedia.org/w/api.php?action=parse&page=" +
                pageUrl.substring(pageUrl.lastIndexOf("/") + 1, pageUrl.length) +
                "&format=json"; // 转换得到wiki api parse请求链接。
            let isJpStation = ($(this).children('span').filter(function (index) { return ($(this).attr("lang")) == "ja"; }).length !== 0);
            $.ajax({
                type: "GET",
                dataType: "jsonp",
                url: apiUrl,
                success: function (data) {
                    // 成功连接维基。
                    if (data.error !== undefined) {
                        console.log("页面[ " + pageUrl + " ]不存在。");
                        return;
                    }
                    var hiddenItem = $('<div/>', {
                        id: 'hiddenItem_' + id,
                        text: "",
                        css: {
                            display: "none"
                        }
                    }).appendTo('.firstHeading');
                    $('#hiddenItem_' + id).html(data.parse.text['*'].replaceAll(/<img> [\s\S\n]*?<\/img>/g, '').replaceAll(/<img [\s\S\n]*?\/>/g, ''));
                    $('#' + id).children('a').text('✔');
                    $('#' + id).children('a').css('background-color', '#7FFFD4');
                    if (isJpStation) {
                        // 根据wiki内容获取车站站名、假名、罗马字。选用首个表格中的数据。
                        let table_1 = $("[class='infobox bordered']", $('#hiddenItem_' + id)).eq(0);
                        let item_1 = $('tr', table_1).eq(0);
                        let jaName = item_1.text().trim();
                        jaName = (jaName.charAt(jaName.length - 1) == '*') ? jaName.substring(0, jaName.length - 1) : jaName;
                        let item_2 = $("span", table_1).eq(0);
                        let jaContent = item_2.html();
                        let index_1 = jaContent.indexOf('<br>');
                        let index_2 = jaContent.indexOf('<br>', index_1 + 4);
                        index_2 = (index_2 > index_1) ? index_2 : jaContent.length;
                        let jaKana = jaContent.substring(0, index_1).trim();
                        let jaRomaji = jaContent.substring(index_1 + 4, index_2).trim();
                        // 对日本车站名(汉字写法)测试匹配。
                        let span = $('#' + id).children('span').filter(function (index) {
                            return (($(this).attr("lang")) == "ja");
                        }).eq(0);
                        if (span.text() == jaName) {
                            span.css('background-color', '#7FFFD4');
                        } else {
                            // console.log('[' + id + ']:日文名称不一致(' + jaName + '、' + span.text() + ')。');
                            span.html(span.text() + '<sup>wiki: ' + jaName + '</sup>');
                            span.css('background-color', '#FFFDD0');
                        }

                        // 对假名、罗马字测试匹配。
                        span = $('#' + id).children('span').eq(1);
                        if (span.text() == jaKana) {
                            span.css('background-color', '#7FFFD4');
                        } else {
                            // console.log('[' + id + ']:假名存在不一致(' + jaKana + '、' + span.text() + ')。');
                            span.html(span.text() + '<sup>wiki: ' + jaKana + '</sup>');
                            span.css('background-color', '#FFFDD0');
                        }
                        span = $('#' + id).children('span').eq(2);
                        if (span.text() == jaRomaji) {
                            span.css('background-color', '#7FFFD4');
                        } else {
                            // console.log('[' + id + ']:罗马字存在不一致(' + jaRomaji + '、' + span.text() + ')。');
                            span.html(span.text() + '<sup>wiki: ' + jaRomaji + '</sup>');
                            span.css('background-color', '#FFFDD0');
                        }

                        // 根据json中的categories项,得到页面分类,并据此得到车站所在地区、线路。
                        let originalCategories = data.parse.categories;
                        let categories = new Array();
                        for (let i = 0, j = 0; i < originalCategories.length; i++) {
                            let category = originalCategories[i]['*'];
                            if (category.endsWith('の鉄道駅') &&
                                !category.endsWith('年開業の鉄道駅') &&
                                !category.startsWith('日本国有鉄道の鉄道駅')) {
                                categories[j] = category.substring(0, category.length - 4);
                                j++;
                            }
                        }
                        $('<span/>', {
                            id: id + '-categories',
                            text: categories.toString(),
                            lang: 'ja',
                            css: {
                                'font-size': '75%',
                                'font-family': 'Arial, Helvetica, sans-serif',
                                'background-color': '#B0E0FF'
                            }
                        }).appendTo('#' + id);

                        // 测试对应的中文名。根据api响应中的langlinks项获取中文wiki的URL,再次执行AJAX,获得比对数据。
                        let zhUrl = undefined;
                        let links = data.parse.langlinks;
                        for (let i = 0; i < links.length; i++) {
                            if (links[i].lang === 'zh') {
                                zhUrl = links[i].url;
                            }
                        }
                        if (zhUrl === undefined) {
                            console.log("[" + id + "]不存在对应zhwiki页面。");
                        } else {
                            let apiUrl = "https://zh.wikipedia.org/w/api.php?action=parse&page=" +
                                zhUrl.substring(zhUrl.lastIndexOf("/") + 1, zhUrl.length) +
                                "&format=json"; // 转换得到wiki api parse请求链接。
                            $.ajax({
                                type: "GET",
                                dataType: "jsonp",
                                url: apiUrl,
                                success: function (data) {
                                    if (data.error !== undefined) {
                                        console.log("页面[ " + zhUrl + " ]不存在。");
                                        return;
                                    }
                                    // 根据首个表格首项获得中文名。
                                    var hiddenItem = $('<div/>', {
                                        id: 'hiddenItem_' + id + "_zh",
                                        text: "",
                                        css: {
                                            display: "none"
                                        }
                                    }).appendTo('.firstHeading');
                                    $('#hiddenItem_' + id + "_zh").html(data.parse.text['*'].replaceAll(/<img> [\s\S\n]*?<\/img>/g, '').replaceAll(/<img [\s\S\n]*?\/>/g, ''));
                                    let table_1 = $("[class='infobox vcard']", $('#hiddenItem_' + id + "_zh")).eq(0);
                                    let item_1 = $('tr', table_1).eq(0);
                                    let wikiZhName = item_1.text().trim();
                                    let pageZhName = $('#' + id).children('b').text();
                                    if (pageZhName == wikiZhName) {
                                        $('#' + id).children('b').css('background-color', '#7FFFD4');
                                    } else {
                                        // console.log('[' + id + ']:中文名存在不一致(' + wikiZhName + '、' + pageZhName + ')。');
                                        $('#' + id).children('b').html($('#' + id).children('b').text() + '<sup>wiki: ' + wikiZhName + '</sup>');
                                        $('#' + id).children('b').css('background-color', '#FFFDD0');
                                    }
                                    $('#hiddenItem_' + id + "_zh").remove();
                                },
                                error: function () {
                                    // 无法连接维基。
                                    console.log("页面[ " + zhURL + " ]加载失败。");
                                }

                            });
                        }
                    }
                    $('#hiddenItem_' + id).remove();
                },
                error: function () {
                    // 无法连接维基。
                    $('#' + id).children('a').text('✗');
                    $('#' + id).children('a').css('background-color', '#FFC0C0');
                    console.log('[' + id + ']:加载失败。');
                }
            });
        });
    });
});