İçeriğe atla

Modül:bağlantılar

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

Modülün alt sayfaları:


local cikart = {}

--[=[
	[[Ek:Desteklenmeyen başlıklar]] ve çok fazla hafıza
	kullanan sayfalar [[Modül:bağlantılar/veri]] sayfasında
	listelenmiştir.
	
	Kullanılan diğer modüller:
		[[Modül:alfabeler]]
		[[Modül:cinsiyet ve numara]]
		[[Modül:araçlar]]
		[[Modül:String]]
]=]

local m_alfabearaclari = require("Modül:alfabe araçları")

local gorme_buyuk = {
	["ko"] = true,
}

local ses_ciktisi = {
	["th"] = "Modül:th",
	--["km"] = "Modül:km",
}

local soz_etiketleri = {
	["a"] = "ön ad",
	["adv"] = "belirteç",
	["int"] = "çekim",
	["n"] = "ad",
	["pron"] = "özel ad",
	["v"] = "eylem",
	["vi"] = "geçişsiz eylem",
	["vt"] = "geçişli eylem",
	["vti"] = "geçişli ve geçişsiz eylem",
}

function cikart.getirBagSayfasi(hedef, dil)
	if mw.loadData("Modül:bağlantılar/veri").desteklenmeyen_basliklar[hedef] then
		return "Unsupported titles/" .. mw.loadData("Modül:bağlantılar/veri").desteklenmeyen_basliklar[hedef]
	end
	
	-- Eğer bağlantı desteklenmeyen bir karakter içeriyorsa, bağlantıyı oluşturma.
	if hedef:find("{{{", nil, true) then
		return nil
	end
	
	if hedef:find("^:") or hedef:find("^w:") or hedef:find("^wikipedia:") then
		return hedef
	end
	
	-- Noktalama işaretlerini sayfa adından kaldır
	hedef = dil:yapGirdiAdi(hedef)
	
	-- YeniKurum sözcükler ve sadece Ek alanında kullanılan sözcükler için bağlantı oluştur
	if hedef:find("^*.") then
		if dil:getirKod() == "und" then
			return nil
		end
		
		hedef = "YeniKurum:" .. dil:getirAsilAd() .. "/" .. mw.ustring.sub(hedef, 2)
	elseif dil:getirTip() == "reconstructed" then
		error(dil:getirAsilAd() .. " varlığı kanıtlanmamış bir dildir, bir yeni kurum dili olduğunu belirtmek için başına '*' konulması gerekmektedir")
	elseif dil:getirTip() == "appendix-constructed" then
		hedef = "Ek:" .. dil:getirAsilAd() .. "/" .. hedef
	end
	
	return hedef
end

