const MINIMUM_NEEDLE_LENGTH = 3; // keresés indítása a nevek között function search_in_names(needle) { let hintbox = document.getElementById("hintbox"); if (needle.trim().length < MINIMUM_NEEDLE_LENGTH) { hintbox.innerHTML = ""; hide("hintzone"); o("nameinput").setAttribute("validity", ""); return; } let request_data = { action: "search", needle: "", group: "" }; // csoport és név szétválasztása let group_regex = /(\[[a-záéíóöúü]+\]$)/gi; let group_extracted = needle.match(group_regex); if (group_extracted != null) { request_data["group"] = group_extracted[0].substring(1, group_extracted[0].length - 1); request_data["needle"] = needle.substring(0, needle.length - group_extracted[0].length - 1).trim(); } else { request_data["needle"] = needle; } request(request_data).then(resp => { hintbox.innerHTML = ""; let hits = JSON.parse(resp); hits.forEach((val) => { if (needle.length < 3) { return; } let hit = document.createElement("span"); hit.classList.add("hit"); hit.addEventListener("click", () => { let group_id = val["duplicate"] ? ` [${val["group"]}]` : ""; fill_name_input(`${val["name"]}${group_id}`); hide("hintzone"); ninput.setAttribute("validity", "ok"); }); let name_node = document.createElement("span"); name_node.classList.add("name"); let hp = val["hitpos"]; let name = val["name"]; if (hp > 0) { let name_begin = name.slice(0, hp); name_node.appendChild(document.createTextNode(name_begin)); } let hl = document.createElement("span"); hl.classList.add("highlight"); hl.innerText = name.slice(hp, hp + needle.length); name_node.appendChild(hl); if (hp + needle.length < name.length) { let name_end = name.slice(hp + needle.length, name.length); name_node.appendChild(document.createTextNode(name_end)); } hit.appendChild(name_node); let group = val["group"]; if (group.length > 0) { let group_node = document.createElement("span"); group_node.innerHTML = ` ${print_from_group(group)}`; group_node.classList.add("group"); hit.appendChild(group_node); } hintbox.appendChild(hit); }); // doboz megjelenítése, ha szükséges hits.length > 0 ? show("hintzone") : hide("hintzone"); // szövegmező színezése let validity = ""; let ninput = document.getElementById("nameinput"); if (ninput.value.length > MINIMUM_NEEDLE_LENGTH) { if (hits.length === 0) { validity = "bad"; } else if (hits.length === 1 && hits[0]["exact_match"]) { validity = "ok"; hide("hintzone"); } } ninput.setAttribute("validity", validity); }); } // csoport kiírása ("...az Azúrból" -- no reference of course :D), ha megkapja a szervertől function print_from_group(group) { group = group.trim(); if (group === "") { return ""; } let vowels = /[aáeéiíoóöőuúüű]/i; // magánhangzók regexe let highpitched_vowels = /[eéiíöőüű]/i; // magas hangrendű maánhangzók regexe // első betű megvizsgálása a névelő kiválasztásához let b = group.charAt(0); let article = (vowels.exec(b) != null) ? "az" : "a"; // hátulról az első magánhangzó keresése let g_rev = group.split("").reverse().join(""); let last_vowel = g_rev.match(vowels)[0]; // megvizsgáljuk, hogy az utolsó betű volt-e a megtalált magánhangzó let last_letter = g_rev.charAt(0).toLowerCase(); if (last_letter === last_vowel.charAt(0).toLowerCase()) { if (last_letter === "a") { last_letter = "á"; } else if (last_letter === "e") { last_letter = "é"; } // utolsó betű kicserélése group = group.substring(0, group.length - 1) + last_letter; } // utolsó magánhangzó hangrendjének vizsgálata és rag kiválasztása let suffix = highpitched_vowels.test(last_vowel) ? "ből" : "ból"; return `${article} ${group}${suffix}`; } // szöveggel kitölti a nevet function fill_name_input(str) { document.getElementById("nameinput").value = str; }