Instantly share code, notes, and snippets.
Last active
October 8, 2017 00:01
-
Save btel/5813784 to your computer and use it in GitHub Desktop.
Open IPython notebook from Github in NBViewer
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==UserScript== | |
// @name NBViewer GitHub Button | |
// @description Open IPython notebook from Github in NBViewer | |
// @version 0.12 | |
// @namespace http://telenczuk.pl | |
// @grant none | |
// @include http*://github.com/* | |
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js | |
// ==/UserScript== | |
// converted from bookmarklet implemented by Matt Davis jiffyclub | |
// conversion to GreaseMonkey script by Bartosz Telenczuk | |
// waitForKeyElements function by Brock Adams | |
// http://stackoverflow.com/questions/8281441/fire-greasemonkey-script-on-ajax-request | |
this.$ = this.jQuery = jQuery.noConflict(true); | |
function waitForKeyElements ( | |
selectorTxt, /* Required: The jQuery selector string that | |
specifies the desired element(s). | |
*/ | |
actionFunction, /* Required: The code to run when elements are | |
found. It is passed a jNode to the matched | |
element. | |
*/ | |
bWaitOnce, /* Optional: If false, will continue to scan for | |
new elements even after the first match is | |
found. | |
*/ | |
iframeSelector /* Optional: If set, identifies the iframe to | |
search. | |
*/ | |
) | |
{ | |
var targetNodes, btargetsFound; | |
if (typeof iframeSelector == "undefined") | |
targetNodes = $(selectorTxt); | |
else | |
targetNodes = $(iframeSelector).contents () | |
.find (selectorTxt); | |
if (targetNodes && targetNodes.length > 0) { | |
/*--- Found target node(s). Go through each and act if they | |
are new. | |
*/ | |
targetNodes.each ( function () { | |
var jThis = $(this); | |
var alreadyFound = jThis.data ('alreadyFound') || false; | |
if (!alreadyFound) { | |
//--- Call the payload function. | |
actionFunction (jThis); | |
jThis.data ('alreadyFound', true); | |
} | |
} ); | |
btargetsFound = true; | |
} | |
else { | |
btargetsFound = false; | |
} | |
//--- Get the timer-control variable for this selector. | |
var controlObj = waitForKeyElements.controlObj || {}; | |
var controlKey = selectorTxt.replace (/[^\w]/g, "_"); | |
var timeControl = controlObj [controlKey]; | |
//--- Now set or clear the timer as appropriate. | |
if (btargetsFound && bWaitOnce && timeControl) { | |
//--- The only condition where we need to clear the timer. | |
clearInterval (timeControl); | |
delete controlObj [controlKey] | |
} | |
else { | |
//--- Set a timer, if needed. | |
if ( ! timeControl) { | |
timeControl = setInterval ( function () { | |
waitForKeyElements ( selectorTxt, | |
actionFunction, | |
bWaitOnce, | |
iframeSelector | |
); | |
}, | |
500 | |
); | |
controlObj [controlKey] = timeControl; | |
} | |
} | |
waitForKeyElements.controlObj = controlObj; | |
} | |
function getUrl() { | |
// here goes the code of the bookmarklet | |
date=new Date(); | |
url_root='http://nbviewer.ipython.org/'; | |
url=null; | |
if (location.href.search(/^https:\/\/github\.com\/.*\.ipynb$/) !== -1) { | |
gh = location.href.match(/^https:\/\/github\.com\/(.*)\/(.*)\/blob\/(.*)\/(.*\.ipynb)$/); | |
user = gh[1]; | |
repo = gh[2]; | |
branch = gh[3]; | |
file = gh[4]; | |
raw_url = 'raw.github.com/'+user+'/'+repo+'/'+branch+'/'+file; | |
url = url_root + 'urls/' + raw_url; | |
} | |
return url | |
}; | |
var selector = "#files .button-group" | |
function addButton () { | |
var newButton = document.createElement('a'); | |
var url = getUrl() | |
if (url) { | |
newButton.innerHTML = 'NBViewer'; | |
newButton.className = 'button minibutton' | |
newButton.setAttribute('href', getUrl()); | |
var button_group = document.querySelector( selector ); | |
button_group.appendChild(newButton); | |
} | |
}; | |
waitForKeyElements(selector, addButton); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment