<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3AWikiProjectBanner%2FGrade</id>
	<title>Module:WikiProjectBanner/Grade - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3AWikiProjectBanner%2FGrade"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:WikiProjectBanner/Grade&amp;action=history"/>
	<updated>2026-05-07T16:53:25Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://stockhub.co/index.php?title=Module:WikiProjectBanner/Grade&amp;diff=147660&amp;oldid=prev</id>
		<title>imported&gt;WOSlinker: use require(&#039;strict&#039;) instead of require(&#039;Module:No globals&#039;)</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:WikiProjectBanner/Grade&amp;diff=147660&amp;oldid=prev"/>
		<updated>2022-10-22T09:21:01Z</updated>

		<summary type="html">&lt;p&gt;use require(&amp;#039;strict&amp;#039;) instead of require(&amp;#039;Module:No globals&amp;#039;)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-------------------------------------------------------------------------------&lt;br /&gt;
--                  Grade class for Module:WikiProjectBanner                 --&lt;br /&gt;
--                                                                           --&lt;br /&gt;
-- This module contains the Grade class used in Module:WikiProjectBanner.    --&lt;br /&gt;
-- It is used for finding quality and importance grades.                     --&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Load required modules.&lt;br /&gt;
require(&amp;#039;strict&amp;#039;)&lt;br /&gt;
local libraryUtil = require(&amp;#039;libraryUtil&amp;#039;)&lt;br /&gt;
local checkType = libraryUtil.checkType&lt;br /&gt;
local mShared = require(&amp;#039;Module:WikiProjectBanner/shared&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local Grade = {}&lt;br /&gt;
Grade.__index = Grade&lt;br /&gt;
&lt;br /&gt;
function Grade.new(assessmentType, args, bannerData, cfg, gradeCfg)&lt;br /&gt;
	checkType(&amp;#039;Grade.new&amp;#039;, 1, assessmentType, &amp;#039;string&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;Grade.new&amp;#039;, 2, args, &amp;#039;table&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;Grade.new&amp;#039;, 3, bannerData, &amp;#039;table&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;Grade.new&amp;#039;, 4, cfg, &amp;#039;table&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;Grade.new&amp;#039;, 5, gradeCfg, &amp;#039;table&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	local obj = setmetatable({}, Grade)&lt;br /&gt;
&lt;br /&gt;
	obj.assessmentType = assessmentType&lt;br /&gt;
	obj.args = args&lt;br /&gt;
	obj.bannerData = bannerData&lt;br /&gt;
	obj.cfg = cfg&lt;br /&gt;
	obj.gradeCfg = gradeCfg&lt;br /&gt;
&lt;br /&gt;
	return obj&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Grade:_validatePageStatusScales(scales)&lt;br /&gt;
	-- If banners specify a custom set of scales for each page status, this&lt;br /&gt;
	-- function checks that the scales table is valid.&lt;br /&gt;
&lt;br /&gt;
	-- Check the type of the scales table.&lt;br /&gt;
	if scales == nil then&lt;br /&gt;
		return nil&lt;br /&gt;
	elseif type(scales) ~= &amp;#039;table&amp;#039; then&lt;br /&gt;
		error(string.format(&lt;br /&gt;
			&amp;quot;type error in the &amp;#039;pageStatusScales&amp;#039; field of gradeCfg&amp;quot;&lt;br /&gt;
				.. &amp;quot; (expected table, got %s)&amp;quot;,&lt;br /&gt;
			type(scales)&lt;br /&gt;
		), 3)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Check that we have an &amp;quot;other&amp;quot; field.&lt;br /&gt;
	if not scales.other then&lt;br /&gt;
		error(&amp;quot;the page status scale must have an &amp;#039;other&amp;#039; field&amp;quot;, 3)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Check all the grades.&lt;br /&gt;
	local grades = self.grades&lt;br /&gt;
	for key, scale in pairs(scales) do&lt;br /&gt;
		if key ~= &amp;#039;other&amp;#039; and key ~= &amp;#039;redirect&amp;#039; and type(key) ~= &amp;#039;number&amp;#039; then&lt;br /&gt;
			error(&lt;br /&gt;
				&amp;quot;keys to the page status scales must be the string &amp;#039;other&amp;#039;,&amp;quot;&lt;br /&gt;
					.. &amp;quot; the string &amp;#039;redirect&amp;#039;, or a namespace number&amp;quot;,&lt;br /&gt;
				3&lt;br /&gt;
			)&lt;br /&gt;
		end&lt;br /&gt;
		local scaleType = type(scale)&lt;br /&gt;
		if scaleType ~= &amp;#039;table&amp;#039; and scaleType ~= &amp;#039;string&amp;#039; then&lt;br /&gt;
			error(string.format(&lt;br /&gt;
				&amp;quot;type error in page status scale &amp;#039;%s&amp;#039; (expected table or string, got %s)&amp;quot;,&lt;br /&gt;
				tostring(key), scaleType&lt;br /&gt;
			), 3)&lt;br /&gt;
		end&lt;br /&gt;
		scale = scaleType == &amp;#039;table&amp;#039; and scale or {scale = true}&lt;br /&gt;
		for grade in pairs(scale) do&lt;br /&gt;
			if type(grade) ~= &amp;#039;string&amp;#039; then&lt;br /&gt;
				error(string.format(&lt;br /&gt;
					&amp;quot;grades in page status scale &amp;#039;%s&amp;#039; must be strings; %s detected&amp;quot;,&lt;br /&gt;
					tostring(key), type(grade)&lt;br /&gt;
				), 3)&lt;br /&gt;
			elseif not grades[grade] then&lt;br /&gt;
				error(string.format(&lt;br /&gt;
					&amp;quot;no grade data found for grade key &amp;#039;%s&amp;#039; in the page status scale&amp;quot;,&lt;br /&gt;
					tostring(key)&lt;br /&gt;
				), 3)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Grade:getPageStatus()&lt;br /&gt;
	local title = self.bannerData.subjectTitle&lt;br /&gt;
	if title.isRedirect then&lt;br /&gt;
		return &amp;#039;redirect&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		return title.namespace&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Grade:makeScale()&lt;br /&gt;
	-- Makes a scale table from the page status, the scale config, and the&lt;br /&gt;
	-- module config. It will look something like this:&lt;br /&gt;
	-- {&lt;br /&gt;
	--   fa = true,&lt;br /&gt;
	--   a  = true,&lt;br /&gt;
	--   b  = true,&lt;br /&gt;
	--   ...&lt;br /&gt;
	-- }&lt;br /&gt;
	local scales = self.cfg.assessment[self.assessmentType].scales&lt;br /&gt;
	local scaleCfg = self.gradeCfg.scale&lt;br /&gt;
	local pageStatus = self:getPageStatus()&lt;br /&gt;
	local scale&lt;br /&gt;
	if type(scaleCfg) == &amp;#039;string&amp;#039; then&lt;br /&gt;
		scale = scales[scaleCfg][pageStatus] or scales[scaleCfg].other&lt;br /&gt;
	elseif type(scaleCfg) == &amp;#039;table&amp;#039; then&lt;br /&gt;
		local grades = self.cfg.assessment[self.assessmentType].grades&lt;br /&gt;
		scale = {}&lt;br /&gt;
		for gradeName in pairs(scaleCfg) do&lt;br /&gt;
			if grades[gradeName] then&lt;br /&gt;
				scale[gradeName] = true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	elseif scaleCfg ~= false then&lt;br /&gt;
		scale = scales.standard[pageStatus] or scales.standard.other&lt;br /&gt;
	end&lt;br /&gt;
	return scale&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Grade:resolveGrade()&lt;br /&gt;
	local grade = self.gradeCfg.forceGrade&lt;br /&gt;
	if not grade then&lt;br /&gt;
		local param = self.gradeCfg.param or self.cfg.assessment[self.assessmentType].param&lt;br /&gt;
		local scale = self:makeScale()&lt;br /&gt;
		local rawGrade = self.args[param] or &amp;#039;unassessed&amp;#039;&lt;br /&gt;
		rawGrade = mw.ustring.lower(rawGrade)&lt;br /&gt;
		grade = scale[rawGrade] and rawGrade or &amp;#039;na&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return self.cfg.assessment[self.assessmentType].grades[grade]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Grade:makeAssessmentCategory(t)&lt;br /&gt;
	t = t or {}&lt;br /&gt;
	local topic = t.topic or self.gradeCfg.topic or self.bannerData.project&lt;br /&gt;
	local msg = t.msg or self.gradeCfg.assessmentCategory or self.cfg.msg[&amp;#039;assessment-category&amp;#039;]&lt;br /&gt;
	local grade = t.grade&lt;br /&gt;
	return mShared.substituteParams(msg, grade, topic)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Grade:exportData()&lt;br /&gt;
	-- Finds the grade and exports a table of data about it. The data is&lt;br /&gt;
	-- memoised so that we only have to generate it once.&lt;br /&gt;
	if not self._data then&lt;br /&gt;
		-- Grade data.&lt;br /&gt;
		local data = {}&lt;br /&gt;
		local grade = self:resolveGrade()&lt;br /&gt;
		for k, v in pairs(grade) do&lt;br /&gt;
			data[k] = v&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- Categories&lt;br /&gt;
		data.mainCategory = self.gradeCfg.mainCategory or nil&lt;br /&gt;
		data.assessmentCategory = self:makeAssessmentCategory{grade = data.full}&lt;br /&gt;
&lt;br /&gt;
		self._data = data&lt;br /&gt;
	end&lt;br /&gt;
	return self._data&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Grade:exportCategories()&lt;br /&gt;
	local data = self:exportData()&lt;br /&gt;
	local cats = { data.mainCategory }&lt;br /&gt;
	cats[#cats + 1] = data.assessmentCategory&lt;br /&gt;
	return cats&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return Grade&lt;/div&gt;</summary>
		<author><name>imported&gt;WOSlinker</name></author>
	</entry>
</feed>