Jump to content

Module:Service award progress/sandbox: Difference between revisions

From Wikipedia, the free encyclopedia
Content deleted Content added
rewrite formula that calculates the length of the leftBar (now called barLength)
use CSS token for the remaining part of the progress bar
Line 18: Line 18:
'<p><span style="font-size: 120%;"><b>' .. percentDone .. '%</b></span> completed</p>' ..
'<p><span style="font-size: 120%;"><b>' .. percentDone .. '%</b></span> completed</p>' ..
'<p style="border:1px solid #c8ccd1; padding:1px; overflow:hidden;">' ..
'<p style="border:1px solid #c8ccd1; padding:1px; overflow:hidden;">' ..
'<span style="width: ' .. barLength .. '%; height: 2px; background:#00af32; color:inherit; float:left;">&nbsp;</span>' ..
'<span style="width: ' .. barLength .. '%; height: 2px; background-color:#00af32; color:inherit; float:left;">&nbsp;</span>' ..
'<span style="width: calc(100% - ' .. barLength .. '%); height: 2px; background:#eaecf0; color:inherit; float:left;">&nbsp;</span>' ..
'<span style="width: calc(100% - ' .. barLength .. '%); height: 2px; background-color:var(--background-color-neutral, #eaecf0); color:inherit; float:left;">&nbsp;</span>' ..
'</p></div>'
'</p></div>'
return progBarText
return progBarText

Revision as of 12:23, 28 April 2025

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 barLength = (percentDone >= 100) and 100 or (current / total * 100)

	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: ' .. barLength .. '%; height: 2px; background-color:#00af32; color:inherit; float:left;">&nbsp;</span>' ..
			'<span style="width: calc(100% - ' .. barLength .. '%); height: 2px; background-color:var(--background-color-neutral, #eaecf0); color:inherit; float:left;">&nbsp;</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]]',
	'[[Wikipedia:Service awards#Journeyman Editor (or Grognard)|Journeyman Editor]]',
	'[[Wikipedia:Service awards#Apprentice Editor (or Novato)|Apprentice Editor]]',
	'[[Wikipedia:Service awards#Novice Editor (or Burba)|Novice Editor]]',
	'[[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, 365.25, 182.6, 91.3, 30.5, 1, 0,
}
local levelEdits = {
	205000, 175000, 150000, 132000, 114000, 96000, 78000, 60000, 51000, 42000, 33000, 28500,
	24000, 20000, 16000, 12000, 8000, 6000, 4000, 2000, 1000, 200, 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, 24, 1 do
		if editorTime >= levelTime[x] then
			timeLevel = x
			break
		end
	end
	-- Fine "level" of editor based on edits
	for y = 1, 24, 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): [&nbsp;' ..
							'<span class="plainlinks">[' .. url .. ' ' ..
							(edits - lowEdits) .. ']</span>&nbsp;/&nbsp;' ..
							(highEdits - lowEdits) .. '&nbsp;]'
			fullMessage = fullMessage .. progressBar(edits - lowEdits, highEdits - lowEdits)
		end
		if displayall or needsBoth or needsTime then
			fullMessage = fullMessage .. 'Progress towards the next level (by time): [&nbsp;' ..
							(editorTime - lowTime) .. '&nbsp;days&nbsp;/&nbsp;' ..
							(highTime - lowTime) .. '&nbsp;days&nbsp;]'
			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