-- Girilen bağlantının kısımlarıyla dil-bazlı bir bağlantı oluştur
local function yapDilBag(bag, dil, id, izinverKendiBag)
	-- Eğer bir görünüm biçimi yoksa, varsayılan bir değer oluştur
	if not bag.gorunum then
		bag.gorunum = bag.hedef
		
		-- Ön eki görünüm biçiminden ayır
		-- YAP: diğer interviki bağlantıları?
		if bag.gorunum:find("^:") and not mw.loadData("Modül:bağlantılar/veri").desteklenmeyen_basliklar[bag.gorunum] then
			bag.gorunum = bag.gorunum:gsub("^:", "")
		elseif bag.gorunum:find("^w:") then
			bag.gorunum = bag.gorunum:gsub("^w:", "")
		elseif bag.gorunum:find("^wikipedia:") then
			bag.gorunum = bag.gorunum:gsub("^wikipedia:", "")
		end
	end
	
	-- Hedefi işlemden geçir
	bag.hedef = cikart.getirBagSayfasi(bag.hedef, dil)
	
	if not bag.hedef then
		return bag.gorunum
	end
	
	-- Eğer hedef mevcut sayfa ile aynıysa, bu defa bir "kendi-bağlantı" çıktısı ver
	if not izinverKendiBag and not id and (bag.hedef == mw.title.getCurrentTitle().prefixedText or bag.hedef == ":" .. mw.title.getCurrentTitle().prefixedText) then
		return "<strong class=\"selflink\">" .. bag.gorunum .. "</strong>"
	end
	
	-- Parçayı ekle
	-- "Belirlenmemiş" için bir kısım bağı ekleme, bu kısımlar zaten mevcut ve geçerli de değil.
	-- SekmeliDiller bir kısım olmadan "son ziyaret edilmiş" kısmı kullanarak bağlantıları halleder,
	-- ama "Belirlenmemiş" bu özelliği bozabilir.
	if not (bag.hedef:find("^w:") or bag.hedef:find("^wikipedia:")) then
		
		if not bag.parca and dil:getirKod() ~= "und" then
			if id then
				bag.parca = require("Modül:araçlar").make_id(dil, id)
			elseif not bag.hedef:find("^Ek:") and not bag.hedef:find("^YeniKurum:") then
				bag.parca = dil:getirAsilAd()
			end
		end
	end
	
	-- Bu [[sms:a]] gibi sayfalara, garip bir şey yapmadan bağlantı yapılmasını sağlar.
	bag.hedef = mw.ustring.gsub(bag.hedef, ":", "&#x3a;")
	
	return "[[" .. bag.hedef .. (bag.parca and "#" .. bag.parca or "") .. "|" .. bag.gorunum .. "]]"
end


-- Bir bağlantıyı kısımlarına ayır
local function parcalaBag(bagyazi)
	local bag = {hedef = bagyazi}
	local bulunan, _, bir, iki
	
	bulunan, _, bir, iki = mw.ustring.find(bag.hedef, "^([^|]+)|(.+)$")
	
	if bulunan then
		bag.hedef = bir
		bag.gorunum = iki
	else
		bag.gorunum = bag.hedef
	end
	
	bulunan, _, bir, iki = mw.ustring.find(bag.hedef, "^(.+)#(.+)$")
	
	if bulunan then
		bag.hedef = bir
		bag.parca = iki
	end
	
	return bag
end


-- Girilen sözcüğe basit bir vikibağlantısı oluşturur. Eğer yazı zaten
-- bağlantı içeriyorsa, bunlar kısmı düzeltmek için bağlantılar ile değiştirilir.
function cikart.dil_bag(veri, izinverKendiBag)
	if type(veri) ~= "table" then
		error("'dil_bag' fonksiyonunun ilk parametresi tablo olmak zorundadır. Daha fazla bilgi için bakınız, Modül:bağlantılar/belge.")
	end
	
	local yazi = veri.sozcuk
	
	if gorme_buyuk[veri.dil:getirKod()] and yazi then
		yazi = mw.ustring.gsub(yazi, "%^", "")
	end
	
	-- Eğer yazı * veya başka bir karakterle başlıyorsa,
	-- o zaman her bağlantı * ile başlıyormuş gibi davran
	local hepsiYeniKurum = false
	
	if yazi:find("^*.") then
		hepsiYeniKurum = true
	end
	
	-- Yazıda eklenmiş vikibağlantımız var mı?
	if yazi:find("[[", nil, true) then
		
		-- Bir vikibağlantı etiketi ile başlayıp bitiyorsa
		if mw.ustring.find(yazi, "^%[%[(.+)%]%]$") then
			-- Aralarda [ ] var mı yok mu.
			-- Bu vikibağlantıları gereksiz hale getirir.
			if mw.ustring.find(yazi, "^%[%[[^%[%]]+%]%]$") then
				
			else
				local sablon = mw.ustring.gsub(yazi, "^%[%[(.+)%]%]$", "%1")
				sablon = mw.ustring.gsub(sablon, "%]%], %[%[", "|")
				
			end
		end
		
		yazi = mw.ustring.gsub(yazi, "%[%[([^%]]+)%]%]",
			function(bagyazi)
				local bag = parcalaBag(bagyazi)
				
				if hepsiYeniKurum then
					bag.hedef = "*" .. bag.hedef
				end
				
				return yapDilBag(bag, veri.dil, veri.id, izinverKendiBag)
			end
			)
		
		-- Eğer devamında da aynısı varsa baştaki * simgesini kaldır,
		-- görünümü * ile başlayan bir bağlantı için
		if hepsiYeniKurum then
			yazi = mw.ustring.gsub(yazi, "^%*%[%[([^|%]]+)|%*", "[[%1|*")
		end
	else
		-- Eğer yazıya eklenmiş vikibağlantısı yoksa, parametreleri kullanarak bağlantı oluştur.
		yazi = yapDilBag({hedef = yazi, gorunum = veri.alt}, veri.dil, veri.id, izinverKendiBag)
	end
	
	return yazi
