Skip to content

Instantly share code, notes, and snippets.

@shogo82148
Created October 13, 2012 08:37
Show Gist options
  • Save shogo82148/3883841 to your computer and use it in GitHub Desktop.
Save shogo82148/3883841 to your computer and use it in GitHub Desktop.
半自動トゥギャりスクリプト
// ==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