Basculer le menu
Changer de menu des préférences
Basculer le menu personnel
Non connecté(e)
Votre adresse IP sera visible au public si vous faites des modifications.

La documentation pour ce module peut être créée à Module:TableColors/doc

local p = {}

-- Palette inspirée de Bootstrap 5 + Citizen
local colors = {
    -- Variantes de succès (vert)
    success = { bg = "#d1e7dd", fg = "#0f5132", label = "Succès" },
    ["success-light"] = { bg = "#e8f5e9", fg = "#1b5e20", label = "Succès clair" },
    
    -- Variantes de danger (rouge)
    danger = { bg = "#f8d7da", fg = "#842029", label = "Danger" },
    ["danger-light"] = { bg = "#ffebee", fg = "#c62828", label = "Danger clair" },
    
    -- Variantes d'avertissement (jaune/orange)
    warning = { bg = "#fff3cd", fg = "#664d03", label = "Avertissement" },
    ["warning-light"] = { bg = "#fffde7", fg = "#f57f17", label = "Avertissement clair" },
    
    -- Variantes d'information (bleu)
    info = { bg = "#cfe2ff", fg = "#084298", label = "Info" },
    ["info-light"] = { bg = "#e3f2fd", fg = "#01579b", label = "Info clair" },
    
    -- Variantes neutres
    primary = { bg = "#cfe2ff", fg = "#052c65", label = "Primaire" },
    secondary = { bg = "#e2e3e5", fg = "#41464b", label = "Secondaire" },
    light = { bg = "#f8f9fa", fg = "#495057", label = "Clair" },
    dark = { bg = "#ced4da", fg = "#212529", label = "Foncé" },
    
    -- Compatibilité anciens noms
    vert = { bg = "#d1e7dd", fg = "#0f5132", label = "Vert" },
    rouge = { bg = "#f8d7da", fg = "#842029", label = "Rouge" },
    jaune = { bg = "#fff3cd", fg = "#664d03", label = "Jaune" },
    rose = { bg = "#f8d7da", fg = "#842029", label = "Rose" },
    gris = { bg = "#e2e3e5", fg = "#41464b", label = "Gris" },
    bleu = { bg = "#cfe2ff", fg = "#084298", label = "Bleu" },
}

-- Fonction pour assombrir une couleur (pour la bordure)
local function darkenColor(hex)
    local r = tonumber(hex:sub(2, 3), 16)
    local g = tonumber(hex:sub(4, 5), 16)
    local b = tonumber(hex:sub(6, 7), 16)
    
    r = math.floor(r * 0.7)
    g = math.floor(g * 0.7)
    b = math.floor(b * 0.7)
    
    return string.format("#%02x%02x%02x", r, g, b)
end

-- Fonction principale unifiée avec auto-détection AMÉLIORÉE
function p.cell(frame)
    local args = frame:getParent().args
    local colorName = mw.text.trim(args[1] or ""):lower()
    local content = args[2] or ""
    
    -- Gestion des alias
    local aliases = {
        ["gris-"] = "info-light",
        ["gris+"] = "secondary",
        ["vert-clair"] = "success-light",
        ["rouge-clair"] = "danger-light",
    }
    
    colorName = aliases[colorName] or colorName
    local color = colors[colorName] or colors.light
    
    -- DÉTECTION AUTOMATIQUE STRICTE
    local useTableMode = false
    local trimmedContent = mw.text.trim(content)
    
    -- Indicateurs de contexte TABLEAU
    local hasTableSyntax = content:match("%|%|") or content:match("!!") or content:match("%|-")
    local startsWithCode = trimmedContent:match("^<code>")
    local isShortLabel = mw.ustring.len(trimmedContent) <= 20 and not trimmedContent:match("%s%s")
    
    -- Indicateurs de contexte TEXTE (badge inline)
    local hasEmoji = trimmedContent:match("[💡⚠️🔥ℹ️✓✗🎯📌❌✅⭐🎨]")
    local hasBoldWithColon = trimmedContent:match("'''[^']+'''%s*:")
    local hasLongText = mw.ustring.len(trimmedContent) > 40
    local hasPunctuation = trimmedContent:match("[%.%,%;%!%?]") and mw.ustring.len(trimmedContent) > 15
    
    -- DÉCISION : MODE TABLEAU si critères stricts
    if hasTableSyntax or startsWithCode then
        useTableMode = true
    elseif trimmedContent == "" then
        useTableMode = true
    elseif isShortLabel and not hasEmoji and not hasBoldWithColon then
        useTableMode = true
    end
    
    -- FORCER MODE TEXTE si indicateurs clairs
    if hasEmoji or hasBoldWithColon or hasLongText or hasPunctuation then
        useTableMode = false
    end
    
    -- Construction des styles
    local cellStyle = string.format(
        'background-color:%s; color:%s; padding:8px 12px;',
        color.bg,
        color.fg
    )
    
    local borderColor = darkenColor(color.bg)
    local spanStyle = string.format(
        'background-color:%s; color:%s; padding:6px 12px; border-radius:6px; border:1.5px solid %s; display:inline-block; font-weight:500;',
        color.bg,
        color.fg,
        borderColor
    )
    
    -- MODE TABLEAU
    if useTableMode then
        if trimmedContent == "" then
            return 'style="' .. cellStyle .. '" | '
        end
        return 'style="' .. cellStyle .. '" | ' .. content
    end
    
    -- MODE TEXTE (badge)
    if trimmedContent == "" then
        return ''
    end
    
    return string.format('<span style="%s">%s</span>', spanStyle, content)
end

-- Fonction pour lister les couleurs disponibles
function p.list(frame)
    local rows = {}
    
    local sorted = {}
    for name, _ in pairs(colors) do
        table.insert(sorted, name)
    end
    table.sort(sorted)
    
    for _, name in ipairs(sorted) do
        local color = colors[name]
        
        -- Badge exemple
        local borderColor = darkenColor(color.bg)
        local badge = string.format(
            '<span style="background-color:%s; color:%s; padding:6px 12px; border-radius:6px; border:1.5px solid %s; display:inline-block; font-weight:500;">%s</span>',
            color.bg,
            color.fg,
            borderColor,
            color.label
        )
        
        -- Cellule exemple
        local cell = string.format(
            'style="background-color:%s; color:%s; padding:8px 12px;" | %s',
            color.bg,
            color.fg,
            color.label
        )
        
        table.insert(rows, string.format(
            '|-\n| %s || %s || %s || <code>{{Couleur|%s|...}}</code>',
            color.label,
            badge,
            cell,
            name
        ))
    end
    
    local wikitext = '{| class="wikitable sortable"\n! Nom !! Badge (texte) !! Cellule (tableau) !! Code\n' 
        .. table.concat(rows, '\n') 
        .. '\n|}'
    
    return frame:preprocess(wikitext)
end

return p