Mercurial Hosting > luan
comparison src/luan/modules/parsers/Xml.java @ 1562:b89212fd04b5
remove table.luan
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Sun, 08 Nov 2020 16:50:59 -0700 |
parents | 2e8a5df45d56 |
children | 8fbcc4747091 |
comparison
equal
deleted
inserted
replaced
1561:e1a13e707bf3 | 1562:b89212fd04b5 |
---|---|
14 import luan.modules.BasicLuan; | 14 import luan.modules.BasicLuan; |
15 | 15 |
16 | 16 |
17 public final class Xml { | 17 public final class Xml { |
18 | 18 |
19 public static String toString(LuanTable tbl) throws LuanException { | 19 public static String toString(Luan luan,LuanTable tbl) throws LuanException { |
20 XmlElement[] elements = elements(tbl); | 20 XmlElement[] elements = elements(luan,tbl); |
21 if( elements.length != 1 ) | 21 if( elements.length != 1 ) |
22 throw new LuanException("XML must have 1 root element"); | 22 throw new LuanException("XML must have 1 root element"); |
23 return elements[0].toString(); | 23 return elements[0].toString(); |
24 } | 24 } |
25 | 25 |
26 private static final String ATTRIBUTES = "xml_attributes"; | 26 private static final String ATTRIBUTES = "xml_attributes"; |
27 private static final String TEXT = "xml_text"; | 27 private static final String TEXT = "xml_text"; |
28 | 28 |
29 private static XmlElement[] elements(LuanTable tbl) throws LuanException { | 29 private static XmlElement[] elements(Luan luan,LuanTable tbl) throws LuanException { |
30 List<XmlElement> list = new ArrayList<XmlElement>(); | 30 List<XmlElement> list = new ArrayList<XmlElement>(); |
31 for( Map.Entry entry : tbl.iterable() ) { | 31 for( Map.Entry entry : tbl.iterable() ) { |
32 Object key = entry.getKey(); | 32 Object key = entry.getKey(); |
33 if( !(key instanceof String) ) | 33 if( !(key instanceof String) ) |
34 throw new LuanException("XML key must be string"); | 34 throw new LuanException("XML key must be string"); |
38 continue; | 38 continue; |
39 if( name.equals(TEXT) ) | 39 if( name.equals(TEXT) ) |
40 throw new LuanException("Can't mix text and elements"); | 40 throw new LuanException("Can't mix text and elements"); |
41 LuanTable t = (LuanTable)value; | 41 LuanTable t = (LuanTable)value; |
42 if( t.isMap() ) { | 42 if( t.isMap() ) { |
43 list.add( element(name,t) ); | 43 list.add( element(luan,name,t) ); |
44 } else { | 44 } else { |
45 for( Object obj : t.asList() ) { | 45 for( Object obj : t.asList() ) { |
46 list.add( element(name,obj) ); | 46 list.add( element(luan,name,obj) ); |
47 } | 47 } |
48 } | 48 } |
49 } | 49 } |
50 return list.toArray(new XmlElement[0]); | 50 return list.toArray(new XmlElement[0]); |
51 } | 51 } |
52 | 52 |
53 private static XmlElement element(String name,Object obj) throws LuanException { | 53 private static XmlElement element(Luan luan,String name,Object obj) throws LuanException { |
54 if( obj instanceof String ) { | 54 if( obj instanceof String ) { |
55 return new XmlElement( name, Collections.emptyMap(), (String)obj ); | 55 return new XmlElement( name, Collections.emptyMap(), (String)obj ); |
56 } | 56 } |
57 LuanTable t = (LuanTable)obj; | 57 LuanTable t = (LuanTable)obj; |
58 Map<String,String> attributes = attributes(t); | 58 Map<String,String> attributes = attributes(luan,t); |
59 String s = (String)t.get(TEXT); | 59 String s = (String)t.get(luan,TEXT); |
60 if( s != null ) { | 60 if( s != null ) { |
61 return new XmlElement(name,attributes,s); | 61 return new XmlElement(name,attributes,s); |
62 } else { | 62 } else { |
63 XmlElement[] elements = elements(t); | 63 XmlElement[] elements = elements(luan,t); |
64 if( elements.length==0 ) { | 64 if( elements.length==0 ) { |
65 return new XmlElement(name,attributes); | 65 return new XmlElement(name,attributes); |
66 } else { | 66 } else { |
67 return new XmlElement(name,attributes,elements); | 67 return new XmlElement(name,attributes,elements); |
68 } | 68 } |
69 } | 69 } |
70 } | 70 } |
71 | 71 |
72 private static Map<String,String> attributes(LuanTable tbl) throws LuanException { | 72 private static Map<String,String> attributes(Luan luan,LuanTable tbl) throws LuanException { |
73 Object obj = tbl.get(ATTRIBUTES); | 73 Object obj = tbl.get(luan,ATTRIBUTES); |
74 if( obj==null ) | 74 if( obj==null ) |
75 return Collections.emptyMap(); | 75 return Collections.emptyMap(); |
76 LuanTable t = (LuanTable)obj; | 76 LuanTable t = (LuanTable)obj; |
77 Map<String,String> map = new LinkedHashMap<String,String>(); | 77 Map<String,String> map = new LinkedHashMap<String,String>(); |
78 for( Map.Entry entry : t.iterable() ) { | 78 for( Map.Entry entry : t.iterable() ) { |
82 } | 82 } |
83 return map; | 83 return map; |
84 } | 84 } |
85 | 85 |
86 | 86 |
87 public static LuanTable parse(Luan luan,String s) throws ParseException, LuanException { | 87 public static LuanTable parse(String s) throws ParseException, LuanException { |
88 XmlElement element = XmlParser.parse(s); | 88 XmlElement element = XmlParser.parse(s); |
89 LuanTable tbl = new LuanTable(luan); | 89 LuanTable tbl = new LuanTable(); |
90 addElements(tbl,new XmlElement[]{element}); | 90 addElements(tbl,new XmlElement[]{element}); |
91 return tbl; | 91 return tbl; |
92 } | 92 } |
93 | 93 |
94 private static LuanTable addElements(LuanTable tbl,XmlElement[] elements) throws LuanException { | 94 private static LuanTable addElements(LuanTable tbl,XmlElement[] elements) throws LuanException { |
95 for( XmlElement element : elements ) { | 95 for( XmlElement element : elements ) { |
96 LuanTable t = new LuanTable(tbl.luan()); | 96 LuanTable t = new LuanTable(); |
97 if( !element.attributes.isEmpty() ) { | 97 if( !element.attributes.isEmpty() ) { |
98 LuanTable attrs = new LuanTable(tbl.luan()); | 98 LuanTable attrs = new LuanTable(); |
99 for( Map.Entry<String,String> entry : element.attributes.entrySet() ) { | 99 for( Map.Entry<String,String> entry : element.attributes.entrySet() ) { |
100 attrs.put(entry.getKey(),entry.getValue()); | 100 attrs.rawPut(entry.getKey(),entry.getValue()); |
101 } | 101 } |
102 t.put( ATTRIBUTES, attrs ); | 102 t.rawPut( ATTRIBUTES, attrs ); |
103 } | 103 } |
104 if( element.content == null ) { | 104 if( element.content == null ) { |
105 // nothing | 105 // nothing |
106 } else if( element.content instanceof String ) { | 106 } else if( element.content instanceof String ) { |
107 t.put( TEXT, element.content ); | 107 t.rawPut( TEXT, element.content ); |
108 } else { | 108 } else { |
109 XmlElement[] els = (XmlElement[])element.content; | 109 XmlElement[] els = (XmlElement[])element.content; |
110 addElements(t,els); | 110 addElements(t,els); |
111 } | 111 } |
112 LuanTable old = (LuanTable)tbl.get(element.name); | 112 LuanTable old = (LuanTable)tbl.rawGet(element.name); |
113 if( old==null ) { | 113 if( old==null ) { |
114 tbl.put(element.name,t); | 114 tbl.rawPut(element.name,t); |
115 } else { | 115 } else { |
116 if( !old.isList() ) { | 116 if( !old.isList() ) { |
117 LuanTable list = new LuanTable(tbl.luan()); | 117 LuanTable list = new LuanTable(); |
118 list.rawAdd(old); | 118 list.rawAdd(old); |
119 old = list; | 119 old = list; |
120 tbl.put(element.name,old); | 120 tbl.rawPut(element.name,old); |
121 } | 121 } |
122 old.rawAdd(t); | 122 old.rawAdd(t); |
123 } | 123 } |
124 } | 124 } |
125 return tbl; | 125 return tbl; |