Jump to content
Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

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

local p = {}

function p.creatureCategories(frame)
    local name = frame.args[1] or ""
    if name:find("HP") then
        return "[[Category:Creatures by HP]]"
    elseif name:find("MP") then
        return "[[Category:Creatures by MP]]"
    elseif name:find("BR") then
        return "[[Category:Creatures by BR]]"
    elseif name:find("hit die") then
        return "[[Category:Creatures by hit dice]]"
    elseif name:find("mana die") then
        return "[[Category:Creatures by mana dice]]"
    elseif name:find("Size") then
        return "[[Category:Creatures by size]]"
    elseif name:find("INT") then
        return "[[Category:Creatures by INT]]"
    elseif name:find("STR") then
        return "[[Category:Creatures by STR]]"
    elseif name:find("SNK") then
        return "[[Category:Creatures by SNK]]"
    elseif name:find("MOV") then
        return "[[Category:Creatures by MOV]]"
    elseif name:find("PER") then
        return "[[Category:Creatures by PER]]"
    elseif name:find("lifespan") then
        return "[[Category:Creatures by lifespan]]"
    else
        return ""
    end
end

function p.generateCategories(frame)
    local baseCategory = frame.args[1] or ""

    if baseCategory == "" then
        return "Error: No base category provided."
    end

    -- Determine the type based on the base category name
    local type = baseCategory:match("spells") or baseCategory:match("skills")
    if not type then
        -- If it's not spells or skills, check if it's an abilities page
        if baseCategory:match("abilities$") then
            -- Extract the last two words of the base category name
            local words = {}
            for word in baseCategory:gmatch("%w+") do
                table.insert(words, word)
            end

            if #words >= 2 then
                local lastTwoWords = words[#words - 1] .. " " .. words[#words]
                local firstWordCapitalized = lastTwoWords:gsub("^(%w)", string.upper)
                local relatedCategory = "Category:" .. firstWordCapitalized

                -- Check if the related category exists
                local relatedPage = mw.title.new(relatedCategory)
                if relatedPage and relatedPage.exists then
                    return "[[" .. relatedCategory .. "]]"
                end
            end

            return "Warning: Unable to determine related category or it doesn't exist."
        else
            return "Error: Unable to determine type ('spells', 'skills', or 'abilities') from category name."
        end
    end

    -- Determine the parent category by replacing the detected type with "abilities"
    local parentCategory = "Category:" .. baseCategory:gsub(type, "abilities")

    -- Attempt to retrieve and expand the content of the parent category
    local parentPage = mw.title.new(parentCategory)
    if not parentPage then
        return "Error: Unable to access the parent category page object: " .. parentCategory
    end

    local rawParentContent = parentPage:getContent()
    if not rawParentContent then
        return "Error: Unable to retrieve the content of the parent category: " .. parentCategory
    end
    
    -- local tweakedParentContent = rawParentContent:gsub("{{CatType}}", "{{CatType2}}")

    -- Expand any templates in the parent category's content
    local expandedParentContent = frame:preprocess(rawParentContent)

    -- Replace every instance of "abilities]]" with the detected type (e.g., "spells]]" or "skills]]")
    local updatedContent = expandedParentContent:gsub("Abilities%]%]", type:gsub("spells", "Spells"):gsub("skills", "Skills") .. "]]")
    updatedContent = updatedContent:gsub("abilities%]%]", type .. "]]")

    -- Return the updated content along with the parent category
    return "[[" .. parentCategory .. "]]\n" .. updatedContent
end

return p