New twitter improvements

Improves new version of twitter a little bit

اعتبارا من 13-03-2022. شاهد أحدث إصدار.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

ستحتاج إلى تثبيت إضافة مثل Stylus لتثبيت هذا النمط.

ستحتاج إلى تثبيت إضافة لإدارة أنماط المستخدم لتتمكن من تثبيت هذا النمط.

ستحتاج إلى تثبيت إضافة لإدارة أنماط المستخدم لتثبيت هذا النمط.

ستحتاج إلى تثبيت إضافة لإدارة أنماط المستخدم لتثبيت هذا النمط.

(لدي بالفعل مثبت أنماط للمستخدم، دعني أقم بتثبيته!)

// ==UserScript==
// @name New twitter improvements
// @description Improves new version of twitter a little bit
// @namespace Violentmonkey Scripts
// @match https://mobile.twitter.com/*
// @match https://twitter.com/*
// @grant none
// @inject-into content
// @license WTFPL
// @version 0.18
// ==/UserScript==
// 
//
// *********************************************************************************
// * TODO: stop reply, retweet and like count from updating, it's very annoying    *
// *                                                                               *
// *********************************************************************************
// 

function insertAfter(newNode, referenceNode) {
    referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
}

(function() {
  
  //useless shit to remove
  var remove_elements = [
    'a[role="link"][data-testid="SideNav_NewTweet_Button"]',
    'a[role="link"][href="/explore"]',
    //ads and analytics are blocked anyway
    'a[role="link"][href*="ads.twitter.com"]',
    'a[role="link"][href*="analytics.twitter.com"]',
    'a[role="link"][href$="/topics"]'
  ]
  
  let ob = new window.MutationObserver(function() {
    
    //remove useless elements
    remove_elements.forEach(function(sel) {
      let el = document.querySelector(sel);
      if (el) {
        el.remove();
      }
    })
    
    //trends are more complicated
    if (!window.location.pathname.startsWith("/settings")) {
      let sections = document.querySelectorAll('section[role="region"]');
      sections.forEach(function(s) {
        if (s.querySelector('a[href="/settings/trends"]')) {
          //s.parentElement.parentElement.parentElement.remove();
          s.parentElement.parentElement.remove();
        }
      });
    }
    
    //profile pic is even worse
    if (window.location.pathname == "/home") {
      let pb = document.querySelector('div[role="progressbar"]');
      let form = pb.parentElement;
      if (form.querySelector('div[data-testid="toolBar"]')) {
        let imgs = form.querySelectorAll('img');
        imgs.forEach(function(i) {
          if (i.getAttribute('src').startsWith('https://pbs.twimg.com/profile_images/')) {
            i.parentElement.remove();
          }
        })
      }
    }
    
    let tp = document.querySelector('a[role="link"][href="/i/topics/picker/home"]');
    if (tp) {
      for (let i = 0; i <= 3; i++) {
        tp = tp.parentElement;
      }
      if (tp.getAttribute('role') == 'region') {
        tp.parentElement.parentElement.remove();
      }
    }

    let as = document.querySelector('div[data-testid="SideNav_AccountSwitcher_Button"]');
    let i = as.querySelector('img');
    if (i) {
      i.parentElement.parentElement.parentElement.parentElement.remove();
    }
    if (!as.querySelector('svg[data-added="true"]') && as.querySelectorAll('div').length <= 1) {
      let more_button = document.querySelector('div[data-testid="AppTabBar_More_Menu"]').querySelector('svg').cloneNode(true);
      more_button.setAttribute('data-added', 'true');
      as.appendChild(more_button);
    }
    if (as.querySelectorAll('div').length > 1) {
      let s = as.querySelector('svg[data-added="true"]');
      if (s) {
        s.remove();
      }
      let spans = as.querySelectorAll('span');
      let sp = spans[2];
      if (sp) {
        sp.remove();
      }
      if (spans[1].innerHTML != "Account") {
        spans[1].innerHTML = "Account";
      }
    }
    
    //put direct links to images
    let links = document.querySelectorAll('a');
    links.forEach(function(a) {
      if (/^\/.*\/status\/\d*\/photo\/\d$/.test(a.getAttribute('href'))) {
        let img = a.querySelector('img');
        if (img) {
          let src = /^(.+)\?format=(\w+).*$/.exec(img.getAttribute('src'));
          a.setAttribute('href', src[1]+'.'+src[2]+':orig');
          a.setAttribute('x-image', 'true');
        }
      }
    });
    
    //add button to open all images
    let tweets = document.querySelectorAll('article[data-testid="tweet"]');
    tweets.forEach(function(tw){
      /*if (!tw.querySelector('div[data-testid="tweet"]')) {
        return;
      }*/
      let d = tw.querySelector('div[data-openimg="1"]');
      if (!d) {
        let gr = tw.querySelector('div[role="group"]');
        
        var is_single_tweet = false;
        if (getComputedStyle(gr).maxWidth == "none") {
          is_single_tweet = true;
        }
        
        let buttons = gr.querySelectorAll('div[role="button"]')
        let r = buttons[buttons.length-1].parentNode;
        
        let odiv = r.cloneNode(true);
        
        //let analyticslink = gr.querySelector('a[role="link"]');
        
        let f = odiv.querySelectorAll('div');
        f = f[f.length-1]
        let s = f.querySelector('span');
        if (s) {
          s.remove();
        }
        
        odiv.setAttribute('data-openimg', '1');
        odiv.querySelector('g').innerHTML = '<path d="M19.75 2H4.25C3.01 2 2 3.01 2 4.25v15.5C2 20.99 3.01 22 4.25 22h15.5c1.24 0 2.25-1.01 2.25-2.25V4.25C22 3.01 20.99 2 19.75 2zM4.25 3.5h15.5c.413 0 .75.337.75.75v9.676l-3.858-3.858c-.14-.14-.33-.22-.53-.22h-.003c-.2 0-.393.08-.532.224l-4.317 4.384-1.813-1.806c-.14-.14-.33-.22-.53-.22-.193-.03-.395.08-.535.227L3.5 17.642V4.25c0-.413.337-.75.75-.75zm-.744 16.28l5.418-5.534 6.282 6.254H4.25c-.402 0-.727-.322-.744-.72zm16.244.72h-2.42l-5.007-4.987 3.792-3.85 4.385 4.384v3.703c0 .413-.337.75-.75.75z"></path><circle cx="8.868" cy="8.309" r="1.542"></circle>';
        odiv.querySelectorAll('div')[0].addEventListener('click', function() {
          let images = tw.querySelectorAll('a[x-image="true"]');
          images.forEach(function(im) {
            window.open(im.getAttribute('href'));
          });
        });
       
        gr.appendChild(odiv);
       
      }
    });
    
  });
  
  ob.observe(document, {
    childList: true,
    subtree: true,
  });
})();