// ==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(); })();