Mercurial Hosting > luan
diff core/src/luan/modules/Io.luan @ 422:af82b266fe89
add Io.repr()
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Fri, 01 May 2015 16:13:52 -0600 |
parents | 62b457c50594 |
children | 750a68eceb1d |
line wrap: on
line diff
--- a/core/src/luan/modules/Io.luan Fri May 01 15:13:14 2015 -0600 +++ b/core/src/luan/modules/Io.luan Fri May 01 16:13:52 2015 -0600 @@ -13,6 +13,10 @@ local Luan = require "luan:Luan" local to_string = Luan.to_string +local type = Luan.type +local try = Luan.try +local ipairs = Luan.ipairs +local pairs = Luan.pairs local Table = require "luan:Table" function print_to(out,...) @@ -34,6 +38,62 @@ end +-- repr + +local function do_repr(obj,done) + local tp = type(obj) + if tp == "table" then + if done[obj] == true then + %><circular reference><% + return + end + done[obj] = true + %>{<% + local is_first = true + local in_list = {} + for key, value in ipairs(obj) do + if is_first then is_first = false else %>, <% end + do_repr(value,done) + in_list[key] = true + end + for key, value in pairs(obj) do + if in_list[key] ~= true then + if is_first then is_first = false else %>, <% end + if type(key) == "string" and key.match "^[a-zA-Z_][a-zA-Z_0-9]*$" ~= nil then + %><%=key%><% + else + %>[<%do_repr(key,done)%>]<% + end + %>=<% do_repr(value,done) + end + end + %>}<% + elseif tp == "string" then + %>"<%=obj.encode()%>"<% + elseif tp == "nil" or tp == "boolean" or tp == "number" then + %><%=obj%><% + else + %><<%=obj%>><% + end +end + +function repr(obj) + local old_out = stdout + return try { + function() + local string_uri = Uri "string:" + stdout = string_uri.text_writer() + do_repr(obj,{}) + stdout.close() + return string_uri.read_text() + end; + finally = function() + stdout = old_out + end; + } +end + + -- useful for SimplyHTML responsiveness NO = {}