view src/luan/modules/parsers/Xml.java @ 1466:670b7d089699

xml support
author Franklin Schmidt <fschmidt@gmail.com>
date Mon, 13 Apr 2020 22:00:40 -0600
parents
children 35f3bfd4f51d
line wrap: on
line source

package luan.modules.parsers;

import java.util.Collections;
import java.util.Map;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.ArrayList;
import goodjava.parser.ParseException;
import goodjava.xml.XmlElement;
import goodjava.xml.XmlParser;
import luan.Luan;
import luan.LuanTable;
import luan.LuanException;


public final class Xml {

	public static String toString(LuanTable tbl) throws LuanException {
		if( tbl.rawSize() != 1 )
			throw new LuanException("XML most have 1 root element");
		Map.Entry entry = tbl.iterator().next();
		Object key = entry.getKey();
		if( !(key instanceof String) )
			throw new LuanException("XML key must be string");
		String name = (String)key;
		Object value = entry.getValue();
		if( !(value instanceof LuanTable) )
			throw new LuanException("XML root value must be table");
		LuanTable t = (LuanTable)value;
		Map<String,String> attributes = attributes(t);
		XmlElement[] elements = elements(t);
		XmlElement element = new XmlElement(name,attributes,elements);
		return element.toString();
	}

	private static final Integer ONE = new Integer(1);

	private static Map<String,String> attributes(LuanTable tbl) throws LuanException {
		Object obj = tbl.get(ONE);
		if( obj==null )
			return Collections.emptyMap();
		LuanTable t = (LuanTable)obj;
		Map<String,String> map = new LinkedHashMap<String,String>();
		for( Map.Entry entry : t.iterable() ) {
			String name =(String)entry.getKey();
			String value =(String)entry.getValue();
			map.put(name,value);
		}
		return map;
	}

	private static XmlElement[] elements(LuanTable tbl) throws LuanException {
		List<XmlElement> list = new ArrayList<XmlElement>();
		for( Map.Entry entry : tbl.iterable() ) {
			Object key = entry.getKey();
			if( key.equals(ONE) )
				continue;
			String name = (String)key;
			Object value = entry.getValue();
			XmlElement element;
			if( value instanceof String ) {
				String s = (String)value;
				element = new XmlElement(name,Collections.emptyMap(),s);
			} else {
				LuanTable t = (LuanTable)value;
				Map<String,String> attributes = attributes(t);
				XmlElement[] elements = elements(t);
				element = new XmlElement(name,attributes,elements);
			}
			list.add(element);
		}
		return list.toArray(new XmlElement[0]);
	}


	public static LuanTable parse(Luan luan,String s) throws ParseException, LuanException {
		XmlElement element = XmlParser.parse(s);
		return toTable(luan,new XmlElement[]{element});
	}

	private static LuanTable toTable(Luan luan,XmlElement[] elements) throws LuanException {
		LuanTable tbl = new LuanTable(luan);
		for( XmlElement element : elements ) {
			if( element.content instanceof String ) {
				tbl.put(element.name,element.content);
			} else {
				XmlElement[] els = (XmlElement[])element.content;
				LuanTable t = toTable(luan,els);
				tbl.put(element.name,t);
			}
		}
		return tbl;
	}

}