| OLD | NEW |
| (Empty) |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 package com.dom_distiller.client; | |
| 6 | |
| 7 import com.google.gwt.core.client.JsArray; | |
| 8 import com.google.gwt.dom.client.Element; | |
| 9 import com.google.gwt.dom.client.Node; | |
| 10 import com.google.gwt.dom.client.NodeList; | |
| 11 import com.google.gwt.dom.client.Text; | |
| 12 | |
| 13 import org.xml.sax.Attributes; | |
| 14 import org.xml.sax.AttributesImpl; | |
| 15 import org.xml.sax.ContentHandler; | |
| 16 import org.xml.sax.SAXException; | |
| 17 | |
| 18 import java.util.ArrayList; | |
| 19 import java.util.List; | |
| 20 import java.util.logging.Logger; | |
| 21 | |
| 22 /** | |
| 23 * Used to generate sax events from the DOM tree. | |
| 24 */ | |
| 25 public class DomToSaxParser { | |
| 26 static Logger logger = Logger.getLogger("DomToSaxParser"); | |
| 27 | |
| 28 private static class DomToSaxVisitor implements DomWalker.Visitor { | |
| 29 private static final String sHtmlNamespace = "http://www.w3.org/1999/xht
ml"; | |
| 30 private final ContentHandler handler; | |
| 31 private List<Node> textNodes; | |
| 32 | |
| 33 DomToSaxVisitor(ContentHandler h) { | |
| 34 handler = h; | |
| 35 textNodes = new ArrayList<Node>(); | |
| 36 } | |
| 37 | |
| 38 @Override | |
| 39 public boolean visit(Node n) { | |
| 40 try { | |
| 41 switch (n.getNodeType()) { | |
| 42 case Node.TEXT_NODE: | |
| 43 textNodes.add(n); | |
| 44 String text = Text.as(n).getData(); | |
| 45 handler.characters(text.toCharArray(), 0, text.length())
; | |
| 46 return false; | |
| 47 case Node.ELEMENT_NODE: | |
| 48 Element e = Element.as(n); | |
| 49 Attributes attrs = getSaxAttributes(e); | |
| 50 handler.startElement(sHtmlNamespace, e.getTagName(), e.g
etTagName(), attrs); | |
| 51 return true; | |
| 52 case Node.DOCUMENT_NODE: // Don't recurse into sub-document
s. | |
| 53 default: // This case is for comment nodes. | |
| 54 return false; | |
| 55 } | |
| 56 } catch (SAXException e) { | |
| 57 return false; | |
| 58 } | |
| 59 } | |
| 60 | |
| 61 @Override | |
| 62 public void exit(Node n) { | |
| 63 Element e = Element.as(n); | |
| 64 try { | |
| 65 handler.endElement(sHtmlNamespace, e.getTagName(), e.getTagName(
)); | |
| 66 } catch (SAXException ex) { | |
| 67 // Intentionally ignored. | |
| 68 } | |
| 69 } | |
| 70 } | |
| 71 | |
| 72 /** | |
| 73 * This will generate sax events for the DOM tree rooted at e to the provide
d ContentHandler. | |
| 74 * | |
| 75 * @Return A list of the text nodes (in order). | |
| 76 */ | |
| 77 static List<Node> parse(Element e, ContentHandler handler) { | |
| 78 DomToSaxVisitor visitor = new DomToSaxVisitor(handler); | |
| 79 new DomWalker(visitor).walk(e); | |
| 80 return visitor.textNodes; | |
| 81 } | |
| 82 | |
| 83 /** | |
| 84 * @Return The element's attribute list converted to org.xml.sax.Attributes. | |
| 85 */ | |
| 86 public static Attributes getSaxAttributes(Element e) { | |
| 87 AttributesImpl attrs = new AttributesImpl(); | |
| 88 | |
| 89 JsArray<Node> jsAttrs = DomUtil.getAttributes(e); | |
| 90 for (int i = 0; i < jsAttrs.length(); ++i) { | |
| 91 final Node jsAttr = jsAttrs.get(i); | |
| 92 attrs.addAttribute("", jsAttr.getNodeName(), jsAttr.getNodeName(), "
CDATA", jsAttr.getNodeValue()); | |
| 93 } | |
| 94 | |
| 95 return attrs; | |
| 96 } | |
| 97 } | |
| OLD | NEW |