Mercurial Hosting > luan
diff src/luan/modules/parsers/Xml2.java @ 1791:f8f5c51f5b36
xml work
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Tue, 26 Dec 2023 19:16:18 -0700 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/luan/modules/parsers/Xml2.java Tue Dec 26 19:16:18 2023 -0700 @@ -0,0 +1,86 @@ +package luan.modules.parsers; + +import java.util.Map; +import java.util.LinkedHashMap; +import goodjava.parser.ParseException; +import goodjava.xml.XmlParser; +import goodjava.xml.Xml; +import goodjava.xml.XmlElement; +import luan.LuanTable; +import luan.LuanException; + + +public final class Xml2 { + + public static LuanTable parse(String s) throws ParseException, LuanException { + Xml xml = XmlParser.parse(s); + LuanTable tbl = new LuanTable(); + tbl.rawPut( "declaration", xml.declaration ); + tbl.rawPut( "element", newElement(xml.getElement()) ); + return tbl; + } + + private static LuanTable newElement(XmlElement element) throws LuanException { + LuanTable tbl = new LuanTable(); + tbl.rawPut( "name", element.name ); + LuanTable attrs = new LuanTable(); + for( Map.Entry<String,String> entry : element.attributes.entrySet() ) { + attrs.rawPut(entry.getKey(),entry.getValue()); + } + tbl.rawPut( "attributes", attrs ); + Object content = element.getContent(); + if( content == null ) { + // nothing + } else if( content instanceof String ) { + tbl.rawPut( "content", content ); + } else { + XmlElement[] elements = (XmlElement[])content; + LuanTable t = new LuanTable(); + for( XmlElement el : elements ) { + LuanTable elTbl = newElement(el); + elTbl.rawPut( "parent", tbl ); + t.rawAdd(elTbl); + } + tbl.rawPut( "content", t ); + } + return tbl; + } + + + public static String toString(LuanTable tbl) { + Xml xml = new Xml(); + xml.declaration = (String)tbl.rawGet("declaration"); + xml.setElement( element( (LuanTable)tbl.rawGet("element") ) ); + return xml.toString(); + } + + private static XmlElement element(LuanTable tbl) { + String name = (String)tbl.rawGet("name"); + Map<String,String> map = new LinkedHashMap<String,String>(); + { + LuanTable t = (LuanTable)tbl.rawGet("attributes"); + for( Map.Entry entry : t.rawIterable() ) { + String key =(String)entry.getKey(); + String value =(String)entry.getValue(); + map.put(key,value); + } + } + XmlElement element = new XmlElement(name,map); + Object content = tbl.rawGet("content"); + if( content == null ) { + // nothing + } else if( content instanceof String ) { + element.setContent((String)content); + } else if( content instanceof LuanTable ) { + LuanTable t = (LuanTable)content; + int n = t.rawLength(); + XmlElement[] a = new XmlElement[n]; + for( int i=0; i<n; i++ ) { + LuanTable elTbl = (LuanTable)t.rawGet(Integer.valueOf(i+1)); + a[i] = element(elTbl); + } + element.setContent(a); + } + return element; + } +}