end

function cikart.isaretle(yazi, nesneTuru, tip, dil)
	local etiket = { "", "" }
	
	if nesneTuru == "anlam" then
		etiket = { '<span class="mention-gloss-double-quote">“</span><span class="mention-gloss">', '</span><span class="mention-gloss-double-quote">”</span>' }
	elseif nesneTuru == "c" then
		if tip == "sözcük" then
			etiket = { '<span lang="' .. dil:getirKod() .. '" class="tr mention-tr Latn">', '</span>' }
		else
			etiket = { '<span lang="' .. dil:getirKod() .. '" class="tr Latn">', '</span>' }
		end
	elseif nesneTuru == "bilgiler" then
		etiket = { '<span class="mention-gloss-paren annotation-paren">(</span>', '<span class="mention-gloss-paren annotation-paren">)</span>' }
	end
	
	if type(yazi) == "string" then
		return etiket[1] .. yazi .. etiket[2]
	else
		return ""
	end
end
cikart.mark = cikart.isaretle

-- Bilgilerin biçimini oluştur (sözcük bağlantısının devamında beliren her şey)
function cikart.bicimlendir_bag_bilgilerini(veri, tip)
	local sonuc = {}
	
	-- İnterviki bağlantısı
	if veri.interviki then
		table.insert(sonuc, veri.interviki)
	end
	
	-- Cinsiyetler
	if type(veri.cinsiyetler) ~= "table" then
		veri.cinsiyetler = { veri.cinsiyetler }
	end
	
	if veri.cinsiyetler and #veri.cinsiyetler > 0 then
		local m_cinsiyet = require("Modül:cinsiyet ve numara")
		table.insert(sonuc, "&nbsp;" .. m_cinsiyet.bicimlendir_liste(veri.cinsiyetler, veri.dil))
	end
	
	local bilgiler = {}
	
	-- Alfabe çevirisi
	if veri.c then
		local tur
		if tip == "sözcük" then
			tur = tip
		else
			tur = "varsayılan"
		end
		
		table.insert(bilgiler, m_alfabearaclari.etiket_alfabecev(veri.c, veri.dil, tur))
	end
	
	-- Anlam/çeviri
	if veri.anlam then
		table.insert(bilgiler, cikart.isaretle(veri.anlam, "anlam"))
	end
	
	-- Söz türü
	if veri.soz then
		table.insert(bilgiler, soz_etiketleri[veri.soz] or veri.soz)
	end
	
	-- Tamamının/bir kısmının tam anlamıyla çevirisi
	if veri.tam then
		table.insert(bilgiler, "tam çevirisi " .. cikart.isaretle(veri.tam, "anlam"))
	end
	
	if #bilgiler > 0 then
		table.insert(sonuc, " " .. cikart.isaretle(table.concat(bilgiler, ", "), "bilgiler"))
	end
	
	return table.concat(sonuc)
end

