- Welcome to the Kancolle Wiki!
- If you have any questions regarding site content, account registration, etc., please visit the KanColle Wiki Discord
Difference between revisions of "Module:ShipPage"
Jump to navigation
Jump to search
(Add seasonal forms for gallery) |
|||
Line 4: | Line 4: | ||
local BaseData = require("Module:BaseData") | local BaseData = require("Module:BaseData") | ||
local Ship = require("Module:Ship") | local Ship = require("Module:Ship") | ||
+ | local ShipGraphicKai = require('Module:ShipGraphicKai') | ||
-- [[Category:Todo]]: support passing Ship object in those modules, use Ship object, redo and move ship_remodel_forms function | -- [[Category:Todo]]: support passing Ship object in those modules, use Ship object, redo and move ship_remodel_forms function | ||
Line 13: | Line 14: | ||
local reversible_forms = {} | local reversible_forms = {} | ||
− | function ship_remodel_forms(ship_name, ship_suffix, j) | + | function ship_remodel_forms(ship_name, seasonal_forms, ship_suffix, j) |
j = j or 1 | j = j or 1 | ||
ship_suffix = ship_suffix or "" | ship_suffix = ship_suffix or "" | ||
Line 22: | Line 23: | ||
end | end | ||
local form_data = ship_data[ship_suffix] | local form_data = ship_data[ship_suffix] | ||
+ | if seasonal_forms then | ||
+ | for suffix, data in pairs(ship_data) do | ||
+ | if data._seasonal == true and data._name and data._suffix then | ||
+ | table.insert(seasonal_forms, data._name .. "/" .. data._suffix) | ||
+ | end | ||
+ | end | ||
+ | end | ||
local i = 0 | local i = 0 | ||
while form_data and form_data._remodel_to and not Utils.find(forms, form_data._remodel_to) and i < 10 and j <= 3 do | while form_data and form_data._remodel_to and not Utils.find(forms, form_data._remodel_to) and i < 10 and j <= 3 do | ||
local ship_name_next, ship_suffix_next = Ship:process_ship_key(form_data._remodel_to) | local ship_name_next, ship_suffix_next = Ship:process_ship_key(form_data._remodel_to) | ||
if ship_name_next ~= ship_name then | if ship_name_next ~= ship_name then | ||
− | return Utils.concat(forms, ship_remodel_forms(ship_name_next, ship_suffix_next, j + 1)) | + | return Utils.concat(forms, ship_remodel_forms(ship_name_next, seasonal_forms, ship_suffix_next, j + 1)) |
else | else | ||
table.insert(forms, form_data._remodel_to) | table.insert(forms, form_data._remodel_to) | ||
Line 66: | Line 74: | ||
_gallery_tabber = [[{{#tag:tabber| | _gallery_tabber = [[{{#tag:tabber| | ||
− | {{!}}-{{!}}Normal= | + | {{!}}-{{!}}Normal=${image} |
− | {{!}}-{{!}}Damaged= | + | {{!}}-{{!}}Damaged=${image_damaged} |
}}]], | }}]], | ||
Line 167: | Line 175: | ||
-- [[Category:Todo]]: | -- [[Category:Todo]]: | ||
-- Ignore forms with same base and/or damaged CG (requires updating for data modules) | -- Ignore forms with same base and/or damaged CG (requires updating for data modules) | ||
− | + | -- Improve performance by not using frame:preprocess? | |
− | -- Improve performance by not using preprocess | ||
function ShipPage.GalleryTabber(frame, args) | function ShipPage.GalleryTabber(frame, args) | ||
args = args or Utils.getTemplateArgs(frame) | args = args or Utils.getTemplateArgs(frame) | ||
local ship_name = args.explicit.ship or args.implicit.pagename or "" | local ship_name = args.explicit.ship or args.implicit.pagename or "" | ||
− | local forms = ship_remodel_forms(ship_name) | + | local seasonal_forms = {} |
+ | local forms = ship_remodel_forms(ship_name, seasonal_forms) | ||
local result = { "{{#tag:tabber|" } | local result = { "{{#tag:tabber|" } | ||
for _, form in ipairs(forms) do | for _, form in ipairs(forms) do | ||
− | local | + | local image = ShipGraphicKai:Asset({ form, link = "nil", size = "300px" }) |
+ | local image_damaged = ShipGraphicKai:Asset({ form, link = "nil", damaged = true, size = "300px" }) | ||
table.insert(result, suffix == "" and "{{!}}-{{!}}Base=" or ("{{!}}-{{!}}" .. suffix .. "=")) | table.insert(result, suffix == "" and "{{!}}-{{!}}Base=" or ("{{!}}-{{!}}" .. suffix .. "=")) | ||
− | table.insert(result, format{ ShipPage._gallery_tabber, | + | table.insert(result, format{ |
+ | ShipPage._gallery_tabber, | ||
+ | image = image, | ||
+ | image_damaged = image_damaged | ||
+ | }) | ||
+ | end | ||
+ | for _, form in ipairs(seasonal_forms) do | ||
+ | local image = ShipGraphicKai:Asset({ form, link = "nil", size = "300px" }) | ||
+ | local image_damaged = ShipGraphicKai:Asset({ form, link = "nil", damaged = true, size = "300px" }) | ||
+ | table.insert(result, "{{!}}-{{!}}" .. suffix .. "=") | ||
+ | table.insert(result, format{ | ||
+ | ShipPage._gallery_tabber, | ||
+ | image = image, | ||
+ | image_damaged = image_damaged | ||
+ | }) | ||
end | end | ||
table.insert(result, "}}") | table.insert(result, "}}") |
Revision as of 09:42, 15 July 2017
Documentation for this module may be created at Module:ShipPage/doc
local Utils = require("Module:Utils")
local format = require("Module:StringOperations").format
local Formatting = require("Module:Formatting")
local BaseData = require("Module:BaseData")
local Ship = require("Module:Ship")
local ShipGraphicKai = require('Module:ShipGraphicKai')
-- [[Category:Todo]]: support passing Ship object in those modules, use Ship object, redo and move ship_remodel_forms function
local ShipMetaKai = require("Module:ShipMetaKai")
local ShipInfoKai = require("Module:ShipInfoKai")
local ShipCategoriesKai = require("Module:ShipCategoriesKai")
-- can't use Ship:remodel_to_level() normally for some reason
local reversible_forms = {}
function ship_remodel_forms(ship_name, seasonal_forms, ship_suffix, j)
j = j or 1
ship_suffix = ship_suffix or ""
local forms = { ship_name .. "/" .. ship_suffix }
local success, ship_data = Utils.requireModule(ship_name)
if not success then
return forms
end
local form_data = ship_data[ship_suffix]
if seasonal_forms then
for suffix, data in pairs(ship_data) do
if data._seasonal == true and data._name and data._suffix then
table.insert(seasonal_forms, data._name .. "/" .. data._suffix)
end
end
end
local i = 0
while form_data and form_data._remodel_to and not Utils.find(forms, form_data._remodel_to) and i < 10 and j <= 3 do
local ship_name_next, ship_suffix_next = Ship:process_ship_key(form_data._remodel_to)
if ship_name_next ~= ship_name then
return Utils.concat(forms, ship_remodel_forms(ship_name_next, seasonal_forms, ship_suffix_next, j + 1))
else
table.insert(forms, form_data._remodel_to)
form_data = ship_data[ship_suffix_next]
if form_data._remodel_to_level then
reversible_forms[form_data._name .. "/" .. (form_data._suffix or "")] = true
end
end
i = i + 1
end
return forms
end
local ShipPage = {
_header = "${notice}${ship_meta}__TOC__${clear}${ship_infoboxes}${ship_categories}",
_ship_infobox = [[<div style="display:inline-block;">
===${title}===
${infobox}
</div>]],
_ship_infobox_titles = {
"Basic",
"Upgrade",
"Second Upgrade",
"Third Upgrade",
"Fourth Upgrade",
"Fifth Upgrade"
},
_footer_links = [=[*[[${fullpagename}/Gallery|View ${ship_name} CG]]
*[[${ship_code}|List of ${ship_type}s]]${wikipedia}${extra_links}]=],
_wikipedia = [=[*[[wikipedia:${wikipedia}|Wikipedia entry on ${ship_type} ${ship_name}]]]=],
_sandbox_notice = [=[<div style="width:90%; border:2px solid #aa5; background:#ffc; text-align:center; margin:15px auto 20px; padding:5px;">This is a testing ship page, it does not correspond to an actual ship.</div>
]=],
_gallery_tabber = [[{{#tag:tabber|
{{!}}-{{!}}Normal=${image}
{{!}}-{{!}}Damaged=${image_damaged}
}}]],
_footer_sections = [[<div class="ship-page-gallery">
==CG==
${gallery}
</div>
==See Also==
${links}]],
}
function ShipPage:format_ship_meta()
self._vars.ship_meta = ShipMetaKai:Infobox({ self._vars.ship_name })
end
function ShipPage:format_ship_infoboxes(basepagename)
local forms = ship_remodel_forms(self._vars.ship_name)
local infoboxes = {}
for i, form in ipairs(forms) do
local override
if basepagename == "Sandbox" then
override = { _page = "Sandbox/" .. self._vars.ship_name }
end
table.insert(infoboxes, format{
self._ship_infobox,
title = (self._ship_infobox_titles[i] or "?") .. (reversible_forms[form] and " (Reversible)" or ""),
infobox = ShipInfoKai:Infobox({ form, override = override })
})
end
self._vars.ship_infoboxes = table.concat(infoboxes, "\n")
end
function ShipPage:format_ship_categories(basepagename)
self._vars.ship_categories = basepagename == "Sandbox" and "" or ShipCategoriesKai:Categories({ self._vars.ship_name })
end
function ShipPage:format_notice(basepagename)
self._vars.notice = basepagename == "Sandbox" and self._sandbox_notice or ""
end
function ShipPage:format_header(ship_name, basepagename)
self._vars = {
ship_name = ship_name,
clear = Formatting:clear(),
}
self:format_ship_meta()
self:format_ship_infoboxes(basepagename)
self:format_ship_categories(basepagename)
self:format_notice(basepagename)
return format(self._header, self._vars)
end
function ShipPage.Header(frame, args)
args = args or Utils.getTemplateArgs(frame)
local basepagename = args.implicit.basepagename or ""
local ship_name = args.explicit.ship or args.implicit.pagename or ""
return ShipPage:format_header(ship_name, basepagename)
end
function ShipPage.FooterLinks(frame, args)
args = args or Utils.getTemplateArgs(frame)
local basepagename = args.implicit.basepagename or ""
local ship_name = args.explicit.ship or args.implicit.pagename or ""
local ship = Ship(ship_name)
local ship_type = ship:type()
local ship_name_ = ship:name()
local ship_type_ = Formatting:format_ship_type(ship_type)
local wikipedia = ship:wikipedia()
return format{
ShipPage._footer_links,
fullpagename = basepagename == "Sandbox" and ("Sandbox/" .. ship_name) or ship_name,
ship_name = ship_name_,
ship_code = Formatting:format_ship_code(ship_type),
ship_type = ship_type_,
wikipedia = wikipedia and ("\n" .. format{
ShipPage._wikipedia,
ship_name = ship_name_,
ship_type = ship_type_,
wikipedia = wikipedia
}) or "",
extra_links = args.explicit.links and ("\n" .. args.explicit.links) or ""
}
end
function ShipPage.ClassTemplate(frame, args)
args = args or Utils.getTemplateArgs(frame)
local basepagename = args.implicit.basepagename or ""
local ship_name = args.explicit.ship or args.implicit.pagename or ""
local ship = Ship(ship_name)
local class = ship:class() and ship:class():name_override()
if basepagename == "Sandbox" then
return ("Sandbox/" .. class) or "Unknown Class"
else
return class or "Unknown Class"
end
end
-- [[Category:Todo]]:
-- Ignore forms with same base and/or damaged CG (requires updating for data modules)
-- Improve performance by not using frame:preprocess?
function ShipPage.GalleryTabber(frame, args)
args = args or Utils.getTemplateArgs(frame)
local ship_name = args.explicit.ship or args.implicit.pagename or ""
local seasonal_forms = {}
local forms = ship_remodel_forms(ship_name, seasonal_forms)
local result = { "{{#tag:tabber|" }
for _, form in ipairs(forms) do
local image = ShipGraphicKai:Asset({ form, link = "nil", size = "300px" })
local image_damaged = ShipGraphicKai:Asset({ form, link = "nil", damaged = true, size = "300px" })
table.insert(result, suffix == "" and "{{!}}-{{!}}Base=" or ("{{!}}-{{!}}" .. suffix .. "="))
table.insert(result, format{
ShipPage._gallery_tabber,
image = image,
image_damaged = image_damaged
})
end
for _, form in ipairs(seasonal_forms) do
local image = ShipGraphicKai:Asset({ form, link = "nil", size = "300px" })
local image_damaged = ShipGraphicKai:Asset({ form, link = "nil", damaged = true, size = "300px" })
table.insert(result, "{{!}}-{{!}}" .. suffix .. "=")
table.insert(result, format{
ShipPage._gallery_tabber,
image = image,
image_damaged = image_damaged
})
end
table.insert(result, "}}")
return table.concat(result, "\n")
end
function ShipPage.FooterSections(frame, args)
return format{
ShipPage._footer_sections,
gallery = frame:preprocess(ShipPage.GalleryTabber(frame, args)),
links = ShipPage.FooterLinks(frame, args)
}
end
--[[
ShipPage.t1 = ShipPage.Header(nil, {
explicit = { ship = "Ayanami" },
implicit = {},
})
-- print(p.t1)
ShipPage.t2 = ShipPage.Header(nil, {
explicit = { ship = "Hibiki" },
implicit = {},
})
-- print(p.t2)
ShipPage.t3 = ShipPage.Header(nil, {
explicit = { ship = "Zuikaku" },
implicit = {},
})
-- print(p.t3)
ShipPage.t4 = ShipPage.Header(nil, {
explicit = {},
implicit = {},
})
-- print(p.t4)
ShipPage.t5 = ShipPage.FooterLinks(nil, {
explicit = { ship = "Ayanami" },
implicit = {},
})
-- print(p.t5)
ShipPage.t6 = ShipPage.ClassTemplate(nil, {
explicit = { ship = "Matsukaze" },
implicit = {},
})
-- print(p.t6)
]]--
--[[
function ShipPage.test()
function print_forms(ship_name)
for _, v in ipairs(ship_remodel_forms(ship_name)) do
mw.log(v)
end
end
print_forms("Ayanami")
print_forms("Hibiki")
print_forms("Zuikaku")
print_forms("Matsukaze")
print_forms("Bismarck")
print_forms("Taigei")
print_forms("U-511")
print_forms("Kasuga Maru")
print_forms("Gangut")
end
]]--
return ShipPage