Module:Peter Bowman/reg-es

From Wikipedia

Documentation for this module may be created at Module:Peter Bowman/reg-es/doc

local d = mw.loadData 'Module:Peter Bowman/reg-es/datos'   -- ustalona lista regionów

-- przenosi wykryte ciągi znaków oddzielone przecinkami do tablicy "words"
local function analizujLancuch(s)
    local words = {}
    for w in string.gfind(s, "%s*([^,]+)%s*") do words[#words + 1] = w end
    return words
end

-- porównuje tablicę zawierającą listę regionów podanych przez uzytkownika do ustalonej w kodzie
-- tablicy z regionami, uporządkowuje je i tworzy kategorie
local function znajdzRegiony(t, op)
    local regs = {}     -- tablica pomocnicza do przechowywania regionów obecnych w tablicy "d"
    local no_regs = {}  -- tablica pomocnicza do przechowywania regionów nieobecnych w tablicy "d"
    local j = 0
    
    -- iteracja przechodzi przez wszystkie pozycje w tablicy "t"
    for i = 1, #t do
        --local temp = t[i]
        
        if d[t[i]] then
            regs[j+1] = d[t[i]]       -- jeśli dany element występuje w tablicy "d", wpisuje go do tablicy "regs"
            j = j + 1
        else
            no_regs[i-j] = t[i]   -- w przeciwnym wypadku wpisuje go do "no_regs"
        end
    
    end

    -- uporządkowuje regiony według kolejności ustalonej w tablicy "d"
    if #t ~= 1 then table.sort(regs, function (a, b) return a[1] < b[1] end) end
    local cat = 'Kat:'
    local _regs = #regs
    
    -- przenosi elementy tablic "regs" i "no_regs" do "t"
    for i = 1, #t do
        if i <= _regs then t[i] = '[[:'..cat..regs[i][2]..']]'..(op and '[['..cat..regs[i][2]..']]' or '')
        else t[i] = no_regs[i-_regs] end
    end
    
    -- zwraca wartości logiczne TRUE, jeśli tablice "regs" i "no_regs" nie są puste
    return (#regs ~= 0), (#no_regs ~= 0)

end

-- podlinkowuje podany łańcuch, jeżeli pierwszym znakiem jest nawias otwierający
local function linkuj(s)
    local znak = string.sub(s, 1, 1)
    if (znak == '[') or (znak == '<') or (znak == '(') then return s
    else return '[['..s..']]' end
end

local p = {
main = function(frame)
    local pframe = frame:getParent()
    --local config = frame.args   -- the arguments passed BY the template, in the wikitext of the template itself
    --local args = pframe.args    -- the arguments passed TO the template, in the wikitext that transcludes the template
    
    local arg1, arg2 = pframe.args[1], pframe.args[2]         -- pierszy i drugi argument z szablonu {{reg-es}}
    
    if not arg1 then return '<b>nie podano listy regionów w pierwszym argumencie</b>' end
    
    local tablica = analizujLancuch(arg1)       -- regiony zawarte w łańcuchu przenosi do nowej tablicy
    local ns = mw.title.getCurrentTitle():inNamespace(0)        -- ns = TRUE jeśli szablon wywoływany jest w {{ns:0}}
    
    local op1, op2 = znajdzRegiony(tablica, (ns and not arg2))  -- porównuje owe regiony z ustaloną w kodzie listą
    
    return '<i>('..mw.text.listToText(tablica, ', ', ' i ')..')</i>'..(op1   -- region/y jest/są na liście
        and (ns and 'Kat:tak' or '') or '')..(op2               -- regionu/ów nie ma na liście
        and (ns and 'Kat:nie' or '') or '')..(arg2              -- podano drugi parametr?
        and ' '..linkuj(arg2) or '')

end }

return p