Modul:ro-headword

Vikilug‘atdan olingan

Bu modul uchun Modul:ro-headword/doc nomli hujjat sahifasini yaratishingiz mumkin

local export = {}
local pos_functions = {}

local tili = require("Module:tili").getByCode("ro")

-- The main entry point.
-- This is the only function that can be invoked from a template.
function export.show(frame)
	local args = frame:getParent().args
	NAMESPACE = mw.title.getCurrentTitle().nsText
	PAGENAME = mw.title.getCurrentTitle().text
	
	local poscat = frame.args[1] or error("Part of speech has not been specified. Please pass parameter 1 to the module invocation.")
	
	local params = {
		["bosh"] = {},
		["suff"] = {type = "boolean"},
		["cat"] = {list = true},
	}
	
	if pos_functions[poscat] then
		for key, val in pairs(pos_functions[poscat].params) do
			params[key] = val
		end
	end
	
	args = require("Module:parameters").process(args, params)
	
	local genders = {}
	local inflections = {}
	local categories = args["suff"] and {"Romanian suffixes"} or {"Ruminchada " .. poscat}
	local sort_key = {}
	local appendix = {}
	
	for key, val in ipairs(args.cat) do
		table.insert(categories, "Ruminchada " .. val)
	end
	
	if pos_functions[poscat] then
		local head2 = pos_functions[poscat].func(class, args, genders, inflections, categories, poscat, appendix)
		head = head or head2
	end
	
	if #appendix == 0 then
		appendix[1] = ""
	end
	
	return
		require("Module:headword").full_headword(tili, sc, head, nil, genders, inflections, categories, nil) .. appendix[1]
end

local function is_equal(a1, a2)
	if a1 == a2 then
		return true
	end
	
	if #a1 == #a2 then
		for i = 1, #a1 do
			if a1[i] ~= a2[i] then
				return false
			end
		end
		return true
	else
		return false
	end
end

pos_functions["adjectives"] = {
	params = {
		[1] = {},
		["f"] = {list = true, allow_holes = true},
		["mp"] = {list = true, allow_holes = true},
		["fp"] = {list = true, allow_holes = true},
	},
	func = function(class, args, genders, inflections, categories, poscat, appendix)
		local old = true
		
		if poscat == "determiners" then
			old = false
		end
		
		if old then
			args[1] = tonumber(args[1])
			
			if args[1] then
				appendix[1] = "&#32;<sup>[[Appendix:Rumin " .. args[1] .. "-form adjective declension|" .. args[1] .." nom/acc form" .. (args[1] == 1 and "" or "s") .. "]]</sup>"
			end
		else
			local mode = args[1]
			
			if mode == "inv" then
				table.insert(inflections, {label = "invariable"})
				table.insert(categories, "Romanian invariable adjectives")
			else
				table.insert(genders, "m")
				table.insert(genders, "n")
				
				local f, mp, fp = args["f"], args["mp"], args["fp"]
				
				if not f[1] then
					table.insert(f, require("Module:ro-adjective").make_feminine(PAGENAME))
				end
				
				if not mp[1] then
					table.insert(mp, require("Module:ro-adjective").make_plural(PAGENAME, "m"))
				end
				
				if not fp[1] then
					if mode == "i" then
						fp = mp
					else
						for key, form in ipairs(f) do
							table.insert(fp, require("Module:ro-adjective").make_plural(form, "f"))
						end
					end
				end
			
				if #f == 1 and f[1] == PAGENAME then
					table.insert(genders, 2, "f")
				else
					f.label = "feminine singular"
					table.insert(inflections, f)
				end
				
				if is_equal(mp, fp) then
					mp.label = "plural"
					table.insert(inflections, mp)
				else
					mp.label = "masculine plural"
					table.insert(inflections, mp)
					
					fp.label = "feminine and neuter plural"
					table.insert(inflections, fp)
				end
			end
		end
		
		return args["head"]
	end
}

pos_functions["determiners"] = pos_functions["adjectives"]

pos_functions["nouns"] = {
	params = {
		[1] = {list = "g", default = "?"},
		[2] = {list = "pl"},
		["f"] = {list = true},
		["m"] = {list = true},
		["sg"] = {},
		["pl=_qual"] = {list = true, allow_holes = true},
		["f=_qual"] = {list = true, allow_holes = true},
		["m=_qual"] = {list = true, allow_holes = true},
		["sort"] = {}
	},
	func = function(class, args, genders, inflections, categories, poscat, appendix)
		local type
		
		for _, val in ipairs(args[1]) do
			table.insert(genders, val)
			if val:match("p") then
				type = "plural"
				break
			end
		end
	
		if args["suff"] then
			poscat = "suffixes"
			table.insert(categories, "Romanian noun-forming suffixes")
			type = "suffix"
		end
		
		if type == "plural" then
			while #args[2] > 0 do
				table.remove(args[2])
			end
			if args["sg"] then
				args[2].label = "normally plural"
			else
				args[2].label = "plural only"
			end
			table.insert(categories, "Romanian pluralia tantum")
		else
			if args[2][1] == "-" then
				while #args[2] > 0 do
					table.remove(args[2])
				end
				args[2].label = "[[Appendix:Glossary#uncountable|uncountable]]"
				if type ~= "suffix" then
					table.insert(categories, "Romanian uncountable nouns")
				end
			elseif args[2][1] == "?" then
				while #args[2] > 0 do
					table.remove(args[2])
				end
				if type ~= "suffix" then
					table.insert(categories, "Romanian nouns with unknown or uncertain plurals")
				end
			else
				args[2].label = "plural"
				args[2].accel = "plural-form-of"
				if #args[2] > 0 then
					for key, val in ipairs(args[2]) do
						if ((val == "e" or val == "uri") and args[1][1] == "n") or (val == "i" and args[1][1] == "m") then
							args[2][key] = PAGENAME .. val
						end
					end
					for key, val in ipairs(args[2]) do
						if not mw.title.new(val).exists then
							table.insert(categories, "Missing Romanian plurals")
						end
								
						if args.pl_qual[key] then
							args[2][key] = {term = args[2][key], qualifiers = {args.pl_qual[key]}}
						end
					end
					if type ~= "suffix" then
						table.insert(categories, "Romanian countable nouns")
					end
				else
					if type ~= "suffix" then
						args[2].request = true
					end
				end
			end
		end
	
		if args[2].label then
			table.insert(inflections, args[2])
		end
		
		if args["sg"] then
			if type == "plural" then
				table.insert(inflections, {label = "singular", args["sg"]})
			else
				error("Parameter \"sg\" can only be used for pluralia tantum")
			end
		end
		
		if #args["f"] > 0 then
			args["f"].label = "feminine equivalent"
			if args.f_qual.maxindex > 0 then
				for key, val in ipairs(args["f"]) do
					if args.f_qual[key] then
						args["f"][key] = {term = args["f"][key], qualifiers = {args.f_qual[key]}}
					end
				end
			end
			table.insert(inflections, args["f"])
		end
		
		if #args["m"] > 0 then
			args["m"].label = "feminine equivalent"
			if args.m_qual.maxindex > 0 then
				for key, val in ipairs(args["m"]) do
					if args.m_qual[key] then
						args["m"][key] = {term = args["m"][key], qualifiers = {args.m_qual[key]}}
					end
				end
			end
			table.insert(inflections, args["m"])
		end
		
		return args["head"]
	end
}

function format_conj(conj)
	if not conj then
		return ''
	else
		if conj == 1 then
			return '&nbsp;<small>[[Appendix:Romanian first conjugation|1st conj.]]</small>'
		elseif conj == 2 then
			return '&nbsp;<small>[[Appendix:Romanian second conjugation|2nd conj.]]</small>'
		elseif conj == 3 then
			return '&nbsp;<small>[[Appendix:Romanian third conjugation|3rd conj.]]</small>'
		elseif conj == 4 then
			return '&nbsp;<small>[[Appendix:Romanian fourth conjugation|4th conj.]]</small>'
		else
			return '&nbsp;<small>[please provide conjugation]</small>'
		end
	end
end

function detect_conj(head, ind)
	local inf, conj = mw.ustring.match(require("Module:links").remove_links(head), '^a (.+)') or error('Head must begin with "a"')
	inf = mw.ustring.gsub(inf, 'á', 'a')
	inf = mw.ustring.gsub(inf, 'í', 'i')
	inf = mw.ustring.gsub(inf, 'î́', 'î')
	if mw.ustring.match(inf, '[iî]$') then
		conj = 4
	elseif mw.ustring.match(inf, 'e$') then
		conj = 3
	elseif mw.ustring.match(inf, 'ea$') then
		if mw.ustring.match(inf, '[cg]hea$') then
			conj = 1
		elseif ind then
			if mw.ustring.match(ind, 'ează$') then
				conj = 1
			else
				conj = 2
			end
		end
	elseif mw.ustring.match(inf, 'a$') then
		conj = 1
	else
		error('Unrecognized verb ending')
	end
	return conj
end

pos_functions["verbs"] = {
	params = {
		[1] = {list = "pres_3sg"},
		[2] = {list = "past"},
		["inf"] = {},
		["conj"] = {type = "number"},
		["pres_3sg_qual"] = {list = "pres_3sg=_qual", allow_holes = true},
		["past_qual"] = {list = "past=_qual", allow_holes = true}
	},
	
	func = function(class, args, genders, inflections, categories, poscat, appendix)
		local multi = false
		if mw.ustring.match(PAGENAME, ' ') then
			multi = true
		end
		
		if #args[1] > 0 and args.pres_3sg_qual.maxindex > 0 then
			for key, val in ipairs(args[1]) do
				if args.pres_3sg_qual[key] then
					args[1][key] = {term = args[1][key], qualifiers = {args.pres_3sg_qual[key]}}
				end
			end
		end
		
		if #args[2] > 0 and args.past_qual.maxindex > 0 then
			for key, val in ipairs(args[2]) do
				if args.past_qual[key] then
					args[2][key] = {term = args[2][key], qualifiers = {args.past_qual[key]}}
				end
			end
		end
		args[1].label = 'third-person singular present'
		args[1].request = true
		table.insert(inflections, args[1])
		
		args[2].label = 'past participle'
		args[2].request = true
		table.insert(inflections, args[2])
		
		local sc = require("Module:scripts").findBestScript(args.head or args.inf or PAGENAME, tili):getCode()
		if not args.bosh then
			if not args.inf then
				if multi then
					args.inf = mw.text.split(PAGENAME, ' ')
					args.inf = '[[' .. table.concat(args.inf, ']] [[') .. ']]'
				else
					args.inf = PAGENAME
				end
			end
			if sc == 'Cyrl' then
				args.bosh = 'а ' .. args.inf --Cyrillic 'а'
			else
				args.bosh = 'a ' .. args.inf
			end
		end
	
		local conj
		
		if multi or NAMESPACE ~= '' or sc == 'Cyrl' then
			conj = args.conj or 0
		else
			conj = detect_conj(args.bosh, args[1][1])
			if args.conj and args.conj ~= conj then
				require("Module:debug").track('ro-verb with wrong conjugation')
			end
		end
	
		if conj and NAMESPACE == '' then
			if conj == 1 then
				table.insert(categories, 'Romanian verbs in 1st conjugation')
			elseif conj == 2 then
				table.insert(categories, 'Romanian verbs in 2nd conjugation')
			elseif conj == 3 then
				table.insert(categories, 'Romanian verbs in 3rd conjugation')
			elseif conj == 4 then
				table.insert(categories, 'Romanian verbs in 4th conjugation')
			else
				table.insert(categories, 'Romanian entries needing inflection')
			end
		end
	
		appendix[1] = format_conj(conj)
			
		return args.bosh
	end
}

return export