Instantly share code, notes, and snippets.
Forked from saitamanodoruji/share2chontumblr.user.js
Created
December 26, 2010 18:22
-
Star
0
(0)
You must be signed in to star a gist -
Fork
0
(0)
You must be signed in to fork a gist
-
Save Epictetus/755545 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 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