@@ -92,6 +92,42 @@ XMLHttpRequest.prototype.send = function(body) {
9292 return XMLHttpRequest_send . apply ( this , [ body ] )
9393}
9494
95+ /** Tracking parameters to strip from Twitter/X URLs */
96+ const TRACKING_PARAMS = [ 's' , 't' , 'ref_src' , 'ref_url' , 'src' , 'cxt' , 'vertical' , 'mx' ]
97+
98+ /**
99+ * Strip tracking params from a URL, optionally redirect to a custom domain
100+ */
101+ function cleanTwitterUrl ( urlString , targetDomain ) {
102+ try {
103+ let url = new URL ( urlString )
104+ TRACKING_PARAMS . forEach ( param => url . searchParams . delete ( param ) )
105+ let search = url . searchParams . toString ( )
106+ let domain = targetDomain || url . hostname
107+ return `https://${ domain } ${ url . pathname } ${ search ? '?' + search : '' } ${ url . hash } `
108+ } catch ( e ) {
109+ return urlString
110+ }
111+ }
112+
113+ // Intercept copy events to strip tracking params and optionally redirect
114+ document . addEventListener ( 'copy' , function ( e ) {
115+ if ( ! config . enabled ) return
116+
117+ let selection = window . getSelection ( ) ?. toString ( ) || ''
118+ let urlPattern = / h t t p s ? : \/ \/ ( w w w \. ) ? ( t w i t t e r \. c o m | x \. c o m | m o b i l e \. t w i t t e r \. c o m | m o b i l e \. x \. c o m ) ( \/ [ ^ \s ] * ) ? / gi
119+
120+ if ( urlPattern . test ( selection ) ) {
121+ urlPattern . lastIndex = 0
122+ let targetDomain = config . redirectTwitterLinks ?. trim ( ) . replace ( / ^ h t t p s ? : \/ \/ / , '' ) || null
123+ let newText = selection . replace ( urlPattern , ( match ) => cleanTwitterUrl ( match , targetDomain ) )
124+ if ( newText !== selection ) {
125+ e . preventDefault ( )
126+ e . clipboardData ?. setData ( 'text/plain' , newText )
127+ }
128+ }
129+ } , true )
130+
95131let debug = false
96132
97133/** @type {boolean } */
@@ -181,6 +217,7 @@ const config = {
181217 quoteTweets : 'ignore' ,
182218 redirectChatNav : false ,
183219 redirectToTwitter : false ,
220+ redirectTwitterLinks : '' ,
184221 reducedInteractionMode : false ,
185222 replaceLogo : true ,
186223 restoreLinkHeadlines : true ,
0 commit comments