Welcome to Wargaming.net Wiki!
Variants
Navigation

Module:ShipList

Jump to: navigation, search
No edit summary
No edit summary
 
Line 5: Line 5:
-- tech-tree footer, and WoWs_ShipsList). Keyed by internal ship code.
-- tech-tree footer, and WoWs_ShipsList). Keyed by internal ship code.
local blacklist = {
local blacklist = {
["PASA920_Pinata_Essex"] = true,
["PGSA910_Pinata_Richthofen"] = true,
["PASB997_Colorado_2"] = true,
["PASB919_Iowa_2"] = true,
["PASB710_Oregon"] = true,
["PVSB990_Comodoro"] = true,
["PJSB719_Hotaka"] = true,
["PBSB810_Cumberland"] = true,
["PHSC988_Admiraal"] = true,
["PHSC998_Statenland"] = true,
["PHSC730_Unie"] = true,
["PHSC990_Vrijheid"] = true,
["PRSC709_Vyazma"] = true,
["PRSC990_Petrozavodsk"] = true,
["PISC908_East_Amalfi"] = true,
["PISC710_Varese"] = true,
["PISC990_Ravenna"] = true,
["PJSC710_Yari"] = true,
["PBSC708_STPatric_Belfast_1943"] = true,
["PFSC708_Metz"] = true,
["PWSD990_Sodermanland"] = true,
["PWSD920_PostApoc_Smaland"] = true,
["PGSD707_Z32_EventDday_Torp"] = true,
["PGSD717_Z33_EventDday_MG"] = true,
["PGSD727_z34_EventDday_Support"] = true,
["PGSD737_z38_EventDday_Heal"] = true,
["PGSD990_Lubeck"] = true,
["PUSC810_Black_Brisbane"] = true,
["PUSC997_Gambra"] = true,
["PWSB909_Black_Karl_XIV_Johan"] = true,
["PFSB909_Pirate_Jean_Bart"] = true,
["PFSB596_Black_Dunkerque"] = true,
["PFSB599_Black_Jean_Bart"] = true,
["PFSD810_Colorful_Kleber"] = true,
["PFSD820_Kleber_TE"] = true,
["PGSA598_Black_Graf_Zeppelin"] = true,
["PGSA990_Otto_Lilienthal"] = true,
["PGSA510_Werner_Voss"] = true,
["PGSB898_Azur_Bismarck"] = true,
["PGSB517_AZUR_Prinz_Heinrich"] = true,
["PGSB538_Black_Brandenburg"] = true,
["PGSB828_Odin_TE"] = true,
["PGSB599_Black_Pommern"] = true,
["PGSB989_Prinz_Sigismund"] = true,
["PGSB597_Black_Scharnhorst"] = true,
["PGSB918_Pirate_Brandenburg"] = true,
["PGSB598_Black_Tirpitz"] = true,
["PGSC899_AZUR_Aegir"] = true,
["PGSC890_Azur_Hindenburg"] = true,
["PGSC920_Gold_Bremen"] = true,
["PGSC718_Warhammer_Blacktemplar"] = true,
["PGSC598_Black_Mainz"] = true,
["PGSC817_Black_Munchen"] = true,
["PGSC809_Colorful_Roon"] = true,
["PGSC908_Black_Schill"] = true,
["PGSD720_Gold_Georg_Hoffmann"] = true,
["PGSD709_GM_ZF_6"] = true,
["PISB708_AZUR_Littorio"] = true,
["PISB990_Amerigo_Vespucci"] = true,
["PISB908_FBO_Roma"] = true,
["PISC897_Azur_Gorizia"] = true,
["PISC590_Black_Napoli"] = true,
["PJSA598_Black_Kaga"] = true,
["PJSB920_Gold_Aki"] = true,
["PJSB906_Ise_TEST1"] = true,
["PJSB916_Ise_TEST2"] = true,
["PJSB559_Black_Iwami"] = true,
["PJSB710_FBO_Yamato"] = true,
["PJSC519_AZUR_Azuma"] = true,
["PJSC598_Black_Atago"] = true,
["PJSC829_Black_Azumaya"] = true,
["PJSC729_GW_Chikuma_2_Hyb"] = true,
["PJSC905_East_Furutaka_1926"] = true,
["PJSC727_Blue_Dragon"] = true,
["PJSC717_Yellow_Dragon"] = true,
["PJSC749_GM_Suzuya"] = true,
["PJSC759_VL_Suzuya"] = true,
["PJSC918_Tone_Second"] = true,
["PJSC919_Tone_Third"] = true,
["PJSC590_Black_Yoshino"] = true,
["PJSC890_CLR_Zao"] = true,
["PJSD890_AZUR_Shimakaze"] = true,
["PJSD718_AZUR_Yukikaze"] = true,
["PJSD598_Black_Asashio"] = true,
["PJSD596_Black_Shinonome"] = true,
["PJSD889_Kitakaze_PR"] = true,
["PJSD014_Tachibana_1912_Asus"] = true,
["PHSC720_Gold_Prins_Van_Oranje"] = true,
["PZSB909_Xuan_Ming"] = true,
["PZSB708_Xuan_Wu"] = true,
["PZSC720_Zhuge_Liang"] = true,
["PZSD598_Black_LoYang"] = true,
["PZSD910_Black_Lushun"] = true,
["PZSD718_Warhammer_Ork"] = true,
["PBSB536_Black_Repulse"] = true,
["PBSC558_AZUR_Cheshire"] = true,
["PBSC909_Pirate_Neptune"] = true,
["PBSC888_Edinburgh_PR"] = true,
["PBSD598_Black_Cossack"] = true,
["PASA898_AZUR_Hornet"] = true,
["PASA598_Black_Saipan"] = true,
["PASB889_Azur_Kearsarge"] = true,
["PASB818_Black_Alabama"] = true,
["PASB708_Alabama"] = true,
["PASB528_Alabama_VL"] = true,
["PASB599_Black_Kearsarge"] = true,
["PASB598_Black_Massachusetts"] = true,
["PASB808_Colorful_North_Carolina"] = true,
["PASC599_Black_Alaska"] = true,
["PASC587_Black_Atlanta"] = true,
["PASC920_Gold_Hawaii"] = true,
["PASC045_Marblehead_1924_Asus"] = true,
["PASC910_Black_Puerto_Rico"] = true,
["PASD529_Black_Black"] = true,
["PASD899_Frank_Friday"] = true,
["PASD819_FBO_Johnston"] = true,
["PASD597_Black_Sims"] = true,
["PRSA990_Admiral_Orlov"] = true,
["PRSA598_Black_Chkalov"] = true,
["PRSB709_AZUR_Sov_Russia"] = true,
["PRSB818_Borodino_TE"] = true,
["PRSC523_AZUR_Avrora"] = true,
["PRSC010_Diana_1905_Asus"] = true,
["PRSC568_Black_Lazo"] = true,
["PRSC530_Black_Smolensk"] = true,
["PRSC980_Vladimir_Monomakh"] = true,
["PRSD909_Black_Neustrashimy"] = true,
["PWSD907_Pirate_Grom"] = true,
["PGSB930_Pinata_Schliefen"] = true,
["PGSB908_PostApoc_Zieten"] = true,
["PRSB538_V_I_Lenin"] = true,
["PISB709_Olympian_Marco_Polo"] = true,
["PISB719_Olympian_Giuseppe_Verdi"] = true,
["PISB810_Cyber_Ruggiero_di_Lauria"] = true,
["PBSB747_STPatric_Duke_of_York"] = true,
["PASC505_Rattlehead"] = true,
["PRSC818_Cyber_Dmitry_Pozharsky"] = true,
["PRSC920_PostApoc_Petropavlovsk"] = true,
["PISC707_Olympian_Francesco_Ferruccio"] = true,
["PBSC707_STPatric_Belfast_1959"] = true,
["PBSC718_STPatric_Tiger_1959"] = true,
["PBSC920_Pirate_Plymouth"] = true,
["PZSC908_Pinata_Irian"] = true,
["PASD704_DD_214"] = true,
["PGSD910_East_Z_52"] = true,
["PJSD017_Kamikaze_1930"] = true,
["PJSD026_Camo_Kamikaze"] = true,
["PBSD519_Somme"] = true,
}
}



