Modül:alfabe araçları

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


local cikart = {}

--[=[
	Kullanılan modüller:
	[[Modül:alfabe araçları/veri]]
	[[Modül:alfabeler]]
	[[Modül:diller]]
	[[Modül:parameters]]
	[[Modül:araçlar]]
	[[Modül:debug]]
]=]

function cikart.Latin_alfabesi_mi(alf)
	-- Latn, Latf, Latinx, nv-Latn, pjt-Latn
	return alf:getirKod():find("Lat") and true or false
end

-- {{dil}} şablonu için
function cikart.dil_s(frame)
	params = {
		[1] = {},
		[2] = { allow_empty = true, default = "" },
		["ak"] = {},
		["tip"] = {},
		["sınıf"] = {},
	}
	
	local args = require("Modül:parameters").process(frame:getParent().args, params)
	local NAMESPACE = mw.title.getCurrentTitle().nsText
	
	local dil = args[1] or (NAMESPACE == "Şablon" and "und") or error("Dil kodu belirtilmedi. Lütfen 1 numaralı parametreye girin.")
	dil = require("Modül:diller").getirKodaGore(dil) or require("Modül:diller").err(dil, 1)
	
	local yazi = args[2]
	
	local alf = args["ak"]
	alf = (alf and (require("Modül:alfabeler").getirKodaGore(alf) or error("\"" .. alf .. "\" alfabe kodu geçersiz.")) or nil)
	
	local tip = args["tip"]
	
	return cikart.etiket_yazi(yazi, dil, alf, tip, sinif)
end

-- Ustring turns on the codepoint-aware string matching. The basic string function
-- should be used for simple sequences of characters, Ustring function for
-- sets – [].
local function takipetDuzen(yazi, duzen, takip, ustring)
	local find = ustring and mw.ustring.find or string.find
	if duzen and find(yazi, duzen) then
		--require("Modül:debug").track("script/" .. takip)
	end
end

