বিষয়বস্তুতে চলুন

মডিউল:eu-headword

উইকিঅভিধান, মুক্ত অভিধান থেকে

এই মডিউলের জন্য মডিউল:eu-headword/নথি-এ নথিপত্র তৈরি করা হয়ে থাকতে পারে

local export = {}

local m_string_utilities = require("Module:string utilities")
local m_table = require("Module:table")

local lang = require("Module:languages").getByCode("eu")

local rsplit = m_string_utilities.split
local rfind = m_string_utilities.find
local rsplit = m_string_utilities.split
local rsub = m_string_utilities.gsub
local unpack = unpack or table.unpack -- Lua 5.2 compatibility

--add links to hyphenated terms
local function process_links(word)
	if rfind(word, " ") then
		return "[[" .. rsub(word, " ", "]] [[") .. "]]"
	elseif rfind(word, "%-") then
		return "[[" .. rsub(word, "%-", "]]-[[") .. "]]"
	end
	return word	
end

--adjectives and adverbs
function export.show_adj_adv(frame)
	local pos = frame.args.pos
	if not m_table.listToSet {"adverbs", "adjectives"}[pos] then
		error("Invalid part of speech: <adverbs> and <adjectives> are the only valid values")
	end
	local args = frame:getParent().args
	local data = {lang = lang, pos_category = pos, categories = {}, sort_key = args.sort, heads = {args.head}, genders = {}, inflections = {}}
	local tracking_categories = {}
	local stem = mw.title.getCurrentTitle().text
	local comparative, superlative, excessive = {}, {}, {}
	if	stem:sub(-1) == "r" then
		 stem = stem .. 'r' --add an r if the adjective ends in r
	elseif stem:sub(-1) == "a" then
		 stem = stem:sub(1, -2)
	end
	if args[1] == "-" then
		table.insert(data.categories, "Basque uncomparable " .. pos)
		data.inflections = {{label = "not comparable"}}
	elseif args[1] == "?" then
		table.insert(data.categories, "Basque interrogative " .. pos)
		table.insert(data.categories, "Basque uncomparable " .. pos)
		data.inflections = {{label = "interrogative"}}
	elseif args[1] == "#" and pos == "adjectives" then
		table.insert(data.categories, "Basque indeclinable " .. pos)
		table.insert(data.categories, "Basque uncomparable " .. pos)
		data.inflections = {{label = "indeclinable"}}
	else
		if stem == "ongi" then
			data.inflections = {{label = "comparative", "hobeto", "hobeki"}, {label = "superlative", "hobekien", "ongien"}, {label = "excessive", "ongiegi"}}
		elseif stem == "ondo" then
			data.inflections = {{label = "comparative", "hobeto", "hobeki"}, {label = "superlative", "ondoen"}, {label = "excessive", "ondoegi"}}
		elseif stem == "asko" then --either the adverb or the adjective
			data.inflections = {{label = "comparative", "gehiago"}, {label = "superlative", "gehien"}, {label = "excessive", "gehiegi"}}
		elseif stem == "on" then
			data.inflections = {{label = "comparative", "hobe"}, {label = "superlative", "onen", "hoberen"}, {label = "excessive", "onegi"}}
		else
			data.inflections = {{label = "comparative", accel = {form = "comparative"}, stem .. "ago"}, {label = "superlative", accel = {form = "superlative"}, stem .. "en"}, 
			{label = "excessive", accel = {form = "excd"}, stem .. "egi"}}
		end
	end
	return require("Module:headword").full_headword(data) ..
		require("Module:utilities").format_categories(tracking_categories, lang, args.sort)
end

--determiners
function export.show_det(frame)
	local args = frame:getParent().args
	local data = {lang = lang, pos_category = "determiners", categories = {}, sort_key = args.sort, heads = {args.head}, genders = {}, inflections = {}}
	local tracking_categories = {}
	local stem = mw.title.getCurrentTitle().text
	local comparative, superlative, excessive = {}, {}, {}
	if args[1] == "b" then
		data.inflections = {{label = "preposed"}}
	elseif args[1] == "a" then
		data.inflections = {{label = "postposed"}}
	elseif args[1] == "ba" or args[1] == "ab" then
		data.inflections = {{label = "preposed/postposed"}}
	end
	
	if args[2] == "?" then
		table.insert(data.categories, "Basque interrogative determiners")
		if args[1] == "b" then
			data.inflections = {{label = "preposed, interrogative"}}
		end
	elseif args[2] == "dem" then
		table.insert(data.categories, "Basque demonstrative determiners")
		if args[1] == "a" then
			data.inflections = {{label = "postposed, demonstrative"}}
		end
	elseif args[2] == "ind" then
		table.insert(data.categories, "Basque indefinite determiners")
	end
	
	return require("Module:headword").full_headword(data) ..
		require("Module:utilities").format_categories(tracking_categories, lang, args.sort)
