This wiki has had no edits or log actions made within the last 45 days and has been automatically marked as inactive. If you would like to prevent this wiki from being closed, please start showing signs of activity here. If there are no signs of this wiki being used within the next 15 days, this wiki will be closed in accordance to the Dormancy Policy (which all wiki founders accept when requesting a wiki). If this wiki is closed and no one reopens it 135 days from now, this wiki will become eligible for deletion. Note: If you are a bureaucrat, you can go to Special:ManageWiki and uncheck "inactive" yourself.

Module:Ep/Info

From Queen's Court Games
Revision as of 06:56, 1 December 2023 by QueensCourtGames (talk | contribs) (Created page with "-- TO DO: update this so other modules don't need to call Module:Ep/Matcher directly -- TO DO: consider changing so the individual functions can be called directly when invoked (instead of using param) local p = {} -- For templates to use this module. First unnamed arg is the value to be interpreted. function p.ep(frame) local ep = frame.args[1] local title = frame.args['title'] or nil local pagename = frame.args['pagename'] or nil local epNum = frame.args['epnum']...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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

-- TO DO: update this so other modules don't need to call Module:Ep/Matcher directly
-- TO DO: consider changing so the individual functions can be called directly when invoked (instead of using param)

local p = {}

-- For templates to use this module. First unnamed arg is the value to be interpreted.
function p.ep(frame)
	local ep = frame.args[1]
	local title = frame.args['title'] or nil
	local pagename = frame.args['pagename'] or nil
	local epNum = frame.args['epnum'] or nil
	local epCodeFormatted = frame.args['epCodeFormatted'] or nil
	local campaign = frame.args['campaign'] or nil
	local campaignName = frame.args['campaignname'] or nil
	local season = frame.args['season'] or nil
	local seasonName = frame.args['seasonname'] or nil
	local prodCode = frame.args['prodCode'] or nil
	local arcName = frame.args['arcName'] or nil
	local arcNum = frame.args['arcNum'] or nil
	local arcCategory = frame.args['arcCategory'] or nil
	local arcCharacterCategory = frame.args['arcCharacterCategory'] or nil
	local arcPage = frame.args['arcPage'] or nil
	local thumbnail = frame.args['thumbnail'] or nil
	local transcript = frame.args['transcript'] or nil
	local sortkey = frame.args['sortkey'] or nil
	local sortBy = frame.args['sortby'] or 'airdate'
	local epMatcher = require('Module:Ep/Matcher')
	local epCode = epMatcher.matchCode(ep)
	local data = ''
	
	if not isempty(title) then
		data = p.title(epCode)
	elseif not isempty(pagename) then
		data = p.pagename(epCode)
	elseif not isempty(epNum) then
		data = p.epNum(epCode)
	elseif not isempty(epCodeFormatted) then
		data = p.epCodeFormatted(epCode)
	elseif not isempty(campaign) then
		data = p.campaign(epCode)
	elseif not isempty(campaignName) then
		data = p.campaignName(epCode)
	elseif not isempty(season) then
		data = p.season(epCode)
	elseif not isempty(seasonName) then
		data = p.seasonName(epCode)
	elseif not isempty(arcName) then
		data = p.arcName(epCode)
	elseif not isempty(prodCode) then
		data = p.prodCode(epCode)
	elseif not isempty(arcNum) then
		data = p.arcNum(epCode)
	elseif not isempty(arcPage) then
		data = p.arcPage(epCode)
	elseif not isempty(arcCategory) then
		data = p.arcCategory(epCode)
	elseif not isempty(arcCharacterCategory) then
		data = p.arcCharacterCategory(epCode)
	elseif not isempty(sortkey) then
		data = p.calculateSortkey(epCode, sortBy)
	elseif not isempty(thumbnail) then
		data = p.thumbnail(epCode)
	elseif not isempty(transcript) then
		data = p.transcript(epCode)
	else
		data = epCode
	end
	return data
end

-- Functions for querying Module:Ep/Array to get title and/or pagename for output
function p.epInfo(epCode)
	local result

	local epInfos = mw.loadData('Module:Ep/Array')
	
	if epInfos[epCode] == nil then
		result = ""
	else
		result = epInfos[epCode]
	end

	return result

end

p.title = function(epCode)
	return p.epInfo(epCode)['title']
end

p.pagename = function(epCode)
	if p.epInfo(epCode)['pagename'] then
		pagename = p.epInfo(epCode)['pagename']
	else
		pagename = p.title(epCode)
	end
	return pagename
end

-- functions to parse epCode into campaign, season and epnumber, using EPISODE_DECODER

p.parseCode = function(epCode)
	if type(epCode) ~= "string" then
		epCode = epCode.args[1]
		end
	i, j = string.find(epCode,"x")
	prefix, epNum = '', ''
	if i then
		prefix = string.sub(epCode,1,i-1)
		epNum = string.sub(epCode,j+1)
		end
	return prefix, epNum
end

p.epNum = function(epCode)
	-- TM exception; find epNum in pagename
	if p.campaign(epCode) == 'TM' then
		local pagename = p.pagename(epCode)
		epNum = string.match(pagename, "%d+")
	else
		local prefix, epNum = p.parseCode(epCode)
	end
	-- remove leading zeroes
	if epNum then
		epNum = string.format("%d", epNum)
	end
	return epNum
end

-- Parse out shows and (optionally) seasons. Prevents TM from being parsed as having seasons.
p.campSeason = function(epCode)
	local campaign
	local season
	local decoder = mw.loadData('Module:Ep/Decoder')
	
	local prefix, epNum = p.parseCode(epCode)
	
	if prefix == 'TMOS' then
		campaign = 'TM'
	elseif (not tonumber(prefix) and prefix:match("^(.*%D)(%d+)$")) then
		campaign, season = prefix:match("^(.*%D)(%d+)$")
	elseif decoder[prefix] then
		campaign = prefix
	else
		campaign = 'Unknown Campaign'
	end
	
	-- Talks Machina season exception
	if campaign == 'TM' then
		season = ''
	end
	
	return campaign, season
end


p.prefix = function(epCode)
	prefix, epNum = p.parseCode(epCode)
	return prefix
end

p.campaign = function(epCode)
	campaign, season = p.campSeason(epCode)
	return campaign
end

p.campaignName = function(epCode, noItal)
	if not noItal then noItal = false
	end
	
	local campaign = p.campaign(epCode)
	
	if not campaign then
		return "Unknown Campaign"
	end
	
	local decoder = mw.loadData('Module:Ep/Decoder')
	if not decoder[campaign] then return "Unknown Campaign" end
	local campaignName = decoder[campaign]['title']
	
	if decoder[campaign]['italics'] == true and not noItal and campaignName then
		campaignName = "''" .. campaignName .. "''"
	end
	return campaignName
end

p.season = function(epCode)
	campaign, season = p.campSeason(epCode)
	return season
end

-- displays in the infobox "Episode" field before the episode number
p.seasonName = function(epCode)
	local decoder = mw.loadData('Module:Ep/Decoder')
	local campaign, season = p.campSeason(epCode)
	local valid_seasons
	local pagename
	local nameForDisplay
	local italics

	if campaign and decoder[campaign] then
		valid_seasons = decoder[campaign]['seasons'] or nil
	end

	-- if there's no season or the campaign doesn't have seasons, blank
	if isempty(season) or isempty(valid_seasons) then return ''
		
	-- is season valid? if not, blank
	elseif not searchKeys(season, valid_seasons) then return ''
	
	-- get season info from decoder
	else
		nameForDisplay = valid_seasons[season]['name'] or ''
		italics = valid_seasons[season]['italics'] or false
		end

	-- Default display is e.g. "Season 1", other build with season data from decoder
	if isempty(nameForDisplay) then
		nameForDisplay = 'Season ' .. season
	end
	return nameForDisplay
end

-- determine if episode is from a main campaign
p.isCampaign = function(epCode)
    local prefix, epNum = p.parseCode(epCode)
    return tonumber(prefix) and tonumber(epNum)
end

-- format epCode as C[Campaign]E[Episode]
p.prodCode = function(epCode)
    if p.isCampaign(epCode) then
        local prefix, epNum = p.parseCode(epCode)
        return 'C' .. prefix .. 'E' .. string.format("%02d", epNum)
    else
        return nil -- for non-campaign episodes
    end
end

p.arcInfo = function(epCode, arcIndex)
	local campaign = p.campaign(epCode)
	local epNum = tonumber(p.epNum(epCode))
	local decoder = mw.loadData('Module:Ep/Decoder')
	local arc = {}
	
	if decoder[campaign] then
		local arcs = decoder[campaign].arcs
		
		if not isempty(arcs) then
			if not arcIndex then
				for index, arcData in ipairs(arcs) do
					if epNum >= arcData.startEpisode and epNum <= arcData.endEpisode then
						arc = arcData
						break
					end
				end
			else
				local selectedArc = arcs[arcIndex]
				if selectedArc then
					arc = selectedArc
				end
			end
		end
	end
	return arc
end

p.arcNum = function(epCode)
	local arc = p.arcInfo(epCode)
	return arc.arcNum
end

p.arcName = function(epCode)
	local arc = p.arcInfo(epCode)
	return arc.title
end

p.arcPage = function(epCode)
	local campaign = p.campaign(epCode)
	local arc = p.arcInfo(epCode)
	local category = 'Campaign  ' .. campaign .. ' Arc ' .. arc.arcNum .. ': ' .. arc.title
	return category
end

p.arcCategory = function(epCode)
	local arc = p.arcInfo(epCode)
	return 'Category:' .. arc.title .. ' arc'
end

p.arcCharacterCategory = function(epCode)
	local arc = p.arcInfo(epCode)
	local arcName = removeLeadingThe(arc.title)
	return 'Category:Characters in the ' .. arcName .. ' arc'
end

-- get default naming for link to thumbnail
p.thumbnail = function(epCode)
	local thumbnailFile = epCode .. ' Episode Thumb.jpg'
	local campaign = p.campaign(epCode)

	-- Check if thumbnailFile exists, if not, fall back to default
	local title = mw.title.new('File:' .. thumbnailFile)
	if not title or not title.exists then
		if campaign == '3' then
			thumbnailFile = 'Bells Hells logo color.png'
		elseif campaign == 'CO' then
			thumbnailFile = 'Candela Obscura Logo.png'
		end
	end
	return thumbnailFile
end

p.transcript = function(epCode)
	local pagename = p.pagename(epCode)
	local transcript_link = 'Transcript:' .. pagename .. ''
	return transcript_link
end

-- for formatting the episode code
p.epCodeFormatted = function(epCode)
	local campaign = p.campaign(epCode)
	local decoder = mw.loadData('Module:Ep/Decoder')
	local small = mw.html.create('small')
	local formatKey
	local formatted
	
	if campaign ~= 'Unknown Campaign' and decoder[campaign] then
		formatKey = decoder[campaign]['codeFormat']
	end
	
	if formatKey then
		formatted = formatKey:gsub('{campaign}', campaign)
		if p.season(epCode) then
			formatted = formatted:gsub('{season}', p.season(epCode))
		end
		formatted = formatted:gsub('{epNum}', string.format("%02d", p.epNum(epCode)))
	else
		formatted = epCode
	end
	small:wikitext("(" .. formatted .. ")")
	formatted = tostring(small)
	return formatted
end

-- Function to calculate the sortkey for an episode code
p.calculateSortkey = function(epCode, sortBy)
	local epNum = p.epNum(epCode)
	local campaign, season = p.campSeason(epCode)
	if not season then season = "0" end

	-- map of campaign codes to sort values
	local campaignTransform = {
		["1"] = "01",
		["2"] = "02",
		["3"] = "03",
		["OS"] = "05",
		["CO"] = "06",
		["4SD"] = "07",
		["E"] = "08",
		["M"] = "09",
		["TM"] = "10",
		["U"] = "11",
		["Midst"] = "12",
		}

	-- transform campaign code
	if campaignTransform[campaign] then
		campaign = campaignTransform[campaign]
	end

	-- Retrieve the airdate for the episode code from Module:AirdateOrder/Array
	-- Distill airdate to YYYYMMDD
	local airdateOrder = require('Module:AirdateOrder')
	local airdate = airdateOrder.airdate(epCode):gsub("(%d%d%d%d)-(%d%d)-(%d%d).*", "%1%2%3")
	-- Calculate the sortkey based on the specified sorting method
	local sortkey = campaign .. season .. string.format("%04d", epNum)
	if sortBy == "airdate" then
		mw.log(tostring(epCode) .. ' Airdate yes')
		sortkey = airdate .. sortkey
	else mw.log(tostring(epCode) .. " Airdate no")
	end
	return sortkey
end

-- function to remove a leading 'The' at the beginning of a string
function removeLeadingThe(s)
	local result, _ = string.gsub(s, '^The%s*', '', 1)
	return result
end

--function to determine if a string is empty
function isempty(s)
   return s == nil or s == ''
end


return p