Mercurial Hosting > luan
view src/luan/modules/parsers/LuanToString.java @ 1495:2e8a5df45d56
better xml
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Tue, 05 May 2020 11:03:48 -0600 |
parents | 6a24c8b33d6b |
children | f989778ca9e1 |
line wrap: on
line source
package luan.modules.parsers; import java.util.List; import java.util.Map; import luan.Luan; import luan.LuanTable; import luan.LuanException; import luan.LuanRuntimeException; public final class LuanToString { public boolean strict = false; public boolean numberTypes = false; public boolean compressed = false; private String equal; private String comma; public String toString(Object obj) throws LuanException { equal = compressed ? "=" : " = "; comma = compressed ? "," : ", "; StringBuilder sb = new StringBuilder(); toString(obj,sb,0); return sb.toString(); } private void toString(Object obj,StringBuilder sb,int indented) throws LuanException { if( obj == null ) { sb.append( "nil" ); return; } if( obj instanceof Boolean ) { sb.append( obj ); return; } if( obj instanceof Number ) { toString((Number)obj,sb); return; } if( obj instanceof String ) { sb.append( '"' ); sb.append( Luan.stringEncode((String)obj) ); sb.append( '"' ); return; } if( obj instanceof LuanTable ) { toString((LuanTable)obj,sb,indented); return; } if( strict ) throw new LuanException("can't handle type "+Luan.type(obj)); sb.append( '<' ); sb.append( obj ); sb.append( '>' ); } private void toString(LuanTable tbl,StringBuilder sb,int indented) throws LuanException { List list = tbl.asList(); Map map = tbl.rawMap(); sb.append( '{' ); if( !list.isEmpty() ) { if( !compressed ) indent(sb,indented+1); toString(list.get(0),sb,indented+1); final int n = list.size(); for( int i=1; i<n; i++ ) { sb.append(comma); toString(list.get(i),sb,indented+1); } } boolean first = true; for( Object obj : map.entrySet() ) { Map.Entry entry = (Map.Entry)obj; if( compressed && first ) first = false; else indent(sb,indented+1); toString(entry,sb,indented+1); } if( !compressed && (!list.isEmpty() || !map.isEmpty()) ) indent(sb,indented); sb.append( '}' ); return; } private void toString(Map.Entry entry,StringBuilder sb,int indented) throws LuanException { Object key = entry.getKey(); if( key instanceof String && ((String)key).matches("[a-zA-Z_][a-zA-Z_0-9]*") ) { sb.append( (String)key ); } else { sb.append( '[' ); toString( key, sb, indented ); sb.append( ']' ); } sb.append( equal ); toString( entry.getValue(), sb, indented ); } private void indent(StringBuilder sb,int indented) { if( compressed ) { sb.append( comma ); return; } sb.append( '\n' ); for( int i=0; i<indented; i++ ) { sb.append( '\t' ); } } private void toString(Number n,StringBuilder sb) throws LuanException { if( numberTypes ) { sb.append( n.getClass().getSimpleName().toLowerCase() ); sb.append( '(' ); } sb.append( Luan.toString(n) ); if( numberTypes ) sb.append( ')' ); } public static void addNumberTypes(LuanTable env) { try { LuanTable module = (LuanTable)env.luan().require("luan:Number.luan"); env.put( "double", module.fn("double") ); env.put( "float", module.fn("float") ); env.put( "integer", module.fn("integer") ); env.put( "long", module.fn("long") ); } catch(LuanException e) { throw new LuanRuntimeException(e); } } }