Module:Ep/Info

-- 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 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 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(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) 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. -- TO DO: make it so it uses the Module:Ep/Decoder prefix (so it can handle any number of seasons) p.campSeason = function(epCode) local campaign local season local decoder = mw.loadData('Module:Ep/Decoder') prefix, epNum = p.parseCode(epCode) if prefix == 'TMOS' then campaign = 'TM' elseif (not tonumber(prefix) and tonumber(prefix:sub(-1))) then -- this is not flexible for >9 seasons campaign = prefix:sub(1, -2) season = prefix:sub(-1) elseif decoder[prefix] then campaign = prefix end if not campaign then return "Unknown Campaign" end -- Talks Machina 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 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

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

return p