İçeriğe atla

Modül:başlık başı

Vikisözlük sitesinden
Modül belgelemesi [Düzenle] [Tazele]


local cikart = {}

local m_veri = mw.loadData("Modül:başlık başı/veri")

local sozcukler = m_veri.sozcukler
local sozcukGruplari = m_veri.sozcukGruplari
local sembolKarakter = m_veri.sembolKarakter
local bicimBirim = m_veri.bicimBirim
local yokAlfabecev = m_veri.yokAlfabecev
local etiketlenecek = m_veri.etiketlenecek

local function eril_mi(c)
	return c == "m" or c == "m-pr" or c == "m-np" or c == "e" or c == "e-ç" or c == "e-np"
end
local function disil_mi(c)
	return c == "f" or c == "f-pr" or c == "f-np" or c == "d" or c == "d-ç" or c == "d-np"
end
local function notr_mu(c)
	return c == "n" or c == "n-pr" or c == "n-ç"
end

local function onislem(veri)
	if type(veri.baslar) ~= "table" then
		if veri.baslar then
			--tracking
		end
		
		veri.baslar = { veri.baslar }
	end
	
	if type(veri.alfabecevler) ~= "table" then
		if veri.alfabecevler then
			--tracking
		end
		
		veri.alfabecevler = { veri.alfabecevler }
	end
	
	if not veri.baslar or #veri.baslar == 0 then
		veri.baslar = {""}
	end
	
	local baslik = mw.title.getCurrentTitle()
	
	-- Sözcüğün yeni kurum olup olmadığını kontrol et
	local yeni_kurum_mu = veri.dil:getirTip() == "reconstructed"
		or baslik.nsText == "YeniKurum"
	
	-- Varsayılan bir başlık başı oluştur.
	local altsayfaadi = baslik.subpageText
	local sayfaadi = baslik.text
	local varsayilan_bas
	if yeni_kurum_mu then
		varsayilan_bas = require("Modül:araçlar").plain_gsub(sayfaadi, veri.dil:getirAsilAd() .. "/", "")
	else
		varsayilan_bas = altsayfaadi
	end
	
	-- Gerektiğinde çok sözcüklü sayfa adlarına bağlantı oluştur.
	if veri.dil:getirKod() ~= "zh" then
		local ayiriciNoktalama = "([%s%p]+)"
		--[[ 	Sözcüklerin içerisinde herhangi bir noktalama işareti 
				dışında bir şey barındıran değerleri bul.
				Aşağıdaki satırı kullanarak karakterleri soyutla.	]]
		local degilSozNokt = "([^-־׳״'.·*]+)"
		local iceriyor_sozcukler = false
		
		for muhtemelSozcukSonu in mw.ustring.gmatch(varsayilan_bas, ayiriciNoktalama) do
			if mw.ustring.find(muhtemelSozcukSonu, degilSozNokt) then
				iceriyor_sozcukler = true
				break
			end
		end
		
		if (not yeni_kurum_mu) and iceriyor_sozcukler then
			local function karak_soyutlama_cozumu(s)
				return mw.ustring.gsub(s, degilSozNokt, "]]%1[[")
			end
			
			varsayilan_bas = "[["
				.. mw.ustring.gsub(
					varsayilan_bas,
					ayiriciNoktalama,
					karak_soyutlama_cozumu
					)
				.. "]]"
			--[=[
			String'in başında veya sonunda oluşmuş olabilecek
			tüm boş bağlantıları kaldır, yukarıda oluşturulmuş da olabilir.
			]=]
			varsayilan_bas = mw.ustring.gsub(varsayilan_bas, "%[%[%]%]", "")
		end
	end
	
	if yeni_kurum_mu then
		varsayilan_bas = "*" .. varsayilan_bas
	end
	
	-- Eğer bir baş boş bir string ise "", o zaman bunu varsayılan ile değiştir
	for i, bas in ipairs(veri.baslar) do
		if bas == "" then
			bas = varsayilan_bas
		else
			if bas == varsayilan_bas and veri.dil:getirAsilAd() == "İngilizce" then
				table.insert(veri.kategoriler, veri.dil:getirAsilAd() .. " gereksiz baş parametresi içeren sözcükler")
			end			
		end
		veri.baslar[i] = bas
	end
	
	--[[	Eğer belirtilmediyse alfabeyi saptamaya çalış
			Bunun için ilk başı kullanıyoruz, ve tüm hepsinin
			aynı alfabede yazıldığını varsayıyoruz
			Bu *her zaman* doğru olmalı, değil mi?		]]
	if not veri.alf then
		veri.alf = require("Modül:alfabeler").bulEnIyiAlfabe(veri.baslar[1], veri.dil)
	end
	
	-- Alfabe çevirilerini ayarla
	for i, bas in ipairs(veri.baslar) do
		local alfabecev = veri.alfabecevler[i]
		
		-- Eğer gerekliyse bir alfabe çevirisi oluşturmaya çalış
		-- Alfabe Latn veya benzeri bir alfabe ise çeviriyi oluştur,
		-- ve eğer hiçbir alfabe çevirisi oluşmuyorsa
		if alfabecev == "-" then
			alfabecev = nil
		elseif not alfabecev
			and not (
				veri.alf:getirKod():find("Latn", nil, true)
				or veri.alf:getirKod() == "Latinx"
				or veri.alf:getirKod() == "None"
				)
			and (not veri.alf or veri.alf:getirKod() ~= "Imag") then
			
			alfabecev = veri.dil:alfabeceviri(require("Modül:bağlantılar").kaldir_baglantilari(bas), veri.alf)
			
			-- Hala bir alfabe çevirimiz yok mu?
			-- Bu maddeyi bir bakım kategorisine ekle.
			if not alfabecev and not yokAlfabecev[veri.dil:getirKod()] then
				alfabecev = "<small>alfabe çevirisi gerekiyor</small>"
				table.insert(veri.kategoriler, veri.dil:getirAsilAd() .. " alfabe çevirisi eksik sözcükler")
				table.insert(veri.kategoriler, "Alfabe çevirisi eksik sözcükler")
			end
		end
		
		-- Alfabe çevirisinin maddesine bağlantı oluştur, eğer girilen dil bunu gerektiriyorsa
		if alfabecev and veri.dil:baglanti_cev() then
			alfabecev = require("Modül:bağlantılar").tam_bag{
				sozcuk = alfabecev,
				dil = veri.dil,
				alf = require("Modül:alfabeler").getirKodaGore("Latn"),
				c = "-"
				}
		end
		
		veri.alfabecevler[i] = alfabecev
	end
	
	if veri.id and type(veri.id) ~= "string" then
		error("Veri tablosundaki id bir string olmalı.")
	end
