Module:CraftingJSON: Difference between revisions

From JCraft Wiki
Jump to navigation Jump to search
No edit summary
No edit summary
Line 1: Line 1:
local p = {}
local p = {}


local function formatItemName(rawName)
local function getFileName(rawName)
    if not rawName then return "" end
    return rawName:gsub("^[^:]+:", "")
end
 
local function getDisplayName(rawName)
     if not rawName then return "" end
     if not rawName then return "" end
     local name = rawName:gsub("^[^:]+:", "")
     local name = rawName:gsub("^[^:]+:", "")
Line 41: Line 46:
              
              
             if char ~= " " and data.key and data.key[char] then
             if char ~= " " and data.key and data.key[char] then
                 local itemName = formatItemName(data.key[char].item)
                 local rawItem = data.key[char].item
                 -- Outputs a clean standard wiki image, bypassing the slot module
                local fileName = getFileName(rawItem)
                 cell:wikitext(string.format('[[File:%s.png|32px|link=%s|%s]]', itemName, itemName, itemName))
                local displayName = getDisplayName(rawItem)
                  
                 cell:wikitext(string.format('[[File:%s.png|32px|link=%s|%s]]', fileName, displayName, displayName))
             end
             end
         end
         end
Line 52: Line 59:
     local resultCell = container:tag('div'):addClass('mc-result')
     local resultCell = container:tag('div'):addClass('mc-result')
     if data.result and data.result.item then
     if data.result and data.result.item then
         local resultName = formatItemName(data.result.item)
         local rawResult = data.result.item
        local fileName = getFileName(rawResult)
        local displayName = getDisplayName(rawResult)
         local resultAmount = data.result.count or 1
         local resultAmount = data.result.count or 1
          
          
         local resultImg = string.format('[[File:%s.png|32px|link=%s|%s]]', resultName, resultName, resultName)
         local resultImg = string.format('[[File:%s.png|32px|link=%s|%s]]', fileName, displayName, displayName)
          
          
         if resultAmount > 1 then
         if resultAmount > 1 then
            -- Adds the item count number in the bottom right corner if it yields more than 1
             resultCell:css('position', 'relative')
             resultCell:css('position', 'relative')
             resultCell:wikitext(resultImg .. string.format('<span style="position:absolute; bottom:2px; right:4px; font-weight:bold; color:white; text-shadow:2px 2px 0 #373737;">%s</span>', resultAmount))
             resultCell:wikitext(resultImg .. string.format('<span style="position:absolute; bottom:2px; right:4px; font-weight:bold; color:white; text-shadow:2px 2px 0 #373737;">%s</span>', resultAmount))

Revision as of 12:29, 27 April 2026

Documentation for this module may be created at Module:CraftingJSON/doc

local p = {}

local function getFileName(rawName)
    if not rawName then return "" end
    return rawName:gsub("^[^:]+:", "")
end

local function getDisplayName(rawName)
    if not rawName then return "" end
    local name = rawName:gsub("^[^:]+:", "")
    name = name:gsub("_", " ")
    name = name:gsub("(%a)([%w_']*)", function(first, rest) 
        return first:upper() .. rest:lower() 
    end)
    return name
end

function p.render(frame)
    local args = frame:getParent().args
    local jsonStr = args[1]
    
    if not jsonStr or mw.text.trim(jsonStr) == "" then
        return "Error: No JSON provided."
    end

    local success, data = pcall(mw.text.jsonDecode, mw.text.trim(jsonStr))
    
    if not success then 
        return "Error: Invalid JSON syntax. Please check for trailing commas or missing quotes."
    end
    
    if not data.pattern then 
        return "Error: Missing JSON pattern." 
    end

    local container = mw.html.create('div'):addClass('mc-crafting-wrapper')
    local grid = container:tag('div'):addClass('mc-grid')

    for r = 1, 3 do
        local rowStr = data.pattern[r] or "   "
        rowStr = rowStr .. string.rep(" ", 3 - #rowStr)
        
        for c = 1, 3 do
            local char = rowStr:sub(c, c)
            local cell = grid:tag('div'):addClass('mc-cell')
            
            if char ~= " " and data.key and data.key[char] then
                local rawItem = data.key[char].item
                local fileName = getFileName(rawItem)
                local displayName = getDisplayName(rawItem)
                
                cell:wikitext(string.format('[[File:%s.png|32px|link=%s|%s]]', fileName, displayName, displayName))
            end
        end
    end

    container:tag('div'):addClass('mc-arrow'):wikitext('→')
    
    local resultCell = container:tag('div'):addClass('mc-result')
    if data.result and data.result.item then
        local rawResult = data.result.item
        local fileName = getFileName(rawResult)
        local displayName = getDisplayName(rawResult)
        local resultAmount = data.result.count or 1
        
        local resultImg = string.format('[[File:%s.png|32px|link=%s|%s]]', fileName, displayName, displayName)
        
        if resultAmount > 1 then
            resultCell:css('position', 'relative')
            resultCell:wikitext(resultImg .. string.format('<span style="position:absolute; bottom:2px; right:4px; font-weight:bold; color:white; text-shadow:2px 2px 0 #373737;">%s</span>', resultAmount))
        else
            resultCell:wikitext(resultImg)
        end
    end

    return tostring(container)
end

return p