Module:RandomArticle

local p = {}

L = {} N = {} I = {} D = {} n_items = 0

function DataInsert(link, name, image, desc) table.insert(L, link) table.insert(N, name) table.insert(I, image) table.insert(D, desc) n_items = n_items + 1 end

--====================== DATA INSERT: Syntax: DataInsert("link","name", "image", [=[description]=]) ======================== --if name is the same as link, you can leave it blank --if image is blank, it will be picked automatically from the article --if description is blank, it will be picked automatically from the article --if name or link includes a double quote, it needs to be written as \" so the quote is not interpreted as the end of the name. --for the sake of maintenance, please add entries in alphabetical order

function PopulatePeople --DataInsert("","","",[=[]=]) DataInsert("Aru","","",[=[]=]) DataInsert("AruRu","","",[=[]=]) DataInsert("Cheery","","",[=[]=]) DataInsert("Dchi","","",[=[]=]) DataInsert("Hana","","",[=[]=]) DataInsert("HIRO","","",[=[]=]) DataInsert("HUYU","","",[=[]=]) DataInsert("Mashu","","",[=[]=]) DataInsert("Nanako","","",[=[]=]) DataInsert("NanTu","","",[=[]=]) DataInsert("Natsu","","",[=[]=]) DataInsert("NinMa","","",[=[]=]) DataInsert("NinTi","","",[=[]=]) DataInsert("Nyaryu","","",[=[]=]) DataInsert("Re:A","","",[=[]=]) DataInsert("S3₳RU","","",[=[]=]) DataInsert("Soha","","",[=[]=]) DataInsert("Xii","","",[=[]=]) DataInsert("YUI (15MILK)","YUI","",[=[]=]) DataInsert("Yume","","",[=[]=]) end

function PopulateGroup DataInsert("8YUME","","",[=[]=]) DataInsert("ERISU","","",[=[]=]) DataInsert("HIBANA","","",[=[]=]) DataInsert("Kohi Sekai","","",[=[]=]) DataInsert("Minerva Land","","",[=[]=]) DataInsert("NEKIRU","","",[=[]=]) DataInsert("NEORiYON","","",[=[]=]) DataInsert("Say! Won!","","",[=[]=]) DataInsert("SONOKI","","",[=[]=]) DataInsert("X!DEN†","","",[=[]=]) end

function PopulateAll PopulateMember PopulateGroup end

--================================================ Module functions ================================================

function ParseImage(content) image = nil --searching for images using different patterns until one of them (or none) finds an image --note: [gjpsw][einpv][befg][gp]? is intended to capture the extensions jpg, png, jpeg, webp, gif and svg --pattern 1 --search for image in the infobox field "image" as 	if(image == nil) then imgpattern = 'image%s*=%s*%[%[File:(.-%.[gjpsw][einpv][befg][gp]?)' image = string.match(content, imgpattern) end --pattern 2 --search for image in the infobox field "image" as image.ext if(image == nil) then imgpattern = 'image%s*=%s*(.-%.[gjpsw][einpv][befg][gp]?)' image = string.match(content, imgpattern) end --pattern 3 --search for image anywhere else as [[File:image.ext]] if(image == nil) then imgpattern = '%[%[File:(.-%.[gjpsw][einpv][befg][gp]?)' image = string.match(content, imgpattern) end --pattern 4 --search for image inside a gallery as image.ext if(image == nil) then imgpattern = , )		--removes Concept section marker to include its content in the description, if available		description = description:gsub('==+%s*Concept%s*==+', )		--removes everything below (and including) the first section marker		description = description:gsub('==+.*==+.*', )		--removes multiple linebreaks		description = description:gsub('\n\n+', '\n')		--removes any template in the text		description = description:gsub(, )		--removes 		description = description:gsub('%(%)', '')		--limiting maximum length of description		if(string.len(description) > 290) then			--cropping at 290 characters			description = description:sub(1,290)			--removing last word (possibly cropped) and replacing with "..."			description = description:gsub('%s%S*$', '...')		end	end	return description end

function ParsePage(frame, title) math.randomseed(os.time) index = math.random(n_items) link = L[index] name = N[index] image = I[index] description = D[index] local page = mw.title.new(link) local content = page:getContent --if no name is given, it is the same as link if(name == '') then name = link end --if no image is given, try to get it from the article if(image == '') then if(content == nil) then image = nil else --if article exists, get it from the article content image = ParseImage(content) end end --if no description is given, try to get it from the article if(description == '') then if(content == nil) then description = nil else --if article exists, get it from the article content description = ParseDescription(content, name) end end return BuildOutput(frame, title, link, name, image, description) end

function BuildOutput(frame, title, link, name, image, description) imgsize = '220px' primarycolor = '#ffb2e8' imgbackgroundcolor = '#3c3c3c' titlecolor = '#000000' if(image == nil) then --if no image was found, return empty string. This will be treated in Template:F_aid image = '' end if(description == nil) then --if no description was found, page don't exist. Return error message. description = 'No article found with PAGENAME ' .. link .. '. If you see this message, please contact an admin so it can be fixed.' end --Using Template:F_aid to display collected data return frame:expandTemplate{ title = 'F_aid', args = {title = title, name = name, link = link, description = description, file = image, imgsize = imgsize, primarycolor = primarycolor, imgbackgroundcolor = imgbackgroundcolor, titlecolor = titlecolor }	} end

--frame is an object containing parameters passed to the module and important resources function p.GetGroup(frame) --loading predefined data into tables PopulateGroup if(n_items > 0) then return ParsePage(frame, "Featured Groups") end end

--frame is an object containing parameters passed to the module and important resources function p.GetPeople(frame) --loading predefined data into tables PopulatePeople if(n_items > 0) then return ParsePage(frame, "Featured People") end end

--frame is an object containing parameters passed to the module and important resources function p.GetArticle(frame) --loading predefined data into tables PopulateAll if(n_items > 0) then return ParsePage(frame, "Featured Article") end end return p