comparison src/luan/modules/parsers/Xml.java @ 1471:f5b8c7e1ac82

xml
author Franklin Schmidt <fschmidt@gmail.com>
date Tue, 14 Apr 2020 20:20:45 -0600
parents 35f3bfd4f51d
children 2e8a5df45d56
comparison
equal deleted inserted replaced
1470:580ee513a4b7 1471:f5b8c7e1ac82
22 return elements[0].toString(); 22 return elements[0].toString();
23 } 23 }
24 24
25 private static final Integer ONE = Integer.valueOf(1); 25 private static final Integer ONE = Integer.valueOf(1);
26 private static final Integer TWO = Integer.valueOf(2); 26 private static final Integer TWO = Integer.valueOf(2);
27 private static final String LIST = "$list";
27 28
28 private static XmlElement[] elements(LuanTable tbl) throws LuanException { 29 private static XmlElement[] elements(LuanTable tbl) throws LuanException {
29 List<XmlElement> list = new ArrayList<XmlElement>(); 30 List<XmlElement> list = new ArrayList<XmlElement>();
30 for( Map.Entry entry : tbl.iterable() ) { 31 for( Map.Entry entry : tbl.iterable() ) {
31 Object key = entry.getKey(); 32 Object key = entry.getKey();
33 continue; 34 continue;
34 if( !(key instanceof String) ) 35 if( !(key instanceof String) )
35 throw new LuanException("XML key must be string"); 36 throw new LuanException("XML key must be string");
36 String name = (String)key; 37 String name = (String)key;
37 Object value = entry.getValue(); 38 Object value = entry.getValue();
38 XmlElement element;
39 if( value instanceof String ) { 39 if( value instanceof String ) {
40 String s = (String)value; 40 list.add( element(name,value) );
41 element = new XmlElement(name,Collections.emptyMap(),s);
42 } else { 41 } else {
43 LuanTable t = (LuanTable)value; 42 LuanTable t = (LuanTable)value;
44 Map<String,String> attributes = attributes(t); 43 LuanTable tList = (LuanTable)t.get(LIST);
45 String s = (String)t.get(TWO); 44 if( tList == null ) {
46 if( s != null ) { 45 list.add( element(name,t) );
47 element = new XmlElement(name,attributes,s);
48 } else { 46 } else {
49 XmlElement[] elements = elements(t); 47 for( Object obj : tList.asList() ) {
50 if( elements.length==0 ) { 48 list.add( element(name,obj) );
51 element = new XmlElement(name,attributes);
52 } else {
53 element = new XmlElement(name,attributes,elements);
54 } 49 }
55 } 50 }
56 } 51 }
57 list.add(element);
58 } 52 }
59 return list.toArray(new XmlElement[0]); 53 return list.toArray(new XmlElement[0]);
54 }
55
56 private static XmlElement element(String name,Object obj) throws LuanException {
57 if( obj instanceof String ) {
58 return new XmlElement( name, Collections.emptyMap(), (String)obj );
59 }
60 LuanTable t = (LuanTable)obj;
61 Map<String,String> attributes = attributes(t);
62 String s = (String)t.get(TWO);
63 if( s != null ) {
64 return new XmlElement(name,attributes,s);
65 } else {
66 XmlElement[] elements = elements(t);
67 if( elements.length==0 ) {
68 return new XmlElement(name,attributes);
69 } else {
70 return new XmlElement(name,attributes,elements);
71 }
72 }
60 } 73 }
61 74
62 private static Map<String,String> attributes(LuanTable tbl) throws LuanException { 75 private static Map<String,String> attributes(LuanTable tbl) throws LuanException {
63 Object obj = tbl.get(ONE); 76 Object obj = tbl.get(ONE);
64 if( obj==null ) 77 if( obj==null )
89 for( Map.Entry<String,String> entry : element.attributes.entrySet() ) { 102 for( Map.Entry<String,String> entry : element.attributes.entrySet() ) {
90 attrs.put(entry.getKey(),entry.getValue()); 103 attrs.put(entry.getKey(),entry.getValue());
91 } 104 }
92 t.put( 1, attrs ); 105 t.put( 1, attrs );
93 } 106 }
107 Object value = t;
94 if( element.content == null ) { 108 if( element.content == null ) {
95 tbl.put(element.name,t); 109 // nothing
96 } else if( element.content instanceof String ) { 110 } else if( element.content instanceof String ) {
97 if( t.isEmpty() ) { 111 if( t.isEmpty() ) {
98 tbl.put(element.name,element.content); 112 value = element.content;
99 } else { 113 } else {
100 t.put( 2, element.content ); 114 t.put( 2, element.content );
101 tbl.put(element.name,t);
102 } 115 }
103 } else { 116 } else {
104 XmlElement[] els = (XmlElement[])element.content; 117 XmlElement[] els = (XmlElement[])element.content;
105 addElements(t,els); 118 addElements(t,els);
106 tbl.put(element.name,t); 119 }
120 Object old = tbl.get(element.name);
121 if( old==null ) {
122 tbl.put(element.name,value);
123 } else {
124 LuanTable list = null;
125 if( old instanceof LuanTable )
126 list = (LuanTable)((LuanTable)old).get(LIST);
127 if( list==null ) {
128 list = new LuanTable(tbl.luan());
129 list.rawAdd(old);
130 LuanTable wrap = new LuanTable(tbl.luan());
131 wrap.put(LIST,list);
132 tbl.put(element.name,wrap);
133 }
134 list.rawAdd(value);
107 } 135 }
108 } 136 }
109 return tbl; 137 return tbl;
110 } 138 }
111 139