Module:anui-headword: Difference between revisions

From Linguifex
Jump to navigation Jump to search
No edit summary
No edit summary
Line 43: Line 43:
local glottal = match(C, "[ʇǃǂǁʘ]ʼ") ~= nil
local glottal = match(C, "[ʇǃǂǁʘ]ʼ") ~= nil
if pref then word = C .. v .. gsub(C, "[sšṣ]([ʇǃǂǁʘ])", "%1") end
if pref then word = C .. v .. gsub(C, "[sšṣ]([ʇǃǂǁʘ])", "%1") .. r end
return word
return word

Revision as of 12:48, 7 July 2021



local match = mw.ustring.match
local u = mw. ustring.char
local gsub = mw.ustring.gsub
local sub = mw.ustring.sub

local TILDEA = u(0x0303) -- COMBINING TILDE ̃◌
local TILDEB = u(0x0330) -- COMBINING TILDE BELOW ̰◌

local export = {}

local lang = require("Module:languages").getByCode("art-nui")
local deabb = {["adj"] = "adjectives", ["v"] = "verbs", ["adv"] = "adverbs",}

local function glossary_link(entry, text)
	text = text or entry
	return "[[wikt:Appendix:Glossary#" .. entry .. "|" .. text .. "]]"
end

local function m(word)
	-- as in [[Module:anui-pron]], account for syllabic m
	word = word:gsub("([uùm]ʼ?)m", "%1ᴍ")
	word = word:gsub("m(ʼᴍ)", "ᴍ%1")
	word = word:gsub("([aeiouàèìòù])m", "%1ᴍ")
	word = word:gsub("([aeiouàèìòù])ᴍ([aeiou])", "%1m%2")
	
	return word
end

local function redup(word)
	word = word:gsub("([ḛḭṵaɔ]" .. TILDEB .. "?)", {["ḛ"] = "è", ["ḭ"] = "ì", ["ṵ"] = "ù", ["a" .. TILDEB] = "à", ["ɔ" .. TILDEB] = "ò"})
	word = m(word)
	
	local consonant = "[ǃǂǁʘʼʇxqrʛɴɬšṣschjklmptŋṉṭṯ]"
	local vowel = "[aeiouàèìòùʼᴍ]"
	-- CV > C₁(v)C₂V
	local C = match(word, consonant .. "*")
	local V = match(word, consonant .. "*(" .. vowel .. "*)")
	local r = match(word, C .. V .. "(.*)")
	local v = sub(V, 1, 1)
	
	local pref = match(C, "[sšṣ]") ~= nil
	local nasal = match(C, "ɴ") ~= nil
	local glottal = match(C, "[ʇǃǂǁʘ]ʼ") ~= nil
	
	if pref then word = C .. v .. gsub(C, "[sšṣ]([ʇǃǂǁʘ])", "%1") .. r end
	
	return word
end

function export.show(frame)
	local args = frame:getParent().args
	local word = args["w"] or mw.title.getCurrentTitle().text
	local data = {lang = lang, pos_category = deabb[args[1]], heads = {word}, categories = {}, inflections = {},}
	local pos = args[1]; local f = args[2]
	
	if f == '-' then
		if pos == "adj" then
			table.insert(data.inflections, {label = "not " .. glossary_link("comparable")})
			table.insert(data.categories, lang:getCanonicalName() .. " uncomparable adjectives")
		end
	elseif pos ~= "v" then
		table.insert(data.inflections, {label = glossary_link("comparative"), redup(word)})
		if pos == "adverbs" then table.insert(data.categories, lang:getCanonicalName() .. " comparative " .. pos) end
	else
		table.insert(data.inflections, {label = "[[w:applicative voice|applicative]]", redup(word)})
	end
	
	return require('Module:headword').full_headword(data)
end

return export