javbus find copy

主帖、楼层、楼层评论中发现番号即生成复制按钮

スクリプトをインストールするには、Tampermonkey, GreasemonkeyViolentmonkey のような拡張機能のインストールが必要です。

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

スクリプトをインストールするには、TampermonkeyViolentmonkey のような拡張機能のインストールが必要です。

スクリプトをインストールするには、TampermonkeyUserscripts のような拡張機能のインストールが必要です。

このスクリプトをインストールするには、Tampermonkeyなどの拡張機能をインストールする必要があります。

このスクリプトをインストールするには、ユーザースクリプト管理ツールの拡張機能をインストールする必要があります。

(ユーザースクリプト管理ツールは設定済みなのでインストール!)

このスタイルをインストールするには、Stylusなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus などの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus tなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

(ユーザースタイル管理ツールは設定済みなのでインストール!)

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください
// ==UserScript==
// @name         javbus find copy
// @namespace    http://tampermonkey.net/
// @version      0.3
// @description  主帖、楼层、楼层评论中发现番号即生成复制按钮
// @match        https://www.javbus.com/forum/*
// @license      zxuuhh
// @grant        none
// ==/UserScript==

(function () {
  'use strict';

  const CODE_REGEX = /\b([A-Z]{2,6}-?\d{3,5})\b/g;

  function createCopyBtn(code) {
    const btn = document.createElement('span');
    btn.textContent = ' [复制]';
    btn.style.cssText = `
      color:#337ab7;
      cursor:pointer;
      font-size:17px;
      user-select:none;
    `;
    btn.addEventListener('click', () => {
      navigator.clipboard.writeText(code);
      btn.textContent = ' [已复制]';
      setTimeout(() => (btn.textContent = ' [复制]'), 1000);
    });
    return btn;
  }

  function processTextNode(textNode) {
    const text = textNode.nodeValue;
    if (!CODE_REGEX.test(text)) return;

    CODE_REGEX.lastIndex = 0;

    const frag = document.createDocumentFragment();
    let lastIndex = 0;
    let match;

    while ((match = CODE_REGEX.exec(text))) {
      const code = match[1];

      frag.appendChild(
        document.createTextNode(text.slice(lastIndex, match.index))
      );

      frag.appendChild(document.createTextNode(code));
      frag.appendChild(createCopyBtn(code));

      lastIndex = match.index + code.length;
    }

    frag.appendChild(
      document.createTextNode(text.slice(lastIndex))
    );

    textNode.parentNode.replaceChild(frag, textNode);
  }

  function scanContainer(container) {
    if (container.dataset.scanned) return;
    container.dataset.scanned = '1';

    const walker = document.createTreeWalker(
      container,
      NodeFilter.SHOW_TEXT,
      null,
      false
    );

    const nodes = [];
    let node;
    while ((node = walker.nextNode())) {
      nodes.push(node);
    }

    nodes.forEach(processTextNode);
  }

  function scanAll() {
    document
      .querySelectorAll('td.t_f, div.psti')
      .forEach(scanContainer);
  }

  setInterval(scanAll, 500);
})();