Created
April 25, 2012 14:47
-
-
Save saitamanodoruji/2490286 to your computer and use it in GitHub Desktop.
ReblogCommandWithSelectablePostState
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 ReblogCommandWithSelectablePostState | |
// @description post_state を publish now, save as draft, add to queue, private から選べる ReblogCommand | |
// @namespace http://white.s151.xrea.com/ | |
// @include http://* | |
// @include https://* | |
// @exclude http://www.tumblr.com/share | |
// @version 0.36509.6 | |
// ==/UserScript== | |
// Shift + E で post_state を変える | |
// origin: | |
// -http://white.s151.xrea.com/blog/2008-02-29-11-50.html | |
// -http://coderepos.org/share/browser/lang/javascript/userscripts/reblogcommand.user.js? | |
// modifications made by saitamanodoruji | |
// 2012-02-24 queue | |
// 2012-03-14 reblog text as text (not link) on /dashboard and /show | |
// 2012-04-25 use sharedObject.Minibuffer if exists | |
// 2012-05-09 use sharedObject.Minibuffer only | |
// 2012-06-30 to be able to reblog posts by david | |
// 2013-01-08 reblog first-post long text as quote on /dashboard and /show | |
// 2013-01-25 remove E4X for Firefox 18 | |
(function() { | |
const ALLOW_OWN_DOMAIN = true; | |
var boot = function() { | |
var postStateNum; | |
var postStateValues = [0, 1, 2, 'private']; | |
var postStateStrings = ['publish now', 'save as draft', 'add to queue', 'private']; | |
function changePostState() { | |
var s = (GM_getValue('ReblogCommand.postState', 0) + 1) % 4; | |
GM_setValue('ReblogCommand.postState', s); | |
if(document.getElementById('reblogcommand_post_state_indicator')) | |
document.getElementById('reblogcommand_post_state_indicator').innerHTML = s; | |
sharedObject.Minibuffer.status('ReblogCommand - change post state', 'post state: ' + postStateStrings[s], 200); | |
} | |
GM_registerMenuCommand('ReblogCommand - change post state', changePostState, 'c'); | |
sharedObject.Minibuffer.addShortcutkey({ | |
key: 'E', | |
description: 'change post state of ReblogCommand', | |
command: function() { changePostState(); } | |
}); | |
if (isTumblrDashboardURL(window.location.href.toString()) | |
|| window.location.href.toString().match(/^http:\/\/www\.tumblr\.com\/(?:blog|show)/)) { | |
var postStateIndicator = document.createElement('div'); | |
postStateIndicator.id = 'reblogcommand_post_state_indicator'; | |
postStateIndicator.innerHTML = GM_getValue('ReblogCommand.postState', 0); | |
document.body.appendChild(postStateIndicator); | |
GM_addStyle([ | |
'#reblogcommand_post_state_indicator {', | |
'position: fixed;', | |
'right: 3px;', | |
'top: 26px;', | |
'z-index: 1000;', | |
'color: #666;', | |
'width: 11px;', | |
'font: bold 13px "Helvetica Neue","HelveticaNeue",Helvetica,Arial,sans-serif;', | |
'padding: 0;', | |
'text-align: center;', | |
'color: rgba(255, 255, 255, 0.5);', | |
'-moz-border-radius: 2px 2px 2px 2px;', | |
'background-color: rgba(130, 139, 152, 0.65);', | |
'}', | |
].join('')); | |
} | |
var $X = sharedObject.Minibuffer.$X; | |
var D = sharedObject.Minibuffer.D; | |
var createDocumentFromString = sharedObject.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?://(?:www\.davidslog\.com|[^/]+/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; | |
}); | |
return params; | |
} | |
function createPostData(params) { | |
var arr = []; | |
for (var param in params) { | |
if (!/(?:preview_post|send_to_twitter|post\[promotion_type\]|post\[highlight\]|post\[typekit\])/.test(param)) { | |
arr.push(encodeURIComponent(param)); | |
arr.push("="); | |
if ( param == 'post[state]' ) { | |
arr.push(encodeURIComponent(postStateValues[postStateNum])); | |
} else { | |
arr.push(encodeURIComponent(params[param])); | |
} | |
arr.push("&"); | |
} | |
} | |
return arr.join(''); | |
} | |
function reblog(aURL) { | |
var id = getIDByPermalink(aURL.url); | |
var d; | |
with (D()) { | |
d = Deferred(); | |
if (!id) { | |
wait(0).next(function() { d.call(); }); | |
return d; | |
} | |
} | |
sharedObject.Minibuffer.status('ReblogCommand'+id, 'Reblog ...'); | |
d = D(); | |
var url = aURL.url; | |
var type = aURL.type; | |
var is_reblog = aURL.is_reblog; | |
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 doc = createDocumentFromString(res.responseText); | |
var reblog_type = doc.querySelector('#edit_post').className; | |
var params = parseParams(doc); | |
if (!params.form_key) { | |
reblogd.fail("invalid reblog params."); | |
} else { | |
if (/regular/.test(type) && /link_post/.test(reblog_type)) { | |
if (is_reblog) | |
url = url.replace(/(\?redirect)/, "/text$1"); | |
else | |
url = url.replace(/(\?redirect)/, "/quote$1"); | |
return d.xhttp.get(url). | |
next(function(res){ | |
params = parseParams(createDocumentFromString(res.responseText)); | |
return d.xhttp.post(url, createPostData(params)); | |
}); | |
} else { | |
return d.xhttp.post(url, createPostData(params)); | |
} | |
} | |
}). | |
next(function(res) { | |
if ( ! res.finalUrl.match( /^http:\/\/www\.tumblr\.com\/dashboard/ ) ) | |
reblogd.fail("reblog failed."); | |
sharedObject.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, true); | |
}); | |
} | |
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 (sharedObject.LDRize) { | |
target_cmd = 'pinned-or-current-link'; | |
} else { | |
target_cmd = 'location'; | |
} | |
return target_cmd; | |
} | |
sharedObject.Minibuffer.addShortcutkey({ | |
key: 't', | |
description: 'Reblog', | |
command: function() { | |
var target_cmd = getTargetCommand(); | |
var clear_pin = ''; | |
if (isLdrOrFldrURL(window.location.href)) { | |
if (!sharedObject.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' : ''; | |
} | |
sharedObject.Minibuffer.execute(target_cmd + ' | reblog ' + clear_pin); | |
}}); | |
sharedObject.Minibuffer.addShortcutkey({ | |
key: 'T', | |
description: 'Reblog manually', | |
command: function() { | |
var target_cmd = getTargetCommand(); | |
var clear_pin = (target_cmd == 'pinned-or-current-link') ? ' | clear-pin' : ''; | |
sharedObject.Minibuffer.execute(target_cmd + ' | reblog -m' + clear_pin ); | |
}}); | |
sharedObject.Minibuffer.addCommand({ | |
name: 'reblog', | |
command: function(stdin) { | |
var args = this.args; | |
var urls = []; | |
var types = []; | |
var is_reblogs = []; | |
postStateNum = GM_getValue('ReblogCommand.postState', 0); | |
if (isTumblrDashboardURL(window.location.href.toString()) | |
|| window.location.href.toString().match(/^http:\/\/www\.tumblr\.com\/(?:show|likes)/)) { | |
types = stdin.map(function(s) { | |
var li = $X('./ancestor::li[starts-with(@id, "post_")]', s)[0]; | |
return li.getAttribute('class').match(/\s(regular|quote|photo|link|video|conversation|audio)\s/)[1]; | |
}); | |
is_reblogs = stdin.map(function(s) { | |
var li = $X('./ancestor::li[starts-with(@id, "post_")]', s)[0]; | |
return li.getAttribute('class').match(/(?:^|\s)is_reblog(?:$|\s)/) ? true : false; | |
}); | |
} | |
if (!stdin.length) { | |
if (isTumblrDashboardURL(window.location.href.toString())) { | |
var link = sharedObject.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 { | |
if (isTumblrDashboardURL(window.location.href.toString()) | |
|| window.location.href.toString().match(/^http:\/\/www\.tumblr\.com\/show/)) { | |
types = types.filter(function(type, index) { return isTumblrUserURL(urls[index]); }); | |
is_reblogs = is_reblogs.filter(function(is_reblog, index) { return isTumblrUserURL(urls[index]); }); | |
} | |
urls = urls.filter(isTumblrUserURL); | |
if (isLdrOrFldrURL(window.location.href) && args.length == 1 && args[0] == '-c') { | |
urls.forEach(spClearPins); | |
} | |
if (!urls.length) return stdin; | |
urls = urls.map(function(url, index) { | |
return { 'url' : url, | |
'type' : types[index] || '', | |
'is_reblog' : is_reblogs[index], }; | |
}); | |
var lst = urls.map(reblog); | |
if (lst.length > 1) { | |
with (D()) { | |
parallel(lst).wait(2). | |
next(function() { sharedObject.Minibuffer.status('ReblogCommand','Everything is OK', 1000); }); | |
} | |
} | |
} | |
return stdin; | |
} | |
}); | |
}; | |
if (document.body.id == 'tinymce') | |
return; | |
if ( sharedObject.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