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

176 lines
5.0 KiB
JavaScript
Raw Normal View History

2019-07-25 10:36:35 +02:00
// Event handling
2019-09-11 19:12:24 +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-11 19:12:24 +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-11 19:12:24 +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 () {
const text = navTrigger.textContent
let 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.textContent = textToggle
navTrigger.setAttribute('data-text-toggle', text)
textToggle = text
2019-07-25 10:36:35 +02:00
})
}
// Site search
2019-09-11 19:12:24 +02:00
function initSearch () {
const 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-11 19:12:24 +02:00
sc = document.getElementsByTagName('script')
source = ''
2019-07-25 10:36:35 +02:00
2019-09-11 19:12:24 +02:00
for (idx = 0; idx < sc.length; idx++) {
s = sc.item(idx)
2019-07-25 10:36:35 +02:00
2019-09-11 19:12:24 +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-11 19:12:24 +02:00
jsPath = source.replace('just-the-docs.js', '')
2019-07-25 10:36:35 +02:00
2019-09-11 19:12:24 +02:00
jsonPath = jsPath + 'search-data.json'
2019-07-25 10:36:35 +02:00
2019-09-11 19:12:24 +02:00
const request = new XMLHttpRequest()
request.open('GET', jsonPath, true)
2019-07-25 10:36:35 +02:00
2019-09-11 19:12:24 +02:00
request.onload = function () {
2019-07-25 10:36:35 +02:00
if (request.status >= 200 && request.status < 400) {
// Success!
2019-09-11 19:12:24 +02:00
const data = JSON.parse(request.responseText)
const keys = Object.keys(data)
2019-07-25 10:36:35 +02:00
2019-09-11 19:12:24 +02:00
for (const 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-11 19:12:24 +02:00
})
2019-07-25 10:36:35 +02:00
}
2019-09-11 19:12:24 +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-11 19:12:24 +02:00
console.log('Error loading ajax request. Request status:' + request.status)
2019-07-25 10:36:35 +02:00
}
2019-09-11 19:12:24 +02:00
}
2019-07-25 10:36:35 +02:00
2019-09-11 19:12:24 +02:00
request.onerror = function () {
2019-07-25 10:36:35 +02:00
// There was a connection error of some sort
2019-09-11 19:12:24 +02:00
console.log('There was a connection error')
}
2019-07-25 10:36:35 +02:00
2019-09-11 19:12:24 +02:00
request.send()
2019-07-25 10:36:35 +02:00
2019-09-11 19:12:24 +02:00
function searchResults (dataStore) {
const searchInput = document.querySelector('.js-search-input')
const searchResults = document.querySelector('.js-search-results')
const store = dataStore
2019-07-25 10:36:35 +02:00
2019-09-11 19:12:24 +02:00
function hideResults () {
searchResults.innerHTML = ''
searchResults.classList.remove('active')
2019-07-25 10:36:35 +02:00
}
2019-09-11 19:12:24 +02:00
addEvent(searchInput, 'keyup', function (e) {
const query = this.value
2019-07-25 10:36:35 +02:00
2019-09-11 19:12:24 +02:00
searchResults.innerHTML = ''
searchResults.classList.remove('active')
2019-07-25 10:36:35 +02:00
if (query === '') {
2019-09-11 19:12:24 +02:00
hideResults()
2019-07-25 10:36:35 +02:00
} else {
2019-09-11 19:12:24 +02:00
const results = index.search(query)
2019-07-25 10:36:35 +02:00
if (results.length > 0) {
2019-09-11 19:12:24 +02:00
searchResults.classList.add('active')
const resultsList = document.createElement('ul')
searchResults.appendChild(resultsList)
for (const i in results) {
const resultsListItem = document.createElement('li')
const resultsLink = document.createElement('a')
const resultsUrlDesc = document.createElement('span')
const resultsUrl = store[results[i].ref].url
const resultsRelUrl = store[results[i].ref].relUrl
const resultsTitle = store[results[i].ref].title
resultsLink.setAttribute('href', resultsUrl)
resultsLink.textContent = resultsTitle
resultsUrlDesc.textContent = 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-11 19:12:24 +02:00
hideResults()
searchInput.value = ''
2019-07-25 10:36:35 +02:00
}
}
2019-09-11 19:12:24 +02:00
})
2019-07-25 10:36:35 +02:00
2019-09-11 19:12:24 +02:00
addEvent(searchInput, 'blur', function () {
setTimeout(function () { hideResults() }, 300)
})
2019-07-25 10:36:35 +02:00
}
}
2019-09-11 19:12:24 +02:00
function pageFocus () {
const mainContent = document.querySelector('.js-main-content')
mainContent.focus()
2019-07-25 10:36:35 +02:00
}
// Document ready
2019-09-11 19:12:24 +02:00
function ready () {
toggleNav()
pageFocus()
2019-07-25 10:36:35 +02:00
if (typeof lunr !== 'undefined') {
2019-09-11 19:12:24 +02:00
initSearch()
2019-07-25 10:36:35 +02:00
}
}
// in case the document is already rendered
2019-09-11 19:12:24 +02:00
if (document.readyState != 'loading') { ready() }
2019-07-25 10:36:35 +02:00
// modern browsers
2019-09-11 19:12:24 +02:00
else if (document.addEventListener) { document.addEventListener('DOMContentLoaded', ready) }
2019-07-25 10:36:35 +02:00
// IE <= 8
2019-09-11 19:12:24 +02:00
else {
document.attachEvent('onreadystatechange', function () {
if (document.readyState == 'complete') { ready() }
})
}