diff tweetdeck-fixes.user.js @ 110:b9b84779a672

Combine tweetdeck fixes
author nanaya <me@nanaya.net>
date Sun, 15 Jan 2023 23:36:45 +0900
parents tweetdeck-large-image.user.js@ef21ef445fc6
children 055f5d084706
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tweetdeck-fixes.user.js	Sun Jan 15 23:36:45 2023 +0900
@@ -0,0 +1,107 @@
+// ==UserScript==
+// @name         Tweetdeck large image
+// @namespace    https://nanaya.net
+// @version      2.0.9
+// @description  Fixes for TweetDeck
+// @author       nanaya
+// @match        https://tweetdeck.twitter.com/*
+// @grant        none
+// @downloadURL  https://hg.nanaya.net/ec-userscripts/raw-file/tip/tweetdeck-fixes.user.js
+// ==/UserScript==
+
+'use strict';
+
+/* global GM_addStyle */
+// No weird column alignment and color for scrollbar
+function fixColumn () {
+  GM_addStyle(`
+    .app-columns {
+      display: flex;
+    }
+    .column {
+      top: 0;
+      flex: none;
+    }
+    .app-columns-container.app-columns-container.app-columns-container.app-columns-container {
+      bottom: 0;
+      background-color: #555;
+    }
+  `);
+}
+
+// No more stupid link for images in tweetdeck
+function origLink () {
+  const fix = function (link) {
+    // basic sanity check
+    if (!link.classList.contains('js-media-image-link')) {
+      return;
+    }
+
+    // don't run again if already run on passed link
+    if (link._ecUserscript) {
+      return;
+    }
+    link._ecUserscript = true;
+
+    const image = link.querySelector('.media-img');
+    let url;
+
+    // sometimes the image is just background image of the link.
+    // strip all query strings and original :size suffix
+    if (image == null) {
+      url = window.getComputedStyle(link).backgroundImage.replace(/^url\(('|")?(.+?)\1\)$/, '$2');
+    } else {
+      url = image.src;
+    }
+
+    const parsedUrl = new URL(url);
+
+    if (parsedUrl.searchParams.get('name') == null) {
+      url = url.replace(/(\..+:).+/, '$1orig');
+    } else {
+      if (parsedUrl.pathname.match(/\.[^.]+$/) !== null) {
+        parsedUrl.searchParams.delete('format');
+      }
+      parsedUrl.searchParams.set('name', 'orig');
+      url = parsedUrl.href;
+    }
+
+    link.setAttribute('href', url);
+  };
+
+  // loop through passed nodes (or body if called without arguments)
+  const run = function (nodes) {
+    if (nodes == null) {
+      nodes = [document.body];
+    }
+
+    for (let i = 0; i < nodes.length; i++) {
+      // first try fixing itself
+      fix(nodes[i]);
+
+      // and then find all the links inside
+      const links = nodes[i].querySelectorAll('.js-media-image-link');
+
+      for (let j = 0; j < links.length; j++) {
+        fix(links[j]);
+      }
+    }
+  };
+
+  const onMutate = function (mutations) {
+    for (const mutation in mutations) {
+      run(mutation.addedNodes);
+    }
+  };
+
+  // the observer
+  const observer = new window.MutationObserver(onMutate);
+
+  // start the observer
+  observer.observe(document, { childList: true, subtree: true });
+  // initial run on existing document
+  run();
+}
+
+fixColumn();
+origLink();