(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'), '$1') } 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 += "
  • " + titlePreview + '

    ' + contentPreview + '

  • ' } }) 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 })()