"use strict"; function editNamesbase() { if (customization) return; closeDialogs("#namesbaseEditor, .stable"); $("#namesbaseEditor").dialog(); if (modules.editNamesbase) return; 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("namesbaseMulti").addEventListener("input", updateBaseMiltiwordRate); document.getElementById("namesbaseAdd").addEventListener("click", namesbaseAdd); document.getElementById("namesbaseAnalize").addEventListener("click", analizeNamesbase); document.getElementById("namesbaseDefault").addEventListener("click", namesbaseRestoreDefault); document.getElementById("namesbaseDownload").addEventListener("click", namesbaseDownload); document.getElementById("namesbaseUpload").addEventListener("click", () => namesbaseToLoad.click()); document.getElementById("namesbaseToLoad").addEventListener("change", function() {uploadFile(this, namesbaseUpload)}); createBasesList(); updateInputs(); $("#namesbaseEditor").dialog({ title: "Namesbase Editor", width: "42.5em", 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; document.getElementById("namesbaseMulti").value = nameBases[base].m; 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.replace(/ /g, ""); if (b.split(",").length < 3) { tip("The names data provided is not correct", false, "error"); document.getElementById("namesbaseTextarea").value = nameBases[base].b; 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 updateBaseMiltiwordRate() { if (isNaN(+this.value) || +this.value < 0 || +this.value > 1) {tip("Please provide a number within [0-1] range", false, "error"); return;} const base = +document.getElementById("namesbaseSelect").value; nameBases[base].m = +this.value; } function analizeNamesbase() { const string = document.getElementById("namesbaseTextarea").value; if (!string) {tip("Names data field should not be empty", false, "error"); return;} const base = string.toLowerCase(); const array = base.split(","); const l = array.length; if (!l) {tip("Names data should not be empty", false, "error"); return;} const wordsLength = array.map(n => n.length); const multi = rn(d3.mean(array.map(n => (n.match(/ /i)||[]).length)) * 100, 2); const geminate = array.map(name => name.match(/[^\w\s]|(.)(?=\1)/g)||[]).flat(); const doubled = ([...new Set(geminate)].filter(l => geminate.filter(d => d === l).length > 3)||["none"]).join(""); const chain = Names.calculateChain(string); const depth = rn(d3.mean(Object.keys(chain).map(key => chain[key].filter(c => c !== " ").length))); const nonLatin = (string.match(/[^\u0000-\u007f]/g)||["none"]).join(""); const lengthStat = l < 30 ? "[not enough]" : l < 150 ? "[low]" : l < 150 ? "[low]" : l < 400 ? "[good]" : l < 600 ? "[overmuch]" : "[overmuch]"; const rangeStat = l < 10 ? "[low]" : l < 15 ? "[low]" : l < 20 ? "[low]" : "[good]"; const depthStat = l < 15 ? "[low]" : l < 20 ? "[low]" : l < 25 ? "[low]" : "[good]"; alertMessage.innerHTML = `