import {unique} from "/src/utils/arrayUtils"; import {tip} from "/src/scripts/tooltips"; import {rn} from "/src/utils/numberUtils"; export function editNamesbase() { if (customization) return; closeDialogs("#namesbaseEditor, .stable"); $("#namesbaseEditor").dialog(); if (fmg.modules.editNamesbase) return; fmg.modules.editNamesbase = true; // add listeners document.getElementById("namesbaseSelect").addEventListener("change", updateInputs); document.getElementById("namesbaseTextarea").addEventListener("change", updateNamesData); document.getElementById("namesbaseUpdateExamples").addEventListener("click", updateExamples); document.getElementById("namesbaseExamples").addEventListener("click", updateExamples); document.getElementById("namesbaseName").addEventListener("input", updateBaseName); document.getElementById("namesbaseMin").addEventListener("input", updateBaseMin); document.getElementById("namesbaseMax").addEventListener("input", updateBaseMax); document.getElementById("namesbaseDouble").addEventListener("input", updateBaseDublication); document.getElementById("namesbaseAdd").addEventListener("click", namesbaseAdd); document.getElementById("namesbaseAnalyze").addEventListener("click", analyzeNamesbase); document.getElementById("namesbaseDefault").addEventListener("click", namesbaseRestoreDefault); document.getElementById("namesbaseDownload").addEventListener("click", namesbaseDownload); const uploader = document.getElementById("namesbaseToLoad"); document.getElementById("namesbaseUpload").addEventListener("click", () => { uploader.addEventListener( "change", function (event) { uploadFile(event.target, d => namesbaseUpload(d, true)); }, {once: true} ); uploader.click(); }); document.getElementById("namesbaseUploadExtend").addEventListener("click", () => { uploader.addEventListener( "change", function (event) { uploadFile(event.target, d => namesbaseUpload(d, false)); }, {once: true} ); uploader.click(); }); document.getElementById("namesbaseCA").addEventListener("click", () => { openURL("https://cartographyassets.com/asset-category/specific-assets/azgaars-generator/namebases/"); }); document.getElementById("namesbaseSpeak").addEventListener("click", () => speak(namesbaseExamples.textContent)); createBasesList(); updateInputs(); $("#namesbaseEditor").dialog({ title: "Namesbase Editor", width: "auto", position: {my: "center", at: "center", of: "svg"} }); function createBasesList() { const select = document.getElementById("namesbaseSelect"); select.innerHTML = ""; nameBases.forEach((b, i) => select.options.add(new Option(b.name, i))); } function updateInputs() { const base = +document.getElementById("namesbaseSelect").value; if (!nameBases[base]) { tip(`Namesbase ${base} is not defined`, false, "error"); return; } document.getElementById("namesbaseTextarea").value = nameBases[base].b; document.getElementById("namesbaseName").value = nameBases[base].name; document.getElementById("namesbaseMin").value = nameBases[base].min; document.getElementById("namesbaseMax").value = nameBases[base].max; document.getElementById("namesbaseDouble").value = nameBases[base].d; updateExamples(); } function updateExamples() { const base = +document.getElementById("namesbaseSelect").value; let examples = ""; for (let i = 0; i < 10; i++) { const example = Names.getBase(base); if (example === undefined) { examples = "Cannot generate examples. Please verify the data"; break; } if (i) examples += ", "; examples += example; } document.getElementById("namesbaseExamples").innerHTML = examples; } function updateNamesData() { const base = +document.getElementById("namesbaseSelect").value; const b = document.getElementById("namesbaseTextarea").value; if (b.split(",").length < 3) { tip("The names data provided is too short of incorrect", false, "error"); return; } nameBases[base].b = b; Names.updateChain(base); } function updateBaseName() { const base = +document.getElementById("namesbaseSelect").value; const select = document.getElementById("namesbaseSelect"); select.options[namesbaseSelect.selectedIndex].innerHTML = this.value; nameBases[base].name = this.value; } function updateBaseMin() { const base = +document.getElementById("namesbaseSelect").value; if (+this.value > nameBases[base].max) { tip("Minimal length cannot be greater than maximal", false, "error"); return; } nameBases[base].min = +this.value; } function updateBaseMax() { const base = +document.getElementById("namesbaseSelect").value; if (+this.value < nameBases[base].min) { tip("Maximal length should be greater than minimal", false, "error"); return; } nameBases[base].max = +this.value; } function updateBaseDublication() { const base = +document.getElementById("namesbaseSelect").value; nameBases[base].d = this.value; } function analyzeNamesbase() { const namesSourceString = document.getElementById("namesbaseTextarea").value; const namesArray = namesSourceString.toLowerCase().split(","); const length = namesArray.length; if (!namesSourceString || !length) return tip("Names data should not be empty", false, "error"); const chain = Names.calculateChain(namesSourceString); const variety = rn(d3.mean(Object.values(chain).map(keyValue => keyValue.length))); const wordsLength = namesArray.map(n => n.length); const nonLatin = namesSourceString.match(/[^\u0000-\u007f]/g); const nonBasicLatinChars = nonLatin ? unique( namesSourceString .match(/[^\u0000-\u007f]/g) .join("") .toLowerCase() ).join("") : "none"; const geminate = namesArray.map(name => name.match(/[^\w\s]|(.)(?=\1)/g) || []).flat(); const doubled = unique(geminate).filter( char => geminate.filter(doudledChar => doudledChar === char).length > 3 ) || ["none"]; const duplicates = unique(namesArray.filter((e, i, a) => a.indexOf(e) !== i)).join(", ") || "none"; const multiwordRate = d3.mean(namesArray.map(n => +n.includes(" "))); const getLengthQuality = () => { if (length < 30) return "[not enough]"; if (length < 100) return "[low]"; if (length <= 400) return "[good]"; return "[overmuch]"; }; const getVarietyLevel = () => { if (variety < 15) return "[low]"; if (variety < 30) return "[mean]"; return "[good]"; }; alertMessage.innerHTML = /* html */ `