İçeriğe atla

Modül:utils

Vikisözlük sitesinden
Modül belgelemesi [Oluştur]


--[=[
  Modül:utils v0.3.1
  Tarih: 2015-08-14

  Bu modül bazı ortak yararlı işlevler içerir.
  Buraya başka bir evrensel işlev eklemek için boş bırakın.
]=]--

local export = {}

-- Tabloyu klonlama işlevi (bazen mw.clone'dan daha iyi çalışır)
function export.clone(original)
    local copy = {}
    for key, value in pairs(original) do
        copy[key] = value
    end
    return copy
end

-- Geçerli PAGENAME ve ilgili bilgileri alma işlevi
function export.get_base()
	local PAGENAME = mw.title.getCurrentTitle().text
	local SUBPAGENAME = mw.title.getCurrentTitle().subpageText
	local NAMESPACE = mw.title.getCurrentTitle().nsText
	
	if NAMESPACE == 'Kullanıcı' or NAMESPACE == 'Участник' then
		return SUBPAGENAME
	end
	return PAGENAME
end

-- Sıralanmış tuşlarla tablo yineleme işlevi (sıralama işlevi farklı olabilir)
function export.spairs(t, order)
    -- anahtarları topla
    local keys = {}
    for k in pairs(t) do keys[#keys+1] = k end
    -- sort
    if order then
        table.sort(keys, function(a,b) return order(t, a, b) end)
    else
        table.sort(keys)
    end
    -- yineleyici işlevini döndür
    local i = 0
    return function()
        i = i + 1
        if keys[i] then
            return keys[i], t[keys[i]]
        end
    end
end

-- Betiklerin çalışma süresini ölçme işlevleri (başlangıç)
function export.start()
	export.started = os.clock()
end

-- Betiklerin çalışma süresini ölçme işlevleri (durdurma)
function export.stop(desc)
	export.stoped = os.clock()
	export.delta = export.stoped - export.started
	if desc == nil then
		desc = 'zaman deltası'
	end
	mw.log('™ ' .. desc .. ' = ' .. export.delta)
end

-- İki dizenin ortak kısmını (uzunluk) bulma işlevi
-- (dizelerin başlangıcından itibaren ortak kısım)
function export.find_common(str_1, str_2)
	if not str_1 or not str_2 then
		return 1
	end
	for pos = 1, #str_1 do
	    local char_1 = str_1:sub(pos, pos)
	    local char_2 = str_2:sub(pos, pos)
	    if char_1 ~= char_2 then
	    	return pos
	    end
	end
	return 1
end

-- Listelerin diktelerinin diktesine kolayca değer eklenmesini sağlayan işlev
-- Bu yapıya örnek:
--   dict = {
--     key1 = {
--       sub_key1 = {değer1, değer2, değer3},
--       sub_key2 = {değer4, değer5},
--     },
--     key2 = {
--       sub_key3 = {değer6},
--       sub_key4 = {değer7, değer8},
--     },
--   }
function export.put_value(dict, key, sub_key, value)
	if not dict[key] then
		dict[key] = {}
	end
	if not dict[key][sub_key] then
		dict[key][sub_key] = {}
	end
	table.insert(dict[key][sub_key], value)
end

-- Listeleri yinelemeli olarak karşılaştırarak iki öğeyi karşılaştırın.
-- FIXME, liste olmayan tablolarda çalışmaz.
function export.equals(x, y)
    if type(x) == "tablo" and type(y) == "tablo" then
        if #x ~= #y then
            return false
        end 
        for key, value in ipairs(x) do
            if not export.equals(value, y[key]) then
                return false
            end
        end
        return true
    end
    return x == y
end

-- Liste öğeyi içeriyorsa true
function export.contains(tab, item)
    for _, value in pairs(tab) do
        if export.equals(value, item) then
            return true
        end
    end
    return false
end

-- öğe zaten yoksa listeye ekle
function export.insert_if_not(tab, item, pos)
    if not export.contains(tab, item) then
    	if pos then
        	table.insert(tab, pos, item)
        else
        	table.insert(tab, item)
        end
    end
end

-- listeyi kümeye dönüştür
function export.list_to_set(list)
	local set = {}
	for _, item in ipairs(list) do
		set[item] = true
	end
	return set
end

-- Normal İfade sihirli karakterlerini engelle ^$()%.[]*+-?)
function export.escape(value)
    -- Alfasayısal olmayan her karakterin (%W) % kaçış karakterine ön ekini uygula,
    -- burada %% kaçış ve %1 orijinal karakterdir
    return mw.ustring.gsub(value, "(%W)","%%%1")
end

return export