Module:ig-conj
Appearance
- This module lacks a documentation subpage. Please create it.
- Useful links: subpage list • links • transclusions • testcases • sandbox
local export = {}
local u = mw.ustring.char
local ACUTE = u(0x0301)
local MACRON = u(0x0304)
local GRAVE = u(0x0300)
local DOT = u(0x0323)
local diacritics = ACUTE .. MACRON .. GRAVE .. DOT
function export.verb(frame)
return make_table(nil)
end
function export.infinitive(base)
local decomposed = mw.ustring.toNFD(base)
local inf_prefix
if isATR(decomposed) then
inf_prefix = "i" .. ACUTE
else
inf_prefix = "i" .. DOT .. ACUTE
end
local syllables = {}
for syll in mw.ustring.gmatch(decomposed, "[^aeiou]*[aeiou]["..diacritics.."]*") do
local i = mw.ustring.find(syll, "["..ACUTE..MACRON..GRAVE.."]")
local tone = mw.ustring.sub(syll, i, i)
local toneless_syll = mw.ustring.sub(syll, 1, i-1) .. mw.ustring.sub(syll, i+1)
table.insert(syllables, {toneless_syll, tone})
end
-- Apply raising rule
if #syllables >= 2 and syllables[1][2] == GRAVE and syllables[2][2] == GRAVE then
syllables[1][2] = ACUTE
end
-- Apply rightward lowering rule
local grave_index
for i, syll in ipairs(syllables) do
if syll[2] == GRAVE then
grave_index = i
break
end
end
if grave_index then
for i=grave_index+1, #syllables do
if syllables[i][2] == ACUTE then
syllables[i][2] = GRAVE
end
end
end
-- Apply downstep
if syllables[1][2] == ACUTE then
syllables[1][2] = MACRON
end
local combined = ""
for _, syll in ipairs(syllables) do
combined = combined .. table.concat(syll)
end
return mw.ustring.toNFC(inf_prefix .. combined)
end
function export.participle(base)
local decomposed = mw.ustring.toNFD(base)
local participle_prefix
if isATR(decomposed) then
participle_prefix = "e"
else
participle_prefix = "a"
end
local first_vowel = get_first_vowel(decomposed)
if mw.ustring.find(first_vowel, ACUTE) then
participle_prefix = participle_prefix .. GRAVE
else
participle_prefix = participle_prefix .. ACUTE
end
return mw.ustring.toNFC(participle_prefix .. decomposed)
end
--This function expects the form to already be in NFD form
function get_first_vowel(decomposed_base)
local i, j = mw.ustring.find(decomposed_base, "[aeiou]["..DOT..ACUTE..GRAVE..MACRON.."]*")
return mw.ustring.sub(decomposed_base, i, j)
end
--This function expects the form to already be in NFD form
function isATR(decomposed_base)
local first_vowel = get_first_vowel(decomposed_base)
return not mw.ustring.find(first_vowel, "[a"..DOT.."]")
end
function make_table(data)
local wikicode = {}
local rows = {
"infinitive",
"participle",
"imperative",
"subjunctive",
"simple present",
"indicative",
"perfective"
}
table.insert(wikicode, "{| class=\"wikitable\"")
table.insert(wikicode, "|+ Conjugation of ??")
table.insert(wikicode, "|-")
table.insert(wikicode, "! !! Positive !! Negative")
table.insert(wikicode, "|-")
for _, row in ipairs(rows) do
table.insert(wikicode, "! " .. row)
table.insert(wikicode, "| ||")
table.insert(wikicode, "|-")
end
table.insert(wikicode, "|}")
return table.concat(wikicode, "\n")
end
return export