Mercurial Hosting > luan
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 |