Jump to content

Module:Ancient Greek

Permanently protected module
From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Erutuon (talk | contribs) at 23:30, 21 October 2017 (rv 2 edits: returns function). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

local p = {}

local U = mw.ustring.char

local tt = {
	-- Plain vowels
	["[αἀᾰ]"] = "a", ["[ΑἈᾸ]"] = "A",
	["[άἄ]"]  = "á", ["[ΆἌ]"]  = "Á",
	["[ὰἂ]"]  = "à", ["[ᾺἊ]"]  = "À",
	["[ᾱ]"]   = "ā", ["[Ᾱ]"]   = "Ā",
	["[ᾶἆ]"]  = "â", ["[Ἆ]"]   = "Â",
	
	["[εἐ]"] = "e", ["[ΕἘ]"] = "E",
	["[έἔ]"] = "é", ["[ΈἜ]"] = "É",
	["[ὲἒ]"] = "è", ["[ῈἚ]"] = "È",
	
	["[ηἠ]"] = "ē", ["[ΗἨ]"] = "Ē",
	["[ήἤ]"] = "ḗ", ["[ΉἬ]"] = "Ḗ",
	["[ὴἢ]"] = "ḕ", ["[ῊἪ]"] = "Ḕ",
	["[ῆἦ]"] = "ê", ["[Ἦ]"]  = "Ê",
	
	["[ιἰῐ]"] = "i", ["[ΙἸῘ]"] = "I",
	["[ίἴ]"]  = "í", ["[ΊἼ]"]  = "Í",
	["[ὶἲ]"]  = "ì", ["[ῚἺ]"]  = "Ì",
	["ῑ"]     = "ī", ["Ῑ"]     = "Ī",
	["[ῖἶ]"]  = "î", ["[Ἶ]"]   = "Î",
	
	["[οὀ]"] = "o", ["[ΟὈ]"] = "O",
	["[όὄ]"] = "ó", ["[ΌὌ]"] = "Ó",
	["[ὸὂ]"] = "ò", ["[ῸὊ]"] = "Ò",
	
	["[ωὠ]"] = "ō", ["[ΩὨ]"] = "Ō",
	["[ώὤ]"] = "ṓ", ["[ΏὬ]"] = "Ṓ",
	["[ὼὢ]"] = "ṑ", ["[ῺὪ]"] = "Ṑ",
	["[ῶὦ]"] = "ô", ["[Ὦ]"]  = "Ô",
	
	["[υὐῠ]"] = "u", ["[ΥῨ]"] = "U",
	["[ύὔ]"]  = "ú", ["[Ύ]"]  = "Ú",
	["[ὺὒ]"]  = "ù", ["[Ὺ]"]  = "Ù",
	["ῡ"]     = "ū", ["Ῡ"]    = "Ū",
	["[ῦὖ]"]  = "û",
	
	-- Aspirated vowels
	["[ἁ]"] = "ha", ["[Ἁ]"] = "Ha",
	["[ἅ]"] = "há", ["[Ἅ]"] = "Há",
	["[ἃ]"] = "hà", ["[Ἃ]"] = "Hà",
	["[ἇ]"] = "hâ", ["[Ἇ]"] = "Hâ",
	
	["[ἑ]"] = "he", ["[Ἑ]"] = "He",
	["[ἕ]"] = "hé", ["[Ἕ]"] = "Hé",
	["[ἓ]"] = "hè", ["[Ἓ]"] = "Hè",
	
	["[ἡ]"] = "hē", ["[Ἡ]"] = "Hē",
	["[ἥ]"] = "hḗ", ["[Ἥ]"] = "Hḗ",
	["[ἣ]"] = "hḕ", ["[Ἣ]"] = "Hḕ",
	["[ἧ]"] = "hê", ["[Ἧ]"] = "Hê",
	
	["[ἱ]"] = "hi", ["[Ἱ]"] = "Hi",
	["[ἵ]"] = "hí", ["[Ἵ]"] = "Hí",
	["[ἳ]"] = "hì", ["[Ἳ]"] = "Hì",
	["[ἷ]"] = "hî", ["[Ἷ]"] = "Hî",
	
	["[ὁ]"] = "ho", ["[Ὁ]"] = "Ho",
	["[ὅ]"] = "hó", ["[Ὅ]"] = "Hó",
	["[ὃ]"] = "hò", ["[Ὃ]"] = "Hò",
	
	["[ὡ]"] = "hō", ["[Ὡ]"] = "Hō",
	["[ὥ]"] = "hṓ", ["[Ὥ]"] = "Hṓ",
	["[ὣ]"] = "hṑ", ["[Ὣ]"] = "Hṑ",
	["[ὧ]"] = "hô", ["[Ὧ]"] = "Hô",
	
	["[ὑ]"] = "hu", ["[Ὑ]"] = "Hu",
	["[ὕ]"] = "hú", ["[Ὕ]"] = "Hú",
	["[ὓ]"] = "hù", ["[Ὓ]"] = "Hù",
	["[ὗ]"] = "hû", ["[Ὗ]"] = "Hû",
	
	-- Iota subscript vowels
	["[ᾳᾀ]"] = "āi", ["[ᾼᾈ]"] = "Āi",
	["[ᾴᾄ]"] = "āí", ["[ᾌ]"]  = "Āí",
	["[ᾲᾂ]"] = "āì", ["[ᾊ]"]  = "Āì",
	["[ᾷᾆ]"] = "āî", ["[ᾎ]"]  = "Āî",
	
	["[ῃᾐ]"] = "ēi", ["[ῌᾘ]"] = "Ēi",
	["[ῄᾔ]"] = "ēí", ["[ᾜ]"]  = "Ēí",
	["[ῂᾒ]"] = "ēì", ["[ᾚ]"]  = "Ēì",
	["[ῇᾖ]"] = "ēî", ["[ᾞ]"]  = "Ēî",
	
	["[ῳᾠ]"] = "ōi", ["[ῼᾨ]"] = "Ōi",
	["[ῴᾤ]"] = "ōí", ["[ᾬ]"]  = "Ōí",
	["[ῲᾢ]"] = "ōì", ["[ᾪ]"]  = "Ōì",
	["[ῷᾦ]"] = "ōî", ["[ᾮ]"]  = "Ōî",
	
	-- Aspirated iota subscript vowels
	["[ᾁ]"] = "hāi", ["[ᾉ]"] = "Hāi",
	["[ᾅ]"] = "hāí", ["[ᾍ]"] = "Hāí",
	["[ᾃ]"] = "hāì", ["[ᾋ]"] = "Hāì",
	["[ᾇ]"] = "hāî", ["[ᾏ]"] = "Hāî",
	
	["[ᾑ]"] = "hēi", ["[ᾙ]"] = "Hēi",
	["[ᾕ]"] = "hēí", ["[ᾝ]"] = "Hēí",
	["[ᾓ]"] = "hēì", ["[ᾛ]"] = "Hēì",
	["[ᾗ]"] = "hēî", ["[ᾟ]"] = "Hēî",
	
	["[ᾡ]"] = "hōi", ["[ᾩ]"] = "Hōi",
	["[ᾥ]"] = "hōí", ["[ᾭ]"] = "Hōí",
	["[ᾣ]"] = "hōì", ["[ᾫ]"] = "Hōì",
	["[ᾧ]"] = "hōî", ["[ᾯ]"] = "Hōî",
	
	-- Diaeresis vowels
	["[ϊ]"] = "ï", ["Ϊ"] = "Ï",
	["[ΐ]"] = "ḯ",
	["[ῒ]"] = "ï̀",
	["[ῗ]"] = "ï̂",
	
	["[ϋ]"] = "ü", ["Ϋ"] = "Ü",
	["[ΰ]"] = "ǘ",
	["[ῢ]"] = "ǜ",
	["[ῧ]"] = "ü̂",
	
	-- Consonants
	["β"]    = "b",  ["Β"] = "B",
	["γ"]    = "g",  ["Γ"] = "G",
	["δ"]    = "d",  ["Δ"] = "D",
	["ζ"]    = "z",  ["Ζ"] = "Z",
	["θ"]    = "th", ["Θ"] = "Th",
	["κ"]    = "k",  ["Κ"] = "K",
	["λ"]    = "l",  ["Λ"] = "L",
	["μ"]    = "m",  ["Μ"] = "M",
	["ν"]    = "n",  ["Ν"] = "N",
	["ξ"]    = "ks",  ["Ξ"] = "Ks",
	["π"]    = "p",  ["Π"] = "P",
	["[ρῤ]"] = "r",  ["Ρ"] = "R",
	["ῥ"]    = "rh", ["Ῥ"] = "Rh",
	["[σς]"] = "s",  ["Σ"] = "S",
	["τ"]    = "t",  ["Τ"] = "T",
	["φ"]    = "ph", ["Φ"] = "Ph",
	["χ"]    = "kh", ["Χ"] = "Kh",
	["ψ"]    = "ps", ["Ψ"] = "Ps",
	
	-- Archaic letters
	["ϝ"] = "w", ["Ϝ"] = "W",
	["ϻ"] = "ś", ["Ϻ"] = "Ś",
	["ϙ"] = "q", ["Ϙ"] = "Q",
	["ϡ"] = "š", ["Ϡ"] = "Š",
	["ͷ"] = "v", ["Ͷ"] = "V",
	
	-- Diacritics
	["[" .. U(0x0313) .. U(0x1FBF) .. "]"] = "",
	["[" .. U(0x0314) .. U(0x1FFE) .. "]"] = "h",
	["[" .. U(0x345)  .. U(0x37A)  .. "]"] = "i",
}

