2,788
edits
No edit summary |
No edit summary |
||
Line 11: | Line 11: | ||
local UNCHANGED_MARKER = "<i>unchanged</i>" | local UNCHANGED_MARKER = "<i>unchanged</i>" | ||
local | local mutation_rules = { | ||
["b"] = {"bh", "mb"}, | |||
["bh"] = {nil, "mbh"}, | |||
["c"] = {"ch", "nc"}, | |||
["ch"] = {nil, "nch"}, | |||
["d"] = {"d̦", "nd"}, | |||
["d̦"] = {"d̦", "nd̦"}, | |||
["dh"] = {nil, "ndh"}, | |||
["f"] = {nil, "mf"}, | |||
["g"] = {"gh", "ng"}, | |||
["gh"] = {nil, "ngh"}, | |||
["l"] = {nil, "nl"}, | |||
["lh"] = {"l", "nlh"}, | |||
["m"] = {}, | |||
["n"] = {}, | |||
["p"] = {"b", "mp"}, | |||
["r"] = {nil, "dr"}, | |||
["rh"] = {"r", "dr"}, | |||
["s"] = {"ș", "ns"}, | |||
["ș"] = {"ș", "nș"}, | |||
["t"] = {"ț", "nt"}, | |||
["ț"] = {"ț", "nț"}, | |||
} | |||
local vowel_pattern = "[aeiíoóu]" | |||
local function get_radical_data(term) | |||
local initial, prevowel, remainder | |||
if mw.ustring.sub(term, 2, 2) == "h" then | |||
initial = mw.ustring.sub(term, 1, 2) | |||
remainder = mw.ustring.sub(term, 3) | |||
prevowel = mw.ustring.find(mw.ustring.sub(term, 3, 3), vowel_pattern) and true or false | |||
else | |||
initial = mw.ustring.sub(term, 1, 1) | |||
remainder = mw.ustring.sub(term, 2) | |||
prevowel = mw.ustring.find(mw.ustring.sub(term, 2, 2), vowel_pattern) and true or false | |||
end | |||
local vowel = mw.ustring.find(initial, vowel_pattern) and true or false | |||
return initial, vowel, prevowel, remainder | |||
end | end | ||
local function | local function mutate_soft(data) | ||
if data.vowel then | |||
if data.initial == "i" then return data.radical end | |||
return "i" .. data.radical | |||
end | |||
local change = mutation_rules[data.initial][1] | |||
if change then return change .. data.remainder end | |||
if data.prevowel then return data.initial .. "i" .. data.remainder end | |||
return data.radical | |||
end | end | ||
local function | local function mutate_nasal(data) | ||
return | if data.vowel then return "n-" .. data.radical end | ||
local change = mutation_rules[data.initial][2] | |||
if change then return change .. data.remainder end | |||
return data.radical | |||
end | end | ||
function export. | function export.mutate(term) | ||
local | local data = {} | ||
data.radical = term | |||
data.initial, data.vowel, data.prevowel, data.remainder = get_radical_data(term) | |||
data.soft = mutate_soft(data) | |||
data.nasal = mutate_nasal(data) | |||
return data | |||
end | |||
local function get_mutation_info(radical, override, expected) | |||
local irregular = (not override) or (expected ~= override) | |||
local mutation = override or expected | |||
local changed = mutation ~= radical | |||
return mutation, changed, irregular | |||
end | end | ||
function export.show(frame) | function export.show(frame) | ||
local args = require("Module:parameters").process(frame:getParent().args, params) | local args = require("Module:parameters").process(frame:getParent().args, params) | ||
local r = args[" | local radical = args["r"] | ||
local | local data = export.mutate(radical) | ||
local s_mut, s_changed, s_irregular = get_mutation_info(radical, args["s"], data.soft) | |||
local n_mut, n_changed, n_irregular = get_mutation_info(radical, args["n"], data.nasal) | |||
local ret = '{| style="display:table; width:50%; border: 1px solid #b3b3b3; font-size: 95%; text-align: center;' | local ret = '{| style="display:table; width:50%; border: 1px solid #b3b3b3; font-size: 95%; text-align: center;' | ||
ret = ret .. '\n|-' | ret = ret .. '\n|-' | ||
ret = ret .. '\n! style="background:#efefef" colspan= | ret = ret .. '\n! style="background:#efefef" colspan=3 | [[Appendix:Riyan mutation|Riyan mutation]]' | ||
ret = ret .. '\n|-' | ret = ret .. '\n|-' | ||
ret = ret .. '\n! style="padding-top:4px;" | [[Appendix:Glossary#radical|radical]]' | ret = ret .. '\n! style="padding-top:4px;" | [[Appendix:Glossary#radical|radical]]' | ||
ret = ret .. '\n! style="padding-top:4px; | [[Appendix:Glossary#lenition|lenited]]' | |||
ret = ret .. '\n! style="padding-top:4px; | [[Appendix:Glossary#nasal|nasal]]' | ret = ret .. '\n! style="padding-top:4px; | [[Appendix:Glossary#nasal|nasal]]' | ||
ret = ret .. '\n|-' | ret = ret .. '\n|-' | ||
ret = ret .. '\n| style="padding-bottom:4px;" | ' .. | ret = ret .. '\n| style="padding-bottom:4px;" | ' .. radical | ||
ret = ret .. '\n| style="padding-bottom:4px;" | ' .. ((n = | ret = ret .. '\n| style="padding-bottom:4px;" | ' .. (s_changed and s_mut or UNCHANGED_MARKER) .. (s_irregular and IRREG_MARKER or "") | ||
ret = ret .. '\n| style="padding-bottom:4px;" | ' .. (n_changed and n_mut or UNCHANGED_MARKER) .. (n_irregular and IRREG_MARKER or "") | |||
ret = ret .. '\n|-' | ret = ret .. '\n|-' | ||
if n_irregular then | if s_irregular or n_irregular then | ||
ret = ret .. '\n| colspan=2 | <small style="font-size:85%;">' .. IRREGMARKER .. 'Irregular.</small>' | ret = ret .. '\n| colspan=2 | <small style="font-size:85%;">' .. IRREGMARKER .. 'Irregular.</small>' | ||
end | end | ||
if | if s_changed or n_changed then | ||
ret = ret .. "\n| colspan=2 | <small style=\"font-size:85%;\">''Note:'' Some of these forms may be hypothetical. Not every possible mutated form of every word actually occurs.</small>" | ret = ret .. "\n| colspan=2 | <small style=\"font-size:85%;\">''Note:'' Some of these forms may be hypothetical. Not every possible mutated form of every word actually occurs.</small>" | ||
end | end | ||
ret = ret .. '\n|}' | ret = ret .. '\n|}' | ||
if n_irregular and (not args["nocat"]) then | if (s_irregular or n_irregular) and (not args["nocat"]) then | ||
ret = ret .. "[[Categories:Riyan terms with irregular mutation]]" | ret = ret .. "[[Categories:Riyan terms with irregular mutation]]" | ||
end | end |