Modul:Vorlage:Standardfarbe
Die Dokumentation für dieses Modul kann unter Modul:Vorlage:Standardfarbe/Doku erstellt werden
-- module table
local Standardfarbe = {
config = {
colorJSON = "Vorlage:Standardfarbe/colors.json",
errorOutput = "<span class=\"error\">Fehler in [[Vorlage:Standardfarbe]]: %s</span>"
},
colors = { },
serial = ""
}
Standardfarbe.formatError = function ( message )
-- format error message
-- parameters:
-- message: (string) raw error message
-- returns:
-- (string) formatted error message
return string.format( Standardfarbe.config.errorOutput, message )
end
Standardfarbe.iterateColorGroup = function ( group, key )
-- return color value
-- parameters:
-- group: (table) color group
-- key: (string) key to find
-- returns:
-- (bool, table) color block found, color block table
for _, block in ipairs( group ) do
for _, k in ipairs( block.keys ) do
if k == key then
return true, block.colors
end
end
end
return false, {}
end
Standardfarbe.loadColorsJson = function ( page )
-- load colors from json page
-- parameters:
-- page: (string) path to color json page
-- returns:
-- (bool) true or false by success/fault
local success, c = pcall( mw.loadJsonData, page )
if type( c ) == "table" then
Standardfarbe.colors = c
end
return success
end
Standardfarbe.getColor = function ( group, key, mode, ucase )
-- return color value
-- parameters:
-- group: (string) color group
-- key: (string) color key
-- mode: (string) display mode
-- ucase: (bool) uppercase color codes
-- returns:
-- (string) hex color code
local blockColors -- colors in block
local groupColors -- colors in group
local found -- color block found
local color -- color value
-- load defined colors
if Standardfarbe.loadColorsJson( Standardfarbe.config.colorJSON ) == false then
return ""
end
-- find color group
groupColors = Standardfarbe.colors[group]
if type( groupColors ) ~= "table" then
return Standardfarbe.formatError( "color group not found" )
end
-- find color block with key
found, blockColors = Standardfarbe.iterateColorGroup( groupColors, key )
if found == false then
return Standardfarbe.formatError( "color key not found" )
end
-- find color in block
if mode == "" then
mode = "light"
end
color = blockColors[mode]
if color == nil then
color = blockColors["light"]
if color == nil then
return Standardfarbe.formatError( "no matching color mode" )
end
end
-- uppercase, if wanted
if ucase then
color = string.upper( color )
end
-- return color value
return color
end
-- export table
local p = { }
p.outputDefinedColors = function ( frame )
-- return wikitable with defined colors
-- parameters:
-- frame: (table) wiki environment frame
-- returns:
-- (string) wikitable code
local wtbmain -- main wikitable
local wtbhead -- wikitable head
local wtbrow -- color row
local wtbcol -- color cell
local keys -- color keys
local count -- color count
-- load defined colors
if Standardfarbe.loadColorsJson( Standardfarbe.config.colorJSON ) == false then
return ""
end
-- create wikitable
wtbmain = mw.html.create( "table" ):addClass( "wikitable" )
-- create headline
wtbhead = mw.html.create( "tr" )
:node( mw.html.create( "th" ):wikitext( "Gruppe" ):attr( "rowspan", 2 ) )
:node( mw.html.create( "th" ):wikitext( "Schlüssel" ):attr( "rowspan", 2 ) )
:node( mw.html.create( "th" ):wikitext( "Farbe/Modus" ):attr( "colspan", 4 ) )
wtbmain:node( wtbhead )
wtbhead = mw.html.create( "tr" )
:node( mw.html.create( "th" ):wikitext( "Hell" ):attr( "colspan", 2 ) )
:node( mw.html.create( "th" ):wikitext( "Dunkel" ):attr( "colspan", 2 ) )
wtbmain:node( wtbhead )
-- create lines for colors in groups
for group, groupColors in pairs( Standardfarbe.colors ) do
count = 0
for _, _ in ipairs( groupColors ) do
count = count + 1
end
for i, color in ipairs( groupColors ) do
wtbrow = mw.html.create( "tr" )
-- create first cell that has the group name
if i == 1 then
wtbrow:node( mw.html.create( "td" ):attr( "rowspan", count ):wikitext( group ) )
end
-- color keys
keys = ""
for _, key in ipairs( color.keys ) do
code = mw.html.create( "code" ):wikitext( key )
keys = keys .. tostring( code ) .. " "
end
wtbrow:node( mw.html.create( "td" ):wikitext( keys ) )
-- colors
wtbcol = mw.html.create( "td" ):wikitext( "#" .. color.colors["light"] )
if color.colors["dark"] == nil then
wtbcol:attr( "colspan", 3 )
wtbcol:css( "text-align", "center" )
end
wtbrow:node( wtbcol )
wtbrow:node( mw.html.create( "td" ):css( "background-color", "#" .. color.colors["light"] ):wikitext(" ") )
if color.colors["dark"] ~= nil then
wtbrow:node( mw.html.create( "td" ):wikitext( "#" .. color.colors["dark"] ) )
wtbrow:node( mw.html.create( "td" ):css( "background-color", "#" .. color.colors["dark"] ):wikitext(" ") )
end
-- add current row to table
wtbmain:node( wtbrow )
end
end
-- return wikitable
return tostring( wtbmain )
end
p.f = function ( frame )
-- return color value, access from templates
-- parameters:
-- frame: (table) wiki environment frame
-- returns:
-- (string) hex color code
local args -- arguments of template call
local group -- color group
local key -- color key
local mode -- display mode
local ucase -- uppercase color values
local nowiki -- enclose in nowiki tags
-- get template parameters
args = frame:getParent().args
group = args[1] or ""
key = args[2] or ""
mode = args["mode"] or "light"
ucase = ( args["ucase"] == "1" )
nowiki = ( args["nowiki"] == "1" )
-- call main and return
local success, r = pcall( Standardfarbe.getColor, group, key, mode, ucase )
if not success then
return Standardfarbe.formatError( "color call failed" )
end
-- apply nowiki
if nowiki then
r = frame:extensionTag( "nowiki", r )
end
-- return
return r
end
setmetatable( p, { __call = function ( func, ... )
setmetatable( p, nil )
return Failsafe
end } )
return p