view src/luan/modules/parsers/Xml2.java @ 1802:ca98dee04e08 default tip

add Parsers.json_null
author Franklin Schmidt <fschmidt@gmail.com>
date Sun, 21 Apr 2024 21:25:15 -0600
parents f8f5c51f5b36
children
line wrap: on
line source

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;
	}
}