aboutsummaryrefslogtreecommitdiff
/* SPDX-License-Identifier: MPL-2.0
 *
 * Copyright (C) 2022 Sasi Olin <hel@lcp.world>
 */

var textfield = document.getElementById("entry");
textfield.setAttribute("placeholder", "o awen");

function toggle_visible() {
	if (this.classList.contains("text")) {
		this.classList.remove("text");
	}
	else {
		var elements = document.getElementsByClassName("item-indicator");
		Array.from(elements).forEach(function(element) {
			element.classList.remove("text");
		});
		this.classList.add("text");
	}
}

function set_results(entry, tp_en, en_tp) {
	var selected = document.querySelector("input[type='radio'][name='lang']:checked").value;
	var out = {};
	if (selected == "en")
		out = en_tp;
	else if (selected == "tp")
		out = tp_en;
	else {
		if (en_tp[entry] && tp_en[entry]) {
			return;
		}
		else if (en_tp[entry]) {
			selected = "en";
			out = en_tp;
		}
		else if (tp_en[entry]) {
			selected = "tp";
			out = tp_en;
		}
	}
	output = "";
	if (out[entry]) {
		var card = document.createElement("ul");
		card.setAttribute("class", "card");
		var title = document.createElement("h3");
		title.setAttribute("class", "title");
		title.innerHTML = "Translations of ";
		var translated = document.createElement("span");
		translated.innerHTML = entry;
		title.appendChild(translated);
		card.appendChild(title);
		var legend = document.createElement("div");
		legend.setAttribute("class", "legend");
		var word = document.createElement("span");
		word.innerHTML = "Word ";
		word.setAttribute("class", "word");
		legend.appendChild(word);
		var frequency = document.createElement("span");
		frequency.innerHTML = "Frequency";
		frequency.setAttribute("class", "frequency");
		frequency.setAttribute("title", "Based on the data collected by Sonja Lang");
		legend.appendChild(frequency);
		card.appendChild(legend);
		for (const key in out[entry]) {
			var element = document.createElement("li");
			element.setAttribute("class", "card-item");
			var span = document.createElement("span");
			span.innerHTML = key;
			span.innerHTML += " ";
			span.setAttribute("class", "item-title");
			element.appendChild(span);
			var backtrans = document.createElement("span");
			backtrans.setAttribute("class", "item-backtrans");
			if (selected == "en") {
				for (const back in tp_en[key]) {
					if (backtrans.innerHTML != "")
						backtrans.innerHTML += ", ";
					var backlink = document.createElement("a");
					backlink.setAttribute("class", "item-backlink");
					backlink.setAttribute("href", "#en:" + back);
					backlink.innerHTML = back;
					backtrans.appendChild(backlink);
				}
			}
			else if (selected == "tp") {
				for (const back in en_tp[key]) {
					if (backtrans.innerHTML != "")
						backtrans.innerHTML += ", ";
					var backlink = document.createElement("a");
					backlink.setAttribute("class", "item-backlink");
					backlink.setAttribute("href", "#tp:" + back);
					backlink.innerHTML = back;
					backtrans.appendChild(backlink);
				}
			}
			span.appendChild(backtrans);
			var val = document.createElement("span");
			val.innerHTML = out[entry][key];
			val.setAttribute("title", out[entry][key]);
			val.setAttribute("tabindex", 0);
			indicator = Math.ceil(out[entry][key] / 20);
			if (out[entry][key] <= 20)
				indicator = Math.ceil((out[entry][key] - 10) / 20);
			if (indicator < 0)
				indicator = 0;
			val.setAttribute("class", "item-indicator indicator-" + indicator );
			element.appendChild(val);
			card.appendChild(element);
		}
		var source = document.createElement("div");
		source.setAttribute("class", "source");
		var link = document.createElement("a");
		link.setAttribute("href", "https://tokipona.org/nimi_pu.txt");
		link.innerHTML = "nimi_pu.txt";
		source.appendChild(link);
		source.innerHTML += ", ";
		link.setAttribute("href", "https://tokipona.org/nimi_pi_pu_ala.txt");
		link.innerHTML = "nimi_pi_pu_ala.txt";
		source.appendChild(link);
		source.innerHTML += ", ";
		link.setAttribute("href", "https://tokipona.org/compounds.txt");
		link.innerHTML = "compounds.txt";
		source.appendChild(link);
		source.innerHTML = "Source: " + source.innerHTML;
		card.appendChild(source);
		output = card;
	}
	document.getElementById("results").innerHTML = "";
	document.getElementById("result").innerHTML = "";
	var langs = document.getElementsByClassName("output-lang");
	Array.from(langs).forEach(function(element) {
		element.classList.remove("selected");
	});
	document.getElementById("auto-label").innerHTML = "Detect Language";
	if (output) {
		document.getElementById("results").appendChild(output);
		document.getElementById("result").innerHTML = Object.keys(out[entry])[0];
		if (document.querySelector("input[type='radio'][name='lang']:checked").value == "auto") {
			history.replaceState(null, null, document.location.pathname + "#" + entry);
			if (selected == "en")
				document.getElementById("auto-label").innerHTML = "English - Detected";
			else if (selected == "tp")
				document.getElementById("auto-label").innerHTML = "toki pona - Detected";
		}
		else
			history.replaceState(null, null, document.location.pathname + "#" + selected + ":" + entry);
		if (selected == "en") {
			document.getElementById("out-tp").classList.add("selected");
		}
		else if (selected == "tp") {
			document.getElementById("out-en").classList.add("selected");
		}
		var elements = document.getElementsByClassName("item-indicator");
		Array.from(elements).forEach(function(element) {
			element.onclick = toggle_visible;
			element.onkeyup = toggle_visible;
		});
	}
	else
		history.replaceState(null, null, document.location.pathname);
}

