-- Documentation for Module:InfoboxBuilder can be found at w:c:dev:Lua templating/Infobox Builder.
local InfoboxBuilder = {}
-- Define dependecies
local HF = require("Module:HF")
local View = require("Module:InfoboxBuilderView")
-- Define var for custom user's module
local CM = {}
-- Define default variables
InfoboxBuilder.vars = {
Theme = "default", -- Adds prefix to CSS classes
CustomModule = " ", -- Defines a path to a module with custom functions
MainImageCaption = "Off", -- Toggles display of Label in the Main Image field
ToggleContentLongerThan = 1000 -- Makes fields with long values collapsible
}
function InfoboxBuilder.builder( frame )
local input = InfoboxBuilder.parse( frame.args )
local Infobox = View.render( input, InfoboxBuilder.vars )
return Infobox
end
function InfoboxBuilder.parse( args )
local input = {}
input.fields = {} -- Actual Infobox data
input.sections = {} -- Relating headers to lines
input.vars = {} -- Variables useful for styling etc.
-- Distribute args to vars and fields.
local indexes = {} -- Table used to sort indexes of fields
local fields = {} -- Temporary fields table
local f = 0 -- Fields consecutive indice
for k, v in pairs(args) do
local keySplit = HF.explode( ":", tostring(k) )
local index = tonumber( HF.trim( keySplit[1] ) )
local key = tostring( HF.trim( keySplit[2] ) )
local value = tostring( HF.trim( v ) )
if index > 0 then
if fields[index] == nil then
table.insert( indexes, index )
fields[index] = {}
end
fields[index][key] = value
else
if not HF.isempty( HF.trim( value ) ) then
InfoboxBuilder.vars[key] = value
end
end
end
input.vars = InfoboxBuilder.vars
table.sort( indexes )
local currentHeader = 0
for i, index in ipairs(indexes) do
f = f + 1
input.fields[f] = {}
input.fields[f] = fields[index]
-- Add fields to sections
if input.fields[f]["Type"] == "Header" then
currentHeader = f
input.sections[f] = "Off" -- Hide header by default, show it when it has at least 1 line
elseif input.fields[f]["Type"] == "Line" and currentHeader > 0 then -- Prevent false sections without a header
if not HF.isempty( input.fields[f]["Value"] ) then
input.sections[currentHeader] = "On" -- Show header if there is at least one line filled in its section
end
end
end
input = InfoboxBuilder.execute( input )
return input
end
function InfoboxBuilder.execute( input )
-- Require user's custom module
if not HF.isempty( HF.trim( InfoboxBuilder.vars["CustomModule"] ) ) then
CM = require( HF.trim( InfoboxBuilder.vars["CustomModule"] ) )
-- Execute custom methods
for index, field in ipairs( input.fields ) do
if InfoboxBuilder.methodExists( field.LabelMethod ) then
input.fields[index].Label = CM[ field.LabelMethod ]( field, InfoboxBuilder.vars )
end
if not HF.isempty( HF.trim( field.Value ) ) and InfoboxBuilder.methodExists( field.ValueMethod ) then
input.fields[index].Value = CM[ field.ValueMethod ]( field, InfoboxBuilder.vars )
end
end
end
return input
end
function InfoboxBuilder.methodExists( name )
local exists = false
if type( name ) ~= nil then
if not HF.isempty( name ) then
if type( CM[ name ] ) == "function" then
exists = true
end
end
end
return exists
end
return InfoboxBuilder