Created
February 24, 2012 12:26
-
-
Save saitamanodoruji/1900644 to your computer and use it in GitHub Desktop.
ReblogCommandWithQueue
This file contains hidden or 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 ReblogCommandWithQueue | |
// @namespace http://white.s151.xrea.com/ | |
// @include http://* | |
// @include https://* | |
// @exclude http://www.tumblr.com/share | |
// ==/UserScript== | |
// origin: | |
// -http://white.s151.xrea.com/blog/2008-02-29-11-50.html | |
// -http://coderepos.org/share/browser/lang/javascript/userscripts/reblogcommand.user.js? | |
// modified by saitamanodoruji on 2012-02-24 | |
(function() { | |
const ALLOW_OWN_DOMAIN = true; | |
function toggleQueue() { | |
var d = new Date(); | |
if (GM_getValue('ReblogCommand.addToQueue', false) === false) { | |
GM_setValue('ReblogCommand.addToQueue', true); | |
window.Minibuffer.status(d.getTime, 'Queue ON', 100); | |
} else if (GM_getValue('ReblogCommand.addToQueue', false) === true) { | |
GM_setValue('ReblogCommand.addToQueue', false); | |
window.Minibuffer.status(d.getTime, 'Queue OFF', 100); | |
} | |
} | |
window.Minibuffer.addShortcutkey({ | |
key: 'E', | |
description: 'toggle queue setting', | |
command: function() { toggleQueue(); } | |
}); | |
GM_registerMenuCommand('ReblogCommand - toggle queue', toggleQueue, 'q'); | |
var boot = function() { | |
var $X = window.Minibuffer.$X; | |
var D = window.Minibuffer.D; | |
var createDocumentFromString = window.Minibuffer.createDocumentFromString; | |
// ---------------------------------------------------------------------------- | |
// Reblog | |
// ---------------------------------------------------------------------------- | |
function isTumblrDashboardURL(url) { | |
return url.match("^http://www\\.tumblr\\.com/dashboard") ? true : false; | |
} | |
function isTumblrUserURL(url) { | |
return url.match("^https?://[^.]+\\.tumblr\\.com/post/(\\d+)") || | |
// tumblr allow to use own domain. but this is risky. | |
// $X('id("tumblr_controls")[self::iframe]', Boolean) | |
(ALLOW_OWN_DOMAIN && url.match("^https?://[^/]+/post/(\\d+)")) ? true : false; | |
} | |
function isLdrOrFldrURL(url) { | |
return url.indexOf('http://reader.livedoor.com/reader/') == 0 || | |
url.indexOf('http://reader.livedoor.com/public/') == 0 || | |
url.indexOf('http://fastladder.com/reader/') == 0 || | |
url.indexOf('http://fastladder.com/public/') == 0; | |
} | |
function getIDByPermalink(url) { | |
if (isTumblrUserURL(url)) { | |
return RegExp.$1; | |
} | |
// return what ? | |
return false; | |
} | |
function getURLByID(id, token) { | |
if (token) return "http://www.tumblr.com/reblog/" + id + "/" + token + "?redirect_to=/dashboard"; | |
return "http://www.tumblr.com/reblog/" + id; | |
} | |
// copy from tombloo | |
function unescapeHTML(s) { | |
return s.replace(/"/g, '"') | |
.replace(/</g, '<') | |
.replace(/>/g, '>') | |
.replace(/&/g, '&'); | |
} | |
// copy from tombloo | |
function getReblogToken(url) { | |
url = unescapeHTML(url); | |
if (/&pid=([^&]*)&rk=([^&"]*)/.test(url) || /\/reblog\/([^\/]+)\/([^?]*)/.test(url)) | |
return { | |
id : RegExp.$1, | |
token : RegExp.$2 | |
}; | |
} | |
function parseParams(doc) { | |
// name() returns in lower case on fx3.6 | |
var elms = $X('id("edit_post")//*[translate(name(),"input", "INPUT") ="INPUT" or translate(name(),"textarea", "TEXTAREA")="TEXTAREA" or translate(name(),"select", "SELECT")="SELECT"]', doc); | |
var params = {}; | |
elms.forEach(function(elm) { | |
params[elm.name] = elm.value; | |
}); | |
if (params['post[promotion_type]']) | |
delete params['post[promotion_type]']; | |
if (GM_getValue('ReblogCommand.addToQueue', false) === true) | |
params['post[state]'] = 2; | |
return params; | |
} | |
function createPostData(params) { | |
var arr = []; | |
for (var param in params) { | |
if (param != "preview_post" && param != "send_to_twitter") { | |
arr.push(encodeURIComponent(param)); | |
arr.push("="); | |
arr.push(encodeURIComponent(params[param])); | |
arr.push("&"); | |
} | |
} | |
return arr.join(''); | |
} | |
function reblog(aURL) { | |
var id = getIDByPermalink(aURL); | |
var d; | |
with (D()) { | |
d = Deferred(); | |
if (!id) { | |
wait(0).next(function() { d.call(); }); | |
return d; | |
} | |
} | |
window.Minibuffer.status('ReblogCommand'+id, 'Reblog ...'); | |
d = D(); | |
var url = aURL; | |
var reblogd = d.xhttp.get(url). | |
next(function(res) { | |
var token = getReblogToken(res.responseText.match('iframe src="((?:\\"|[^"])*)"')[1]); | |
url = getURLByID(token.id, token.token); | |
return d.xhttp.get(url); | |
}). | |
next(function(res) { | |
var params = parseParams( createDocumentFromString(res.responseText)); | |
if (!params.form_key) | |
reblogd.fail("invalid reblog params."); | |
return d.xhttp.post(url, createPostData(params)); | |
}). | |
next(function(res) { | |
if ( ! res.finalUrl.match( /^http:\/\/www\.tumblr\.com\/dashboard/ ) ) | |
reblogd.fail("reblog failed."); | |
window.Minibuffer.status('ReblogCommand'+id, 'Reblog ... done.', 100); | |
d.call(); | |
}). | |
error(function(e) { | |
var message = e.message || e; | |
if (confirm(message + '\nreblog manually ? \n' + url)) reblogManually(url); | |
d.call(); | |
}); | |
return d; | |
} | |
function reblogManually(aURL) { | |
var url = aURL; | |
var d = D(); | |
d.xhttp.get(url). | |
next(function(res) { | |
var token = getReblogToken(res.responseText.match('iframe src="((?:\\"|[^"])*)"')[1]); | |
url = getURLByID(token.id, token.token); | |
GM_openInTab(url); | |
}); | |
} | |
function spClearPins(url) { | |
unsafeWindow.pin.remove(url); | |
} | |
// ---------------------------------------------------------------------------- | |
// Command | |
// ---------------------------------------------------------------------------- | |
function getTargetCommand() { | |
var target_cmd = ''; | |
if (isLdrOrFldrURL(window.location.href)) { | |
target_cmd = 'pinned-or-current-link'; | |
} else if (isTumblrUserURL(window.location.href)) { | |
target_cmd = 'location'; | |
} else if (window.LDRize) { | |
target_cmd = 'pinned-or-current-link'; | |
} else { | |
target_cmd = 'location'; | |
} | |
return target_cmd; | |
} | |
window.Minibuffer.addShortcutkey({ | |
key: 't', | |
description: 'Reblog', | |
command: function() { | |
var target_cmd = getTargetCommand(); | |
var clear_pin = ''; | |
if (isLdrOrFldrURL(window.location.href)) { | |
if (!window.Minibuffer.execute('pinned-or-current-link').filter(isTumblrUserURL).length) { | |
target_cmd = 'current-link'; | |
clear_pin = ''; | |
} else { | |
clear_pin = '-c'; | |
} | |
} else { | |
clear_pin = (target_cmd == 'pinned-or-current-link') ? ' | clear-pin' : ''; | |
} | |
window.Minibuffer.execute(target_cmd + ' | reblog ' + clear_pin); | |
}}); | |
window.Minibuffer.addShortcutkey({ | |
key: 'T', | |
description: 'Reblog manually', | |
command: function() { | |
var target_cmd = getTargetCommand(); | |
var clear_pin = (target_cmd == 'pinned-or-current-link') ? ' | clear-pin' : ''; | |
window.Minibuffer.execute(target_cmd + ' | reblog -m' + clear_pin ); | |
}}); | |
window.Minibuffer.addCommand({ | |
name: 'reblog', | |
command: function(stdin) { | |
var args = this.args; | |
var urls = []; | |
if (!stdin.length) { | |
if (isTumblrDashboardURL(window.location.href.toString())) { | |
var link = window.Minibuffer.execute('current-link'); | |
if (link) urls = [link.toString()]; | |
} else { | |
// command line is just 'reblog' | |
urls = [window.location.href]; | |
} | |
} else if (isLdrOrFldrURL(window.location.href)) { | |
var tmp = []; | |
stdin.forEach(function(url, index) { tmp[index] = url; }); | |
urls = tmp; | |
} else if (stdin.every(function(a) { return typeof a == 'string' })) { | |
// command line is 'location | reblog' | |
urls = stdin; | |
} else if (stdin.every(function(a) { return a && a.nodeName == 'A'; })) { | |
// command line is 'pinned-or-current-link | reblog' | |
urls = stdin.map(function(node) { return node.href; }); | |
} | |
// reblog | |
if (args.length == 1 && args[0] == '-m') { | |
urls.forEach(reblogManually); | |
} else { | |
urls = urls.filter(isTumblrUserURL); | |
if (isLdrOrFldrURL(window.location.href) && args.length == 1 && args[0] == '-c') { | |
urls.forEach(spClearPins); | |
} | |
if (!urls.length) return stdin; | |
var lst = urls.map(reblog); | |
if (lst.length > 1) { | |
with (D()) { | |
parallel(lst).wait(2). | |
next(function() { window.Minibuffer.status('ReblogCommand','Everything is OK', 1000); }); | |
} | |
} | |
} | |
return stdin; | |
} | |
}); | |
}; | |
if (document.body.id == 'tinymce') | |
return; | |
if (window.Minibuffer) { | |
boot(); | |
} else { | |
window.addEventListener('GM_MinibufferLoaded', boot, false); | |
} | |
})(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment