Modül:cinsiyet ve numara

Vikisözlük sitesinden
Modül belgelemesi [Düzenle] [Tazele]
--[=[
	Bu modül cinsiyet ve numaralar için standart görünümler oluşturur.
	Bir cinsiyet birimini viki/HTML biçimine çevirir.
	
	Bir cinsiyet birimi aşağıda listelenmiş unsurlardan bir tanesidir,
	tire ile ayrılmış şekildedir. Örnek olarak: "g", "n", "d-ç", "e-an-ç"
]=]--

local cikart = {}

local kodlar = {}

-- Tüm muhtemel "kısımların" oluşabileceği kodların lsitesi.

kodlar["?"] = '<abbr title="cinsiyet tamamlanmamış">?</abbr>'

-- Cinsiyetler
kodlar["m"] = '<abbr title="eril cinsiyet">e</abbr>'
kodlar["e"] = '<abbr title="eril cinsiyet">e</abbr>'
kodlar["f"] = '<abbr title="dişil cinsiyet">d</abbr>'
kodlar["d"] = '<abbr title="dişil cinsiyet">d</abbr>'
kodlar["n"] = '<abbr title="nötr cinsiyet">n</abbr>'
kodlar["c"] = '<abbr title="genel cinsiyet">g</abbr>'
kodlar["g"] = '<abbr title="genel cinsiyet">g</abbr>'

-- Fazladan belirticiler
kodlar["an"] = '<abbr title="animate">anim</abbr>'
kodlar["in"] = '<abbr title="cansız, ">cansız</abbr>'
kodlar["pr"] = '<abbr title="personal">pers</abbr>'
kodlar["np"] = '<abbr title="non-personal">npers</abbr>'

-- Numaralar
kodlar["s"] = '<abbr title="tekil sayı">te</abbr>'
kodlar["t"] = '<abbr title="tekil sayı">te</abbr>'
kodlar["du"] = '<abbr title="ikil sayı">ik</abbr>'
kodlar["i"] = '<abbr title="ikil sayı">ik</abbr>'
kodlar["p"] = '<abbr title="çoğul sayı">ç</abbr>'
kodlar["ç"] = '<abbr title="çoğul sayı">ç</abbr>'

-- Eylem belirticileri
kodlar["impf"] = '<abbr title="imperfective aspect">impf</abbr>'
kodlar["pf"] = '<abbr title="perfective aspect">pf</abbr>'

-- biçimlendir_liste'nin bir şablondan çağırılabilir hali.
function cikart.goster_liste(frame)
	local args = frame.args
	local dil = args["dil"]; if dil == "" then dil = nil end
	local liste = {}
	local i = 1
	
	while args[i] and args[i] ~= "" do
		table.insert(liste, args[i])
		i = i + 1
	end
	
	return cikart.bicimlendir_liste(liste, dil)
end

-- Bir veya daha fazla cinsiyet ayrıştırmasını hallet, belirtici listesi şeklinde.
function cikart.bicimlendir_liste(liste, dil)
	local adsinifi_mi = nil
	
	-- Her bir belirticiyi işlemden geçir ve biçimlendir
	for anahtar, kisa in ipairs(liste) do
		local as
		liste[anahtar], as = cikart.bicimlendir_belirtici(kisa, dil)
		
		-- Tüm belirticilerin bir ad sınıfı olduğundan veya olmadığından emin ol.
		if adsinifi_mi == nil then
			adsinifi_mi = as
		elseif adsinifi_mi ~= as then
			error("Ad sınıfları ve cinsiyetler karıştırılamaz. Lütfen ikisinden birini seçip kullanın.")
		end
	end
	
	if adsinifi_mi then
		-- Tüm kodları eğik çizgi ile ayırarak birleştir
		return "<span class=\"gender\">class " .. table.concat(liste, "/") .. "</span>"
	else
		-- Tüm kodları virgül ile ayırarak birleştir
		return "<span class=\"gender\">" .. table.concat(liste, ", ") .. "</span>"
	end
end

-- Tek bir cinsiyet belirticisinin alt parçalarını biçimlendir.
function cikart.bicimlendir_belirtici(kisa, dil)
	local kategoriler = ""
	local ret = ""
	local adsinifi_mi = false
	
	-- Eğer belirtici cX ile başlıyorsa, o zaman bir ad belirticisidir.
	if kisa:find("^[1-9]") or kisa:find("^c[^-]") then
		adsinifi_mi = true
		kod = kisa:gsub("^c", "")
		
		if kod == "?" then
			ret = "<abbr class=\"noun-class\" title=\"noun class missing\">?</abbr>"
		else
			ret = "<abbr class=\"noun-class\" title=\"noun class " .. kod .. "\">" .. kod .. "</abbr>"
		end
	else
		-- Kısımları ayır ve hepsini işlemden geçir, kendi görüntü haline biçimlendir
		local kisimlar = mw.text.split(kisa, "-")
		
		for anahtar, kod in ipairs(kisimlar) do
			-- Bu kod geçerli mi?
			if kodlar[kod] then
				kisimlar[anahtar] = kodlar[kod]
			else
				error("\"" .. kisa .. "\" cinsiyet belirticisi geçerli değil.")
			end
		end
		
		-- Tüm kodları bir boşluk ile birleştir
		ret = table.concat(kisimlar, "&nbsp;")
	end
	
	-- Eğer dil verildiyse fazladan işlemler yap
	if dil then
		-- Bu desteklenmeyen bir cinsiyet mi?
		if kisa:find("?") then
			local m_araclar = require("Modül:araçlar")
			kategoriler = m_araclar.format_categories({dil:getirAsilAd() .. " cinsiyeti eksik sözcükler"}, nil)
		end
	end
	
	return ret .. kategoriler, adsinifi_mi
end

return cikart