-- {{b}} veya {{z}} şablonlarının başka modüllerden de çağırılabilen bir versiyonu
function cikart.tam_bag(veri, tip, izinverKendiBag)
	if type(veri) ~= "table" then
		error("'tam_bag' fonksiyonunun ilk parametresi tablo olmak zorundadır. Daha fazla bilgi için bakınız, Modül:bağlantılar/belge.")
	end
	
	-- Bağlantıyı oluştur
	local sonuc = {}
	local kategoriler = {}
	local bag = ""
	local bilgiler
	
	-- Gösterilecek bir yazı var mı?
	if (veri.sozcuk or veri.alt) then
		-- Girildiyse alfabeyi saptamaya çalış
		if not veri.alf then
			veri.alf = require("Modül:alfabeler").bulEnIyiAlfabe(veri.alt or veri.sozcuk, veri.dil)
		end
		
		-- Eğer sözcük eklendiyse bir bağlantı oluşturmaya çalıştır, aksi takdirde alternatif yazıyı bağlantı olmadan göster
		bag = m_alfabearaclari.etiket_yazi(veri.sozcuk and cikart.dil_bag(veri, izinverKendiBag) or veri.alt, veri.dil, veri.alf, tip)
	else
		--[[	Gösterilecek bir sözcük yok.
				En azından bir alfabe çevirisi var mı elimizde?	]]
		bag = m_alfabearaclari.iste_alfabe(veri.dil, veri.alf)
		
		if bag == "" or not veri.c or veri.c == "-" then
			-- Gösterilecek bir bağlantı yok, ve alfabe çevirisi de yok. Sözcük istendiğini belirt.
			local kategori = ""
			
			if mw.title.getCurrentTitle().nsText ~= "Şablon" and tip == "çeviri" then
				table.insert(kategoriler, "[[Kategori:Boş çeviri şablonu kullanan sayfalar]]")
			end
			
			bag = "<small>[Madde?]</small>"
		end
	end
	
	table.insert(sonuc, bag)
	
	if veri.c == "" or veri.c == "-" then
		veri.c = nil
	
	elseif ses_ciktisi[veri.dil:getirKod()] then
		local m_ses = require(ses_ciktisi[veri.dil:getirKod()])
		veri.c = veri.c or m_ses.getTranslit(cikart.kaldir_baglantilari(veri.sozcuk))
	
	elseif (veri.sozcuk or veri.alt)
		and not ((veri.alf:getirKod():find("Latn", nil, true)) or veri.alf:getirKod() == "Latinx") then
		
		if not mw.loadData("Modül:bağlantılar/veri").yuksek_hafizali_sayfalar[mw.title.getCurrentTitle().text] or not veri.c then
			-- Eğer gerekliyse alfabe çevirisini getir
			local otomatik_c = 
			veri.dil:alfabeceviri(
				cikart.kaldir_baglantilari(veri.alt or veri.sozcuk), veri.alf)
			
			if otomatik_c then
				local elle_eklenmis_c = veri.c
				
				if elle_eklenmis_c then
					if elle_eklenmis_c == otomatik_c then
						table.insert(
							kategoriler,
							"[[Kategori:Gereğinden fazla başka alfabeye çevirmeler]]"
							.. "[[Kategori:" .. veri.dil:getirAsilAd() .. " gereğinden fazla başka alfabeye çevirmeler]]"
						)
					else
						-- Bu durum Arapça köklerin izleme kategorilerine eklenmesini engeller.
						if mw.ustring.gsub( otomatik_c, "%s", "-" ) ~= elle_eklenmis_c then
							table.insert(
								kategoriler,
								"[[Kategori:Otomatik olanlardan farklı elle eklenmiş başka alfabeye çevirmeler]]"
								.. "[[Kategori:" .. veri.dil:getirAsilAd() .. " otomatik olanlardan farklı elle eklenmiş başka alfabeye çevirmeler]]"
							)
						end
					end
				end
			
				if (not elle_eklenmis_c) or veri.dil:gecersizElleCeviri() then
					veri.c = otomatik_c
				end
			end
		end
	end
	
	-- Alfabe çevirisinin maddesine bağlantı oluştur, eğer girilen dil bunu gerektiriyorsa
	if veri.c and veri.dil:baglanti_cev() then
		veri.c = cikart.dil_bag{ dil = veri.dil, sozcuk = veri.c }
	end
	
	bilgiler = cikart.bicimlendir_bag_bilgilerini(veri, tip)
	
	table.insert(sonuc, bilgiler)
	
	return table.concat(sonuc) .. table.concat(kategoriler)
