Module:Userbox
From IdleOn MMO Wiki
Documentation for this module may be created at Module:Userbox/doc
local string = require('Module:String/Nano')
local table = require('Module:Table')
local getArgs = require('Module:Arguments').getArgs
local p = {}
local skinDefault = mw.loadData('Module:Userbox/Skins')
function p.create(frame)
local args = getArgs(frame)
local main, id, info = {}, {}, {}
local flavor = args[1] or args['skin']
main.class = args['class']
main.margin = args['margin']
main.style = args['style']
main.float = args['float']
main.border_width = args['border-width']
main.border_color = args['border-color']
main.height = args['height']
id.id = args['id']
id.width = args['id-width']
id.color = args['id-color']
id.background = args['id-background']
id.align = args['id-align']
id.size = args['id-size']
id.padding = args['id-padding']
id.css = args['id-css']
info.info = args['info']
info.color = args['info-color']
info.background = args['info-background']
info.align = args['info-align']
info.size = args['info-size']
info.padding = args['info-padding']
info.css = args['info-css']
return p._create(flavor, main, id, info)
end
function p._create(flavor, main, id, info)
local mainStyle, idStyle, infoStyle = {}, {}, {}
local mainHtml, idHtml, infoHtml
main, id, info = main or {}, id or {}, info or {}
-- Helper functions
local function squash(style)
local ret = {}
for k,v in pairs(style) do
ret[#ret+1] = ('%s: %s;'):format(k,v)
end
return table.concat(ret, '')
end
local function stringify(val)
val = string.trim(val and tostring(val) or '')
return (val ~= '') and val or nil
end
-- Get methods for choosing
local function getGenericValue(val, def)
val = stringify(val)
return val or def
end
local function getColorValue(val, def)
val = stringify(val)
return val and (val:lower() == 'none' and 'transparent' or val) or def
end
local function getNumericValue(val, def)
val = stringify(val)
return val and val:match('^%s*(%d+)') or def
end
-- Default Tables
local sDefault = skinDefault[flavor and flavor:lower()] or skinDefault.modern
local default = skinDefault.modern
local function getDefault(tableKey, attr)
return sDefault[tableKey][attr] or default[tableKey][attr]
end
-- Getter entry point
local function getWithMethod(method, tabl, tableKey, attr)
return method(tabl[attr], getDefault(tableKey, attr))
end
mainStyle["width"] = '330px'
mainStyle["min-height"] = "90px"
mainStyle["margin"] = getWithMethod(getGenericValue, main, 'main', 'margin')
mainStyle["float"] = getWithMethod(getGenericValue, main, 'main', 'float')
mainStyle["border"] = getWithMethod(getNumericValue, main, 'main', 'border_width') .. 'px solid ' .. getWithMethod(getColorValue, main, 'main','border_color')
mainStyle["height"] = getWithMethod(getNumericValue, main, 'main', 'height') .. 'px'
idStyle["width"] = getWithMethod(getNumericValue, id, 'id', 'width') .. 'px'
idStyle["color"] = getWithMethod(getColorValue, id, 'id', 'color')
idStyle["background"] = getWithMethod(getColorValue, id, 'id', 'background')
idStyle["text-align"] = getWithMethod(getGenericValue, id, 'id', 'align')
idStyle["font-size"] = getWithMethod(getNumericValue, id, 'id', 'size') .. 'px'
idStyle["padding"] = getWithMethod(getGenericValue, id, 'id', 'padding')
idStyle["vertical-align"] = 'middle'
infoStyle["color"] = getWithMethod(getColorValue, info, 'info', 'color')
infoStyle["background"] = getWithMethod(getColorValue, info, 'info', 'background')
infoStyle["text-align"] = getWithMethod(getGenericValue, info, 'info', 'align')
infoStyle["font-size"] = getWithMethod(getNumericValue, info, 'info', 'size') .. 'px'
infoStyle["padding"] = getWithMethod(getGenericValue, info, 'info', 'padding')
infoStyle["vertical-align"] = 'middle'
idHtml = string.wrapHtml(id.id or 'id', 'th', { style = squash(idStyle) .. (id.css or ''), class = 'userbox-id' })
infoHtml = string.wrapHtml(info.info or "''info''", 'td', { style = squash(infoStyle) .. (info.css or ''), class = 'userbox-info' })
main.style = squash(mainStyle) .. (main.style or '')
main.class = getGenericValue(main.class, getDefault('main', 'class'))
main.class = main.class and ('article-userbox ' .. main.class) or 'article-userbox'
mainHtml = string.wrapHtml(idHtml..infoHtml, 'table', { cellspacing = "0", class = main.class, style = main.style })
return mainHtml
end
return p