Module:RequirementBox: Difference between revisions
Admin Jeremy (talk | contribs) No edit summary Tag: Reverted |
Admin Jeremy (talk | contribs) (Undo revision 3311 by Admin Jeremy (talk)) Tag: Undo |
||
| Line 1: | Line 1: | ||
local p = {} | |||
local function renderCategory(title, list) | local function renderCategory(title, list) | ||
if list == "" then return "" end | if list == "" then return "" end | ||
-- Split list into individual <li> blocks | |||
local items = {} | |||
for li in list:gmatch("<li>(.-)</li>") do | |||
table.insert(items, li) | |||
end | |||
local out = "" | local out = "" | ||
for _, item in ipairs(items) do | |||
for | if item:find("||OR||") then | ||
-- OR requirement | |||
local parts = mw.text.split(item, "%s*||OR||%s*") | |||
out = out .. '<li class="vp-requirement-or">' | |||
for i, part in ipairs(parts) do | |||
out = out .. '<div class="vp-requirement-or-option">' .. part .. '</div>' | |||
if i < #parts then | |||
out = out .. '<div class="vp-requirement-or-divider">OR</div>' | |||
end | end | ||
end | end | ||
out = out .. '</li>' | |||
else | |||
-- Normal requirement | |||
out = out .. '<li>' .. item .. '</li>' | |||
end | end | ||
end | end | ||
return string.format([[ | return string.format([[ | ||
| Line 41: | Line 38: | ||
</div>]], title, out) | </div>]], title, out) | ||
end | end | ||
function p.render(frame) | |||
local args = frame.args | |||
local title = args.title or "Game" | |||
local game = args.game or "" | |||
local state = args.state or "" | |||
-- preprocess each category to allow raw wikitext | |||
local appear = frame:preprocess(args.appear or "") | |||
local visit = frame:preprocess(args.visit or "") | |||
local resident = frame:preprocess(args.resident or "") | |||
local romance = frame:preprocess(args.romance or "") | |||
local tricks = frame:preprocess(args.tricks or "") | |||
local unblock = frame:preprocess(args.unblock or "") | |||
local evolve = frame:preprocess(args.evolve or "") | |||
local bait = frame:preprocess(args.bait or "") | |||
-- build requirements HTML | |||
local html = renderCategory("Appear", appear) | |||
html = html .. renderCategory("Visit", visit) | |||
html = html .. renderCategory("Resident", resident) | |||
html = html .. renderCategory("Romance", romance) | |||
html = html .. renderCategory("Tricks", tricks) | |||
html = html .. renderCategory("Unblock", unblock) | |||
html = html .. renderCategory("Evolve", evolve) | |||
html = html .. renderCategory("Bait", bait) | |||
-- decide whether <details> is open | |||
local openAttr = "" | |||
if state ~= "mw-collapsed" then | |||
openAttr = ' open="open"' | |||
end | |||
-- final details box | |||
local details = string.format([[ | |||
<details class="vp-gamebox"%s data-game="%s"> | |||
<summary class="vp-gamebox-header">%s</summary> | |||
<div class="vp-gamebox-content"> | |||
%s | |||
</div> | |||
</details>]], openAttr, game, title, html) | |||
-- <<< RETURN RAW HTML >>> | |||
return frame:preprocess(details) | |||
end | |||
return p | |||
Revision as of 17:18, 5 January 2026
Documentation for this module may be created at Module:RequirementBox/doc
local p = {}
local function renderCategory(title, list)
if list == "" then return "" end
-- Split list into individual <li> blocks
local items = {}
for li in list:gmatch("<li>(.-)</li>") do
table.insert(items, li)
end
local out = ""
for _, item in ipairs(items) do
if item:find("||OR||") then
-- OR requirement
local parts = mw.text.split(item, "%s*||OR||%s*")
out = out .. '<li class="vp-requirement-or">'
for i, part in ipairs(parts) do
out = out .. '<div class="vp-requirement-or-option">' .. part .. '</div>'
if i < #parts then
out = out .. '<div class="vp-requirement-or-divider">OR</div>'
end
end
out = out .. '</li>'
else
-- Normal requirement
out = out .. '<li>' .. item .. '</li>'
end
end
return string.format([[
<div class="vp-requirements-category">
<div class="requirements-header">%s</div>
<ul class="vp-requirements-list">
%s
</ul>
</div>]], title, out)
end
function p.render(frame)
local args = frame.args
local title = args.title or "Game"
local game = args.game or ""
local state = args.state or ""
-- preprocess each category to allow raw wikitext
local appear = frame:preprocess(args.appear or "")
local visit = frame:preprocess(args.visit or "")
local resident = frame:preprocess(args.resident or "")
local romance = frame:preprocess(args.romance or "")
local tricks = frame:preprocess(args.tricks or "")
local unblock = frame:preprocess(args.unblock or "")
local evolve = frame:preprocess(args.evolve or "")
local bait = frame:preprocess(args.bait or "")
-- build requirements HTML
local html = renderCategory("Appear", appear)
html = html .. renderCategory("Visit", visit)
html = html .. renderCategory("Resident", resident)
html = html .. renderCategory("Romance", romance)
html = html .. renderCategory("Tricks", tricks)
html = html .. renderCategory("Unblock", unblock)
html = html .. renderCategory("Evolve", evolve)
html = html .. renderCategory("Bait", bait)
-- decide whether <details> is open
local openAttr = ""
if state ~= "mw-collapsed" then
openAttr = ' open="open"'
end
-- final details box
local details = string.format([[
<details class="vp-gamebox"%s data-game="%s">
<summary class="vp-gamebox-header">%s</summary>
<div class="vp-gamebox-content">
%s
</div>
</details>]], openAttr, game, title, html)
-- <<< RETURN RAW HTML >>>
return frame:preprocess(details)
end
return p