self.onmessage = async (event) => { if (event.data.type === "api") { const { endpoint, serachValue, selectedDictionary } = event.data let response if (serachValue) { response = await fetch(`${endpoint}/getWords?name=${serachValue}&selecteddictionary=${selectedDictionary}`); } else { response = await fetch(`${endpoint}/getData?name=${serachValue}&selecteddictionary=${selectedDictionary}`); } const data = await response.json(); self.postMessage({ data }); } if (event.data.type === "filterwords") { const { data, serachValue, prefixValue, containsValue, suffixValue, exculdeValue, includeValue, lengthValue, sortingFilter, dictonary } = event.data let newWordsLength = 0; for (let i = 15; i > 0; i--) { let newdata = data.filter((item) => item.length === i); if (prefixValue) { newdata = newdata.filter((item2) => item2.startsWith(prefixValue.toLowerCase()) ); } if (containsValue) { newdata = newdata.filter((item) => item.includes(containsValue.toLowerCase()) ); } if (suffixValue) { newdata = newdata.filter((item) => item.endsWith(suffixValue.toLowerCase()) ); } if (exculdeValue) { let data = []; newdata.map((item) => { let check = false; for (let e = 0; e < exculdeValue.length; e++) { const element = exculdeValue[e].toLowerCase(); if (item.includes(element)) { check = true; break; } else { check = false; } } if (check === false) { data.push(item); } }); newdata = data; } if (includeValue) { let data = []; newdata.map((item) => { let check = false; for (let e = 0; e < includeValue.length; e++) { const element = includeValue[e].toLowerCase(); if (!item.includes(element)) { check = true; break; } else { check = false; } } if (check === false) { data.push(item); } }); newdata = data; } if (lengthValue) { newdata = newdata.filter((item) => item.length == lengthValue); } if (newdata.length === 0) { self.postMessage({ type: "filterwords", prefixValue: prefixValue, containsValue: containsValue, suffixValue: suffixValue, exculdeValue: exculdeValue, includeValue: includeValue, lengthValue: lengthValue, newdata: newdata, i: i, newWordsLength: newWordsLength, }); } else { newWordsLength += newdata.length; newdata = sortWords(sortingFilter, newdata, dictonary); let result = newdata.map((item) => { let itemHtml = ""; if (serachValue) { var text1 = serachValue.replace("?", ""); var text2 = item; var text3 = item; let chars = text1.split(""); let indexs = []; chars.map((i) => { let findIndexes = findIndex(text3, i); if (findIndexes.length > 0) { text3 = text3.split(""); text3[findIndexes] = "$"; text3 = text3.join(""); indexs = [...indexs, ...findIndexes]; } }); text2.split("").map((itemValue, index) => { let check = indexs.find((i) => i === index); if (check !== undefined) { itemHtml += `${itemValue}`; } else { itemHtml += `${itemValue}`; } }); } else { itemHtml = item } if (item.length === 1) { ok = false; newWordsLength = newWordsLength - 1; } else { let ScrabbleLetterScore = ScrabbleScore(); sum = 0; item = item.toLowerCase(); for (let i = 0; i < item.length; i++) { sum += ScrabbleLetterScore[item[i]] || 0; // for unknown characters } return ` ${itemHtml} ${sum} `; } }); result = result.slice(0, 25) self.postMessage({ type: "filterwords", prefixValue: prefixValue, containsValue: containsValue, suffixValue: suffixValue, exculdeValue: exculdeValue, includeValue: includeValue, lengthValue: lengthValue, newdata: newdata, i: i, newWordsLength: newWordsLength, result, }); } } } }; function sortWords(sortingFilter, data, dictonary) { if (sortingFilter == 0) { return data; } else if (sortingFilter == 1) { return data.sort(); } else if (sortingFilter == 2) { return data.reverse(); } else if (sortingFilter == 3) { var tempArr = []; var newArray = []; data.map((item) => { let newWordsLength = 0; if (item.length === 1) { ok = false; newWordsLength = newWordsLength - 1; } else { let ScrabbleLetterScore = ScrabbleScore(dictonary); let points = 0; item = item.toLowerCase(); for (let i = 0; i < item.length; i++) { points += ScrabbleLetterScore[item[i]] || 0; // for unknown characters } const value = { words: item, points: points, }; newArray.push(value); } }); newArray.sort(function (a, b) { return b.points - a.points; }); newArray.map((ele) => { tempArr.push(ele.words); }); return tempArr; } } // Scrabble Point Array const ScrabbleScore = (dictonary) => { let twl06_sowpods = { a: 1, e: 1, i: 1, o: 1, u: 1, l: 1, n: 1, r: 1, s: 1, t: 1, d: 2, g: 2, b: 3, c: 3, m: 3, p: 3, f: 4, h: 4, v: 4, w: 4, y: 4, k: 5, j: 8, x: 8, q: 10, z: 10, }; let wwfScore = { a: 1, b: 4, c: 4, d: 2, e: 1, f: 4, g: 3, h: 3, i: 1, j: 10, k: 5, l: 2, m: 4, n: 2, o: 1, p: 4, q: 10, r: 1, s: 1, t: 1, u: 2, v: 5, w: 4, x: 8, y: 3, z: 10, }; if (dictonary === "wwf") { return wwfScore; } else { return twl06_sowpods; } }; function findIndex(str, char) { const strLength = str.length; const indexes = []; let newStr = str; while (newStr && newStr.indexOf(char) > -1) { indexes.push(newStr.indexOf(char) + strLength - newStr.length); newStr = newStr.substring(newStr.indexOf(char) + 5); newStr = newStr.substring(newStr.indexOf(char) + 5); } return indexes; }