Files
gancio/docs/_site/assets/js/just-the-docs.js

177 lines
5.0 KiB
JavaScript
Raw Normal View History

2019-07-25 10:36:35 +02:00
// Event handling
2019-09-21 23:26:21 +02:00
function addEvent(el, type, handler) {
if (el.attachEvent) el.attachEvent('on'+type, handler); else el.addEventListener(type, handler);
2019-07-25 10:36:35 +02:00
}
2019-09-21 23:26:21 +02:00
function removeEvent(el, type, handler) {
if (el.detachEvent) el.detachEvent('on'+type, handler); else el.removeEventListener(type, handler);
2019-07-25 10:36:35 +02:00
}
// Show/hide mobile menu
2019-09-21 23:26:21 +02:00
function toggleNav(){
const nav = document.querySelector('.js-main-nav');
const auxNav = document.querySelector('.js-aux-nav');
const navTrigger = document.querySelector('.js-main-nav-trigger');
const search = document.querySelector('.js-search');
addEvent(navTrigger, 'click', function(){
var text = navTrigger.innerText;
var textToggle = navTrigger.getAttribute('data-text-toggle');
nav.classList.toggle('nav-open');
auxNav.classList.toggle('nav-open');
navTrigger.classList.toggle('nav-open');
search.classList.toggle('nav-open');
navTrigger.innerText = textToggle;
navTrigger.setAttribute('data-text-toggle', text);
textToggle = text;
2019-07-25 10:36:35 +02:00
})
}
// Site search
2019-09-21 23:26:21 +02:00
function initSearch() {
var index = lunr(function () {
this.ref('id');
this.field('title', { boost: 20 });
this.field('content', { boost: 10 });
this.field('url');
});
2019-07-25 10:36:35 +02:00
// Get the generated search_data.json file so lunr.js can search it locally.
2019-09-21 23:26:21 +02:00
sc = document.getElementsByTagName("script");
source = '';
2019-07-25 10:36:35 +02:00
2019-09-21 23:26:21 +02:00
for(idx = 0; idx < sc.length; idx++)
{
s = sc.item(idx);
2019-07-25 10:36:35 +02:00
2019-09-21 23:26:21 +02:00
if(s.src && s.src.match(/just-the-docs\.js$/))
{ source = s.src; }
2019-07-25 10:36:35 +02:00
}
2019-09-21 23:26:21 +02:00
jsPath = source.replace('just-the-docs.js', '');
2019-07-25 10:36:35 +02:00
2019-09-21 23:26:21 +02:00
jsonPath = jsPath + 'search-data.json';
2019-07-25 10:36:35 +02:00
2019-09-21 23:26:21 +02:00
var request = new XMLHttpRequest();
request.open('GET', jsonPath, true);
2019-07-25 10:36:35 +02:00
2019-09-21 23:26:21 +02:00
request.onload = function() {
2019-07-25 10:36:35 +02:00
if (request.status >= 200 && request.status < 400) {
// Success!
2019-09-21 23:26:21 +02:00
var data = JSON.parse(request.responseText);
var keys = Object.keys(data);
2019-07-25 10:36:35 +02:00
2019-09-21 23:26:21 +02:00
for(var i in data) {
2019-07-25 10:36:35 +02:00
index.add({
id: data[i].id,
title: data[i].title,
content: data[i].content,
url: data[i].url
2019-09-21 23:26:21 +02:00
});
2019-07-25 10:36:35 +02:00
}
2019-09-21 23:26:21 +02:00
searchResults(data);
2019-07-25 10:36:35 +02:00
} else {
// We reached our target server, but it returned an error
2019-09-21 23:26:21 +02:00
console.log('Error loading ajax request. Request status:' + request.status);
2019-07-25 10:36:35 +02:00
}
2019-09-21 23:26:21 +02:00
};
2019-07-25 10:36:35 +02:00
2019-09-21 23:26:21 +02:00
request.onerror = function() {
2019-07-25 10:36:35 +02:00
// There was a connection error of some sort
2019-09-21 23:26:21 +02:00
console.log('There was a connection error');
};
2019-07-25 10:36:35 +02:00
2019-09-21 23:26:21 +02:00
request.send();
2019-07-25 10:36:35 +02:00
2019-09-21 23:26:21 +02:00
function searchResults(dataStore) {
var searchInput = document.querySelector('.js-search-input');
var searchResults = document.querySelector('.js-search-results');
var store = dataStore;
2019-07-25 10:36:35 +02:00
2019-09-21 23:26:21 +02:00
function hideResults() {
searchResults.innerHTML = '';
searchResults.classList.remove('active');
2019-07-25 10:36:35 +02:00
}
2019-09-21 23:26:21 +02:00
addEvent(searchInput, 'keyup', function(e){
var query = this.value;
2019-07-25 10:36:35 +02:00
2019-09-21 23:26:21 +02:00
searchResults.innerHTML = '';
searchResults.classList.remove('active');
2019-07-25 10:36:35 +02:00
if (query === '') {
2019-09-21 23:26:21 +02:00
hideResults();
2019-07-25 10:36:35 +02:00
} else {
2019-09-21 23:26:21 +02:00
var results = index.search(query);
2019-07-25 10:36:35 +02:00
if (results.length > 0) {
2019-09-21 23:26:21 +02:00
searchResults.classList.add('active');
var resultsList = document.createElement('ul');
searchResults.appendChild(resultsList);
for (var i in results) {
var resultsListItem = document.createElement('li');
var resultsLink = document.createElement('a');
var resultsUrlDesc = document.createElement('span');
var resultsUrl = store[results[i].ref].url;
var resultsRelUrl = store[results[i].ref].relUrl;
var resultsTitle = store[results[i].ref].title;
resultsLink.setAttribute('href', resultsUrl);
resultsLink.innerText = resultsTitle;
resultsUrlDesc.innerText = resultsRelUrl;
resultsList.classList.add('search-results-list');
resultsListItem.classList.add('search-results-list-item');
resultsLink.classList.add('search-results-link');
resultsUrlDesc.classList.add('fs-2','text-grey-dk-000','d-block');
resultsList.appendChild(resultsListItem);
resultsListItem.appendChild(resultsLink);
resultsLink.appendChild(resultsUrlDesc);
2019-07-25 10:36:35 +02:00
}
}
// When esc key is pressed, hide the results and clear the field
if (e.keyCode == 27) {
2019-09-21 23:26:21 +02:00
hideResults();
searchInput.value = '';
2019-07-25 10:36:35 +02:00
}
}
2019-09-21 23:26:21 +02:00
});
2019-07-25 10:36:35 +02:00
2019-09-21 23:26:21 +02:00
addEvent(searchInput, 'blur', function(){
setTimeout(function(){ hideResults() }, 300);
});
2019-07-25 10:36:35 +02:00
}
}
2019-09-21 23:26:21 +02:00
function pageFocus() {
var mainContent = document.querySelector('.js-main-content');
mainContent.focus();
2019-07-25 10:36:35 +02:00
}
2019-09-21 23:26:21 +02:00
2019-07-25 10:36:35 +02:00
// Document ready
2019-09-21 23:26:21 +02:00
function ready(){
toggleNav();
pageFocus();
2019-07-25 10:36:35 +02:00
if (typeof lunr !== 'undefined') {
2019-09-21 23:26:21 +02:00
initSearch();
2019-07-25 10:36:35 +02:00
}
}
// in case the document is already rendered
2019-09-21 23:26:21 +02:00
if (document.readyState!='loading') ready();
2019-07-25 10:36:35 +02:00
// modern browsers
2019-09-21 23:26:21 +02:00
else if (document.addEventListener) document.addEventListener('DOMContentLoaded', ready);
2019-07-25 10:36:35 +02:00
// IE <= 8
2019-09-21 23:26:21 +02:00
else document.attachEvent('onreadystatechange', function(){
if (document.readyState=='complete') ready();
});