123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- {% if site.use_jupyterhub_button or site.use_binder_button %}
- <script>
- /**
- * To auto-embed hub URLs in interact links if given in a RESTful fashion
- */
- function getJsonFromUrl(url) {
- var query = url.split('?');
- if (query.length < 2) {
- // No queries so just return false
- return false;
- }
- query = query[1];
- // Collect REST params into a dictionary
- var result = {};
- query.split("&").forEach(function(part) {
- var item = part.split("=");
- result[item[0]] = decodeURIComponent(item[1]);
- });
- return result;
- }
-
- function dict2param(dict) {
- params = Object.keys(dict).map(function(k) {
- return encodeURIComponent(k) + '=' + encodeURIComponent(dict[k])
- });
- return params.join('&')
- }
- // Parse a Binder URL, converting it to the string needed for JupyterHub
- function binder2Jupyterhub(url) {
- newUrl = {};
- parts = url.split('v2/gh/')[1];
- // Grab the base repo information
- repoinfo = parts.split('?')[0];
- var [org, repo, ref] = repoinfo.split('/');
- newUrl['repo'] = ['https://github.com', org, repo].join('/');
- newUrl['branch'] = ref
- // Grab extra parameters passed
- params = getJsonFromUrl(url);
- if (params['filepath'] !== undefined) {
- newUrl['subPath'] = params['filepath']
- }
- return dict2param(newUrl);
- }
- // Filter out potentially unsafe characters to prevent xss
- function safeUrl(url)
- {
- return String(encodeURIComponent(url))
- .replace(/&/g, '&')
- .replace(/"/g, '"')
- .replace(/'/g, ''')
- .replace(/</g, '<')
- .replace(/>/g, '>');
- }
- function addParamToInternalLinks(hub) {
- var links = document.querySelectorAll("a").forEach(function(link) {
- var href = link.href;
- // If the link is an internal link...
- if (href.search("{{ site.url }}") !== -1 || href.startsWith('/') || href.search("127.0.0.1:") !== -1) {
- // Assume we're an internal link, add the hub param to it
- var params = getJsonFromUrl(href);
- if (params !== false) {
- // We have REST params, so append a new one
- params['jupyterhub'] = hub;
- } else {
- // Create the REST params
- params = {'jupyterhub': hub};
- }
- // Update the link
- var newHref = href.split('?')[0] + '?' + dict2param(params);
- link.setAttribute('href', decodeURIComponent(newHref));
- }
- });
- return false;
- }
- // Update interact links
- function updateInteractLink() {
- // hack to make this work since it expects a ? in the URL
- rest = getJsonFromUrl("?" + location.search.substr(1));
- jupyterHubUrl = rest['jupyterhub'];
- var hubType = null;
- var hubUrl = null;
- if (jupyterHubUrl !== undefined) {
- hubType = 'jupyterhub';
- hubUrl = jupyterHubUrl;
- }
- if (hubType !== null) {
- // Sanitize the hubUrl
- hubUrl = safeUrl(hubUrl);
- // Add HTTP text if omitted
- if (hubUrl.indexOf('http') < 0) {hubUrl = 'http://' + hubUrl;}
- var interactButtons = document.querySelectorAll("button.interact-button")
- var lastButton = interactButtons[interactButtons.length-1];
- var link = lastButton.parentElement;
- // If we've already run this, skip the link updating
- if (link.nextElementSibling !== null) {
- return;
- }
- // Update the link and add context div
- var href = link.getAttribute('href');
- if (lastButton.id === 'interact-button-binder') {
- // If binder links exist, we need to re-work them for jupyterhub
- if (hubUrl.indexOf('http%3A%2F%2Flocalhost') > -1) {
- // If localhost, assume we're working from a local Jupyter server and remove `/hub`
- first = [hubUrl, 'git-sync'].join('/')
- } else {
- first = [hubUrl, 'hub', 'user-redirect', 'git-sync'].join('/')
- }
- href = first + '?' + binder2Jupyterhub(href);
- } else {
- // If interact button isn't binderhub, assume it's jupyterhub
- // If JupyterHub links, we only need to replace the hub url
- href = href.replace("{{ site.jupyterhub_url }}", hubUrl);
- if (hubUrl.indexOf('http%3A%2F%2Flocalhost') > -1) {
- // Assume we're working from a local Jupyter server and remove `/hub`
- href = href.replace("/hub/user-redirect", "");
- }
- }
- link.setAttribute('href', decodeURIComponent(href));
- // Add text after interact link saying where we're launching
- hubUrlNoHttp = decodeURIComponent(hubUrl).replace('http://', '').replace('https://', '');
- link.insertAdjacentHTML('afterend', '<div class="interact-context">on ' + hubUrlNoHttp + '</div>');
- // Update internal links so we retain the hub url
- addParamToInternalLinks(hubUrl);
- }
- }
- runWhenDOMLoaded(updateInteractLink)
- document.addEventListener('turbolinks:load', updateInteractLink)
- </script>
- {% endif %}
|