// ==UserScript==
// @name Twitter Link Modifier
// @namespace http://tampermonkey.net/
// @version 1.1
// @description Modify newly t.co links to direct URLs on Twitter pages dynamically
// @author CLDXiang
// @match https://twitter.com/*
// @grant none
// @license MIT
// @downloadURL none
// ==/UserScript==
(function() {
'use strict';
// Function to modify a single link
function modifyLink(link) {
// Check if the href contains 't.co'
if (link.href.includes('t.co')) {
// Replace href with the domain from innerText
var urlText = link.innerText;
// Simple check for a valid URL in the innerText
if (urlText.startsWith('http')) {
if (urlText.endsWith('…')) {
urlText = urlText.slice(0, -1);
}
link.href = urlText;
}
}
}
// Function to observe DOM changes
function observeDOM() {
// Options for the observer (which mutations to observe)
const config = { childList: true, subtree: true };
// Callback function to execute when mutations are observed
const callback = function(mutationsList, observer) {
for (let mutation of mutationsList) {
if (mutation.type === 'childList') {
mutation.addedNodes.forEach(node => {
// Check if the added node is an element
if (node.nodeType === Node.ELEMENT_NODE) {
// Check if it's an tag or contains tags
if (node.tagName === 'A') {
modifyLink(node);
} else {
node.querySelectorAll('a').forEach(modifyLink);
}
}
});
}
}
};
// Create an observer instance linked to the callback function
const observer = new MutationObserver(callback);
// Start observing the target node for configured mutations
observer.observe(document.body, config);
}
// Modify existing links and set up the observer
document.querySelectorAll('a').forEach(modifyLink);
observeDOM();
})();