Skip to content

Instantly share code, notes, and snippets.

@ObjectBoxPC
Last active October 7, 2023 14:28
Show Gist options
  • Save ObjectBoxPC/7395a4ea1f35a7326bdcb54a1961cd6a to your computer and use it in GitHub Desktop.
Save ObjectBoxPC/7395a4ea1f35a7326bdcb54a1961cd6a to your computer and use it in GitHub Desktop.
Userscript to sort Pittsburgh Regional Transit bus schedules numerically
// ==UserScript==
// @name Sort Pittsburgh Regional Transit bus schedules numerically
// @version 2
// @include https://www.rideprt.org/all-schedules/
// @grant none
// ==/UserScript==
// This script is dedicated to the public domain under Creative Commons CC0 1.0 Universal
// <https://creativecommons.org/publicdomain/zero/1.0/>
(function (document, window) {
var busNumberRegex = /^([A-Z]?)([0-9]+)([A-Z]?)$/;
function compareBusNumbers(a, b) {
var aParsed = busNumberRegex.exec(a);
var bParsed = busNumberRegex.exec(b);
if (aParsed === null || bParsed === null) {
// If parsing fails, fall back to string comparison
return (a > b) - (a < b);
}
var aPrefix = aParsed[1];
var aNumber = Number(aParsed[2]);
var aSuffix = aParsed[3];
var bPrefix = bParsed[1];
var bNumber = Number(bParsed[2]);
var bSuffix = bParsed[3];
if (aPrefix !== bPrefix) {
return (aPrefix > bPrefix) - (aPrefix < bPrefix);
}
if (aNumber !== bNumber) {
return (aNumber > bNumber) - (aNumber < bNumber);
}
if (aSuffix !== bSuffix) {
return (aSuffix > bSuffix) - (aSuffix < bSuffix);
}
return 0;
}
function getBusNumber(linkElement) {
return linkElement.textContent.split(' ')[0];
}
var waitForLoad = window.setInterval(function () {
var scheduleCells = document.getElementById('showData1').getElementsByTagName('td');
var scheduleLinks = [];
for (var i = 0; i < scheduleCells.length; i++) {
var cellLinks = scheduleCells[i].getElementsByTagName('a');
if (cellLinks.length > 0) {
scheduleLinks.push(scheduleCells[i].removeChild(cellLinks[0]));
}
}
if (scheduleLinks.length === 0) {
return;
}
scheduleLinks.sort(function (a, b) { return compareBusNumbers(getBusNumber(a), getBusNumber(b)); });
for (var i = 0; i < scheduleLinks.length; i++) {
scheduleCells[i].appendChild(scheduleLinks[i]);
}
window.clearInterval(waitForLoad);
}, 500);
})(document, window);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment