FANDOM


-- Autor: Nanaki
-- Licencja: CC-BY-SA 3.0
-- 
-- PL: Moduł luźno bazowany na https://en.wikipedia.org/wiki/Module:Navbox, lecz zbudowany od zera. Do użycia w szablonie Navbox.
-- EN: Module is loosely based on https://en.wikipedia.org/wiki/Module:Navbox, but built from ground up. For use in Navbox template.
 
local Navbox = {} -- Główny obiekt modułu
local p = {} -- Obiekt do zwrócenia
 
-- Zmienne
Navbox.args = {}     -- Parametry
Navbox.rows = 0      -- Ilość list
Navbox.columns = 2   -- Ilość kolumn
Navbox.rowspan = {}  -- Lista elementów, do których należy zastosować atrybut "rowspan"
Navbox.colspan = {}  -- Lista elementów, do których należy zastosować atrybut "colspan"
 
-- Główna funkcja wywołująca moduł
-- {{#invoke:navbox|navbox}}
function p.navbox(frame)
    Navbox.args = Navbox.mergeFrames(frame, frame:getParent()) -- Pobiera parametry podane przez #invoke oraz nadpisuje je podanymi do szablonu, który go wywołał
 
    if mw.ustring.lower(Navbox.args['Zagnieżdżony'] or '') == 'tak' then Navbox.nested = true end -- Gdy parametr "Zagnieżdżony" ma wartość "tak" ustawia flagę
    if mw.ustring.lower(Navbox.args['Paski'] or 'tak') == 'tak' then Navbox.zebra = true end -- Gdy parametr "Paski" ma wartość "tak" ustawia flagę
 
    local state = mw.ustring.lower(Navbox.args['Stan'] or '') -- Zmienia zawartość parametru "Stan" na małe litery
    if state == 'rozwinięty' or state == 'zwinięty' then -- Włącza zwijanie gdy podany stan to "zwijany" lub "rozwinięty"
        Navbox.collapsible = true
    elseif state == 'czysty' then -- Wyłącza poprawkę wyśrodkowania tytułu jeśli podany stan to "czysty"
        Navbox.nofix = true
    end
 
    local tab = Navbox.tab() -- Tworzy główną tabelę szablonu
    local header = Navbox.header() -- Tworzy nagłówek (parametr "Tytuł")
    local above = Navbox.above() -- Tworzy wiersz z komórką "Góra"
    local groups = Navbox.groups() -- Tworzy wiersze z grupami oraz obrazy
    local below = Navbox.below() -- Tworzy wiersz z komórką "Dół"
 
    tab:wikitext('\n') -- Dodaje załamanie linii
 
    if header then tab:node(header):allDone():wikitext('\n') end -- Dodaje nagłówek do tabeli oraz załamanie linii
 
    if above then
        if header then Navbox.separator(tab, true) end -- Jeśli nagłówek istnieje, dodaje separator na całą szerokość
        tab:node(above):allDone():wikitext('\n') -- Dodaje komórkę "Góra" do tabeli oraz załamanie linii
    end
 
    if groups then
        if header or above then Navbox.separator(tab, true) end -- Jeśli nagłówek lub "Góra" istnieją, dodaje separator na całą szerokość
        tab:node(groups):allDone() -- Dodaje wiersze list
    end
 
    if below then
        if header or above or groups then Navbox.separator(tab, true) end -- Jeśli nagłówek, "Góra" lub listy istnieją, dodaje separator na całą szerokość
        tab:node(below):allDone():wikitext('\n') -- Dodaje komórkę "Góra" do tabeli oraz załamanie linii
    end
 
    if header and Navbox.collapsible then -- Jeśli nagłówek istnieje oraz navbox ma być zwijany
        tab:addClass('mw-collapsible') -- Dodaje klasę wywołującą zwijanie
        if state == 'zwinięty' then tab:addClass('mw-collapsed') end -- Jeśli podany stan to "zwinięty", dodaje klasę odpowiedzialną za ustawienie domyślnie zwiniętego szablonu
        if (Navbox.args['Rozwiń'] or '') ~= '' then tab:attr('data-expandtext', mw.text.encode(Navbox.args['Rozwiń'])) end -- Dodaje atrybut zmieniający tekst "Zwiń" jeśli został podany parametr
        if (Navbox.args['Zwiń'] or '') ~= '' then tab:attr('data-collapsetext', mw.text.encode(Navbox.args['Zwiń'])) end -- Dodaje atrybut zmieniający tekst "Rozwiń" jeśli został podany parametr
    end
    Navbox.spans() -- Dynamiczne atrybuty "rowspan" i "colspan"
    if Navbox.nested then -- Jeżli zagnieżdżony zwraca tabelę
        return tostring(tab)
    end -- W preciwnym wypadku zwraca w nadrzędnym boksie
    local box = mw.html.create('div'):addClass('navbox') -- Tworzy boks
    box:node(tab) -- Umieszcza tabelę w nadrzędnym boksie
    Navbox.css(box, 'Box') -- Aplikuje parametry "Box style" i "Box class"
    return tostring(box)
end
 
-- Funkcja dodająca atrybuty "rowspan" i "colspan" do odpowiednich elementów
function Navbox.spans()
    for _, v in ipairs(Navbox.colspan) do -- Dla każdego elementu na liście "colspan"
        if v then v:attr('colspan', Navbox.columns) end -- Dodaj atrybut "colspan" z wartością zmiennej "Navbox.columns"
    end
    if Navbox.rows > 1 then -- Jeśli ilość list jest większa niż 1
        for _, v in ipairs(Navbox.rowspan) do -- Dla każdego elementu na liście "rowspan"
            if v then v:attr('rowspan', Navbox.rows*2-1) end -- Dodaj atrybut "rowspan" z wartością: liczba wierszy * 2 - 1
        end
    end
end
 
-- Funkcja zwracająca numery niepustych list
function Navbox.lists()
    local list = {} -- Pusta lista
    for k, v in pairs(Navbox.args) do -- Dla każdego podanego argumentu
        if type(k) == 'string' then
            local match,_,no = mw.ustring.find(k or '', "^Lista ([0-9]+)$") -- Sprawdza czy nazwa argumentu to "Lista #"
            if match and v ~= '' then table.insert(list, tonumber(no)) end -- Jeśli tak oraz argument jest niepusty, dodaje numer do listy
        end
    end
    table.sort(list) -- Sortuje listę
    return list -- Zwraca listę
end
 
-- Funkcja tworząca tabelę szablonu
function Navbox.tab()
    local tab = mw.html.create('table'):addClass('navbox-table') -- Tworzy tabelę szablonu
    Navbox.css(tab, 'Tabela') -- Aplikuje parametry "Tabela style" i "Tabela class"
    return tab:allDone()
end
 
-- Funkcja tworząca nagłówek (parametr "Tytuł")
function Navbox.header()
    if (Navbox.args['Tytuł'] or '') ~= '' then -- Sprawdza czy parametr "Tytuł" jest niepusty
        local header = mw.html.create('tr'):tag('th'):addClass('navbox-header'):attr('scope', 'col') -- Tworzy wiersz oraz komórkę nagłówka
        local links = Navbox.template(header) -- Tworzy element z linkami do szablonu podanego w parametrze "Szablon"
        if links then header:node(links) end
        if (links or Navbox.collapsible) and not Navbox.nofix then header:addClass('center-fix') end -- Pomija klasę poprawiającą wyśrodkowanie jeśli został podany stan "czysty" lub w nagłówku nie ma elementów pływających (brak linków do szablonu i zwijania pozwala na wykorzystanie całej szerokości szablonu
        Navbox.css(header, 'Tytuł') -- Aplikuje parametry "Tytuł style" i "Tytuł class"
 
        header:wikitext('\n' .. Navbox.args['Tytuł'] or '') -- Dodaje wartość parametru "Tytuł" na początku nowej linii
        table.insert(Navbox.colspan, header) -- Dodaje nagłówek do elementów z dynamicznym atrybutem "colspan"
        return header:allDone()
    end
end
 
-- Dodaje linki do szablonu podanego w parametrze "Szablon"
function Navbox.template()
    if (Navbox.args['Szablon'] or '') ~= '' then -- Sprawdza czy parametr "Szablon" jest niepusty
        local links = mw.html.create('div'):addClass('navbox-template-links plainlinks hlist'):tag('ul') -- Tworzy poziomą listę
        links:tag('li'):wikitext('[' .. tostring(mw.uri.fullUrl( 'Template:' .. Navbox.args['Szablon'] )) .. ' <span title="Zobacz szablon">Z</span>]'):done():tag(''):wikitext(' ') -- Dodaje link "Zobacz" oraz odstęp po elemencie
        links:tag('li'):wikitext('[' .. tostring(mw.uri.fullUrl( 'Template talk:' .. Navbox.args['Szablon'] )) .. ' <span title="Dyskusja szablonu">D</span>]'):done():tag(''):wikitext(' ') -- Dodaje link "Dyskusja" oraz odstęp po elemencie
        links:tag('li'):wikitext('[[Special:WhatLinksHere/Szablon:' .. Navbox.args['Szablon'] .. '|<span title="Linkujące">L</span>]]') -- Dodaje link "Linkujące"
        -- Tworzenie linków zewnętrznych do szablonu i dyskusji ma na celu uniknięcie redlinków w przypadku gdy nie istnieją
        return links:allDone()
    end
end
 
-- Funkcja tworząca wiersz z komórką "Góra"
function Navbox.above()
    if (Navbox.args['Góra'] or '') ~= '' then -- Sprawdza czy parametr "Góra" jest niepusty
        local above = mw.html.create('tr'):tag('td'):addClass('navbox-above') -- Tworzy wiersz oraz komórkę
        Navbox.css(above, 'Baza') -- Aplikuje parametry "Baza style" i "Baza class"
        Navbox.css(above, 'Góra', 'hlist') -- Aplikuje parametry "Góra style" i "Góra class", gdzie domyślna klasa to "hlist"
        above:wikitext('\n' .. Navbox.args['Góra'] or '') -- Dodaje wartość parametru "Góra" na początku nowej linii
        table.insert(Navbox.colspan, above) -- Dodaje komórkę do elementów z dynamicznym atrybutem "colspan"
        return above:allDone()
    end
end
 
-- Funkcja tworząca wiersz z komórką "Dół"
function Navbox.below(tab) -- tab: tabela, do której ma zostać dodany wiersz
    if (Navbox.args['Dół'] or '') ~= '' then -- Sprawdza czy parametr "Dół" jest niepusty
        local below = mw.html.create('tr'):tag('td'):addClass('navbox-below') -- Tworzy wiersz oraz komórkę
        Navbox.css(below, 'Baza') -- Aplikuje parametry "Baza style" i "Baza class"
        Navbox.css(below, 'Dół', 'hlist') -- Aplikuje parametry "Dół style" i "Dół class", gdzie domyślna klasa to "hlist"
        below:wikitext('\n' .. Navbox.args['Dół'] or '') -- Dodaje wartość parametru "Dół" na początku nowej linii
        table.insert(Navbox.colspan, below) -- Dodaje komórkę do elementów z dynamicznym atrybutem "colspan"
        return below:allDone()
    end
end
 
-- Funkcja tworząca wszystkie wiersze list oraz komórki z obrazami
function Navbox.groups()
    local lists = Navbox.lists() -- Funkcja zwracająca numery niepustych list
    if #lists > 0 then -- Jeśli ilosć list jest większa niż 0
        local groups = mw.html.create('') -- Tworzy pusty element zawierający listy
        for _, v in ipairs(lists) do -- Dla każdej niepustej listy
            if Navbox.rows > 0 then Navbox.separator(groups) end -- Dodaje separator za wyjątkiem pierwszego wywołania
            local group = Navbox.group(v) -- Tworzenie wiersza listy
            groups:node(group):allDone():wikitext('\n')
        end
        return groups:allDone()
    end
end
 
-- Funkcja tworząca wiersz z listą
function Navbox.group(no) -- no: numer grupy parametrów
    local row = mw.html.create('tr'):attr('data-row', no) -- Tworzy wiersz
    if Navbox.rows == 0 then Navbox.img(row, 'Obraz lewy') end -- Dodaje komórkę lewego obrazu jeśli jest to pierwsza lista (jednorazowo na szablon)
    local list = mw.html.create('td'):addClass('navbox-list') -- Tworzy komórkę listy, ale jeszcze jej nie dodaje to wiersza
    if Navbox.zebra then -- Jeśli paski są włączone
        if Navbox.rows - math.floor(Navbox.rows/2)*2 == 0 then list:addClass('navbox-odd') else list:addClass('navbox-even') end -- Dodaje klasy wierszy parzystych i nieparzystych
    end
    if (Navbox.args['Grupa ' .. no] or '') ~= '' then -- Sprawdza czy parametr "Grupa #" jest niepusty
        local group = row:tag('th'):attr('scope', 'row'):addClass('navbox-group'):wikitext('\n' .. Navbox.args['Grupa ' .. no]) -- Tworzy komórkę z nazwą grupy
        if (Navbox.args['Szerokość grupy'] or '') ~= '' then -- Jeśli został podany parametr "Szerokość grupy"
            if not Navbox.widthadded then -- Tylko dla pierwszej grupy
                group:css('width', Navbox.args['Szerokość grupy']) -- Dodaje styl "width" do komórki z grupą
                Navbox.widthadded = true -- Flaga kontrolująca pojedyncze wywołanie
            end
            group:addClass('wrap') -- Dodaje klasę umożliwiającą łamanie linii we wszystkich grupach
        end
        Navbox.css(group, 'Baza') -- Aplikuje parametry "Baza style" i "Baza class"
        Navbox.css(group, 'Grupa') -- Aplikuje parametry "Grupa style" i "Grupa class"
        Navbox.css(group, 'Grupa ' .. no) -- Aplikuje parametry "Grupa # style" i "Grupa # class"
    else -- Gdy parametr "Grupa #" jest pusty
        list:addClass('no-group'):attr('colspan', 2) -- Rozszerzenie komórki listy na dwie kolumny
    end
 
    if mw.ustring.sub(Navbox.args['Lista ' .. no], 1, 26) == '<table class="navbox-table' then -- Jeśli znajdzie początek navboksa z parametrem "Zagnieżdżony = tak"
        list:addClass('navbox-nested'):wikitext('\n' .. Navbox.args['Lista ' .. no])
        Navbox.css(list, 'Lista') -- Aplikuje parametry "Lista style" i "Lista class"
    else
        list = list:tag('div'):wikitext('\n' .. Navbox.args['Lista ' .. no])
        Navbox.css(list, 'Lista', 'hlist') -- Aplikuje parametry "Lista style" i "Lista class", gdzie domyślna klasa to "hlist"
    end
 
    Navbox.css(list, 'Lista ' .. no) -- Aplikuje parametry "Lista # style" i "Lista # class"
    row:node(list:done()) -- Dodaje komórkę listy do wiersza
    if Navbox.rows == 0 then Navbox.img(row, 'Obraz prawy') end -- Dodaje komórkę prawego obrazu jeśli jest to pierwsza lista (jednorazowo na szablon)
    Navbox.rows = Navbox.rows + 1 -- Zwiększa licznik list o 1
    return row:allDone()
end
 
-- Funkcja tworząca komórkę z obrazem
function Navbox.img(row, param) -- row: wiersz, do którego ma zostać dodana komórka; param: parametr z obrazem
    if (Navbox.args[param] or '') ~= '' then -- Sprawdza czy podany parametr jest niepusty
        local l = row:tag('td'):addClass('navbox-image') -- Tworzy komórkę
        Navbox.css(l, param) -- Aplikuje parametry "... style" i "... class" dla danej komórki
        l:wikitext('\n' .. Navbox.args[param] or '') -- Dodaje wartość podanego parametru na początku nowej linii
        Navbox.columns = Navbox.columns + 1 -- Zwiększa licznik kolumn o 1
        table.insert(Navbox.rowspan, l) -- Dodaje komórkę do elementów z dynamicznym atrybutem "rowspan"
    end
end
 
-- Funkcja tworząca wiersz separatora
function Navbox.separator(tab, fullwidth) -- tab: tabela, do której dodać wiersz z separatorem; fullwidth: czy wiersz ma być na całą szerokość szablonu
    local separator = tab:tag('tr'):addClass('navbox-separator'):tag('td') -- Tworzy wiersz i komórkę separatora
    tab:wikitext('\n')
    if fullwidth then
        table.insert(Navbox.colspan, separator) -- Dodaje separator do elementów z dynamicznym atrybutem "colspan"
    else
        separator:attr('colspan', 2) -- Dodaje stały atrybut "colspan" - separator między listami
    end
end
 
-- Funkcja aplikująca do podanego elementu parametry "... style" i "... class"
function Navbox.css(elem, name, class, style) -- elem: element docelowy; name: nazwa parametru; class: domyślna klasa jeśli nie został podany parametr; style: domyślne style jeśli nie został podany parametr
    elem:cssText(Navbox.args[name .. ' style'] or style or '') -- Aplikuje style z parametru "... style" lub z wartości podanej do funkcji
    elem:addClass(Navbox.args[name .. ' class'] or class or '') -- Aplikuje klasy z parametru "... style" lub z wartości podanej do funkcji 
end
 
-- Łaczy argumenty z dwóch obiektów frame
function Navbox.mergeFrames(frame, parent)
    local args = {} -- Pusta lista
    if frame then -- Jeśli obiekt "frame" został podany
        for k,v in pairs(frame.args) do -- Dla każdego argumentu obiektu "frame"
            if type(k) == 'string' then k = mw.text.trim(k) end -- Jeśli parametr tekstowy, obetnij białe znaki z początku i końca
            if type(v) == 'string' then v = mw.text.trim(v) end -- Jeśli wartość tekstowa, obetnij białe znaki z początku i końca
            args[k] = v -- Dodaj wartość do listy
        end
    end
    if parent then -- Jeśli obiekt "parent" został podany
        for k,v in pairs(parent.args) do -- Dla każdego argumentu obiektu "parent"
            if type(k) == 'string' then k = mw.text.trim(k) end -- Jeśli parametr tekstowy, obetnij białe znaki z początku i końca
            if type(v) == 'string' then v = mw.text.trim(v) end -- Jeśli wartość tekstowa, obetnij białe znaki z początku i końca
            args[k] = v -- Dodaj wartość do listy nadpisując ewentualne wartości z obiektu "frame"
        end
    end
    return args -- Zwraca wynik
end
 
-- Zwraca obiekt
return p

Ad blocker interference detected!


Wikia is a free-to-use site that makes money from advertising. We have a modified experience for viewers using ad blockers

Wikia is not accessible if you’ve made further modifications. Remove the custom ad blocker rule(s) and the page will load as expected.

Więcej z Fandomu

Losowa wiki