MKK_KozVezVal/js/mkkkvv.js

140 lines
4.6 KiB
JavaScript

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} <i>${group}${suffix}</i>`;
}
// szöveggel kitölti a nevet
function fill_name_input(str) {
document.getElementById("nameinput").value = str;
}