{"mappings":"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","sources":["src/ts/search.ts"],"sourcesContent":["import _ from 'lodash';\n\ntype GetSpeech = () => Promise;\n\nconst getSpeech: GetSpeech = () => {\n return new Promise((resolve) => {\n // @ts-ignore\n const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;\n\n const recognition = new SpeechRecognition();\n\n recognition.onstart = () => {};\n\n recognition.onspeechend = () => {\n recognition.stop();\n resolve('');\n };\n\n // @ts-ignore\n recognition.onresult = (result) => {\n const vocalInput = result.results[0][0].transcript;\n // console.log('Recognized Text:', vocalInput);\n resolve(vocalInput);\n };\n\n recognition.start();\n });\n};\n\ninterface SearchData {\n title: string;\n content: string;\n path: string;\n keyword: string;\n}\n\nconst parseSearchData = (): SearchData[] => {\n const elements = document.querySelectorAll('.serch-data');\n const dataArray: SearchData[] = [];\n\n elements.forEach((element) => {\n const item = element as HTMLElement;\n\n dataArray.push({\n title: item.dataset.title || '',\n content: item.dataset.content || '',\n path: item.dataset.path || '',\n keyword: item.dataset.keyword || '',\n });\n });\n\n return dataArray;\n};\n\nconst clearResults = () => {\n const items = document.querySelectorAll('.results__item');\n items.forEach((item) => {\n item.parentNode?.removeChild(item);\n });\n};\n\nconst searchItems = (data: SearchData[], searchString: string): SearchData[] => {\n if (!searchString) return [];\n\n return _(data)\n .map((item) => {\n let score = 0;\n if (item.title.toLowerCase().includes(searchString.toLowerCase())) {\n score += 2; // Double score for title match\n }\n if (item.content.toLowerCase().includes(searchString.toLowerCase())) {\n score += 1; // Single score for content match\n }\n if (item.keyword.toLowerCase().includes(searchString.toLowerCase())) {\n score += 1; // Single score for keyword match\n }\n return { item, score };\n })\n .filter(({ score }) => score > 0)\n .orderBy(['score'], ['desc'])\n .map(({ item }) => item)\n .value();\n};\n\nconst addSearchResultsToDOM = (results: SearchData[], resultsContainer: HTMLDivElement): void => {\n resultsContainer.innerHTML = '';\n\n if (results.length === 0) {\n const noResultsMessage = document.createElement('div');\n noResultsMessage.className = 'no-results-message';\n noResultsMessage.textContent = 'No results found, please try with different keywords';\n resultsContainer.appendChild(noResultsMessage);\n return;\n }\n\n results.forEach((result) => {\n const itemDiv = document.createElement('div');\n itemDiv.className = 'results__item';\n\n const titleElement = document.createElement('h4');\n titleElement.textContent = result.title;\n\n const linkElement = document.createElement('a');\n linkElement.href = result.path;\n linkElement.target = '_blank';\n linkElement.appendChild(titleElement);\n\n const spanElement = document.createElement('span');\n spanElement.className = 'visually-hidden';\n spanElement.textContent = 'opens the link in a new tab';\n linkElement.appendChild(titleElement);\n linkElement.appendChild(spanElement);\n\n const divider = document.createElement('div');\n divider.className = 'decor-divider ';\n\n if (resultsContainer.classList.contains('results__intermediary')) {\n divider.classList.add('decor-verdigris');\n }\n\n const contentParagraph = document.createElement('p');\n contentParagraph.textContent = result.content;\n\n itemDiv.appendChild(linkElement);\n itemDiv.appendChild(divider);\n itemDiv.appendChild(contentParagraph);\n\n resultsContainer.appendChild(itemDiv);\n });\n};\n\n// ---------------------------------------------\n\ndocument.addEventListener('DOMContentLoaded', () => {\n const input = document.getElementById('search-input') as HTMLInputElement;\n const searchButton = document.getElementById('search-button') as HTMLButtonElement;\n const dictateButton = document.getElementById('dictate-button') as HTMLButtonElement;\n const resultsContainer = document.getElementById('results') as HTMLDivElement;\n\n const data = parseSearchData();\n let serchString = '';\n\n input.addEventListener('input', (event) => {\n const value = (event.target as HTMLInputElement).value;\n serchString = value;\n const res = searchItems(data, value);\n addSearchResultsToDOM(res, resultsContainer);\n });\n\n searchButton.addEventListener('click', () => {\n const res = searchItems(data, serchString);\n addSearchResultsToDOM(res, resultsContainer);\n });\n\n dictateButton.addEventListener('click', () => {\n dictateButton.classList.add('active');\n\n getSpeech()\n .then((vocalInput) => {\n if (vocalInput) {\n input.value = vocalInput;\n const res = searchItems(data, vocalInput);\n addSearchResultsToDOM(res, resultsContainer);\n }\n })\n .finally(() => {\n dictateButton.classList.remove('active');\n });\n });\n});\n"],"names":[],"version":3,"file":"search.e964e3a1.js.map"}