Assign correct path attribute to nodes
[project/luci.git] / libs / web / luasrc / dispatcher.lua
index 2323cf8..5fb50dc 100644 (file)
@@ -354,9 +354,11 @@ function createtree()
 
        local ctx  = context
        local tree = {nodes={}}
+       local modi = {}
 
        ctx.treecache = setmetatable({}, {__mode="v"})
        ctx.tree = tree
+       ctx.modifiers = modi
 
        -- Load default translation
        require "luci.i18n".loadc("default")
@@ -369,9 +371,30 @@ function createtree()
                v()
        end
 
+       local function modisort(a,b)
+               return modi[a].order < modi[b].order
+       end
+
+       for _, v in util.spairs(modi, modisort) do
+               scope._NAME = v.module
+               setfenv(v.func, scope)
+               v.func()
+       end
+
        return tree
 end
 
+--- Register a tree modifier.
+-- @param      func    Modifier function
+-- @param      order   Modifier order value (optional)
+function modifier(func, order)
+       context.modifiers[#context.modifiers+1] = {
+               func = func,
+               order = order or 0,
+               module = getfenv(2)._NAME
+       }
+end
+
 --- Clone a node of the dispatching tree to another position.
 -- @param      path    Virtual path destination
 -- @param      clone   Virtual path source
@@ -415,7 +438,6 @@ function node(...)
        local c = _create_node({...})
 
        c.module = getfenv(2)._NAME
-       c.path = arg
        c.auto = nil
 
        return c
@@ -431,10 +453,11 @@ function _create_node(path, cache)
        local c = cache[name]
 
        if not c then
+               local new = {nodes={}, auto=true, path=util.clone(path)}
                local last = table.remove(path)
+
                c = _create_node(path, cache)
 
-               local new = {nodes={}, auto=true}
                c.nodes[last] = new
                cache[name] = new