Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save saitamanodoruji/2490286 to your computer and use it in GitHub Desktop.
Save saitamanodoruji/2490286 to your computer and use it in GitHub Desktop.
ReblogCommandWithSelectablePostState
// ==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(/&lt;/g, '<')
.replace(/&gt;/g, '>')
.replace(/&amp;/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