Created
October 13, 2012 08:37
-
-
Save shogo82148/3883841 to your computer and use it in GitHub Desktop.
半自動トゥギャりスクリプト
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==UserScript== | |
// @name TogetterHelper | |
// @namespace https://gist.github.com/3883841 | |
// @version 0.1 | |
// @description Togetterの編集作業便利にしたい. | |
// @match http://togetter.com/create | |
// @copyright 2012+, shogo82148 | |
// ==/UserScript== | |
(function() { | |
function $(expression, callback) { | |
var iterator, node; | |
if(callback) { | |
iterator = document.evaluate(expression, document, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null); | |
node = iterator.iterateNext(); | |
while(node) { | |
callback(node); | |
node = iterator.iterateNext(); | |
} | |
} else { | |
return document.evaluate(expression, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; | |
} | |
} | |
function Status(elem) { | |
this.elem = elem; | |
} | |
Status.prototype.tweet = function() { | |
var tweet = document.evaluate( | |
'.//div[@class="tweet"]', | |
this.elem, null, | |
XPathResult.FIRST_ORDERED_NODE_TYPE, | |
null).singleNodeValue; | |
if(!tweet) return null; | |
return tweet.innerText; | |
}; | |
Status.prototype.id = function() { | |
return this.elem.id; | |
}; | |
function remove(node) { | |
node.parentNode.removeChild(node); | |
return node; | |
} | |
//まとめ作成画面にナビゲータなんていらない | |
remove($('//*[@id="header"]')); | |
remove($('//ul[@class="navigator"]')); | |
remove($('//div[@class="sub_navigator maincategory"]')); | |
remove($('//*[@id="navi_header"]')); | |
remove($('//*[@id="footer"]')); | |
// 残ったものを画面いっぱいに表示 | |
GM_addStyle('\ | |
body {\ | |
position: absolute;\ | |
width: 100%;\ | |
height: 100%;\ | |
overflow: hidden;\ | |
}\ | |
body, #document, .contents, .contents_edit_main, .edit_main, .editor_box {\ | |
width: 100%;\ | |
height: 100%;\ | |
padding: 0px;\ | |
margin: 0px;\ | |
}\ | |
#results, #choices {\ | |
width: 50%;\ | |
}\ | |
.action_box {\ | |
position: absolute;\ | |
bottom: 0px;\ | |
width:100%;\ | |
height: 100px;\ | |
}\ | |
.action_box .right, .action_box .left{\ | |
margin: 0px;\ | |
padding: 5px;\ | |
box-sizing: border-box;\ | |
width: 50%;\ | |
height: 100%;\ | |
}\ | |
.action_item .balloon_img{\ | |
margin: 0px;\ | |
width: 0px;\ | |
}\ | |
.action_item .balloon_body{\ | |
width: 100%;\ | |
padding: 0px 0px 0px 54px;\ | |
box-sizing: border-box;\ | |
}\ | |
'); | |
// もともとの編集ボタンは遅くてイライラするので自前実装 | |
var ALL_CHOICES = '//*[@id="choices"]/*[contains(@class,"action_item")]'; | |
var ALL_RESULTS = '//*[@id="results"]/*[contains(@class,"action_item")]'; | |
var action_button_box = $('//div[@class="right"]//div[@class="action_button_box"]/div[@class="action_button_box_right"]'); | |
action_button_box.innerHTML = ''; | |
// RT削除ボタン | |
var removeRT = document.createElement('a'); | |
removeRT.className = "btn"; | |
removeRT.innerText = "RT:を削除"; | |
action_button_box.appendChild(removeRT); | |
removeRT.addEventListener('click', function() { | |
var RTs = []; | |
$(ALL_CHOICES, function(elem) { | |
var status = new Status(elem); | |
if(/^RT/.test(status.tweet())) RTs.push(elem); | |
}); | |
RTs.forEach(function(elem){ | |
remove(elem); | |
}); | |
}); | |
//重複分を削除ボタン | |
var removeDuplicated = document.createElement('a'); | |
removeDuplicated.className = "btn"; | |
removeDuplicated.innerText = "重複分を削除"; | |
action_button_box.appendChild(removeDuplicated); | |
removeDuplicated.addEventListener('click', function() { | |
var IDs = {}; | |
var duplicates = []; | |
$(ALL_CHOICES, function(elem) { | |
if(IDs[elem.id]) { | |
duplicates.push(elem); | |
} else { | |
IDs[elem.id] = true; | |
} | |
}); | |
duplicates.forEach(function(elem){ | |
remove(elem); | |
}); | |
}); | |
//ソート | |
var sortDown = document.createElement('a'); | |
sortDown.className = "btn"; | |
sortDown.innerHTML = '<span class="icon icon_sortdown">時間順</span>'; | |
action_button_box.appendChild(sortDown); | |
sortDown.addEventListener('click', function() { | |
sortUpAndDown(true); | |
}); | |
var sortUp = document.createElement('a'); | |
sortUp.className = "btn"; | |
sortUp.innerHTML = '<span class="icon icon_sortup">逆順</span>'; | |
action_button_box.appendChild(sortUp); | |
sortUp.addEventListener('click', function() { | |
sortUpAndDown(false); | |
}); | |
function sortUpAndDown(f) { | |
var targets = []; | |
var choices = document.getElementById('choices'); | |
var parent = choices.parentNode; | |
var dummy = document.createElement("div"); | |
$(ALL_CHOICES, function(elem) { | |
if(elem.dataset.type=="tweet") { | |
targets.push({id: elem.id, elems: [elem]}); | |
} else if(targets.length>0) { | |
targets[targets.length-1].elems.push(elem); | |
} | |
}); | |
targets.sort(function(a, b) {return f ? a.id-b.id : b.id-a.id;}); | |
parent.replaceChild(dummy, choices); | |
targets.forEach(function(elems) { | |
elems.elems.forEach(function(elem) { | |
remove(elem); | |
choices.appendChild(elem); | |
}); | |
}); | |
parent.replaceChild(choices, dummy); | |
} | |
//クリア | |
var removeAll = document.createElement('a'); | |
removeAll.className = "btn"; | |
removeAll.innerText = "クリア"; | |
action_button_box.appendChild(removeAll); | |
removeAll.addEventListener('click', function() { | |
if(confirm('削除してもよろしいですか?')) { | |
document.getElementById('choices').innerHTML = ""; | |
} | |
}); | |
//自動読み込みスクリプト | |
var autoSearch = document.createElement('input'); | |
autoSearch.className = "btn"; | |
autoSearch.type = "button"; | |
autoSearch.value = "自動検索開始"; | |
var searchButton = $('//*[contains(@class,"search_button")]'); | |
searchButton.parentNode.insertBefore(autoSearch, searchButton.nextSibling); | |
var countDown = document.createElement('span'); | |
autoSearch.parentNode.insertBefore(countDown, autoSearch.nextSibling); | |
var timer, countDownTimer; | |
autoSearch.addEventListener('click', function() { | |
var ids, count = 0; | |
if(timer) { | |
clearInterval(timer); | |
clearInterval(countDownTimer); | |
timer = null; | |
autoSearch.value = "自動検索開始"; | |
countDown.innerText = ''; | |
} else { | |
var interval = prompt('更新間隔を秒単位で指定してください'); | |
autoSearch.value = "自動検索停止"; | |
ids = {}; | |
$(ALL_CHOICES, function(elem) { | |
ids[elem.id] = true; | |
}); | |
timer = setInterval(doAutoSearch, interval * 1000); | |
countDownTimer = setInterval(doCountDown, 1000); | |
countDown.innerText = interval; | |
doAutoSearch(); | |
} | |
function doAutoSearch() { | |
count = interval; | |
var results = document.getElementById('results'); | |
results.innerHTML = ''; | |
var e = document.createEvent("MouseEvents"); | |
e.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, | |
false, false, false, 0, null); | |
searchButton.dispatchEvent(e); | |
setTimeout(function move() { | |
var items = []; | |
$(ALL_RESULTS, function(elem) { | |
items.push(elem); | |
}); | |
if(items.length==0) { | |
setTimeout(move, 1000); | |
return ; | |
} | |
var choices = document.getElementById('choices'); | |
items.reverse(); | |
items.forEach(function(elem) { | |
if(ids[elem.id]) return ; | |
choices.appendChild(elem); | |
ids[elem.id] = true; | |
}); | |
results.innerHTML = ''; | |
}, 1000); | |
} | |
function doCountDown() { | |
count--; | |
countDown.innerText = count; | |
} | |
}); | |
})(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment