Module:Ro-headword

local export = {}
local pos_functions = {}

local lang = require("Module:languages").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 = {
		["head"] = {},
		["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 data = {lang = lang, pos_category = args["suff"] and "suffixes" or poscat, categories = args["suff"] and {"Romanian " .. poscat:sub(1, -2) .. "-forming suffixes"} or {}, heads = {args.head}, genders = {}, inflections = {}}
	local appendix = {}
	
	for key, val in ipairs(args.cat) do
		table.insert(data.categories, "Romanian " .. val)
	end
	
	if pos_functions[poscat] then
		pos_functions[poscat].func(class, args, data, appendix)
	end
	
	if #appendix == 0 then
		appendix[1] = ""
	end
	
	return
		require("Module:headword").full_headword(data) .. 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},
		["pl"] = {list = true, allow_holes = true},
		["only"] = {},
	},
	func = function(class, args, data, appendix)
		local mode = args[1]
		local only = {}
		
		if args.only then
			for i, val in ipairs(mw.text.split(args.only, "-")) do
				only[val] = true
			end
		end
		
		if mode == "inv" or mode == "i" or args["f"].maxindex > 0 or args["mp"].maxindex > 0 or args["fp"].maxindex > 0 or args["pl"].maxindex > 0 then
			require("Module:debug").track("ro-adj new")
		end
		
		if mode == "inv" then
			table.insert(data.genders, "m")
			table.insert(data.genders, "f")
			table.insert(data.genders, "n")
			table.insert(data.inflections, {label = "invariable"})
			table.insert(data.categories, "Romanian invariable adjectives")
		else
			local form_order = {"m_sg", "f_sg", "m_pl", "f_pl"}
			local only_order = {"m", "f", "sg", "pl"}
			local allowed = {m_sg = true, f_sg = true, m_pl = true, f_pl = true}
			local only_names = {m = "masculine", f = "feminine", sg = "singular", pl = "plural"}
			
			for i, val in pairs(only_names) do
				if only[i] then
					for key, form in pairs(allowed) do
						if not key:find(i) then
							allowed[key] = false
						end
					end
				end
			end
			
			for i, val in ipairs(form_order) do
				if allowed[val] then
					allowed[val] = "lemma"
					break
				end
			end
		
			if allowed.m_sg == "lemma" then
				table.insert(data.genders, "m")
				
				if not only.m then
					table.insert(data.genders, "n")
				end
			elseif allowed.f_sg == "lemma" then
				table.insert(data.genders, "f")
			elseif allowed.m_pl == "lemma" then
				table.insert(data.genders, "m-p")
			elseif allowed.f_pl == "lemma" then
				table.insert(data.genders, "f-p")
				
				if not only.f then
					table.insert(data.genders, "n-p")
				end
			else
				error("All forms are excluded by the \"only\" parameter")
			end
			
			for i, val in ipairs(only_order) do
				if only[val] then
					table.insert(data.inflections, {label = only_names[val] .. " only"})
				end
			end
			
			local f, mp, fp = args["f"], args["pl"].maxindex > 0 and args["pl"] or args["mp"], args["pl"].maxindex > 0 and args["pl"] or args["fp"]
			
			require("Module:ro-adjective").make_basic_forms({PAGENAME}, f, mp, fp, mode == "i", only)
			
			local unified_sg, unified_pl = false, false
			
			if allowed.m_sg and allowed.f_sg and f.maxindex == 1 and f[1] == PAGENAME then
				unified_sg = true
				table.insert(data.genders, 2, "f")
			end
		
			if not unified_sg and allowed.f_sg and allowed.f_sg ~= "lemma" then
				f.label = "feminine" .. (only.sg and "" or " singular")
				table.insert(data.inflections, f)
			end
			
			if allowed.m_pl and allowed.f_pl and is_equal(mp, fp) then
				unified_pl = true
				mp.label = "plural"
				table.insert(data.inflections, mp)
			end
			
			if not unified_pl and allowed.m_pl and allowed.m_pl ~= "lemma" then
				mp.label = (only.m and "" or "masculine") .. " " .. (only.pl and "" or "plural")
				table.insert(data.inflections, mp)
			end
				
			if not unified_pl and allowed.f_pl and allowed.f_pl ~= "lemma" then
				fp.label = (only.f and "" or "feminine and neuter") .. " " .. (only.pl and "" or "plural")
				table.insert(data.inflections, fp)
			end
		end
		
		return args["head"]
	end
}

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

pos_functions["pronouns"] = pos_functions["adjectives"]

pos_functions["articles"] = 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, data, appendix)
		local type
		
		for _, val in ipairs(args[1]) do
			table.insert(data.genders, val)
			if val:match("p") then
				type = "plural"
				break
			end
		end
	
		if args["suff"] then
			data.pos_category = "suffixes"
			table.insert(data.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(data.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#uncoontable|uncoontable]]"
				if type ~= "suffix" then
					table.insert(data.categories, "Romanian uncoontable noons")
				end
			elseif args[2][1] == "?" then
				while #args[2] > 0 do
					table.remove(args[2])
				end
				if type ~= "suffix" then
					table.insert(data.categories, "Romanie noons wi unkent 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(data.categories, "Romanian nouns with missing 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(data.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(data.inflections, args[2])
		end
		
		if args["sg"] then
			if type == "plural" then
				table.insert(data.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(data.inflections, args["f"])
		end
		
		if #args["m"] > 0 then
			args["m"].label = "masculine 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(data.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:Romanie first conjugation|1st conj.]]</small>'
		elseif conj == 2 then
			return '&nbsp;<small>[[Appendix:Romanie seicont conjugation|2nt conj.]]</small>'
		elseif conj == 3 then
			return '&nbsp;<small>[[Appendix:Romanie third conjugation|3rd conj.]]</small>'
		elseif conj == 4 then
			return '&nbsp;<small>[[Appendix:Romanie fowert conjugation|4t 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, data, 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(data.inflections, args[1])
		
		args[2].label = 'past participle'
		args[2].request = true
		table.insert(data.inflections, args[2])
		
		local sc = require("Module:scripts").findBestScript(data.heads[1] or args.inf or PAGENAME, lang):getCode()
		if not data.heads[1] 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
				data.heads = {'а ' .. args.inf} --Cyrillic 'а'
			else
				data.heads = {'a ' .. args.inf}
			end
		end
	
		local conj
		
		if multi or NAMESPACE ~= '' or sc == 'Cyrl' then
			conj = args.conj or 0
		else
			conj = detect_conj(data.heads[1], args[1][1])
			if args.conj and args.conj ~= conj then
				require("Module:debug").track('ro-verb wi wrong conjugation')
			end
		end
	
		if conj and NAMESPACE == '' then
			if conj == 1 then
				table.insert(data.categories, 'Romanie verbs in 1st conjugation')
			elseif conj == 2 then
				table.insert(data.categories, 'Romanie verbs in 2nt conjugation')
			elseif conj == 3 then
				table.insert(data.categories, 'Romanie verbs in 3rd conjugation')
			elseif conj == 4 then
				table.insert(data.categories, 'Romanie verbs in 4t conjugation')
			else
				table.insert(data.categories, 'Romanie entries needin inflection')
			end
		end
	
		appendix[1] = format_conj(conj)
	end
}

return export

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.