メール欄があるレスだけ表示

メール欄があるレスだけ表示するボタンを追加します

当前为 2018-09-15 提交的版本,查看 最新版本

// ==UserScript==
// @name     メール欄があるレスだけ表示
// @version  2.10.1
// @grant    none
// @include  https://*.2chan.net/*/res/*
// @description メール欄があるレスだけ表示するボタンを追加します
// @namespace https://gf.qytechs.cn/users/114367
// ==/UserScript==

// ----------------------------------------
// 設定
var CONFIG = {
  showListOnPageLoaded: false,
  showListEvenWithoutMails: true,
  ignoreRegex: /^sage$/
};


// ----------------------------------------
// CSS
// [✉]ボタン
document.styleSheets[0].insertRule(`
  .mail-list-btn {
    cursor: pointer;
  }
`);
document.styleSheets[0].insertRule(`
  .mail-list-btn-on {
    color: #00f;
  }
`);
// リストの表示位置とか
document.styleSheets[0].insertRule(`
  .res-list-container {
    bottom: 20px;
    display: block;
    font-size: 12px;
    position: fixed;
    right: 5px;
    transition: .2s;
    width: 300px;
    z-index: 99;
  }
`);
// 件数表示
document.styleSheets[0].insertRule(`
  .res-count-label {
    display: block;
  }
`);
// レス全体
document.styleSheets[0].insertRule(`
  @keyframes res-fadein {
		0% { opacity: 0; }
		100% { opacity: 1; }
  }
`)
document.styleSheets[0].insertRule(`
  .res {
		animation: res-fadein .2s;
    background: #ccc9;
    border-radius: 5px;
    color: #800;
    margin: 5px;
    padding: 5px;
  }
`);
// メールアドレス
document.styleSheets[0].insertRule(`
  .res-mail {
    color: #00f;
  }
`);
// レス本文
document.styleSheets[0].insertRule(`
  .res-text {
    border-top: 1px dotted #0005;
    font-size: 90%;
    margin: 0;
    max-height: 7em;
    overflow: auto;
    padding: 5px;
    width: auto;
  }
`);
// リストOFF時
document.styleSheets[0].insertRule(`
  .res-list-transparent {
    opacity: 0;
    pointer-events: none;
  }
`)

// ----------------------------------------
// Utils
var newElement = (tag, clazz, text) => {
  var e = document.createElement(tag);
  e.className = clazz;
  if (text) {
    e.textContent = text;
  }
  return e;
};


// ----------------------------------------
// Properties
var mails = [];
var resList = {};

// ----------------------------------------
// Add elements
var resListContainer = newElement('DIV', 'res-list-container res-list-transparent', '');
document.body.insertBefore(resListContainer, null);
resListContainer.addEventListener('click', e => {
  if (e.target.classList.contains('res-mail')) {
    resList[e.target.textContent].mailElement.scrollIntoView({ behavior: 'smooth'});
  }
});
var resListCountLabel = newElement('DIV', 'res res-count-label', '');
var refreshResListCountLabel = () => { resListCountLabel.textContent = '✉ x ' + mails.length; };
refreshResListCountLabel();
resListContainer.insertBefore(resListCountLabel, null);
var mailButton = newElement('SPAN', 'res-list-button', '[✉]');

// ----------------------------------------
// Main
var lastCount = 0;
var refleshList = () => {
  var beforeCount = lastCount;
  var rtds = document.getElementsByClassName('rtd');
  lastCount = rtds.length;
  if (beforeCount === lastCount) return false;
  var newRtds = [];
  for (var i = lastCount - 1, newRtd; newRtd = rtds[i]; i --) {
    if (newRtd.getAttribute('data-mail-searched')) break;
    newRtd.setAttribute('data-mail-searched', '1');
    newRtds.unshift(newRtd);
  }
  newRtds.forEach(rtd => {
    var mailElement =
        rtd.querySelector('[href^="mailto:"]') || // default
        rtd.getElementsByClassName('KOSHIAN_meran')[0] || // kosian
        rtd.querySelector('[color="#005ce6"]'); // futakuro
    if (!mailElement) return;
    var mail = mailElement.href ? decodeURI(mailElement.href).replace('mailto:', '') : mailElement.textContent.replace(/^\[|\]$/g, '');
    if (mail.match(CONFIG.ignoreRegex)) return;
    var res = resList[mail];
    if (!res) {
      mails.push(mail);
      refreshResListCountLabel();
      res = { resContainer: newElement('DIV', 'res', '') };
      resList[mail] = res;
      res.resContainer.appendChild(newElement('DIV', 'res-mail', mail));
      resListContainer.insertBefore(res.resContainer, resListCountLabel);
    }
    res.mailElement = mailElement;
    // BLOCKQUOTEタグを変なところにコピーすると一部のアドオンの動作がおかしくなるので本文はDIVにコピーする
    var text = newElement('DIV', 'res-text', '');
    var n = rtd.getElementsByTagName('BLOCKQUOTE')[0].firstChild;
    while (n) {
      text.appendChild(n.cloneNode(true));
      n = n.nextSibling;
    }
    res.resContainer.appendChild(text);
  });
};

// ----------------------------------------
// List ON OFF
var timer;

var listOff = () => {
  clearInterval(timer);
  timer = null;
  resListContainer.classList.add('res-list-transparent');
  mailButton.classList.remove('mail-list-btn-on');
};

var listOn = () => {
  listOff();
  refleshList();
  if (CONFIG.showListEvenWithoutMails || mails.length) {
    resListContainer.classList.remove('res-list-transparent');
  }
  mailButton.classList.add('mail-list-btn-on');
	timer = setInterval(refleshList, 1500);
};

var toggle = e => {
  if (timer) {
    listOff();
  } else {
    listOn();
  }
};

var addMailButton = () => {
  mailButton.addEventListener('click', toggle);
  var futakuroBorderArea = document.getElementById('border_area');
  if (futakuroBorderArea) {
    futakuroBorderArea.insertBefore(mailButton, null);
  } else {
    document.getElementById('contres').insertBefore(mailButton, document.getElementById('contdisp').nextSibling);
  }
};

// ----------------------------------------
// Start HERE !
setTimeout(() => {
  addMailButton();
  if (CONFIG.showListOnPageLoaded) {
	listOn();
  }
}, 500); // wait for futakuro 

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址