Modül:ar-başlıkbaşı

Vikisözlük sitesinden
Gezinti kısmına atla Arama kısmına atla
Test Template Info-Icon - Version (2).svgModül belgelemesi [Düzenle] [Tazele]


-- Yazarlar: Benwing, CodeCat

local ar_translit = require("Modül:ar-alfabeçeviri")

local dil = require("Modül:diller").getirKodaGore("ar")

local cikart = {}
local soz_fonksiyonlari = {}

-- diacritics
local u = mw.ustring.char
local A  = u(0x064E) -- fetḥa
local AN = u(0x064B) -- fetḥatān (fetḥa tenvīn)
local U  = u(0x064F) -- ḍamme
local UN = u(0x064C) -- ḍammetān (ḍamme tenvīn)
local I  = u(0x0650) -- kesre
local IN = u(0x064D) -- kesretān (kesre tenvīn)
local SK = u(0x0652) -- sükūn = sessiz
local SH = u(0x0651) -- şedde = ünsüzleri ikizleştirir
local DAGGER_ALIF = u(0x0670)
local DIACRITIC_ANY_BUT_SH = "[" .. A .. I .. U .. AN .. IN .. UN .. SK .. DAGGER_ALIF .. "]"

-- bazı harfler ve işaretler
local TAM    = u(0x0629) -- tāʾ-i merbūṭa = ة

-- common combinations
local UNU   = "[" .. UN .. U .. "]"

------------------------
-- Araç fonksiyonları --
------------------------

-- Eğer boş değilse
local function ebd(arg)
	if arg == "" then
		return nil
	else
		return arg
	end
end

local function listeden_ayarla(list)
	local set = {}
	for _, item in ipairs(list) do
		set[item] = true
	end
	return set
end

-- version of mw.ustring.gsub() that discards all but the first return value
function rsub(term, foo, bar)
	local retval = mw.ustring.gsub(term, foo, bar)
	return retval
end

local rfind = mw.ustring.find

function remove_links(text)
	text = rsub(text, "%[%[[^|%]]*|", "")
	text = rsub(text, "%[%[", "")
	text = rsub(text, "%]%]", "")
	return text
end

function reorder_shadda(text)
	-- shadda+short-vowel (including tanwīn vowels, i.e. -an -in -un) gets
	-- replaced with short-vowel+shadda during NFC normalisation, which
	-- MediaWiki does for all Unicode strings; however, it makes the
	-- detection process inconvenient, so undo it. (For example, the tracking
	-- code below would fail to detect the -un in سِتٌّ because the shadda
	-- would come after the -un.)
	text = rsub(text, "(" .. DIACRITIC_ANY_BUT_SH .. ")" .. SH, SH .. "%1")
	return text
end

