2023年政策修订增补工作正在进行中,欢迎参与!
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 + ']:加载失败。');
}
});
});
});
});