Skip to content

Instantly share code, notes, and snippets.

Created July 26, 2014 01:08
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/ebd945b74e758d19591c to your computer and use it in GitHub Desktop.
Save anonymous/ebd945b74e758d19591c to your computer and use it in GitHub Desktop.
Pinboard.js for Vimperator
(function() {
function buildURL(url, queries) {
var result = [url];
for (var i = 0; i < queries.length; i++)
if (queries[i][1])
result.push('&', queries[i][0], '=', encodeURIComponent(queries[i][1]));
return result.join("");
}
function httpPost(url, callback) {
try {
let xmlhttp = new XMLHttpRequest();
if (callback)
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4)
callback(xmlhttp);
}
xmlhttp.open('POST', url, !!callback);
xmlhttp.send(null);
return xmlhttp;
} catch (e) {
liberator.log('Error opening ' + url + ': ' + e, 1);
}
}
commands.addUserCommand(['pin[board]'], 'Bookmark page at pinboard.in', function(args) {
var url = buffer.URL;
var description = args['-description'] || buffer.title || url;
var note = args['-note'] || String(window.content.getSelection());
var shared = args['-private'] ? 'no' : null;
httpPost(buildURL('https://api.pinboard.in/v1/posts/add?',
[['url', url],
['description', description],
['extended', note],
['tags', args.join(" ")],
['shared', shared]]), function(xhr) {
var result = xhr.status == 200 ?
xhr.responseXML.documentElement.getAttribute('code') :
'failed with status ' + xhr.status;
liberator.echo('Bookmarking ' + url + ' at pinboard.in ' + result);
});
}, {
argCount: '*',
options: [[['-description', '-d'], commands.OPTION_STRING, null, function() [[buffer.title]]],
[['-note', '-n'], commands.OPTION_STRING, null, null],
[['-private', '-p'], commands.OPTION_NOARG]],
completer: function(context) {
if (context.result) {
context.completions = context.result;
return;
}
context.title = ['Tags', 'Type'];
context.incomplete = true;
var xhr = util.httpGet(buildURL('https://api.pinboard.in/v1/posts/suggest?',
[['url', buffer.URL]]), function(xhr) {
context.incomplete = false;
if (xhr.status != 200) {
context.completions = context.result = [];
return;
}
var result = [];
var tags = xhr.responseXML.documentElement.getElementsByTagName('*');
for (var i = 0; i < tags.length; i++)
result.push([tags[i].textContent, tags[i].localName]);
context.completions = context.result = result;
});
context.cancel = function() xhr.abort();
}
}, true);
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment