// ==UserScript==
// @name 动车组交路查询
// @description 在 12306 订票页面上显示动车组型号与交路
// @author Arnie97
// @version 2023.07.26
// @license MIT
// @namespace https://github.com/Arnie97
// @homepageURL https://github.com/Arnie97/emu-tools/blob/master/emu.user.js
// @match https://kyfw.12306.cn/otn/leftTicket/init*
// @match https://kyfw.12306.cn/otn/leftTicketPrice/init
// @match https://kyfw.12306.cn/otn/leftTicketPrice/initPublicPrice
// @match https://kyfw.12306.cn/otn/czxx/init
// @icon https://rail.re/favicon.ico
// @connect rail.re
// @grant none
// @downloadURL https://update.greasyfork.icu/scripts/33266/%E5%8A%A8%E8%BD%A6%E7%BB%84%E4%BA%A4%E8%B7%AF%E6%9F%A5%E8%AF%A2.user.js
// @updateURL https://update.greasyfork.icu/scripts/33266/%E5%8A%A8%E8%BD%A6%E7%BB%84%E4%BA%A4%E8%B7%AF%E6%9F%A5%E8%AF%A2.meta.js
// ==/UserScript==
// Patch items on the web page
function showTrainModel(parentNode, info) {
var urlPath = 'https://rail.re/img/';
var img = $('
');
var node = $('')
.addClass('route')
.text(formatTrainModel(info).emu_no)
.attr('title', info.date)
.append(img);
colors.some(function(pair) {
if (pair[1].test(info.emu_no)) {
node.css('color', pair[0]);
return true;
}
});
// Preload images on mouse hover
node.mouseenter(function(event) {
node.unbind('mouseenter');
img.attr('src', urlPath + info.train_no + '.png').error(function() {
$(this).unbind('error').attr('src', urlPath + '404.png');
});
});
node.click(function(event) {
node.mouseenter();
img.toggle();
});
$(parentNode).find('.ls>span, td:nth-child(3)').contents().replaceWith(node);
}
// Add hyphens properly
function formatTrainModel(info) {
[
/^(\w+)(\d{4})$/,
/^(\w+A)(A-\d{4})$/,
/^(\w+F)(\w+-\d{4})$/,
].forEach(function(regExp) {
var match = info.emu_no.match(regExp);
if (match) {
info.emu_no = match[1] + "-" + match[2];
}
});
return info;
}
// Iterate through the items
function checkPage() {
var trainNodes = $('.ticket-info, #_query_table_datas>tr');
if (!trainNodes.length) {
return;
}
var trainNumbers = Array.from(trainNodes.map(function(index, node) {
return $(node).find('a.number').text();
}));
var url = 'https://api.rail.re/train/,' + trainNumbers.join(',');
$.getJSON(url, function(results) {
console.log('EMU Tools:', results.length, 'results found');
// Convert array to map
var trains = {};
results.forEach(function(info) {
trains[info.train_no] = info;
});
trainNodes.each(function(index, node) {
var info = trains[trainNumbers[index]];
if (info) {
showTrainModel(node, info);
}
});
});
}
// Append