Mercurial Hosting > luan
view core/src/luan/modules/Io.luan @ 625:a3c1e11fb6aa
rewrite much of Html to be more understandable;
add Lucene html_highlighter();
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Tue, 12 Jan 2016 23:52:56 -0700 |
parents | 790d5de23042 |
children | 35dde32c02ab |
line wrap: on
line source
java() local IoLuan = require "java:luan.modules.IoLuan" local System = require "java:java.lang.System" local M = {} M.read_console_line = IoLuan.read_console_line M.schemes = IoLuan.newSchemes() M.uri = IoLuan.uri M.stdin = IoLuan.defaultStdin.table() M.socket_server = IoLuan.socket_server M.stdout = IoLuan.textWriter(System.out) M.stderr = IoLuan.textWriter(System.err) local Luan = require "luan:Luan" local error = Luan.error local to_string = Luan.to_string or error() local type = Luan.type or error() local try = Luan.try or error() local ipairs = Luan.ipairs or error() local pairs = Luan.pairs or error() local values = Luan.values or error() local load = Luan.load or error() local Table = require "luan:Table" local unpack = Table.unpack or error() local String = require "luan:String" local encode = String.encode or error() local matches = String.matches or error() function M.print_to(out,...) local list = {} for v in values(...) do list[#list+1] = to_string(v) list[#list+1] = '\t' end if #list > 0 then list[#list] = '\n' out.write( unpack(list) ) end end function M.print(...) M.print_to(M.stdout,...) end function M.output_to(out,fn,...) local old_out = M.stdout return try( { function(...) M.stdout = out fn(...) end; finally = function() M.stdout = old_out end; }, ... ) end local uri = M.uri -- make local function M.output_of(fn,...) local string_uri = uri "string:" local out = string_uri.text_writer() M.output_to(out,fn,...) out.close() return string_uri.read_text() end -- repr local function do_repr(obj,strict,done) local tp = type(obj) if tp == "table" then if done[obj] == true then strict and error "circular reference" %><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,strict,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 matches(key,"[a-zA-Z_][a-zA-Z_0-9]*") ~= nil then %><%=key%><% elseif type(key) == "table" then %>[<<%=key%>>]<% else %>[<%do_repr(key,strict,done)%>]<% end %>=<% do_repr(value,strict,done) end end %>}<% elseif tp == "string" then %>"<%=encode(obj)%>"<% elseif tp == "nil" or tp == "boolean" or tp == "number" then %><%=obj%><% else strict and error("can't repr type '"..tp.."' of "..obj) %><<%=obj%>><% end end function M.repr(obj,strict) return M.output_of(do_repr,obj,strict or false,{}) end -- useful for SimplyHTML responsiveness local NO = {} M.NO = NO function M.dont_write_when_no(write_fn) return function(...) for v in values(...) do if v == NO then return end end write_fn(...) end end -- debug function M.debug(prompt) prompt = prompt or "luan_debug> " local function console() return M.read_console_line(prompt) end local env = {} for line in console do try { function() local fn = load(line,"stdin",env,true) M.print( fn() ) end; catch = function(e) M.print(e) end; } end end return M