Module:VersionMessageBox: Difference between revisions

From Against the Storm Official Wiki
(created)
 
(updated to externalize the view; makes this logic simpler)
 
(7 intermediate revisions by the same user not shown)
Line 1: Line 1:
-------------------------------------------------------------------------------
--- @module VersionMessageBox
-- This module renders the {{Version}} template.
-- https://hoodedhorse.com/wiki/Against_the_Storm/Template:Version
--
-- This template #invokes VersionMessageBox.checkVersion(frame), below.
--
-- The template requires one argument provided by wiki page writers using the
-- template, which is the version of the game when the wiki page was last
-- updated. There is a second argument provided by the template itself that the
-- page writers canont overwrite, which always refers to the current version of
-- the game. The current version is identified by the wiki as
-- {{CurrentVersion}}.
--
-- Depending on the arguments, this module creates a message box that displays
-- when a reader opens a page that hasn't been reviewed and updated since the
-- version changed. The message box tells the reader what version of the game
-- the page was udpated with, the current version, and an encouraging note to
-- help keep the wiki up to date.
-- @module VersionMessageBox
local VersionMessageBox = {}
local VersionMessageBox = {}


--
-- Constants
--
-- specialization names
local CSS_VERSION_MESSAGE_BOX = "float:left; max-width: 400px; margin: auto; padding: 15px; border: 1px solid #366fe0; border-radius: 12px; background: #c9dcff"
local CSS_CLASS_VERSION_MESSAGE_BOX = "ATS-version-message-box"
local CSS_COLOR_VERSION_BACKGROUND = "#c9dcff"
local CSS_COLOR_VERSION_BORDER = "#366fe0"
local MESSAGE_BOX_ICON = "Hourglass_Icon_.png"




--region Dependencies


--
local VIEW_TEMPLATE = "Version/view"
-- Main rendering function
 
--
--endregion
 
 
 
--region Private constants
 
local PATTERN_CAPTURE_MAJOR_VERSION = "(%d+%.%d+)"
 
--endregion
 
 
 
--region Private methods
 
---
--- Extracts just the major version parts of the numbers and returns whether
--- the content is out of date.
---
---@param versionWhenLastUpdated string the version it was last updated
---@param currentVersion string the current version
---@return boolean true if the last updated is before the current major version
local function isOutOfDate(versionWhenLastUpdated, currentVersion)
 
local lastUpdated = tonumber(versionWhenLastUpdated:match(PATTERN_CAPTURE_MAJOR_VERSION) or 0)
local current = tonumber(currentVersion:match(PATTERN_CAPTURE_MAJOR_VERSION) or 0)
 
return current > lastUpdated
end
 
--endregion
 
 
 
--region Public methods
 
---main
--- Checks whether a message box is necessary. If the page is outdated, sends the information to the view template.
---
---@param frame table the template's calling context
---@return string wiki markup for a message box, or a blank string if it's up-to-date
function VersionMessageBox.main(frame)
 
local lastUpdated = frame.args.lastupdated
local currentVersion = frame.args.currentversion


-------------------------------------------------------------------------------
-- Checks whether a message box is necessary.
--
-- If the page is outdated, calls the method to draw the message box and adds
-- the right category to the page.
-- @param frame a table describing the MediaWiki frame; frame['args'] is a
-- table containg the template arguments; frame['args']['updated'] is the first
-- argument; frame['args']['currentVersion'] is the second argument.
-- @return a string containing the wiki markup for a message box, or an empty
-- string if the page is updated
function VersionMessageBox.checkVersion(frame)
-- extract the arguments we care about from the frame
local argLastUpdated = frame.args.updated
local argCurrentVersion = frame.args.currentVersion
-- validate that there are version values to use
-- validate that there are version values to use
if not argLastUpdated or "" == argLastUpdated then
if not lastUpdated or "" == lastUpdated then
return "Version error: please provide the game version with which you updated this page"
error("You must specify the version with which you updated the page. Please see the template documentation for how to use the parameters")
end
end
if not argCurrentVersion or "" == argCurrentVersion then
if not currentVersion or "" == currentVersion then
return "Version error: template did not identify current version correctly"
error("The current version was not retrieved correctly. Please reach out on the community discord for assistance")
end
end
 
-- let's try it for a while just checking whether they are different. In the
if isOutOfDate(lastUpdated, currentVersion) then
-- future, we may need to add actual numerical-comparison checks.
return frame:expandTemplate{
if argLastUpdated == argCurrentVersion then
title = VIEW_TEMPLATE,
args = {
["lastupdated"] = lastUpdated,
}
}
else
-- the page is up to date, nothing else needed
-- the page is up to date, nothing else needed
return ""
return ""
else
-- render the message box
local html = VersionMessageBox.renderMessageBox(argLastUpdated, argCurrentVersion)
-- add the category at the bottom.
--[[ mw:addCategory("Pages needing version review") this doesn't work --]]
return tostring(html)
end
end
end
end


--endregion


---
-- Renders the message box.
--
-- Renders a div with the appropriate CSS class for correct display. The div
-- contains the message about the version of the page and the current version of
-- the game. And it includes a statement encouraging people to keep the wiki up
-- to date.
-- @param argLastUpdated the version of the game when the page was updated
-- @param argCurrentVersion the current version of the game
-- @return the HTML markup for a message box
function VersionMessageBox.renderMessageBox(argLastUpdated, argCurrentVersion)
local div = mw.html.create('div')
div:addClass(CSS_CLASS_VERSION_MESSAGE_BOX)
div:cssText(CSS_VERSION_MESSAGE_BOX)
messageText = "This article was last updated during version '''" .. argLastUpdated .. "'''.<br />" ..
"The game is now in version '''" .. argCurrentVersion .. "'''.<br />" ..
"Some information may be out of date.<br />" ..
"Help us keep the wiki up to date by comparing this article against the patch notes and updating this page."
div:wikitext("[[File:" .. MESSAGE_BOX_ICON .. "|left|x48px|link=|Out of date]] ")
:tag('div'):cssText("margin-left: 60px")
:wikitext(messageText)
return div
end
-- return when required into another module
return VersionMessageBox
return VersionMessageBox

Latest revision as of 18:00, 15 October 2024

Documentation for this module may be created at Module:VersionMessageBox/doc

--- @module VersionMessageBox
local VersionMessageBox = {}



--region Dependencies

local VIEW_TEMPLATE = "Version/view"

--endregion



--region Private constants

local PATTERN_CAPTURE_MAJOR_VERSION = "(%d+%.%d+)"

--endregion



--region Private methods

---
--- Extracts just the major version parts of the numbers and returns whether
--- the content is out of date.
---
---@param versionWhenLastUpdated string the version it was last updated
---@param currentVersion string the current version
---@return boolean true if the last updated is before the current major version
local function isOutOfDate(versionWhenLastUpdated, currentVersion)

	local lastUpdated = tonumber(versionWhenLastUpdated:match(PATTERN_CAPTURE_MAJOR_VERSION) or 0)
	local current = tonumber(currentVersion:match(PATTERN_CAPTURE_MAJOR_VERSION) or 0)

	return current > lastUpdated
end

--endregion



--region Public methods

---main
--- Checks whether a message box is necessary. If the page is outdated, sends the information to the view template.
---
---@param frame table the template's calling context
---@return string wiki markup for a message box, or a blank string if it's up-to-date
function VersionMessageBox.main(frame)

	local lastUpdated = frame.args.lastupdated
	local currentVersion = frame.args.currentversion

	-- validate that there are version values to use
	if not lastUpdated or "" == lastUpdated then
		error("You must specify the version with which you updated the page. Please see the template documentation for how to use the parameters")
	end
	if not currentVersion or "" == currentVersion then
		error("The current version was not retrieved correctly. Please reach out on the community discord for assistance")
	end

	if isOutOfDate(lastUpdated, currentVersion) then
		return frame:expandTemplate{
			title = VIEW_TEMPLATE,
			args = {
				["lastupdated"] = lastUpdated,
			}
		}
	else
		-- the page is up to date, nothing else needed
		return ""
	end
end

--endregion

return VersionMessageBox