5353--- @return type | string
5454local function typename (x )
5555 local mt = getmetatable (x )
56- if mt and mt .__type then
57- return mt .__type
56+ if mt and mt .__name then
57+ return mt .__name
5858 else
5959 return type (x )
6060 end
@@ -138,7 +138,7 @@ export.generator_metatable = setmetatable({}, {
138138 end
139139
140140 return setmetatable (node , {
141- __type = " XML.Node" ,
141+ __name = " XML.Node" ,
142142
143143 __tostring = export .node_to_string ,
144144
@@ -193,6 +193,11 @@ end)
193193--- @return XML.Node
194194function export .generate_node (ctx ) return ctx (export .generator_metatable ) end
195195
196+ --- @generic T
197+ --- @param func fun ( ... : T ): XML.Node
198+ --- @return fun ( ... : T ): XML.Node
199+ function export .declare_generator (func ) return setfenv (func , table ) end
200+
196201--- @param ctx fun ( html : XML.GeneratorTable ): table
197202--- @return string
198203function export .generate (ctx ) return tostring (export .generate_node (ctx )) end
@@ -203,16 +208,17 @@ function export.generate(ctx) return tostring(export.generate_node(ctx)) end
203208function export .html_table (tbl )
204209 return export .generate_node (function (xml )
205210 return xml .table {
206- function ()
211+ function ()
207212 local function getval (v )
208- if type (v ) ~= " table" or ( getmetatable (v ) or {}).__tostring then
213+ if typename (v ) ~= " table" and ( typename ( v ) ~= " XML.Node " and ( getmetatable (v ) or {}).__tostring ~= nil ) then
209214 return tostring (v )
210215 end
216+
211217 return export .html_table (v )
212218 end
213219
214220 for i , v in ipairs (tbl ) do
215- coroutine.yield (
221+ coroutine.yield (
216222 xml .tr {
217223 xml .td (tostring (i )),
218224 xml .td (getval (v )),
@@ -223,7 +229,7 @@ function export.html_table(tbl)
223229 end
224230
225231 for k , v in pairs (tbl ) do
226- coroutine.yield (
232+ coroutine.yield (
227233 xml .tr {
228234 xml .td (tostring (k )),
229235 xml .td (getval (v )),
0 commit comments