changeset 1471:f5b8c7e1ac82

xml
author Franklin Schmidt <fschmidt@gmail.com>
date Tue, 14 Apr 2020 20:20:45 -0600
parents 580ee513a4b7
children 60f6741f000a
files src/luan/modules/parsers/Xml.java
diffstat 1 files changed, 45 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/src/luan/modules/parsers/Xml.java	Tue Apr 14 17:12:06 2020 -0600
+++ b/src/luan/modules/parsers/Xml.java	Tue Apr 14 20:20:45 2020 -0600
@@ -24,6 +24,7 @@
 
 	private static final Integer ONE = Integer.valueOf(1);
 	private static final Integer TWO = Integer.valueOf(2);
+	private static final String LIST = "$list";
 
 	private static XmlElement[] elements(LuanTable tbl) throws LuanException {
 		List<XmlElement> list = new ArrayList<XmlElement>();
@@ -35,30 +36,42 @@
 				throw new LuanException("XML key must be string");
 			String name = (String)key;
 			Object value = entry.getValue();
-			XmlElement element;
 			if( value instanceof String ) {
-				String s = (String)value;
-				element = new XmlElement(name,Collections.emptyMap(),s);
+				list.add( element(name,value) );
 			} else {
 				LuanTable t = (LuanTable)value;
-				Map<String,String> attributes = attributes(t);
-				String s = (String)t.get(TWO);
-				if( s != null ) {
-					element = new XmlElement(name,attributes,s);
+				LuanTable tList = (LuanTable)t.get(LIST);
+				if( tList == null ) {
+					list.add( element(name,t) );
 				} else {
-					XmlElement[] elements = elements(t);
-					if( elements.length==0 ) {
-						element = new XmlElement(name,attributes);
-					} else {
-						element = new XmlElement(name,attributes,elements);
+					for( Object obj : tList.asList() ) {
+						list.add( element(name,obj) );
 					}
 				}
 			}
-			list.add(element);
 		}
 		return list.toArray(new XmlElement[0]);
 	}
 
+	private static XmlElement element(String name,Object obj) throws LuanException {
+		if( obj instanceof String ) {
+			return new XmlElement( name, Collections.emptyMap(), (String)obj );
+		}
+		LuanTable t = (LuanTable)obj;
+		Map<String,String> attributes = attributes(t);
+		String s = (String)t.get(TWO);
+		if( s != null ) {
+			return new XmlElement(name,attributes,s);
+		} else {
+			XmlElement[] elements = elements(t);
+			if( elements.length==0 ) {
+				return new XmlElement(name,attributes);
+			} else {
+				return new XmlElement(name,attributes,elements);
+			}
+		}
+	}
+
 	private static Map<String,String> attributes(LuanTable tbl) throws LuanException {
 		Object obj = tbl.get(ONE);
 		if( obj==null )
@@ -91,19 +104,34 @@
 				}
 				t.put( 1, attrs );
 			}
+			Object value = t;
 			if( element.content == null ) {
-				tbl.put(element.name,t);
+				// nothing
 			} else if( element.content instanceof String ) {
 				if( t.isEmpty() ) {
-					tbl.put(element.name,element.content);
+					value = element.content;
 				} else {
 					t.put( 2, element.content );
-					tbl.put(element.name,t);
 				}
 			} else {
 				XmlElement[] els = (XmlElement[])element.content;
 				addElements(t,els);
-				tbl.put(element.name,t);
+			}
+			Object old = tbl.get(element.name);
+			if( old==null ) {
+				tbl.put(element.name,value);
+			} else {
+				LuanTable list = null;
+				if( old instanceof LuanTable )
+					list = (LuanTable)((LuanTable)old).get(LIST);
+				if( list==null ) {
+					list = new LuanTable(tbl.luan());
+					list.rawAdd(old);
+					LuanTable wrap = new LuanTable(tbl.luan());
+					wrap.put(LIST,list);
+					tbl.put(element.name,wrap);
+				}
+				list.rawAdd(value);
 			}
 		}
 		return tbl;