MCDM Wiki
Register
No edit summary
No edit summary
 
(47 intermediate revisions by the same user not shown)
Line 2: Line 2:
   
 
local getArgs -- lazily initialised
 
local getArgs -- lazily initialised
  +
local yesno -- lazily initialised
   
 
local episodeData = mw.loadData( 'Module:EpisodeData' )
 
local episodeData = mw.loadData( 'Module:EpisodeData' )
Line 13: Line 14:
 
-----------------------------------------------------------------------------
 
-----------------------------------------------------------------------------
 
--]]
 
--]]
function getframeargs(frame)
+
local function getframeargs(frame)
 
if not getArgs then
 
if not getArgs then
 
getArgs = require('Module:Arguments').getArgs
 
getArgs = require('Module:Arguments').getArgs
 
end
 
end
args = getArgs(frame)
+
local args = getArgs(frame)
 
 
 
return
 
return
 
args['show'] or args[1],
 
args['show'] or args[1],
 
args['number'] or args[2],
 
args['number'] or args[2],
args ['field'] or args[3]
+
args['field'] or args[3]
 
 
 
end
 
end
Line 34: Line 35:
 
-----------------------------------------------------------------------------
 
-----------------------------------------------------------------------------
 
--]]
 
--]]
function formatDateString(d, formatstring)
+
local function formatDateString(d, formatstring)
 
return os.date(formatstring or "%Y-%m-%d %H:%M PT", d)
 
return os.date(formatstring or "%Y-%m-%d %H:%M PT", d)
 
end
 
end
Line 62: Line 63:
 
-----------------------------------------------------------------------------
 
-----------------------------------------------------------------------------
 
--]]
 
--]]
function formatVodLink(link, s)
+
local function formatVodLink(link, s)
 
if link == nil or link == "" then return s end
 
if link == nil or link == "" then return s end
 
 
Line 83: Line 84:
 
-----------------------------------------------------------------------------
 
-----------------------------------------------------------------------------
 
--]]
 
--]]
function episode_lookup(show, number, field)
+
local function episode_lookup(show, number, field)
   
 
local e = false
 
local e = false
Line 110: Line 111:
 
local show, number, field = getframeargs(frame)
 
local show, number, field = getframeargs(frame)
 
 
result, e = episode_lookup(show, number, field)
+
local result, e = episode_lookup(show, number, field)
 
 
 
if not result and e then
 
if not result and e then
Line 166: Line 167:
 
else
 
else
 
return formatDateString(airdate)
 
return formatDateString(airdate)
  +
end
  +
  +
end
  +
  +
--[[
  +
-----------------------------------------------------------------------------
  +
-- episode_pretty_airdate
  +
arguments: a frame containing arguments show and number or 1 and 2
  +
  +
Returns a nicely-formatted episode airdate using episode metadata from
  +
Module:EpisodeData for the specified show and episode number. If the data
  +
is not found, returns an error string reminding the user to fill out
  +
Module:EpisodeData
  +
-----------------------------------------------------------------------------
  +
--]]
  +
function episode.episode_pretty_airdate (frame)
  +
  +
local show, number = getframeargs(frame)
  +
  +
local airdate, e = episode_lookup(show, number, "airdate")
  +
  +
if not airdate and e then
 
return e
  +
else
  +
return formatDateString(airdate, "%B %d, %Y")
 
end
 
end
 
 
Line 253: Line 279:
 
getArgs = require('Module:Arguments').getArgs
 
getArgs = require('Module:Arguments').getArgs
 
end
 
end
args = getArgs(frame)
+
local args = getArgs(frame)
 
 
show = args['show'] or args[1] or "chain"
+
local show = args['show'] or args[1] or "chain"
  +
local airdate_option = args['airdate'] or args[2] or "yes"
  +
local tactical_option = args['tactical'] or args[3] or "yes"
  +
local diary_option = args['diary'] or args[4] or "yes"
  +
  +
if not yesno then
  +
yesno = require('Module:Yesno')
  +
end
  +
  +
airdate_option = yesno(airdate_option)
  +
tactical_option = yesno(tactical_option)
  +
diary_option = yesno(diary_option)
 
 
 
local e, show_object = pcall(function () return episodeData[show] end)
 
local e, show_object = pcall(function () return episodeData[show] end)
Line 262: Line 299:
 
end
 
