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); $("#loading").html(""); } 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() { var nameStr = ""; var numNames = $("#numNames").val(); $("#names").html(); for (var i = 0; i < numNames; i++) nameStr += generateName() + "
"; if ($("#outputNames").prop("checked")) $("#names").html(nameStr); $("#loading").html(""); $("#download").html("Download names (.txt)"); var txt = nameStr.replace(/
/g, "\n"); $("#download").prop("href", "data:text/plain;charset=utf-8," + encodeURI(txt)); stopLoading(); } function startLoading() { $("#button").prop("disabled", true); $("#button").html("Loading..."); } function stopLoading() { $("#button").prop("disabled", false); $("#button").html("Create Names!"); } function create() { startLoading(); window.setTimeout(createNames, 1); } start();