Module:Random portal component/sandbox explained

-- This module implements

local p =

local mRandom = require('Module:Random')local currentTitle = mw.title.getCurrentTitle

-- tracking function added by BHG 29/04/2019-- called as subPageTrackingCategories(pages, args.max)local function subPageTrackingCategories(pages, max, header) local retval = ""; local thispagetitle = mw.title.getCurrentTitle.text

-- don't track DYK etc, only selected/featured articles, biogs etc if ((string.find(header, "/[sS]elected")

-1) and (string.find(header, "/[fF]eatured")

-1)) then return retval end -- no tracking unless we are in Portal namespace if (mw.title.getCurrentTitle.nsText ~= "Portal") then return "" end

-- no tracking if this is a subpage if ((mw.ustring.match(thispagetitle, "/") ~= nil) and (thispagetitle ~= "AC/DC")) then return retval end

local maxNum = tonumber(max) local availableSubPageCount = maxNum

-- Check for missing subpages at end of alleged number range while availableSubPageCount > 0 and not mw.title.new(pages.subpage .. '/' .. tostring(availableSubPageCount)).exists do availableSubPageCount = availableSubPageCount - 1 end if availableSubPageCount < maxNum then retval = retval .. "" else -- Check for spurious subpages beyond end of alleged number range while mw.title.new(pages.subpage .. '/' .. tostring(availableSubPageCount + 1)).exists do availableSubPageCount = availableSubPageCount + 1 end if availableSubPageCount > maxNum then retval = retval .. "" end end

-- before categorising, check what type of subpage we are categorising, and if detected, categorise images separately local subpageType = "subpages" -- generic type local subpageName = pages.subpage subpageName = mw.ustring.gsub(subpageName, "^[^/]*/", "") subpageName = mw.ustring.lower(subpageName) if ((mw.ustring.find(subpageName, "picture", 1, true) ~= nil) or (mw.ustring.find(subpageName, "image", 1, true) ~= nil) or (mw.ustring.find(subpageName, "panorama", 1, true) ~= nil)) then subpageType = "image subpages" end if (availableSubPageCount < 2) then retval = retval .. "" elseif (availableSubPageCount <= 5) then retval = retval .. "" elseif (availableSubPageCount <= 10) then retval = retval .. "" elseif (availableSubPageCount <= 15) then retval = retval .. "" elseif (availableSubPageCount <= 20) then retval = retval .. "" elseif (availableSubPageCount <= 25) then retval = retval .. "" elseif (availableSubPageCount <= 30) then retval = retval .. "" elseif (availableSubPageCount <= 40) then retval = retval .. "" elseif (availableSubPageCount <= 50) then retval = retval .. "" else retval = retval .. "" end return retval;endlocal function getRandomNumber(max) -- gets a random integer between 1 and max; max defaults to 1 return mRandom.numberend

local function expandArg(args, key) -- Emulate how unspecified template parameters appear in wikitext. If the -- specified argument exists, its value is returned, and if not the argument -- name is returned inside triple curly braces. local val = args[key] if val then return val else return string.format('', key) endend

local function getPages(args) local pages = pages.root = args.rootpage or currentTitle.prefixedText pages.subpage = pages.root .. '/' .. expandArg(args, 'subpage') local tries = 10 repeat pages.random = pages.subpage .. '/' .. getRandomNumber(args.max) tries = tries - 1 until tries < 1 or mw.title.new(pages.random).exists pages.footer = 'Template:Box-footer' return pagesend

local function tryExpandTemplate(frame, title, args) local success, result = pcall(frame.expandTemplate, frame,) if success then return result else local msg = string.format('The page "%s" does not exist.', title ) if mw.title.getCurrentTitle.namespace

100 then -- is in the portal namespace msg = msg .. '' end return msg endend

local function getHeader(frame, pages, header, template) return tryExpandTemplate(frame, template or pages.root .. '/box-header', )end

local function getRandomSubpageContent(frame, pages) return tryExpandTemplate(frame, pages.random )end

local function getFooter(frame, pages, link) return tryExpandTemplate(frame, pages.footer, )end

function p._main(args, frame) frame = frame or mw.getCurrentFrame local pages = getPages(args)

local ret = ret[#ret + 1] = getHeader(frame, pages, args.header or 'subpage', args.headertemplate) ret[#ret + 1] = getRandomSubpageContent(frame, pages) if not args.footer or not args.footer:find('%S') then ret[#ret + 1] = '