Documentation for this module may be created at Module:StandardizedName/doc

local p = {}
local h = require("Module:HF")
local getArgs = require('Dev:Arguments').getArgs
---- //*** Functions for transforming pagenames of comics/episodes into desirable format ***// ----

--------------------------------------------------------------------------------------------------
-- returns transformed issue/episode number that can be used for sorting in categories as numbers, instead of text, including "point one" issues and "-1"/"negative" issues
function p.lua_padded_issue(issue)
	local minus = '5'
	local point_one = '00'
	local i = ''
	local j = ''
	local output = ''
	local s1 = ''
	local s2 = ''
	
	if not h.isempty(issue)
		then
			if issue == '½'
				then issue = '0.5'
			end
			
			s1, s2 = string.match( string.lower(issue), '(%d+)(%l)')--'(%d+)(%D+)')
			if not h.isempty( s2 ) --and s2 ~= '.'
				then issue = s1..'.'..s2
			end
			
			if string.match(issue, '^%-*%d', 1) ~= nil --check if issue starts with number (including negative numbers like -1)
				then
					-- -1 issues
					j = string.find(issue,"-",1,true)
					if not h.isempty(j)
						then
							i = string.sub(issue,2,#issue)
							j = string.find(i,".",1,true)
							if not h.isempty(j) 
								then minus = 5 - #string.sub(i,1,j-1)
								else minus = 5 - #i
							end
						else
							i = issue
					end
	
					-- point one issues
					j = string.find(i,".",1,true) 
					if not h.isempty(j)
						then
							point_one = string.sub(i,j+1,#i)
							if tonumber(point_one) == nil
								then point_one = '99' -- for issues with letters after . instead of just numbers (for example, Amazing Spider-Man Vol 5 #16.HU)
							end
							point_one = string.rep("0", 2-#point_one)..point_one
							i = string.sub(i,1,j-1)
					end
	
					output = minus..string.rep("0", 6-#i)..i..point_one
				else -- issue is not a number
					output = issue --'999999999'
			end
	end
	
	return output
end


--------------------------------------------------------------------------------------------------
-- returns transformed volume/season number that can be used for sorting in categories as numbers, instead of text
function p.lua_padded_volume(volume)
	local output = ''
	
	if not h.isempty(volume)
		then output = string.rep("0", 6-#volume)..volume
	end
	
	return output
end


--------------------------------------------------------------------------------------------------
-- returns transformed title, with replaced characters like ":" or "/" that can be used for names of files (for example, covers)
function p.lua_title_for_files(title)
	local output = title
	
	output = string.gsub(output,'/',' ')
	output = string.gsub(output,':','')
	output = string.gsub(output,'&','&')
	output = string.gsub(output,''',"'") 

	return output
end


--------------------------------------------------------------------------------------------------
-- break down pagename of comics/episodes into parts - title, volume/season, issue/episode. 
---- Also returns transformed volume/season number and issue/episode number that can be used for sorting in categories as numbers, instead of text, including "point one" issues and "-1"/"negative" issues
---- Also returns transformed title, with replaced characters like ":" or "/" that can be used for names of files (for example, covers)
function p.lua_get_title_volume_issue(pagename, pagetype)
	local title = ''
	local volume = ''
	local issue = ''
	local padded_issue = ''
	local padded_volume = ''
	local title_for_files = ''
	local remainder_issue = ''
	local clean_issue = ''
	local j
	local k
	
	if h.isempty(pagetype)
		then pagetype = 'Vol'
	end
	
	j,k = string.find(pagename, ' '..pagetype..' %d+ ')
	if not h.isempty(j)
		then
			title = string.sub(pagename, 1, j-1)
			issue = string.gsub(string.sub(pagename, k+1, #pagename), '#', '')
			j,k,volume = string.find(pagename, ' '..pagetype..' (%d+) ')
		else
			j,k = string.find(pagename, ' #')
			if h.isempty(j)
				then
					j,k = string.find(pagename, ' '..pagetype..' %d+')
					if not h.isempty(j)
						then
							title = string.sub(pagename, 1, j-1)
							volume = string.sub(pagename, j+#pagetype+2, k)
						else return ''
					end
				else
					title = string.sub(pagename, 1, j-1)
					issue = string.sub(pagename, k+1, #pagename)
					volume = '1'
			end
	end
	
	if not h.isempty(issue) and tonumber(issue) == nil
		then clean_issue, remainder_issue = string.match(issue, '(%d+)(%D+)')
	end

	padded_volume = p.lua_padded_volume(volume)
	padded_issue = p.lua_padded_issue(issue)
	title_for_files = p.lua_title_for_files(title)
	return {  ['title'] = title, 
			  ['volume'] = volume,
			  ['issue'] = issue,
			  ['clean_issue'] = clean_issue or '',
			  ['remainder_issue'] = remainder_issue or '',
			  ['padded_volume'] = padded_volume,
			  ['padded_issue'] = padded_issue,
			  ['title_for_files'] = title_for_files,
			  ['filename'] = {
				  ['title'] = title_for_files,
				  ['noissue'] = title_for_files..' '..pagetype..' '..volume,
				  ['all'] = title_for_files..' '..pagetype..' '..volume..' '..issue,
			  },
			  ['sortname'] = {
				  ['title'] = p.lua_remove_the(title),
				  ['noissue'] = p.lua_remove_the(title)..' '..pagetype..' '..padded_volume,
				  ['all'] = p.lua_remove_the(title)..' '..pagetype..' '..padded_volume..' '.. padded_issue,
			  },
			  ['noissue'] = title..' '..pagetype..' '..volume,
			  ['all'] = title..' '..pagetype..' '..volume..' '..issue,
			}
end


--------------------------------------------------------------------------------------------------
-- removes "The " from the start of pagename
function p.lua_remove_the(pagename)
	if not h.isempty(pagename) and string.lower( string.sub(pagename, 1, 4) ) == 'the '
		then pagename = string.sub(pagename, 5, #pagename)
	end
	return pagename
end


function p.remove_the(frame)
	local args = getArgs(frame)
	return p.lua_remove_the(args[1])
end


--------------------------------------------------------------------------------------------------
-- automatic standardization of comics names
function p.lua_standardized_comics_name(pagename)
	local info = {}
	local output = pagename

	if not h.isempty(pagename)
		then 
			info = p.lua_get_title_volume_issue(pagename, 'Vol')
			if not h.isempty(info.title)
				then output = info.all
			end
	end
	
	return output
end


function p.standardized_comics_name(frame)
	local args = getArgs(frame)
	return p.lua_standardized_comics_name(args[1])
end


--------------------------------------------------------------------------------------------------
-- automatic standardization of episodes names
function p.lua_standardized_episode_name(pagename)
	local info = {}
	local output = pagename

	if not h.isempty(pagename)
		then 
			info = p.lua_get_title_volume_issue(pagename, 'Season')
			if not h.isempty(info.title)
				then output = info.all
			end
	end
	
	return output
end


function p.standardized_episode_name(frame)
	local args = getArgs(frame)
	return p.lua_standardized_episode_name(args[1])
end


--------------------------------------------------------------------------------------------------
-- returns link after standardization of its name
function p.lua_standardized_link(pagename, pagetype, text)
	local design = require("Module:Design")
	local link = ''
	local issue = ''
	local s1
	local s2
	local info = {}
	local output = ''
	
	if not h.isempty(pagename)
		then
			if string.find(pagename, '%]%].+') ~= nil
				then return pagename
				else pagename = h.break_link(pagename, 1)
			end
			if not h.isempty(pagetype)
				then
					if pagetype == 'Comic' or pagetype == 'Episode'
						then
							if pagetype == 'Comic'
								then pagetype = 'Vol'
								else pagetype = 'Season'
							end
	
							info = p.lua_get_title_volume_issue(pagename,pagetype)
							if not h.isempty(info.title)
								then
									if not h.isempty(info.issue)
										then 
											link = info.noissue..' '..info.issue
											s1, s2 = string.match(info.issue, '(%d+): (.+)')
											if h.isempty(s2)
												then issue = ' #'..info.issue
												else issue = design.span(': '..s2).italic
											end
										else
											link = info.noissue
											issue = ''
									end
									if h.isempty(text)
										then 
											if info.volume == '1'
												then text = design.span(info.title).italic .. issue
												else text = design.span(info.noissue).italic .. issue
											end
									end
									output = h.Link(link, text)
							end
						elseif pagetype == 'Film' or pagetype == 'Video Game'
							then
								link = pagename
								text = string.gsub(pagename, ' %(.+%)', '')
								output = h.Link(link, design.span(text).italic)
						else output = h.Link(pagename)
					end
				else output = h.Link(pagename)
			end
	end
	
	return output
end


--------------------------------------------------------------------------------------------------
function p.comics_link(frame)
	local args = getArgs(frame)
	return p.lua_standardized_link(args[1], 'Comic', args[2])
end


--------------------------------------------------------------------------------------------------
function p.game_link(frame)
	local args = getArgs(frame)
	return p.lua_standardized_link(args[1], 'Video Game', args[2])
end


--------------------------------------------------------------------------------------------------
function p.game_link_and_date(frame)
	local args = getArgs(frame)
	local page = args[1]
	local s_date = args[2]
	local output = ''
	
	if not h.isempty(page)
		then
			if h.isempty(s_date)
				then s_date = h.get_field_value( h.get_content(page), 'Release Date' )
			end
			
			if not h.isempty(s_date)
				then s_date = '('..s_date..')'
			end

			output = p.lua_standardized_link(page, 'Video Game')..'<br />'..s_date
	end
	
	return output
end


--------------------------------------------------------------------------------------------------
-- returns name transformed into format for sorting 
---- removes "The" from the begining
---- for comics/episodes changes volume/season and issue/episode into numbers, instead of text
function p.lua_standardized_name_for_sorting(pagename,pagetype)
	local info = {}
	local output = ''

	if not h.isempty(pagename) and not h.isempty(pagetype)
		then
			if pagetype == 'Comic' or pagetype == 'Episode'
				then
					if pagetype == 'Comic'
						then pagetype = 'Vol'
						else pagetype = 'Season'
					end
					info = p.lua_get_title_volume_issue(pagename,pagetype)
					if not h.isempty(info.title)
						then output = info.sortname.all
					end
				elseif pagetype == 'Film' or pagetype == 'Video Game'
					then output = p.lua_remove_the(pagename)
			end
	end
	
	return output
end


function p.comics_name_for_sorting(frame)
	local args = getArgs(frame)
	return p.lua_standardized_name_for_sorting(args[1], 'Comic')
end


--------------------------------------------------------------------------------------------------
function p.lua_get_part(pagename,pagetype,part)
	local output = ''
	local info = {}
	
	if not h.isempty(pagename) and not h.isempty(pagetype)
		then 
			if pagetype == 'Comic' or pagetype == 'Episode'
				then
					if pagetype == 'Comic'
						then pagetype = 'Vol'
						else pagetype = 'Season'
					end
					
					info = p.lua_get_title_volume_issue(pagename,pagetype)
					if not h.isempty(title)
						then 
							if part == 'Title'
								then output = info.title
								elseif part == 'Volume'
									then output = info.volume
									elseif part == 'Issue'
										then output = info.issue
							end
					end
			end
	end
	
	return output
end


function p.get_part(frame)
	local args = getArgs(frame)
	return p.lua_get_part(args[1], args[2], args[3])
end


function p.get_title_and_volume(frame)
	local args = getArgs(frame)
	local pagename = args[1]
	local info = {}
	local output = ''
	
	if not h.isempty(pagename)
		then 
			info = p.lua_get_title_volume_issue(pagename, 'Vol')
			output = info.title .. ' Vol ' .. info.volume
	end
	
	return output
end


--------------------------------------------------------------------------------------------------
function p.lua_cid(pagename)
	local m_date = require("Module:Date")
	local design = require("Module:Design")
	local release_date = ''
	local month = ''
	local year = ''
	local page_content = ''
	local info
	local link
	local div = mw.html.create( 'div' ):attr( 'align', 'center' ):done()
	local output = ''
	
	if not h.isempty(pagename)
		then
			output = p.lua_standardized_link(pagename, 'Comic')
			output = design.span(output).bold
			page_content = h.get_content(p.lua_get_title_volume_issue(pagename, 'Vol').all)
			release_date = h.get_field_value(page_content, 'ReleaseDate')
			if not h.isempty(release_date)
				then
					info = m_date.lua_get_release_date_info(release_date)
					link = h.Link(info.week.text, info.no_day)
				else
					month = h.get_field_value(page_content, 'Month')
					year = h.get_field_value(page_content, 'Year')
					info = m_date.lua_get_publication_date_info(year, month, false)
					link = string.gsub(info.link, '%]%], %[%[:Category:%d+|', ', ')
			end

			if not h.isempty(link)
				then output = output..'<br>('..link..')'
			end

			output = tostring( div:wikitext(output) )
	end

	return output
end


function p.cid(frame)
	local args = getArgs(frame)
	return p.lua_cid(args[1])
end


--------------------------------------------------------------------------------------------------
function p.lua_get_release_date(pagename, pagetype)
	local m_date = require("Module:Date")
	local page_content = ''
	local release_date = ''
	local year = ''
	local month = ''
	local day = ''
	local output = ''

	if not h.isempty(pagename)
		then
			if h.isempty(pagetype)
				then pagetype = require("Module:PageType").get_page_type(pagename)
			end
			page_content = h.get_content(pagename)
			if page_content ~= ''
				then
					if pagetype == 'Comic'
						then
							release_date = h.get_field_value(page_content, 'ReleaseDate')
							if not h.isempty(release_date)
								then
									info = m_date.lua_get_release_date_info(release_date)
									output = h.Link(info.week.text, info.no_day)
								else
									month = h.get_field_value(page_content, 'Month')
									year = h.get_field_value(page_content, 'Year')
									info = m_date.lua_get_publication_date_info(year, month, false)
									output = string.gsub(info.link, '%]%], %[%[:Category:%d+|', ', ')
							end
						elseif pagetype == 'Episode'
							then 
								year = h.get_field_value(page_content, 'Year')
								month = h.get_field_value(page_content, 'Month')
								day = h.get_field_value(page_content, 'Day')
								if not h.isempty(year) and not h.isempty(month) and not h.isempty(day)
									then 
										month = m_date.get_month_name({month})
										output = h.LinkToCategory(year..', '..month, month..' '..day..', '..year)
								end
						elseif pagetype == 'Film' or pagetype == 'Video Game'
							then output = h.get_field_value(page_content, 'Release Date')
					end
			end
	end
	
	return output
end


--------------------------------------------------------------------------------------------------
function p.lua_get_link_and_release_date(pagename)
	local pagetype
	local release_date
	local output = ''
	
	if not h.isempty(pagename)
		then
			pagetype = require("Module:PageType").get_page_type(pagename)
			output = p.lua_standardized_link(pagename, pagetype)
			release_date = p.lua_get_release_date(pagename, pagetype)
			if not h.isempty(release_date)
				then output = output..'<br>('..release_date..')'
			end
	end
	
	return output
end


return p
Community content is available under CC-BY-SA unless otherwise noted.