package org.qrone.r7.parser; import java.net.URI; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.Set; import org.qrone.r7.parser.HTML5Deck.HTML5Set; import org.qrone.r7.script.browser.Function; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.Text; public class HTML5Selializer extends HTML5TagWriter{ static{ noendtaglist.addAll(Arrays.asList(noendtags)); noendtaglist.addAll(Arrays.asList(nnendtags)); } int formatting = 0; boolean inScript; boolean inHead; public HTML5Selializer( Element body, HTML5Set set, HTML5Deck deck, Node node, URI uri, HTML5Writer w, HTML5Template t, HTML5OM om, String id, String ticket){ super(w, id, uri, ticket); this.body = body; this.set = set; this.node = node; this.deck = deck; this.t = t; this.om = om; } private Element body; private HTML5Set set; private Node node; private HTML5Deck deck; private URI uri; private HTML5OM om; private HTML5Template t; @Override public void visit(Document e) { append("<!DOCTYPE html>"); super.visit(e); } @Override public void visit(Element e) { if(e.getNodeName().equals("head")){ start(e); inHead = true; accept(e); inHead = false; deck.outputStyles(b, set, uri); end(e); }else if(e.getNodeName().equals("body")){ if(node != body){ start(e); } accept(e); if(node != body){ deck.outputScripts(b, set, uri); end(e); } }else if(e.getNodeName().equals("script")){ if(!inHead){ start(e); inScript = true; accept(e); inScript = false; end(e); } }else if(e.getNodeName().equals("style")){ }else if(e.getNodeName().equals("link")){ if(!HTML5OM.isCSSLinkTab(e)){ start(e); accept(e); end(e); } }else if(e.getNodeName().equals("meta")){ if(e.getAttribute("name").equals("extends")){ }else{ start(e); accept(e); end(e); } }else if(e.getNodeName().equals("pre") || e.getNodeName().equals("code") || e.getNodeName().equals("textarea")){ formatting++; start(e); accept(e); end(e); formatting--; }else if(e.getNodeName().equals("meta")){ if(e.getAttribute("name").equals("extends")){ }else{ start(e); accept(e); end(e); } }else if(e.getNodeName().equals("form")){ start(e); accept(e); if(ticket != null){ append("<input type=\"hidden\" name=\".ticket\" value=\"" + ticket + "\"/>"); } end(e); }else{ start(e); accept(e); end(e); } } @Override public void visit(Text n) { if(inScript){ append(n.getNodeValue()); }else if(formatting>0){ append_pre(n.getNodeValue()); }else{ append(escape(n.getNodeValue())); } } protected void accept(Element e) { if(t != null){ HTML5Element node = t.get(e); if(node == null){ super.accept(e); }else{ accept(node); } } } private void accept(List nodes){ if(nodes != null){ for (Iterator iter = nodes.iterator(); iter.hasNext();) { dispatch(iter.next()); } } } private void accept(HTML5Element e){ if(e.content == null){ HTML5Template et = e.getDocument(); if(et == t){ super.accept(e.get()); }else{ et.out(b, e, ticket); } }else{ dispatch(e.content); } } private void dispatch(Object o) { if(o instanceof Set){ Set<Node> set = (Set<Node>)o; for (Iterator iter2 = set.iterator(); iter2.hasNext();) { Node node = (Node) iter2.next(); dispatch(node); } }else if(o instanceof Element){ accept((Element)o); }else if(o instanceof HTML5Element){ accept((HTML5Element)o); }else if(o instanceof HTML5NodeSet){ HTML5NodeSet set = (HTML5NodeSet)o; HTML5Template et = set.getDocument(); if(et == t){ dispatch(set.get()); }else{ et.out(b, set, ticket); } }else if(o instanceof HTML5Template){ HTML5Template t = (HTML5Template)o; t.out(b, t.getBody(), ticket); }else{ append(o.toString()); } } }