Module:Road data/parser
Appearance
Documentation for this module may be created at Module:Road data/parser/doc
local p = {}
local format = mw.ustring.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
if type(formatStr) == 'table' then
local route = args.route
formatStr = formatStr[route] or formatStr.default
end
if 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 formatStringData = mw.loadData("Module:Road data/strings")
local state = upper(args.state or args.province or '')
local country
if args.country then
country = upper(args.country)
else
countryModule = mw.loadData("Module:Road data/countrymask")
country = countryModule[state] or 'UNK'
end
local type = args.type
local typeTable
local countryTable = formatStringData[country] or {}
if state then
local stateTable = countryTable[state]
if stateTable then
typeTable = stateTable[type]
else
typeTable = countryTable[type]
end
else
typeTable = countryTable[type]
end
if typeTable then
return part and typeTable[form][part] or typeTable[form]
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}
local formatStr = formatString(args, form, part)
return (formatStr ~= '') and parser(formatStr, args) or nil
end
return p