local function takipet(yazi, dil, alf)
	local U = mw.ustring.char
	
	if dil and yazi then
		local dilKodu = dil:getirKod()
		
		-- [[Özel:SayfayaBağlantılar/Şablon:tracking/script/ang/acute]]
		if dilKodu == "ang" then
			local ayrik = mw.ustring.toNFD(yazi)
			local akut = U(0x301)
			
			takipetDuzen(ayrik, akut, "ang/acute")
		
		--[=[
		[[Özel:SayfayaBağlantılar/Şablon:tracking/script/Greek/wrong-phi]]
		[[Özel:SayfayaBağlantılar/Şablon:tracking/script/Greek/wrong-theta]]
		[[Özel:SayfayaBağlantılar/Şablon:tracking/script/Greek/wrong-kappa]]
		[[Özel:SayfayaBağlantılar/Şablon:tracking/script/Greek/wrong-rho]]
			ϑ, ϰ, ϱ, ϕ should generally be replaced with θ, κ, ρ, φ.
		]=]
		elseif dilKodu == "el" or dilKodu == "grc" then
			takipetDuzen(yazi, "ϑ", "Greek/wrong-theta")
			takipetDuzen(yazi, "ϰ", "Greek/wrong-kappa")
			takipetDuzen(yazi, "ϱ", "Greek/wrong-rho")
			takipetDuzen(yazi, "ϕ", "Greek/wrong-phi")
		
			--[=[
			[[Özel:SayfayaBağlantılar/Şablon:tracking/script/Ancient Greek/spacing-coronis]]
			[[Özel:SayfayaBağlantılar/Şablon:tracking/script/Ancient Greek/spacing-smooth-breathing]]
			[[Özel:SayfayaBağlantılar/Şablon:tracking/script/Ancient Greek/wrong-apostrophe]]
				When spacing coronis and spacing smooth breathing are used as apostrophes, 
				they should be replaced with right single quotation marks (’).
			]=]
			if dilKodu == "grc" then
				takipetDuzen(yazi, U(0x1FBD), "Ancient Greek/spacing-coronis")
				takipetDuzen(yazi, U(0x1FBF), "Ancient Greek/spacing-smooth-breathing")
				takipetDuzen(yazi, "[" .. U(0x1FBD) .. U(0x1FBF) .. "]", "Ancient Greek/wrong-apostrophe", true)
			end
		
		-- [[Özel:SayfayaBağlantılar/Şablon:tracking/script/Russian/grave-accent]]
		elseif dilKodu == "ru" then
			local ayrik = mw.ustring.toNFD(yazi)
			
			takipetDuzen(ayrik, U(0x300), "Russian/grave-accent")
		
		-- [[Özel:SayfayaBağlantılar/Şablon:tracking/script/Tibetan/trailing-punctuation]]
		elseif dilKodu == "bo" then
			takipetDuzen(yazi, "[་།]$", "Tibetan/trailing-punctuation", true)
			takipetDuzen(yazi, "[་།]%]%]$", "Tibetan/trailing-punctuation", true)

		--[=[
		[[Özel:SayfayaBağlantılar/Şablon:tracking/script/Thai/broken-ae]]
		[[Özel:SayfayaBağlantılar/Şablon:tracking/script/Thai/broken-am]]
		[[Özel:SayfayaBağlantılar/Şablon:tracking/script/Thai/wrong-rue-lue]]
		]=]
		elseif dilKodu == "th" then
			takipetDuzen(yazi, "เ".."เ", "Thai/broken-ae")
			takipetDuzen(yazi, "ํ[่้๊๋]?า", "Thai/broken-am", true)
			takipetDuzen(yazi, "[ฤฦ]า", "Thai/wrong-rue-lue", true)

		--[=[
		[[Özel:SayfayaBağlantılar/Şablon:tracking/script/Lao/broken-ae]]
		[[Özel:SayfayaBağlantılar/Şablon:tracking/script/Lao/broken-am]]
		[[Özel:SayfayaBağlantılar/Şablon:tracking/script/Lao/possible-broken-ho-no]]
		[[Özel:SayfayaBağlantılar/Şablon:tracking/script/Lao/possible-broken-ho-mo]]
		[[Özel:SayfayaBağlantılar/Şablon:tracking/script/Lao/possible-broken-ho-lo]]
		]=]
		elseif dilKodu == "lo" then
			takipetDuzen(yazi, "ເ".."ເ", "Lao/broken-ae")
			takipetDuzen(yazi, "ໍ[່້໊໋]?າ", "Lao/broken-am", true)
			takipetDuzen(yazi, "ຫນ", "Lao/possible-broken-ho-no")
			takipetDuzen(yazi, "ຫມ", "Lao/possible-broken-ho-mo")
			takipetDuzen(yazi, "ຫລ", "Lao/possible-broken-ho-lo")

		--[=[
		[[Özel:SayfayaBağlantılar/Şablon:tracking/script/Lü/broken-ae]]
		[[Özel:SayfayaBağlantılar/Şablon:tracking/script/Lü/possible-wrong-sequence]]
		]=]
		elseif dilKodu == "khb" then
			takipetDuzen(yazi, "ᦵ".."ᦵ", "Lü/broken-ae")
			takipetDuzen(yazi, "[ᦀ-ᦫ][ᦵᦶᦷᦺ]", "Lü/possible-wrong-sequence", true)
		end
	end
end

