Module:NavboxGenerator: Difference between revisions

From Deadlock Wiki
Jump to navigation Jump to search
Sur (talk | contribs)
m use new format that allows specifying style and other attributes separately
Sur (talk | contribs)
m center titel and display by default
Line 12: Line 12:
             -- Leaf node, render Display content
             -- Leaf node, render Display content
             table.insert(result, string.format(
             table.insert(result, string.format(
                 '<div style="font-size:%d%%; padding-left:%dpx; %s">%s</div>',
                 '<div style="text-align: center; font-size:%d%%; %s">%s</div>',
                 fontSize, level * 10, data.Style or "", value
                 fontSize, data.Style or "", value
             ))
             ))
         elseif type(value) == "table" then
         elseif type(value) == "table" then
             -- Nested node, render title with optional Style and recurse
             -- Nested node, render title with optional Style and recurse
             table.insert(result, string.format(
             table.insert(result, string.format(
                 '<div style="font-size:%d%%; border:1px solid #aaa; padding:5px; margin:2px; %s">%s</div>',
                 '<div style="text-align: center; font-size:%d%%; border:1px solid #aaa; padding:5px; margin:2px; %s">%s</div>',
                 fontSize, value.Style or "", key
                 fontSize, value.Style or "", key
             ))
             ))

Revision as of 20:01, 25 October 2024

Not finished.

Overview

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

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

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

Simple Example

The input can be seen at Data:ItemNavboxSample.json

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

Outputs

Items
Vitality
500
{{#invoke:ItemData/nav|get_item_nav_cards|Armor|500|1250}}
1250
{{#invoke:ItemData/nav|get_item_nav_cards|Armor|1250|3000}}
Weapon
500
{{#invoke:ItemData/nav|get_item_nav_cards|Weapon|500|1250}}
1250
{{#invoke:ItemData/nav|get_item_nav_cards|Weapon|1250|3000}}

Styled Example

The input can be seen at Data:ItemNavbox.json

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

Outputs

Items
Vitality
{{Souls|1250|Shadow=text-shadow: 1px 1px rgba(0, 0, 0, 0.3);}}
{{#invoke:ItemData/nav|get_item_nav_cards|Armor|1250|3000}}
{{Souls|500|Shadow=text-shadow: 1px 1px rgba(0, 0, 0, 0.3);}}
{{#invoke:ItemData/nav|get_item_nav_cards|Armor|500|1250}}
Weapon
{{Souls|1250|Shadow=text-shadow: 1px 1px rgba(0, 0, 0, 0.3);}}
{{#invoke:ItemData/nav|get_item_nav_cards|Weapon|1250|3000}}
{{Souls|500|Shadow=text-shadow: 1px 1px rgba(0, 0, 0, 0.3);}}
{{#invoke:ItemData/nav|get_item_nav_cards|Weapon|500|1250}}


Needed changes

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 boxSize = 5 - level  -- Adjust box size reduction per level
    local fontSize = 150 - (level * 20)  -- 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">%s</div>',
                fontSize, data.Style or "", value
            ))
        elseif type(value) == "table" then
            -- Nested node, render title with optional Style and recurse
            table.insert(result, string.format(
                '<div style="text-align: center; font-size:%d%%; border:1px solid #aaa; padding:5px; margin:2px; %s">%s</div>',
                fontSize, value.Style or "", key
            ))
            table.insert(result, generateNavbox(value, level + 1))  -- Recursively process next level
        end
    end
    
    return 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