From c3e4ceed2825a83f309aee87f340d9b4f080f47c Mon Sep 17 00:00:00 2001
From: Matthias Schiffer <mschiffer@universe-factory.net>
Date: Sun, 25 Feb 2018 18:14:24 +0100
Subject: [PATCH] gluon-web: split out model support into a separate package

---
 package/gluon-setup-mode/Makefile             |  2 +-
 package/gluon-web-model/Makefile              | 36 ++++++++++
 .../lib/gluon/web/view/model/dynlist.html     |  0
 .../files/lib/gluon/web/view/model/form.html  |  0
 .../lib/gluon/web/view/model/fvalue.html      |  0
 .../lib/gluon/web/view/model/lvalue.html      |  0
 .../lib/gluon/web/view/model/section.html     |  0
 .../lib/gluon/web/view/model/tvalue.html      |  0
 .../files/lib/gluon/web/view/model/value.html |  0
 .../gluon/web/view/model/valuewrapper.html    |  0
 .../lib/gluon/web/view/model/wrapper.html     |  0
 .../web/www/static/resources/gluon-web.js     |  0
 package/gluon-web-model/i18n/de.po            | 23 +++++++
 package/gluon-web-model/i18n/fr.po            | 23 +++++++
 .../gluon-web-model/i18n/gluon-web-model.pot  | 14 ++++
 .../javascript/gluon-web.js                   |  0
 .../luasrc/usr/lib/lua/gluon/web/model.lua    | 68 +++++++++++++++++++
 .../usr/lib/lua/gluon/web/model/classes.lua}  | 42 +-----------
 .../usr/lib/lua/gluon/web/model/datatypes.lua |  0
 package/gluon-web-theme/Makefile              |  2 +-
 .../gluon/web/view/themes/gluon/layout.html   |  2 +-
 package/gluon-web/Makefile                    |  1 -
 .../view/{error404.html => error/404.html}    |  0
 .../view/{error500.html => error/500.html}    |  0
 package/gluon-web/i18n/de.po                  | 12 ----
 package/gluon-web/i18n/fr.po                  | 12 ----
 package/gluon-web/i18n/gluon-web.pot          | 12 ----
 .../usr/lib/lua/gluon/web/dispatcher.lua      | 25 +------
 28 files changed, 173 insertions(+), 101 deletions(-)
 create mode 100644 package/gluon-web-model/Makefile
 rename package/{gluon-web => gluon-web-model}/files/lib/gluon/web/view/model/dynlist.html (100%)
 rename package/{gluon-web => gluon-web-model}/files/lib/gluon/web/view/model/form.html (100%)
 rename package/{gluon-web => gluon-web-model}/files/lib/gluon/web/view/model/fvalue.html (100%)
 rename package/{gluon-web => gluon-web-model}/files/lib/gluon/web/view/model/lvalue.html (100%)
 rename package/{gluon-web => gluon-web-model}/files/lib/gluon/web/view/model/section.html (100%)
 rename package/{gluon-web => gluon-web-model}/files/lib/gluon/web/view/model/tvalue.html (100%)
 rename package/{gluon-web => gluon-web-model}/files/lib/gluon/web/view/model/value.html (100%)
 rename package/{gluon-web => gluon-web-model}/files/lib/gluon/web/view/model/valuewrapper.html (100%)
 rename package/{gluon-web => gluon-web-model}/files/lib/gluon/web/view/model/wrapper.html (100%)
 rename package/{gluon-web => gluon-web-model}/files/lib/gluon/web/www/static/resources/gluon-web.js (100%)
 create mode 100644 package/gluon-web-model/i18n/de.po
 create mode 100644 package/gluon-web-model/i18n/fr.po
 create mode 100644 package/gluon-web-model/i18n/gluon-web-model.pot
 rename package/{gluon-web => gluon-web-model}/javascript/gluon-web.js (100%)
 create mode 100644 package/gluon-web-model/luasrc/usr/lib/lua/gluon/web/model.lua
 rename package/{gluon-web/luasrc/usr/lib/lua/gluon/web/model.lua => gluon-web-model/luasrc/usr/lib/lua/gluon/web/model/classes.lua} (89%)
 rename package/{gluon-web => gluon-web-model}/luasrc/usr/lib/lua/gluon/web/model/datatypes.lua (100%)
 rename package/gluon-web/files/lib/gluon/web/view/{error404.html => error/404.html} (100%)
 rename package/gluon-web/files/lib/gluon/web/view/{error500.html => error/500.html} (100%)