end


-- Bir başlık başını alfabe çevirileri ile biçimlendir
local function bicimlendir_baslikbasi(veri)
	local m_baglantilar = require("Modül:bağlantılar")
	local m_alfabearaclari = require("Modül:alfabe araçları")
	
	if veri.baslar and #veri.baslar and veri.dil then
			--tracking
	end
	
	-- Boş olmayan alfabe çevirileri mi var?
	-- Bunu bu şekilde yapmalıyız çünkü alfabecev[1] nil olup da alfabecev[2] olmayabilir
	local varmi_alfabecev = false
	
	-- Başları biçimlendir
	for i, bas in ipairs(veri.baslar) do
		if veri.alfabecevler[i] then
			varmi_alfabecev = true
		end
		
		-- Başlık başına işlemi uygula, bağlantıları ve diğer şeyleri biçimlendirmek için
		if bas:find("[[", nil, true) and (not veri.alf or veri.alf:getirKod() ~= "Imag") then
			bas = m_baglantilar.dil_bag({sozcuk = bas, dil = veri.dil}, false)
		end
		
		-- Dil ve alfabe
		if i == 1 then
			bas = m_alfabearaclari.etiket_yazi(bas, veri.dil, veri.alf, "baş", nil, veri.id)
		else
			bas = m_alfabearaclari.etiket_yazi(bas, veri.dil, veri.alf, "baş", nil)
		end
		
		veri.baslar[i] = bas
	end
	
	local alfabecevler_bicimli = ""
	
	if varmi_alfabecev then
		-- Alfabe çevirilerini biçimlendir
		for i, bas in ipairs(veri.baslar) do
			local alfabecev = veri.alfabecevler[i]
			
			if not alfabecev then
				alfabecev = "?"
			end
			
			alfabecev = m_alfabearaclari.etiket_alfabecev(alfabecev, veri.dil:getirKod(), "baş")
			
			veri.alfabecevler[i] = alfabecev
		end
		
		alfabecevler_bicimli = " (" .. table.concat(veri.alfabecevler, " ''veya'' ") .. ")"
		
		if mw.title.new(veri.dil:getirAsilAd() .. " alfabe çevirisi", "Vikisözlük").exists then
			alfabecevler_bicimli = " [[Vikisözlük:" .. veri.dil:getirAsilAd() .. " alfabe çevirisi|•]]" .. alfabecevler_bicimli
		end
	end
	
	return table.concat(veri.baslar, " ''veya'' ") .. alfabecevler_bicimli
end


local function bicimlendir_cinsiyetler(veri)
	if veri.cinsiyetler and #veri.cinsiyetler > 0 then
		local cin = require("Modül:cinsiyet ve numara")
	
		for n,c in ipairs(veri.cinsiyetler) do
			if eril_mi(veri.cinsiyetler[n]) then 
				table.insert(veri.kategoriler, veri.dil:getirAsilAd() .. " eril " .. veri.soz_kategorisi)
			elseif disil_mi(veri.cinsiyetler[n]) then 
				table.insert(veri.kategoriler, veri.dil:getirAsilAd() .. " dişil " .. veri.soz_kategorisi)
			elseif notr_mu(veri.cinsiyetler[n]) then 
				table.insert(veri.kategoriler, veri.dil:getirAsilAd() .. " nötr " .. veri.soz_kategorisi)
			end
		end

		return "&nbsp;" .. cin.bicimlendir_liste(veri.cinsiyetler, veri.dil)
	else
		return ""
	end
end


local function bicimlendir_cekim_kisimlari(veri, kisimlar)
	local m_baglantilar = require("Modül:bağlantılar")
	
	for anahtar, kisim in ipairs(kisimlar) do
		if type(kisim) ~= "table" then
			kisim = {sozcuk = kisim}
		end
		
		local belirticiler = ""
		
		if kisim.belirticiler and #kisim.belirticiler > 0 then
			belirticiler = require("Modül:belirtici").bicimlendir_belirtici(kisim.belirticiler) .. " "
			
			--tracking
		end
		
		local partaccel = kisim.accel
		local tip = kisim["varsayımsal"] and "varsayımsal" or "kalın"
		local bagyok = kisim["varsayımsal"] or kisim.bagyok
		
		-- Sözcüğü tam bir bağlantıya çevir
		-- Burada alfabe çevirisini gösterme, bunları burada göstermek
		-- başlık başı satırını oldukça karmaşıklaştırmaktadır.
		kisim = m_baglantilar.tam_bag(
			{
				sozcuk = not bagyok and kisim.sozcuk or nil,
				alt = kisim.alt or (bagyok and kisim.sozcuk or nil),
				dil = kisim.dil or veri.dil,
				alf = kisim.alf or (not kisim.dil and veri.alf),
				id = kisim.id,
				cinsiyetler = kisim.cinsiyetler,
				c = kisim.alfabecev or ((not (kisimlar.etkin_oto_alfabecev or veri.dil:getirKod() == "ar")) and "-" or nil)
			},
			tip,
			false
			)
		
		kisim = belirticiler .. kisim
		
		kisimlar[anahtar] = kisim
	end
	
	local kisimlar_cikti = ""
	
	if #kisimlar > 0 then
		kisimlar_cikti = " " .. table.concat(kisimlar, " ''veya'' ")
	elseif kisimlar.request then
		kisimlar_cikti = " <small>[lütfen ekleyin]</small>"
			.. require("Modül:araçlar").format_categories(
				{veri.dil:getirAsilAd() .. " çekimlemeye ihtiyaç duyan maddeler"},
				dil,
				nil,
				nil,
				veri.zorla_kat_cikti
				)
	end
	
	return "''" .. kisimlar.etiket .. "''" .. kisimlar_cikti
