summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--Makefile1
-rw-r--r--pentadactyl/plugins/pinboard.js77
-rw-r--r--pentadactylrc2
4 files changed, 81 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index 9e30ce2..981a64c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -37,3 +37,4 @@ mutt/aliases
mutt/extra
mutt/cache
fortune/*.dat
+pentadactyl/info
diff --git a/Makefile b/Makefile
index e4a2113..e3cf615 100644
--- a/Makefile
+++ b/Makefile
@@ -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; }