|
|
|
// ==UserScript== |
|
// @name togetter copy |
|
// @namespace khsk |
|
// @include http://togetter.com/li/* |
|
// @include https://togetter.com/li/* |
|
// @version 1 |
|
// @grant none |
|
// ==/UserScript== |
|
console.time('togetter') |
|
// コピーとは無関係な個人的レイアウト調整 |
|
document.getElementById('social_floating_box').style.display = 'none' |
|
document.getElementById('subheader').style.display = 'none' |
|
document.getElementsByClassName('header_social_box') [0].style.display = 'none' |
|
document.getElementsByClassName('side_box side_line_box editor_recommend') [0].style.display = 'none' |
|
document.getElementsByClassName('social_box') [0].style.display = 'none' |
|
//document.getElementsByClassName('alert alert-info') [0].style.display = 'none' |
|
//document.getElementsByClassName('info_action') [0].style.display = 'none' |
|
document.getElementsByClassName('favorite_user_box') [0].style.display = 'none' |
|
document.getElementsByClassName('ad_list_top') [0].style.display = 'none' |
|
document.getElementsByClassName('inner_right') [0].style.display = 'none' |
|
|
|
// Firefox40までは未実装でもtrueが来てしまうので注意 |
|
var supportedCopy = document.queryCommandSupported('copy') |
|
|
|
// コピー関数 |
|
var copyOrSelectedTweet = (node, endPoint) => { |
|
// NOTICE ユーザーが手動で選択している部分もコピーするので、嫌ならば先に選択解除を挟む |
|
// コピー対象を選択状態にする |
|
var range = document.createRange() |
|
range.setStart(node, 0) |
|
range.setEnd(node, endPoint) |
|
window.getSelection().addRange(range) |
|
if (!supportedCopy) { |
|
// コピーできないなら選択状態で終了 手動でコピーしてね |
|
return |
|
} |
|
try { |
|
document.execCommand('copy') |
|
} catch (e) { |
|
// 非対応なら例外が出る Firefox40までなど |
|
alert('copyに失敗しました') |
|
} |
|
// 選択を解除する |
|
window.getSelection().removeAllRanges(); |
|
|
|
// NOTICE コピーが完了しました的テキストを出してもいいかも |
|
} |
|
|
|
// 続きを読む |
|
var continueBtn = document.querySelector('.more_tweet_box > a:nth-child(1)') |
|
if (continueBtn) { |
|
// 2ページ目以降対策で続きを読み込む |
|
continueBtn.click() |
|
} |
|
|
|
// 続き読み込み分へも適用するのでこの順序 |
|
// 各ツイートの返信 RT お気に入り (テキストに余分な改行が入るし、手動選択時に邪魔だったけど、最近改善されている見たい。けど不要なので非表示) |
|
Array.prototype.forEach.call(document.getElementsByClassName('status'), (item) => { |
|
item.style.display = 'none' |
|
}); |
|
|
|
// コピー or 全選択ボタン |
|
var b = document.createElement('button') |
|
b.innerHTML = supportedCopy ? 'コピー' : '全選択' |
|
b.style.marginTop = '5px' |
|
b.addEventListener('click', () => { |
|
var tb = document.getElementsByClassName('tweet_box') [0] |
|
switch (tb.childElementCount) { |
|
case 2: |
|
// 続きを読むなし |
|
// ツイートリスト + script |
|
copyOrSelectedTweet(tb, tb.childNodes.length - 1) |
|
break |
|
case 4: |
|
// 続きを読むあり + ペジネーションなし or 続きを読むなし + ペジネーション(ペジネーションラスト) |
|
// ツイートリスト + script + 続きのscript + 続きのツイートリスト or ツイートリスト + script + ペジネーション + 表示数変更 |
|
if (tb.children[tb.children.length - 1].tagName == 'UL') { |
|
// 続きを読むあり + ペジネーションなし |
|
copyOrSelectedTweet(tb, tb.childNodes.length) |
|
} else if (tb.children[tb.children.length - 1].tagName == 'DIV') { |
|
// 続きを読むなし + ペジネーション(ペジネーションラスト) |
|
copyOrSelectedTweet(tb, tb.childNodes.length - 5) |
|
} else { |
|
alert('想定外') |
|
} |
|
break |
|
case 6: |
|
// 続きを読むあり + ペジネーションあり |
|
// ツイートリスト + script + 続きのscript + 続きのツイートリスト + ペジネーション + 表示数変更 |
|
copyOrSelectedTweet(tb, tb.childNodes.length - 5) |
|
if (typeof (pagination) == 'undefined') { |
|
// 上部にペジネーションコピー |
|
// paginationはグローバルに宣言し、再作成を防ぐ |
|
pagination = tb.children[tb.children.length - 2].cloneNode(true) |
|
pagination.style.display = 'inline' |
|
document.getElementsByClassName('title_box') [0].appendChild(pagination) |
|
} |
|
break |
|
default: |
|
alert('想定外') |
|
break |
|
} |
|
}) |
|
document.getElementsByClassName('title_box') [0].appendChild(b) |
|
console.timeEnd('togetter') |
|
|
|
|