changeset 1495:2e8a5df45d56

better xml
author Franklin Schmidt <fschmidt@gmail.com>
date Tue, 05 May 2020 11:03:48 -0600
parents 91c167099462
children 6c830be6be98
files src/luan/LuanTable.java src/luan/modules/parsers/Xml.java
diffstat 2 files changed, 24 insertions(+), 36 deletions(-) [+]
line wrap: on
line diff
--- a/src/luan/LuanTable.java	Sun May 03 11:51:31 2020 -0600
+++ b/src/luan/LuanTable.java	Tue May 05 11:03:48 2020 -0600
@@ -124,7 +124,7 @@
 		return map==null || map.isEmpty();
 	}
 
-	boolean isMap() {
+	public boolean isMap() {
 		return map!=null || list==null;
 	}
 
--- a/src/luan/modules/parsers/Xml.java	Sun May 03 11:51:31 2020 -0600
+++ b/src/luan/modules/parsers/Xml.java	Tue May 05 11:03:48 2020 -0600
@@ -11,6 +11,7 @@
 import luan.Luan;
 import luan.LuanTable;
 import luan.LuanException;
+import luan.modules.BasicLuan;
 
 
 public final class Xml {
@@ -22,31 +23,27 @@
 		return elements[0].toString();
 	}
 
-	private static final Integer ONE = Integer.valueOf(1);
-	private static final Integer TWO = Integer.valueOf(2);
-	private static final String LIST = "$list";
+	private static final String ATTRIBUTES = "xml_attributes";
+	private static final String TEXT = "xml_text";
 
 	private static XmlElement[] elements(LuanTable tbl) throws LuanException {
 		List<XmlElement> list = new ArrayList<XmlElement>();
 		for( Map.Entry entry : tbl.iterable() ) {
 			Object key = entry.getKey();
-			if( key.equals(ONE) )
-				continue;
 			if( !(key instanceof String) )
 				throw new LuanException("XML key must be string");
 			String name = (String)key;
 			Object value = entry.getValue();
-			if( value instanceof String ) {
-				list.add( element(name,value) );
+			if( name.equals(ATTRIBUTES) )
+				continue;
+			if( name.equals(TEXT) )
+				throw new LuanException("Can't mix text and elements");
+			LuanTable t = (LuanTable)value;
+			if( t.isMap() ) {
+				list.add( element(name,t) );
 			} else {
-				LuanTable t = (LuanTable)value;
-				LuanTable tList = (LuanTable)t.get(LIST);
-				if( tList == null ) {
-					list.add( element(name,t) );
-				} else {
-					for( Object obj : tList.asList() ) {
-						list.add( element(name,obj) );
-					}
+				for( Object obj : t.asList() ) {
+					list.add( element(name,obj) );
 				}
 			}
 		}
@@ -59,7 +56,7 @@
 		}
 		LuanTable t = (LuanTable)obj;
 		Map<String,String> attributes = attributes(t);
-		String s = (String)t.get(TWO);
+		String s = (String)t.get(TEXT);
 		if( s != null ) {
 			return new XmlElement(name,attributes,s);
 		} else {
@@ -73,7 +70,7 @@
 	}
 
 	private static Map<String,String> attributes(LuanTable tbl) throws LuanException {
-		Object obj = tbl.get(ONE);
+		Object obj = tbl.get(ATTRIBUTES);
 		if( obj==null )
 			return Collections.emptyMap();
 		LuanTable t = (LuanTable)obj;
@@ -102,36 +99,27 @@
 				for( Map.Entry<String,String> entry : element.attributes.entrySet() ) {
 					attrs.put(entry.getKey(),entry.getValue());
 				}
-				t.put( 1, attrs );
+				t.put( ATTRIBUTES, attrs );
 			}
-			Object value = t;
 			if( element.content == null ) {
 				// nothing
 			} else if( element.content instanceof String ) {
-				if( t.isEmpty() ) {
-					value = element.content;
-				} else {
-					t.put( 2, element.content );
-				}
+				t.put( TEXT, element.content );
 			} else {
 				XmlElement[] els = (XmlElement[])element.content;
 				addElements(t,els);
 			}
-			Object old = tbl.get(element.name);
+			LuanTable old = (LuanTable)tbl.get(element.name);
 			if( old==null ) {
-				tbl.put(element.name,value);
+				tbl.put(element.name,t);
 			} else {
-				LuanTable list = null;
-				if( old instanceof LuanTable )
-					list = (LuanTable)((LuanTable)old).get(LIST);
-				if( list==null ) {
-					list = new LuanTable(tbl.luan());
+				if( !old.isList() ) {
+					LuanTable list = new LuanTable(tbl.luan());
 					list.rawAdd(old);
-					LuanTable wrap = new LuanTable(tbl.luan());
-					wrap.put(LIST,list);
-					tbl.put(element.name,wrap);
+					old = list;
+					tbl.put(element.name,old);
 				}
-				list.rawAdd(value);
+				old.rawAdd(t);
 			}
 		}
 		return tbl;