alt_expand for Old TweetDeck

旧TweetDeckでTL上にALTテキストを展開するやつ

// ==UserScript==
// @name         alt_expand for Old TweetDeck
// @namespace    https://twitter.com/@7vU6jrZRuX2ffkY
// @version      0.1
// @description  旧TweetDeckでTL上にALTテキストを展開するやつ
// @author       @7vU6jrZRuX2ffkY
// @match        https://twitter.com/i/tweetdeck
// @grant        none
// @license      MIT
// ==/UserScript==
 
(() => {
  const observer = new MutationObserver(m => {
    m.forEach(mm => {
      mm.addedNodes.forEach(e => {
        if (e.classList && e.classList.contains("js-stream-item")) {
          addAltText1(e.querySelector("div.js-media.media-preview:has(a.js-media-image-link[title]:not([title='']))"));
          addAltText2(e.querySelector("div.js-media.media-preview:has(a.js-media-image-link img[alt]:not([alt=''])"));
        }
      });
    });
  });
 
  const addAltText1 = ele => {
    ele && ele.insertAdjacentHTML("afterend", "<p style='white-space:pre-wrap;padding-top:1em'>" + ele.querySelector("a[title]").title + "</p>")
  };
 
  const addAltText2 = ele => {
    ele && ele.insertAdjacentHTML("afterend", "<p style='white-space:pre-wrap;padding-top:1em'>" + ele.querySelector("img[alt]").alt + "</p>")
  };
 
  const waitForLoadCompletion = () => {
    const t1 = document.querySelector("div.js-app-columns");
    const t2 = document.querySelector("div#open-modal");
    if (t1 && t2) {
      observer.observe(t1, {
        childList: true,
        subtree: true,
        characterData: true
      });
      observer.observe(t2, {
        childList: true,
        subtree: true,
        characterData: true
      });
    } else {
      setTimeout(waitForLoadCompletion, 500);
    }
  };
 
  waitForLoadCompletion();
})();