function get_suggestions(entry, tp_en, en_tp) {
	var selected = document.querySelector("input[type='radio'][name='lang']:checked").value;
	var out = {};
	if (selected == "en")
		out = en_tp;
	else if (selected == "tp")
		out = tp_en;
	else {
		return;
	}
	output = "";
	if (!out[entry] && entry != "") {
		var card = document.createElement("div");
		card.setAttribute("class", "card");
		keys = Object.keys(out).filter(function(item, index) {
			return RegExp(`^${entry}`).test(item);
		});

		Array.from(keys).forEach(function(key) {
			var element = document.createElement("li");
			element.setAttribute("class", "card-item");
			var link = document.createElement("a");
			link.setAttribute("href", "#" + selected + ":" + key);
			link.innerHTML = key;
			element.appendChild(link);
			card.appendChild(element);
		});
		if (keys.length != 0)
			output = card;
	}
	document.getElementById("suggestions").innerHTML = "";
	if (output)
		document.getElementById("suggestions").appendChild(output);
}

Promise.all([
    fetch('tp-en.json')
    .then(res => res.json()),
    fetch('en-tp.json')
    .then(res=>res.json())
])
.then(([tp_en, en_tp]) => {
		var lang = document.querySelector("input[type='radio'][name='lang']:checked").value;
		window.addEventListener('hashchange', function(e) {
			var entry = "";
			if (decodeURIComponent(window.location.hash.substring(1)).includes(":")) {
				lang = decodeURIComponent(window.location.hash.substring(1)).split(":")[0];
				entry = decodeURIComponent(window.location.hash.substring(1)).split(":")[1];
			}
			else
				entry = decodeURIComponent(window.location.hash.substring(1));
			document.getElementById("entry").value = entry;
			document.getElementById("suggestions").innerHTML = "";
			document.querySelector(`input[type='radio'][name='lang']#${lang}`).checked = true;
			set_results(entry, tp_en, en_tp);
		});
		document.getElementById("entry").addEventListener('input', function(e) {
			var entry = e.target.value;
			get_suggestions(entry, tp_en, en_tp);
			set_results(entry, tp_en, en_tp);
		});
		var rad = document.getElementsByName("lang");
		var prev = null;
		for (var i = 0; i < rad.length; i++) {
			rad[i].addEventListener('change', function() {
				if (this !== prev) {
					prev = this;
				}
				var entry = document.getElementById("entry").value;
				get_suggestions(entry, tp_en, en_tp);
				set_results(entry, tp_en, en_tp);
			});
		}
		if (window.location.hash) {
			var entry = "";
			if (decodeURIComponent(window.location.hash.substring(1)).includes(":")) {
				lang = decodeURIComponent(window.location.hash.substring(1)).split(":")[0];
				entry = decodeURIComponent(window.location.hash.substring(1)).split(":")[1];
			}
			else
				entry = decodeURIComponent(window.location.hash.substring(1));
			document.getElementById("entry").value = entry;
			document.querySelector(`input[type='radio'][name='lang']#${lang}`).checked = true;
			set_results(entry, tp_en, en_tp);
		}
		textfield.removeAttribute("disabled");
		textfield.setAttribute("placeholder", "o alasa e nimi");
		textfield.focus();
}).catch(err => {
	textfield.setAttribute("placeholder", err);
	console.log(err)
});