« Module:Roadmap » : différence entre les versions
De Nefald
Autres actions
Aucun résumé des modifications Balise : Révoqué |
Aucun résumé des modifications |
||
| (4 versions intermédiaires par le même utilisateur non affichées) | |||
| Ligne 68 : | Ligne 68 : | ||
end | end | ||
return nil | return nil | ||
end | |||
local function sanitizeClass(s) | |||
if not s then return "" end | |||
s = s:lower() | |||
s = s:gsub("[^%w%-]", "") | |||
return s | |||
end | end | ||
-- ------------------------------------------------------------ | -- ------------------------------------------------------------ | ||
-- PARSEUR | -- PARSEUR (séparateur ;; au lieu de |) | ||
-- ------------------------------------------------------------ | -- ------------------------------------------------------------ | ||
| Ligne 86 : | Ligne 93 : | ||
titre = trim(titre or "Section"), | titre = trim(titre or "Section"), | ||
}) | }) | ||
elseif line:match("^item%s* | elseif line:match("^item%s*;;") then | ||
local parts = {} | local parts = {} | ||
for part in line:gmatch("( | for part in (line .. ";;"):gmatch("(.-);;") do | ||
table.insert(parts, trim(part)) | table.insert(parts, trim(part)) | ||
end | end | ||
-- parts[1] = "item", parts[2] = statut, parts[3] = titre, etc. | |||
local statut = trim(parts[2] or "planned"):lower() | local statut = trim(parts[2] or "planned"):lower() | ||
local titre = trim(parts[3] or "") | local titre = trim(parts[3] or "") | ||
| Ligne 163 : | Ligne 171 : | ||
for _, tag in ipairs(tags) do | for _, tag in ipairs(tags) do | ||
table.insert(parts, string.format( | table.insert(parts, string.format( | ||
'<span class="roadmap-tag | '<span class="roadmap-tag roadmap-tag-%s">%s</span>', | ||
sanitizeClass(tag), escapeHtml(tag) | |||
)) | )) | ||
end | end | ||
| Ligne 279 : | Ligne 287 : | ||
function p.render(frame) | function p.render(frame) | ||
local args = frame:getParent().args | local args = frame:getParent().args | ||
local titre = getParam(args, "titre") or "Roadmap" | local rawContenu = trim(args["contenu"] or args[1] or "") | ||
-- | |||
local titre = getParam(args, "titre", "title") or "Roadmap" | |||
local subtitle = getParam(args, "subtitle") | local subtitle = getParam(args, "subtitle") | ||
-- | |||
local elements = parseContenu(rawContenu) | local elements = parseContenu(rawContenu) | ||
local pct, done, total = calcProgression(elements) | local pct, done, total = calcProgression(elements) | ||
local | -- | ||
table.insert( | local out = {} | ||
-- | table.insert(out, '<div class="roadmap-container">') | ||
table.insert( | -- En-tête | ||
table.insert( | table.insert(out, '<div class="roadmap-header">') | ||
'<div class="roadmap | table.insert(out, string.format('<div class="roadmap-title">%s</div>', escapeHtml(titre))) | ||
escapeHtml(titre) | |||
)) | |||
if subtitle then | if subtitle then | ||
table.insert( | table.insert(out, string.format('<div class="roadmap-subtitle">%s</div>', escapeHtml(subtitle))) | ||
'<div class="roadmap-subtitle">%s</div>', | |||
escapeHtml(subtitle) | |||
end | end | ||
-- | table.insert(out, htmlProgressBar(pct, done, total)) | ||
local | table.insert(out, htmlStats(elements)) | ||
table.insert(out, htmlLegende()) | |||
table.insert(out, '</div>') | |||
-- Corps | |||
local sectionOpen = false | |||
for _, el in ipairs(elements) do | for _, el in ipairs(elements) do | ||
if el.type == "section" then | if el.type == "section" then | ||
if | if sectionOpen then | ||
table.insert( | table.insert(out, '</div>') | ||
end | end | ||
table.insert( | table.insert(out, htmlSection(el)) | ||
sectionOpen = true | |||
elseif el.type == "item" then | elseif el.type == "item" then | ||
table.insert( | table.insert(out, htmlItem(el)) | ||
end | end | ||
end | end | ||
if sectionOpen then | |||
if | table.insert(out, '</div>') | ||
table.insert( | |||
end | end | ||
table.insert( | table.insert(out, '</div>') | ||
return table.concat( | return table.concat(out, "\n") | ||
end | end | ||