/* * Copyright 2008 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.uibinder.rebind; import com.google.gwt.core.ext.UnableToCompleteException; import com.google.gwt.uibinder.rebind.XMLElement.Interpreter; import org.w3c.dom.CDATASection; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.Text; class GetEscapedInnerTextVisitor implements NodeVisitor { /** * Gathers a text representation of the children of the given Elem, and stuffs * it into the given StringBuffer. Applies the interpreter to each descendant, * and uses the writer to report errors. */ public static void getEscapedInnerText(Element elem, StringBuffer buffer, Interpreter<String> interpreter, XMLElementProvider writer) throws UnableToCompleteException { new ChildWalker().accept(elem, new GetEscapedInnerTextVisitor(buffer, interpreter, writer)); } protected final StringBuffer buffer; protected final Interpreter<String> interpreter; protected final XMLElementProvider elementProvider; protected GetEscapedInnerTextVisitor(StringBuffer buffer, Interpreter<String> interpreter, XMLElementProvider elementProvider) { this.buffer = buffer; this.interpreter = interpreter; this.elementProvider = elementProvider; } public void visitCData(CDATASection d) { // TODO(jgw): write this back just as it came in. } public void visitElement(Element e) throws UnableToCompleteException { String replacement = interpreter.interpretElement(elementProvider.get(e)); if (replacement != null) { buffer.append(replacement); } } public void visitText(Text t) { String escaped = UiBinderWriter.escapeText(t.getTextContent(), preserveWhiteSpace(t)); buffer.append(escaped); } private boolean preserveWhiteSpace(Text t) { Element parent = Node.ELEMENT_NODE == t.getParentNode().getNodeType() ? (Element) t.getParentNode() : null; boolean preserveWhitespace = parent != null && "pre".equals(parent.getTagName()); // TODO(rjrjr) What about script blocks? return preserveWhitespace; } }