Module:Class mask

local p = {}

local readarticleclass = function -- look for article_class in page content local get_parameter_value = require("Module:Template parameter value").getValue local WPBSredirects = {'WikiProject banner shell','WikiProject banner shell/sandbox','Bannershell','Multiple wikiprojects','Project shell','Scope shell','WPB','WPBS','WPBannerShell','WP Banner Shell','WP banner shell','WikiProjectBannerShell','WikiProjectBanner Shell','WikiProjectBanners','WikiProject BannerShell','WikiProject Banner Shell','WikiProject Banners','WikiProject Banners Shell','WikiProject Shell','WikiProject banner','WikiProject banner shell/redirect','WikiProject shell','WikiprojectBannerShell','Wikiproject banner holder','Wikiproject banner shell','Wikiprojectbanners','Wikiprojectbannershell','Wpb','Wpbannershell','Wpbsgclass'} local target = mw.title.getCurrentTitle.prefixedText local success, result = get_parameter_value(target, WPBSredirects, "class", {ignoreSubtemplates=true}) return success and result end

local isarticle = function(class) local nonarticleclasses = {'Template', 'File', 'Category', 'Disambig', 'Redirect', 'Portal', 'Project', 'Draft', 'Book', 'FM'} -- these classes will not be identified as conflicting with NA-class local article = true for _,v in ipairs(nonarticleclasses) do		if class==v then -- class matches one of the non-article classes article = false break end end return article end

local ucfirst = function(s) -- Returns the given string with the first character in upper case. -- Should not be used with non-ascii strings. return s:sub(1, 1):upper .. s:sub(2, -1) end

local isTruthyBParam = function(s) s = s and s:lower return not s or s == 'yes' or s == 'y' or s == '1' or s == 'pass' or s == 'na' or s == 'n/a' or s == '¬' or s == 'unused' end

local resolveFQSgrade = function(grade, args) if (args[grade] or args.FQS) == 'yes' then return ucfirst(grade) else return 'NA' end end

local resolveExtraGrade = function(grade, args) if args[grade] == 'yes' then return ucfirst(grade) else return 'NA' end end

local resolveDefaultGrade = function(args, title, talkDefault) if args.ignorenamespace then return nil end if title.subjectPageTitle.isRedirect then return resolveExtraGrade('redirect',args) end local ns = title.namespace if ns==1 then -- Talk if require('Module:Disambiguation').isDisambiguation(title.subjectPageTitle:getContent) then return resolveFQSgrade('disambig',args) else return talkDefault end elseif ns==7 or ns==711 then -- File talk return resolveFQSgrade('file', args) elseif ns==15 then -- Category talk return resolveFQSgrade('category', args) elseif ns==101 then -- Portal talk return resolveFQSgrade('portal', args) elseif ns==11 or ns==829 then -- Template talk return resolveFQSgrade('template', args) elseif ns==5 then -- Wikipedia talk return resolveFQSgrade('project', args) elseif ns==119 then -- Draft talk return resolveFQSgrade('draft', args) elseif ns==13 then -- Help talk return resolveExtraGrade('help', args) else return 'NA' end end

local getGrade = function(args, title) local grade = args[1] grade = grade and grade:match('^%s*(.-)%s*$'):lower local ret

if not grade or grade == '¬' then -- undefined ret = '¬'

-- Ucfirst elseif grade == 'start' or grade == 'stub' or grade == 'list' then if args[grade] ~= 'no' then ret = ucfirst(grade) end

-- B	elseif grade == 'b' then local bParams = {'b1', 'b2', 'b3', 'b4', 'b5', 'b6'} local isExtended = false for _, param in ipairs(bParams) do			if args[param] then isExtended = true break end end if isExtended then local isB = true for _, param in ipairs(bParams) do				if not isTruthyBParam(args[param]) then isB = false break end end ret = isB and 'B' or 'C'		elseif args.b ~= 'no' then ret = 'B'		end

-- Upper-case elseif grade == 'fa' or grade == 'fl' or grade == 'a' or grade == 'ga' or grade == 'c' then if args[grade] ~= 'no' then ret = grade:upper end elseif grade == 'na' then if args.forceNA == 'yes' then ret = resolveDefaultGrade(args, title, 'NA') else ret = 'NA' end elseif grade == 'file' or grade == 'image' or grade == 'img' then ret = resolveFQSgrade('file', args) elseif grade == 'category' or grade == 'cat' or grade == 'categ' then ret = resolveFQSgrade('category', args) elseif grade == 'dab' or grade == 'disambig' or grade == 'disambiguation' or grade == 'disamb' then ret = resolveFQSgrade('disambig', args) elseif grade == 'redirect' or grade == 'red' or grade == 'redir' then ret = resolveExtraGrade('redirect', args) elseif grade == 'help' then ret = resolveExtraGrade('help', args) elseif grade == 'portal' or grade == 'project' or grade == 'draft' then ret = resolveFQSgrade(grade, args) elseif grade == 'template' or grade == 'temp' or grade == 'tpl' or grade == 'templ' then ret = resolveFQSgrade('template', args) elseif grade == 'fm' then if args.fm == 'yes' then ret = 'FM' else ret = resolveFQSgrade('file', args) end

else -- Upper-case syntax ret = args[grade:upper]

-- Lower-case syntax if not ret then if args[grade:lower] == 'yes' then ret = mw.language.getContentLanguage:ucfirst(grade:lower) end end

-- Defaults if not ret then ret = resolveDefaultGrade(args, title) end end return ret end

p._main = function(args, title) title = title or mw.title.getCurrentTitle local out = '' if title.namespace == 10 and title.subpageText == 'class' then out = mw.getCurrentFrame:expandTemplate{title = 'Class mask/doc warning'} end out = out .. (getGrade(args, title) or '') return out end

p.main = function(frame) local getArgs = require('Module:Arguments').getArgs local args = getArgs(frame,{removeBlanks=false, wrappers='Template:Class mask'}) return p._main(args) end

local getclass = function(args) local class = '¬' if args.QUALITY_SCALE == 'inline' then class = args.class elseif args.QUALITY_SCALE == 'subpage' then if mw.title.new(args.BANNER_NAME..'/class').exists then local frame = mw.getCurrentFrame class = frame:expandTemplate{title = args.BANNER_NAME..'/class', args = args} end else args.FQS = (args.QUALITY_SCALE == 'extended') and 'yes' or 'no' args[1] = args.class class = p._main(args) end return class end

p.quality = function(frame) -- used by WPBM to check global quality and compare with local parameter local local_class = getclass(frame.args) local prefix, class = 'Y', local_class if local_class=='¬' then class = '¬' elseif frame.args.QUALITY_CRITERIA ~= 'custom' then -- project uses standard scale and will inherit article class if needed local article_class = frame.args.article_class or readarticleclass -- checks parameter for testing purposes article_class = article_class and p._main{article_class, ignorenamespace=frame.args.ignorenamespace} or '¬' -- normalise if not false if (article_class == '¬') or (article_class == '') then -- article class does not exist, display quality class in project banner as normal elseif (local_class == '') or (local_class == article_class) then -- article class and local class are the same, or local is not specified prefix = 'H' -- hide quality class in project banner class = article_class elseif (article_class == 'NA') and not isarticle(local_class) then -- article class and local class are both non-article classes prefix = 'H'		else -- article class exists and differs from local class prefix = 'X' -- X will indicate to meta banner that classes are different, so trigger a tracking category end end return (frame.args.noprefix and '' or prefix) .. class end

return p