diff --git a/package/gluon-setup-mode/Makefile b/package/gluon-setup-mode/Makefile
index d149e9186..b76ab6c02 100644
--- a/package/gluon-setup-mode/Makefile
+++ b/package/gluon-setup-mode/Makefile
@@ -15,7 +15,7 @@ define Package/gluon-setup-mode
   SECTION:=gluon
   CATEGORY:=Gluon
   TITLE:=Setup mode
-  DEPENDS:=+gluon-core +gluon-web +ubus +uhttpd +dnsmasq
+  DEPENDS:=+gluon-core +gluon-web-model +ubus +uhttpd +dnsmasq
 endef
 
 define Package/gluon-setup-mode/description
diff --git a/package/gluon-web-model/Makefile b/package/gluon-web-model/Makefile
new file mode 100644
index 000000000..7139d9064
--- /dev/null
+++ b/package/gluon-web-model/Makefile
@@ -0,0 +1,36 @@
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=gluon-web-model
+PKG_VERSION:=1
+
+
+include ../gluon.mk
+
+PKG_CONFIG_DEPENDS += $(GLUON_I18N_CONFIG)
+
+
+define Package/gluon-web-model
+  SECTION:=gluon
+  CATEGORY:=Gluon
+  TITLE:=Minimal Lua web framework derived from LuCI (model support)
+  DEPENDS:=+gluon-web
+endef
+
+
+define Build/Prepare
+	mkdir -p $(PKG_BUILD_DIR)
+endef
+
+define Build/Compile
+	$(call GluonBuildI18N,gluon-web-model,i18n)
+	$(call GluonSrcDiet,./luasrc,$(PKG_BUILD_DIR)/luadest/)
+endef
+
+define Package/gluon-web-model/install
+	$(CP) ./files/* $(1)/
+	$(CP) $(PKG_BUILD_DIR)/luadest/* $(1)/
+	$(call GluonInstallI18N,gluon-web-model,$(1))
+
+endef
+
+$(eval $(call BuildPackage,gluon-web-model))
diff --git a/package/gluon-web/files/lib/gluon/web/view/model/dynlist.html b/package/gluon-web-model/files/lib/gluon/web/view/model/dynlist.html
similarity index 100%
rename from package/gluon-web/files/lib/gluon/web/view/model/dynlist.html
rename to package/gluon-web-model/files/lib/gluon/web/view/model/dynlist.html
diff --git a/package/gluon-web/files/lib/gluon/web/view/model/form.html b/package/gluon-web-model/files/lib/gluon/web/view/model/form.html
similarity index 100%
rename from package/gluon-web/files/lib/gluon/web/view/model/form.html
rename to package/gluon-web-model/files/lib/gluon/web/view/model/form.html
diff --git a/package/gluon-web/files/lib/gluon/web/view/model/fvalue.html b/package/gluon-web-model/files/lib/gluon/web/view/model/fvalue.html
similarity index 100%
rename from package/gluon-web/files/lib/gluon/web/view/model/fvalue.html
rename to package/gluon-web-model/files/lib/gluon/web/view/model/fvalue.html
diff --git a/package/gluon-web/files/lib/gluon/web/view/model/lvalue.html b/package/gluon-web-model/files/lib/gluon/web/view/model/lvalue.html
similarity index 100%
rename from package/gluon-web/files/lib/gluon/web/view/model/lvalue.html
rename to package/gluon-web-model/files/lib/gluon/web/view/model/lvalue.html
diff --git a/package/gluon-web/files/lib/gluon/web/view/model/section.html b/package/gluon-web-model/files/lib/gluon/web/view/model/section.html
similarity index 100%
rename from package/gluon-web/files/lib/gluon/web/view/model/section.html
rename to package/gluon-web-model/files/lib/gluon/web/view/model/section.html
diff --git a/package/gluon-web/files/lib/gluon/web/view/model/tvalue.html b/package/gluon-web-model/files/lib/gluon/web/view/model/tvalue.html
similarity index 100%
rename from package/gluon-web/files/lib/gluon/web/view/model/tvalue.html
rename to package/gluon-web-model/files/lib/gluon/web/view/model/tvalue.html
diff --git a/package/gluon-web/files/lib/gluon/web/view/model/value.html b/package/gluon-web-model/files/lib/gluon/web/view/model/value.html
similarity index 100%
rename from package/gluon-web/files/lib/gluon/web/view/model/value.html
rename to package/gluon-web-model/files/lib/gluon/web/view/model/value.html
diff --git a/package/gluon-web/files/lib/gluon/web/view/model/valuewrapper.html b/package/gluon-web-model/files/lib/gluon/web/view/model/valuewrapper.html
similarity index 100%
rename from package/gluon-web/files/lib/gluon/web/view/model/valuewrapper.html
rename to package/gluon-web-model/files/lib/gluon/web/view/model/valuewrapper.html
diff --git a/package/gluon-web/files/lib/gluon/web/view/model/wrapper.html b/package/gluon-web-model/files/lib/gluon/web/view/model/wrapper.html
similarity index 100%
rename from package/gluon-web/files/lib/gluon/web/view/model/wrapper.html
rename to package/gluon-web-model/files/lib/gluon/web/view/model/wrapper.html
diff --git a/package/gluon-web/files/lib/gluon/web/www/static/resources/gluon-web.js b/package/gluon-web-model/files/lib/gluon/web/www/static/resources/gluon-web.js
similarity index 100%
rename from package/gluon-web/files/lib/gluon/web/www/static/resources/gluon-web.js
rename to package/gluon-web-model/files/lib/gluon/web/www/static/resources/gluon-web.js
diff --git a/package/gluon-web-model/i18n/de.po b/package/gluon-web-model/i18n/de.po
new file mode 100644
index 000000000..b0761f347
--- /dev/null
+++ b/package/gluon-web-model/i18n/de.po
@@ -0,0 +1,23 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"PO-Revision-Date: 2013-03-29 12:13+0200\n"
+"Last-Translator: Matthias Schiffer <mschiffer@universe-factory.net>\n"
+"Language-Team: German\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgid "One or more fields contain invalid values!"
+msgstr "Ein oder mehrere Felder enthalten ungültige Werte!"
+
+msgid "One or more required fields have no value!"
+msgstr "Ein oder mehr benötigte Felder sind nicht ausgefüllt!"
+
+msgid "Reset"
+msgstr "Zurücksetzen"
+
+msgid "Save"
+msgstr "Speichern"
diff --git a/package/gluon-web-model/i18n/fr.po b/package/gluon-web-model/i18n/fr.po
new file mode 100644
index 000000000..61c59d88f
--- /dev/null
+++ b/package/gluon-web-model/i18n/fr.po
@@ -0,0 +1,23 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"PO-Revision-Date: 2013-12-22 17:11+0200\n"
+"Last-Translator: goofy <pierre.gaufillet@gmail.com>\n"
+"Language-Team: French\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+msgid "One or more fields contain invalid values!"
+msgstr "Un ou plusieurs champs contiennent des valeurs incorrectes !"
+
+msgid "One or more required fields have no value!"
+msgstr "Un ou plusieurs champs n'ont pas de valeur !"
+
+msgid "Reset"
+msgstr "Remise à zéro"
+
+msgid "Save"
+msgstr "Soumettre"
diff --git a/package/gluon-web-model/i18n/gluon-web-model.pot b/package/gluon-web-model/i18n/gluon-web-model.pot
new file mode 100644
index 000000000..3fd79546f
--- /dev/null
+++ b/package/gluon-web-model/i18n/gluon-web-model.pot
@@ -0,0 +1,14 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+msgid "One or more fields contain invalid values!"
+msgstr ""
+
+msgid "One or more required fields have no value!"
+msgstr ""
+
+msgid "Reset"
+msgstr ""
+
+msgid "Save"
+msgstr ""
diff --git a/package/gluon-web/javascript/gluon-web.js b/package/gluon-web-model/javascript/gluon-web.js
similarity index 100%
rename from package/gluon-web/javascript/gluon-web.js
rename to package/gluon-web-model/javascript/gluon-web.js
diff --git a/package/gluon-web-model/luasrc/usr/lib/lua/gluon/web/model.lua b/package/gluon-web-model/luasrc/usr/lib/lua/gluon/web/model.lua
new file mode 100644
index 000000000..4914dee6d
--- /dev/null
+++ b/package/gluon-web-model/luasrc/usr/lib/lua/gluon/web/model.lua
@@ -0,0 +1,68 @@
+-- Copyright 2008 Steven Barth <steven@midlink.org>
+-- Copyright 2017-2018 Matthias Schiffer <mschiffer@universe-factory.net>
+-- Licensed to the public under the Apache License 2.0.
+
+module('gluon.web.model', package.seeall)
+
+local fs = require 'nixio.fs'
+local classes = require 'gluon.web.model.classes'
+
+local util = require 'gluon.web.util'
+local instanceof = util.instanceof
+
+-- Loads a model from given file, creating an environment and returns it
+local function load(filename, i18n)
+	local func = assert(loadfile(filename))
+
+	setfenv(func, setmetatable({}, {__index =
+		function(tbl, key)
+			return classes[key] or i18n[key] or _G[key]
+		end
+	}))
+
+	local models = { func() }
+
+	for k, model in ipairs(models) do
+		if not instanceof(model, classes.Node) then
+			error("model definition returned an invalid model object")
+		end
+		model.index = k
+	end
+
+	return models
+end
+
+return function(config, http, renderer, name, pkg)
+	local hidenav = false
+
+	local modeldir = config.base_path .. '/model/'
+	local filename = modeldir..name..'.lua'
+
+	if not fs.access(filename) then
+		error("Model '" .. name .. "' not found!")
+	end
+
+	local i18n = setmetatable({
+		i18n = renderer.i18n
+	}, {
+		__index = renderer.i18n(pkg)
+	})
+
+	local maps = load(filename, i18n)
+
+	for _, map in ipairs(maps) do
+		map:parse(http)
+	end
+	for _, map in ipairs(maps) do
+		map:handle()
+		hidenav = hidenav or map.hidenav
+	end
+
+	renderer.render('layout', {
+		content = 'model/wrapper',
+		env = {
+			maps = maps,
+		},
+		hidenav = hidenav,
+	})
+end
diff --git a/package/gluon-web/luasrc/usr/lib/lua/gluon/web/model.lua b/package/gluon-web-model/luasrc/usr/lib/lua/gluon/web/model/classes.lua
similarity index 89%
rename from package/gluon-web/luasrc/usr/lib/lua/gluon/web/model.lua
rename to package/gluon-web-model/luasrc/usr/lib/lua/gluon/web/model/classes.lua
index 00f77fe35..ac7696929 100644
--- a/package/gluon-web/luasrc/usr/lib/lua/gluon/web/model.lua
+++ b/package/gluon-web-model/luasrc/usr/lib/lua/gluon/web/model/classes.lua
@@ -1,12 +1,11 @@
 -- Copyright 2008 Steven Barth <steven@midlink.org>
--- Copyright 2017 Matthias Schiffer <mschiffer@universe-factory.net>
+-- Copyright 2017-2018 Matthias Schiffer <mschiffer@universe-factory.net>
 -- Licensed to the public under the Apache License 2.0.
 
-module("gluon.web.model", package.seeall)
+module("gluon.web.model.classes", package.seeall)
 
 local util = require "gluon.web.util"
 
-local fs         = require "nixio.fs"
 local datatypes  = require "gluon.web.model.datatypes"
 local class      = util.class
 local instanceof = util.instanceof
@@ -15,41 +14,6 @@ FORM_NODATA  =  0
 FORM_VALID   =  1
 FORM_INVALID = -1
 
--- Loads a model from given file, creating an environment and returns it
-function load(config, name, renderer, pkg)
-	local modeldir = config.base_path .. "/model/"
-
-	if not fs.access(modeldir..name..".lua") then
-		error("Model '" .. name .. "' not found!")
-	end
-
-	local func = assert(loadfile(modeldir..name..".lua"))
-
-	local i18n = setmetatable({
-		i18n = renderer.i18n
-	}, {
-		__index = renderer.i18n(pkg)
-	})
-
-
-	setfenv(func, setmetatable({}, {__index =
-		function(tbl, key)
-			return _M[key] or i18n[key] or _G[key]
-		end
-	}))
-
-	local models = { func() }
-
-	for k, model in ipairs(models) do
-		if not instanceof(model, Node) then
-			error("model definition returned an invalid model object")
-		end
-		model.index = k
-	end
-
-	return models
-end
-
 
 local function parse_datatype(code)
 	local match, arg, arg2
@@ -86,7 +50,7 @@ function Node:__init__(title, description, name)
 	self.name = name
 	self.index = nil
 	self.parent = nil
-	self.package = 'gluon-web'
+	self.package = 'gluon-web-model'
 end
 
 function Node:append(obj)
diff --git a/package/gluon-web/luasrc/usr/lib/lua/gluon/web/model/datatypes.lua b/package/gluon-web-model/luasrc/usr/lib/lua/gluon/web/model/datatypes.lua
similarity index 100%
rename from package/gluon-web/luasrc/usr/lib/lua/gluon/web/model/datatypes.lua
rename to package/gluon-web-model/luasrc/usr/lib/lua/gluon/web/model/datatypes.lua
diff --git a/package/gluon-web-theme/Makefile b/package/gluon-web-theme/Makefile
index db86de9ac..87e97bbf0 100644
--- a/package/gluon-web-theme/Makefile
+++ b/package/gluon-web-theme/Makefile
@@ -16,7 +16,7 @@ define Package/gluon-web-theme
   SECTION:=gluon
   CATEGORY:=Gluon
   TITLE:=gluon-web theme
-  DEPENDS:=+gluon-core +gluon-web
+  DEPENDS:=+gluon-core +gluon-web-model
 endef
 
 define Build/Prepare
diff --git a/package/gluon-web-theme/files/lib/gluon/web/view/themes/gluon/layout.html b/package/gluon-web-theme/files/lib/gluon/web/view/themes/gluon/layout.html
index febe91b52..fb24b3a3f 100644
--- a/package/gluon-web-theme/files/lib/gluon/web/view/themes/gluon/layout.html
+++ b/package/gluon-web-theme/files/lib/gluon/web/view/themes/gluon/layout.html
@@ -142,7 +142,7 @@ You may obtain a copy of the License at
 			<%
 				ok, err = pcall(renderer.render, content, env, pkg)
 				if not ok then
-					renderer.render('error500', {message = err}, 'gluon-web')
+					renderer.render('error/500', {message = err}, 'gluon-web')
 				end
 			%>
 
diff --git a/package/gluon-web/Makefile b/package/gluon-web/Makefile
index eecd0ac0b..b66e3c24e 100644
--- a/package/gluon-web/Makefile
+++ b/package/gluon-web/Makefile
@@ -3,7 +3,6 @@ include $(TOPDIR)/rules.mk
 PKG_NAME:=gluon-web
 PKG_VERSION:=1
 
-PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
 
 include ../gluon.mk
 
diff --git a/package/gluon-web/files/lib/gluon/web/view/error404.html b/package/gluon-web/files/lib/gluon/web/view/error/404.html
similarity index 100%
rename from package/gluon-web/files/lib/gluon/web/view/error404.html
rename to package/gluon-web/files/lib/gluon/web/view/error/404.html
diff --git a/package/gluon-web/files/lib/gluon/web/view/error500.html b/package/gluon-web/files/lib/gluon/web/view/error/500.html
similarity index 100%
rename from package/gluon-web/files/lib/gluon/web/view/error500.html
rename to package/gluon-web/files/lib/gluon/web/view/error/500.html
diff --git a/package/gluon-web/i18n/de.po b/package/gluon-web/i18n/de.po
index ed1dc7fc2..9481f60f6 100644
--- a/package/gluon-web/i18n/de.po
+++ b/package/gluon-web/i18n/de.po
@@ -16,18 +16,6 @@ msgstr "Interner Serverfehler"
 msgid "Not Found"
 msgstr "Nicht Gefunden"
 
-msgid "One or more fields contain invalid values!"
-msgstr "Ein oder mehrere Felder enthalten ungültige Werte!"
-
-msgid "One or more required fields have no value!"
-msgstr "Ein oder mehr benötigte Felder sind nicht ausgefüllt!"
-
-msgid "Reset"
-msgstr "Zurücksetzen"
-
-msgid "Save"
-msgstr "Speichern"
-
 msgid "Sorry, the object you requested was not found."
 msgstr "Entschuldigung, das anfgeforderte Objekt wurde nicht gefunden."
 
diff --git a/package/gluon-web/i18n/fr.po b/package/gluon-web/i18n/fr.po
index 759e98d75..631a80cbf 100644
--- a/package/gluon-web/i18n/fr.po
+++ b/package/gluon-web/i18n/fr.po
@@ -16,18 +16,6 @@ msgstr "Erreur Serveur Interne"
 msgid "Not Found"
 msgstr "Pas trouvé"
 
-msgid "One or more fields contain invalid values!"
-msgstr "Un ou plusieurs champs contiennent des valeurs incorrectes !"
-
-msgid "One or more required fields have no value!"
-msgstr "Un ou plusieurs champs n'ont pas de valeur !"
-
-msgid "Reset"
-msgstr "Remise à zéro"
-
-msgid "Save"
-msgstr "Soumettre"
-
 msgid "Sorry, the object you requested was not found."
 msgstr "Désolé, l'objet que vous avez demandé n'as pas été trouvé."
 
diff --git a/package/gluon-web/i18n/gluon-web.pot b/package/gluon-web/i18n/gluon-web.pot
index 3d387b2e3..d3b60ac0b 100644
--- a/package/gluon-web/i18n/gluon-web.pot
+++ b/package/gluon-web/i18n/gluon-web.pot
@@ -7,18 +7,6 @@ msgstr ""
 msgid "Not Found"
 msgstr ""
 
-msgid "One or more fields contain invalid values!"
-msgstr ""
-
-msgid "One or more required fields have no value!"
-msgstr ""
-
-msgid "Reset"
-msgstr ""
-
-msgid "Save"
-msgstr ""
-
 msgid "Sorry, the object you requested was not found."
 msgstr ""
 
diff --git a/package/gluon-web/luasrc/usr/lib/lua/gluon/web/dispatcher.lua b/package/gluon-web/luasrc/usr/lib/lua/gluon/web/dispatcher.lua
index 0879f76b4..4acc2c6c9 100644
--- a/package/gluon-web/luasrc/usr/lib/lua/gluon/web/dispatcher.lua
+++ b/package/gluon-web/luasrc/usr/lib/lua/gluon/web/dispatcher.lua
@@ -146,26 +146,7 @@ local function dispatch(config, http, request)
 				model = function(name)
 					local pkg = _pkg
 					return function()
-						local hidenav = false
-
-						local model = require "gluon.web.model"
-						local maps = model.load(config, name, renderer, pkg)
-
-						for _, map in ipairs(maps) do
-							map:parse(http)
-						end
-						for _, map in ipairs(maps) do
-							map:handle()
-							hidenav = hidenav or map.hidenav
-						end
-
-						renderer.render("layout", {
-							content = "model/wrapper",
-							env = {
-								maps = maps,
-							},
-							hidenav = hidenav,
-						})
+						require('gluon.web.model')(config, http, renderer, name, pkg)
 					end
 				end,
 
@@ -198,7 +179,7 @@ local function dispatch(config, http, request)
 	if not node or not node.target then
 		http:status(404, "Not Found")
 		renderer.render("layout", {
-			content = "error404",
+			content = "error/404",
 			env = {
 				message =
 					"No page is registered at '/" .. table.concat(request, "/") .. "'.\n" ..
@@ -215,7 +196,7 @@ local function dispatch(config, http, request)
 	if not ok then
 		http:status(500, "Internal Server Error")
 		renderer.render("layout", {
-			content = "error500",
+			content = "error/500",
 			env = {
 				message =
 					"Failed to execute dispatcher target for entry '/" .. table.concat(request, "/") .. "'.\n" ..
-- 
GitLab