// Get Parameters from some url var getUrlParameter = function getUrlParameter(sPageURL) { var url = sPageURL.split('?'); var obj = {}; if (url.length == 2) { var sURLVariables = url[1].split('&'), sParameterName, i; for (i = 0; i < sURLVariables.length; i++) { sParameterName = sURLVariables[i].split('='); obj[sParameterName[0]] = sParameterName[1]; } return obj; } else { return undefined; } }; jQuery(document).ready(function () { // Execute actions on images generated from Markdown pages var images = $("article img").not(".inline"); // Wrap image inside a featherlight (to get a full size view in a popup) images.wrap(function () { var image = $(this); if (!image.parent("a").length) { return ""; } }); // Change styles, depending on parameters set to the image images.each(function (index) { var image = $(this); var o = getUrlParameter(image[0].src); if (typeof o !== "undefined") { var h = o["height"]; var w = o["width"]; var c = o["classes"]; image.css({ width: function () { if (typeof w !== "undefined") { return w; } }, height: function () { if (typeof h !== "undefined") { return h; } } }); if (typeof c !== "undefined") { var classes = c.split(','); $.each(classes, function(i) { image.addClass(classes[i]); }); } } }); // Add link button for every var text, clip = new Clipboard('.anchor'); $("h1~h2,h1~h3,h1~h4,h1~h5,h1~h6").append(function (index, html) { var element = $(this); var url = document.location.origin + document.location.pathname; var link = url + "#" + element[0].id; return " " + "" + ""; }); $(".anchor").on('mouseleave', function (e) { $(this).attr('aria-label', null).removeClass('tooltipped tooltipped-s tooltipped-w'); }); clip.on('success', function (e) { e.clearSelection(); $(e.trigger).attr('aria-label', 'Link copied to clipboard!').addClass('tooltipped tooltipped-s'); }); }); function fallbackMessage(action) { var actionMsg = ''; var actionKey = (action === 'cut' ? 'X' : 'C'); if (/iPhone|iPad/i.test(navigator.userAgent)) { actionMsg = 'No support :('; } else if (/Mac/i.test(navigator.userAgent)) { actionMsg = 'Press ⌘-' + actionKey + ' to ' + action; } else { actionMsg = 'Press Ctrl-' + actionKey + ' to ' + action; } return actionMsg; } jQuery(document).ready(function() { jQuery('#sidebar .category-icon').on('click', function() { $( this ).toggleClass("fa-angle-down fa-angle-right") ; $( this ).parent().parent().children('ul').toggle() ; return false; }); jQuery('[data-clear-history-toggle]').on('click', function() { sessionStorage.clear(); location.reload(); return false; }); var ajax; jQuery('[data-search-input]').on('input', function() { var input = jQuery(this), value = input.val(), items = jQuery('[data-nav-id]'); items.removeClass('search-match'); if (!value.length) { $('ul.topics').removeClass('searched'); items.css('display', 'block'); sessionStorage.removeItem('search-value'); $(".highlightable").unhighlight({ element: 'mark' }) return; } sessionStorage.setItem('search-value', value); $(".highlightable").unhighlight({ element: 'mark' }).highlight(value, { element: 'mark' }); if (ajax && ajax.abort) ajax.abort(); jQuery('[data-search-clear]').on('click', function() { jQuery('[data-search-input]').val('').trigger('input'); sessionStorage.removeItem('search-input'); $(".highlightable").unhighlight({ element: 'mark' }) }); }); $.expr[":"].contains = $.expr.createPseudo(function(arg) { return function( elem ) { return $(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0; }; }); if (sessionStorage.getItem('search-value')) { var searchValue = sessionStorage.getItem('search-value') sessionStorage.removeItem('search-value'); var searchedElem = $('article').find(':contains(' + searchValue + ')').get(0); searchedElem && searchedElem.scrollIntoView(); $(".highlightable").highlight(searchValue, { element: 'mark' }); } // clipboard var clipInit = false; $('code').each(function() { var code = $(this), text = code.text(); if (text.length > 5) { if (!clipInit) { var text, clip = new Clipboard('.copy-to-clipboard', { text: function(trigger) { text = $(trigger).prev('code').text(); return text.replace(/^\$\s/gm, ''); } }); var inPre; clip.on('success', function(e) { e.clearSelection(); inPre = $(e.trigger).parent().prop('tagName') == 'PRE'; $(e.trigger).attr('aria-label', 'Copied to clipboard!').addClass('tooltipped tooltipped-' + (inPre ? 'w' : 's')); }); clip.on('error', function(e) { inPre = $(e.trigger).parent().prop('tagName') == 'PRE'; $(e.trigger).attr('aria-label', fallbackMessage(e.action)).addClass('tooltipped tooltipped-' + (inPre ? 'w' : 's')); $(document).one('copy', function(){ $(e.trigger).attr('aria-label', 'Copied to clipboard!').addClass('tooltipped tooltipped-' + (inPre ? 'w' : 's')); }); }); clipInit = true; } code.after(''); code.next('.copy-to-clipboard').on('mouseleave', function() { $(this).attr('aria-label', null).removeClass('tooltipped tooltipped-s tooltipped-w'); }); } }); // allow keyboard control for prev/next links jQuery(function() { jQuery('.nav-prev').click(function(){ location.href = jQuery(this).attr('href'); }); jQuery('.nav-next').click(function() { location.href = jQuery(this).attr('href'); }); }); jQuery(document).keydown(function(e) { // prev links - left arrow key if(e.which == '37') { jQuery('.nav.nav-prev').click(); } // next links - right arrow key if(e.which == '39') { jQuery('.nav.nav-next').click(); } }); $('#top-bar a:not(:has(img)):not(.btn)').addClass('highlight'); $('article a:not(:has(img)):not(.btn)').addClass('highlight'); }); jQuery(window).on('load', function() { // store this page in session sessionStorage.setItem(jQuery('body').data('url'), 1); // loop through the sessionStorage and see if something should be marked as visited for (var url in sessionStorage) { if (sessionStorage.getItem(url) == 1) jQuery('[data-nav-id="' + url + '"]').addClass('visited'); } }); $(function() { $('a[rel="lightbox"]').featherlight({ root: 'section#body' }); }); jQuery.extend({ highlight: function(node, re, nodeName, className) { if (node.nodeType === 3) { var match = node.data.match(re); if (match && !(node.parentNode.ownerSVGElement instanceof SVGElement)) { var highlight = document.createElement(nodeName || 'span'); highlight.className = className || 'highlight'; var wordNode = node.splitText(match.index); wordNode.splitText(match[0].length); var wordClone = wordNode.cloneNode(true); highlight.appendChild(wordClone); wordNode.parentNode.replaceChild(highlight, wordNode); return 1; //skip added node in parent } } else if ((node.nodeType === 1 && node.childNodes) && // only element nodes that have children !/(script|style)/i.test(node.tagName) && // ignore script and style nodes !(node.tagName === nodeName.toUpperCase() && node.className === className)) { // skip if already highlighted for (var i = 0; i < node.childNodes.length; i++) { i += jQuery.highlight(node.childNodes[i], re, nodeName, className); } } return 0; } }); jQuery.fn.unhighlight = function(options) { var settings = { className: 'highlight', element: 'span' }; jQuery.extend(settings, options); return this.find(settings.element + "." + settings.className).each(function() { var parent = this.parentNode; parent.replaceChild(this.firstChild, this); parent.normalize(); }).end(); }; jQuery.fn.highlight = function(words, options) { var settings = { className: 'highlight', element: 'span', caseSensitive: false, wordsOnly: false }; jQuery.extend(settings, options); if (!words) { return; } if (words.constructor === String) { words = [words]; } words = jQuery.grep(words, function(word, i) { return word != ''; }); words = jQuery.map(words, function(word, i) { return word.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); }); if (words.length == 0) { return this; } ; var flag = settings.caseSensitive ? "" : "i"; var pattern = "(" + words.join("|") + ")"; if (settings.wordsOnly) { pattern = "\\b" + pattern + "\\b"; } var re = new RegExp(pattern, flag); return this.each(function() { jQuery.highlight(this, re, settings.element, settings.className); }); };