Merge pull request #2749 from dibdot/wg
[oweals/luci.git] / modules / luci-base / luasrc / dispatcher.lua
index 9d6f586b1df51f33adb51d9f8f4f0dc7378cfc88..e8106b741d533541279597cf98dc8a8e4c7fedb0 100644 (file)
@@ -40,6 +40,28 @@ function build_url(...)
        return table.concat(url, "")
 end
 
+function _ordered_children(node)
+       local name, child, children = nil, nil, {}
+
+       for name, child in pairs(node.nodes) do
+               children[#children+1] = {
+                       name  = name,
+                       node  = child,
+                       order = child.order or 100
+               }
+       end
+
+       table.sort(children, function(a, b)
+               if a.order == b.order then
+                       return a.name < b.name
+               else
+                       return a.order < b.order
+               end
+       end)
+
+       return children
+end
+
 function node_visible(node)
    if node then
          return not (
@@ -55,15 +77,10 @@ end
 function node_childs(node)
        local rv = { }
        if node then
-               local k, v
-               for k, v in util.spairs(node.nodes,
-                       function(a, b)
-                               return (node.nodes[a].order or 100)
-                                    < (node.nodes[b].order or 100)
-                       end)
-               do
-                       if node_visible(v) then
-                               rv[#rv+1] = k
+               local _, child
+               for _, child in ipairs(_ordered_children(node)) do
+                       if node_visible(child.node) then
+                               rv[#rv+1] = child.name
                        end
                end
        end
@@ -311,7 +328,7 @@ function dispatch(request)
                        assert(media, "No valid theme found")
                end
 
-               local function _ifattr(cond, key, val)
+               local function _ifattr(cond, key, val, noescape)
                        if cond then
                                local env = getfenv(3)
                                local scope = (type(env.self) == "table") and env.self
@@ -322,13 +339,16 @@ function dispatch(request)
                                                val = util.serialize_json(val)
                                        end
                                end
-                               return string.format(
-                                       ' %s="%s"', tostring(key),
-                                       util.pcdata(tostring( val
-                                        or (type(env[key]) ~= "function" and env[key])
-                                        or (scope and type(scope[key]) ~= "function" and scope[key])
-                                        or "" ))
-                               )
+
+                               val = tostring(val or
+                                       (type(env[key]) ~= "function" and env[key]) or
+                                       (scope and type(scope[key]) ~= "function" and scope[key]) or "")
+
+                               if noescape ~= true then
+                                       val = util.pcdata(val)
+                               end
+
+                               return string.format(' %s="%s"', tostring(key), val)
                        else
                                return ''
                        end
@@ -699,24 +719,7 @@ end
 -- Subdispatchers --
 
 function _find_eligible_node(root, prefix, deep, types, descend)
-       local _, cur_name, cur_node
-       local childs = { }
-
-       for cur_name, cur_node in pairs(root.nodes) do
-               childs[#childs+1] = {
-                       node = cur_node,
-                       name = cur_name,
-                       order = cur_node.order or 100
-               }
-       end
-
-       table.sort(childs, function(a, b)
-               if a.order == b.order then
-                       return a.name < b.name
-               else
-                       return a.order < b.order
-               end
-       end)
+       local children = _ordered_children(root)
 
        if not root.leaf and deep ~= nil then
                local sub_path = { unpack(prefix) }
@@ -725,10 +728,11 @@ function _find_eligible_node(root, prefix, deep, types, descend)
                        deep = nil
                end
 
-               for _, cur_node in ipairs(childs) do
-                       sub_path[#prefix+1] = cur_node.name
+               local _, child
+               for _, child in ipairs(children) do
+                       sub_path[#prefix+1] = child.name
 
-                       local res_path = _find_eligible_node(cur_node.node, sub_path,
+                       local res_path = _find_eligible_node(child.node, sub_path,
                                                             deep, types, true)
 
                        if res_path then
@@ -853,6 +857,15 @@ function template(name)
 end
 
 
+local _view = function(self, ...)
+       require "luci.template".render("view", { view = self.view })
+end
+
+function view(name)
+       return {type = "view", view = name, target = _view}
+end
+
+
 local function _cbi(self, ...)
        local cbi = require "luci.cbi"
        local tpl = require "luci.template"