Module:xchc-noun: Difference between revisions

From Linguifex
Jump to navigation Jump to search
Undo revision 474001 by Sware (talk)
No edit summary
 
(One intermediate revision by the same user not shown)
Line 24: Line 24:
local vowel = "[ыиэеаяүөуюоёӯӣɜɔ]" --"[aeɛioɔuyø]"
local vowel = "[ыиэеаяүөуюоёӯӣɜɔ]" --"[aeɛioɔuyø]"
local genders = {["a"] = "animate", ["i"] = "inanimate"}
local genders = {["a"] = "animate", ["i"] = "inanimate"}
local function pron(w)
--return m_ipa.crux(w)
return w
end


local function gsubh(word, pat, repl, def)
local function gsubh(word, pat, repl, def)
Line 59: Line 54:
data.g = g
data.g = g
data.sg = ""
data.sg = ""
data.lang = lang
local pautable = {
local pautable = {
Line 83: Line 79:
["a"] = (match(simplified_word, "[" .. voiceless .. "]$") and "ф" or "в") .. gsubh(word, "Rд",{["r"]="ө",["u"]="э", ["ar"]="э"}),
["a"] = (match(simplified_word, "[" .. voiceless .. "]$") and "ф" or "в") .. gsubh(word, "Rд",{["r"]="ө",["u"]="э", ["ar"]="э"}),
}
}
data.cats = {}
table.insert(data.cats, "Chiingimec " .. genders[data.g] .. " nouns")
return make_table(data)
return make_table(data)
Line 143: Line 142:
  or "са",
  or "са",
["gen"] = "ля",
["gen"] = "ля",
["ins"] = match(w_number[n_sh], vowel .. "$") and "лза"
["ins"] = match(w_number[n_sh], vowel .. "$") and "лз"
  or gsubh(w_number[n_sh], "Rлз",{["r"]="ө",["u"]="э",["ar"]="ө"}),
  or gsubh(w_number[n_sh], "Rлз",{["r"]="ө",["u"]="э",["ar"]="ө"}),
["pro"] = gsubh(w_number[n_sh], "сRц",{["r"]="ө",["u"]="э", ["ar"]="ө"}),
["pro"] = gsubh(w_number[n_sh], "сRц",{["r"]="ө",["u"]="э", ["ar"]="ө"}),
Line 173: Line 172:
after_title="[[:Category:Chiingimec " .. genders[data.g] .. " nouns|" .. genders[data.g] .. "]]",
after_title="[[:Category:Chiingimec " .. genders[data.g] .. " nouns|" .. genders[data.g] .. "]]",
all_cases=make_cases(data)
all_cases=make_cases(data)
}) .. (data.nocat and "" or "[[Category:Chiingimec " .. genders[data.g] .. " nouns|" .. genders[data.g] .. "]]")
}) .. (data.nocat and "" or require("Module:utilities").format_categories(data.cats, data.lang))
end
end


return export
return export

Latest revision as of 18:34, 20 April 2026



local sub = mw.ustring.sub
local find = mw.ustring.find
local match = mw.ustring.match
local gmatch = mw.ustring.gmatch
local gsub = mw.ustring.gsub
local u = mw.ustring.char
local split = mw.text.split
local gsplit = mw.text.gsplit

local m_tr = require('Module:xchc-translit')
local m_ipa = require('Module:xchc-pron')

local c = require("Module:languages/data").chars

local lang = require('Module:languages').getByCode("xchc")
local PAGENAME = mw.title.getCurrentTitle().text
local NAMESPACE = mw.title.getCurrentTitle().nsText

local export = {}

local voiced = "мньӈбдгвзжғлрй" --"mnɲŋbdɡvzʒɣlr"
local voiceless = "пткфсшӀчц" --"ptkfsʃxh"
local consonant = "[" .. voiced .. voiceless .. "]"
local vowel = "[ыиэеаяүөуюоёӯӣɜɔ]" --"[aeɛioɔuyø]"
local genders = {["a"] = "animate", ["i"] = "inanimate"}

local function gsubh(word, pat, repl, def)
	local harmony = m_ipa.harmony(word)
	
	if pat:match("B") and pat:match("R") then
		pat = gsub(pat, "B", repl[harmony.backness])
		pat = gsub(pat, "R", repl[harmony.roundness])
	else
		pat = gsub(pat, "([BR])",function(s) return repl[harmony[s == "B" and "backness" or "roundness"]] end)
	end

	return pat
end

function export.show(frame)
	local parent_args = frame:getParent().args
	
	local g = NAMESPACE == "Template" and "a" or parent_args[1]
	local word = NAMESPACE == "Template" and "өра̄" or parent_args["word"] or PAGENAME
	local unc = parent_args["unc"] or false
	
	local args = {}
	
	if g ~= "i" and g ~= "a" then error("Unknown gender: it must be either ‘i’ or ‘a’") end
	
	data = {}
	data.word = word
	data.nocat = parent_args["nocat"] or false
	data.g = g
	data.sg = ""
	data.lang = lang
	
	local pautable = {
		["[эеыиӣөү]"] = "ч",
		["[ɛая]"] = "н",
		["[уӯоɔ]"] = "ӈ",
	}
	
	local simplified_word = m_ipa.simplify(word)
	--data.pau = nil
	if simplified_word:match(vowel .. "$") then
		for pat, pau in pairs(pautable) do
			if simplified_word:match(pat .. "$") then
				data.pau = pau
				break
			end
		end
	else
		data.pau = gsubh(word, "Bӈ",{["b"]="о̆",["f"]="э̆", ["ab"]="о̆"})
	end
	
	data.pl = {
		["i"] = (match(simplified_word, "[" .. voiceless .. "]$") and "ш" or "ж") .. gsubh(word, "Bд",{["b"]="о̆",["e"]="э̆", ["ab"]="о̆"}),
		["a"] = (match(simplified_word, "[" .. voiceless .. "]$") and "ф" or "в") .. gsubh(word, "Rд",{["r"]="ө",["u"]="э", ["ar"]="э"}),
	}
	
	data.cats = {}
	table.insert(data.cats, "Chiingimec " .. genders[data.g] .. " nouns")
	
	return make_table(data)
