Module:headword/templates

From Linguifex
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.


local export = {}

-- Part of speech types that should not be pluralized.
local invariable = mw.loadData("Module:headword/data").invariable

function export.head_t(frame)
	local plain_param = {}
	local list_with_holes = {list = true, allow_holes = true}
	local params = {
		[1] = {required = true, default = "und"},
		["sc"] = plain_param,
		["cat sc"] = plain_param,
		["sort"] = plain_param,
		
		[2] = {required = true, default = "nouns"},
		["noposcat"] = {type = "boolean"},
		["nomultiwordcat"] = {type = "boolean"},
		["nogendercat"] = {type = "boolean"},
		["cat2"] = plain_param,
		["cat3"] = plain_param,
		["cat4"] = plain_param,
		
		["head"] = {list = true, allow_holes = true, default = ""},
		["id"] = plain_param,
		["tr"] = list_with_holes,
		["ts"] = list_with_holes,
		["g"] = {list = true},
		["affix"] = {list = true},
		
		[3] = list_with_holes,
		
		["f=accel-form"]     = list_with_holes,
		["f=accel-translit"] = list_with_holes,
		["f=accel-lemma"]    = list_with_holes,
		["f=accel-lemma-translit"] = list_with_holes,
		["f=accel-gender"]   = list_with_holes,
		["f=accel-nostore"]  = {list = true, allow_holes = true, type = "boolean"},
		["f=request"]        = list_with_holes,
		["f=alt"]            = list_with_holes,
		["f=sc"]             = list_with_holes,
		["f=id"]             = list_with_holes,
		["f=tr"]             = list_with_holes,
		["f=g"]              = list_with_holes,
		["f=qual"]           = list_with_holes,
		["f=nolink"]         = {list = true, allow_holes = true, type = "boolean"},
		["f=lang"]           = list_with_holes,
	}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	
	-- Get language and script information
	local data = {}
	data.lang = require("Module:languages").getByCode(args[1]) or require("Module:languages").err(args[1], 1)
	data.sort_key = args["sort"]
	data.heads = args["head"]
	data.id = args["id"]
	data.translits = args["tr"]
	data.transcriptions = args["ts"]
	data.genders = args["g"]
	data.affix = args["affix"]
	
	-- Script
	local cat_sc
	
	if args["cat sc"] then
		data.sc = (args["cat sc"] and (require("Module:scripts").getByCode(args["cat sc"]) or error("The script code \"" .. args["cat sc"] .. "\" is not valid.")) or nil)
		cat_sc = cat_sc
	else
		data.sc = (args["sc"] and (require("Module:scripts").getByCode(args["sc"]) or error("The script code \"" .. args["sc"] .. "\" is not valid.")) or nil)
	end
	
	-- Part-of-speech category
	data.pos_category = args[2]
	data.noposcat = args["noposcat"]
	
	if not data.pos_category:find("s$") and not invariable[data.pos_category] then
		-- Make the plural form of the part of speech
		if data.pos_category:find("x$") then -- prefix, suffix, confix, infix, circumfix, affix, interfix, transfix
			data.pos_category = data.pos_category .. "es"
		else
			data.pos_category = data.pos_category .. "s"
		end
	end
	
	if cat_sc then
		data.pos_category = data.pos_category .. " in " .. cat_sc:getCategoryName()
	end
	
	-- Additional categories
	data.categories = {}
	data.nomultiwordcat = data.pos_category == "circumfixes" and true or args["nomultiwordcat"]
	data.nogendercat = args["nogendercat"]
	
	table.insert(data.categories, "Contionary")
	
	if args["cat2"] then
		table.insert(data.categories, data.lang:getCanonicalName() .. " " .. args["cat2"])
	end
	
	if args["cat3"] then
		table.insert(data.categories, data.lang:getCanonicalName() .. " " .. args["cat3"])
	end
	
	if args["cat4"] then
		table.insert(data.categories, data.lang:getCanonicalName() .. " " .. args["cat4"])
	end
	
	-- Inflected forms
	data.inflections = {}
	
	for i = 1, math.ceil(args[3].maxindex / 2) do
		local infl_part = {
			label    = args[3][i * 2 - 1],
			accel    = args["faccel-form"][i] and {
				form      = args["faccel-form"][i],
				translit  = args["faccel-translit"][i],
				lemma     = args["faccel-lemma"][i],
				lemma_translit = args["faccel-lemma-translit"][i],
				gender    = args["faccel-gender"][i],
				nostore   = args["faccel-nostore"][i],
			} or nil,
			request  = args["frequest"][i],
		}
		
		local form = {
			term       =  args[3][i * 2],
			alt        =  args["falt"][i],
			genders    = {args["fg"][i]},
			id         =  args["fid"][i],
			lang       =  args["flang"][i],
			nolink     =  args["fnolink"][i],
			qualifiers = {args["fqual"][i]},
			sc         =  args["fsc"][i],
			translit   =  args["ftr"][i],
		}
		
		if form.lang then
			form.lang = require("Module:languages").getByCode(form.lang) or require("Module:languages").err(form.lang, "f" .. i .. "lang")
		end
		
		if form.sc then
			form.sc = require("Module:scripts").getByCode(form.sc) or error("The script code \"" .. form.sc .. "\" is not valid.")
		end
		
		if form.term == "?" or form.term == "-" then
			table.insert(data.categories, "Contionary stubs")
		end
		
		-- If no term or alt is given, then the label is shown alone.
		if form.term or form.alt then
			table.insert(infl_part, form)
		end
		
		if infl_part.label == "or" then
			-- Append to the previous inflection part, if one exists
			if #infl_part > 0 and data.inflections[1] then
				table.insert(data.inflections[#data.inflections], form)
			end
		elseif infl_part.label then
			-- Add a new inflection part
			table.insert(data.inflections, infl_part)
		end
	end
	
	return require("Module:headword").full_headword(data)
end

return export