end

-- Başlık başının devamında gelen çekimlemeleri biçimlendir
local function bicimlendir_cekimler(veri)
	if veri.cekimler and #veri.cekimler > 0 then
		-- Her çekimi tek tek biçimlendir
		for anahtar, cekim in ipairs(veri.cekimler) do
			veri.cekimler[anahtar] = bicimlendir_cekim_kisimlari(veri, cekim)
		end
		
		return " (" .. table.concat(veri.cekimler, ", ") .. ")"
	else
		return ""
	end
end

local function goster_baslikbasi_satiri(veri)
	-- Dil tipini göre alan adını kontrol et
	if mw.title.getCurrentTitle().nsText == "" then
		if veri.dil:getirTip() == "reconstructed" then
			error("Bu dildeki sözcükler YeniKurum: alan adında kullanılmalıdır.")
		elseif veri.dil:getirTip() == "appendix-constructed" then
			error("Bu dildeki sözcükler Ek: alan adında kullanılmalıdır.")
		end
	end
	
	local izleme_kategorileri = {}
	
	table.insert(veri.kategoriler, 1, veri.dil:getirAsilAd() .. " " .. veri.soz_kategorisi)
	
	-- Bir sözcük mü?
	if sozcukler[veri.soz_kategorisi] then
		table.insert(veri.kategoriler, 1, veri.dil:getirAsilAd() .. " sözcükler")
	-- Bir sözcük grubu mu?
	elseif sozcukGruplari[veri.soz_kategorisi] then
		table.insert(veri.kategoriler, 1, veri.dil:getirAsilAd() .. " sözcük grupları")
	-- Bir sembol veya karakter mi?
	elseif sembolKarakter[veri.soz_kategorisi] then
		table.insert(veri.kategoriler, 1, veri.dil:getirAsilAd() .. " semboller ve karakterler")
	-- Bir biçim birimi mi?
	elseif bicimBirim[veri.soz_kategorisi] then
		table.insert(veri.kategoriler, 1, veri.dil:getirAsilAd() .. " biçim birimleri")
	-- Bir romanizasyon mu?
	elseif veri.soz_kategorisi == "romanizasyonlar" then
		table.insert(veri.kategoriler, 1, veri.dil:getirAsilAd() .. " romanizasyonlar")
	else
		-- Eğer yukarıdakilerden birisi değilse, izleyici kategori ekle.
		table.insert(izleme_kategorileri, "Tanınmayan söz türü")
		--tracking
	end
	
	-- Ön işlemler
	onislem(veri)
	
	local m_baglantilar = require("Modül:bağlantılar")
	
	if veri.dil:getirTip() ~= "reconstructed" then
		for _, bas in ipairs(veri.baslar) do
			if mw.title.getCurrentTitle().prefixedText ~= m_baglantilar.getirBagSayfasi(m_baglantilar.kaldir_baglantilari(bas), veri.dil) then
				--tracking
				break
			end
		end
	end
	
	-- Tüm toplanmış bilgileri topla ve biçimlendir
	return
		bicimlendir_baslikbasi(veri) ..
		bicimlendir_cinsiyetler(veri) ..
		bicimlendir_cekimler(veri) ..
		require("Modül:araçlar").format_categories(
			izleme_kategorileri, veri.dil, veri.sira_anahtari, nil, veri.zorla_kat_cikti
			)
end