end

function make_table(data)
	
	local function show_form(form)
		local function link(term)
			local links = {}
			for alt in gmatch(term, "([^%s,]+)") do
				alt = term == "—" and term or "[[Contionary:" .. alt .. "|" .. alt .. "]]"
				table.insert(links, alt)
			end
			return table.concat(links, ", ")
		end
		
		if not form then
			return "—"
		end
		
		local ret, tr_ret = {}, {}
		
		for _, subform in ipairs(type(form) == "table" or {form}) do
			table.insert(ret, link(subform))
			local tr_subform, _ = m_tr.tr(subform,lang)
			table.insert(tr_ret, tr_subform)
		end
			
		return '<span lang="xchc" class="Cyrl">' .. table.concat(ret, ", ") .. '</span><br/><span style="color: #888;">' .. table.concat(tr_ret, ", ") .. "</span>"
	end

	function make_cases(data)
		local cases = {"nominative", "accusative", "dative", "genitive", "instrumental", "prosecutive", "adessive<br/>comitative", "ablative<br/>elative", "illative<br/>allative"}
		local numbers = {"singular", "paucal", "plural"}
		
		local ret = {}
		
		if data.unc then
			numbers[2], numbers[3], numbers_sh[2], numbers_sh[3] = nil, nil, nil, nil
		end
		table.insert(ret, '! style="width:8em;" |\n')
		for _, number in ipairs(numbers) do
			table.insert(ret, "! " .. number .. "\n")
		end
		table.insert(ret, "|-\n")
		for _, case in ipairs(cases) do
			local c_sh = case:sub(1,3)
			table.insert(ret, '! style="background:#EFF4FD" |' .. case .. '\n')
			for _, number in ipairs(numbers) do
				local n_sh = number:sub(1,2)
				local w_number = {["si"] = data.word .. data.sg, ["pa"] = data.word .. data.pau, ["pl"] = data.word .. data.pl[data.g]}
				local decl = {
					["nom"] = "",
					["acc"] = match(w_number[n_sh], vowel .. "$") and "дза"
						      or match(w_number[n_sh], voiced .. "$") and "да"
						      or "та",
					["dat"] = match(w_number[n_sh], vowel .. "$") and "ша"
							  or match(w_number[n_sh], voiced .. "$") and "за"
							  or "са",
					["gen"] = "ля",
					["ins"] = match(w_number[n_sh], vowel .. "$") and "лз"
							  or gsubh(w_number[n_sh], "Rлз",{["r"]="ө",["u"]="э",["ar"]="ө"}),
					["pro"] = gsubh(w_number[n_sh], "сRц",{["r"]="ө",["u"]="э", ["ar"]="ө"}),
					["ade"] = "ляц",
					["abl"] = gsubh(w_number[n_sh], "сRшB",{["r"]="у",["u"]="ы",["b"]="о̄̆",["f"]="э̄̆",["ar"]="у",["ab"]="э̄̆"}),
					["ill"] = gsubh(w_number[n_sh], "кRб",{["r"]="ү",["u"]="ы",["ar"]="ы"}),
				}
				table.insert(ret, "| " .. show_form(w_number[n_sh] .. decl[c_sh]) .. "\n")
			end
			table.insert(ret, "|-\n")
		end
		
		return table.concat(ret)
	end

	local t = [=[
	<div class="mw-collapsible" style="margin: 0px 0px -1px 0px; padding: 2px; border: 1px solid #aaaaaa; text-align: center; border-collapse: collapse; font-size: 95%; overflow: auto; width: auto; min-width: 35em; display:inline-block; color: #202122;">
	<div style="min-height: 1.6em; font-size: 100%; text-align: left; padding-left: 10px; background-image: -webkit-gradient(linear,left top,left bottom,from(#EFEFEF),to(#DFDFDF),color-stop(0.6,#E3E3E3)); background-image: -moz-linear-gradient(top,#EFEFEF,#E3E3E3 60%,#DFDFDF); background-image: -o-linear-gradient(top,#EFEFEF,#E3E3E3 60%,#DFDFDF); background: #EFF4FD; cursor: pointer;">'''Declension of {title}'''&nbsp;(<span style="font-weight:normal; font-size: smaller;">{after_title}</span>)&nbsp;</div>
	<div class="mw-collapsible-content" style="font-size: 100%; display: block;">
	{\op}|style="background:#F9F9F9; text-align:center; min-width:35em; width:100%;" class="inflection-table"
	|- style="background:#BDD3F7"
	{all_cases}
	|-
	|{\cl}</div></div>
	]=]

	return require("Module:string utilities").format(t,{
		title='<span lang="xchc" class="Cyrl">' .. data.word .. '</span>',
		after_title="[[:Category:Chiingimec " .. genders[data.g] .. " nouns|" .. genders[data.g] .. "]]",
		all_cases=make_cases(data)
		}) .. (data.nocat and "" or require("Module:utilities").format_categories(data.cats, data.lang))
end

return export