Module:Ethi-common
Appearance
- This module lacks a documentation subpage. Please create it.
- Useful links: subpage list • links • transclusions • testcases • sandbox
local export = {}
local m_str_utils = require("Module:string utilities")
local codepoint = m_str_utils.codepoint
local floor = math.floor
local u = m_str_utils.char
local labiovelars = {"ቈ", "ቘ", "ኈ", "ኰ", "ዀ", "ጐ"}
local palatals_to_base = {
["ፘ"] = "ረ",
["ፙ"] = "መ",
["ፚ"] = "ፈ"
}
local base_to_palatals = {}
for k, v in pairs(palatals_to_base) do
base_to_palatals[v] = k
end
function export.to_components(char)
local cp = codepoint(char)
local base_cp, order = floor(cp / 8) * 8, (cp % 8) + 1
local base = u(base_cp)
local labiovelar = false
local palatalized = false
local alt = false
if cp >= 0x1200 and cp <= 0x1357 then
for _, c in ipairs(labiovelars) do
local test_cp = codepoint(c)
if order == 8 and (base_cp + 8) == test_cp then
order = 4
labiovelar = true
alt = true
break
elseif base_cp == test_cp then
base_cp = base_cp - 8
labiovelar = true
break
end
end
if order == 8 then
order = 4
labiovelar = true
end
base = u(base_cp)
elseif palatals_to_base[char] then
base = palatals_to_base[char]
order = 1
palatalized = true
else
error("Only Ethiopic characters from ሀ - ፚ supported")
end
return {
base = base,
order = order,
labiovelar = labiovelar,
palatalized = palatalized,
alt = alt
}
end
function export.from_components(components)
local base_cp = codepoint(components.base)
local cp = base_cp + (components.order - 1)
if components.palatalized then
return base_to_palatals[components.base]
elseif components.labiovelar then
if components.alt then
return u(base_cp + 7)
else
for _, c in ipairs(labiovelars) do
if base_cp + 8 == codepoint(c) then
return u(base_cp + 8 + (components.order - 1))
end
end
return u(base_cp + 7)
end
end
return u(cp)
end
return export