Module:Road data/parser
Appearance
![]() | This module is rated as ready for general use. It has reached a mature form and is thought to be relatively bug-free and ready for use wherever appropriate. It is ready to mention on help pages and other Wikipedia resources as an option for new users to learn. To reduce server load and bad output, it should be improved by sandbox testing rather than repeated trial-and-error editing. |
![]() | This module is subject to page protection. It is a highly visible module in use by a very large number of pages, or is substituted very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it is protected from editing. |
![]() | This Lua module is used on approximately 41,000 pages and changes may be widely noticed. Test changes in the module's /sandbox or /testcases subpages, or in your own module sandbox. Consider discussing changes on the talk page before implementing them. |
This module exports the parser
function, which can be used from within Lua to fetch an entry from the appropriate string module. See the comment for the p.parser
function for the function's parameters.
local p = {}
local format = string.format
local gsub = mw.ustring.gsub
local trim = mw.text.trim
local upper = mw.ustring.upper
local prepattern = "%[(%w+)%|(.*)%|(.*)%|(.*)%]"
local pattern = "%%(%w+)%%"
local function parser(formatStr, args)
local function testArgs(test, equals, ifexists, ifnot)
if equals ~= '' then
if args[test] == equals then return ifexists else return ifnot end
else
if args[test] and args[test] ~= '' then return ifexists else return ifnot end
end
end
-- Recursively dig into tables that could be parser hooks or argument tables.
local function formatStrInTable(formatStr)
if type(formatStr) ~= "table" then return formatStr end
local hook = formatStr.hook
if hook then
local hooksModule = require "Module:Road data/parser/hooks"
local hookFunction = hooksModule[hook] or error("Hook '" .. hook .. "' does not exist", 0)
return formatStrInTable(hookFunction(formatStr, args))
else
local arg = args[formatStr.arg or "route"]
return formatStrInTable(formatStr[arg] or formatStr.default)
end
end
formatStr = formatStrInTable(formatStr)
if not formatStr or formatStr == '' then return '' end
local preprocessed = gsub(formatStr, prepattern, testArgs)
local final = gsub(preprocessed, pattern, args)
return trim(final)
end
local function formatString(args, form, part)
local stateCountries = {USA = true, CAN = true}
local state = upper(args.state or '')
local country
if args.country then
country = upper(args.country)
else
local countryModule = mw.loadData("Module:Road data/countrymask")
country = countryModule[state] or 'UNK'
end
local typeArg = args.type
local module
if stateCountries[country] then
module = format("Module:Road data/strings/%s/%s", country, state)
else
module = format("Module:Road data/strings/%s", country)
end
local success, moduleData = pcall(mw.loadData, module)
if not success then return '' end
local typeTable = moduleData[typeArg]
if typeTable then
return part and typeTable[form][part] or typeTable[form]
else
return ''
end
end
local function ifexists(name, form)
local title
if form == 'shield' then
title = mw.title.new(name, 'Media')
else
title = mw.title.new(name, 0)
end
if title.exists then
return name
else
return ''
end
end
function p.parser(passedArgs, form, part)
local args = {state = passedArgs.state, type = passedArgs.type, route = passedArgs.route,
denom = passedArgs.denom, county = passedArgs.county, dab = passedArgs.dab,
country = passedArgs.country, township = passedArgs.township}
local formatStr = formatString(args, form, part)
if not formatStr or formatStr == '' then return nil end
local parsedStr = parser(formatStr, args)
if type(formatStr) == 'table' and formatStr.ifexists then
return ifexists(parsedStr, form)
else
return parsedStr
end
end
return p