Module:Road data/parser
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, form)
local function ifexists(name)
if name == '' then return false end
local title
if form == 'shield' then
title = mw.title.new(name, 'Media')
else
title = mw.title.new(name, 0)
end
return title.exists
end
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
local formatTable = {}
-- Recursively dig into tables that could be parser hooks or argument tables.
local function formatStrInTable(formatStr)
if type(formatStr) ~= "table" then return formatStr end
formatTable = formatStr
local hook = formatStr.hook
local both = formatStr[2]
if both then
local first = formatStrInTable(formatStr[1])
local second = formatStrInTable(both)
return {first, second}
elseif 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
local function parse(formatStr)
local preprocessed = gsub(formatStr, prepattern, testArgs)
local parsedStr = gsub(preprocessed, pattern, args)
local final = trim(parsedStr)
if formatTable.ifexists then
local exists = ifexists(final)
if exists then
return final
else
return parser(formatTable.otherwise, args, form)
end
end
return final
end
formatStr = formatStrInTable(formatStr)
if not formatStr or formatStr == '' then return '' end
if type(formatStr) == 'table' then
local first = parse(formatStr[1])
local second = parse(formatStr[2])
return first, second
else
return parse(formatStr)
end
end
local function formatString(args, form)
local function getTypeData(module, type)
local success, moduleData = pcall(mw.loadData, module)
if not success then return '' end
local typeTable = moduleData[type] or moduleData['']
local defaultTable = moduleData[''] or {}
if typeTable then
local alias = typeTable.alias
if alias then
local aliasedModule = "Module:Road data/strings/" .. alias.module
local aliasedType = alias.type
return getTypeData(aliasedModule, aliasedType)
end
return typeTable[form] or defaultTable[form] or ''
else
return ''
end
end
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] and state ~= '' then
module = format("Module:Road data/strings/%s/%s", country, state)
else
module = format("Module:Road data/strings/%s", country)
end
return getTypeData(module, typeArg)
end
function p.parser(passedArgs, form)
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)
if not formatStr or formatStr == '' then return nil end
return parser(formatStr, args, form)
end
return p
Content Disclaimer
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.
- The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
- There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
- It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
- Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.