const contentContainer = document.querySelector( '#page-content' ); const searchContainer = document.querySelector( '#search-content' ); const resultBox = document.querySelector( '#search-result' ); // eslint-disable-next-line no-unused-vars function hideSearch() { searchContainer.style.display = 'none'; contentContainer.style.display = 'block'; } function showResultText( text ) { resultBox.innerHTML = text; } function showSearch() { searchContainer.style.display = 'block'; contentContainer.style.display = 'none'; } function extractUrlBase( url ) { const index = url.lastIndexOf( '/' ); if ( index === - 1 ) return './'; return url.slice( 0, index + 1 ); } async function fetchAllData() { const { origin, pathname } = location; const baseURL = extractUrlBase( pathname ); const base = origin + baseURL; const url = new URL( 'data/search.json', base ); const result = await fetch( url ); const { list } = await result.json(); return list; } function buildSearchResult( result ) { let output = ''; const removeHTMLTagsRegExp = /(<([^>]+)>)/ig; for ( const res of result ) { const { title = '', description = '' } = res.item; const _link = res.item.link.replace( '.*/, '' ); const _title = title.replace( removeHTMLTagsRegExp, '' ); const _description = description.replace( removeHTMLTagsRegExp, '' ); output += ` ${_title} - ${_description || 'No description available.'} `; } return output; } function getSearchResult( list, keys, searchKey ) { const defaultOptions = { shouldSort: true, threshold: 0.4, location: 0, distance: 100, maxPatternLength: 32, minMatchCharLength: 1, keys: keys }; const options = { ...defaultOptions }; // eslint-disable-next-line no-undef const searchIndex = Fuse.createIndex( options.keys, list ); // eslint-disable-next-line no-undef const fuse = new Fuse( list, options, searchIndex ); const result = fuse.search( searchKey ); if ( result.length > 20 ) { return result.slice( 0, 20 ); } return result; } let searchData; // eslint-disable-next-line no-unused-vars async function search( value ) { if ( value === '' ) { hideSearch(); return; } showSearch(); const keys = [ 'title', 'description' ]; if ( searchData === undefined ) { showResultText( 'Loading...' ); try { searchData = await fetchAllData(); } catch ( e ) { console.log( e ); showResultText( 'Failed to load result.' ); return; } } const result = getSearchResult( searchData, keys, value ); if ( ! result.length ) { showResultText( 'No result found! Try some different combination.' ); return; } resultBox.innerHTML = buildSearchResult( result ); }