Module:Galbox

From Zelda Dungeon Wiki
Revision as of 20:55, August 9, 2020 by Locke (talk | contribs) (remove SS Shields from staging since it was already done)
Jump to navigation Jump to search
Want an adless experience? Log in or Create an account.

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

local Args = require( 'Module:Args' )
local Gallery = require( 'Module:Gallery' ).Gallery
local Listing = require( 'Module:Listing' )
local Tabs = require( 'Module:Tabs' ).Tabs

-- https://www.mediawiki.org/wiki/Help:Images#Syntax
-- doesn't handle 'upright' which seems like a complicated and buggy arg that I hope we're not using
local fileArgKeywords = { 'border', 'frameless', 'frame', 'thumb', 'thumbnail', 'left', 'right', 'center', 'none', 'baseline', 'sub', 'super', 'top', 'text-top', 'middle', 'bottom', 'text-bottom' }
function isCaption( fileArg )
  fileArg = mw.text.trim( fileArg )
  -- named args
  if fileArg:match( '=' ) then return false end
  -- size
  if fileArg:match( '^%d*x?%d+%s?px$' ) then return false end
  -- format and alignment
  for _, keyword in ipairs( fileArgKeywords ) do
    if fileArg == keyword then return false end
  end
  return true
end

function buildGallery( sections )
  local gallery = Gallery.new{
    widths = '62px',
    heights = '62px'
  }
  for _, section in ipairs( sections ) do
    -- !!!! This may break if Template:Main is modified !!!!
    local expandedMainTemplate = section.summary:match( 'Main article: %[%[(.-)]]' )
    local link = expandedMainTemplate and mw.text.split( expandedMainTemplate, '|' )[1]
    if not section.summary:find( '%[%[File:(.-)]]' ) then
      gallery:addFile( 'No Image.png', '[[' .. (link or section.name) .. '|' .. section.name .. ']]', {
        link = section.name,
        alt = section.name
      } )
    end
    for file in section.summary:gmatch( '%[%[File:(.-)]]' ) do
      local fileParts = mw.text.split( file, '|' )
      local fileName = fileParts[1]
      local fileCaption = nil
      for i = #fileParts, 2, -1 do -- start at the end and work backwards to the first arg (skip filename)
        if isCaption( fileParts[i] ) then
          fileCaption = fileParts[i]
          break
        end
      end
      gallery:addFile( fileName or 'No Image.png', '[[' .. (link or section.name) .. '|' .. (fileCaption or section.name) .. ']]', {
        link = section.name,
        alt = fileCaption or section.name
      } )
    end
  end

  return gallery:render()
end

local Navbox = Listing.Navbox

local Galbox = setmetatable( {}, Navbox )
Galbox.__index = Galbox

function Galbox.new( args )
  local obj = Navbox.new( args )
  return setmetatable( obj, Galbox )
end

-- override
function Galbox:renderContent()
  local listing = Listing._parseListing( ((self.categories[1] == 'The Wind Waker' and self.categories[3] == 'Enemies') or (self.categories[1] == 'Skyward Sword' and self.categories[3] ~= 'Shields') or (self.categories[1] == 'A Link Between Worlds' and self.categories[3] ~= 'Items') or self.categories[1] == 'Four Swords Adventures' or self.categories[1] == 'Tri Force Heroes' or self.categories[1] == 'Hyrule Warriors') and self.subject .. '/Staging' or self.subject )

  -- test if there are no sections at all
  if not #listing.sections then return '' end

  -- build default gallery for top-level items
  local defaultGallery
  if #listing.topLevelLeaves > 0 then
    defaultGallery = buildGallery( listing.topLevelLeaves )
  end

  -- build tabs for nested items
  if #listing.groups > 0 then
    local tabs = Tabs.new()

    -- add a tab for the default gallery
    if defaultGallery then
      tabs:addTabTopWithContent{
        contentId = 'General',
        content = defaultGallery
      }
    end

    for index, group in ipairs( listing.groups ) do
      tabs:addTabTopWithContent{
        contentId = group.name,
        content = buildGallery( group.sections )
      }
    end

    return tabs:render()
  end -- if #listing.groups > 0

  return defaultGallery
end -- function Galbox:renderContent()

local p = {}

function p.main( frame )
  local galbox = Galbox.new( Args.fromFrame( frame ) )
  return galbox:render()
end

-- for use in the debug console:
-- =p.main(p.debugframe)
p.debugframe = {
  args = {},
  getParent = function() return {
    args = {
      [1] = "The Legend of Zelda",
      [2] = "Characters",
    }
  } end
}

return p