Fandom

Kirkburn Wiki

Module:InfoboxBuilder

729pages on
this wiki
Add New Page
Talk0
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                   = " ",
  CustomModule            = " ",
  MainImageCaption        = "Off",
  ToggleContentLongerThan = 1000
}
 
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
      input.vars[key] = value
    end
 
  end
 
  InfoboxBuilder.vars = input.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( 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

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.