end
 
 
headings = {
+
local headings = {
 
"No. in series",
 
"No. in series",
 
"Title",
 
"Title",
"Airdate",
+
"VOD links"
"VOD links",
 
"Tactical Stream",
 
"Campaign Diary"
 
 
}
 
}
  +
  +
if airdate_option then
  +
table.insert(headings, 3, "Airdate")
  +
end
  +
if tactical_option then
  +
table.insert(headings, "Tactical Stream")
  +
end
  +
if diary_option then
  +
table.insert(headings, "Campaign Diary")
  +
end
 
 
 
local root = mw.html.create('table')
 
local root = mw.html.create('table')
Line 283: Line 327:
 
row:tag('td'):wikitext(n)
 
row:tag('td'):wikitext(n)
 
row:tag('td'):wikitext(formatEpisodeNameString(episode_object.name, n))
 
row:tag('td'):wikitext(formatEpisodeNameString(episode_object.name, n))
  +
if airdate_option then
row:tag('td'):wikitext(formatDateString(episode_object.airdate))
+
row:tag('td'):wikitext(formatDateString(episode_object.airdate, "%b %d, %Y"))
  +
end
 
row:tag('td'):wikitext(
 
row:tag('td'):wikitext(
 
formatVodLink(episode_object.twitch_vod, "T")
 
formatVodLink(episode_object.twitch_vod, "T")
Line 289: Line 335:
 
formatVodLink(episode_object.youtube_vod, "Y")
 
formatVodLink(episode_object.youtube_vod, "Y")
 
)
 
)
  +
if tactical_option then
row:tag('td'):wikitext(formatVodLink(episode_object.tactical_vod, "Y"))
 
row:tag('td'):wikitext(formatVodLink(episode_object.campaign_diary, "Y"))
+
if episode_object.tactical_vod then
 
row:tag('td'):wikitext(formatVodLink(episode_object.tactical_vod, "YouTube"))
  +
else
  +
row:tag('td'):wikitext("")
  +
end
  +
end
  +
if diary_option then
  +
if episode_object.campaign_diary then
  +
row:tag('td'):wikitext(formatVodLink(episode_object.campaign_diary, "YouTube"))
  +
else
  +
row:tag('td'):wikitext("")
  +
end
  +
end
 
end
 
end
   
Line 296: Line 354:
 
end
 
end
   
  +
--[[
  +
-----------------------------------------------------------------------------
  +
-- cite_vod
  +
arguments: a frame containing arguments show, number, vod (optional) and timestamp
  +
  +
Returns a citation (reference) for a vod as listed in Module:EpisodeData,
  +
optionally with a timestamp
  +
-----------------------------------------------------------------------------
  +
--]]
 
function episode.cite_vod (frame)
 
function episode.cite_vod (frame)
  +
if not getArgs then
return(mw.text.tag{name = "ref", content = "https://www.youtube.com/watch?v=YU-gTNgiq1M ''Red Sky At Morning'' at 1h15m"})
 
  +
getArgs = require('Module:Arguments').getArgs
  +
end
  +
local args = getArgs(frame)
  +
local show = args['show'] or args[1]
  +
local number = args['number'] or args[2]
  +
local vod = args['vod'] or args[3]
  +
local timestamp = args['timestamp'] or args[4] or nil
  +
  +
local vodlink, e = episode_lookup(show, number, vod)
  +
if not vodlink and e then return e end
  +
  +
local sep = "#"
  +
if vod == "twitch_vod" then sep = "?" end
  +
  +
local episodename = episode.episode_name(frame)
  +
  +
local reference
  +
if timestamp and timestamp ~= "" then
  +
reference = vodlink .. sep .. "t=" .. timestamp .. " " .. episodename .. " at " .. timestamp
  +
else
  +
reference = vodlink .. " " .. episodename
  +
end
  +
return(frame:preprocess("<ref>" .. reference .. "</ref>"))
  +
end
  +
  +
local function wrap_string(s)
  +
if s == "" or s == nil then
  +
return ""
  +
else
  +
return "<default>" .. s .. "</default>"
  +
end
  +
end
  +
  +
local function sidebar_vod_link(vod_link, wrapper)
  +
if vod_link then
  +
return formatVodLink(vod_link, wrapper)
  +
else
  +
return ""
  +
end
  +
end
  +
  +
--[[
  +
-----------------------------------------------------------------------------
  +
-- episode_sidebar
  +
arguments: a frame containing arguments show and number
  +
  +
Returns an infobox for the episode in question
  +
-----------------------------------------------------------------------------
  +
--]]
  +
