* Rewrite and re-style the wiki * Fix links * Fix mobile width being wrong * Make the anticheat warning pretty * Fix root pages * Fix code blocks and cleanup some other bits * Fix search * Fix android and iOS sidebar links
103 lines
3.0 KiB
JavaScript
103 lines
3.0 KiB
JavaScript
(function () {
|
|
function getQueryVariable (variable) {
|
|
const query = window.location.search.substring(1)
|
|
const vars = query.split('&')
|
|
|
|
for (let i = 0; i < vars.length; i++) {
|
|
const pair = vars[i].split('=')
|
|
|
|
if (pair[0] === variable) {
|
|
return decodeURIComponent(pair[1].replace(/\+/g, '%20')).trim()
|
|
}
|
|
}
|
|
}
|
|
|
|
function getPreview (query, content, previewLength) {
|
|
previewLength = previewLength || (content.length * 2)
|
|
|
|
const parts = query.split(' ')
|
|
let match = content.toLowerCase().indexOf(query.toLowerCase())
|
|
let matchLength = query.length
|
|
let preview
|
|
|
|
// Find a relevant location in content
|
|
for (let i = 0; i < parts.length; i++) {
|
|
if (match >= 0) {
|
|
break
|
|
}
|
|
|
|
match = content.toLowerCase().indexOf(parts[i].toLowerCase())
|
|
matchLength = parts[i].length
|
|
}
|
|
|
|
// Create preview
|
|
if (match >= 0) {
|
|
const start = match - (previewLength / 2)
|
|
const end = start > 0 ? match + matchLength + (previewLength / 2) : previewLength
|
|
|
|
preview = content.substring(start, end).trim()
|
|
|
|
if (start > 0) {
|
|
preview = '...' + preview
|
|
}
|
|
|
|
if (end < content.length) {
|
|
preview = preview + '...'
|
|
}
|
|
|
|
// Highlight query parts
|
|
preview = preview.replace(new RegExp('(' + parts.join('|') + ')', 'gi'), '<strong>$1</strong>')
|
|
} else {
|
|
// Use start of content if no match found
|
|
preview = content.substring(0, previewLength).trim() + (content.length > previewLength ? '...' : '')
|
|
}
|
|
|
|
return preview
|
|
}
|
|
|
|
function displaySearchResults (results, query) {
|
|
const searchResultsEl = document.getElementById('search-results')
|
|
const searchProcessEl = document.getElementById('search-process')
|
|
|
|
if (results.length) {
|
|
let resultsHTML = ''
|
|
results.forEach(function (result) {
|
|
const item = window.data[result.ref]
|
|
if (item.title) {
|
|
const contentPreview = getPreview(query, item.content, 170)
|
|
const titlePreview = getPreview(query, item.title)
|
|
resultsHTML += "<li><h4><a href='" + item.url.trim() + "'>" + titlePreview + '</a></h4><p><small>' + contentPreview + '</small></p></li>'
|
|
}
|
|
})
|
|
|
|
searchResultsEl.innerHTML = resultsHTML
|
|
searchProcessEl.innerText = 'Showing'
|
|
} else {
|
|
searchResultsEl.style.display = 'none'
|
|
searchProcessEl.innerText = 'No'
|
|
}
|
|
}
|
|
|
|
window.index = lunr(function () {
|
|
this.field('id')
|
|
this.field('title', { boost: 10 })
|
|
this.field('url')
|
|
this.field('content')
|
|
})
|
|
|
|
const query = decodeURIComponent((getQueryVariable('q') || '').replace(/\+/g, '%20'))
|
|
const searchQueryContainerEl = document.getElementById('search-query-container')
|
|
const searchQueryEl = document.getElementById('search-query')
|
|
|
|
searchQueryEl.innerText = query
|
|
if (query !== '') {
|
|
searchQueryContainerEl.style.display = 'inline'
|
|
}
|
|
|
|
for (const key in window.data) {
|
|
window.index.add(window.data[key])
|
|
}
|
|
|
|
displaySearchResults(window.index.search(query), query) // Hand the results off to be displayed
|
|
})()
|