end

--nouns
function export.show_noun(frame)
	local args = frame:getParent().args
	local g, genders = args.g or args[1]
	local data = {lang = lang, pos_category = frame.args.proper and "proper nouns" or "nouns", categories = {}, sort_key = args.sort, heads = {args.head}, genders, inflections = {}}
	local tracking_categories = {}

	if g == "an" then
		data.genders = { "an" }
	elseif g == "in" then
		data.genders = { "in" }
	elseif g == "both" then
		data.genders = { "in","an" }
	else
		data.genders = { "?" }
	end
	
	if args.head then
		data.heads = {args.head}
	else
		data.heads = {process_links(mw.title.getCurrentTitle().text)}
	end

	return require("Module:headword").full_headword(data) ..
		require("Module:utilities").format_categories(tracking_categories, lang, args.sort)
end

--numerals
function export.show_numeral(frame)
	local args = frame:getParent().args
	local head_processed = require("Module:headword").add_multiword_links(mw.title.getCurrentTitle().text)
	if string.find(head_processed, "geita") then
		head_processed = mw.ustring.gsub(head_processed, "geita", "gei]][[eta|ta")
	end
	
	local data = {lang = lang, pos_category = "numerals", categories = {}, sort_key = args.sort, heads = {head_processed}}
	local tracking_categories = {}

	return require("Module:headword").full_headword(data)
end

