Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save Epictetus/755545 to your computer and use it in GitHub Desktop.
Save Epictetus/755545 to your computer and use it in GitHub Desktop.
// ==UserScript==
// @name Share2chOnTumblr
// @namespace http://saitamanodoruji.tumblr.com/
// @description Share 2ch conversation on Tumblr as Quote
// @include http://*.2ch.net/test/read.cgi/*
// @include http://*.2ch.net/*/kako/*
// @include http://*.bbspink.com/test/read.cgi/*
// @include http://jbbs.livedoor.jp/bbs/read.cgi/*
// @include http://jbbs.livedoor.jp/*/*/*/*.html
// @include http://p2.chbox.jp/read.php?url=http://*.2ch.net/test/read.cgi/*
// @include http://mimizun.com/*
// @version 0.1.0.20100329
// ==/UserScript==
//
// 必要なもの:
// LDRize http://coderepos.org/share/browser/lang/javascript/userscripts/ldrize.user.js?
// Minibuffer http://coderepos.org/share/browser/lang/javascript/userscripts/minibuffer.user.js?
//
// 使い方:
// 1. 2ちゃんねるのスレを開く
// 2. j、k で Quote したいレスを選んで p で pin する
// 3. ショートカットキーの q を押すか、Alt + x で Minibuffer を開いて
// pinned-or-current-node|share2chontumblr|clear-pin と入れて Enter を押す
// 4. pin したレスがまとまって 1 個の Quote ポストになる
//
// reference:
// ShareTwitterOnTumblr by snj14 http://white.s151.xrea.com/blog/2008-03-02-09-30.html
// 2ch.extractor.js by ku http://gist.github.com/123087
// 設定:
// ------------------------------------------------------------------
const SHARE2CHONTUMBLR_QUOTE_FORMAT = 0;
// quote の形式
// 0: HTML
// 1: plain text
// 2: HTML (2ch.extractor.js 方式)
//
const SHARE2CHONTUMBLR_POST_STATE = 0;
// 公開設定
// 0: publish now
// 1: save as draft
// 2: add to queue
// 3: private
//
const SHARE2CHONTUMBLR_ALLOW_PHOTO_REPLIES = 0;
// photo reply の許可
// 0: 不許可
// 1: 許可
// ------------------------------------------------------------------
(function(){
var $X = window.Minibuffer.$X
var D = window.Minibuffer.D
var status = window.Minibuffer.status
var createDocumentFromString = window.Minibuffer.createDocumentFromString
function getSource(url){with(D()){return xhttp.get(url)}}
function postData(url, aData){with(D()){return xhttp.post(url, aData)}}
function createBody(stdin) {
var res = [];
var dt = [];
var dd = [];
switch(SHARE2CHONTUMBLR_QUOTE_FORMAT) {
case 0:
for (i = 0; i < stdin.length; i++) {
dt[i] = '<dt>' + stdin[i].innerHTML + '</dt>';
dd[i] = '<dd>' + $X('./following-sibling::dd[not(contains(concat(" ", @class, " "), " respopup "))]', stdin[i])[0].innerHTML.replace(/<br>/g, '<br />') + '</dd>';
res[i] = [dt[i], dd[i]].join('');
}
break;
case 1:
for (i = 0; i < stdin.length; i++) {
dt[i] = stdin[i].textContent;
dd[i] = $X('./following-sibling::dd[not(contains(concat(" ", @class, " "), " respopup "))]', stdin[i])[0].innerHTML.replace(/<br>/g, '\n').replace(/<[^>]+>/g, '');
res[i] = [dt[i], dd[i]].join('\n');
}
break;
case 2:
for (i = 0; i < stdin.length; i++) {
dt[i] = stdin[i].textContent;
dd[i] = $X('./following-sibling::dd[not(contains(concat(" ", @class, " "), " respopup "))]', stdin[i])[0].innerHTML;
res[i] = [dt[i], dd[i]].join('<br />');
}
break;
}
return encodeURIComponent(res.join(''));
}
function createSource(stdin) {
var resNums = [];
for (i = 0; i < stdin.length; i++) {
try {
resNums[i] = stdin[i].innerHTML.match(/^\s*(\d+)/)[1];
} catch(e) {}
}
var resRange = '';
if(resNums.length > 1) {
resNums.sort(function(a, b) { return a - b });
resRange = resNums[0] + '-' + resNums[resNums.length - 1];
} else if(resNums.length == 1) {
resRange = resNums[0];
}
try{
var url = document.location.toString()
.match(/^(?:http:\/\/p2\.chbox\.jp\/read\.php\?url=)?http:\/\/[^.]+\.(?:2ch\.net|bbspink\.com)\/test\/read\.cgi\/[^\/]+\/\d+/)[0]
+ '/' + resRange;
} catch(e) {
var url = document.location.toString();
}
return encodeURIComponent('<a href="' + url + '">' + document.title + '</a>')
}
function parseParams(doc){
var elms = $X('id("edit_post")//*[name()="input" or name()="textarea" or name()="select"]', doc);
var params = {};
elms.forEach(function(elm){
if(elm.nodeName == 'INPUT' && elm.type=="checkbox" && !elm.checked) {
params[elm.name] = '';
} else {
params[elm.name] = elm.value;
}
});
return params;
}
function createPostData(params, body, source){
var arr = [];
var param;
var postState = [0, 1, 2, 'private'];
for(param in params){
if(param != "preview_post"){
arr.push(encodeURIComponent(param));
arr.push("=");
if(param == "post[one]") {
arr.push(body);
} else if(param == "post[two]") {
arr.push(source);
} else if(param == "post[state]") {
arr.push(postState[SHARE2CHONTUMBLR_POST_STATE]);
} else if(param == "allow_photo_replies" && SHARE2CHONTUMBLR_ALLOW_PHOTO_REPLIES) {
arr.push("on");
} else {
arr.push(encodeURIComponent(params[param]));
}
arr.push("&");
}
}
return arr.join('')
}
function share(body, source){
var url = "http://www.tumblr.com/new/quote";
getSource(url).
next(function(res){
return postData(url, createPostData( parseParams( createDocumentFromString(res.responseText)), body, source))
}).
error(function(arg){
console.log('error',arg);
});
}
window.Minibuffer.addCommand({
name: 'share-2ch-on-tumblr',
command: function(stdin) {
if(!stdin.length){
status('Share2chOnTumblr', 'no item', 100);
} else {
var body = createBody(stdin);
var source = createSource(stdin);
var time = new Date().getTime();
with(D()){
next(function() {
share(body, source);
})
.next(function(res){
status('Share2chOnTumblr'+time, 'Share', 100);
})
}
}
return stdin;
}
});
window.Minibuffer.addShortcutkey({
key: 'q',
description: 'Share2chOnTumblr',
command : function(){
Minibuffer.execute('pinned-or-current-node|share-2ch-on-tumblr|clear-pin');
}
});
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment