sourceappformat-hymn.js

const translitTable = {
	regex: [
		["οι\\b", "oi"],
		["οί\\b", "oí"],
		["οὶ\\b", "oì"],
		["οῖ\\b", "oî"],
		["οἰ\\b", "oi"],
		["οἴ\\b", "oí"],
		["οἲ\\b", "oì"],
		["οἶ\\b", "oî"],
		["οἱ\\b", "hoi"],
		["οἵ\\b", "hoí"],
		["οἳ\\b", "hoì"],
		["οἷ\\b", "hoî"],
		["Οι\\b", "Oi"],
		["Οί\\b", "Oí"],
		["Οὶ\\b", "Oì"],
		["Οῖ\\b", "Oî"],
		["Οἰ\\b", "Oi"],
		["Οἴ\\b", "Oí"],
		["Οἲ\\b", "Oì"],
		["Οἶ\\b", "Oî"],
		["Οἱ\\b", "Hoi"],
		["Οἵ\\b", "Hoí"],
		["Οἳ\\b", "Hoì"],
		["Οἷ\\b", "Hoî"]
	],
	digraphs: [
		["αι", "æ"],
		["αί", "ǽ"],
		["αὶ", "æ̀"],
		["αῖ", "æ̂"],
		["αἰ", "æ"],
		["αἴ", "ǽ"],
		["αἲ", "æ̀"],
		["αἶ", "æ̂"],
		["αἱ", "hæ"],
		["αἵ", "hǽ"],
		["αἳ", "hæ̀"],
		["αἷ", "hæ̂"],
		["ει", "ei"],
		["εί", "eí"],
		["εὶ", "eì"],
		["εῖ", "eî"],
		["εἰ", "ei"],
		["εἴ", "eí"],
		["εἲ", "eì"],
		["εἶ", "eî"],
		["εἱ", "hei"],
		["εἵ", "heí"],
		["εἳ", "heì"],
		["εἷ", "heî"],
		["οι", "œ"],
		["οί", "œ́"],
		["οὶ", "œ̀"],
		["οῖ", "œ̂"],
		["οἰ", "œ"],
		["οἴ", "œ́"],
		["οἲ", "œ̀"],
		["οἶ", "œ̂"],
		["οἱ", "hœ"],
		["οἵ", "hœ́"],
		["οἳ", "hœ̀"],
		["οἷ", "hœ̂"],
		["υι", "yi"],
		["υί", "yí"],
		["υὶ", "yì"],
		["υῖ", "yî"],
		["υἰ", "yi"],
		["υἴ", "yí"],
		["υἲ", "yì"],
		["υἶ", "yî"],
		["υἱ", "hyi"],
		["υἵ", "hyí"],
		["υἳ", "hyì"],
		["υἷ", "hyî"],
		["αυ", "au"],
		["αύ", "aú"],
		["αὺ", "aù"],
		["αῦ", "aû"],
		["αὐ", "au"],
		["αὔ", "aú"],
		["αὒ", "aù"],
		["αὖ", "aû"],
		["αὑ", "hau"],
		["αὕ", "haú"],
		["αὓ", "haù"],
		["αὗ", "haû"],
		["ευ", "eu"],
		["εύ", "eú"],
		["εὺ", "eù"],
		["εῦ", "eû"],
		["εὐ", "eu"],
		["εὔ", "eú"],
		["εὒ", "eù"],
		["εὖ", "eû"],
		["εὑ", "heu"],
		["εὕ", "heú"],
		["εὓ", "heù"],
		["εὗ", "heû"],
		["ηυ", "ēu"],
		["ηύ", "ēú"],
		["ηὺ", "ēù"],
		["ηῦ", "ēû"],
		["ηὐ", "ēu"],
		["ηὔ", "ēú"],
		["ηὒ", "ēù"],
		["ηὖ", "ēû"],
		["ηὑ", "hēu"],
		["ηὕ", "hēú"],
		["ηὓ", "hēù"],
		["ηὗ", "hēû"],
		["ου", "ou"],
		["ού", "oú"],
		["οὺ", "où"],
		["οῦ", "oû"],
		["οὐ", "ou"],
		["οὔ", "oú"],
		["οὒ", "où"],
		["οὖ", "oû"],
		["οὑ", "hou"],
		["οὕ", "hoú"],
		["οὓ", "hoù"],
		["οὗ", "hoû"],
		["γγ", "ng"],
		["γκ", "nc"],
		["γχ", "nch"],
		["γξ", "nx"],
		["ρρ", "rrh"],
		["Αι", "Æ"],
		["Αί", "Ǽ"],
		["Αὶ", "Æ̀"],
		["Αῖ", "Æ̂"],
		["Αἰ", "Æ"],
		["Αἴ", "Ǽ"],
		["Αἲ", "Æ̀"],
		["Αἶ", "Æ̂"],
		["Αἱ", "Hæ"],
		["Αἵ", "Hǽ"],
		["Αἳ", "Hæ̀"],
		["Αἷ", "Hæ̂"],
		["Ει", "Ei"],
		["Εί", "Eí"],
		["Εὶ", "Eì"],
		["Εῖ", "Eî"],
		["Εἰ", "Ei"],
		["Εἴ", "Eí"],
		["Εἲ", "Eì"],
		["Εἶ", "Eî"],
		["Εἱ", "Hei"],
		["Εἵ", "Heí"],
		["Εἳ", "Heì"],
		["Εἷ", "Heî"],
		["Οι", "Œ"],
		["Οί", "Œ́"],
		["Οὶ", "Œ̀"],
		["Οῖ", "Œ̂"],
		["Οἰ", "Œ"],
		["Οἴ", "Œ́"],
		["Οἲ", "Œ̀"],
		["Οἶ", "Œ̂"],
		["Οἱ", "Hœ"],
		["Οἵ", "Hœ́"],
		["Οἳ", "Hœ̀"],
		["Οἷ", "Hœ̂"],
		["Υι", "Yi"],
		["Υί", "Yí"],
		["Υὶ", "Yì"],
		["Υῖ", "Yî"],
		["Υἰ", "Yi"],
		["Υἴ", "Yí"],
		["Υἲ", "Yì"],
		["Υἶ", "Yî"],
		["Υἱ", "Hyi"],
		["Υἵ", "Hyí"],
		["Υἳ", "Hyì"],
		["Υἷ", "Hyî"],
		["Αυ", "Au"],
		["Αύ", "Aú"],
		["Αὺ", "Aù"],
		["Αῦ", "Aû"],
		["Αὐ", "Au"],
		["Αὔ", "Aú"],
		["Αὒ", "Aù"],
		["Αὖ", "Aû"],
		["Αὑ", "Hau"],
		["Αὕ", "Haú"],
		["Αὓ", "Haù"],
		["Αὗ", "Haû"],
		["Ευ", "Eu"],
		["Εύ", "Eú"],
		["Εὺ", "Eù"],
		["Εῦ", "Eû"],
		["Εὐ", "Eu"],
		["Εὔ", "Eú"],
		["Εὒ", "Eù"],
		["Εὖ", "Eû"],
		["Εὑ", "Heu"],
		["Εὕ", "Heú"],
		["Εὓ", "Heù"],
		["Εὗ", "Heû"],
		["Ηυ", "Ēu"],
		["Ηύ", "Ēú"],
		["Ηὺ", "Ēù"],
		["Ηῦ", "Ēû"],
		["Ηὐ", "Ēu"],
		["Ηὔ", "Ēú"],
		["Ηὒ", "Ēù"],
		["Ηὖ", "Ēû"],
		["Ηὑ", "Hēu"],
		["Ηὕ", "Hēú"],
		["Ηὓ", "Hēù"],
		["Ηὗ", "Hēû"],
		["Ου", "Ou"],
		["Ού", "Oú"],
		["Οὺ", "Où"],
		["Οῦ", "Oû"],
		["Οὐ", "Ou"],
		["Οὔ", "Oú"],
		["Οὒ", "Où"],
		["Οὖ", "Oû"],
		["Οὑ", "Hou"],
		["Οὕ", "Hoú"],
		["Οὓ", "Hoù"],
		["Οὗ", "Hoû"],
		["Γγ", "Ng"],
		["Γκ", "Nc"],
		["Γξ", "Nx"],
		["Γχ", "Nch"],
		["Ρρ", "Rrh"]
	],
	letters: [
		["α", "a"],
		["ά", "á"],
		["ὰ", "à"],
		["ᾶ", "â"],
		["ἀ", "a"],
		["ἄ", "á"],
		["ἂ", "à"],
		["ἆ", "â"],
		["ἁ", "ha"],
		["ἅ", "há"],
		["ἃ", "hà"],
		["ἇ", "hâ"],
		["ε", "e"],
		["έ", "é"],
		["ὲ", "è"],
		["ἐ", "e"],
		["ἔ", "é"],
		["ἒ", "è"],
		["ἑ", "he"],
		["ἕ", "hé"],
		["ἓ", "hè"],
		["η", "ē"],
		["ή", "ḗ"],
		["ὴ", "ḕ"],
		["ῆ", "ê"],
		["ἠ", "ē"],
		["ἤ", "ḗ"],
		["ἢ", "ḕ"],
		["ἦ", "ê"],
		["ἡ", "hē"],
		["ἥ", "hḗ"],
		["ἣ", "hḕ"],
		["ἧ", "hê"],
		["ι", "i"],
		["ί", "í"],
		["ὶ", "ì"],
		["ῖ", "î"],
		["ἰ", "i"],
		["ἴ", "í"],
		["ἲ", "ì"],
		["ἶ", "î"],
		["ἱ", "hi"],
		["ἵ", "hí"],
		["ἳ", "hì"],
		["ἷ", "hî"],
		["ϊ", "i"],
		["ΐ", "í"],
		["ῗ", "î"],
		["ῒ", "ì"],
		["ο", "o"],
		["ό", "ó"],
		["ὸ", "ò"],
		["ὀ", "o"],
		["ὄ", "ó"],
		["ὂ", "ò"],
		["ὁ", "ho"],
		["ὅ", "hó"],
		["ὃ", "hò"],
		["υ", "y"],
		["ύ", "ý"],
		["ὺ", "ỳ"],
		["ῦ", "ŷ"],
		["ὐ", "y"],
		["ὔ", "ý"],
		["ὒ", "ỳ"],
		["ὖ", "ŷ"],
		["ὑ", "hy"],
		["ὕ", "hý"],
		["ὓ", "hỳ"],
		["ὗ", "hŷ"],
		["ϋ", "y"],
		["ΰ", "ý"],
		["ῧ", "ŷ"],
		["ῢ", "ỳ"],
		["ω", "ō"],
		["ώ", "ṓ"],
		["ὼ", "ṑ"],
		["ῶ", "ô"],
		["ὠ", "ō"],
		["ὤ", "ṓ"],
		["ὢ", "ṑ"],
		["ὦ", "ô"],
		["ὡ", "hō"],
		["ὥ", "hṓ"],
		["ὣ", "hṑ"],
		["ὧ", "hô"],
		["ᾳ", "ai"],
		["ᾴ", "ái"],
		["ᾲ", "ài"],
		["ᾷ", "âi"],
		["ᾀ", "ai"],
		["ᾄ", "ái"],
		["ᾂ", "ài"],
		["ᾆ", "âi"],
		["ᾁ", "hai"],
		["ᾅ", "hái"],
		["ᾃ", "hài"],
		["ᾇ", "hâi"],
		["ῃ", "ēi"],
		["ῄ", "ḗi"],
		["ῂ", "ḕi"],
		["ῇ", "êi"],
		["ᾐ", "ēi"],
		["ᾔ", "ḗi"],
		["ᾒ", "ḕi"],
		["ᾖ", "êi"],
		["ᾑ", "hēi"],
		["ᾕ", "hḗi"],
		["ᾓ", "hḕi"],
		["ᾗ", "hêi"],
		["ῳ", "ōi"],
		["ῴ", "ṓi"],
		["ῲ", "ṑi"],
		["ῷ", "ôi"],
		["ᾠ", "ōi"],
		["ᾤ", "ṓi"],
		["ᾢ", "ṑi"],
		["ᾦ", "ôi"],
		["ᾡ", "hōi"],
		["ᾥ", "hṓi"],
		["ᾣ", "hṑi"],
		["ᾧ", "hôi"],
		["β", "b"],
		["γ", "g"],
		["δ", "d"],
		["ϝ", "w"],
		["ζ", "z"],
		["θ", "th"],
		["κ", "c"],
		["λ", "l"],
		["μ", "m"],
		["ν", "n"],
		["ξ", "x"],
		["π", "p"],
		["ρ", "r"],
		["ῤ", "r"],
		["ῥ", "rh"],
		["σ", "s"],
		["ς", "s"],
		["τ", "t"],
		["φ", "ph"],
		["χ", "ch"],
		["ψ", "ps"],
		["Α", "A"],
		["Ά", "Á"],
		["Ὰ", "À"],
		["Α͂", "Â"],
		["Ἀ", "A"],
		["Ἄ", "Á"],
		["Ἂ", "À"],
		["Ἆ", "Â"],
		["Ἁ", "Ha"],
		["Ἅ", "Há"],
		["Ἃ", "Hà"],
		["Ἇ", "Hâ"],
		["Ε", "E"],
		["Έ", "É"],
		["Ὲ", "È"],
		["Ἐ", "E"],
		["Ἔ", "É"],
		["Ἒ", "È"],
		["Ἑ", "He"],
		["Ἕ", "Hé"],
		["Ἓ", "Hè"],
		["Η", "Ē"],
		["Ή", "Ḗ"],
		["Ὴ", "Ḕ"],
		["Η͂", "Ê"],
		["Ἠ", "Ē"],
		["Ἤ", "Ḗ"],
		["Ἢ", "Ḕ"],
		["Ἦ", "Ê"],
		["Ἡ", "Hē"],
		["Ἥ", "Hḗ"],
		["Ἣ", "Hḕ"],
		["Ἧ", "Hê"],
		["Ι", "I"],
		["Ί", "Í"],
		["Ὶ", "Ì"],
		["Ι͂", "Î"],
		["Ἰ", "I"],
		["Ἴ", "Í"],
		["Ἲ", "Ì"],
		["Ἶ", "Î"],
		["Ἱ", "Hi"],
		["Ἵ", "Hí"],
		["Ἳ", "Hì"],
		["Ἷ", "Hî"],
		["Ϊ", "I"],
		["Ϊ́", "Í"],
		["Ϊ͂", "Î"],
		["Ϊ̀", "Ì"],
		["Ο", "O"],
		["Ό", "Ó"],
		["Ὸ", "Ò"],
		["Ὀ", "O"],
		["Ὄ", "Ó"],
		["Ὂ", "Ò"],
		["Ὁ", "Ho"],
		["Ὅ", "Hó"],
		["Ὃ", "Hò"],
		["Υ", "Y"],
		["Ύ", "Ý"],
		["Ὺ", "Ỳ"],
		["Υ͂", "Ŷ"],
		["Υ̓", "Y"],
		["Υ̓́", "Ý"],
		["Υ̓̀", "Ỳ"],
		["Υ̓͂", "Ŷ"],
		["Ὑ", "Hy"],
		["Ὕ", "Hý"],
		["Ὓ", "Hỳ"],
		["Ὗ", "Hŷ"],
		["Ϋ", "Y"],
		["Ϋ́", "Ý"],
		["Ϋ͂", "Ŷ"],
		["Ϋ̀", "Ỳ"],
		["Ω", "Ō"],
		["Ώ", "Ṓ"],
		["Ὼ", "Ṑ"],
		["Ω͂", "Ô"],
		["Ὠ", "Ō"],
		["Ὤ", "Ṓ"],
		["Ὢ", "Ṑ"],
		["Ὦ", "Ô"],
		["Ὡ", "Hō"],
		["Ὥ", "Hṓ"],
		["Ὣ", "Hṑ"],
		["Ὧ", "Hô"],
		["ΑΙ", "Ai"],
		["ΆΙ", "Ái"],
		["ᾺΙ", "Ài"],
		["Α͂Ι", "Âi"],
		["ἈΙ", "Ai"],
		["ἌΙ", "Ái"],
		["ἊΙ", "Ài"],
		["ἎΙ", "Âi"],
		["ἉΙ", "Hai"],
		["ἍΙ", "Hái"],
		["ἋΙ", "Hài"],
		["ἏΙ", "Hâi"],
		["ΗΙ", "Ēi"],
		["ΉΙ", "Ḗi"],
		["ῊΙ", "Ḕi"],
		["Η͂Ι", "Êi"],
		["ἨΙ", "Ēi"],
		["ἬΙ", "Ḗi"],
		["ἪΙ", "Ḕi"],
		["ἮΙ", "Êi"],
		["ἩΙ", "Hēi"],
		["ἭΙ", "Hḗi"],
		["ἫΙ", "Hḕi"],
		["ἯΙ", "Hêi"],
		["ΩΙ", "Ōi"],
		["ΏΙ", "Ṓi"],
		["ῺΙ", "Ṑi"],
		["Ω͂Ι", "Ôi"],
		["ὨΙ", "Ōi"],
		["ὬΙ", "Ṓi"],
		["ὪΙ", "Ṑi"],
		["ὮΙ", "Ôi"],
		["ὩΙ", "Hōi"],
		["ὭΙ", "Hṓi"],
		["ὫΙ", "Hṑi"],
		["ὯΙ", "Hôi"],
		["Β", "B"],
		["Γ", "G"],
		["Δ", "D"],
		["Ϝ", "W"],
		["Ζ", "Z"],
		["Θ", "Th"],
		["Κ", "C"],
		["Λ", "L"],
		["Μ", "M"],
		["Ν", "N"],
		["Ξ", "X"],
		["Π", "P"],
		["Ρ", "R"],
		["Ρ̓", "R"],
		["Ῥ", "Rh"],
		["Σ", "S"],
		["Σ", "S"],
		["Τ", "T"],
		["Φ", "Ph"],
		["Χ", "Ch"],
		["Ψ", "Ps"],
		[";", "?"],
		["·", ";"],
		["∙", ";"]
	]
};

const greekToLatin = input => {
	let output = input;

	translitTable.regex.forEach(pattern => {
		output = output.replace(new RegExp(pattern[0], "g"), pattern[1]);
	});

	translitTable.digraphs.forEach(pattern => {
		output = output.replaceAll(pattern[0], pattern[1]);
	});

	translitTable.letters.forEach(pattern => {
		output = output.replaceAll(pattern[0], pattern[1]);
	});

	return output;
};

const formatHymn = input =>
	input
		.split("\n")
		.map(line =>
			`<span class="greek-line"><span class="greek-line-original">${line}</span> <small class="greek-line-transliteration" lang="grc-Latn">${greekToLatin(
				line
			)}</small></span>`
				.replaceAll("[[", '<span class="theonym">')
				.replaceAll("]]", "</span>")
		)
		.join(" ");

export default formatHymn;