Latest revision as of 21:47, 7 July 2026

Documentation for this module may be created at Module:ShipList/doc

local p = {}
local voc = require('Module:Vocabulary')

-- Ships excluded from all rendered ship lists (nation pages, class pages,
-- tech-tree footer, and WoWs_ShipsList). Keyed by internal ship code.
local blacklist = {
	
}

function p.render(frame)
    local args = frame.args 
    local list = args.list or ""
    if list == "" then return "" end
    
    local mode = args.mode or "text"
    local filter = args.filter or ""
    local size = args.size or ""
    local g_size = tonumber(args.size) or 235
 
    local doubloons_icon = frame:preprocess('{{Doubloons}}')
    
    local ships = mw.text.split(list, ";")
    local result = {}

    for _, code in ipairs(ships) do
        code = mw.text.trim(code)
        if code ~= "" and not blacklist[code] then
            local is_prem = tonumber(frame:preprocess('{{#invoke:WoWs_GD|get|Прем|' .. code .. '}}'))
            local skip = false
            if filter == "0" and is_prem > 0 then skip = true end
            if filter == "1" and is_prem == 0 then skip = true end
            
            local ship_mark = frame:callParserFunction('#shipchars', code, 'mark')
            local name = frame:callParserFunction('#shipstr', ship_mark)
            if mw.ustring.find(name, "[%<%[]") then skip = true end -- Ignore old ships
            
            if not skip then
                
                local raw_level = frame:callParserFunction('#shipattr', 'level', code)
                
                local level = voc.tier({args = {raw_level}}) 
                local doubloons = (is_prem > 0) and (" " .. doubloons_icon) or ""

                if mode == "icons" then
                    local icon_size = (size ~= "") and size or "214"
                    table.insert(result, '<div class="tleft" style="clear:none;">[[File:Ship_' .. code .. '.png|' .. icon_size .. 'px|link=Ship:' .. name .. ']]<br/><center><span style="color:#AD7A07;"><b>' .. level .. '</b></span>&nbsp;[[Ship:' .. name .. '|' .. name .. ']]' .. doubloons .. '</center></div>')
                
                elseif mode == "gallery" then
                    local thumb_w = g_size - 5
                    local thumb_h = math.floor(thumb_w * 0.625)
                    local class = frame:callParserFunction('#shipattr', 'class', code):lower()
                    table.insert(result, '<li class="gallerybox" style="width: ' .. g_size .. 'px"><div style="width: ' .. g_size .. 'px"><div class="thumb" style="width: ' .. thumb_w .. 'px; height:' .. thumb_h .. 'px;"><div style="margin:13px auto;">[[File:' .. name .. '_wows_main.jpg|' .. thumb_w .. 'px]]</div></div><div class="gallerytext"><center><span class="b-tech-nav_icon b-tech-nav_icon__' .. class .. '"></span><span style="color:#AD7A07;"><b>' .. level .. '</b></span>&nbsp;[[Ship:' .. name .. '|' .. name .. ']]' .. doubloons .. '</center></div></div></li>')

				else -- default / text
                    local bullet = (size ~= "") and size or "•"
                    local prefix = (#result > 0) and (bullet .. "&nbsp;") or ""
                    table.insert(result, '<span>' .. prefix .. '<b>' .. level .. '</b>&nbsp;[[Ship:' .. name .. '|' .. name .. ']]' .. doubloons .. '</span> ')
                end
            end
        end
    end

    local final_output = table.concat(result)
    return (mode == "gallery") and ('<ul class="gallery">' .. final_output .. '</ul>') or final_output
end

function p.render_footer(frame)
    local args = frame.args
    local mode = args.mode or "nation"
    local val = args.value or ""
    if val == "" then return "" end

    local res = {'{| class="t-tech t-tech-ok"'}


    local raw_list = (mode == "nation") 
    	and voc.ship_class({args = {"", "list"}})
    	or voc.nation({args = {"", "list"}})
    local items = mw.text.split(raw_list, ";")
    
    for _, item in ipairs(items) do
        item = mw.text.trim(item)
        if item ~= "" then
            local query = (mode == "nation") 
                and ('nation=' .. val .. ';class=' .. item)
                or ('nation=' .. item .. ';class=' .. val)
            
            local ship_raw = frame:callParserFunction('#shiplist', 'ships', query, 'level')
            
            if ship_raw ~= "" and ship_raw ~= nil then
                local ships = p.render(frame:newChild{args = {
                    list = ship_raw,
                    mode = "text"
                }})
                
				if ships ~= "" and not ships:find("N/A") then
				    local header = (mode == "nation") 
				    	and voc.ship_class({args = {item, "bm"}})
				    	or voc.nation({args = {item, "bi"}})
                    table.insert(res, '|-\n|' .. header .. '\n|' .. ships)
                end
            end
        end
    end
    table.insert(res, '|}')
    return table.concat(res, '\n')
end

function p.renderClassPage(frame)
    local parent_args = frame:getParent().args
    local cur_class = parent_args.class or frame.args.class or ""
    
    -- Получаем список наций через Vocabulary напрямую
    local raw_nations = voc.nation({args = {"", "list"}})
    local nations_list = mw.text.split(raw_nations, ";")
    
    local output = {}
    
    for _, nat in ipairs(nations_list) do
        nat = mw.text.trim(nat)
        if nat ~= "" then
            -- Запрашиваем корабли ОДИН раз
            local ship_list = frame:callParserFunction('#shiplist', 'ships', 'nation=' .. nat .. ';class=' .. cur_class, 'level')
            
            if ship_list ~= "" then
                -- Получаем название нации из Vocabulary напрямую
                local nation_name = voc.nation({args = {nat, "bi"}})
                
                -- Рендерим иконки, вызывая p.render внутри Lua
                local icons = p.render(frame:newChild{args = {
                    list = ship_list,
                    mode = "icons",
                    size = "214"
                }})
                
                table.insert(output, '<div class="wot-frame-1"><h2>' .. nation_name .. '</h2>' .. icons .. '</div>')
            end
        end
    end
    
    return table.concat(output)
end

function p.renderNationPage(frame)
    -- Получаем параметры: либо из вызова, либо из родительского шаблона
    local parent_args = frame:getParent().args
    local cur_nation = parent_args.nation or frame.args.nation or ""
    
    if cur_nation == "" then return "" end

    -- 1. Получаем список всех классов (типов) кораблей через Vocabulary
    local raw_classes = voc.tier({args = {"", "list"}})
    local raw_list = voc.ship_class({args = {"", "list"}})
    local class_list = mw.text.split(raw_list, ";")
    
    local output = {}
    
    for _, class_code in ipairs(class_list) do
        class_code = mw.text.trim(class_code)
        if class_code ~= "" then
            -- 2. Запрашиваем корабли конкретной нации и конкретного класса
            local ship_list = frame:callParserFunction('#shiplist', 'ships', 'nation=' .. cur_nation .. ';class=' .. class_code, 'level')
            
            if ship_list ~= "" then
                -- 3. Получаем заголовок класса (иконка + название)
                local class_header = voc.ship_class({args = {class_code, "bm"}})
                
                -- 4. Рендерим иконки, используя уже готовую функцию p.render
                local icons = p.render(frame:newChild{args = {
                    list = ship_list,
                    mode = "icons",
                    size = "214"
                }})
                
                table.insert(output, '<div class="wot-frame-1"><h2>' .. class_header .. '</h2>' .. icons .. '</div>')
            end
        end
    end
    
    return table.concat(output)
end

return p