-- The main entry point.
function cikart.show(frame)
	local sozkat = frame.args[1] or error("Part of speech has not been specified. Please pass parameter 1 to the module invocation.")
	
	local params = {
		[1] = {list = "head", allow_holes = true, default = ""},
		["head"] = {default = ""},
		["tr"] = {list = true, allow_holes = true},
	}
	
	local args = frame:getParent().args  -- YAPILACAK: Burada [[Modül:parameters]] kullan
	
	-- Parametreleri topla
	local veri = {dil = dil, soz_kategorisi = sozkat, kategoriler = {}, baslar = {}, alfabecevler = {}, cinsiyetler = {}, cekimler = { etkin_oto_alfabecev = true }}
	
	local bas = args["head"] or args[1] or ""
	local translit = ebd(args["tr"])
	local i = 1
	
	local irreg_translit = false
	
	while bas do
		table.insert(veri.baslar, bas)
		veri.alfabecevler[#veri.baslar] = translit
		if ar_translit.irregular_translit(bas, translit) then
			irreg_translit = true
		end
		
		i = i + 1
		bas = ebd(args["head" .. i])
		translit = ebd(args["tr" .. i])
	end

	if irreg_translit then
		table.insert(veri.kategoriler, dil:getirAsilAd() .. " terms with irregular pronunciations")
	end
	
	if soz_fonksiyonlari[sozkat] then
		soz_fonksiyonlari[sozkat].func(args, veri)
	end
	
	return require("Modül:başlık başı").tam_baslikbasi(veri)
end

-- Get a list of inflections. See handle_infl() for meaning of ARGS, ARGPREF
-- and DEFGENDER.
local function getargs(args, argpref, defgender)
	-- Gather parameters
	local forms = {}
	
	local form = ebd(args[argpref])
	local translit = ebd(args[argpref .. "ç"])
	local cinsiyet = ebd(args[argpref .. "c"])
	local cinsiyet2 = ebd(args[argpref .. "c2"])
	local i = 1
	
	while form do
		local genderlist = (cinsiyet or cinsiyet2) and {cinsiyet, cinsiyet2} or defgender and {defgender} or nil
		table.insert(forms, {sozcuk = form, alfabecev = translit, cinsiyetler = genderlist})

		i = i + 1
		form = ebd(args[argpref .. i])
		translit = ebd(args[argpref .. i .. "ç"])
		cinsiyet = ebd(args[argpref .. i .. "c"])
		cinsiyet2 = ebd(args[argpref .. i .. "c2"])
	end

	return forms
end

-- Get a list of inflections from the arguments in ARGS based on argument
-- prefix ARGPREF (e.g. "pl" to snarf arguments called "pl", "pl2", etc.,
-- along with "pltr", "pl2tr", etc. and optional gender(s) "plg", "plg2",
-- "pl2g", "pl2g2", "pl3g", "pl3g2", etc.). Label with LABEL (e.g. "plural"),
-- which will appear in the headword. Insert into inflections list
-- INFLS. Optional DEFGENDER is default gender to insert if gender
-- isn't given; otherwise, no gender is inserted. (This is used for
-- singulative forms of collective nouns, and collective forms of singulative
-- nouns, which have different gender from the base form(s).)
local function handle_infl(args, veri, argpref, etiket, defgender)
	local newinfls = getargs(args, argpref, defgender)
	newinfls.etiket = etiket

	if #newinfls > 0 then
		table.insert(veri.cekimler, newinfls)
	end
end

-- Handle a basic inflection (e.g. plural, feminine) along with the construct,
-- definite and oblique variants of this inflection. Can also handle the base
-- construct/definite/oblique variants if both ARGPREF and LABEL are given
-- as blank strings. If NOBASE or ARGPREF is blank, skip the base inflection.
local function handle_all_infl(args, veri, argpref, etiket, nobase)
	if not nobase and argpref ~= "" then
		handle_infl(args, veri, argpref, etiket)
	end
	
	local etiketvm = etiket == "" and "" or etiket .. " "
	handle_infl(args, veri, argpref .. "cons", etiketvm .. "tamlanan hâli")
	handle_infl(args, veri, argpref .. "def", etiketvm .. "definite state")
	handle_infl(args, veri, argpref .. "obl", etiketvm .. "oblique")
	handle_infl(args, veri, argpref .. "inf", etiketvm .. "informal")
end

-- Handle the case where pl=-, indicating an uncountable noun.
local function handle_noun_plural(args, veri)
	if args["pl"] == "-" then
		table.insert(veri.cekimler, {etiket = "usually [[Appendix:Glossary#uncountable|uncountable]]"})
		table.insert(veri.kategoriler, dil:getirAsilAd() .. " sayılamayan adlar")
	else
		handle_infl(args, veri, "pl", "çoğul")
		handle_infl(args, veri, "ç", "çoğul")
	end
end

local valid_genders = listeden_ayarla(
	{"m", "m-s", "m-pr", "m-s-pr", "m-np", "m-s-np",
	 "e", "e-t", "e-pr", "e-t-pr", "e-np", "e-t-np",
	 "f", "f-s", "f-pr", "f-s-pr", "f-np", "f-s-np",
	 "d", "d-t", "d-pr", "d-t-pr", "d-np", "d-t-np",
	 "m-du", "m-du-pr", "m-du-np",
	 "e-i", "e-i-pr", "e-i-np",
	 "f-du", "f-du-pr", "f-du-np",
	 "d-i", "d-i-pr", "d-i-np",
	 "m-p", "m-p-pr", "m-p-np",
	 "e-ç", "e-ç-pr", "e-ç-np",
	 "f-p", "f-p-pr", "f-p-np",
	 "d-ç", "d-ç-pr", "d-ç-np",
	 "p", "p-pr", "p-np",
	 "ç", "ç-pr", "ç-np",
	 "pr", "np"
	})

local function is_masc_sg(g)
	return g == "m" or g == "m-pr" or g == "m-np" or g == "e" or g == "e-pr" or g == "e-np"
end
local function is_fem_sg(g)
	return g == "f" or g == "f-pr" or g == "f-np" or g == "d" or g == "d-pr" or g == "d-np"
