everythingdd

TT for 2ch

Jul 28th, 2021 (edited)
213
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name        TT for 2ch
  3. // @namespace   scripts
  4. // @match        https://www.2ch.hk/*
  5. // @match        https://*.2ch.hk/*
  6. // @match        https://2ch.hk/*
  7. // @match        https://www.2ch.pm/*
  8. // @match        https://*.2ch.pm/*
  9. // @match        https://2ch.pm/*
  10. // @grant       none
  11. // @version     1.1
  12. // @description  Adds quick TT button for 2ch
  13. // @author       (You)
  14. // ==/UserScript==
  15.  
  16. (function() {
  17.     'use strict';
  18.     function getLink(match){
  19.         var link = document.createElement("a"); link.target = "_blank";
  20.         link.href = `https://www.tiktok.com/share/video/${match}`;
  21.         link.innerHTML = "» TikTok «";
  22.         return link;
  23.     }
  24.  
  25.     function render() {
  26.         var i, href, match, articles = document.querySelectorAll('a[title]:not(.ttFinalised):not(.de-fullimg-link)');
  27.         if (!articles) return;
  28.  
  29.         for(i = 0; i < articles.length; i++) {
  30.             if (match = articles[i].parentNode.innerHTML.match(/(6|7)\d{18}/g)) {
  31.                 href = getLink(match[0]);
  32.                 articles[i]
  33.                     .parentNode
  34.                     .appendChild(href);
  35.             }
  36.             articles[i].classList.add("ttFinalised");
  37.         }
  38.     }
  39.  
  40.     function titleRender() {
  41.         var waitSign, name = document.querySelector('.de-fullimg-info:not(.ttFinalised)');
  42.         if (!name) return;
  43.  
  44.         name.classList.add("ttFinalised");
  45.         waitSign = document.querySelector("div.de-fullimg-info > svg.de-wait");
  46.         if (waitSign){
  47.             const waitObserver = new MutationObserver(addLink);
  48.             waitObserver.observe(waitSign, {
  49.                 attributes: true,
  50.                 attributeFilter: ["style"]
  51.             });
  52.         } else {
  53.             addLink();
  54.         }
  55.  
  56.         function addLink() {
  57.             var href, match;
  58.             if (match = name.innerText.match(/(6|7)\d{18}/g)) {
  59.                 href = getLink(match[0]);
  60.                 document.querySelector('div.de-fullimg-info')
  61.                     .appendChild(href);
  62.             }
  63.         }
  64.     }
  65.  
  66.     const threadRoot = document.querySelector(".thread");
  67.     const threadListRoot = document.querySelector("#posts-form") || threadRoot.parentNode.parentNode;
  68.     const titleRoot = threadRoot.parentNode;
  69.     const threadObserver = new MutationObserver(render);
  70.     const metaObserver = new MutationObserver(titleRender);
  71.     render();
  72.  
  73.     threadObserver.observe(threadListRoot, {
  74.         childList: true,
  75.         subtree: false,
  76.         attributes: false
  77.     });
  78.     threadObserver.observe(threadRoot, {
  79.         childList: true,
  80.         subtree: false,
  81.         attributes: false
  82.     });
  83.     metaObserver.observe(titleRoot, {
  84.         childList: true,
  85.         subtree: false,
  86.         attributes: false
  87.     });
  88. })();
RAW Paste Data