Bangumi Repost Status

转发 Bangumi 时间线上的所有消息

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램을 설치해야 합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==UserScript==
// @name        Bangumi Repost Status
// @namespace   org.upsuper.bangumi
// @include     /^http://(bangumi\.tv|bgm\.tv|chii\.in)/((user/[^/]+/)?timeline)?(\?.*)?$/
// @version     1.0
// @description 转发 Bangumi 时间线上的所有消息
// @grant       none
// ==/UserScript==

function $(id) { return document.getElementById(id); }
function $t(text) { return document.createTextNode(text); }

var $say = $('SayInput');
var $tmlContent = $('tmlContent');

function updateItem($li) {
  var $date = $li.getElementsByClassName('date')[0];
  $date.insertBefore($t(' · '), $date.firstChild);
  var $repost = document.createElement('a');
  $repost.href = 'javascript:void(0)';
  $repost.className = 'tml_comment l __u_repost';
  $repost.dataset.id = $li.id;
  $repost.textContent = '转发';
  $date.insertBefore($repost, $date.firstChild);
}

function updateTimeline() {
  var $ulList = document.querySelectorAll('#timeline>ul');
  for (var i = 0; i < $ulList.length; i++) {
    var $liList = $ulList[i].childNodes;
    for (var j = 0; j < $liList.length; j++)
      updateItem($liList[j]);
  }
}

function repostItem($li) {
  var $info = $li.getElementsByClassName('info')[0];
  var $div = document.createElement('div');
  $div.innerHTML = $info.innerHTML;

  $div.removeChild($div.getElementsByClassName('date')[0]);

  var $links = $div.getElementsByTagName('a');
  for (var i = 0; i < $links.length; i++) {
    var $link = $links[i];
    var match = $link.pathname.match(/^\/user\/([^\/]+)$/);
    if (match) {
      if ($link.textContent.trim())
        $link.textContent = '@' + match[1];
    }

    var $small = $link.getElementsByTagName('small')[0];
    if ($small)
      $link.removeChild($small);
  }

  var $sub = $div.getElementsByClassName('info_sub')[0];
  if ($sub) {
    if ($sub.getElementsByClassName('tip_j')[0])
      $sub.textContent = '';
    else
      $sub.textContent = '(' + $sub.textContent.trim() + ')';
  }

  var $quote = $div.getElementsByClassName('quote')[0];
  if ($quote)
    $quote.textContent = '『' + $quote.textContent.trim() + '』';

  var text = $div.textContent;
  text = text.replace(/\s+/g, ' ').trim();
  $say.value = '转' + text;
  $say.focus();
  $say.setSelectionRange(0, 0);
}

var dirty = false;
function markTimelineDirty() {
  if (!dirty) {
    dirty = true;
    setTimeout(function () {
      dirty = false;
      updateTimeline();
    }, 10);
  }
}

if ($tmlContent) {
  $tmlContent.addEventListener('DOMSubtreeModified', function (e) {
    if (e.target.id == 'tmlContent')
      markTimelineDirty();
  });
  $tmlContent.addEventListener('click', function (e) {
    if (e.target.classList.contains('__u_repost'))
      repostItem($(e.target.dataset.id));
  });
  markTimelineDirty();
}