/*
- * Copyright (C) 2001, 2002 The Mir-coders group
+ * Copyright (C) 2005 The Mir-coders group
*
* This file is part of Mir.
*
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, The Mir-coders gives permission to link
- * the code of this program with any library licensed under the Apache Software License,
- * The Sun (tm) Java Advanced Imaging library (JAI), The Sun JIMI library
- * (or with modified versions of the above that use the same license as the above),
- * and distribute linked combinations including the two. You must obey the
- * GNU General Public License in all respects for all of the code used other than
- * the above mentioned libraries. If you modify this file, you may extend this
+ * the code of this program with any library licensed under the Apache Software License.
+ * You must obey the GNU General Public License in all respects for all of the code used
+ * other than the above mentioned libraries. If you modify this file, you may extend this
* exception to your version of the file, but you are not obligated to do so.
* If you do not wish to do so, delete this exception statement from your version.
*/
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringReader;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import mir.generator.tal.interfaces.TALExpressionParser;
import mir.generator.tal.template.CompositeTemplateNode;
import mir.generator.tal.template.PlainTextTemplateNode;
-import mir.generator.tal.template.TALTemplate;
-import mir.generator.tal.template.TALTemplateNodeLibrary;
+import mir.generator.tal.template.Template;
import mir.generator.tal.template.TemplateNode;
+import mir.generator.tal.template.TemplateNodeLibrary;
+import mir.generator.tal.template.TemplateNodeLibraryRegistry;
import mir.util.HTMLRoutines;
import mir.util.xml.SectionHandler;
import mir.util.xml.XMLName;
import mir.util.xml.XMLParserFailure;
import mir.util.xml.XMLReaderTool;
-// TODO: add a templatelibrary repository and remove dependency of TALTemplateEngine
-
public class TALTemplateParser {
- private TALTemplateEngine engine;
+ private TemplateNodeLibraryRegistry registry;
- //private static final String TAL_PREFIX = "tal";
- public TALTemplateParser(TALTemplateEngine anEngine) {
- engine = anEngine;
+ public TALTemplateParser(TemplateNodeLibraryRegistry aRegistry) {
+ registry = aRegistry;
}
- public TALTemplate parse(String aData, TALExpressionParser aParser) throws TALExc, TALFailure {
+ public Template parse(String aData, TALExpressionParser aParser) throws TALExc, TALFailure {
return parse(new StringReader(aData), aParser);
}
- public TALTemplate parse(File aFile, TALExpressionParser aParser) throws TALExc, TALFailure {
+ public Template parse(File aFile, TALExpressionParser aParser) throws TALExc, TALFailure {
try {
return parse(new BufferedInputStream(new FileInputStream(aFile), 1024*128), aParser);
}
throw new TALFailure(e);
}
}
- public TALTemplate parse(InputStream anInputStream, TALExpressionParser aParser) throws TALExc, TALFailure {
+ public Template parse(InputStream anInputStream, TALExpressionParser aParser) throws TALExc, TALFailure {
return parse(new InputStreamReader(anInputStream), aParser);
}
- public TALTemplate parse(Reader aReader, TALExpressionParser aParser) throws TALExc, TALFailure {
- TALHandler handler = new TALHandler(aParser);
+ public Template parse(Reader aReader, TALExpressionParser aParser) throws TALExc, TALFailure {
+ Map templateContext = new HashMap();
+ TALHandler handler = new TALHandler(aParser, templateContext);
try {
XMLParserEngine.getInstance().parse("html", aReader, handler);
throw new TALFailure(e);
}
- return new TALTemplate(aParser, handler.getNode());
+ return new Template(aParser, handler.getNode(), templateContext);
}
protected class TALHandler implements SectionHandler {
private CompositeTemplateNode compositeNode;
private StringBuffer data;
+ private StringBuffer plainData;
private TALExpressionParser parser;
private String currentTag;
- private TALTemplateNodeLibrary library;
+ private TemplateNodeLibrary library;
private XMLName tag;
private Map attributes;
+ private Map templateContext;
- public TALHandler(TALExpressionParser aParser) {
+ public TALHandler(TALExpressionParser aParser, Map aTemplateContext) {
parser = aParser;
data = new StringBuffer();
+ plainData = new StringBuffer();
compositeNode = new CompositeTemplateNode();
+ templateContext = aTemplateContext;
}
private void flushData() {
if (data.length()!=0) {
- compositeNode.appendSubNode(new PlainTextTemplateNode(data.toString()));
+ compositeNode.appendSubNode(new PlainTextTemplateNode(data.toString(), plainData.toString()));
data.delete(0, data.length());
+ plainData.delete(0, plainData.length());
}
}
appendCode(anExtraData);
}
- public TALTemplateNodeLibrary findLibrary(XMLName aName) {
- TALTemplateNodeLibrary result = null;
+ public TemplateNodeLibrary findLibrary(XMLName aName) {
+ TemplateNodeLibrary result = null;
if (aName.getNamespaceURI()!=null) {
- result = engine.getLibraryForUrl(aName.getNamespaceURI());
+ result = registry.findLibraryForUrl(aName.getNamespaceURI());
}
if ((result == null) && (aName.getPrefix()!=null) && (aName.getPrefix().length()>0)) {
- result = engine.getLibraryForPrefix(aName.getPrefix());
+ result = registry.findLibraryForPrefix(aName.getPrefix());
}
return result;
appendText((String) entry.getValue());
appendCode("\"");
}
- appendCode(">");
}
else {
tag = aTag;
attributes = anAttributes;
}
- return new TALHandler(parser);
- };
+ return new TALHandler(parser, templateContext);
+ }
public void endElement(mir.util.xml.SectionHandler aHandler) throws XMLParserExc {
if (library == null) {
- appendSubNode(((TALHandler) aHandler).getNode());
- appendCode("</"+currentTag+">");
+ TemplateNode subNode = ((TALHandler) aHandler).getNode();
+ if (subNode instanceof CompositeTemplateNode &&
+ ((CompositeTemplateNode) subNode).isEmpty()) {
+ appendCode(" />");
+ }
+ else {
+ appendCode(">");
+ appendSubNode(subNode);
+ appendCode("</"+currentTag+">");
+ }
}
else {
- appendSubNode(library.constructTemplateNode(parser, tag, attributes, ((TALHandler) aHandler).getNode()));
+ appendSubNode(
+ library.constructTemplateNode(parser, tag, attributes, ((TALHandler) aHandler).getNode(), templateContext));
tag = null;
attributes = null;
}
- };
+ }
protected void appendSubNode(TemplateNode aNode) {
flushData();
protected void appendText(String aText) {
data.append(HTMLRoutines.encodeHTML(aText));
+ plainData.append(aText);
}
public void finishSection() throws XMLParserExc {