comparison src/luan/modules/parsers/Xml.java @ 1563:8fbcc4747091

remove LuanFunction.luan
author Franklin Schmidt <fschmidt@gmail.com>
date Mon, 09 Nov 2020 01:37:57 -0700
parents b89212fd04b5
children a8c685a894b4
comparison
equal deleted inserted replaced
1562:b89212fd04b5 1563:8fbcc4747091
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(Luan luan,LuanTable tbl) throws LuanException { 19 public static String toString(LuanTable tbl) throws LuanException {
20 XmlElement[] elements = elements(luan,tbl); 20 XmlElement[] elements = elements(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(Luan luan,LuanTable tbl) throws LuanException { 29 private static XmlElement[] elements(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.rawIterable() ) {
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");
35 String name = (String)key; 35 String name = (String)key;
36 Object value = entry.getValue(); 36 Object value = entry.getValue();
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(luan,name,t) ); 43 list.add( element(name,t) );
44 } else { 44 } else {
45 for( Object obj : t.asList() ) { 45 for( Object obj : t.asList() ) {
46 list.add( element(luan,name,obj) ); 46 list.add( element(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(Luan luan,String name,Object obj) throws LuanException { 53 private static XmlElement element(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(luan,t); 58 Map<String,String> attributes = attributes(t);
59 String s = (String)t.get(luan,TEXT); 59 String s = (String)t.rawGet(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(luan,t); 63 XmlElement[] elements = elements(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(Luan luan,LuanTable tbl) throws LuanException { 72 private static Map<String,String> attributes(LuanTable tbl) throws LuanException {
73 Object obj = tbl.get(luan,ATTRIBUTES); 73 Object obj = tbl.rawGet(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.rawIterable() ) {
79 String name =(String)entry.getKey(); 79 String name =(String)entry.getKey();
80 String value =(String)entry.getValue(); 80 String value =(String)entry.getValue();
81 map.put(name,value); 81 map.put(name,value);
82 } 82 }
83 return map; 83 return map;