From d79e1ec4c14f190e36b4b45151c08260d2ed5c75 Mon Sep 17 00:00:00 2001 From: Steven Barth Date: Mon, 31 Mar 2008 08:52:24 +0000 Subject: [PATCH] * Rewritten menu builder * Moved menu definitions from controllers to model/menu --- Makefile | 3 +- src/ffluci/controller/admin/index.lua | 11 +- src/ffluci/controller/admin/mesh.lua | 10 +- src/ffluci/controller/admin/network.lua | 13 +-- src/ffluci/controller/admin/system.lua | 10 -- src/ffluci/controller/admin/wifi.lua | 11 +- src/ffluci/controller/public/index.lua | 10 +- src/ffluci/fs.lua | 11 +- src/ffluci/menu.lua | 145 ++++++++++++------------ src/ffluci/model/menu/00main.lua | 26 +++++ 10 files changed, 109 insertions(+), 141 deletions(-) create mode 100644 src/ffluci/model/menu/00main.lua diff --git a/Makefile b/Makefile index 79adba00f..0aefd193c 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ ffluci/sys.lua ffluci/model/uci.lua ffluci/model/ipkg.lua \ ffluci/config.lua ffluci/i18n.lua ffluci/template.lua \ ffluci/cbi.lua ffluci/dispatcher.lua ffluci/menu.lua ffluci/init.lua -DIRECTORIES = dist/ffluci/model/cbi dist/ffluci/controller dist/ffluci/i18n dist/ffluci/view +DIRECTORIES = dist/ffluci/model/cbi dist/ffluci/model/menu dist/ffluci/controller dist/ffluci/i18n dist/ffluci/view INFILES = $(CFILES:%=src/%) OUTFILE = ffluci/init.lua @@ -25,6 +25,7 @@ dist: cp src/ffluci/i18n/* dist/ffluci/i18n/ cp src/ffluci/view/* dist/ffluci/view/ -R cp src/ffluci/model/cbi/* dist/ffluci/model/cbi/ -R + cp src/ffluci/model/menu/* dist/ffluci/model/menu/ -R compile: mkdir -p $(DIRECTORIES) diff --git a/src/ffluci/controller/admin/index.lua b/src/ffluci/controller/admin/index.lua index 43e680a23..b4a7720f8 100644 --- a/src/ffluci/controller/admin/index.lua +++ b/src/ffluci/controller/admin/index.lua @@ -1,10 +1 @@ -module("ffluci.controller.admin.index", package.seeall) - -menu = { - descr = "Übersicht", - order = 10, - entries = { - {action = "luci", descr = "FFLuCI"}, - {action = "contact", descr = "Kontakt"} - } -} \ No newline at end of file +module("ffluci.controller.admin.index", package.seeall) \ No newline at end of file diff --git a/src/ffluci/controller/admin/mesh.lua b/src/ffluci/controller/admin/mesh.lua index fcdcdabb0..3dbe98cbb 100644 --- a/src/ffluci/controller/admin/mesh.lua +++ b/src/ffluci/controller/admin/mesh.lua @@ -1,9 +1 @@ -module("ffluci.controller.admin.mesh", package.seeall) - -menu = { - descr = "Mesh", - order = 50, - entries = { - {action = "olsrd", descr = "OLSR"}, - } -} \ No newline at end of file +module("ffluci.controller.admin.mesh", package.seeall) \ No newline at end of file diff --git a/src/ffluci/controller/admin/network.lua b/src/ffluci/controller/admin/network.lua index 5ffe64175..4f8160a4c 100644 --- a/src/ffluci/controller/admin/network.lua +++ b/src/ffluci/controller/admin/network.lua @@ -1,12 +1 @@ -module(..., package.seeall) - -menu = { - descr = "Netzwerk", - order = 30, - entries = { - {action = "vlan", descr = "Switch"}, - {action = "ifaces", descr = "Schnittstellen"}, - {action = "ptp", descr = "PPPoE / PPTP"}, - {action = "routes", descr = "Statische Routen"}, - } -} \ No newline at end of file +module(..., package.seeall) \ No newline at end of file diff --git a/src/ffluci/controller/admin/system.lua b/src/ffluci/controller/admin/system.lua index 455424eb8..c4ba027cb 100644 --- a/src/ffluci/controller/admin/system.lua +++ b/src/ffluci/controller/admin/system.lua @@ -5,16 +5,6 @@ require("ffluci.http") require("ffluci.util") require("ffluci.fs") -menu = { - descr = "System", - order = 20, - entries = { - {action = "passwd", descr = "Passwort ändern"}, - {action = "sshkeys", descr = "SSH-Schlüssel"}, - {action = "reboot", descr = "Neu starten"}, - } -} - function action_editor() local file = ffluci.http.formvalue("file", "") local data = ffluci.http.formvalue("data") diff --git a/src/ffluci/controller/admin/wifi.lua b/src/ffluci/controller/admin/wifi.lua index 54b6bfb20..bc1040c71 100644 --- a/src/ffluci/controller/admin/wifi.lua +++ b/src/ffluci/controller/admin/wifi.lua @@ -1,10 +1 @@ -module("ffluci.controller.admin.wifi", package.seeall) - -menu = { - descr = "Drahtlos", - order = 40, - entries = { - {action = "devices", descr = "Geräte"}, - {action = "networks", descr = "Netze"}, - } -} \ No newline at end of file +module("ffluci.controller.admin.wifi", package.seeall) \ No newline at end of file diff --git a/src/ffluci/controller/public/index.lua b/src/ffluci/controller/public/index.lua index 3ee564f64..4f8160a4c 100644 --- a/src/ffluci/controller/public/index.lua +++ b/src/ffluci/controller/public/index.lua @@ -1,9 +1 @@ -module(..., package.seeall) - -menu = { - descr = "Übersicht", - order = 10, - entries = { - {action = "contact", descr = "Kontakt"} - } -} \ No newline at end of file +module(..., package.seeall) \ No newline at end of file diff --git a/src/ffluci/fs.lua b/src/ffluci/fs.lua index 897308c10..6e8859a0d 100644 --- a/src/ffluci/fs.lua +++ b/src/ffluci/fs.lua @@ -93,12 +93,13 @@ basename = posix.basename -- dirname wrapper dirname = posix.dirname --- Diriterator - alias for lfs.dir - filter . and .. +-- dir wrapper function dir(path) - local e = posix.dir(path) - table.remove(e, 1) - table.remove(e, 1) - return e + local dir = {} + for node in posix.files(path) do + table.insert(dir, 1, node) + end + return dir end -- Alias for lfs.mkdir diff --git a/src/ffluci/menu.lua b/src/ffluci/menu.lua index 724faaeaa..cbf47e2e3 100644 --- a/src/ffluci/menu.lua +++ b/src/ffluci/menu.lua @@ -28,97 +28,92 @@ module("ffluci.menu", package.seeall) require("ffluci.fs") require("ffluci.util") require("ffluci.template") +require("ffluci.i18n") -ctrldir = ffluci.fs.dirname(ffluci.util.__file__()) .. "/controller/" -modelpath = ffluci.fs.dirname(ffluci.util.__file__()) .. "/model/menudata.lua" +-- Default modelpath +modelpath = ffluci.fs.dirname(ffluci.util.__file__()) .. "/model/menu/" --- Cache menudata into a Luafile instead of recollecting it at every pageload --- Warning: Make sure the menudata cache gets deleted everytime you update --- the menu information of any module or add or remove a module -builder_enable_cache = false +-- Menu definition extra scope +scope = { + translate = ffluci.i18n.translate +} +-- Local menu database +local menu = {} --- Builds the menudata file -function build() - local data = collect() - ffluci.fs.writefile(modelpath, dump(data, "m")) - return data +-- The current pointer +local menuc = {} + +-- Adds a menu category to the current menu and selects it +function add(cat, controller, title, order) + order = order or 50 + if not menu[cat] then + menu[cat] = {} + end + + local entry = {} + entry[".descr"] = title + entry[".order"] = order + entry[".contr"] = controller + + menuc = entry + + local i = 0 + for k,v in ipairs(menu[cat]) do + if v[".order"] > entry[".order"] then + break + end + i = k + end + table.insert(menu[cat], i+1, entry) + + return true end +-- Adds an action to the current menu +function act(action, title) + table.insert(menuc, {action = action, descr = title}) + return true +end --- Collect all menu information provided in the controller modules -function collect() - local m = {} - for k,cat in pairs(ffluci.fs.dir(ctrldir)) do - m[cat] = {} - for k,con in pairs(ffluci.fs.dir(ctrldir .. "/" .. cat)) do - if con:sub(-4) == ".lua" then - con = con:sub(1, con:len()-4) - local mod = require("ffluci.controller." .. cat .. "." .. con) - if mod.menu and mod.menu.descr - and mod.menu.entries and mod.menu.order then - local entry = {} - entry[".descr"] = mod.menu.descr - entry[".order"] = mod.menu.order - entry[".contr"] = con - for k,v in pairs(mod.menu.entries) do - entry[k] = v - end - local i = 0 - for k,v in ipairs(m[cat]) do - if v[".order"] > entry[".order"] then - break - end - i = k - end - table.insert(m[cat], i+1, entry) - end - end +-- Selects a menu category +function sel(cat, controller) + if not menu[cat] then + return nil + end + menuc = menu[cat] + + local stat = nil + for k,v in ipairs(menuc) do + if v[".contr"] == controller then + menuc = v + stat = true end end - return m + + return stat end --- Dumps a table into a string of Lua code -function dump(tbl, name) - local src = name .. "={}\n" - for k,v in pairs(tbl) do - if type(k) == "string" then - k = ffluci.util.escape(k) - k = "'" .. ffluci.util.escape(k, "'") .. "'" - end - if type(v) == "string" then - v = ffluci.util.escape(v) - v = ffluci.util.escape(v, "'") - src = src .. name .. "[" .. k .. "]='" .. v .. "'\n" - elseif type(v) == "number" then - src = src .. name .. "[" .. k .. "]=" .. v .. "\n" - elseif type(v) == "table" then - src = src .. dump(v, name .. "[" .. k .. "]") +-- Collect all menu information provided in the model dir +function collect() + for k, menu in pairs(ffluci.fs.dir(modelpath)) do + if menu:sub(1, 1) ~= "." then + local f = loadfile(modelpath.."/"..menu) + local env = ffluci.util.clone(scope) + + env.add = add + env.sel = sel + env.act = act + + setfenv(f, env) + f() end end - return src end -- Returns the menu information function get() - if builder_enable_cache then - local cachemt = ffluci.fs.mtime(modelpath) - local data = nil - - if cachemt == nil then - data = build() - else - local fenv = {} - local f = loadfile(modelpath) - setfenv(f, fenv) - f() - data = fenv.m - end - - return data - else - return collect() - end + collect() + return menu end \ No newline at end of file diff --git a/src/ffluci/model/menu/00main.lua b/src/ffluci/model/menu/00main.lua new file mode 100644 index 000000000..64fc36462 --- /dev/null +++ b/src/ffluci/model/menu/00main.lua @@ -0,0 +1,26 @@ +-- General menu definition +add("public", "index", "Übersicht", 10) +act("contact", "Kontakt") + + +add("admin", "index", "Übersicht", 10) +act("luci", "FFLuCI") +act("contact", "Kontakt") + +add("admin", "system", "System", 20) +act("passwd", "Passwort ändern") +act("sshkeys", "SSH-Schlüssel") +act("reboot", "Neu starten") + +add("admin", "network", "Netzwerk", 30) +act("vlan", "Switch") +act("ifaces", "Schnittstellen") +act("ptp", "PPPoE / PPTP") +act("routes", "Statische Routen") + +add("admin", "wifi", "Drahtlos", 40) +act("devices", "Geräte") +act("networks", "Netze") + +add("admin", "mesh", "Mesh", 50) +act("olsrd", "OLSR") \ No newline at end of file -- 2.25.1