Module:Infobox election/sandbox: Difference between revisions

Content deleted Content added
add
allow named colors to be used
 
(20 intermediate revisions by 3 users not shown)
Line 1:
local p = {}
local args = {}
local origArgs = {}
 
local InfoboxImage = require('Module:InfoboxImage').InfoboxImage
Line 7 ⟶ 5:
local fetch = require('Module:Political party')._fetch
-- Helper functions --
local notblank = function (v) return (mw.text.trim(v or "") ~= "") end
local ifblank = function (v, alt1, alt2) return notblank(v) and v or (notblank(alt1) and alt1 or alt2) end
local ucfirst = function (s) return mw.ustring.upper(mw.ustring.sub(s,1,1)) .. mw.ustring.gsub(mw.ustring.sub(s,2), '_', ' ') end
 
local function _rowexport(framefunc, rargsframe)
-- Read args from input --
local args = {}
local frameArgs = false
for k,v in pairs(frame.args) do
if notblank(v) then
args[k] = mw.text.trim(v)
frameArgs = true
end
end
if not frameArgs then
for k,v in pairs(frame:getParent().args) do
if notblank(v) then args[k] = mw.text.trim(v) end
end
end
return p[func](args, frame)
end
 
-- Template:Infobox election/shortname --
function p._shortname(sargs)
local link = sargs.link
local name = sargs.name
if link ~= 'no' and notblank(name) and delink({[1] = name, wikilinks = 'target'}) == name then
-- the below array items are lowercase and intentionally missing the training 's'
local names = {
independent = '[[Independent politician|' .. name .. ']]',
miscellaneou = '[[Independent politician|DIV]]', -- the 's' is intentionally left off
other = 'Others',
['other parties and independent'] = 'Others & [[Independent politician|IND]]',
regionalist = '[[Regionalism (politics)|Regionalists]]',
tbc = '[[To be announced|TBC]]',
tbd = '[[To be announced|TBD]]',
vacant = '[[Casual vacancy|Vacant]]'
}
return names[mw.ustring.gsub(mw.ustring.lower(name), 's$', '')] or
('[[' .. name .. '|' .. fetch({[1] = name, [2] = 'shortname'}) .. ']]')
end
return name or ''
end
 
p.shortname = function (frame) return export('_shortname', frame) end
 
