Module:PTV route/sandbox explained

require('strict')

local data = mw.loadData('Module:PTV route/data')local p =

local INVALID_ROUTE_CATEGORY = 'PTV route templates with invalid routes'

local function makeExternalLink(url, display) -- Make an external link, given a URL and an optional display string. if display then return string.format('[%s %s]', url, display) else return string.format('[%s]', url) endend

local function makePtvUrl(routeData) -- Generate the URL for a PTV route page. return 'https://www.ptv.vic.gov.au/route/' .. routeData.pageend

local function makeDisplayText(args, routeData) -- Make the display text for a link to a PTV route page. if args.display

'num' or args.display

'number' or args.numtext then return args.route elseif args.display

'desc' or args.display

'description' or args.deftext then return routeData.text else return args.text endend

local function getRouteData(mode, route) -- Get the route data for a route from the data module. if not route then return nil end mode = mode or 'bus' local modeData = data[mode] if not modeData then return nil end return modeData[route]end

local function makePtvLink(args, routeData) -- Make a link to a PTV route page. local url = makePtvUrl(routeData) local display = makeDisplayText(args, routeData) return makeExternalLink(url, display)end

local function makePtvCitation(args, routeData) -- Make a citation for a PTV route page. local title if args.route

routeData.text then title = routeData.text else title = string.format('%s %s', args.route, routeData.text) end local citeArgs = for _, field in ipairs do citeArgs[field] = args[field] end return mw.getCurrentFrame:expandTemplateend

local function normalizeArguments(args) -- Normalize the arguments that we received. -- First, make a copy of the table so we don't alter our caller's data. local ret = for key, value in pairs(args) do ret[key] = value end -- Set aliases ret.route = ret.route or ret[1] return retend

local function makeCategoryLink(category) -- Make a category wikilink. return string.format('', category)end

local function renderTrackingCategory(category) -- Render a tracking category, if the current page is in mainspace. if mw.title.getCurrentTitle.namespace

0 then return makeCategoryLink(category) else return endend

local function renderPtvTemplate(args, renderFunc) -- Render the output of a PTV template, given a table of arguments and a -- function to render the template from the arguments and route data. args = normalizeArguments(args) local routeData = getRouteData(args.mode, args.route) if routeData then return renderFunc(args, routeData) else return renderTrackingCategory(INVALID_ROUTE_CATEGORY) endend

function p._main(args) -- Generate a link to a Public Transport Victoria route. return renderPtvTemplate(args, makePtvLink)end

function p._cite(args) -- Generate a citation for a Public Transport Victoria route. return renderPtvTemplate(args, makePtvCitation)end

local function makeInvokableFunction(func, wrappers) -- Make a function that can be accessed with #invoke. return function (frame) local args = require('Module:Arguments').getArgs(frame,) return func(args) endend

p.main = makeInvokableFunction(p._main, 'Template:PTV route')p.cite = makeInvokableFunction(p._cite, 'Template:Cite PTV route')

return p