Module:Redirect template printability

-- Module:Redirect template printability
-- Centralized logic for deciding redirect printability categories
-- Intended to prevent contradictory categorization (e.g., printworthy + unprintworthy)

local p = {}

-- Helper: normalize input
local function normalize(val)
    if not val then return nil end
    val = mw.text.trim(val):lower()
    if val == 'yes' or val == 'true' or val == '1' then
        return true
    elseif val == 'no' or val == 'false' or val == '0' then
        return false
    else
        return val -- pass raw values like "printworthy" or "unprintworthy"
    end
end

-- Main function
-- Usage example:
-- {{#invoke:Redirect template printability|categorize|default=printworthy}}
-- {{#invoke:Redirect template printability|categorize|default=unprintworthy}}
function p.categorize(frame)
    local args = frame:getParent().args
    local default = normalize(args.default) or 'printworthy'

    -- Flags can be set by other rcats
    local flags = {
        printworthy = false,
        unprintworthy = false
    }

    -- Scan args for overrides
    for k,v in pairs(args) do
        v = normalize(v)
        if v == 'printworthy' then
            flags.printworthy = true
        elseif v == 'unprintworthy' then
            flags.unprintworthy = true
        elseif k == 'printworthy' and v == true then
            flags.printworthy = true
        elseif k == 'unprintworthy' and v == true then
            flags.unprintworthy = true
        end
    end

    -- Apply precedence
    if flags.unprintworthy then
        return '[[Category:Unprintworthy redirects]]'
    elseif flags.printworthy then
        return '[[Category:Printworthy redirects]]'
    elseif default == 'unprintworthy' then
        return '[[Category:Unprintworthy redirects]]'
    else
        return '[[Category:Printworthy redirects]]'
    end
end

return p