function episode.episode_sidebar(frame)
  +
local infobox = [[<infobox>
  +
<title>
  +
<default>%s</default>
  +
</title>
  +
<data>
  +
<label>Airdate</label>
  +
%s
  +
</data>
  +
<data>
  +
<label>Run Time</label>
  +
%s
  +
</data>
  +
<group>
  +
<header>Episode Links</header>
  +
<data>
  +
<label>YouTube VOD</label>
  +
%s
  +
</data>
  +
<data>
  +
<label>Twitch VOD</label>
  +
%s
  +
</data>
  +
<data>
 
<label>Tactical Stream</label>
  +
%s
  +
</data>
  +
<data>
 
<label>Campaign Diary</label>
  +
%s
  +
</data>
  +
</group>
  +
<group>
  +
<header>Episode Order</header>
  +
<data>
  +
<label>Previous</label>
  +
%s
  +
</data>
  +
<data>
  +
<label>Next</label>
  +
%s
  +
</data>
  +
</group>
  +
</infobox>]]
  +
  +
if not getArgs then
  +
getArgs = require('Module:Arguments').getArgs
  +
end
  +
local args = getArgs(frame)
  +
  +
local show = args['show'] or args[1] or "chain"
  +
local number = args['number'] or args[2] or 1
  +
  +
local e, episode_object = pcall(function () return episodeData[show]["episodes"][tonumber(number)] end)
  +
  +
if not (e and episode_object) then
  +
return string.format("Something went wrong looking up episode metadata for %s %s. Check [[Module:EpisodeData]] to make sure that the data you asked for is defined. %s : %s", tostring(show), tostring(number), tostring(e), tostring(result))
  +
end
  +
  +
local previous_ep_name, e = episode_lookup(show, tonumber(number)-1, "name")
  +
if not previous_ep_name and e then
  +
previous_ep_name = ""
  +
else
  +
previous_ep_name = "[[" .. previous_ep_name .. "]]"
  +
end
  +
  +
local next_ep_name, e = episode_lookup(show, tonumber(number)+1, "name")
  +
if not next_ep_name and e then
  +
next_ep_name = ""
  +
else
  +
next_ep_name = "[[" .. next_ep_name .. "]]"
  +
end
  +
  +
return frame:preprocess(string.format(
  +
infobox,
  +
episode_object.name or "",
  +
wrap_string(formatDateString(episode_object.airdate)),
  +
wrap_string(episode_object.runtime),
  +
wrap_string(sidebar_vod_link(episode_object.youtube_vod, "Youtube VOD")),
  +
wrap_string(sidebar_vod_link(episode_object.twitch_vod, "Twitch VOD")),
  +
wrap_string(sidebar_vod_link(episode_object.tactical_vod, "Tactical Stream")),
  +
wrap_string(sidebar_vod_link(episode_object.campaign_diary, "Campaign Diary")),
  +
wrap_string(previous_ep_name),
  +
wrap_string(next_ep_name)
  +
))
  +
 
end
 
end
   

Latest revision as of 23:24, 5 June 2019

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

local episode = {}

local getArgs -- lazily initialised
local yesno -- lazily initialised

local episodeData = mw.loadData( 'Module:EpisodeData' )

--[[
-----------------------------------------------------------------------------
-- getframeargs

This function returns the "show" "number" and "field" arguments, which 
are standard across the episode fuctions
-----------------------------------------------------------------------------
--]]
local function getframeargs(frame)
    if not getArgs then
        getArgs = require('Module:Arguments').getArgs
    end
    local args = getArgs(frame)
    
    return 
        args['show'] or args[1], 
        args['number'] or args[2], 
        args['field'] or args[3]
    
end

--[[
-----------------------------------------------------------------------------
-- formatDateString

Formats a date string with the given format, but applies a default if
none is specified
-----------------------------------------------------------------------------
--]]
local function formatDateString(d, formatstring)
    return os.date(formatstring or "%Y-%m-%d %H:%M PT", d) 
end

--[[
-----------------------------------------------------------------------------
-- formatEpisodeNameString

Given an episode name and an episode number, returns them nicely formatted.
-----------------------------------------------------------------------------
--]]
function formatEpisodeNameString(name, number)
    local suffix = mw.html.create('small')
    suffix:wikitext("(Episode " .. number .. ")")

    return "\“'''[[" .. name .. "]]'''\”" .. " " .. tostring(suffix)
