Jump to content

Module:ItemCategoryTable

From Apogea Wiki
Revision as of 02:39, 28 January 2026 by Dane (talk | contribs) (Fix query syntax - use LIKE instead of HOLDS (via update-page on MediaWiki MCP Server))

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

local p = {}

-- Query items by type from Cargo
local function getItemsByType(itemType)
    local tables = 'Items'
    local fields = 'name,sprite,type,weight,damage,armor,defense,health,mana,rng,description,rarity'
    local args = {
        where = 'type LIKE "%' .. itemType .. '%"',
        orderBy = 'name',
        limit = 500
    }
    
    return mw.ext.cargo.query(tables, fields, args)
end

-- Get the singular type name from a plural category name
local function singularize(plural)
    local mapping = {
        ["Rings"] = "Ring",
        ["Necklaces"] = "Necklace",
        ["Staves"] = "Staff",
        ["Knives"] = "Knife",
        ["Axes"] = "Axe",
        ["Large Axes"] = "Large Axe",
        ["Swords"] = "Sword",
        ["Large Swords"] = "Large Sword",
        ["Regular Swords"] = "Regular Sword",
        ["Daggers"] = "Dagger",
        ["Bows"] = "Bow",
        ["Orbs"] = "Orb",
        ["Small Shields"] = "Small Shield",
        ["Large Shields"] = "Large Shield",
        ["Gloves"] = "Gloves",
        ["Containers"] = "Container",
        ["Tools"] = "Tools",
        ["Heavy Helmets"] = "Heavy Helmet",
        ["Light Helmets"] = "Light Helmet",
        ["Light Masks"] = "Light Mask",
        ["Heavy Boots"] = "Heavy Boots",
        ["Light Boots"] = "Light Boots",
        ["Heavy Legs"] = "Heavy Legs",
        ["Light Legs"] = "Light Legs",
        ["Heavy Chest Armor"] = "Heavy Chest",
        ["Light Chest Armor"] = "Light Chest",
        ["Light Neck Armor"] = "Light Neck",
        ["Potions"] = "Potions",
        ["Drinks"] = "Drinks",
        ["Arrows"] = "Arrows",
        ["Conjured Arrows"] = "Conjured Arrows",
        ["Books"] = "Book",
        ["Cooked Food"] = "Cooked Food",
        ["Edible Food"] = "Edible Food",
        ["Raw Food"] = "Raw Food",
        ["Special Food"] = "Special Food",
        ["Light Sources"] = "Light Sources",
        ["Flowers"] = "Flowers",
        ["Currency"] = "Currency",
        ["Book Products"] = "Book Products",
        ["Cloth Products"] = "Cloth Products",
        ["Cooking Items"] = "Cooking Items",
        ["Desert Products"] = "Desert Products",
        ["Forge Products"] = "Forge Products",
        ["Grave Products"] = "Grave Products",
        ["Holy Products"] = "Holy Products",
        ["Monster Products"] = "Monster Products",
        ["North Products"] = "North Products",
        ["Plains Products"] = "Plains Products",
        ["Swamp Products"] = "Swamp Products",
    }
    return mapping[plural] or plural:gsub("s$", "")
end

function p.render(frame)
    local args = frame:getParent().args
    local categoryName = args[1] or args.category or mw.title.getCurrentTitle().text:gsub("^Category:", "")
    local itemType = singularize(categoryName)
    
    local items = getItemsByType(itemType)
    
    if not items or #items == 0 then
        return '<p class="mw-empty">No items found for type: ' .. itemType .. '</p>'
    end
    
    -- Build sortable table
    local tbl = mw.html.create('table')
    tbl:addClass('wikitable')
       :addClass('sortable')
       :css('width', '100%')
    
    -- Header row
    local header = tbl:tag('tr')
    header:tag('th'):wikitext('Item')
    header:tag('th'):wikitext('Weight')
    header:tag('th'):wikitext('Description')
    
    -- Data rows
    for _, item in ipairs(items) do
        local row = tbl:tag('tr')
        
        -- Item name with sprite
        local nameCell = row:tag('td')
        local sprite = item.sprite or item.name
        nameCell:wikitext(frame:preprocess('{{Sprite|' .. sprite .. '|x2}}'))
        nameCell:wikitext(' [[' .. item.name .. ']]')
        
        -- Weight
        row:tag('td')
           :css('text-align', 'right')
           :wikitext(item.weight or '')
        
        -- Description
        row:tag('td'):wikitext(item.description or '')
    end
    
    return tostring(tbl)
end

return p