--verbs
function export.show_verb(frame)
	local args = frame:getParent().args
	local data = {lang = lang, pos_category = "verbs", categories = {}, sort_key = args.sort, heads = {args.head}, genders = {"m"}, inflections = {}, info_mid={}, nogendercat=1} --the gender parameter is a placeholder
	local tracking_categories = {}
	local stem = mw.title.getCurrentTitle().text
	local stem_s = stem
	local ending = ""
	local fut_part_en = ""
	if	stem:sub(-2,-1) == "tu" then
		 stem_s = stem:sub(1, -3)
		 ending = "tu"
	elseif stem:sub(-2,-1) == "du" then
		stem_s = stem:sub(1, -3)
		ending = "du"
	elseif stem:sub(-1) == "l" then
		ending = "l"
	elseif stem:sub(-1) == "n" then
		stem_s = stem:sub(1,-2)
		ending = "n"
	elseif stem:sub(-1) == "i" then
		stem_s = stem:sub(1,-2)
		ending = "i"
	end
	
	--some verbs ending in -i can have "irregular" short forms (they are predictable, but as there aren't many of them it's easier to enter them manually)
	if args.inf or args.short then
		stem_s = args.inf or args.short
	end
	
	--for verbs ending in -rri
	if stem_s:sub(-2,-1) == "rr" then
		stem_s = stem_s:sub(1,-2)
	end
	
	--generate the non-finite forms
	if ending == "du" or ending == "tu" then
		fut_part_ko = stem .. "ko"
		inf = stem_s
		if  ('szx'):match(stem_s:sub(-1)) then
			v_noun = stem_s .. "te"
		else
			v_noun = stem_s .. "tze"
		end
	elseif ending == "n" then
		fut_part_ko = stem .. "go"
		fut_part_en = stem .. "en"
		inf = stem
		v_noun = stem_s .. "te"
	elseif ending == "l" then
		fut_part_ko = stem .. "ko"
		fut_part_en = stem .. "en"
		inf = stem
		v_noun = stem_s .. "tze"
	elseif ending == "i" then
		fut_part_ko = stem .. "ko"
		inf = stem_s
		if stem_s:sub(-2,-1) == "tz" then
			v_noun = stem_s:sub(1,-3) .. "zte"
		elseif stem_s:sub(-2,-1) == "ts" then
			v_noun = stem_s:sub(1,-3) .. "ste"
		elseif stem_s:sub(-2,-1) == "tx" then
			v_noun = stem_s:sub(1,-3) .. "xte"
		elseif  ('szx'):match(stem_s:sub(-1)) then
			v_noun = stem_s .. "te"
		else
			v_noun = stem_s .. "tze"
		end
	else
		fut_part_ko = stem .. "ko"
		inf = stem
		v_noun = stem_s .. "tze"
	end

	--for verbs like "ezagutu", where the short form isn't "ezagu", but "ezagut"
	if args.si then
		inf = args.si
	end
	
	--irregular future participle (for noun+izan verbs where the future participle is noun-ko, not noun+izango) or for verbs ending in -n/-l in which only one ending is used
	if args.fi then
		fut_part_ko = args.fi
	end
	
	-- irregular verbal noun
	if args.vn then
		v_noun = args.vn
	end
	
	--compound verbs
	local light_verb
	local words = rsplit(stem, " ")
	if #words > 1 then
    	light_verb = words[#words]
    	table.insert(data.categories, "Basque compound verbs")
    	table.insert(data.categories, 'Basque compound verbs formed with "' .. light_verb .. '"')
	end
	
	--transitivity
	if args[1] == "da" then
		table.insert(data.categories, "Basque da verbs")
		table.insert(data.info_mid, '<abbr title="intransitive without indirect object">da</abbr>')
	elseif args[1] == "du" then
		table.insert(data.categories, "Basque du verbs")
		table.insert(data.info_mid, '<abbr title="transitive without indirect object">du</abbr>')
	elseif args[1] == "dio" then
		table.insert(data.categories, "Basque dio verbs")
		table.insert(data.info_mid, '<abbr title="transitive with indirect object">dio</abbr>')
	elseif args[1] == "zaio" then
		table.insert(data.categories, "Basque zaio verbs")
		table.insert(data.info_mid, '<abbr title="intransitive with indirect object">zaio</abbr>')
	elseif args[1] == "da-du" then
		table.insert(data.categories, "Basque da verbs")	
		table.insert(data.categories, "Basque du verbs")	
		table.insert(data.info_mid, '<abbr title="intransitive/transitive without indirect object">da/du</abbr>')
	elseif args[1] == "du-dio" then
		table.insert(data.categories, "Basque du verbs")	
		table.insert(data.categories, "Basque dio verbs")	
		table.insert(data.info_mid, '<abbr title="transitive with or without indirect object">du/dio</abbr>')
	elseif args[1] == "du-zaio" then
		table.insert(data.categories, "Basque du verbs")	
		table.insert(data.categories, "Basque zaio verbs")	
		table.insert(data.info_mid, '<abbr title="transitive with direct object/intransitive with indirect object">du/zaio</abbr>')
	elseif args[1] == "da-dio" then
		table.insert(data.categories, "Basque da verbs")	
		table.insert(data.categories, "Basque dio verbs")	
		table.insert(data.info_mid, '<abbr title="intransitive or transitive with direct object">da/dio</abbr>')
	elseif args[1] == "da-du-zaio" then
		table.insert(data.categories, "Basque da verbs")	
		table.insert(data.categories, "Basque du verbs")	
		table.insert(data.categories, "Basque zaio verbs")	
		table.insert(data.info_mid, '<abbr title="intransitive/transitive without indirect object, intransitive with indirect object">da/du/zaio</abbr>')
	elseif args[1] == "da-zaio" then
		table.insert(data.categories, "Basque da verbs")	
		table.insert(data.categories, "Basque zaio verbs")	
		table.insert(data.info_mid, '<abbr title="intransitive with or without indirect object">da/zaio</abbr>')
	elseif args[1] == "da-du-dio-zaio" then
		table.insert(data.categories, "Basque da verbs")	
		table.insert(data.categories, "Basque du verbs")	
		table.insert(data.categories, "Basque dio verbs")	
		table.insert(data.categories, "Basque zaio verbs")	
		table.insert(data.info_mid, '<abbr title="intransitive/transitive without or with indirect object">da/du/dio/zaio</abbr>')
	else
		table.insert(data.categories, "Basque verbs without transitivity")
		table.insert(data.info_mid, '<abbr title="transitivity incomplete">?</abbr>')
	end

	if (ending == "l" or ending == "n") and (not args.fi) then
		data.inflections = {{label = "imperfect participle", v_noun .. "n"}, {label = "future participle", fut_part_ko, fut_part_en}, {label = "short form", inf}, {label = "verbal noun", v_noun}}
	else
		data.inflections = {{label = "imperfect participle", v_noun .. "n"}, {label = "future participle", fut_part_ko}, {label = "short form", inf}, {label = "verbal noun", v_noun}}
	end
	
	return
		require("Module:headword").full_headword(data)
			:gsub('<span class="gender">.-</span>', '<i>'..table.concat(data.info_mid, '&nbsp;')..'</i>') ..
		require("Module:utilities").format_categories(tracking_categories, lang, args.sort)

end

--verb forms
function export.show_verb_form(frame)
	local args = frame:getParent().args
	local data = {lang = lang, pos_category = "verb forms", categories = {}, sort_key = args.sort, heads = {}, genders = {}, inflections = {}}
	local tracking_categories = {}
	------
	local pagename = args.pagename or mw.title.getCurrentTitle().text
	data.heads = {pagename}
	local m_all, f_all = require("Module:eu-allocutives").generate_allocutive(pagename, nil or args[1])
	if m_all then
		data.inflections = 
			{{label = "masculine allocutive", accel = {form = "mall", origin = pagename}, unpack(m_all)}, {label = "feminine allocutive", accel = {form = "fall", origin = pagename}, unpack(f_all)}}
	end

	return require("Module:headword").full_headword(data) .. require("Module:utilities").format_categories(tracking_categories, lang, args.sort)
end

return export