luci-base: introduce luci.dispatcher.lookup()
authorJo-Philipp Wich <jo@mein.io>
Thu, 5 Apr 2018 19:58:41 +0000 (21:58 +0200)
committerJo-Philipp Wich <jo@mein.io>
Thu, 5 Apr 2018 21:03:01 +0000 (23:03 +0200)
The lookup function takes multiple, possibly malformed path fragments,
splits them on slashes, constructs a temporary path and looks up the
result in the dispatch tree.

If a matching node has been found, the function will return both the
node reference and the canonical url to it.

If no corresponding node is found, the function returns nil.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
modules/luci-base/luasrc/dispatcher.lua
modules/luci-base/luasrc/dispatcher.luadoc

index c93fd78..88f9440 100644 (file)
@@ -658,6 +658,23 @@ function node(...)
        return c
 end
 
+function lookup(...)
+       local i, path = nil, {}
+       for i = 1, select('#', ...) do
+               local name, arg = nil, tostring(select(i, ...))
+               for name in arg:gmatch("[^/]+") do
+                       path[#path+1] = name
+               end
+       end
+
+       for i = #path, 1, -1 do
+               local node = context.treecache[table.concat(path, ".", 1, i)]
+               if node and (i == #path or node.leaf) then
+                       return node, build_url(unpack(path))
+               end
+       end
+end
+
 function _create_node(path)
        if #path == 0 then
                return context.tree
index 743463c..ddf534b 100644 (file)
@@ -116,8 +116,8 @@ Create a new dispatching node and define common parameters.
 
 ---[[
 Fetch or create a dispatching node without setting the target module or
-
 enabling the node.
+
 @class function
 @name get
 @param ...             Virtual path
@@ -134,6 +134,15 @@ Fetch or create a new dispatching node.
 ]]
 
 ---[[
+Lookup node in dispatching tree.
+
+@class function
+@name lookup
+@param  ...            Virtual path
+@return Node object, canonical url or nil if the path was not found.
+]]
+
+---[[
 Alias the first (lowest order) page automatically