-- Yazının HTML etiketlerini uygun dil ve alfabe sınıflarıyla kapla.
function cikart.etiket_yazi(yazi, dil, alf, tip, sinif, id)
	if not alf then
		alf = require("Modül:alfabeler").bulEnIyiAlfabe(yazi, dil)
	end
	
	takipet(yazi, dil, alf)
		
	-- Moğol alfabesindeki yazılarda boşluk karakterlerini satır başı ile değiştir, çünkü bu alfabe yukarıdan aşağı yazılmakta.
	if alf and alf:getirYon() == "down" then
		--[[	Önce, vikibağlantıları ve HTML etiketlerinin hedeflerinden kaçarak
				boşluklarının satır aralarıyla değiştirilmediğinden emin ol
		  ]]
		local kacildi = {}
		local i = 0
		local kacis_bicimi = "$%d"
		
		local function kacis(yazi, duzen, onek)
			return yazi:gsub(
				duzen,
				function(item)
					i = i + 1
					kacildi[i] = item
					return (onek or "") .. kacis_bicimi:format(i)
				end)
		end
		
		yazi = kacis(yazi, "%[%[([^|]+|)", "[[")
		yazi = kacis(yazi, "<[^>]+>")
		
		yazi = yazi:gsub(" +", "<br>")
		
		-- Eğer kaçınma başarılıysa bunu geri al.
		yazi = yazi:gsub(
			"$(%d)",
			function(a)
				a = tonumber(a)
				return kacildi[a]
			end
		)
	end

	if alf:getirKod() == "Imag" then
		tip = nil
	end

	local function sinif_ozell(siniflar)
		table.insert(siniflar, 1, alf:getirKod())
		if sinif and sinif ~= '' then
			table.insert(siniflar, sinif)
		end
		return 'class="' .. table.concat(siniflar, ' ') .. '"'
	end
	
	local function etiket_ozell(...)
		local cikti = {}
		if id then
			table.insert(cikti, 'id="' .. require("Modül:araçlar").make_id(dil, id) .. '"')
		end
		
		table.insert(cikti, sinif_ozell({...}) )
		
		if dil then
			table.insert(cikti, 'lang="' .. dil:getirKod() .. '"')
		end
		
		return table.concat(cikti, " ")
	end
	
	if tip == "varsayımsal" then
	-- [[Özel:SayfayaBağlantılar/Şablon:tracking/script-utilities/face/hypothetical]]
		--require("Modül:debug").track("script-utilities/face/hypothetical")
	end
	
	local veri = mw.loadData("Modül:alfabe araçları/veri").tipler[tip or "varsayılan"]
	
	local sonrasi = ""
	if alf:getirYon() == "rtl" and (tip == "çeviri" or mw.ustring.find(yazi, "%p$")) then
		sonrasi = "&lrm;"
	end
	
	-- Alfabe kaplayıcı ekle
	if veri then
		return ( veri.onek or "" ) .. '<' .. veri.etiket .. ' ' .. etiket_ozell(veri.sinif) .. '>' .. yazi .. '</' .. veri.etiket .. '>' .. sonrasi
	else
		error('"' .. tip .. '" geçersiz bir alfabe tipidir.')
	end
end

function cikart.etiket_alfabecev(alfabecev, dil, tur, ozellikler, elle_eklenmis)
	if type(dil) == "table" then
		dil = dil.getirKod and dil:getirKod()
			or error("etiket_alfabecev fonksiyonunun üçüncü parametresi bir dil kodu veya dil nesnesi olmalıdır.")
	end
	
	local veri = mw.loadData("Modül:alfabe araçları/veri").alfabecev[tur or "varsayılan"]
	
	local acilis_etiketi = {}
	
	table.insert(acilis_etiketi, veri.etiket)
	if dil == "ja" then
		table.insert(acilis_etiketi, 'class="' .. (veri.sinif and veri.sinif .. " " or "") .. (elle_eklenmis and "manual-tr " or "") .. 'tr"')
	else
		table.insert(acilis_etiketi, 'lang="' .. dil .. '-Latn"')
		table.insert(acilis_etiketi, 'class="' .. (veri.sinif and veri.sinif .. " " or "") .. (elle_eklenmis and "manual-tr " or "") .. 'tr Latn"')
	end
	
	if veri.dir then
		table.insert(acilis_etiketi, 'dir="' .. veri.dir .. '"')
	end
	
	table.insert(acilis_etiketi, ozellikler)
	
	return "<" .. table.concat(acilis_etiketi, " ") .. ">" .. alfabecev .. "</" .. veri.etiket .. ">"
end

