Przejdź do zawartości

Moduł:Build bracket/Config

Z Wikipedii, wolnej encyklopedii
 Dokumentacja modułu[stwórz] • [odśwież]
local Config = {}

-- ====================================
-- 1) INIT & DEFENSIVE ACCESSORS
-- ====================================
function Config.init(frame, state, config, Helpers)
    -- Defend against nil inputs; don't mutate caller refs
    state   = state   or {}
    config  = config  or {}
    Helpers = Helpers or {}

    -- Pull args from frame/parent (both optional)
    local fargs  = (frame and frame.args) or {}
    local parent = (frame and frame.getParent and frame:getParent()) or nil
    local pargs  = (parent and parent.args) or {}

    -- Keep originals for debugging
    config._fargs, config._pargs = fargs, pargs

    -- Install arg accessors (use provided installer if present)
    if Helpers.installArgAccessors then
        Helpers.installArgAccessors(fargs, pargs)
    else
        Helpers.getFArg = function(k) return fargs[k] end
        Helpers.getPArg = function(k) return pargs[k] end
        Helpers.bargs   = function(k)
            local v = pargs[k]
            if v == nil or v == "" then v = fargs[k] end
            return v
        end
    end

    -- Short aliases
    local bargs   = Helpers.bargs
    local getFArg = Helpers.getFArg
    local getPArg = Helpers.getPArg

    -- ====================================
    -- 2) YES/NO FALLBACKS (robust parsing)
    -- ====================================
    local function yesish(s)
        s = (s or ""):lower()
        return s == "y" or s == "yes" or s == "true" or s == "1"
    end
    local function noish(s)
        s = (s or ""):lower()
        return s == "n" or s == "no" or s == "false" or s == "0"
    end

    -- Prefer Helpers.yes/no if provided; fall back to yesish/noish
    local YES = Helpers.yes or yesish
    local NO  = Helpers.no  or noish

    -- ====================================
    -- 3) CORE DIMENSIONS & CLAMPING
    -- ====================================
    -- Rows: keep '' sentinel when user didn’t set |rows=|
    config.r = tonumber(getFArg("rows")) or ""

    -- Rounds: {{#invoke:..|rounds=}} with optional parent override maxround(s)
    local rounds_f = tonumber(getFArg("rounds")) or 1
    local maxc     = tonumber(getPArg("maxrounds")) or tonumber(getPArg("maxround")) or nil

    config.c = (type(maxc) == "number") and maxc or rounds_f

    -- minround -> base (clamped)
    local minr = tonumber(getPArg("minround")) or 1
    if minr < 1 then minr = 1 end
    if minr > config.c then minr = config.c end
    config.minc   = minr
    config.base   = minr - 1
    config.c_total = config.c  -- persist original visible round count

    -- ====================================
    -- 4) LAYOUT/STYLE FLAGS
    -- ====================================
    config.autocol    = YES(getFArg("autocol"))
    config.colspacing = tonumber(getFArg("col-spacing")) or 6
    config.height     = bargs("height")

    -- nowrap can be supplied in parent or direct call
    local nowrapArg = getPArg("nowrap") or getFArg("nowrap")
    config.nowrap = not NO(nowrapArg)

    -- ====================================
    -- 5) BOLDWINNER MODE/POLICY
    -- ====================================
    local bw = (bargs("boldwinner") or ""):lower()
    config.boldwinner           = bw
    config.boldwinner_mode      = "off"   -- 'high' | 'low' | 'off'
    config.boldwinner_aggonly   = false   -- only bold aggregate cell/row

    if bw == "low" then
        config.boldwinner_mode = "low"
    elseif bw == "high" or YES(bw) then
        config.boldwinner_mode = "high"
    elseif bw == "aggregate" or bw == "agg" or bw == "aggregate-high" or bw == "agg-high" then
        config.boldwinner_mode    = "high"
        config.boldwinner_aggonly = true
    elseif bw == "aggregate-low" or bw == "agg-low" then
        config.boldwinner_mode    = "low"
        config.boldwinner_aggonly = true
    end

    if YES(bargs("boldwinner-aggregate-only")) then
        config.boldwinner_aggonly = true
    end

    -- ====================================
    -- 6) SEEDS & AGGREGATE SETTINGS
    -- ====================================
    -- forceseeds: explicit truthy; seeds: true unless explicitly "no"
    local seedsArg       = bargs("seeds")
    config.forceseeds    = YES(seedsArg)
    config.seeds         = not NO(seedsArg)

    -- aggregate mode
    do
        local aval = (bargs("aggregate") or ""):lower()
        if aval == "sets" or aval == "legs" then
            config.aggregate_mode = "sets"
        elseif aval == "score" then
            config.aggregate_mode = "score"
        elseif YES(aval) then
            config.aggregate_mode = "manual"
        else
            config.aggregate_mode = "off"
        end
        config.aggregate = (config.aggregate_mode ~= "off")
    end

    -- show-bye-paths (default true; only explicit "no" disables)
    do
        local v = (bargs("show-bye-paths") or ""):lower()
        config.show_bye_paths = (v == "") and true or (not NO(v))
    end

    -- autolegs (explicit truthy)
    config.autolegs = YES(bargs("autolegs"))

    -- ====================================
    -- 7) PARAMSTYLE INFERENCE
    -- ====================================
    local styleArg = (bargs("paramstyle") or ""):lower()
    local function hasNumberedArgs()
        -- Scan a reasonable window of positional args from both parent/frame via bargs
        for n = 1, 48 do
            local v = bargs(tostring(n))
            if v ~= nil and v ~= "" then return true end
        end
        return false
    end

    if styleArg == "numbered" then
        config.paramstyle = "numbered"
    elseif styleArg == "indexed" then
        config.paramstyle = "indexed"
    else
        config.paramstyle = hasNumberedArgs() and "numbered" or "indexed"
    end

    -- ====================================
    -- 8) THEME CONSTANTS (DEFAULTS)
    -- ====================================
    config.COLORS = config.COLORS or {
        cell_bg_light   = "var(--background-color-neutral-subtle,#f8f9fa)",
        cell_bg_dark    = "var(--background-color-neutral,#eaecf0)",
        text_color      = "var(--color-base,#202122)",
        path_line_color = "gray",
        cell_border     = "var(--border-color-base,#a2a9b1)"
    }

    return state, config, Helpers
end

return Config