Module:Service award progress
Appearance
![]() | This module is rated as ready for general use. It has reached a mature form and is thought to be relatively bug-free and ready for use wherever appropriate. It is ready to mention on help pages and other Wikipedia resources as an option for new users to learn. To reduce server load and bad output, it should be improved by sandbox testing rather than repeated trial-and-error editing. |
This template implements {{service award progress}}, and shows a set of progress bars based on a user's Service award level and their progression up the scale. Check the template for usage documenation.
local navbar = require('Module:Navbar')._navbar
local mm = require('Module:Math')
local p = {}
local function stripToNil(text)
-- If text is a string, return its trimmed content, or nil if empty.
-- Otherwise return text (which may, for example, be nil).
if type(text) == 'string' then
text = text:match('(%S.-)%s*$')
end
return text
end
local function progressBar(current, total)
local percentDone = mm._round(current / total * 100, 1)
local leftBar = ''
local rightBar = ''
if percentDone >= 100 then
leftBar = 100
rightBar = 0
else
leftBar = current / total * 100
rightBar = (100-current) / total * 100
end
local progBarText = '<div style="width:75%; margin:auto; text-align:center;">' ..
'<p><span style="font-size: 120%;"><b>' .. percentDone .. '%</b></span> completed</p>' ..
'<p style="border:1px solid #c8ccd1; padding:1px; overflow:hidden;">' ..
'<span style="width: ' .. leftBar .. '%; height: 2px; background:#00af32; float:left;"> </span>' ..
'<span style="width: ' .. rightBar .. '%; height: 2px; background:#eaecf0; float:left;"> </span>' ..
'</p></div>'
return progBarText
end
local levelNames = {
'[[Wikipedia:Service awards#Sagacious Editor (or Ephoros of the Encyclopedia)|Sagacious Editor]]',
'[[Wikipedia:Service awards#Ultimate Vanguard Editor (or Cardinal Gom, the August Togneme of the Encyclopedia)|Ultimate Vanguard Editor]]',
'[[Wikipedia:Service awards#Senior Vanguard Editor (or Supreme Gom, the Most Exalted Togneme of the Encyclopedia)|Senior Vanguard Editor]]',
'[[Wikipedia:Service awards#Vanguard Editor (or Lord Gom, the Highest Togneme of the Encyclopedia)|Vanguard Editor]]',
'[[Wikipedia:Service awards#Grandmaster Editor First-Class (or Lord High Togneme Laureate)|Grandmaster Editor First-Class]]',
'[[Wikipedia:Service awards#Grandmaster Editor (or Lord High Togneme Vicarus)|Grandmaster Editor]]',
'[[Wikipedia:Service awards#Master Editor IV (or Looshpah Laureate of the Encyclopedia)|Master Editor IV]]',
'[[Wikipedia:Service awards#Master Editor III (or Most Plusquamperfect Looshpah Laureate)|Master Editor III]]',
'[[Wikipedia:Service awards#Master Editor II (or Auspicious Looshpah)|Master Editor II]]',
'[[Wikipedia:Service awards#Master Editor (or Illustrious Looshpah)|Master Editor]]',
'[[Wikipedia:Service awards#Senior Editor III (or Labutnum of the Encyclopedia)|Senior Editor III]]',
'[[Wikipedia:Service awards#Senior Editor II (or Most Pluperfect Labutnum)|Senior Editor II]]',
'[[Wikipedia:Service awards#Senior Editor (or Labutnum)|Senior Editor]]',
'[[Wikipedia:Service awards#Veteran Editor IV (or Tutnum of the Encyclopedia)|Veteran Editor IV]]',
'[[Wikipedia:Service awards#Veteran Editor III (or Most Perfect Tutnum)|Veteran Editor III]]',
'[[Wikipedia:Service awards#Veteran Editor II (or Grand Tutnum)|Veteran Editor II]]',
'[[Wikipedia:Service awards#Veteran Editor (or Tutnum)|Veteran Editor]]',
'[[Wikipedia:Service awards#Experienced Editor (or Grognard Mirabilaire)|Experienced Editor]]',
'[[Wikipedia:Service awards#Yeoman Editor (or Grognard Extraordinaire)|Yeoman Editor, level 4]]',
'[[Wikipedia:Service awards#Yeoman Editor (or Grognard Extraordinaire)|Yeoman Editor, level 3]]',
'[[Wikipedia:Service awards#Yeoman Editor (or Grognard Extraordinaire)|Yeoman Editor, level 2]]',
'[[Wikipedia:Service awards#Yeoman Editor (or Grognard Extraordinaire)|Yeoman Editor]]',
'[[Wikipedia:Service awards#Journeyman Editor (or Grognard)|Journeyman Editor, level 4]]',
'[[Wikipedia:Service awards#Journeyman Editor (or Grognard)|Journeyman Editor, level 3]]',
'[[Wikipedia:Service awards#Journeyman Editor (or Grognard)|Journeyman Editor, level 2]]',
'[[Wikipedia:Service awards#Journeyman Editor (or Grognard)|Journeyman Editor]]',
'[[Wikipedia:Service awards#Apprentice Editor (or Novato)|Apprentice Editor, level 4]]',
'[[Wikipedia:Service awards#Apprentice Editor (or Novato)|Apprentice Editor, level 3]]',
'[[Wikipedia:Service awards#Apprentice Editor (or Novato)|Apprentice Editor, level 2]]',
'[[Wikipedia:Service awards#Apprentice Editor (or Novato)|Apprentice Editor]]',
'[[Wikipedia:Service awards#Novice Editor (or Burba)|Novice Editor, level 4]]',
'[[Wikipedia:Service awards#Novice Editor (or Burba)|Novice Editor, level 3]]',
'[[Wikipedia:Service awards#Novice Editor (or Burba)|Novice Editor, level 2]]',
'[[Wikipedia:Service awards#Novice Editor (or Burba)|Novice Editor]]',
'[[Wikipedia:Service awards#Registered Editor (or Signator)|Registered Editor, level 4]]',
'[[Wikipedia:Service awards#Registered Editor (or Signator)|Registered Editor, level 3]]',
'[[Wikipedia:Service awards#Registered Editor (or Signator)|Registered Editor, level 2]]',
'[[Wikipedia:Service awards#Registered Editor (or Signator)|Registered Editor]]',
'Wikipedian',
}
local levelTime = {
8035.5, 7305, 6574.5, 5844, 5113.5, 4383, 3652.4, 2922, 2556.7, 2191.5, 1826.2, 1643.6,
1461, 1278.4, 1095.7, 913.1, 730.5, 547.9, 501.75, 456.25, 410.75, 365.25,
319.1, 273.6, 228.1, 182.6, 160.3, 137.3, 114.3, 91.3, 75.5, 60.5, 45.5, 30.5,
24, 16, 8, 1, 0,
}
local levelEdits = {
205000, 175000, 150000, 132000, 114000, 96000, 78000, 60000, 51000, 42000, 33000, 28500,
24000, 20000, 16000, 12000, 8000, 6000, 5500, 5000, 4500, 4000, 3500, 3000, 2500,
2000, 1750, 1500, 1250, 1000, 800, 600, 400, 200, 150, 100, 50, 1, 0,
}
function p.serviceLevel(args)
--Inputs
local editorTime = tonumber(stripToNil(args.editorTime))
local edits = tonumber(stripToNil(args.edits))
local styleoverride = stripToNil(args.styleoverride)
local genderoverride = stripToNil(args.genderoverride)
local url = stripToNil(args.url)
-- Other Variables
local timeLevel = '' -- Level associated with time
local editLevel = '' -- Level associated with edits
local userLevel = '' -- Full name of current user level
local lowEdits = '' -- Minimum number of edits for current user level
local lowTime = '' -- Minimum amount of time for current user level
local highEdits = '' -- Max number of edits for current user level
local highTime = '' -- Max amount of time for current user level
local nextLevel = '' -- Full name of next user level
local fullMessage = '<div style="' -- Output seed
local topLevel = false
local needsEdits = false
local needsTime = false
local needsBoth = false
local displayall = false
if stripToNil(args.displayall) == 'yes' then
displayall = true
end
-- Find "level" of editor based on time
for x = 1, 39, 1 do
if editorTime >= levelTime[x] then
timeLevel = x
break
end
end
-- Fine "level" of editor based on edits
for y = 1, 39, 1 do
if edits >= levelEdits[y] then
editLevel = y
break
end
end
-- Set user level and the next level up
if timeLevel == editLevel then
if timeLevel == 1 then
userLevel = levelNames[1]
topLevel = true
else
userLevel = levelNames[editLevel]
nextLevel = levelNames[editLevel-1]
lowEdits = levelEdits[editLevel]
highEdits = levelEdits[editLevel-1]
lowTime = levelTime[editLevel]
highTime = levelTime[editLevel-1]
needsBoth = true
end
elseif timeLevel < editLevel then
userLevel = levelNames[editLevel]
nextLevel = levelNames[editLevel-1]
lowEdits = levelEdits[editLevel]
highEdits = levelEdits[editLevel-1]
lowTime = levelTime[editLevel]
highTime = levelTime[editLevel-1]
needsEdits = true
else
userLevel = levelNames[timeLevel]
nextLevel = levelNames[timeLevel-1]
lowEdits = levelEdits[timeLevel]
highEdits = levelEdits[timeLevel-1]
lowTime = levelTime[timeLevel]
highTime = levelTime[timeLevel-1]
needsTime = true
end
-- Build notice
-- First paragraph
fullMessage = fullMessage .. styleoverride .. '">' ..
navbar({"Template:Service award progress",style="float:right",mini=1}) ..
'Currently, this editor has earned the <b>' .. userLevel .. '</b> service award.<br><br>'
if topLevel then
fullMessage = fullMessage .. '<div>This is the highest level achievable by an editor!</div>'
else
fullMessage = fullMessage .. '<div>To get to the next level, ' .. nextLevel .. ', ' .. genderoverride .. ' to meet the '
if needsBoth then
fullMessage = fullMessage .. '<b>editing</b> and the <b>time</b> requirement.</div>'
elseif needsEdits then
fullMessage = fullMessage .. '<b>editing</b> requirement.</div>'
else
fullMessage = fullMessage .. '<b>time</b> requirement.</div>'
end
-- Second paragra / progress bars
if displayall or needsBoth or needsEdits then
fullMessage = fullMessage .. 'Progress towards the next level (by edits): [ ' ..
'<span class="plainlinks">[' .. url .. ' ' ..
(edits - lowEdits) .. ']</span> / ' ..
(highEdits - lowEdits) .. ' ]'
fullMessage = fullMessage .. progressBar(edits - lowEdits, highEdits - lowEdits)
end
if displayall or needsBoth or needsTime then
fullMessage = fullMessage .. 'Progress towards the next level (by time): [ ' ..
(editorTime - lowTime) .. ' days / ' ..
(highTime - lowTime) .. ' days ]'
fullMessage = fullMessage .. progressBar(editorTime - lowTime, highTime - lowTime)
end
fullMessage = fullMessage .. '</div>'
end
return fullMessage
end
function p.main(frame)
return p.serviceLevel(frame.args)
end
return p