end

-- Handle gender in unnamed param 2 and a second gender in param g2,
-- inserting into the list of genders in GENDER. Also insert categories
-- into CATS if the gender is unexpected for the form of the noun
-- or if multiple genders occur. If gender unspecified, default to
-- DEFAULT, which may be omitted.
local function handle_gender(args, veri, default)
	local g = ebd(args[2]) or default
	local g2 = ebd(args["g2"])

	local function process_gender(g)
		if not g then
			table.insert(veri.cinsiyetler, "?")
		elseif valid_genders[g] then
			table.insert(veri.cinsiyetler, g)
		else
			error("Unrecognized gender: " .. g)
		end
	end

	process_gender(g)
	if g2 then
		process_gender(g2)
	end

	if g and g2 then
		table.insert(veri.kategoriler, dil:getirAsilAd() .. " birden fazla cinsiyeti olan sözcükler")
	elseif is_masc_sg(g) or is_fem_sg(g) then
		if is_masc_sg(g) then
			table.insert(veri.kategoriler, dil:getirAsilAd() .. " eril adlar")
		elseif is_fem_sg(g) then
			table.insert(veri.kategoriler, dil:getirAsilAd() .. " dişil adlar")
		end
		local bas = ebd(args["head"]) or ebd(args[1])
		if bas then
			bas = rsub(reorder_shadda(remove_links(bas)), UNU .. "?$", "")
			local ends_with_tam = rfind(bas, "^[^ ]*" .. TAM .. "$") or
				rfind(bas, "^[^ ]*" .. TAM .. " ")
			if is_masc_sg(g) and ends_with_tam then
				table.insert(veri.kategoriler, dil:getirAsilAd() .. " dişil bitişe sahip eril sözcükler")
			elseif is_fem_sg(g) and not ends_with_tam then
				table.insert(veri.kategoriler, dil:getirAsilAd() .. " dişil bitişe sahip olmayan dişil sözcükler")
			end
		end
	end
end

-- Part-of-speech functions

soz_fonksiyonlari["ön adlar"] = {
	func = function(args, veri)
		handle_all_infl(args, veri, "", "") -- handle cons, def, obl, inf
		handle_all_infl(args, veri, "f", "dişil")
		handle_all_infl(args, veri, "d", "dişil")
		handle_all_infl(args, veri, "i", "ikil")
		handle_all_infl(args, veri, "cpl", "genel çoğul")
		handle_all_infl(args, veri, "gç", "genel çoğul")
		handle_all_infl(args, veri, "pl", "eril çoğulu")
		handle_all_infl(args, veri, "ç", "eril çoğulu")
		handle_all_infl(args, veri, "fpl", "dişil çoğulu")
		handle_all_infl(args, veri, "dç", "dişil çoğulu")
		handle_infl(args, veri, "el", "üstünlük")
	end
}

function handle_sing_coll_noun_infls(args, veri)
	handle_all_infl(args, veri, "", "") -- handle cons, def, obl, inf
	handle_all_infl(args, veri, "d", "ikil")
	handle_all_infl(args, veri, "pauc", "paucal")
	handle_noun_plural(args, veri)
	handle_all_infl(args, veri, "pl", "çoğul", "nobase")
	handle_all_infl(args, veri, "ç", "çoğul", "nobase")
end

soz_fonksiyonlari["ortak adlar"] = {
	func = function(args, veri)
		veri.soz_kategorisi = "adlar"
		table.insert(veri.kategoriler, dil:getirAsilAd() .. " collective nouns")
		table.insert(veri.cekimler, {etiket = "collective"})
		
		handle_gender(args, veri, "m")
		-- Handle sing= (the corresponding singulative noun) and singg= (its gender)
		handle_infl(args, veri, "sing", "singulative", "f")
		handle_sing_coll_noun_infls(args, veri)
	end
}

soz_fonksiyonlari["tekil adlar"] = {
	func = function(args, veri)
		veri.soz_kategorisi = "adlar"
		table.insert(veri.kategoriler, dil:getirAsilAd() .. " singulative nouns")
		table.insert(veri.cekimler, {etiket = "singulative"})
		
		handle_gender(args, veri, "f")
		-- Handle coll= (the corresponding collective noun) and collg= (its gender)
		handle_infl(args, veri, "coll", "collective", "m")
		handle_sing_coll_noun_infls(args, veri)
	end
}