end

--[[
-----------------------------------------------------------------------------
-- formatVodLink
arguments: link and s

If link is not specified, returns s as a placeholder text
If link is specified, returns a wikitext link with s as the display text,
if s is present, or with no display text if s is not specified or empty.
-----------------------------------------------------------------------------
--]]
local function formatVodLink(link, s)
    if link == nil or link == "" then return s end
    
    if s == nil or s == "" then
        return "[" .. link .. "]"
    else
        return "[" .. link .. " " .. s .. "]"
    end
end

--[[
-----------------------------------------------------------------------------
-- episode_lookup
arguments: show, number, and field

Returns episode metadata from Module:EpisodeData for the specified show,
number and field. If the data is not found, returns false as its first 
return and an error string reminding the user to fill out Module:EpisodeData
as its second return
-----------------------------------------------------------------------------
--]]
local function episode_lookup(show, number, field)

    local e = false
    local result = nil
    -- Look up the result in the episode data, catching errors
    e, result = pcall(function () return episodeData[show]["episodes"][tonumber(number)][field] end)
    if e and result then
        return result
    else
        return e, string.format("Something went wrong looking up episode metadata for %s %s %s. Check [[Module:EpisodeData]] to make sure that the data you asked for is defined.", tostring(show), tostring(number), tostring(field))
    end
end

--[[
-----------------------------------------------------------------------------
-- episode_metadata
arguments: a frame containing arguments show, number, and field or 1, 2, 3

Returns episode metadata from Module:EpisodeData for the specified show,
number and field. If the data is not found, returns an error string 
reminding the user to fill out Module:EpisodeData
-----------------------------------------------------------------------------
--]]
function episode.episode_metadata (frame)

    local show, number, field = getframeargs(frame)
    
    local result, e = episode_lookup(show, number, field)
    
    if not result and e then
        return e
    else
        return result
    end

end

--[[
-----------------------------------------------------------------------------
-- episode_name
arguments: a frame containing arguments show and number or 1 and 2

Returns a nicely-formatted episode name using episode metadata from 
Module:EpisodeData for the specified show and episode number. If the data 
is not found, returns an error string reminding the user to fill out 
Module:EpisodeData
-----------------------------------------------------------------------------
--]]
function episode.episode_name (frame)
    
    local show, number = getframeargs(frame)

    local name, e = episode_lookup(show, number, "name")

    if not name and e then
        return e
    else 
        return formatEpisodeNameString(name, number)
    end
    
end

--[[
-----------------------------------------------------------------------------
-- episode_airdate
arguments: a frame containing arguments show and number or 1 and 2

Returns a nicely-formatted episode airdate using episode metadata from 
Module:EpisodeData for the specified show and episode number. If the data 
is not found, returns an error string reminding the user to fill out 
Module:EpisodeData
-----------------------------------------------------------------------------
--]]
function episode.episode_airdate (frame)
    
    local show, number = getframeargs(frame)

    local airdate, e = episode_lookup(show, number, "airdate")
    
    if not airdate and e then
        return e
    else
        return formatDateString(airdate)
    end
    
end

--[[
-----------------------------------------------------------------------------
-- episode_pretty_airdate
arguments: a frame containing arguments show and number or 1 and 2

Returns a nicely-formatted episode airdate using episode metadata from 
Module:EpisodeData for the specified show and episode number. If the data 
is not found, returns an error string reminding the user to fill out 
Module:EpisodeData
-----------------------------------------------------------------------------
--]]
function episode.episode_pretty_airdate (frame)
    
    local show, number = getframeargs(frame)

    local airdate, e = episode_lookup(show, number, "airdate")
    
    if not airdate and e then
        return e
    else
        return formatDateString(airdate, "%B %d, %Y")
    end
    
end

--[[
-----------------------------------------------------------------------------
-- episode_vodlinks
arguments: a frame containing arguments show and number or 1 and 2

Returns available vod links for the specified show and episode number.
If no data is found, returns the string "T, Y"
If a twitch_vod or youtube_vod link is found in Module:EpisodeData, T and Y
in the string become links to the videos.
-----------------------------------------------------------------------------
--]]
function episode.episode_vodlinks (frame)
    
    local show, number = getframeargs(frame)

    local twitch_vod, t_e = episode_lookup(show, number, "twitch_vod")
    local youtube_vod, y_e = episode_lookup(show, number, "youtube_vod")
    
    local twitch_string = "T"
    if not (not twitch_vod and t_e) then 
        twitch_string = formatVodLink(twitch_vod, "T")
    end
    
    local yt_string = "Y"
    if not (not youtube_vod and y_e) then 
        yt_string = formatVodLink(youtube_vod, "Y")
    end

    return twitch_string .. ", " .. yt_string
    
