Jump to content

Module:NavboxGenerator

From Deadlock Wiki

Not finished.

Overview[edit source]

Create's a navbox from a json file for input where keys are a title div container, and value "Display" is the display text. Each title div container gets smaller and smaller the further it is in the json.

Parameters[edit source]

Within each level of the json:

  • <key> - Title to display in the div/container/box. Can wrap it in <span style="mystyle">key</span> for styling it.
  • Style - Style for the div
  • Display - Text to display below the div
  • <Any other value> - Recursively calls for the contained layer, with <Any other value> as the new <key>

Examples[edit source]

For understanding the input syntax, it is recommended to view the Simple Example first.

Simple Example[edit source]

The input can be seen at Data:ItemNavboxSample.json

{{#invoke:NavboxGenerator|createNavbox|Data:ItemNavboxSample.json}}

Outputs

Lua error: bad argument #1 to 'mw.loadJsonData' ('Data:ItemNavboxSample.json' is not a valid JSON page).

Styled Example[edit source]

The input can be seen at Data:ItemNavbox.json

{{#invoke:NavboxGenerator|createNavbox|Data:ItemNavbox.json}}

Outputs

Lua error: bad argument #1 to 'mw.loadJsonData' ('Data:ItemNavbox.json' is not a valid JSON page).


Needed changes[edit source]

1. Style/Formatting made prettier 2. A way to have the json iterated in order; for some reason mw.loadJsonData doesn't load the keys in order they appear.


This is not used on any pages currently.


local p = {}

local function generateNavbox(data, level)
    local result = {}
    local boxSizePercent = 100 - (level-1)*15  -- 15% less per level, 100%, 85%, 70%, 55%, etc.
    local fontSize = 170 - (level * 15)  -- Adjust font size reduction per level
    
    for key, value in pairs(data) do
        if key == "Style" then
            -- Skip "Style" as it's just an attribute holder
        elseif key == "Display" then
            -- Leaf node, render Display content
            table.insert(result, string.format(
                '<div style="text-align: center; font-size:%d%%;">%s</div>',
                fontSize, value
            ))
        elseif type(value) == "table" then
            -- Nested node, render title with optional Style and recurse
            table.insert(result, string.format(
                '<div style="width: %s%%; margin-left: auto; margin-right: auto; text-align: center; font-size:%d%%; border:1px solid #aaa; %s">%s</div>',
                boxSizePercent, fontSize, value.Style or "", key
            ))
            table.insert(result, generateNavbox(value, level + 1))  -- Recursively process next level
        end
    end
    
    return mw.getCurrentFrame():preprocess(table.concat(result, "\n"))
end

function p.createNavbox(frame)
	local dataPageName = frame.args[1]
	if dataPageName == nil then return "dataPageName parameter missing" end
    local jsonData = mw.loadJsonData(dataPageName)
    return generateNavbox(jsonData, 1)
end

return p