function handle_noun_infls(args, veri, singonly)
	handle_all_infl(args, veri, "", "") -- handle cons, def, obl, inf
	
	if not singonly then
		handle_all_infl(args, veri, "du", "ikil")
		handle_all_infl(args, veri, "i", "ikil")
		handle_noun_plural(args, veri)
		handle_all_infl(args, veri, "pl", "çoğul", "nobase")
		handle_all_infl(args, veri, "ç", "çoğul", "nobase")
	end
	
	handle_all_infl(args, veri, "f", "dişil")
	handle_all_infl(args, veri, "d", "dişil")
	handle_all_infl(args, veri, "m", "eril")
	handle_all_infl(args, veri, "e", "eril")
end

soz_fonksiyonlari["adlar"] = {
	func = function(args, veri)
		handle_gender(args, veri)
		handle_noun_infls(args, veri)
	end
}

soz_fonksiyonlari["sayılar"] = {
	func = function(args, veri)
		table.insert(veri.kategoriler, dil:getirAsilAd() .. " cardinal numbers")
		handle_gender(args, veri)
		handle_noun_infls(args, veri)
	end
}

soz_fonksiyonlari["özel adlar"] = {
	func = function(args, veri)
		handle_gender(args, veri)
		handle_noun_infls(args, veri, "singular only")
	end
}

soz_fonksiyonlari["adıllar"] = {
	params = {
		["g"] = {},
		["g2"] = {},
		
		["f"]  = {}, ["ftr"]  = {}, ["fg"]  = {}, ["fg2"]  = {},
		
		["fcons"]  = {}, ["fconstr"]  = {}, ["fconsg"]  = {}, ["fconsg2"]  = {},
		["fcons2"] = {}, ["fcons2tr"] = {}, ["fcons2g"] = {}, ["fcons2g2"] = {},
		["fcons3"] = {}, ["fcons3tr"] = {}, ["fcons3g"] = {}, ["fcons3g2"] = {},
		["fcons4"] = {}, ["fcons4tr"] = {}, ["fcons4g"] = {}, ["fcons4g2"] = {},
		
		["fdef"]  = {}, ["fdeftr"]  = {}, ["fdefg"]  = {}, ["fdefg2"]  = {},
		["fdef2"] = {}, ["fdef2tr"] = {}, ["fdef2g"] = {}, ["fdef2g2"] = {},
		["fdef3"] = {}, ["fdef3tr"] = {}, ["fdef3g"] = {}, ["fdef3g2"] = {},
		["fdef4"] = {}, ["fdef4tr"] = {}, ["fdef4g"] = {}, ["fdef4g2"] = {},
		
		["fobl"]  = {}, ["fobltr"]  = {}, ["foblg"]  = {}, ["foblg2"]  = {},
		["fobl2"] = {}, ["fobl2tr"] = {}, ["fobl2g"] = {}, ["fobl2g2"] = {},
		["fobl3"] = {}, ["fobl3tr"] = {}, ["fobl3g"] = {}, ["fobl3g2"] = {},
		["fobl4"] = {}, ["fobl4tr"] = {}, ["fobl4g"] = {}, ["fobl4g2"] = {},
		
		["finf"]  = {}, ["finftr"]  = {}, ["finfg"]  = {}, ["finfg2"]  = {},
		["finf2"] = {}, ["finf2tr"] = {}, ["finf2g"] = {}, ["finf2g2"] = {},
		["finf3"] = {}, ["finf3tr"] = {}, ["finf3g"] = {}, ["finf3g2"] = {},
		["finf4"] = {}, ["finf4tr"] = {}, ["finf4g"] = {}, ["finf4g2"] = {},
		},
	func = function(args, veri)
		handle_gender(args, veri)
		handle_all_infl(args, veri, "f", "dişil")
	end
}

