package name.panitz.crempel.util.xml.parslib;
import java.util.List;
import java.util.ArrayList;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import name.panitz.crempel.util.Closure;
public class Element extends AbstractParser {
Parser p=null;
private final Closure> pc;
final String elementName;
public Element(String n,Parser _p){elementName=n;p=_p;pc=null;}
public Element(String n,Closure> _p){elementName=n;pc=_p;}
public Parser getP(){if (p==null) p=pc.eval(); return p;}
public ParseResult parse(List xs){
if (xs.isEmpty()) {return new Fail(xs);}
Node x = xs.get(0);
while ( x.getNodeType()==Node.TEXT_NODE
&& x.getNodeValue().trim().length()==0
){
xs=xs.subList(1,xs.size());
if (xs.isEmpty()) return new Fail(xs);
x = xs.get(0);
}
final String name = x.getNodeName();
System.out.println(name+" <-> "+elementName);
if (!name.equals(elementName))
return new Fail(xs);
final List ys = nodelistToList(x.getChildNodes());
ParseResult res = getP().parse(ys);
if( res.failed()) return new Fail(xs);
for (Node y :res.e2){
if (y.getNodeType()!=Node.TEXT_NODE
|| y.getNodeValue().trim().length()!=0)
return new Fail(xs);
}
return new ParseResult(res.e1,xs.subList(1,xs.size()));
}
static public List nodelistToList(NodeList xs){
List result = new ArrayList();
for (int i=0;i