function cikart.tam_baslikbasi(veri)
	local izleme_kategorileri = {}
	
	-- En üstteki başlığı alfabeye göre biçimlendir.
	local sayfaadi = mw.title.getCurrentTitle().text
	
	if not veri.alf then
		veri.alf = require("Modül:alfabeler").bulEnIyiAlfabe(sayfaadi, veri.dil)
	end
	
	if veri.alf and (etiketlenecek[veri.alf:getirKod()] or etiketlenecek[mw.ustring.gsub( veri.alf:getirKod(), "^[^-]*-*", "", 1)] ) then
		local frame = mw.getCurrentFrame()
		frame:callParserFunction("DISPLAYTITLE", '<span class="' .. veri.alf:getirKod() .. '">' .. sayfaadi .. '</span>')
	end
	
	if veri.zorla_kat_cikti then
		--tracking
	end
	
	if veri.getirAsilAd then
		error('"tam_baslikbasi" fonksiyonuna eklenen "veri" bir dil nesnesi olmamalı.')
	end
		
	-- Herhangi bir kategori eklendi mi?
	if veri.kategoriler and #veri.kategoriler > 0 then
		local dil_adi = require("Modül:String").pattern_escape(veri.dil:getirAsilAd())
		for _, kat in ipairs(veri.kategoriler) do
			-- Kategori dilin adıyla mı başlıyor? Öyle değilse, bunu bir izleme kategorisi ile işaretle.
			if not mw.ustring.find(kat, dil_adi) then
				mw.log(kat, veri.dil:getirAsilAd())
				table.insert(izleme_kategorileri, "Dili belli olmayanlar")
				
				--tracking
			end
		end
		
		if not veri.soz_kategorisi
			and mw.ustring.find(veri.kategoriler[1], "^" .. veri.dil:getirAsilAd())
				then
			veri.soz_kategorisi = mw.ustring.gsub(veri.kategoriler[1], "^" .. veri.dil:getirAsilAd() .. " ", "")
			table.remove(veri.kategoriler, 1)
		end
	end
	
	if not veri.soz_kategorisi then
		error(
			'"tam_baslikbasi" fonksiyonuna iletilen kategori listesinde '
			.. 'hiçbir geçerli söz türü kategorisi bulunamadı. '
			.. 'Bir söz türü kategorisi dilin adını ve devamında da '
			.. 'bir söz türünü barındırmalı.'
			)
	end
	
	-- Alışılmadık karakterler için kategorilendirme
	local standart = veri.dil:getirStandartKarakterler()
	
	if standart then
		if mw.ustring.len(mw.title.getCurrentTitle().subpageText) ~= 1 and not mw.ustring.match(mw.title.getCurrentTitle().text, "^Desteklenmeyen başlıklar/") then
			for karakter in mw.ustring.gmatch(mw.title.getCurrentTitle().subpageText, "([^" .. standart .. "])") do
				table.insert(veri.kategoriler, veri.dil:getirAsilAd() .. " " .. mw.ustring.upper(karakter) .. " karakterini içeren sözcükler")
			end
		end
	end
	
	-- Palindromlar için kategorilendirme
	if mw.title.getCurrentTitle().nsText ~= "YeniKurum"
		and require('Modül:palindromlar').is_palindrome(
			mw.title.getCurrentTitle().subpageText, veri.dil, veri.alf
			) then
		table.insert(veri.kategoriler, veri.dil:getirAsilAd() .. " palindrom sözcükler")
	end
	
	if mw.title.getCurrentTitle().nsText == "" 
	and require("Modül:alfabekontrol").goster(mw.title.getCurrentTitle().subpageText, veri.dil:getirAsilAd()) == false then
		return "[[Kategori:" .. veri.dil:getirAsilAd() .. " alfabesi düzeltilmesi gereken sözcükler]]"
			 .."[[Kategori:Alfabesi düzeltilmesi gereken sözcükler]]"
	else
		return
			goster_baslikbasi_satiri(veri) ..
			require("Modül:araçlar").format_categories(
				veri.kategoriler, veri.dil, veri.sira_anahtari, nil, veri.zorla_kat_cikti
				) ..
			require("Modül:araçlar").format_categories(
				izleme_kategorileri, veri.dil, veri.sira_anahtari, nil, veri.zorla_kat_cikti
				)
	end
end

return cikart