注意:在保存之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。
?_=1
来访问最新页面。https://zh.moegirl.org.cn/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 + ']:加载失败。'); } }); }); }); });