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;