var trigrams = {}; var trigramKeyList; var sumStartsWith = {}; function loadTrigrams(responseText) { var lines = responseText.split('\n'); for (var i = 0; i < lines.length; i++) { var trigram = lines[i].substring(0, 3); var value = parseInt(lines[i].substring(4, lines[i].length)); if (trigram == '' || isNaN(value)) continue; trigrams[trigram] = value; } trigramKeyList = Object.keys(trigrams); document.getElementById("loading").innerHTML = ""; } function start() { var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (xhttp.readyState == 4 && xhttp.status == 200) { loadTrigrams(xhttp.responseText); } }; xhttp.open("GET", "https://raw.githubusercontent.com/pommicket/NameGenerator/master/trigrams.txt", true); xhttp.send(); } function pickFirst2() { var count = 0; var sum = 0; for (var i = 0; i < trigramKeyList.length; i++) { if (trigramKeyList[i][0] == ' ') { sum += trigrams[trigramKeyList[i]]; } } var selected = Math.random() * sum; for (var i = 0; i < trigramKeyList.length; i++) { if (trigramKeyList[i][0] == ' ') { count += trigrams[trigramKeyList[i]]; if (selected < count) return trigramKeyList[i].substring(1); } } return "ERROR"; } function nextChar(name) { var last2 = name.substring(name.length-2); var total = 0; if (sumStartsWith[last2] == NaN || sumStartsWith[last2] == undefined) { for (var i = 0; i < trigramKeyList.length; i++) { if (trigramKeyList[i].substring(0, 2) == last2) total += trigrams[trigramKeyList[i]]; } sumStartsWith[last2] = total; } else { total = sumStartsWith[last2]; } var selected = Math.random() * total; var count = 0; for (var i = 0; i < trigramKeyList.length; i++) { if (trigramKeyList[i].substring(0, 2) == last2) { count += trigrams[trigramKeyList[i]]; if (selected < count) return trigramKeyList[i][2]; } } return "ERROR"; } function generateName() { var first = pickFirst2(); var name = first; var next = ''; var length = 0; do { name += next; next = nextChar(name); } while (next != ' '); name = name[0].toUpperCase() + name.substring(1); return name; } function createNames() { document.getElementById("button").disabled = true; var nameStr = ''; var numNames = document.getElementById("numNames").value; var nameDiv = document.getElementById("names"); window.setTimeout(50, function() {document.getElementById("loading").innerHTML = "Loading...";}); nameDiv.innerHTML = ""; for (var i = 0; i < numNames; i++) nameStr += generateName() + "
"; if (document.getElementById("outputNames").checked) nameDiv.innerHTML = nameStr; document.getElementById("loading").innerHTML = ""; var dload; dload = document.getElementById("download"); dload.innerHTML = "Download names (.txt)"; var txt = nameStr.replace(/
/g, "\n"); dload.href = "data:text/plain;charset=utf-8," + encodeURI(txt); document.getElementById("button").disabled = false; } start();