end

--[[
-----------------------------------------------------------------------------
-- episode_verbose_vodlinks
arguments: a frame containing arguments show and number or 1 and 2

Returns available vod links for the specified show and episode number.
Returns a HTML object consisting of a list that will be empty if none of
twitch_vod, youtube_vod and campaign_diary are found.
If any of those are found, returns the HTML list with items consisting of
each VOD link found.
-----------------------------------------------------------------------------
--]]
function episode.episode_verbose_vodlinks (frame)
    local show, number = getframeargs(frame)
    
    local twitch_vod, t_e = episode_lookup(show, number, "twitch_vod")
    local youtube_vod, y_e = episode_lookup(show, number, "youtube_vod")
    local tactical_vod, ta_e = episode_lookup(show, number, "tactical_vod")
    local campaign_diary, c_e = episode_lookup(show, number, "campaign_diary")

    local list = mw.html.create("ul")
    
    if twitch_vod and not t_e then 
        list:tag('li'):wikitext(formatVodLink(twitch_vod, "Twitch VOD"))
    end
    if youtube_vod and not y_e then 
        list:tag('li'):wikitext(formatVodLink(youtube_vod, "Youtube VOD"))
    end
    if tactical_vod and not ta_e then 
        list:tag('li'):wikitext(formatVodLink(tactical_vod, "Tactical VOD"))
    end
    if campaign_diary and not c_e then 
        list:tag('li'):wikitext(formatVodLink(campaign_diary, "Campaign Diary"))
    end
    
    return list
    
end

--[[
-----------------------------------------------------------------------------
-- episode_list
arguments: a frame containing argument show or 1

Returns a nicely-formatted episode list for the specified show
-----------------------------------------------------------------------------
--]]
function episode.episode_list (frame)
    if not getArgs then
        getArgs = require('Module:Arguments').getArgs
    end
    local args = getArgs(frame)
    
    local show = args['show'] or args[1] or "chain"
    local airdate_option = args['airdate'] or args[2] or "yes"
    local tactical_option = args['tactical'] or args[3] or "yes"
    local diary_option = args['diary'] or args[4] or "yes"
    
    if not yesno then
        yesno = require('Module:Yesno')
    end
    
    airdate_option = yesno(airdate_option)
    tactical_option = yesno(tactical_option)
    diary_option = yesno(diary_option)
    
    local e, show_object = pcall(function () return episodeData[show] end)
    if (not e and show_object) or not show_object.episodes then
        return string.format("Something went wrong looking up episode metadata for show %s. Check [[Module:EpisodeData]] to make sure that the show you asked for is defined and has a .episodes table.", tostring(show))
    end
    
    local headings = {
        "No. in series",
        "Title",
        "VOD links"
    }
    
    if airdate_option then
        table.insert(headings, 3, "Airdate")
    end
    if tactical_option then
        table.insert(headings, "Tactical Stream")
    end
    if diary_option then
        table.insert(headings, "Campaign Diary")
    end
    
    local root = mw.html.create('table')
    root:addClass('article-table')
            
    local head = root:tag('tr')
    for _,heading_text in ipairs(headings) do
        head:tag('th'):wikitext(heading_text)
    end
    
    for n,episode_object in ipairs(show_object.episodes) do
        local row = root:tag('tr')
        row:tag('td'):wikitext(n)
        row:tag('td'):wikitext(formatEpisodeNameString(episode_object.name, n))
        if airdate_option then
            row:tag('td'):wikitext(formatDateString(episode_object.airdate, "%b %d, %Y"))
        end
        row:tag('td'):wikitext(
            formatVodLink(episode_object.twitch_vod, "T")
            .. ", " ..
            formatVodLink(episode_object.youtube_vod, "Y")
        )
        if tactical_option then
            if episode_object.tactical_vod then
                row:tag('td'):wikitext(formatVodLink(episode_object.tactical_vod, "YouTube"))
            else
                row:tag('td'):wikitext("")
            end
        end
        if diary_option then
            if episode_object.campaign_diary then
                row:tag('td'):wikitext(formatVodLink(episode_object.campaign_diary, "YouTube"))
            else
                row:tag('td'):wikitext("")
            end
        end
    end

    return tostring(root)
