NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// Copyright (c) Nicolas Hoizey 2015 // Released under the MIT license // // PinboardInGoogle // userscript to show your Pinboard bookmarks alongside Google Search results // https://github.com/nhoizey/PinboardInGoogle/ // // Author // Nicolas Hoizey <nicolas@hoizey.com> // // -------------------------------------------------------------------- // This is a UserScript. // // To install it on Firefox, you need the Greasemonkey addon: // http://greasemonkey.mozdev.org/ // Nothing is needed to install it on Chrome // -------------------------------------------------------------------- // // ==UserScript== // @name PinboardInGoogle // @description shows your Pinboard bookmarks before Google Search results // @icon https://pinboard.in/bluepin.gif // @namespace com.gasteroprod.lab // @version 1.3 // @downloadURL https://github.com/nhoizey/PinboardInGoogle/raw/master/PinboardInGoogle.user.js // @include http://www.google.*/* // @include https://www.google.*/* // @require https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js // @grant GM_xmlhttpRequest // ==/UserScript== (function(w, d) { var msg = '', html = '', queryStr = '', jsonUrl = '', jsonData = ''; function handleSearch() { // Get the query value queryStr = d.querySelector('form[role=search] input[name=q]').value; if (undefined !== queryStr) { // Translate the query string to a list of tags queryStr = queryStr.replace(/[^\w]/g, " "); queryStr = queryStr.replace(/ +/g, " "); queryStr = queryStr.replace(/^ | $/g, ""); // Generate Pinboard API JSON URL // https://feeds.pinboard.in/json/v1/u:nhoizey/t:24-70mm/t:canon?count=20 queryStr = queryStr.replace(/\s*(\w+)\s*/g, "/t:$1"); jsonUrl = 'https://feeds.pinboard.in/json/v1/u:nhoizey' + queryStr; jsonData = 'count=20'; // todo: doesn't seem to work // Request the API GM_xmlhttpRequest({ method: 'GET', url: jsonUrl, data: jsonData, timeout: 10000, // 10 seconds headers: { 'User-Agent': 'PinboardInGoogle', 'Accept': 'application/json' }, onload: function(responseDetails) { parseFeed(responseDetails); }, onerror: function(responseDetails) { // Show the error message console.log('error…'); } }); } } function parseFeed(responseDetails) { var bookmarks = JSON.parse(responseDetails.response), nb = bookmarks.length, max = Math.min(nb, 20); if (nb > 0) { // Create the results container $('#res').prepend('<div id="PinboardInGoogle" class="small"></div>'); // Add some style to it $('head').append('\ <style>\ #PinboardInGoogle { background-color: #eee; padding: .2em; margin-bottom: 1em; }\ #PinboardInGoogle p { margin: .5em 0; }\ #PinboardInGoogle p.title { color: #aaa; padding-left: 20px; background: url(https://pinboard.in/bluepin.gif) left center no-repeat; }\ #PinboardInGoogle .how { float: right; font-size: .8em; }\ #PinboardInGoogle.small li:nth-child(n+4) { display: none; }\ </style>' ); html = '<p class="title">Pinboard bookmarks <a class="how" href="https://github.com/nhoizey/PinboardInGoogle">how does it work?</a></p>'; html += '<ol>'; for (var i = 0; i < max; i++) { html += '<li class="g"><div class="rc">'; html += '<h3 class="r"><a href="' + bookmarks[i].u + '">' + bookmarks[i].d + '</a></h3>'; html += '<div class="f slp">' + bookmarks[i].t.join(', ') + '</div>'; html += '<span class="st">' + bookmarks[i].n + '</span>'; html += '</li>'; } html += '</ol><p>'; if (nb > 3) { html += '<a class="more" href="" onclick="document.querySelector(\'#PinboardInGoogle\').className=\'\'; t = document.querySelector(\'#PinboardInGoogle .more\'); t.parentNode.removeChild(t); return false;">+ show more</a>'; } html += ' '; html += '<a href="https://pinboard.in/u:nhoizey' + queryStr + '" style="float: right;">these bookmarks on Pinboard</a>'; html += '</p>'; } $('#PinboardInGoogle').html(html); } $(document.querySelector('form[role=search] input[name=q]')).on('change', handleSearch); handleSearch(); })(window, document);