-- Template:Infobox election/row --
function p._row(rargs, frame)
local rtype = mw.ustring.lower(rargs.type or '')
local ongoing = rargs.ongoing == 'yes'
local output = {'|-'}
setmetatable(output, {__call = function (t, v) t[#t+1] = v end }) -- Append to array by calling it
Line 17 ⟶ 62:
local function threeCells(cellType, title, always, shortname)
local centeredCell = function (key)
local name = shortname and p._shortname({link = rargs[key .. '_name'], name = rargs[key]}) or (rargs[key] or '')
return ('| style="' .. (notblank(rargs[key]) and 'width:75px;' or '') .. 'text-align:center" | ' .. name )
end
Line 23 ⟶ 68:
if always or ( notblank(rargs[cellType .. '1']) or notblank(rargs[cellType .. '2']) or notblank(rargs[cellType .. '3']) ) then
output('|-')
output('! style="width:75px;text-align:left" |' .. (titleifblank(rargs[cellType or.. '_label'], title, ucfirst(cellType or ''))))
output(centeredCell(cellType .. '1'))
output(centeredCell(cellType .. '2'))
Line 38 ⟶ 83:
end
output('|- class="sr-only"')
if rargs.not ongoing ~= "yes" and (
rtype == "parliamentary" or rtype == "legislative"
) and (
Line 59 ⟶ 104:
end
local image = {}
for i = 1, notblank(rargs['col3']) and 3 or 2, 1 do
image[i] = '| class="notheme" style="text-align:center;'
if not notblank(rargs['party' .. i]) and not notblank(rargs['color' .. i]) then
Line 65 ⟶ 110:
end
if notblank(rargs['color' .. i]) then
image[i]local color = image[i] .. 'border-bottom: 6px solid #' .. mw.ustringtext.gsubtrim(mw.ustringtext.gsubdecode(rargs['color' .. i],'#',''),'#','')
elseif if rargs.party_color(#color ~== 'no'3 or #color == 6) and notblankstring.match(rargscolor, "^['party'0-9a-fA-F] .. i*$") then
color = '#' .. color
local color = mw.ustring.replace(rargs['party' .. i], '^(%[%[%s*[^%]%[]*%]%]).*$', '%1')
end
image[i] = image[i] .. 'border-bottom: 6px solid ' .. color
elseif rargs.party_color ~= 'no' and notblank(rargs['party' .. i]) then
local color = mw.ustring.gsub(rargs['party' .. i], '^(%[%[%s*[^%]%[]*%]%]).*$', '%1')
color = delink({[1] = color, wikilinks = 'target'})
color = fetch({[1] = color, [2] = 'color', error = 'NOTHERE'})
if color ~= 'NOTHERE' then
image[i] = image[i] .. 'border-bottom: 6px solid ' .. color
end
end
Line 78 ⟶ 127:
image = rargs['image' .. i] or '',
size = notblank(rargs['image' .. i .. '_size']) and rargs['image' .. i .. '_size'] or (rargs.image_size or ''),
alt = ragsrargs['alt' .. i] or '',
upright = notblank(rargs['image' .. i .. '_upright']) and rargs['image' .. i .. '_upright'] or (
(notblank(rargs['col3']) and notblank(rargs['image3'])) and '0.4' or '0.6'
),
suppressplaceholder = 'yes',
class = notblank(rargs['pageimage' .. i]) and '' or 'notpageimage noresize'),
}
} )
Line 102 ⟶ 151:
end
-- Party name --
threeCells('party', ifblank(notblank(rargs.party_label) and rargs.party_label or, 'Party'), false, true) -- party, alternative name, don't always show, use shortname
-- Alliance name --
threeCells('alliance', '', false, true) -- alliance, notno alternative title, don't always show, use shortname
-- Primary or presidential
if rtype == 'primary' or rtype == 'presidential' then
Line 113 ⟶ 162:
threeCells('running_mate')
-- Electoral vote --
if not ongoing then
threeCells('electoral_vote', (rargs.college_votes == 'no' and 'Projected e' or 'E') .. 'lectoral vote')
threeCells('electoral_vote', (rargs.college_voted == 'no' and 'Projected e' or 'E') .. 'lectoral vote')
end
end
-- Delegate count --
threeCells('delegate_count', (rargs.ongoings == 'yes'ongoing and 'Estimated d' or 'D') .. 'elegate count')
-- StatesPrimary carriedonly --
threeCells('states_carried',if rtype == 'primary' and 'Contests won' or 'States carried')then
-- Contests won
threeCells('states_carried', 'Contests won')
-- Presidential not ongoing --
elseif not ongoing then
-- States carried --
threeCells('states_carried', 'States carried')
end
end
-- Parliamentary or legislative --
Line 129 ⟶ 187:
threeCells('last_election')
-- Seats before --
threeCells('seats_before', rargs.ongoing == 'yes' and 'Current seats' or 'Seats before')
-- Ongoing --
if rargs.ongoing == 'yes' then
-- Seats needed --
threeCells('seats_needed')
Line 145 ⟶ 203:
end
-- Primary or not ongoing --
if rargs.not ongoing ~= 'yes' or rtype == 'primary' then
-- Popular vote --
threeCells('popular_vote', (rargs.vote_type or 'Popular') .. ' vote')
-- Percentage --
threeCells('percentage')
-- PrimaryFirst orround presidential--
if rtype == 'primary' then
threeCells('first_round')
end
-- Final round --
threeCells('final_round')
-- Primary or presidential --
if rtype == 'primary' or rtype == 'presidential' then
-- Counties won --
threeCells('counties_won')
-- Counties 25% threshold --
threeCells('counties_threshholdcounties_threshold', 'Counties with 25% vote')
end
end
-- Swing --
if (rtype == 'parliamentary' or rtype == 'legislative') and rargs.not ongoing ~= 'yes' then
threeCells('swing')
end
Line 172 ⟶ 236:
end
 
p.row = function (frame) return export('_row', frame) end
function p._shortname(link, name)
if link ~= 'no' and notblank(name) and delink({[1] = name, wikilinks = 'target'}) == name then
-- the below array items are intentionally missing the training 's'
local names = {
independent = '[[Independent politician|' .. name .. ']]',
miscellaneous = '[[Independent politician|DIV]]',
other = 'Others',
['other parties and independent'] = 'Others & [[Independent politician|IND]]',
regionalist = '[[Regionalism (politics)|Regionalists]]',
tbc = '[[To be announced|TBC]]',
tbd = '[[To be announced|TBD]]',
vacant = '[[Casual vacancy|Vacant]]'
}
return names[mw.ustring.gsub(mw.ustring.lower(name), 's$', '')] or
('[[' .. name .. '|' .. fetch({[1] = name, [2] = 'shortname'}) .. ']]')
end
return name or ''
end
 
function p.row(frame)
local args = {}
for k,v in pairs(frame:getParent().args) do
if notblank(v) then args[k] = mw.text.trim(v) end
end
for k,v in pairs(frame.args) do
if notblank(v) then args[k] = mw.text.trim(v) end
end
return _row(frame, args)
end
function p.infobox(frame)
local origArgs = {}
for k,v in pairs(frame:getParent().args) do
if notblank(v) then origArgs[k] = mw.text.trim(v) end
end
for k,v in pairs(frame.args) do
if notblank(v) then origArgs[k] = mw.text.trim(v) end
end
local pagetitle = frame:getParent() and frame:getParent():getTitle() or frame:getTitle()
local etype = mw.ustring.lower(origArgs.type or '')
args = {
templatestyles = 'Infobox election/styles.css',
['child templatestyles'] = 'Screen reader-only/styles.css',
child = origArgs.child or origArgs.embed or '',
bodyclass = 'ib-election infobox-table' .. (notblank(origArgs.election_date) and 'vevent' or ''),
bodystyle = '',
titleclass = 'summary',
title = ((origArgs.child or origArgs.embed or '') == 'yes')
and (notblank(origArgs.election_name) and '<div style="background-color:#ddd; font-size:120%; font-weight:bold">'..origArgs.election_name..'</div>')
or (notblank(origArgs.election_name) and origArgs.election_name or pagetitle),
subheader1 = notblank(origArgs.flag_image)
and (InfoboxImage(
frame:newChild{ title = frame:getTitle(), args = {
image = origArgs.flag_image,
size = "50px",
alt = "",
link = ""
} }
) .. "<hr />")
or (require('Module:CountryData').gettable(mw.getCurrentFrame(),origArgs.country).alias and (require('Module:flag').deco(
frame:newChild{ title = frame:getTitle(), args = {
[1] = origArgs.country,
variant = origArgs.flag_year,
size = "50px"
} }
) .. "<hr />") ),
subheader2 = 'TBD',
subheader3 = 'TBD',
subheader4 = 'TBD',
header1 = (etype == 'primary' or etype == 'presidential') and (
notblank(origArgs.votes_for_election) and (
'<hr />' .. origArgs.votes_for_election .. (
notblank(origArgs.needed_votes) and '<br />' .. origArgs.needed_votes .. ' votes needed to win'
)
) or ''
) or (
(etype == 'parliamentary' or etype == 'legislative' or etype == 'by-election') and (
notblank(origArgs.seats_for_election) and (
'<hr />' .. origArgs.seats_for_election .. (
notblank(origArgs.majority_seats) and '<br />' .. origArgs.majority_seats .. ' seats needed for a majority'
)
) or ''
) or ''
),
data2 = notblank(origArgs.opinion_polls) and ('[[' .. origArgs.opinion_polls .. '|Opinion&nbsp;polls]]') or '',
label3 = 'Registered',
data3 = origArgs.registered,
label4 = 'Turnout',
data4 = origArgs.turnout,
label5 = 'Votes&nbsp;counted',
data5 = notblank(origArgs.votes_counted) and (
'<div class="center" style="width:auto;margin-left:auto;margin-right:auto;">' ..
_percentageBar(origArgs.votes_counted, origArgs.votes_counted .. '%', '1BCE0E') ..
"</div>as of '''" .. (origArgs.last_update or '') .. ' ' .. (origArgs.time_zone or '') .. "'''"
) or '',
label6 = 'Reporting',
data6 = notblank(origArgs.reporting) and (
'<div class="center" style="width:auto;margin-left:auto;margin-right:auto;">' ..
_percentageBar(origArgs.reporting, origArgs.reporting .. '%', '1BCE0E') ..
"</div>as of '''" .. (origArgs.last_update or '') .. ' ' .. (origArgs.time_zone or '') .. "'''"
) or '',
label7 = 'Declared',
data7 = notblank(origArgs.declared) and (
'<div class="center" style="width:auto;margin-left:auto;margin-right:auto;">' ..
_percentageBar(origArgs.declared, origArgs.declared .. '%', '1BCE0E') ..
"</div>as of '''" .. (origArgs.last_update or '') .. ' ' .. (origArgs.time_zone or '') .. "'''"
) or '',
}
local width = 0
local map = false
for _, v in ipairs({'', '2', '3', '4'}) do
if notblank(origArgs['map' .. v]) or notblank(origArgs['map' .. v .. '_image']) then
map = true
local nWidth = mw.ustring.gsub(origArgs['map' .. v .. '_size'] or '300', '%s*px%s*$', '')
width = math.max(width, tonumber(nWidth) or 300)
end
end
if map then
args.bodystyle = tostring(math.min(300, width)) .. "px"
end
return require('Module:Infobox').infoboxTemplate(
frame:newChild{ title = frame:getTitle(), args = args }
)
end
 
return p