# Module:Road data/parser/hooks

local p = {}  

local parserModuleName = "Module:Road data/parser" -- SANDBOX REFERENCE  

function p.split(parameters, args)  
local route = tonumber(string.match(args.route, "%d+")) or 0  
if route < parameters.split then  
return parameters.below  
else  
return parameters.above  
end  
end  

function p.splitlen(parameters, args)  
local route = args.route  
if #route < parameters.split then  
return parameters.below  
else  
return parameters.above  
end  
end  

function p.between(parameters, args)  
local lower = parameters.lower  
local upper = parameters.upper  
local route = tonumber(string.match(args.route, "%d+")) or 0  
if route < lower or route >= upper then  
return parameters.no  
else  
return parameters.yes  
end  
end  

function p.mask(parameters, args)  
local baseParam = parameters.base  
local maskedParam = parameters.masked  
local maskModule = "Module:" .. parameters.mask  
local mask = mw.loadData(maskModule)  
args[maskedParam] = mask[args[baseParam]]  
return parameters.default  
end  

function p.padroute(parameters, args)  
local route = args.route  
local paddedLength = parameters.paddedLength  
args.paddedRoute = string.format("%0" .. tostring(paddedLength) .. "d", route)  
return parameters.default  
end  

function p.lowercase(parameters, args)  
local route = args.route  
args.lowercase = string.lower(route)  
return parameters.default  
end  

--[[  
For the first element (pattern, action) in .actions such that  
args[.base] begins with pattern, return action.  
If no such element exists, return .default (nil if unspecified).  
function p.beginswith(parameters, args)  
local baseParam = parameters.base  
local actions = parameters.actions  
local arg = args[baseParam]  
for pattern,action in pairs(actions) do  
if mw.ustring.sub(arg, 1, mw.ustring.len(pattern)) == pattern then  
return action  
end  
end  
return parameters.default  
end  

---
For the first element (pattern, action) in .actions such that  
require(Module:Road data/parser).parser(args, .entry, .path, .kind)  
matches pattern as a regular expression, return action.  
If no such element exists, return .default (nil if unspecified).  

.path and .kind are optional.  

function p.match(parameters, args)  
local parserModule = require(parserModuleName)  
local parser = parserModule.parser  

local entry = parameters.entry  
local path = parameters.path  
local kind = parameters.kind  
local actions = parameters.actions  
local value = parser(args, entry, path, kind)  
for pattern,action in pairs(actions) do  
if mw.ustring.match(value, pattern) then  
return action  
end  
end  
return parameters.default  
end  

function p.iso3166Sub(parameters, args)  
local country = args.country  
local subParam = parameters.sub  
local subCode = args[subParam]  

local iso3166Module = require("Module:ISO 3166")  
args.iso3166Sub = iso3166Module.luaname{country, subCode}  
return parameters.default  
end  

function p.pagename(parameters, args)  
local pagename = mw.title.getCurrentTitle.text  
local article = parameters.article  

if article == pagename then  
return parameters.iftrue  
else  
return parameters.default or ''  
end  
end  

return p