Module:Category Message Templates

From Chill

RJAlvarez (talk) 19:19, 7 June 2021 (UTC)


-- module for message template placed in categories.
local p = {}
local h = require("Module:HF")
local design = require('Module:Design')
local getArgs = require('Dev:Arguments').getArgs


function p.test()
	local basepagename = mw.title.getCurrentTitle().baseText
	local subpagename = mw.title.getCurrentTitle().subpageText
	local root = mw.title.getCurrentTitle().rootText
	local full = mw.title.getCurrentTitle().fullText
	local prefixed = mw.title.getCurrentTitle().prefixedText
	local text = mw.title.getCurrentTitle().text
	
	return 'base='..basepagename..'<br>subpage='..subpagename..'<br>root='..root..'<br>prefixed='..prefixed..'<br>full='..full..'<br>text='..text
end


--------------------------------------------------------------------------------
function p.weight_category(frame)
	local units  = require('Module:Units')	
	local pagename = mw.title.getCurrentTitle().text	
	local function lbs_to_kg(weightLbs)
		return h.round(tonumber(weightLbs) * units['lbs'].kg, 2)
	end
	local i
	local value1
	local value2
	local value3
	local sortname
	local category
	local help = {}
	local output_categories = {'Weight'}
	local output = 'List of characters with '
	
	value1, value2 = string.match(pagename, 'Weight (%d+)%-(%d+) lbs')
	if value1 ~= nil and value2 ~= nil
		then 
			sortname = lbs_to_kg(value1) * 1000
			if value2 == '9'
				then output = output..'weight below 10 lbs ('..lbs_to_kg(10)..' kg)'
				else output = output..'weight between '..value1..' lbs ('..lbs_to_kg(value1)..' kg) and '..value2..' lbs ('..lbs_to_kg(value2)..' kg)'
			end
		else 
			output = output..string.lower(pagename)
			sortname = lbs_to_kg(1000) * 1000
	end
	output = design.span(output..'.').bold
	sortname = ' '..string.rep('0', 10-#tostring(sortname))..sortname
	
	value1 = lbs_to_kg(10)
	category = 'Weight 0-9 lbs ('..value1..' kg)'
	text = '< 10 lbs ('..value1..' kg)'
	table.insert(help, h.LinkToCategory(category, text))
	
	value1 = lbs_to_kg(10)
	value2 = lbs_to_kg(20)
	category = 'Weight 10-19 lbs ('..value1..'-'..value2..' kg)'
	text = '10-19 lbs ('..value1..'-'..value2..' kg)'
	table.insert(help, h.LinkToCategory(category, text))
	
	i = 20
	while i <= 280 do
		value1 = lbs_to_kg(i)
		value2 = lbs_to_kg(i+20)
		text = i..'-'..(i+19)..' lbs ('..value1..'-'..value2..' kg)'
		category = 'Weight '..text
		table.insert(help, h.LinkToCategory(category, text))
		i = i + 20
	end
	
	i = 300
	while i <= 900 do
		value1 = lbs_to_kg(i)
		value2 = lbs_to_kg(i+100)
		text = i..'-'..(i+99)..' lbs ('..value1..'-'..value2..' kg)'
		category = 'Weight '..text
		table.insert(help, h.LinkToCategory(category, text))
		i = i + 100
	end
	
	value1 = lbs_to_kg(1000)
	category = 'Weight above 1000 lbs ('..value1..' kg)'
	text = '> 1000 lbs ('..value1..' kg)'
	table.insert(help, h.LinkToCategory(category, text))

	table.insert(help, h.LinkToCategory('Variable Weight', 'Variable'))

	help = mw.text.listToText(help, ' · ', ' · ')
	help = tostring(mw.html.create('span'):css('font-size', '70%'):wikitext(help))
	
	output = design.messagebox({output..'<br>'..help})

	return output..h.add_categories(output_categories, sortname)
end




--------------------------------------------------------------------------------
function p.height_category(frame)
	local units  = require('Module:Units')	
	local pagename = mw.title.getCurrentTitle().text	
	local function ft_to_m(heightFt)
		return tonumber( string.format("%.2f", tonumber(heightFt) * units['ft'].m) )
	end
	local i
	local j
	local value1
	local value2
	local value3
	local sortname
	local category
	local help = {}
	local output_categories = {'Height'}
	local output = 'List of characters with '
	
	value1, value2 = string.match(pagename, 'Height (%d)%-(%d) ft')
	if value1 ~= nil and value2 ~= nil
		then 
			sortname = ft_to_m(value1) * 1000
			if value2 == '1'
				then output = output..'height below 1 ft. ('..ft_to_m(1)..' m)'
				else output = output..'height between '..value1..' ft. ('..ft_to_m(value1)..' m) and '..value2..' ft. ('..ft_to_m(value2)..' m)'
			end
		else 
			output = output..string.lower(pagename)
			if string.find(pagename, ' above 8 ') ~= nil
				then sortname = ft_to_m(8) * 1000
				elseif string.find (pagename, 'Variable') ~= nil
					then sortname = '9999'
				else
					value1, value2 = string.match(pagename, '(%d+) ft%. (%d+) in')
					sortname = ft_to_m(tonumber(value1) + tonumber(value2)/12) * 1000
			end
	end
	output = design.span(output..'.').bold
	sortname = ' '..string.rep('0', 4-#tostring(sortname))..sortname
	
	value1 = ft_to_m(1)
	category = 'Height 0-1 ft. ('..value1..' m)'
	text = '< 1 ft. ('..value1..' m)'
	table.insert(help, h.LinkToCategory(category, text))
	for i = 1, 4 do
		value1 = ft_to_m(i)
    	value2 = ft_to_m(i+1)
    	text = i..'-'..(i+1)..' ft. ('..value1..'-'..value2..' m)'
    	category = 'Height '..text
    	table.insert(help, h.LinkToCategory(category, text))
    end
    for j = 5, 6 do
    	for i = 0, 11 do
    		value1 = ft_to_m(j + i/12)
    		text = j..' ft. '..i..' in. ('..value1..' m)'
    		category = 'Height '..text
    		table.insert(help, h.LinkToCategory(category, text))
    	end
    end
    
	i = 7
	value1 = ft_to_m(i)
    value2 = ft_to_m(i+1)
    text = i..'-'..(i+1)..' ft. ('..value1..'-'..value2..' m)'
    category = 'Height '..text
    table.insert(help, h.LinkToCategory(category, text))

    value1 = ft_to_m(8)
    category = 'Height above 8 ft. ('..value1..' m)'
    text = '> 8 ft. ('..value1..' m)'
    table.insert(help, h.LinkToCategory(category, text))
    
   	table.insert(help, h.LinkToCategory('Variable Height', 'Variable'))
    
	help = mw.text.listToText(help, ' · ', ' · ')
	help = tostring(mw.html.create('span'):css('font-size', '70%'):wikitext(help))
	
	output = design.messagebox({output..'<br>'..help})
	
	return output..h.add_categories(output_categories, sortname)
end


--------------------------------------------------------------------------------
-- currently not working
function p.chronological_sort(frame)
	local pagename = "Xavier's School for Gifted Youngsters/Appearances" --mw.title.getCurrentTitle().text
	local CS = require('Module:Chronological Sort')
	return design.messagebox({CS.main(frame, pagename)})
end


--------------------------------------------------------------------------------
-- used in Template:Power Grid Category
function p.power_grid_category(frame)
	local description = mw.loadData('Module:Power Grid/Description')
	local args = getArgs (frame)
	local subpageText = mw.title.getCurrentTitle().subpageText
	local baseText = mw.title.getCurrentTitle().baseText
	local rootText = mw.title.getCurrentTitle().rootText
	local i
	local j
	local navigation_types = {}
	local navigation_values = {}
	local value 
	local category
	local output_category = ''
	local output = ''

	for i = 1,6 do
		category = 'Power Grid/'..description[i].label
		table.insert(navigation_types, h.LinkToCategory(category, description[i].label))
	end
	navigation_types = mw.text.listToText(navigation_types, ' · ', ' · ')
	navigation_types = tostring( mw.html.create('span'):css('font-size', '80%'):css('font-family', 'monospace'):wikitext(navigation_types) )
	navigation_types = 'This category is a part of the power ratings presented in official Marvel handbooks.<br>'..navigation_types

	if baseText == rootText
		then
			output_category = h.Category(baseText, subpageText)
			for i = 1,6 do
				if description[i].label == subpageText
					then output = design.span(string.upper(description[i].label)).bold..' — '..description[i].tooltip
				end
			end
			output = navigation_types..'\n----'..output
		else
			for i = 1,6 do
				if description[i].label == string.match(baseText, '/(.+)')
					then
						output = design.span(description[i].label).bold..' — '..description[i].tooltip
						for j = 1,7 do
							category = description[i].values[j].category
							table.insert(navigation_values,  h.LinkToCategory(category, j))
							if category == baseText..'/'..subpageText
								then 
									value = design.span(string.upper(description[i].values[j].tooltip)).bold
									output_category = h.Category(baseText, j)
							end
						end
						navigation_values = mw.text.listToText(navigation_values, ' · ', ' · ')
						output = navigation_types..'\n----'..output..'<br>'..navigation_values..'<br>'..value
				end
			end
	end
	output = design.messagebox({output})

	return output..output_category
end


--------------------------------------------------------------------------------
function p.races_by_location(frame)
	local args = getArgs(frame)
	local pagename = mw.title.getCurrentTitle().baseText
	local page_content = h.get_content(pagename)
	local galaxy = h.get_field_value(page_content, 'Galaxy') 
	local dimension = h.get_field_value(page_content, 'Dimension') 
	local star_system = h.get_field_value(page_content, 'StarSystem') 
	local planet = h.get_field_value(page_content, 'Planet') 
	local page_type = args[1]
	local place = args[2]
	local output_categories = {}
	local output = ''
	
	if (not h.isempty(galaxy) and pagename == galaxy) or (not h.isempty(page_type) and string.lower(page_type) == 'galaxy')
		then
			output = 'galaxy'
			table.insert(output_categories, 'Races by Galaxy')
		elseif (not h.isempty(dimension) and pagename == dimension) or (not h.isempty(page_type) and string.lower(page_type) == 'dimension')
			then
				output = 'dimension'
				table.insert(output_categories, 'Races by Dimension')
		elseif (not h.isempty(star_system) and pagename == star_system) or (not h.isempty(page_type) and string.lower(page_type) == 'star system')
			then
				output = 'star system'
				table.insert(output_categories, 'Races by Star System')
				if not h.isempty(galaxy)
					then table.insert(output_categories, galaxy..'/Races')
					elseif not h.isempty(dimension)
						then table.insert(output_categories, dimension..'/Races')	
					elseif not h.isempty(place)
						then table.insert(output_categories, place..'/Races')
				end
		elseif (not h.isempty(planet) and pagename == planet) or (not h.isempty(page_type) and string.lower(page_type) == 'planet')
			then
				output = 'planet'
				table.insert(output_categories, 'Races by Planet')
				if not h.isempty(star_system)
					then table.insert(output_categories, star_system..'/Races')
					elseif not h.isempty(galaxy)
						then table.insert(output_categories, galaxy..'/Races')
					elseif not h.isempty(dimension)
						then table.insert(output_categories, dimension..'/Races')
					elseif not h.isempty(place)
						then table.insert(output_categories, place..'/Races')
				end
		else table.insert(output_categories, 'Races by Place of Origin')
	end
	
	table.insert(output_categories, pagename)
	output = 'Races which originated from '..h.Link(pagename, pagename)..' '..output..'.'
	output = design.span(output).bold
	output = design.messagebox({output})

	return output..h.add_categories(output_categories, pagename)
end


--------------------------------------------------------------------------------
-- used in:
--		Template:Appearances Category
--		Template:Mentions Category
--		Template:Minor Appearances Category
--		Template:Images Category
--		Template:Quotes
--		Template:Items by User
function p.standard_subcategories_and_subpages(frame)
	local basepagename = mw.title.getCurrentTitle().baseText
	local subpagename = mw.title.getCurrentTitle().subpageText
	local pagetype = getArgs(frame)[1]
	local s
	
	if string.find(basepagename, 'Killed by ') ~= nil
		then s = string.match(basepagename, 'Killed by (.+)')
		else s = basepagename
	end
	
	if h.isempty(pagetype)
		then pagetype = require('Module:PageType').get_page_type(s)
	end
	
	if pagetype == 'Category' and string.find(basepagename, ' Season ') ~= nil
		then pagetype = 'Season'
		elseif h.isempty(pagetype) and not h.in_list({'Appearances', 'Minor Appearances', 'Mentions', 'Invocations', 'Items', 'Quotes', 'Images', 'Gallery'}, subpagename)
			then 
				basepagename = mw.title.getCurrentTitle().text
				pagetype = require('Module:PageType').get_page_type(basepagename)
	end

	if h.in_list({'Comic', 'Volume', 'Episode', 'Season', 'Series', 'Video Game', 'Film', 'Movie'}, pagetype)
		then return p.lua_standard_subcategories_and_subpages2(basepagename, subpagename, pagetype)
		else return p.lua_standard_subcategories_and_subpages(basepagename, subpagename, pagetype)
	end
end

-- for sources - comic issues, episodes, video games, etc.
function p.lua_standard_subcategories_and_subpages2(basepagename, subpagename, pagetype)
	local standard = require('Module:StandardizedName')
	local sortname = standard.name_for_sorting({basepagename})
	local i
	local category
	local list = {}
	local list1 = {'Reprints', 'Images'}
	local list2 = {'Images'}
	local list_of_subpages = {}
	local help = ''
	local info = ''
	local output_categories = {}
	local output = ''
	
	pagetype = pagetype or require('Module:PageType').get_page_type(basepagename)
	if pagetype == 'Category' and string.find(basepagename, ' Season ') ~= nil
		then pagetype = 'Season'
	end
	
	if pagetype == 'Volume' or pagetype == 'Comic'
		then 
			list = list1
			info = standard.lua_get_title_volume_issue(basepagename, 'Vol')
		elseif h.in_list({'Episode', 'Season', 'Series', 'Film', 'Movie'}, pagetype)
			then 
				if subpagename == basepagename
					then list = list2
				end
				if pagetype == 'Episode' or pagetype == 'Season'
					then info = standard.lua_get_title_volume_issue(basepagename, 'Season')
				end
		elseif pagetype == 'Video Game' 
			then list = list2
	end
	
	for i = 1, #list do
		category = basepagename..'/'..list[i]
		if list[i] == 'Images'
			then s = 'files'
			else s = 'subcats'
		end
		if h.pages_in_category(category, s) > 0
			then table.insert(list_of_subpages, h.LinkToCategory(category, list[i]) )
			else table.insert(list_of_subpages, p.nonexistent_page(list[i]) )
		end
	end
	
	if pagetype == 'Video Game'
		then
			category = basepagename..'/Gallery'
			if h.exists(category)
				then table.insert(list_of_subpages, h.Link(category, 'Gallery') )
				else table.insert(list_of_subpages, p.nonexistent_page('Gallery') )
			end
	end
	if not h.isempty(list_of_subpages)
		then
			list_of_subpages = mw.text.listToText(list_of_subpages, ' · ', ' · ')
			list_of_subpages = '<br>'..tostring( mw.html.create('span'):css('font-size', '80%'):css('font-family', 'monospace'):wikitext(list_of_subpages) )
		else list_of_subpages = ''
	end
	
	if h.in_list({'Reprints', 'Images', 'Gallery', 'Seasons'}, subpagename) and subpagename ~= basepagename
		then
			if subpagename == 'Reprints'
				then 
					if pagetype == 'Comic'
						then 
							output = 'List of all known reprints of '..h.Link(basepagename, basepagename)..'.'
							help = '<br>(If you find an issue that is not shown here, please add "'
							help = help..basepagename..'" into "ReprintOf_" field of said issue.)'
							table.insert(output_categories, 'Comic Reprints by Issue')
							table.insert(output_categories, info.noissue..'/Reprints')
						else
							output = 'List of reprints by issue of '..h.Link(basepagename, basepagename)..'.'
							help = '<br>(If you find reprint of an issue from this volume that is not shown here, please add' 
							help = help..' original source into "ReprintOf_" field of said issue.)'
							table.insert(output_categories, 'Comic Reprints by Volume')
					end
				elseif subpagename == 'Images'
					then
						if pagetype == 'Season'
							then output = 'List of all notable images from '..h.Link(info.title..'#Season '..info.volume, basepagename)..'.'
							else output = 'List of all notable images from '..h.Link(basepagename, basepagename)..'.'
						end
						if pagetype == 'Volume'
							then help = '<br>(If you find an image that is not shown here, please add an issue of "'
							elseif pagetype == 'Season' or pagetype == 'Series'
								then help = '<br>(If you find an image that is not shown here, please add an episode of "'
							else help = '<br>(If you find an image that is not shown here, please add "'
						end
						help = help..basepagename..'" into "Source" field of said image.)'
						if pagetype == 'Comic'
							then 
								table.insert(output_categories, 'Comic Images by Issue')
								table.insert(output_categories, info.noissue..'/Images')
							elseif pagetype == 'Volume'
								then table.insert(output_categories, 'Comic Images by Volume')
							elseif pagetype == 'Episode'
								then 
									table.insert(output_categories, 'TV Screenshots by Episode')
									table.insert(output_categories, info.noissue..'/Images')
							elseif pagetype == 'Season'
								then 
									table.insert(output_categories, 'TV Screenshots by Season')
									table.insert(output_categories, info.title..'/Images')
							elseif pagetype == 'Series'
								then table.insert(output_categories, 'TV Screenshots by Series')
							elseif pagetype == 'Video Game'
								then table.insert(output_categories, 'Video Game Screenshots')	
							elseif pagetype == 'Film' or pagetype == 'Movie'  
								then table.insert(output_categories, 'Movie Screenshots by Movie')		
						end
				elseif subpagename == 'Gallery'
					then
						output = 'Gallery of all notable images from '..h.Link(basepagename, basepagename)..'.'
						table.insert(output_categories, pagetype..' Galleries')
			end
		else
			basepagename = mw.title.getCurrentTitle().text
			pagetype = require('Module:PageType').get_page_type(basepagename)
			if pagetype == 'Volume'
				then
					output = 'List of all known comic issues from '..h.Link(basepagename, basepagename)..' volume.'
					help = h.Link('Marvel Database:Comic Template', 'Comic Template')
					help = '<br>(If you find an issue that is not shown here, please add the '..help..' to it.)'
					table.insert(output_categories, 'Comic Categories')
				elseif pagetype == 'Season'
					then
						output = 'List of all known episodes from '..h.Link(info.title..'#Season '..info.volume, basepagename)..'.'
						help = h.Link('Marvel Database:Episode Template', 'Episode Template')
						help = '<br>(If you find an episode that is not shown here, please add the '..help..' to it.)'
						list = {}
						for i = 1, 30 do
							category = info.title..' Season '..i
							if h.exists('Category:'..category)
								then 
									category = h.LinkToCategory(category, 'Season '..i)
									table.insert(list, category)
							end
						end
						if not h.isempty(list)
							then
								list = mw.text.listToText(list, ' · ', ' · ')
								help = help..'<br>'..tostring( mw.html.create('span'):css('font-size', '80%'):css('font-family', 'monospace'):wikitext(list) )
						end
						table.insert(output_categories, 'Seasons')
			end
	end
	if help ~= ''
		then help = tostring(mw.html.create('span'):css('font-size', '80%'):wikitext(help))
	end
	output = design.span(output).bold..help..list_of_subpages
			
	return design.messagebox({output})..h.add_categories(output_categories, sortname)
end


-- for articles - characters, teams, etc.
function p.lua_standard_subcategories_and_subpages(basepagename, subpagename, pagetype)
	local sortname
	local i
	local category
	local list = {'Appearances', 'Minor Appearances', 'Mentions', 'Invocations', 'Items', 'Quotes', 'Images'}
	local list_of_subpages = {}
	local help = ''
	local s
	local killed_by = false
	local output_categories = {}
	local output = ''

	if string.find(basepagename, 'Killed by ') ~= nil
		then 
			basepagename = string.match(basepagename, 'Killed by (.+)')
			killed_by = true
	end
	
	sortname = require('Module:StandardizedName').name_for_sorting({basepagename})
	pagetype = pagetype or require('Module:PageType').get_page_type(basepagename)

	for i = 1, #list do
		category = basepagename..'/'..list[i]
		if list[i] == 'Images'
			then s = 'files'
			else s = 'pages'
		end
		if h.pages_in_category(category, s) > 0
			then table.insert(list_of_subpages, h.LinkToCategory(category, list[i]) )
			else table.insert(list_of_subpages, p.nonexistent_page(list[i]) )
		end
	end
	category = basepagename..'/Gallery'
	if h.exists(category)
		then table.insert(list_of_subpages, h.Link(category, 'Gallery') )
		else table.insert(list_of_subpages, p.nonexistent_page('Gallery') )
	end
	if h.in_list({'Character', 'Team', 'Organization', 'Race'}, pagetype) 
		then
			if killed_by == false
				then category = basepagename
				else category = 'Killed by '..basepagename
			end
			if h.pages_in_category(category, 'pages') > 0
				then table.insert(list_of_subpages, h.LinkToCategory(category, 'Victims') )
				else table.insert(list_of_subpages, p.nonexistent_page('Victims') )
			end
	end
	
	list_of_subpages = mw.text.listToText(list_of_subpages, ' · ', ' · ')
	list_of_subpages = '<br>'..tostring( mw.html.create('span'):css('font-size', '80%'):css('font-family', 'monospace'):wikitext(list_of_subpages) )
			
	if subpagename ~= basepagename
		then
			if h.in_list({'Appearances', 'Minor Appearances', 'Mentions', 'Invocations'}, subpagename)
				then
					output = 'List of all known '..string.lower(subpagename)..' of '..h.Link(basepagename, basepagename)..'.'
					for i = 1,4 do
						if subpagename == list[i]
							then 
								--help = list2[i]
								if list[i] == 'Invocations'
									then 
										table.insert(output_categories, 'Invocations')
										table.insert(output_categories, basepagename..'/Mentions')
									else table.insert(output_categories, pagetype..' '..list[i])
								end
						end
					end
					help = '<br>(If you find a medium that is not shown here, please add "'..basepagename
					help = help..'" to the appearances section with a '..h.Link('Marvel Database: Appearance Tags', 'proper tag')..'.)'
				elseif subpagename == 'Items'
					then
						output = 'List of all notable items owned and/or used by '..h.Link(basepagename, basepagename)..'.'
						help = '<br>(If you find an item that is not shown here, please add "'..basepagename
						help = help..'" to the "CurrentOwner" or "PreviousOwners" sections.)'
						table.insert(output_categories, 'Items by User')
				elseif subpagename == 'Quotes'
					then
						output = 'List of all notable quotes by or about '..h.Link(basepagename, basepagename)..'.'
						help = '<br>(Please add any important quotations that may be missing, ensuring to cite the original source. '
						help = help..'Pages with a quote from this character will automatically be added here along with the quote.)'
						table.insert(output_categories, 'Quotes')
				elseif subpagename == 'Images'
					then
						output = 'List of all images of '..h.Link(basepagename, basepagename)..' on the database.'
						help = '<br>(If you find an image in the database that is not shown here, please add "'..basepagename..'" as an image subject.)'
						table.insert(output_categories, pagetype..' Images')
				elseif subpagename == 'Gallery'
					then
						output = 'Gallery of all notable images '
						if pagetype == 'Marvel Staff' or pagetype == 'User Art'
							then output = output..'by '
							else output = output..'of '
						end
						if pagetype == 'User Art'
							then output = output..h.Link('User:'..basepagename, 'User:'..basepagename)
							else output = output..h.Link(basepagename, basepagename)
						end
						output = output..' on the database.'
						table.insert(output_categories, pagetype..' Galleries')
				elseif killed_by == true
					then
						output = 'List of all notable victims killed by '..h.Link(basepagename, basepagename)..'.'
						help = '<br>(If you find a character that is not shown here, please add "'..basepagename
						help = help..'" to the "KilledBy" field.)'
						table.insert(output_categories, 'Characters by Killer')
			end
			if ( pagetype ~= 'User Art' and not h.exists(basepagename) ) or ( pagetype == 'User Art' and not h.exists('User:'..basepagename) )
				then 
					output_categories = {} -- remove all previous categories
					table.insert(output_categories, subpagename..'  Categories with Articles Needed')
			end
	end
	if help ~= ''
		then help = tostring(mw.html.create('span'):css('font-size', '80%'):wikitext(help))
	end
	output = design.span(output).bold..help..list_of_subpages
			
	return design.messagebox({output})..h.add_categories(output_categories, sortname)
end


--------------------------------------------------------------------------------
-- used in Template:Reality Category
function p.categories_by_reality(frame)
	local page_types = {'Character', 'Item', 'Location', 'Organization', 'Race', 'Team', 'Vehicle'}
	local basepagename = mw.title.getCurrentTitle().baseText
	local subpagename = mw.title.getCurrentTitle().subpageText
	local sortname = require('Module:Reality').get_reality_info({basepagename}).padded_number
	local i
	local category
	local list_of_subpages = {}
	local help = ''
	local output_categories = {}
	local output = ''
	
	if string.find(basepagename, ' by Reality') ~= nil
		then 
			for i = 1, #page_types do
				category = page_types[i]..'s by Reality'
				table.insert(list_of_subpages, h.LinkToCategory(category, page_types[i]..'s') )
			end
			list_of_subpages = mw.text.listToText(list_of_subpages, ' · ', ' · ')
		else
			for i = 1, #page_types do
				category = basepagename..'/'..page_types[i]..'s'
				if h.pages_in_category(category) > 0
					then table.insert(list_of_subpages, h.LinkToCategory(category, page_types[i]..'s') )
					else table.insert(list_of_subpages, p.nonexistent_page(page_types[i]..'s') )
				end
			end
			list_of_subpages = mw.text.listToText(list_of_subpages, ' · ', ' · ')
			list_of_subpages = '<br>'..tostring( mw.html.create('span'):css('font-size', '80%'):css('font-family', 'monospace'):wikitext(list_of_subpages) )
	end
	
	if subpagename == basepagename
		then
			if string.find(basepagename, ' by Reality') ~= nil
				then 
					category = string.match(basepagename, '(.+) by Reality')
					table.insert(output_categories, category)
				else
					output = 'Articles related to '..h.Link(basepagename, basepagename)..' reality.'
					table.insert(output_categories, 'Realities by Category')
			end
		else
			output = subpagename..' that originate from '..h.Link(basepagename, basepagename)..' reality.'
			table.insert(output_categories, subpagename..' by Reality')
			table.insert(output_categories, {basepagename, subpagename})
			help = '<br>(To add '..string.lower(string.sub(subpagename, 1, -1))..' to this list enter "'..basepagename..'" in the "Universe" field of its template.)'
			help = tostring(mw.html.create('span'):css('font-size', '80%'):wikitext(help))
	end
	output = design.span(output).bold..help..list_of_subpages
	
	return design.messagebox({output})..h.add_categories(output_categories, sortname)
end


--------------------------------------------------------------------------------
-- used in Template:Year of Debut Category
function p.debut_category(frame)
	local page_types = {'Character', 'Item', 'Location', 'Organization', 'Race', 'Reality', 'Team', 'Vehicle'}
	local page_types2 = {'Characters', 'Items', 'Locations', 'Organizations', 'Races', 'Realities', 'Teams', 'Vehicles'}
	local pagename = mw.title.getCurrentTitle().text
	local page_type
	local page_type2
	local year
	local i
	local category
	local help = {}
	local output_categories = {}
	local output = ''
	
	year, page_type = string.match(pagename, '^(%d%d%d%d) (.+) Debuts')
	if page_type == nil
		then
			page_type2 = string.match(pagename, '^(.+)s by Year of Debut')
			if page_type2 == 'Realitie'
				then page_type = 'Reality'
				else page_type = page_type2
			end
			output = p.debut_categories_navigation(page_type)
			table.insert(output_categories, page_type2..'s')
		else
			for i = 1, #page_types do
				if page_types[i] == page_type
					then page_type2 = page_types2[i]
				end
				category = year..' '..page_types[i]..' Debuts'
				if h.pages_in_category(category)>0
					then table.insert(help, h.LinkToCategory(category, page_types2[i]))
					else table.insert(help, p.nonexistent_page(page_types2[i]))
				end
			end
			help = mw.text.listToText(help, ' · ', ' · ')
			help = tostring(mw.html.create('span'):css('font-size', '80%'):wikitext(help))
			table.insert(output_categories, page_type2..' by Year of Debut')
			table.insert(output_categories, {year, page_type..' Debuts'})

			output = design.span(page_type2..' which first appeared in medium released in '..h.LinkToCategory(year, year)..'.').bold
			output = output..'<br>'..help
			output = design.messagebox({output})..p.debut_categories_navigation(page_type)
	end
	
	return output..h.add_categories(output_categories)
end


function p.debut_categories_navigation(page_type)
	local page_types = {'Character', 'Item', 'Location', 'Organization', 'Race', 'Reality', 'Team', 'Vehicle'}
	local page_types2 = {'Characters', 'Items', 'Locations', 'Organizations', 'Races', 'Realities', 'Teams', 'Vehicles'}
	local current_year = tonumber(mw.language.new('en'):formatDate('Y'))
	local header
	local i
	local category
	local help = {}
	local output = {}

	for i = 1939, current_year do
		category = i..' '..page_type..' Debuts'
		if h.pages_in_category(category)>0
			then table.insert(output, h.LinkToCategory(category, i))
			else table.insert(output, p.nonexistent_page(i))
		end
	end
	
	output = mw.text.listToText(output, ' ', ' ')
	output = mw.html.create('div'):css('font-family', 'monospace'):wikitext(output)
	for i = 1, #page_types do
		category = page_types2[i]..' by Year of Debut'
		table.insert(help, h.LinkToCategory(category, page_types2[i]))
		if page_type == page_types[i]
			then page_type = page_types2[i]
		end
	end
	help = mw.text.listToText(help, ' · ', ' · ')
	help = tostring(mw.html.create('span'):css('font-size', '80%'):wikitext(help))
	header = design.span(page_type..' by year of their first appearance.').bold
	output = header..'<br>'..help..'\n----\n'..tostring(output)
	return design.messagebox({output})
end


--------------------------------------------------------------------------------
function p.nonexistent_page(text)
	return tostring( mw.html.create('span'):css('color', 'silver'):wikitext(text))
end

return p