Module:moh-verb
Jump to navigation
Jump to search
- The following documentation is located at Module:moh-verb/documentation. [edit]
- Useful links: subpage list • links • transclusions • testcases • sandbox
Module to create Mohawk conjugation tables. Right now it's rudimentary, and needs to be passed the stem with the accent already there (so it can't deal with short verbs) It also currently only makes the Kahnawake forms
References
[edit]- Akwiratékha’ Martin (2018) Tekawennahsonterónnion - Kanien’kéha Morphology, Kahnawà:ke: Kanien’kehá:ka Onkwawén:na Raotitióhkwa Language and Cultural Center
local export = {}
local div_top = [=[
<div class="NavFrame" style="width: 30em;">
<div class="NavHead" style="background: #CCCCFF; text-align: left;">Forms of <i lang="moh">PAGENAME</i></div>
<div class="NavContent">
]=]
local div_bottom = [=[</div>
</div>]=]
local patient_table = [=[
{| class="wikitable"
!-
! colspan="3" | Positive !! colspan="3" | Negative
|-
! scope=row | Pers.
! Sing. !! Dual !! Plur. !! Sing. !! Dual !! Plur.
|-
! scope=row | 1st
| {1|s} || {1|d} || {1|p} || {neg|1|s} || {neg|1|d} || {neg|1|p}
|-
! scope=row | 2nd
| {2|s} || {2|d} || {2|p} || {neg|2|s} || {neg|2|d} || {neg|2|p}
|-
! scope=row | 3rd
| {3|m|s} <br> {3|f//impers|s} <br> {3|f//n|s}
|colspan=2 style="text-align: center;"| {3|m|d//p} <br> {3|f|d//p} || {neg|3|m|s} <br> {neg|3|f//impers|s} <br> {neg|3|f//n|s}
|colspan=2 style="text-align: center;"| {neg|3|m|d//p} <br> {neg|3|f|d//p}
|}]=]
local agent_table = [=[
{| class="wikitable"
!-
! colspan="3" | Positive !! colspan="3" | Negative
|-
! !! Sing. !! Dual !! Plur. !! Sing. !! Dual !! Plur.
|-
! scope=row | 1st
| {1|s} || {1|d|incl} <br> {1|d|excl} || {1|p|incl} <br> {1|p|excl} || {neg|1|s} || {neg|1|d|incl} <br> {neg|1|d|excl} || {neg|1|p|incl} <br> {neg|1|p|excl}
|-
! scope=row | 2nd
| {2|s} || {2|d} || {2|p} || {neg|2|s} || {neg|2|d} || {neg|2|p}
|-
! scope=row | 3rd
|| {3|m|s} <br> {3|f//impers|s} <br> {3|f//n|s}
|| {3|m|d} <br> {3|f|d}
|| {3|m|p} <br> {3|f|p}
|| {neg|3|m|s} <br> {neg|3|f//impers|s} <br> {neg|3|f//n|s}
|| {neg|3|m|d} <br> {neg|3|f|d}
|| {neg|3|m|p} <br> {neg|3|f|p}
|}]=]
local lang = require("Module:languages").getByCode("moh")
local m_string_utilities = require("Module:string utilities")
local m_links = require("Module:links")
local rfind = mw.ustring.find
local rsubn = mw.ustring.gsub
local ulower = mw.ustring.lower
local usub = mw.ustring.sub
local function rsub(term, foo, bar)
local retval = rsubn(term, foo, bar)
return retval
end
local function get_index(str, list)
if list == nil then return -1 end
for i = 1, #list do
if str == list[i] then return i end
end
return -1
end
local function in_set(str, list)
if get_index(str, list) ~= -1 then return true
else return false
end
end
tenses = {"habitual", "fact", "fut", "opt"}
-- form numbers are based off of Lounsbury
local patient_form_names = {"1|s", "2|s", "3|m|s", "3|f//impers|s", "3|f//n|s", "1|d", "2|d", "1|p", "2|p", "3|m|d//p", "3|f|d//p"}
local patient_form_nums = {"16", "19", "21", "22", "20", "17", "7", "18", "8", "24", "23"}
-- wawa becomes on; wa becomes we before s and t; i deleted after wa’
-- wawa > on, awa > aon, hr before e/en/o/on, and ts before i stems prevents strict composition
local agent_form_names = {"1|s", "2|s", "3|m|s", "3|f//impers|s", "3|f//n|s", "1|d|incl", "1|d|excl", "2|d", "3|m|d", "3|f|d", "1|p|incl", "1|p|excl", "2|p", "3|m|p", "3|f|p"}
local agent_form_nums = {"1", "6", "10", "11", "9", "4", "2", "7", "14", "12", "5", "3", "8", "15", "13"}
local trans_nums = {
"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15",--agent
"16","17","18","19","7a","8a", "20", "21", "22", "23", "24", --patient
"25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "31a", "32a", "38", --he/him
"39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "43a", "49", "50", "51", --they
"52", "53", "54", "55", "56", "57", "58"
}
local trans_names = {
"I > it", "we two (excl) > it", "we all (excl) > it",
"we two (incl) > it", "we (incl) > it", "you > it",
"you two > it", "you all > it", "she/it > it",
"it/she > it", "she/s.o. > it", "they both (f) > it",
"they all (f) > it", "they both (m) > it", "they all (m) > it",--agent
"it > me", "it > us two", "it > us all",
"it > you", "it > you two", "it > you all",
"it > it/her", "it > him", "it > her/s.o.",
"it > them (f)", "it > them (m)", --patient
"I > him", "We two (excl) > him", "We all (excl) > him",
"we two (incl) > it", "we all (incl) > it", "you > him",
"you two > him", "you all > him", "she/s.o./they > him",
"he > me", "he > us two", "he > us all",
"he > you", "he > you two", "he > you all", "he > they/s.o.", -- he
"I > they/s.o.", "we (excl) > they/s.o.", "we (incl) > they/s.o.",
"you > they/s.o.", "you (pl) > they/s.o.", "they (f) > they/s.o.",
"they(m) > they/s.o.", "they/s.o. > me", "they/s.o. > us",
"they/s.o. > you", "they/s.o. > you (pl)", "they/s.o. > she/it",
"she/s.o > them(f)/s.o.", "she/s.o. > them(m)/s.o.", -- they
"I > you", "I/us two > you/you two", "I/us > you/you all",
"you > me", "you/you two > me/us two", "you/you all > me/us", "s.o. > s.o." --rest
}
local prefixes = {
-- agent
["1"] = {"k", "ke", "ka", "k", "k", "ki", "t"},
["2"] = {"iakeni", "iakeni","iatia", "iaken", "iaken", "iakeni", "iakeni" },
["3"] = {"iakwa", "iakwa","iakwa", "iakw", "iati", "iakwen", "iakwa" }, -- check
["4"] = {"teni", "teni", "tia", "ten", "ten", "teni", "teni" },
["5"] = {"tewa", "tewa", "tewa", "tew", "ti", "tewen", "tewa" },
["6"] = {"s", "se", "sa", "s", "s", "tsi", "ts" },
["7"] = {"seni", "seni", "ts", "sen", "sen", "seni", "seni" },
["7a"] = {"seni", "seni", "ts", "sen", "sen", "seni", "seni" },
["8"] = {"sewa", "sewa", "sewa", "sew", "ts", "sewen", "sewa" },
["8a"] = {"sewa", "sewa", "sewa", "sew", "ts", "sewen", "sewa" },
["9"] = {"ka", "ka", "w", "w", "i", "ken", "ka" },
["10"] = {"ra", "ra", "ra", "r", "r", "ren", "ra" },
["11"] = {"ie", "ie", "ion", "iak", "iak", "ie", "ie" },
["12"] = {"keni", "keni", "tia", "ken", "ken", "keni", "keni"},
["13"] = {"konti", "konti", "kon", "konn", "konn", "konti", "konti"},
["14"] = {"ni", "ni", "ia", "n", "n", "ni", "ni"},
["15"] = {"rati", "rati", "ron", "ronn", "ronn", "rati", "rati"},
--patient
["16"] = {"wak", "wake", "waka", "wak", "wak", "waki", "wat"},
["17"] = {"ionkeni", "ionkeni", "iontia", "ionken", "ionken", "ionkeni", "ionkeni"},
["18"] = {"ionkwa", "ionkwa", "ionkwa", "ionkw", "ionti", "ionkwen", "ionkwa"},
["19"] = {"sa", "sa", "sa", "s", "s", "sen", "sa"},
["20"] = {"io", "io", "io", "iaw", "ia", "io", "io"},
["21"] = {"ro", "ro", "ro", "raw", "ra", "ro", "ro"},
["22"] = {"iako", "iako", "iako", "iakaw", "iaka", "iako", "iako"},
["23"] = {"ioti", "ioti", "iona", "ion", "ion", "ioti", "ioti"},
["24"] = {"roti", "roti", "rona", "ron", "ron", "roti", "roti"},
--transitive
["25"] = {"ri", "ri", "riia", "rii", "rii", "ri", "ri"},
["26"] = {"shakeni", "shakeni", "shatia", "shaken", "shaken", "shakeni", "shakeni"},
["27"] = {"shakwa", "shakwa", "shakwa", "shakw", "shati", "shakwen", "shakwa"},
["28"] = {"tshiteni", "tshiteni", "tshiti", "tshiten", "tshiten", "tshiteni", "tshiteni"},
["29"] = {"tshitewa", "tshitewa", "tshitewa", "tshitew", "tshiti", "tshitewen", "tshitewa"},
["30"] = {"tsh", "tshe", "tsha", "tsh", "tsh", "tshi", "tsh"}, -- h-stem not handled properly
["31"] = {"tshiseni", "tshiseni", "tshitsa", "tshisen", "tshisen", "tshiseni", "tshiseni"},
["31a"] = {"tshiseni", "tshiseni", "tshitsa", "tshisen", "tshisen", "tshiseni", "tshiseni"},
["32"] = {"tshisewa", "tshisewa", "tshisewa", "tshisew", "tshits", "tshisewen", "tshisewa"},
["32a"] = {"tshisewa", "tshisewa", "tshisewa", "tshisew", "tshits", "tshisewen", "tshisewa"},
--
["33"] = {"ronwa", "ronwa", "ronwa", "ronw", "roni", "ronwen", "ronwa"},
["34"] = {"rak", "rake", "rakwa", "rak", "rak", "rak", "rat"},
["35"] = {"shonkeni", "shonkeni", "shontia", "shonken", "shonken", "shonkeni", "shonkeni"},
["36"] = {"shonkwa", "shonkwa", "shonkwa", "shonkw", "shonti", "shonkwen", "shonkwa"},
["37"] = {"ia", "ia", "ia", "i", "i", "ien", "ia"},
["38"] = {"shako", "shako", "shako", "shakaw", "shaka", "shako", "shako"},
["39"] = {"khe", "khe", "kheia", "khei", "khei", "khe", "khe"},
["40"] = {"iakhi", "iakhi", "iakhiia", "iakhii", "iakhii", "iakhi", "iakhi"},
["41"] = {"iethi", "iethi", "iethiia", "iethii", "iethii", "iethi", "iethi"},
["42"] = {"she", "she", "sheia", "shei", "shei", "she", "she"},
["43"] = {"ietshi", "ietshi", "ietshiia", "ietshii", "ietshii", "ietshi", "ietshi"},
["43a"] = {"ietshi", "ietshi", "ietshiia", "ietshii", "ietshii", "ietshi", "ietshi"},
["44"] = {"iakoti", "iakoti", "iakona", "iakon", "iakon", "iakoti", "iakoti"},
["45"] = {"shakoti", "shakoti", "shakona", "shakon", "shakon", "shakoti", "shakoti"},
["46"] = {"ionk", "ionke", "ionkw", "ionk", "ionk", "ionk", "iont"},
["47"] = {"ionkhi", "ionkhi", "ionkhiia", "ionkhii", "ionkhii", "ionkhi", "ionkhi"},
["48"] = {"iesa", "iesa", "iesa", "ies", "ies", "iesen", "iesa"}, -- has variants with ion-
["49"] = {"konwa", "konwa", "konwa", "konw", "koni", "konwen", "konwa"}, -- has variant konwai before o/on
["50"] = {"konwati", "konwati", "konwana", "konwan", "konwan", "konwati", "konwati"},
["51"] = {"ronwati", "ronwati", "ronwana", "ronwan", "ronwan", "ronwati", "ronwati"},
["52"] = {"kon", "kon", "konia", "koni", "koni", "kon", "kon"},
["53"] = {"keni", "keni", "tia", "ken", "ken", "keni", "keni"},
["54"] = {"kwa", "kwa", "kwa", "kw", "ti", "kwen", "kwa"},
["55"] = {"tak", "take", "takwa", "tak", "tak", "tak", "tat"},
["56"] = {"takeni", "takeni", "tatia", "taken", "taken", "takeni", "takeni"},
["57"] = {"takwa", "takwa", "takwa", "takw", "tati", "takwen", "takwa"},
["58"] = {"iontat", "iontate", "iontat", "iontat", "iontat", "iontat", "iontat"}
}
--patterns for future use
local start_patterns = {
["exceptions"] = {"6", "9", "10", "30"},
["i"] = {"2", "3", "11", "17", "18", "20", "23", "40", "41", "43", "44", "46", "47", "48", "58"}, -- i deleted after wa’
["h"] = {"14", "26", "27", "30", "35", "36", "37", "38", "42", "45"}, -- h reappears after en, wa, a - 6 needs to be handled special
["s/t"] = {"4", "5", "7", "8", "19", "55", "56", "57"}, -- wa’ > we and a > aie before wa
-- (does sh- (26, 27, 35, 36 38, 45) and tsh- (28, 29, 31, 32 count?) for s/t?
["r"] = {"15", "21", "24", "25", "33", "34", "51"} -- r > h, 10 needs to be handled speciall
}
local end_patterns = {
["o"] = {"20", "21", "22", "38"}, --
["i"] = {"25", "40", "41", "43", "47"}, -- epenthetic i
["e"] = {"38", "42"},
["ni"] = {}, -- pay attention to a-stems
["wa"] = {}, -- pay attention to o/on-stems
["ti"] = {"44", "45", "50", "51"}
}
local function find_stress(word)
return word
end
local init_index = { ["C"] = 1, ["R"] = 2, ["A"] = 3, ["E"] = 4, ["O"] = 5, ["I"] = 6, ["Y"] = 7, ["H"] = 1 }
local function combine_prefix(pref_num, class, tense, neg)
index = init_index[class]
pref = prefixes[pref_num][index] -- get the appropriate base
if tense == "base" and neg == false then
if class == "H" and pref_num == "30" then return "ts" end
return pref
elseif tense == "base" and neg == true then
if in_set(pref_num, start_patterns["h"]) then
return "teh" .. pref
elseif in_set(pref_num, start_patterns["r"]) then
return "teh" .. usub(pref,2,-1)
elseif in_set(pref_num, start_patterns["exceptions"]) then
if pref_num == "6" then
alt_6 = {"hs", "hse", "hsa", "hs", "hs", "hs", "hs"}
return "te".. alt_6[index] -- sy becomes ts, but goes back to sy
elseif pref_num == "9" then
alt_9 = {"ka", "ka", "w", "w", "i", "ken", "ka" }
return "te" .. alt_9[index]
elseif pref_num == "10" then
alt_10 = {"ha", "ha", "ha", "hr", "hr", "ha", "ha"}
return "te" .. alt_10[index]
else return "te" .. prefix
end
else
return "te" .. pref
end
end
end
local function build_trans_table(pagename)
trans_table = rsub(div_top, "PAGENAME", pagename)
trans_table = trans_table .. "{| class=\"wikitable\"\n!-\n! Positive \n"
for i = 1, #trans_nums do
new_line = "|-\n! scope=row | " .. trans_names[i] .. "\n| {" .. trans_nums[i] .. "} \n"
trans_table = trans_table .. new_line
end
trans_table = trans_table .. "\n|}"
trans_table = trans_table .. div_bottom
return trans_table
end
function export.show(frame)
PAGENAME = mw.title.getCurrentTitle().text
verb_type = frame.args[1]
text = frame.args[2]
stem = ulower(text)
init = usub(stem,1,1)
second = usub(stem,2,2)
class = nil
if links ~= nil and links == "true" then links = true
else links = false end
--get stem class
init = usub(stem,1,1)
second = usub(stem,2,2)
if init == "a" then
class = "A"
stem = usub(stem,2,-1)
elseif init == "e" then class = "E"
elseif init == "o" then class = "O"
elseif init == "i" then
if second == "a" or second == "e" or second == "o" then class = "Y"
else
class = "I"
stem = ulower(usub(stem,2,-1))
end
elseif init == "n" or init == "r" or init == "w" or init == "’" then class = "R"
elseif init == "h" then class = "H"
else class = "C" end
local forms = {}
if verb_type == "transitive" then
for i = 1, #trans_nums do
prefix_num = trans_nums[i]
forms[prefix_num] = combine_prefix(prefix_num, class, "base", false) .. stem
end
form_table = build_trans_table(PAGENAME)
return m_string_utilities.format(form_table, forms)
elseif verb_type == "stative agent" then
prefix_forms = {}
for i = 1, #agent_form_nums do
prefix_num = agent_form_nums[i]
prefix_name = agent_form_names[i]
neg_prefix_name = "neg|" .. prefix_name
form = combine_prefix(prefix_num, class, "base", false) .. stem
neg_form = combine_prefix(prefix_num, class, "base", true) .. stem
if links then
link = m_links.full_link({term = form, lang = lang, accel = {form = prefix_name}}, "term", false)
neg_link = m_links.full_link({term = form, lang = lang, accel = {form = neg_prefix_name}}, "term", false)
forms[prefix_name] = link
forms[neg_prefix_name] = neg_link
else
forms[prefix_name] = form
forms[neg_prefix_name] = neg_form
end
end
return m_string_utilities.format(agent_table, forms)
elseif verb_type == "stative patient" then
prefix_forms = {}
for i = 1, #patient_form_nums do
prefix_num = patient_form_nums[i]
prefix_name = patient_form_names[i]
neg_prefix_name = "neg|" .. prefix_name
prefix_forms[i] = combine_prefix(prefix_num, class, "base")
form = combine_prefix(prefix_num, class, "base", false) .. stem
neg_form = combine_prefix(prefix_num, class, "base", true) .. stem
if links then
link = m_links.full_link({term = form, lang = lang, accel = {form = prefix_name}}, "term", false)
neg_link = m_links.full_link({term = form, lang = lang, accel = {form = neg_prefix_name}}, "term", false)
forms[prefix_name] = link
forms[neg_prefix_name] = neg_link
else
forms[prefix_name] = form
forms[neg_prefix_name] = neg_form
end
end
return m_string_utilities.format(patient_table, forms)
else return "no type"
end
end
function export.prefix_table(frame)
-- find prefix number to get forms
PAGENAME = usub(mw.title.getCurrentTitle().text,1,-2)
for num, form in pairs(prefixes) do
if form[1] == PAGENAME then prefix_num = num end
end
local prefix_forms = prefixes[prefix_num]
-- cut the a from a-stems, i- from i-stems
local a_stem_final = usub(prefix_forms[3],-1,-1)
if a_stem_final == "a" then prefix_forms[3] = usub(prefix_forms[3],1,-2)
elseif a_stem_final == "o" then prefix_forms[3] = usub(prefix_forms[3],1,-2) .. "<u>o</u>"
else end
local i_stem_final = usub(prefix_forms[6],-1,-1)
if i_stem_final == "i" then prefix_forms[6] = usub(prefix_forms[6],1,-2)
elseif i_stem_final == "o" then prefix_forms[6] = usub(prefix_forms[6],1,-2) .. "<u>o</u>"
elseif i_stem_final == "n" then
i_stem_final = usub(prefix_forms[6],-2,-1)
if i_stem_final == "en" then prefix_forms[6] = usub(prefix_forms[6],1,-3) .. "<u>en</u>"
elseif i_stem_final == "on" then prefix_forms[6] = usub(prefix_forms[6],1,-3) .. "<u>on</u>"
else end
else end
local prefix_table = [=[
{| class="wikitable"
!-
! colspan="7" | Initial consonant
|-
! Environment !! t/s/h/k !! n/r/w/’ !! a !! e/en!! o/on!! i !! y
|-
]=]
line = "| scope=row | Word-Initial \n| "
for i = 1, 6 do line = line .. prefix_forms[i] .. "-" .. " || " end
line = line .. prefix_forms[7] .. "-"
prefix_table = prefix_table .. line
prefix_table = prefix_table .. "\n|}"
return prefix_table
end
return export