-- Bir sözcüğün anadil alfabesinin istenildiğini belirten bir uyarı ekle
function cikart.iste_alfabe(dil, alf, ornek, katyok, sira_anahtari)
	local alfabeler = dil.getirAlfabeler and dil:getirAlfabeler() or error('"' .. dil:getirKod() .. '" dili getirAlfabeler metoduna sahip değil. Alfabesi belirtilmemiş olabilir.')
	
	-- Varsayılan istek "anadil" alfabedir
	local kat_alfabe = "anadil"
	local gorun_alfabe = "alfabe"
	
	-- Eğer alfabe belirtilmediyse ve dil tek bir alfabeye sahipse, onu kullan.
	if not alf and #alfabeler == 1 then
		alf = alfabeler[1]
	end
	
	-- Alfabe tanınınıyor mu?
	if alf then
		-- Eğer alfabe Latin ise, hiçbir şey çıkartma.
		if cikart.Latin_alfabesi_mi(alf) then
			return ""
		end
		
		if alf:getirKod() ~= alfabeler[1]:getirKod() then
			gorun_alfabe = alf:getirAsilAd()
		end
		
		-- Eğer iki anlama gelme durumu varsa kategori alfabeye özel olmalı
		-- Bu durum dil=und ise veya dil birden fazla alfabeye sahipse
		-- meydana gelebilir.
		if dil:getirKod() == "und" or alfabeler[2] then
			kat_alfabe = alf:getirAsilAd()
		end
	else
		-- Alfabe tanınmıyor ise.
		-- Dil, listesinde en azından bir tane Latin olmayan harf içeriyor mu?
		local varmi_Latinolmayan = false
		
		for i, deger in ipairs(alfabeler) do
			if not cikart.Latin_alfabesi_mi(deger) then
				varmi_Latinolmayan = true
				break
			end
		end
		
		-- Eğer Latin olmayan harfler yoksa, hiçbir şey çıkartma.
		if not varmi_Latinolmayan then
			return ""
		end
	end
	
	local kategori
	
	if ornek then
		kategori = dil:getirAsilAd() .. " kullanım örneklerinde " .. kat_alfabe .. " isteniyor"
	else
		kategori = dil:getirAsilAd() .. " söz türlerinde " .. kat_alfabe .. " isteniyor"
	end
	
	return "<small>[" .. gorun_alfabe .. " isteniyor]</small>" ..
		(katyok and "" or require("Modül:araçlar").format_categories({kategori}, dil, sira_anahtari))
end

function cikart.rfalfabe_s(frame)
	params = {
		[1] = { required = true, default = "und" },
		["ak"] = {},
		["örnek"] = { type = "boolean" },
		["katyok"] = { type = "boolean" },
		["sıra"] = {},
	}
	
	local args = require("Modül:parameters").process(frame:getParent().args, params)
	
	local dil = require("Modül:diller").getirKodaGore(args[1], 1)
	local alf = args.ak and require("Modül:alfabeler").getirKodaGore(args.ak, true)

	local tekrar = cikart.iste_alfabe(dil, alf, args["örnek"], args.katyok, args["sıra"])
	
	if tekrar == "" then
		error("Bu dil Latin alfabesini kullanmaktadır. Bir alfabe koduna ihtiyaç duymamaktadır.")
	else
		return tekrar
	end
end

function cikart.kontroletAlfabe(yazi, alfKodu, sonuc)
	local alfabeNesnesi = require("Modül:alfabeler").getirKodaGore(alfKodu)
	
	if not alfabeNesnesi then
		error('"' .. alfKodu .. '" alfabe kodu tanınmıyor.')
	end
	
	local asilYazi = yazi
	
	-- Harf olmayan karakterleri kaldır.
	yazi = mw.ustring.gsub(yazi, "[%A]", "")
	
	-- Bahsi geçen alfabenin tüm karakterlerini kaldır.
	yazi = mw.ustring.gsub(yazi, "[" .. alfabeNesnesi:getCharacters() .. "]", "")
	
	if yazi ~= "" then
		if type(sonuc) == "string" then
			error(sonuc)
		else
			error('"' .. asilYazi .. '" yazısı "' .. alfabeNesnesi:getirKategoriAdi() .. " alfabesine ait olmayan " .. yazi .. '" karakterlerini içermekte.', 2)
		end
	end
end

return cikart