Modül:alfabeler

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


local cikart = {}
local Alfabe = {}

function Alfabe:getirKod()
	return self._kod
end

function Alfabe:getirAsilAd()
	return self._rawData.asilAd
end

function Alfabe:getirDigerAdlari(sadeceDigerAdlari)
	return require("Modül:dil-benzeri").getirDigerAdlari(self, sadeceDigerAdlari)
end

function Alfabe:getirDigerleri()
	return self._rawData.digerleri or {}
end

function Alfabe:getirCesitleri(flatten)
	return require("Modül:dil-benzeri").getirCesitleri(self, flatten)
end

function Alfabe:getirEbeveyn()
	return self._rawData.ebeveyn and self._rawData.ebeveyn
end

function Alfabe:getirEbeveynler()
	return {"tüm alfabeler"}
end

function Alfabe:getirSistem()
	if not self._sistemNesneleri then
		local m_sistemler = require("Modül:yazı sistemleri")
		self._sistemNesneleri = {}
		
		for _, sys in ipairs(self._rawData.sistemler or {}) do
			table.insert(self._sistemNesneleri, m_sistemler.getirKodaGore(sys))
		end
	end
	
	return self._sistemNesneleri
end

--function Alfabe:getirTumAdlar()
--	return self._rawData.adlar
--end


function Alfabe:getirTip()
	return "alfabe"
end


function Alfabe:getirKategoriAdi()
	local ad = self._rawData.asilAd
	
	-- If the name already has "code" or "semaphore" in it, don't add it.
	-- No names contain "script".
	if ad:find("[Cc]ode$") or ad:find("[Ss]emaphore$") or ad:find("[Aa]lfabesi") then
		return ad
	else
		return ad .. " alfabesi"
	end
end


function Alfabe:getirVikipediMaddesi()
	return self._rawData.vikipedi_maddesi or self:getirKategoriAdi()
end


function Alfabe:getirKarakterler()
	if self._rawData.karakterler then
		return self._rawData.karakterler
	else
		return nil
	end
end


function Alfabe:sayKarakterler(yazi)
	if not self._rawData.karakterler then
		return 0
	else
		local _, num = mw.ustring.gsub(yazi, "[" .. self._rawData.karakterler .. "]", "")
		return num
	end
end

function Alfabe:getirYon()
	local yon = self._rawData.yon
	if not yon then
		return nil
	else
		return yon
	end
end


function Alfabe:getRawData()
	return self._rawData
end


function Alfabe:toJSON()
	local ret = {
		asilAd = self:getirAsilAd(),
		kategoriAdi = self:getirKategoriAdi(),
		kod = self._kod,
		digerAdlari = self:getirDigerAdlari(),
		tip = self:getirTip(),
		}
	
	return require("Modül:JSON").toJSON(ret)
end


Alfabe.__index = Alfabe


function cikart.yapNesne(kod, veri)
	return veri and setmetatable({ _rawData = veri, _kod = kod }, Alfabe) or nil
end


function cikart.getirKodaGore(kod)
	if kod == "IPAchar" then
		--require("Modül:debug").track("IPAchar")
	end
	return cikart.yapNesne(kod, mw.loadData("Modül:alfabeler/veri")[kod])
end

function cikart.getirAsilAdaGore(ad)
	local kod = mw.loadData("Modül:alfabeler/ada göre")[ad]
	
	if not kod then
		return nil
	end
	
	return cikart.yapNesne(kod, mw.loadData("Modül:alfabeler/veri")[kod])
end

-- Find the best script to use, based on the characters of a string.
function cikart.bulEnIyiAlfabe(yazi, dil)
	if not yazi or not dil or not dil.getirAlfabeler then
		return cikart.getirKodaGore("None")
	end
	
	local alfabeler = dil:getirAlfabeler()
	
	if not alfabeler[2] then
		return alfabeler[1]
	end
	
	--[=[
		Remove any HTML entities; catfix function in [[Module:utilities]]
		adds tagging to a no-break space ( ), which contains Latin characters;
		hence Latin was returned as the script if "Latn" is one of the language's scripts.
	]=]
	yazi = string.gsub(yazi, "&[a-zA-Z0-9]+;", "")
	
	-- Try to match every script against the text,
	-- and return the one with the most matching characters.
	local eniyisay = 0
	local eniyialfabe = nil
	
	-- Get length of text minus any spacing or punctuation characters.
	-- Counting instances of UTF-8 character pattern is faster than mw.ustring.len.
	local _, length = string.gsub(mw.ustring.gsub(yazi, "[%s%p]+", ""), "[\1-\127\194-\244][\128-\191]*", "")
	
	if length == 0 then
		return cikart.getirKodaGore("None")
	end
	
	for i, alfabe in ipairs(alfabeler) do
		local say = alfabe:sayKarakterler(yazi)
		
		if say >= length then
			return alfabe
		end
		
		if say > eniyisay then
			eniyisay = say
			eniyialfabe = alfabe
		end
	end
	
	if eniyialfabe then
		return eniyialfabe
	end
	
	-- No matching script was found. Return "None".
	return cikart.getirKodaGore("None")
end

function cikart.kodaDonustur(frame)
	alfabe = frame.args["alfabe"]
	if cikart.getirAsilAdaGore(alfabe) then
		return cikart.getirAsilAdaGore(alfabe):getirKod()
	elseif cikart.getirKodaGore(alfabe) then
		return cikart.getirKodaGore(alfabe):getirAsilAd()
	end
end

function cikart.alfbul(frame)
	local args = frame:getParent().args
	local dil = require("Modül:diller").getirKodaGore(args[1])
	local yazi = args[2]
	return cikart.bulEnIyiAlfabe(yazi, dil):getirAsilAd()
end

return cikart