nuke tweet view counts

remove view count numbers & tweet analytics links from Twitter timeline because fuck that

ही स्क्रिप्ट इंस्टॉल करण्यासाठी तुम्हाला Tampermonkey, Greasemonkey किंवा Violentmonkey यासारखे एक्स्टेंशन इंस्टॉल करावे लागेल.

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

ही स्क्रिप्ट इंस्टॉल करण्यासाठी तुम्हाला Tampermonkey किंवा Violentmonkey यासारखे एक्स्टेंशन इंस्टॉल करावे लागेल..

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

ही स्क्रिप्ट इंस्टॉल करण्यासाठी तुम्हाला Tampermonkey यासारखे एक्स्टेंशन इंस्टॉल करावे लागेल..

ही स्क्रिप्ट इंस्टॉल करण्यासाठी तुम्हाला एक युझर स्क्रिप्ट व्यवस्थापक एक्स्टेंशन इंस्टॉल करावे लागेल.

(माझ्याकडे आधीच युझर स्क्रिप्ट व्यवस्थापक आहे, मला इंस्टॉल करू द्या!)

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला Stylus सारखे एक्स्टेंशन इंस्टॉल करावे लागेल.

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला Stylus सारखे एक्स्टेंशन इंस्टॉल करावे लागेल.

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला Stylus सारखे एक्स्टेंशन इंस्टॉल करावे लागेल.

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला एक युझर स्टाईल व्यवस्थापक इंस्टॉल करावे लागेल.

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला एक युझर स्टाईल व्यवस्थापक इंस्टॉल करावे लागेल.

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला एक युझर स्टाईल व्यवस्थापक इंस्टॉल करावे लागेल.

(माझ्याकडे आधीच युझर स्टाईल व्यवस्थापक आहे, मला इंस्टॉल करू द्या!)

// ==UserScript==
// @name         nuke tweet view counts
// @namespace    http://elycien.com/
// @version      0.6
// @license      GNU GPLv3
// @description  remove view count numbers & tweet analytics links from Twitter timeline because fuck that
// @author       Elcie
// @match        http*://*twitter.com/*
// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant        none
// ==/UserScript==

(function() {
    'use strict';
    const targetNode = document.querySelector('body');
    const config = { attributes: true, childList: true, subtree: true };
    const callback = function(mutationsList, observer) {
        for (let mutation of mutationsList) {
            let xpath = "//a[contains(@href, '/analytics')]//span[contains(text(), 'View')] | //*[contains(@aria-label, 'View Tweet analytics')]";
            let elements = document.evaluate(xpath, document, null, XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null);
            let targetedElement = elements.iterateNext();
            while (targetedElement) {
                while (targetedElement && targetedElement.tagName != "A" && (!targetedElement.getAttribute("aria-label") || !targetedElement.getAttribute("aria-label").includes("View Tweet analytics"))) {
                    targetedElement = targetedElement.parentElement;
                }
                if (targetedElement) {
                    var testid = targetedElement.getAttribute("data-testid");
                    if (!testid || testid != "analyticsButton") {
                        let parent = targetedElement.parentElement;
                        if (parent) {
                            if (parent.style.display != 'none') {
                                parent.style.display = 'none';
                            }
                        }
                        else {
                            if (targetedElement.style.display != 'none') {
                                targetedElement.style.display = 'none';
                            }
                        }
                    }
                }
                targetedElement = elements.iterateNext();
            }
        }
    };

    const observer = new MutationObserver(callback);
    observer.observe(targetNode, config);
})();