end

--[[
-----------------------------------------------------------------------------
-- cite_vod
arguments: a frame containing arguments show, number, vod (optional) and timestamp

Returns a citation (reference) for a vod as listed in Module:EpisodeData, 
optionally with a timestamp
-----------------------------------------------------------------------------
--]]
function episode.cite_vod (frame)
    if not getArgs then
        getArgs = require('Module:Arguments').getArgs
    end
    local args = getArgs(frame)
    local show = args['show'] or args[1]
    local number = args['number'] or args[2]
    local vod = args['vod'] or args[3]
    local timestamp = args['timestamp'] or args[4] or nil
    
    local vodlink, e = episode_lookup(show, number, vod)
    if not vodlink and e then return e end

    local sep = "#"
    if vod == "twitch_vod" then sep = "?" end

    local episodename = episode.episode_name(frame)
    
    local reference
    if timestamp and timestamp ~= "" then
        reference = vodlink .. sep .. "t=" .. timestamp .. " " .. episodename .. " at " .. timestamp
    else 
        reference = vodlink .. " " .. episodename
    end
    return(frame:preprocess("<ref>" .. reference .. "</ref>"))
end

local function wrap_string(s)
    if s == "" or s == nil then 
        return ""
    else
        return "<default>" .. s .. "</default>" 
    end
end

local function sidebar_vod_link(vod_link, wrapper)
    if vod_link then
        return formatVodLink(vod_link, wrapper)
    else
        return ""
    end
end

--[[
-----------------------------------------------------------------------------
-- episode_sidebar
arguments: a frame containing arguments show and number

Returns an infobox for the episode in question
-----------------------------------------------------------------------------
--]]
function episode.episode_sidebar(frame)
   local infobox = [[<infobox>
  <title>
    <default>%s</default>
  </title>
  <data>
    <label>Airdate</label>
    %s
  </data>
  <data>
    <label>Run Time</label>
    %s
  </data>
  <group>
    <header>Episode Links</header>
    <data>
      <label>YouTube VOD</label>
      %s
    </data>
    <data>
      <label>Twitch VOD</label>
      %s
    </data>
    <data>
      <label>Tactical Stream</label>
      %s
    </data>
    <data>
      <label>Campaign Diary</label>
      %s
    </data>
  </group>
  <group>
    <header>Episode Order</header>
    <data>
      <label>Previous</label>
      %s
    </data>
    <data>
      <label>Next</label>
      %s
    </data>
  </group>
</infobox>]]

    if not getArgs then
        getArgs = require('Module:Arguments').getArgs
    end
    local args = getArgs(frame)
    
    local show = args['show'] or args[1] or "chain"
    local number = args['number'] or args[2] or 1
    
    local e, episode_object = pcall(function () return episodeData[show]["episodes"][tonumber(number)] end)

    if not (e and episode_object) then
        return string.format("Something went wrong looking up episode metadata for %s %s. Check [[Module:EpisodeData]] to make sure that the data you asked for is defined. %s : %s", tostring(show), tostring(number), tostring(e), tostring(result))
    end
    
    local previous_ep_name, e = episode_lookup(show, tonumber(number)-1, "name")
    if not previous_ep_name and e then
        previous_ep_name = ""
    else
        previous_ep_name = "[[" .. previous_ep_name .. "]]"
    end
    
    local next_ep_name, e = episode_lookup(show, tonumber(number)+1, "name")
    if not next_ep_name and e then
        next_ep_name = ""
    else
        next_ep_name = "[[" .. next_ep_name .. "]]"
    end

    return frame:preprocess(string.format(
        infobox,
        episode_object.name or "",
        wrap_string(formatDateString(episode_object.airdate)),
        wrap_string(episode_object.runtime),
        wrap_string(sidebar_vod_link(episode_object.youtube_vod, "Youtube VOD")),
        wrap_string(sidebar_vod_link(episode_object.twitch_vod, "Twitch VOD")),
        wrap_string(sidebar_vod_link(episode_object.tactical_vod, "Tactical Stream")),
        wrap_string(sidebar_vod_link(episode_object.campaign_diary, "Campaign Diary")),
        wrap_string(previous_ep_name),
        wrap_string(next_ep_name)
        ))

end

return episode