« Module:TableColors » : différence entre les versions
De Nefald
Autres actions
mAucun résumé des modifications |
amélioration |
||
(5 versions intermédiaires par le même utilisateur non affichées) | |||
Ligne 34 : | Ligne 34 : | ||
} | } | ||
-- Fonction principale | -- Fonction pour assombrir une couleur (pour la bordure) | ||
function p. | 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 args = frame:getParent().args | ||
local colorName = mw.text.trim(args[1] or ""):lower() | local colorName = mw.text.trim(args[1] or ""):lower() | ||
local content = args[2] | local content = args[2] or "" | ||
-- Gestion des alias | -- Gestion des alias | ||
Ligne 49 : | Ligne 62 : | ||
colorName = aliases[colorName] or colorName | 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 | -- Construction des styles | ||
local | local cellStyle = string.format( | ||
'background-color: %s; color: %s', | 'background-color:%s; color:%s; padding:8px 12px;', | ||
color.bg, | color.bg, | ||
color.fg | color.fg | ||
) | ) | ||
-- | local borderColor = darkenColor(color.bg) | ||
local spanStyle = string.format( | |||
return 'style="' .. | '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 | end | ||
return string.format('<span style="%s">%s</span>', spanStyle, content) | |||
return 'style=" | |||
end | end | ||
-- Fonction pour lister les couleurs disponibles | -- Fonction pour lister les couleurs disponibles | ||
function p.list(frame) | function p.list(frame) | ||
local | local rows = {} | ||
local sorted = {} | local sorted = {} | ||
Ligne 83 : | Ligne 136 : | ||
for _, name in ipairs(sorted) do | for _, name in ipairs(sorted) do | ||
local color = colors[name] | local color = colors[name] | ||
-- Badge exemple | |||
' | local borderColor = darkenColor(color.bg) | ||
color.label, | 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.bg, | ||
color.fg, | color.fg, | ||
color.label | |||
) | |||
table.insert(rows, string.format( | |||
'|-\n| %s || %s || %s || <code>{{Couleur|%s|...}}</code>', | |||
color.label, | color.label, | ||
badge, | |||
cell, | |||
name | name | ||
)) | )) | ||
end | end | ||
table. | local wikitext = '{| class="wikitable sortable"\n! Nom !! Badge (texte) !! Cellule (tableau) !! Code\n' | ||
.. table.concat(rows, '\n') | |||
.. '\n|}' | |||
return | return frame:preprocess(wikitext) | ||
end | end | ||
return p | return p |