diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | Makefile | 1 | ||||
-rw-r--r-- | pentadactyl/plugins/pinboard.js | 77 | ||||
-rw-r--r-- | pentadactylrc | 2 |
4 files changed, 81 insertions, 0 deletions
@@ -37,3 +37,4 @@ mutt/aliases mutt/extra mutt/cache fortune/*.dat +pentadactyl/info @@ -33,6 +33,7 @@ INSTALL = abcde.conf \ ncmpc \ newsbeuter \ procmail \ + pentadactyl \ re.pl \ services \ ssh \ diff --git a/pentadactyl/plugins/pinboard.js b/pentadactyl/plugins/pinboard.js new file mode 100644 index 0000000..c183232 --- /dev/null +++ b/pentadactyl/plugins/pinboard.js @@ -0,0 +1,77 @@ +(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) { + dactyl.log('Error opening ' + url + ': ' + e, 1); + } + } + group.commands.add(['p[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; + dactyl.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); + +})(); diff --git a/pentadactylrc b/pentadactylrc index 08f238e..e409b2d 100644 --- a/pentadactylrc +++ b/pentadactylrc @@ -36,6 +36,8 @@ noremap gg mpgg noremap G mpG map `` `p +map , :pb + " no beeps javascript dactyl.beep = function() { return false; } |