local error

function p.transliterate(text)
	local gsub = mw.ustring.gsub
	local find = mw.ustring.find
	local out
	if text == "" or text == nil then
		out = ""
		error = '<span style="color: red; font-size: 85%;">Please place Ancient Greek text in the first parameter of {{[[Template:grc-transl|grc-transl]]}}.</span>'
	elseif find(mw.ustring.toNFD(text), "[ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρςστυφχψω]") == nil then
		out = text
		error = '<span style="color: red; font-size: 85%;"><code>' .. text .. '</code> is not Ancient Greek; {{[[Template:grc-transl|grc-transl]]}} can only transliterate Ancient Greek text.</span>'
	else
		text = gsub(text, "γ([γκξχ])", "n%1")
		text = gsub(text, "ρρ", "rrh")

		for regex, repl in pairs(tt) do
			text = gsub(text, regex, repl)
		end

		text = gsub(text, "([aáàāâeéèēêiíìīîoóòōôuúùūû])h([iíìîuúùû])", "h%1%2")
		text = gsub(
			text,
			"([AÁÀĀÂEÉÈĒÊIÍÌĪÎOÓÒŌÔUÚÙŪÛ])h([iíìîuúùû])",
			function(c, d) return "H" .. mw.ustring.lower(c) .. d end
		)
		out = text
	end
	return out
end

function p.translit(frame)
	local args = mw.getCurrentFrame():getParent().args
	local text = frame.args[1] or args[1]
	local transliteration = p.transliterate(text)
	if transliteration and not error then
		return '<span title="Ancient Greek transliteration" class="Unicode" style="white-space:normal; text-decoration: none"><i>' .. transliteration .. '</i></span>'
	else
		return error
	end
end


return p