Fix Learn theme addition to git
This commit is contained in:
File diff suppressed because one or more lines are too long
+7
File diff suppressed because one or more lines are too long
+9
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,94 @@
|
||||
// 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;
|
||||
};
|
||||
|
||||
// Execute actions on images generated from Markdown pages
|
||||
var images = $("div#body-inner img").not(".inline");
|
||||
// Wrap image inside a featherlight (to get a full size view in a popup)
|
||||
images.wrap(function(){
|
||||
var image =$(this);
|
||||
var o = getUrlParameter(image[0].src);
|
||||
var f = o['featherlight'];
|
||||
// IF featherlight is false, do not use feather light
|
||||
if (f != 'false') {
|
||||
if (!image.parent("a").length) {
|
||||
return "<a href='" + image[0].src + "' data-featherlight='image'></a>";
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// 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;
|
||||
} else {
|
||||
return "auto";
|
||||
}
|
||||
});
|
||||
image.css("height", function() {
|
||||
if (typeof h !== "undefined") {
|
||||
return h;
|
||||
} else {
|
||||
return "auto";
|
||||
}
|
||||
});
|
||||
if (typeof c !== "undefined") {
|
||||
var classes = c.split(',');
|
||||
for (i = 0; i < classes.length; i++) {
|
||||
image.addClass(classes[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Stick the top to the top of the screen when scrolling
|
||||
$(document).ready(function(){
|
||||
$("#top-bar").sticky({topSpacing:0, zIndex: 1000});
|
||||
});
|
||||
|
||||
|
||||
jQuery(document).ready(function() {
|
||||
// Add link button for every
|
||||
var text, clip = new ClipboardJS('.anchor');
|
||||
$("h1~h2,h1~h3,h1~h4,h1~h5,h1~h6").append(function(index, html){
|
||||
var element = $(this);
|
||||
var url = encodeURI(document.location.origin + document.location.pathname);
|
||||
var link = url + "#"+element[0].id;
|
||||
return " <span class='anchor' data-clipboard-text='"+link+"'>" +
|
||||
"<i class='fas fa-link fa-lg'></i>" +
|
||||
"</span>"
|
||||
;
|
||||
});
|
||||
|
||||
$(".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');
|
||||
});
|
||||
$('code.language-mermaid').each(function(index, element) {
|
||||
var content = $(element).html().replace(/&/g, '&');
|
||||
$(element).parent().replaceWith('<div class="mermaid" align="center">' + content + '</div>');
|
||||
});
|
||||
});
|
||||
+2
File diff suppressed because one or more lines are too long
Executable
+288
@@ -0,0 +1,288 @@
|
||||
// Sticky Plugin v1.0.4 for jQuery
|
||||
// =============
|
||||
// Author: Anthony Garand
|
||||
// Improvements by German M. Bravo (Kronuz) and Ruud Kamphuis (ruudk)
|
||||
// Improvements by Leonardo C. Daronco (daronco)
|
||||
// Created: 02/14/2011
|
||||
// Date: 07/20/2015
|
||||
// Website: http://stickyjs.com/
|
||||
// Description: Makes an element on the page stick on the screen as you scroll
|
||||
// It will only set the 'top' and 'position' of your element, you
|
||||
// might need to adjust the width in some cases.
|
||||
|
||||
(function (factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD. Register as an anonymous module.
|
||||
define(['jquery'], factory);
|
||||
} else if (typeof module === 'object' && module.exports) {
|
||||
// Node/CommonJS
|
||||
module.exports = factory(require('jquery'));
|
||||
} else {
|
||||
// Browser globals
|
||||
factory(jQuery);
|
||||
}
|
||||
}(function ($) {
|
||||
var slice = Array.prototype.slice; // save ref to original slice()
|
||||
var splice = Array.prototype.splice; // save ref to original slice()
|
||||
|
||||
var defaults = {
|
||||
topSpacing: 0,
|
||||
bottomSpacing: 0,
|
||||
className: 'is-sticky',
|
||||
wrapperClassName: 'sticky-wrapper',
|
||||
center: false,
|
||||
getWidthFrom: '',
|
||||
widthFromWrapper: true, // works only when .getWidthFrom is empty
|
||||
responsiveWidth: false,
|
||||
zIndex: 'inherit'
|
||||
},
|
||||
$window = $(window),
|
||||
$document = $(document),
|
||||
sticked = [],
|
||||
windowHeight = $window.height(),
|
||||
scroller = function() {
|
||||
var scrollTop = $window.scrollTop(),
|
||||
documentHeight = $document.height(),
|
||||
dwh = documentHeight - windowHeight,
|
||||
extra = (scrollTop > dwh) ? dwh - scrollTop : 0;
|
||||
|
||||
for (var i = 0, l = sticked.length; i < l; i++) {
|
||||
var s = sticked[i],
|
||||
elementTop = s.stickyWrapper.offset().top,
|
||||
etse = elementTop - s.topSpacing - extra;
|
||||
|
||||
//update height in case of dynamic content
|
||||
s.stickyWrapper.css('height', s.stickyElement.outerHeight());
|
||||
|
||||
if (scrollTop <= etse) {
|
||||
if (s.currentTop !== null) {
|
||||
s.stickyElement
|
||||
.css({
|
||||
'width': '',
|
||||
'position': '',
|
||||
'top': '',
|
||||
'z-index': ''
|
||||
});
|
||||
s.stickyElement.parent().removeClass(s.className);
|
||||
s.stickyElement.trigger('sticky-end', [s]);
|
||||
s.currentTop = null;
|
||||
}
|
||||
}
|
||||
else {
|
||||
var newTop = documentHeight - s.stickyElement.outerHeight()
|
||||
- s.topSpacing - s.bottomSpacing - scrollTop - extra;
|
||||
if (newTop < 0) {
|
||||
newTop = newTop + s.topSpacing;
|
||||
} else {
|
||||
newTop = s.topSpacing;
|
||||
}
|
||||
if (s.currentTop !== newTop) {
|
||||
var newWidth;
|
||||
if (s.getWidthFrom) {
|
||||
padding = s.stickyElement.innerWidth() - s.stickyElement.width();
|
||||
newWidth = $(s.getWidthFrom).width() - padding || null;
|
||||
} else if (s.widthFromWrapper) {
|
||||
newWidth = s.stickyWrapper.width();
|
||||
}
|
||||
if (newWidth == null) {
|
||||
newWidth = s.stickyElement.width();
|
||||
}
|
||||
s.stickyElement
|
||||
.css('width', newWidth)
|
||||
.css('position', 'fixed')
|
||||
.css('top', newTop)
|
||||
.css('z-index', s.zIndex);
|
||||
|
||||
s.stickyElement.parent().addClass(s.className);
|
||||
|
||||
if (s.currentTop === null) {
|
||||
s.stickyElement.trigger('sticky-start', [s]);
|
||||
} else {
|
||||
// sticky is started but it have to be repositioned
|
||||
s.stickyElement.trigger('sticky-update', [s]);
|
||||
}
|
||||
|
||||
if (s.currentTop === s.topSpacing && s.currentTop > newTop || s.currentTop === null && newTop < s.topSpacing) {
|
||||
// just reached bottom || just started to stick but bottom is already reached
|
||||
s.stickyElement.trigger('sticky-bottom-reached', [s]);
|
||||
} else if(s.currentTop !== null && newTop === s.topSpacing && s.currentTop < newTop) {
|
||||
// sticky is started && sticked at topSpacing && overflowing from top just finished
|
||||
s.stickyElement.trigger('sticky-bottom-unreached', [s]);
|
||||
}
|
||||
|
||||
s.currentTop = newTop;
|
||||
}
|
||||
|
||||
// Check if sticky has reached end of container and stop sticking
|
||||
var stickyWrapperContainer = s.stickyWrapper.parent();
|
||||
var unstick = (s.stickyElement.offset().top + s.stickyElement.outerHeight() >= stickyWrapperContainer.offset().top + stickyWrapperContainer.outerHeight()) && (s.stickyElement.offset().top <= s.topSpacing);
|
||||
|
||||
if( unstick ) {
|
||||
s.stickyElement
|
||||
.css('position', 'absolute')
|
||||
.css('top', '')
|
||||
.css('bottom', 0)
|
||||
.css('z-index', '');
|
||||
} else {
|
||||
s.stickyElement
|
||||
.css('position', 'fixed')
|
||||
.css('top', newTop)
|
||||
.css('bottom', '')
|
||||
.css('z-index', s.zIndex);
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
resizer = function() {
|
||||
windowHeight = $window.height();
|
||||
|
||||
for (var i = 0, l = sticked.length; i < l; i++) {
|
||||
var s = sticked[i];
|
||||
var newWidth = null;
|
||||
if (s.getWidthFrom) {
|
||||
if (s.responsiveWidth) {
|
||||
newWidth = $(s.getWidthFrom).width();
|
||||
}
|
||||
} else if(s.widthFromWrapper) {
|
||||
newWidth = s.stickyWrapper.width();
|
||||
}
|
||||
if (newWidth != null) {
|
||||
s.stickyElement.css('width', newWidth);
|
||||
}
|
||||
}
|
||||
},
|
||||
methods = {
|
||||
init: function(options) {
|
||||
return this.each(function() {
|
||||
var o = $.extend({}, defaults, options);
|
||||
var stickyElement = $(this);
|
||||
|
||||
var stickyId = stickyElement.attr('id');
|
||||
var wrapperId = stickyId ? stickyId + '-' + defaults.wrapperClassName : defaults.wrapperClassName;
|
||||
var wrapper = $('<div></div>')
|
||||
.attr('id', wrapperId)
|
||||
.addClass(o.wrapperClassName);
|
||||
|
||||
stickyElement.wrapAll(function() {
|
||||
if ($(this).parent("#" + wrapperId).length == 0) {
|
||||
return wrapper;
|
||||
}
|
||||
});
|
||||
|
||||
var stickyWrapper = stickyElement.parent();
|
||||
|
||||
if (o.center) {
|
||||
stickyWrapper.css({width:stickyElement.outerWidth(),marginLeft:"auto",marginRight:"auto"});
|
||||
}
|
||||
|
||||
if (stickyElement.css("float") === "right") {
|
||||
stickyElement.css({"float":"none"}).parent().css({"float":"right"});
|
||||
}
|
||||
|
||||
o.stickyElement = stickyElement;
|
||||
o.stickyWrapper = stickyWrapper;
|
||||
o.currentTop = null;
|
||||
|
||||
sticked.push(o);
|
||||
|
||||
methods.setWrapperHeight(this);
|
||||
methods.setupChangeListeners(this);
|
||||
});
|
||||
},
|
||||
|
||||
setWrapperHeight: function(stickyElement) {
|
||||
var element = $(stickyElement);
|
||||
var stickyWrapper = element.parent();
|
||||
if (stickyWrapper) {
|
||||
stickyWrapper.css('height', element.outerHeight());
|
||||
}
|
||||
},
|
||||
|
||||
setupChangeListeners: function(stickyElement) {
|
||||
if (window.MutationObserver) {
|
||||
var mutationObserver = new window.MutationObserver(function(mutations) {
|
||||
if (mutations[0].addedNodes.length || mutations[0].removedNodes.length) {
|
||||
methods.setWrapperHeight(stickyElement);
|
||||
}
|
||||
});
|
||||
mutationObserver.observe(stickyElement, {subtree: true, childList: true});
|
||||
} else {
|
||||
if (window.addEventListener) {
|
||||
stickyElement.addEventListener('DOMNodeInserted', function() {
|
||||
methods.setWrapperHeight(stickyElement);
|
||||
}, false);
|
||||
stickyElement.addEventListener('DOMNodeRemoved', function() {
|
||||
methods.setWrapperHeight(stickyElement);
|
||||
}, false);
|
||||
} else if (window.attachEvent) {
|
||||
stickyElement.attachEvent('onDOMNodeInserted', function() {
|
||||
methods.setWrapperHeight(stickyElement);
|
||||
});
|
||||
stickyElement.attachEvent('onDOMNodeRemoved', function() {
|
||||
methods.setWrapperHeight(stickyElement);
|
||||
});
|
||||
}
|
||||
}
|
||||
},
|
||||
update: scroller,
|
||||
unstick: function(options) {
|
||||
return this.each(function() {
|
||||
var that = this;
|
||||
var unstickyElement = $(that);
|
||||
|
||||
var removeIdx = -1;
|
||||
var i = sticked.length;
|
||||
while (i-- > 0) {
|
||||
if (sticked[i].stickyElement.get(0) === that) {
|
||||
splice.call(sticked,i,1);
|
||||
removeIdx = i;
|
||||
}
|
||||
}
|
||||
if(removeIdx !== -1) {
|
||||
unstickyElement.unwrap();
|
||||
unstickyElement
|
||||
.css({
|
||||
'width': '',
|
||||
'position': '',
|
||||
'top': '',
|
||||
'float': '',
|
||||
'z-index': ''
|
||||
})
|
||||
;
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
// should be more efficient than using $window.scroll(scroller) and $window.resize(resizer):
|
||||
if (window.addEventListener) {
|
||||
window.addEventListener('scroll', scroller, false);
|
||||
window.addEventListener('resize', resizer, false);
|
||||
} else if (window.attachEvent) {
|
||||
window.attachEvent('onscroll', scroller);
|
||||
window.attachEvent('onresize', resizer);
|
||||
}
|
||||
|
||||
$.fn.sticky = function(method) {
|
||||
if (methods[method]) {
|
||||
return methods[method].apply(this, slice.call(arguments, 1));
|
||||
} else if (typeof method === 'object' || !method ) {
|
||||
return methods.init.apply( this, arguments );
|
||||
} else {
|
||||
$.error('Method ' + method + ' does not exist on jQuery.sticky');
|
||||
}
|
||||
};
|
||||
|
||||
$.fn.unstick = function(method) {
|
||||
if (methods[method]) {
|
||||
return methods[method].apply(this, slice.call(arguments, 1));
|
||||
} else if (typeof method === 'object' || !method ) {
|
||||
return methods.unstick.apply( this, arguments );
|
||||
} else {
|
||||
$.error('Method ' + method + ' does not exist on jQuery.sticky');
|
||||
}
|
||||
};
|
||||
$(function() {
|
||||
setTimeout(scroller, 0);
|
||||
});
|
||||
}));
|
||||
@@ -0,0 +1,496 @@
|
||||
// Scrollbar Width function
|
||||
function getScrollBarWidth() {
|
||||
var inner = document.createElement('p');
|
||||
inner.style.width = "100%";
|
||||
inner.style.height = "200px";
|
||||
|
||||
var outer = document.createElement('div');
|
||||
outer.style.position = "absolute";
|
||||
outer.style.top = "0px";
|
||||
outer.style.left = "0px";
|
||||
outer.style.visibility = "hidden";
|
||||
outer.style.width = "200px";
|
||||
outer.style.height = "150px";
|
||||
outer.style.overflow = "hidden";
|
||||
outer.appendChild(inner);
|
||||
|
||||
document.body.appendChild(outer);
|
||||
var w1 = inner.offsetWidth;
|
||||
outer.style.overflow = 'scroll';
|
||||
var w2 = inner.offsetWidth;
|
||||
if (w1 == w2) w2 = outer.clientWidth;
|
||||
|
||||
document.body.removeChild(outer);
|
||||
|
||||
return (w1 - w2);
|
||||
};
|
||||
|
||||
function setMenuHeight() {
|
||||
$('#sidebar .highlightable').height($('#sidebar').innerHeight() - $('#header-wrapper').height() - 40);
|
||||
$('#sidebar .highlightable').perfectScrollbar('update');
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
function switchTab(tabGroup, tabId) {
|
||||
allTabItems = jQuery("[data-tab-group='"+tabGroup+"']");
|
||||
targetTabItems = jQuery("[data-tab-group='"+tabGroup+"'][data-tab-item='"+tabId+"']");
|
||||
|
||||
// if event is undefined then switchTab was called from restoreTabSelection
|
||||
// so it's not a button event and we don't need to safe the selction or
|
||||
// prevent page jump
|
||||
var isButtonEvent = event != undefined;
|
||||
|
||||
if(isButtonEvent){
|
||||
// save button position relative to viewport
|
||||
var yposButton = event.target.getBoundingClientRect().top;
|
||||
}
|
||||
|
||||
allTabItems.removeClass("active");
|
||||
targetTabItems.addClass("active");
|
||||
|
||||
if(isButtonEvent){
|
||||
// reset screen to the same position relative to clicked button to prevent page jump
|
||||
var yposButtonDiff = event.target.getBoundingClientRect().top - yposButton;
|
||||
window.scrollTo(window.scrollX, window.scrollY+yposButtonDiff);
|
||||
|
||||
// Store the selection to make it persistent
|
||||
if(window.localStorage){
|
||||
var selectionsJSON = window.localStorage.getItem("tabSelections");
|
||||
if(selectionsJSON){
|
||||
var tabSelections = JSON.parse(selectionsJSON);
|
||||
}else{
|
||||
var tabSelections = {};
|
||||
}
|
||||
tabSelections[tabGroup] = tabId;
|
||||
window.localStorage.setItem("tabSelections", JSON.stringify(tabSelections));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function restoreTabSelections() {
|
||||
if(window.localStorage){
|
||||
var selectionsJSON = window.localStorage.getItem("tabSelections");
|
||||
if(selectionsJSON){
|
||||
var tabSelections = JSON.parse(selectionsJSON);
|
||||
}else{
|
||||
var tabSelections = {};
|
||||
}
|
||||
Object.keys(tabSelections).forEach(function(tabGroup) {
|
||||
var tabItem = tabSelections[tabGroup];
|
||||
switchTab(tabGroup, tabItem);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// for the window resize
|
||||
$(window).resize(function() {
|
||||
setMenuHeight();
|
||||
});
|
||||
|
||||
// debouncing function from John Hann
|
||||
// http://unscriptable.com/index.php/2009/03/20/debouncing-javascript-methods/
|
||||
(function($, sr) {
|
||||
|
||||
var debounce = function(func, threshold, execAsap) {
|
||||
var timeout;
|
||||
|
||||
return function debounced() {
|
||||
var obj = this, args = arguments;
|
||||
|
||||
function delayed() {
|
||||
if (!execAsap)
|
||||
func.apply(obj, args);
|
||||
timeout = null;
|
||||
};
|
||||
|
||||
if (timeout)
|
||||
clearTimeout(timeout);
|
||||
else if (execAsap)
|
||||
func.apply(obj, args);
|
||||
|
||||
timeout = setTimeout(delayed, threshold || 100);
|
||||
};
|
||||
}
|
||||
// smartresize
|
||||
jQuery.fn[sr] = function(fn) { return fn ? this.bind('resize', debounce(fn)) : this.trigger(sr); };
|
||||
|
||||
})(jQuery, 'smartresize');
|
||||
|
||||
|
||||
jQuery(document).ready(function() {
|
||||
restoreTabSelections();
|
||||
|
||||
jQuery('#sidebar .category-icon').on('click', function() {
|
||||
$( this ).toggleClass("fa-angle-down fa-angle-right") ;
|
||||
$( this ).parent().parent().children('ul').toggle() ;
|
||||
return false;
|
||||
});
|
||||
|
||||
var sidebarStatus = searchStatus = 'open';
|
||||
$('#sidebar .highlightable').perfectScrollbar();
|
||||
setMenuHeight();
|
||||
|
||||
jQuery('#overlay').on('click', function() {
|
||||
jQuery(document.body).toggleClass('sidebar-hidden');
|
||||
sidebarStatus = (jQuery(document.body).hasClass('sidebar-hidden') ? 'closed' : 'open');
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
jQuery('[data-sidebar-toggle]').on('click', function() {
|
||||
jQuery(document.body).toggleClass('sidebar-hidden');
|
||||
sidebarStatus = (jQuery(document.body).hasClass('sidebar-hidden') ? 'closed' : 'open');
|
||||
|
||||
return false;
|
||||
});
|
||||
jQuery('[data-clear-history-toggle]').on('click', function() {
|
||||
sessionStorage.clear();
|
||||
location.reload();
|
||||
return false;
|
||||
});
|
||||
jQuery('[data-search-toggle]').on('click', function() {
|
||||
if (sidebarStatus == 'closed') {
|
||||
jQuery('[data-sidebar-toggle]').trigger('click');
|
||||
jQuery(document.body).removeClass('searchbox-hidden');
|
||||
searchStatus = 'open';
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
jQuery(document.body).toggleClass('searchbox-hidden');
|
||||
searchStatus = (jQuery(document.body).hasClass('searchbox-hidden') ? 'closed' : 'open');
|
||||
|
||||
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')
|
||||
$(document.body).removeClass('searchbox-hidden');
|
||||
$('[data-search-input]').val(searchValue);
|
||||
$('[data-search-input]').trigger('input');
|
||||
var searchedElem = $('#body-inner').find(':contains(' + searchValue + ')').get(0);
|
||||
if (searchedElem) {
|
||||
searchedElem.scrollIntoView(true);
|
||||
var scrolledY = window.scrollY;
|
||||
if(scrolledY){
|
||||
window.scroll(0, scrolledY - 125);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// clipboard
|
||||
var clipInit = false;
|
||||
$('code').each(function() {
|
||||
var code = $(this),
|
||||
text = code.text();
|
||||
|
||||
if (text.length > 5) {
|
||||
if (!clipInit) {
|
||||
var text, clip = new ClipboardJS('.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('<span class="copy-to-clipboard" title="Copy to clipboard" />');
|
||||
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('input, textarea').keydown(function (e) {
|
||||
// left and right arrow keys
|
||||
if (e.which == '37' || e.which == '39') {
|
||||
e.stopPropagation();
|
||||
}
|
||||
});
|
||||
|
||||
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');
|
||||
$('#body-inner a:not(:has(img)):not(.btn):not(a[rel="footnote"])').addClass('highlight');
|
||||
|
||||
var touchsupport = ('ontouchstart' in window) || (navigator.maxTouchPoints > 0) || (navigator.msMaxTouchPoints > 0)
|
||||
if (!touchsupport){ // browser doesn't support touch
|
||||
$('#toc-menu').hover(function() {
|
||||
$('.progress').stop(true, false, true).fadeToggle(100);
|
||||
});
|
||||
|
||||
$('.progress').hover(function() {
|
||||
$('.progress').stop(true, false, true).fadeToggle(100);
|
||||
});
|
||||
}
|
||||
if (touchsupport){ // browser does support touch
|
||||
$('#toc-menu').click(function() {
|
||||
$('.progress').stop(true, false, true).fadeToggle(100);
|
||||
});
|
||||
$('.progress').click(function() {
|
||||
$('.progress').stop(true, false, true).fadeToggle(100);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Fix anchor scrolling that hides behind top nav bar
|
||||
* Courtesy of https://stackoverflow.com/a/13067009/28106
|
||||
*
|
||||
* We could use pure css for this if only heading anchors were
|
||||
* involved, but this works for any anchor, including footnotes
|
||||
**/
|
||||
(function (document, history, location) {
|
||||
var HISTORY_SUPPORT = !!(history && history.pushState);
|
||||
|
||||
var anchorScrolls = {
|
||||
ANCHOR_REGEX: /^#[^ ]+$/,
|
||||
OFFSET_HEIGHT_PX: 50,
|
||||
|
||||
/**
|
||||
* Establish events, and fix initial scroll position if a hash is provided.
|
||||
*/
|
||||
init: function () {
|
||||
this.scrollToCurrent();
|
||||
$(window).on('hashchange', $.proxy(this, 'scrollToCurrent'));
|
||||
$('body').on('click', 'a', $.proxy(this, 'delegateAnchors'));
|
||||
},
|
||||
|
||||
/**
|
||||
* Return the offset amount to deduct from the normal scroll position.
|
||||
* Modify as appropriate to allow for dynamic calculations
|
||||
*/
|
||||
getFixedOffset: function () {
|
||||
return this.OFFSET_HEIGHT_PX;
|
||||
},
|
||||
|
||||
/**
|
||||
* If the provided href is an anchor which resolves to an element on the
|
||||
* page, scroll to it.
|
||||
* @param {String} href
|
||||
* @return {Boolean} - Was the href an anchor.
|
||||
*/
|
||||
scrollIfAnchor: function (href, pushToHistory) {
|
||||
var match, anchorOffset;
|
||||
|
||||
if (!this.ANCHOR_REGEX.test(href)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
match = document.getElementById(href.slice(1));
|
||||
|
||||
if (match) {
|
||||
anchorOffset = $(match).offset().top - this.getFixedOffset();
|
||||
$('html, body').animate({ scrollTop: anchorOffset });
|
||||
|
||||
// Add the state to history as-per normal anchor links
|
||||
if (HISTORY_SUPPORT && pushToHistory) {
|
||||
history.pushState({}, document.title, location.pathname + href);
|
||||
}
|
||||
}
|
||||
|
||||
return !!match;
|
||||
},
|
||||
|
||||
/**
|
||||
* Attempt to scroll to the current location's hash.
|
||||
*/
|
||||
scrollToCurrent: function (e) {
|
||||
if (this.scrollIfAnchor(window.location.hash) && e) {
|
||||
e.preventDefault();
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* If the click event's target was an anchor, fix the scroll position.
|
||||
*/
|
||||
delegateAnchors: function (e) {
|
||||
var elem = e.target;
|
||||
|
||||
if (this.scrollIfAnchor(elem.getAttribute('href'), true)) {
|
||||
e.preventDefault();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
$(document).ready($.proxy(anchorScrolls, 'init'));
|
||||
})(window.document, window.history, window.location);
|
||||
|
||||
});
|
||||
|
||||
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');
|
||||
}
|
||||
|
||||
|
||||
$(".highlightable").highlight(sessionStorage.getItem('search-value'), { element: 'mark' });
|
||||
});
|
||||
|
||||
$(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) {
|
||||
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);
|
||||
});
|
||||
};
|
||||
Vendored
+6
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,96 @@
|
||||
var lunrIndex, pagesIndex;
|
||||
|
||||
function endsWith(str, suffix) {
|
||||
return str.indexOf(suffix, str.length - suffix.length) !== -1;
|
||||
}
|
||||
|
||||
// Initialize lunrjs using our generated index file
|
||||
function initLunr() {
|
||||
if (!endsWith(baseurl,"/")){
|
||||
baseurl = baseurl+'/'
|
||||
};
|
||||
|
||||
// First retrieve the index file
|
||||
$.getJSON(baseurl +"index.json")
|
||||
.done(function(index) {
|
||||
pagesIndex = index;
|
||||
// Set up lunrjs by declaring the fields we use
|
||||
// Also provide their boost level for the ranking
|
||||
lunrIndex = lunr(function() {
|
||||
this.ref("uri");
|
||||
this.field('title', {
|
||||
boost: 15
|
||||
});
|
||||
this.field('tags', {
|
||||
boost: 10
|
||||
});
|
||||
this.field("content", {
|
||||
boost: 5
|
||||
});
|
||||
|
||||
this.pipeline.remove(lunr.stemmer);
|
||||
this.searchPipeline.remove(lunr.stemmer);
|
||||
|
||||
// Feed lunr with each file and let lunr actually index them
|
||||
pagesIndex.forEach(function(page) {
|
||||
this.add(page);
|
||||
}, this);
|
||||
})
|
||||
})
|
||||
.fail(function(jqxhr, textStatus, error) {
|
||||
var err = textStatus + ", " + error;
|
||||
console.error("Error getting Hugo index file:", err);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Trigger a search in lunr and transform the result
|
||||
*
|
||||
* @param {String} query
|
||||
* @return {Array} results
|
||||
*/
|
||||
function search(queryTerm) {
|
||||
// Find the item in our index corresponding to the lunr one to have more info
|
||||
return lunrIndex.search(queryTerm+"^100"+" "+queryTerm+"*^10"+" "+"*"+queryTerm+"^10"+" "+queryTerm+"~2^1").map(function(result) {
|
||||
return pagesIndex.filter(function(page) {
|
||||
return page.uri === result.ref;
|
||||
})[0];
|
||||
});
|
||||
}
|
||||
|
||||
// Let's get started
|
||||
initLunr();
|
||||
$( document ).ready(function() {
|
||||
var searchList = new autoComplete({
|
||||
/* selector for the search box element */
|
||||
selector: $("#search-by").get(0),
|
||||
/* source is the callback to perform the search */
|
||||
source: function(term, response) {
|
||||
response(search(term));
|
||||
},
|
||||
/* renderItem displays individual search results */
|
||||
renderItem: function(item, term) {
|
||||
var numContextWords = 2;
|
||||
var text = item.content.match(
|
||||
"(?:\\s?(?:[\\w]+)\\s?){0,"+numContextWords+"}" +
|
||||
term+"(?:\\s?(?:[\\w]+)\\s?){0,"+numContextWords+"}");
|
||||
item.context = text;
|
||||
var divcontext = document.createElement("div");
|
||||
divcontext.className = "context";
|
||||
divcontext.innerText = (item.context || '');
|
||||
var divsuggestion = document.createElement("div");
|
||||
divsuggestion.className = "autocomplete-suggestion";
|
||||
divsuggestion.setAttribute("data-term", term);
|
||||
divsuggestion.setAttribute("data-title", item.title);
|
||||
divsuggestion.setAttribute("data-uri", item.uri);
|
||||
divsuggestion.setAttribute("data-context", item.context);
|
||||
divsuggestion.innerText = '» ' + item.title;
|
||||
divsuggestion.appendChild(divcontext);
|
||||
return divsuggestion.outerHTML;
|
||||
},
|
||||
/* onSelect callback fires when a search suggestion is chosen */
|
||||
onSelect: function(e, term, item) {
|
||||
location.href = item.getAttribute('data-uri');
|
||||
}
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user