end


--[[	Alfabe bağlantıları: kategori bağlantılarını,
		hedefli bağlantıların hedeflerini,
		ve tüm kare parantezleri siler.			]]
function cikart.kaldir_baglantilari(yazi)
	if type(yazi) == "table" then
		yazi = yazi.args[1]
	end
	
	if not yazi or yazi == "" then
		return ""
	end
	
	yazi = yazi:gsub("%[%[Kategori:[^|%]]-|?[^|%]]-%]%]", "")
	yazi = yazi:gsub("%[%[[^|%]]-|", "")
	yazi = yazi:gsub("%[%[", "")
	yazi = yazi:gsub("%]%]", "")

	return yazi
end

function cikart.turkce_bag(yazi)
	local dil = require("Modül:diller").getirKodaGore("tr")
	
	yazi = mw.ustring.gsub(yazi, "%[%[([^%]]+)%]%]",
		function(bagyazi)
			local bag = parcalaBag(bagyazi)
			return yapDilBag(bag, dil, nil, true, false)
		end
	)
	
	return yazi
end

function cikart.hafif_bag(veri)
	local dil_adlari = mw.loadData("Modül:diller/koddan asıl ada")
	local alfabe_kodlari = mw.loadData("Modül:diller/kodlar")
	
	if veri.dilKodu then
		veri.dilAdi = dil_adlari[veri.dilKodu] or error('"' .. veri.dilKodu .. '" tanınmayan bir dil kodu.')
	else
		error('Dil kodu girilmesi zorunlu.')
	end
	
	if not veri.sozcuk then
		error('Bağlantı verilecek sözcük girilmesi zorunlu.')
	end
	
	if veri.alfKodu then
		if not alfabe_kodlari[veri.alfKodu] then
			error('"' .. veri.alf .. '" tanınmayan bir alfabe kodu.')
		end
	else
		error("'hafif_bag' fonksiyonu bir alfabe koduna ihtiyaç duyuyor.")
	end
	
	local parca
	if veri.id then
		parca = veri.dilAdi .. "-" .. mw.uri.encode(veri.id, "WIKI")
	else
		parca = veri.dilAdi
	end
	
	return '<span class="' .. veri.alfKodu .. '" lang="' .. veri.dilKodu .. '">[[' .. veri.sozcuk .. "#" .. parca .. "|" .. ( veri.alt or veri.sozcuk ) .. "]]</span>"
end

function cikart.kisim_bag(bag)
	if type(bag) ~= "string" then
		error("'kisim_bag' fonksiyonunun ilk parametresi " .. type(bag) .. ", ama bir string olmalı.")
	end
	
	bag = mw.ustring.gsub(bag, "_", " ")
	
	local numaraIsaretleri = require("Modül:String").count(bag, "#")
	
	if numaraIsaretleri > 1 then
		error("Kısım bağı yalnızca bir numara işareti (#) barındırabilir.")
	end
	
	local sayfa, kisim = mw.ustring.match(bag, "^([^#]+)#(.+)$")
	
	if sayfa and kisim then
		return table.concat{ "[[" , sayfa, "#", kisim, "|", sayfa, " § ", kisim, "]]" }
	else
		error('"' .. kisim_bag .. '" fonksiyonu kısmın adını işaretleyecek bir numara işareti bulamadı.')
	end
end

return cikart