soz_fonksiyonlari["çoğul ad formları"] = {
	params = {
		["g"] = {},
		["g2"] = {},
		
		["cons"]  = {}, ["constr"]  = {}, ["consg"]  = {}, ["consg2"]  = {},
		["cons2"] = {}, ["cons2tr"] = {}, ["cons2g"] = {}, ["cons2g2"] = {},
		["cons3"] = {}, ["cons3tr"] = {}, ["cons3g"] = {}, ["cons3g2"] = {},
		["cons4"] = {}, ["cons4tr"] = {}, ["cons4g"] = {}, ["cons4g2"] = {},
		
		["def"]  = {}, ["deftr"]  = {}, ["defg"]  = {}, ["defg2"]  = {},
		["def2"] = {}, ["def2tr"] = {}, ["def2g"] = {}, ["def2g2"] = {},
		["def3"] = {}, ["def3tr"] = {}, ["def3g"] = {}, ["def3g2"] = {},
		["def4"] = {}, ["def4tr"] = {}, ["def4g"] = {}, ["def4g2"] = {},
		
		["obl"]  = {}, ["obltr"]  = {}, ["oblg"]  = {}, ["oblg2"]  = {},
		["obl2"] = {}, ["obl2tr"] = {}, ["obl2g"] = {}, ["obl2g2"] = {},
		["obl3"] = {}, ["obl3tr"] = {}, ["obl3g"] = {}, ["obl3g2"] = {},
		["obl4"] = {}, ["obl4tr"] = {}, ["obl4g"] = {}, ["obl4g2"] = {},
		
		["inf"]  = {}, ["inftr"]  = {}, ["infg"]  = {}, ["infg2"]  = {},
		["inf2"] = {}, ["inf2tr"] = {}, ["inf2g"] = {}, ["inf2g2"] = {},
		["inf3"] = {}, ["inf3tr"] = {}, ["inf3g"] = {}, ["inf3g2"] = {},
		["inf4"] = {}, ["inf4tr"] = {}, ["inf4g"] = {}, ["inf4g2"] = {},
		},
	func = function(args, veri)
		veri.soz_kategorisi = "çekimli adlar"
		handle_gender(args, veri, "p")
		handle_all_infl(args, veri, "", "") -- handle cons, def, obl, inf
	end
}

soz_fonksiyonlari["dişil ön ad formları"] = {
	params = {
		["g"] = {},
		["g2"] = {},
		["pl"] = {},
		["islemma"] = { type = boolean },
		},
	func = function(args, veri)
		veri.soz_kategorisi = "adjective forms"
		handle_noun_plural(args, veri)
		handle_gender(args, veri, "f")
	end
}

soz_fonksiyonlari["ikil ad formları"] = {
	params = {
		["g"] = {},
		["g2"] = {},
		},
	func = function(args, veri)
		veri.soz_kategorisi = "çekimli adlar"
		handle_gender(args, veri, "m-d")
	end
}

soz_fonksiyonlari["çoğul ön ad formları"] = {
	params = {
		["g"] = {},
		["g2"] = {},
		},
	func = function(args, veri)
		veri.soz_kategorisi = "adjective forms"
		handle_gender(args, veri, "m-p")
	end
}

soz_fonksiyonlari["ikil ön ad formları"] = {
	params = {
		["g"] = {},
		["g2"] = {},
		},
	func = function(args, veri)
		veri.soz_kategorisi = "adjective forms"
		handle_gender(args, veri, "m-d")
	end
}

soz_fonksiyonlari["çekimli adlar"] = {
	params = {
		["g"] = {},
		["g2"] = {},
		},
	func = function(args, veri)
		handle_gender(args, veri)
	end
}

local valid_forms = listeden_ayarla(
	{"I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI", "XII",
	 "XIII", "XIV", "XV", "Iq", "IIq", "IIIq", "IVq"})

local function handle_conj_form(args, veri)
	local form = ebd(args[2])
	if form then
		if not valid_forms[form] then
			error("Invalid verb conjugation form " .. form)
		end
		
		table.insert(veri.cekimler, {etiket = '[[Appendix:Arabic verbs#Form ' .. form .. '|form ' .. form .. ']]'})
	end
end

soz_fonksiyonlari["eylem formları"] = {
	params = {
		[2] = {},
		},
	func = function(args, veri)
		handle_conj_form(args, veri)
	end
}

soz_fonksiyonlari["ism-i failler"] = {
	params = {
		[2] = {},
		},
	func = function(args, veri)
		veri.soz_kategorisi = "participles"
		table.insert(veri.kategoriler, dil:getirAsilAd() .. " active participles")
		handle_conj_form(args, veri)
	end
}

soz_fonksiyonlari["ism-i mefuller"] = {
	params = {
		[2] = {},
		},
	func = function(args, veri)
		veri.soz_kategorisi = "participles"
		table.insert(veri.kategoriler, dil:getirAsilAd() .. " passive participles")
		handle_conj_form(args, veri)
	end
}

return cikart

-- For Vim, so we get 4-space tabs
-- vim: set ts=4 sw=4 noet: