-- Denna modul används för att transkribera antik grekiska till svenska.
--
-- För att transkribera modern grekiska kan ett liknande system användas.
-- Det hanteras dock av särskilda moduler. Se:
--
--
--
--
-- Denna modul strävar efter att följa det system som används av
-- "Library of Congress". Det finns i skrivande stund beskrivet här:
--
-- https://www.loc.gov/catdir/cpso/romanization/greek.pdf
--
-- Några avsteg har gjorts för att bättre reflektera hur orden vanligen
-- transkriberas till svenska. Exempelvis förvandlas φρόνησις till "frónēsis",
-- inte "phronēsis".
--
-- Notera att det finns andra sätt för att transkribera forngrekiska.
-- Notera även att denna modul inte (ännu) hanterar skriftsystem som Linear B
-- eller den cypriska stavelseskriften.
--
-- Lägg också märke till att denna version av modulen hanterar de flesta
-- diakriter på ett ganska styvmoderligt sätt. Framtida versioner kan
-- (och bör) göra detta mer nyanserat.
--
--
-- Denna modul används av följande mall:
-- {{tr}}
--
-- Modulen är författad av (och underhålls av) ]
local export = {}
local Q = require("Modul:queue")
local multibyte_char_pattern = ".*"
local acute_accent = "́"
-- börja med de vanligaste bokstäverna
latin_by_greek = {
="A", ="a",
="B", ="b",
="G", ="g",
="D", ="d",
="E", ="e",
="Z", ="z",
="Ē", ="ē",
="Th", ="th",
="I", ="i",
="K", ="k",
="L", ="l",
="M", ="m",
="N", ="n",
="X", ="x",
="O", ="o",
="P", ="p",
="R", ="r",
="S", ="s", ="s",
="T", ="t",
="Y", ="y",
="F", ="f",
="Ch", ="ch",
="Ps", ="ps",
="Ō", ="ō"
}
-- särvariant av beta
latin_by_greek=latin_by_greek
-- särvariant av theta
latin_by_greek=latin_by_greek
-- särvariant av sigma
latin_by_greek=latin_by_greek; latin_by_greek=latin_by_greek
-- två arkaiska bokstäver
latin_by_greek="W"; latin_by_greek="w"
latin_by_greek="Ḳ"; latin_by_greek="ḳ"
-- sen en separat tabell för att hålla reda på vilka som har "spiritus asper":
spiritus_asper = {
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true,
}
-- sen en separat tabell för versalerna:
versaler = {
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true,
}
-- sen en för gemenerna:
gemener = {
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true,
}
-- sen en tabell för de med akut accent:
with_tonos = {
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true,
}
-- sen några separata tabeller för att hålla reda på vilken slags bokstav det är
alfa = {
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
}
gamma = {
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true,
}
epsilon = {
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true,
}
eta = {
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true,
}
jota = {
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true,
}
kappa = {
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
}
xi = {
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true,
}
omikron = {
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
}
rho = {
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true,
}
ypsilon = {
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true,
}
chi = {
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true
}
omega = {
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
}
-- de som har två prickar ovanför vokalen
hiatus = {
= true, = true, = true, = true, = true,
= true, = true, = true, = true, = true,
}
-- generera tabellen för de övriga bokstäverna med diverse diakritiska tecken
for i,v in pairs(versaler) do
if(alfa) then
latin_by_greek = latin_by_greek
if(spiritus_asper) then
latin_by_greek = "H"..latin_by_greek
end
elseif(epsilon) then
latin_by_greek = latin_by_greek
if(spiritus_asper) then
latin_by_greek = "H"..latin_by_greek
end
elseif(eta) then
latin_by_greek = latin_by_greek
if(spiritus_asper) then
latin_by_greek = "H"..latin_by_greek
end
elseif(jota) then
latin_by_greek = latin_by_greek
if(spiritus_asper) then
latin_by_greek = "H"..latin_by_greek
end
elseif(omikron) then
latin_by_greek = latin_by_greek
if(spiritus_asper) then
latin_by_greek = "H"..latin_by_greek
end
elseif(rho) then
latin_by_greek = latin_by_greek
if(spiritus_asper) then
latin_by_greek = latin_by_greek.."h"
end
elseif(ypsilon) then
latin_by_greek = latin_by_greek
if(spiritus_asper) then
latin_by_greek = "H"..latin_by_greek
end
elseif(omega) then
latin_by_greek = latin_by_greek
if(spiritus_asper) then
latin_by_greek = "H"..latin_by_greek
end
end
if with_tonos then
latin_by_greek = mw.ustring.toNFC(latin_by_greek .. acute_accent)
end
end
for i,v in pairs(gemener) do
if(alfa) then
latin_by_greek = latin_by_greek
elseif(epsilon) then
latin_by_greek = latin_by_greek
elseif(eta) then
latin_by_greek = latin_by_greek
elseif(jota) then
latin_by_greek = latin_by_greek
elseif(omikron) then
latin_by_greek = latin_by_greek
elseif(rho) then
latin_by_greek = latin_by_greek
elseif(ypsilon) then
latin_by_greek = latin_by_greek
elseif(omega) then
latin_by_greek = latin_by_greek
end
if(spiritus_asper) then
if(rho) then
latin_by_greek = latin_by_greek.."h"
else
latin_by_greek = "h"..latin_by_greek
end
end
if with_tonos then
latin_by_greek = mw.ustring.toNFC(latin_by_greek .. acute_accent)
end
end
-- Själva transkriberingsfunktionen för forngrekiska
function export.tr( text )
greek_q = Q()
latin_q = Q()
for c in string.gmatch(text, multibyte_char_pattern) do
Q.enqueue(greek_q, c)
end
repeat
local x = Q.dequeue(greek_q)
local y = Q.peekFirst(greek_q)
local z = Q.peekSecond(greek_q)
local u = Q.peekLast(latin_q)
local reversed_comma_above = "̔"
if not latin_by_greek then -- icke-grekiskt tecken
Q.enqueue(latin_q, x)
-- diverse undantag, startar med "spiritus asper" som del av en diftong
elseif (Q.isEmpty(latin_q) or u == " ") and spiritus_asper then
Q.enqueue(latin_q, string.sub(latin_by_greek,1,1)) -- versalt "H" eller gement "h"
if (ypsilon and jota and (not hiatus)) then
if(with_tonos) then
Q.enqueue(latin_q, "ú")
else
Q.enqueue(latin_q, "u")
end
else
Q.enqueue(latin_q, latin_by_greek)
end
if ((alfa or epsilon or eta or omikron or omega) and ypsilon and (not hiatus)) then
if(with_tonos) then
Q.enqueue(latin_q, "ú")
else
Q.enqueue(latin_q, "u")
end
else
Q.enqueue(latin_q, string.sub(latin_by_greek,2))
end
Q.dequeue(greek_q)
-- sen diftongerna "αυ", "ευ", "ηυ", "ου", "ωυ"
elseif ((alfa or epsilon or eta or omikron or omega) and ypsilon and (not hiatus)) then
Q.enqueue(latin_q, latin_by_greek)
if(with_tonos) then
Q.enqueue(latin_q, "ú")
else
Q.enqueue(latin_q, "u")
end
Q.dequeue(greek_q)
-- sen diftongen "υι"
elseif (ypsilon and jota and (not hiatus)) then
if(with_tonos and spiritus_asper) then
Q.enqueue(latin_q, "hú")
elseif(with_tonos) then
Q.enqueue(latin_q, "ú")
elseif(spiritus_asper) then
Q.enqueue(latin_q, "hu")
else
Q.enqueue(latin_q, "u")
end
Q.enqueue(latin_q, latin_by_greek)
Q.dequeue(greek_q)
-- sen bokstavsföljden "γγ"
elseif (gamma and gamma) then
Q.enqueue(latin_q,"n")
Q.enqueue(latin_q,latin_by_greek)
Q.dequeue(greek_q)
-- sen bokstavsföljden "γκ"
elseif (gamma and kappa) then
Q.enqueue(latin_q,"n")
Q.enqueue(latin_q,latin_by_greek)
Q.dequeue(greek_q)
-- sen bokstavsföljden "γξ"
elseif (gamma and xi) then
Q.enqueue(latin_q,"n")
Q.enqueue(latin_q,latin_by_greek)
Q.dequeue(greek_q)
-- sen bokstavsföljden "γχ"
elseif (gamma and chi) then
Q.enqueue(latin_q,"n")
Q.enqueue(latin_q,latin_by_greek)
Q.dequeue(greek_q)
-- sen, när "spiritus asper" hanteras med modifierare
elseif y == reversed_comma_above then
Q.enqueue(latin_q, "h") -- TODO!!! Kan detta vara versalt "H"? Diftonger?
Q.enqueue(latin_q, latin_by_greek)
Q.dequeue(greek_q)
else
Q.enqueue(latin_q, latin_by_greek)
end
until Q.isEmpty(greek_q)
local tbl = {}
repeat
local x = Q.dequeue(latin_q)
table.insert(tbl,x)
until Q.isEmpty(latin_q)
return table.concat(tbl, "")
end
return export