Skip to content

Instantly share code, notes, and snippets.

@khsk
Last active July 26, 2017 06:30
Show Gist options
  • Save khsk/1b9dd13efebe282ec506 to your computer and use it in GitHub Desktop.
Save khsk/1b9dd13efebe282ec506 to your computer and use it in GitHub Desktop.
Togetterからツイートをコピーするボタンを追加するユーザースクリプト ref: http://qiita.com/khsk/items/785202bb70646029193e
// ==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')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment