-/*\r
- * Copyright (C) 2001, 2002 The Mir-coders group\r
- *\r
- * This file is part of Mir.\r
- *\r
- * Mir is free software; you can redistribute it and/or modify\r
- * it under the terms of the GNU General Public License as published by\r
- * the Free Software Foundation; either version 2 of the License, or\r
- * (at your option) any later version.\r
- *\r
- * Mir is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
- * GNU General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU General Public License\r
- * along with Mir; if not, write to the Free Software\r
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\r
- *\r
- * In addition, as a special exception, The Mir-coders gives permission to link\r
- * the code of this program with any library licensed under the Apache Software License,\r
- * The Sun (tm) Java Advanced Imaging library (JAI), The Sun JIMI library\r
- * (or with modified versions of the above that use the same license as the above),\r
- * and distribute linked combinations including the two. You must obey the\r
- * GNU General Public License in all respects for all of the code used other than\r
- * the above mentioned libraries. If you modify this file, you may extend this\r
- * exception to your version of the file, but you are not obligated to do so.\r
- * If you do not wish to do so, delete this exception statement from your version.\r
- */\r
-package mir.generator.tal;\r
-\r
-import java.io.InputStream;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-import java.util.Map;\r
-\r
-import mir.generator.tal.interfaces.TALExpressionParser;\r
-import mir.util.HTMLRoutines;\r
-import mir.util.StringRoutines;\r
-import mir.util.XMLReader;\r
-import mir.util.XMLReader.AbstractSectionHandler;\r
-\r
-public class TALTemplateParser {\r
- private int bal;\r
- private static final String TAL_PREFIX = "tal";\r
-\r
- public static TALTemplate parseString(String aData, TALExpressionParser aParser) throws TALExc, TALFailure {\r
- try {\r
- TALHandler handler = new TALHandler(aParser);\r
- XMLReader reader = new XMLReader(false);\r
-\r
- reader.parseString(aData, handler);\r
-\r
- return new TALTemplate(aParser, handler.getNode());\r
- }\r
- catch (Throwable t) {\r
- throw new TALFailure(t);\r
- }\r
- }\r
-\r
- public static TALTemplate parseInputStream(InputStream anInputStream, TALExpressionParser aParser) throws TALExc, TALFailure {\r
- try {\r
- TALHandler handler = new TALHandler(aParser);\r
- XMLReader reader = new XMLReader(false);\r
-\r
- reader.parseInputStream(anInputStream, handler);\r
-\r
- return new TALTemplate(aParser, handler.getNode());\r
- }\r
- catch (Throwable t) {\r
- throw new TALFailure(t);\r
- }\r
- }\r
-\r
- private static String normalizeXMLName(XMLReader.XMLName aName) {\r
- String result = aName.getLocalName();\r
- if (aName.getPrefix().length() > 0)\r
- result = aName.getPrefix() + ":" + result;\r
-\r
- return result;\r
- }\r
-\r
-\r
-\r
- private static final String CONDITION_ATTRIBUTE = "tal:condition";\r
- private static final String REPEAT_ATTRIBUTE = "tal:repeat";\r
- private static final String CONTENT_ATTRIBUTE = "tal:content";\r
- private static final String ERROR_ATTRIBUTE = "tal:on-error";\r
- private static final String REPLACE_ATTRIBUTE = "tal:replace";\r
- private static final String DEFINITION_ATTRIBUTE = "tal:define";\r
- private static final String ONERROR_ATTRIBUTE = "tal:onerror";\r
- private static final String OMITTAG_ATTRIBUTE = "tal:omit-tag";\r
- private static final String ATTRIBUTE_ATTRIBUTE = "tal:attributes";\r
-\r
-\r
- protected static class TALHandler extends XMLReader.AbstractSectionHandler {\r
- private TALTemplate.CompositeTemplateNode compositeNode;\r
- private StringBuffer data;\r
- private TALExpressionParser parser;\r
- private TALTemplate.SmartTemplateNode smartNode;\r
- private boolean smartTag;\r
- private String currentTag;\r
-\r
- public TALHandler(TALExpressionParser aParser) {\r
- parser = aParser;\r
- data = new StringBuffer();\r
- compositeNode = new TALTemplate.CompositeTemplateNode();\r
- }\r
-\r
- private void flushData() {\r
- if (data.length()!=0) {\r
- compositeNode.appendSubNode(new TALTemplate.PlainTextTemplateNode(data.toString()));\r
- data.delete(0, data.length());\r
- }\r
- }\r
-\r
- public XMLReader.SectionHandler startElement(XMLReader.XMLName aTag, Map anAttributes) throws XMLReader.XMLReaderExc {\r
- smartTag = false;\r
-\r
- currentTag = normalizeXMLName(aTag);\r
-\r
- smartTag = (aTag.getPrefix().equals(TAL_PREFIX));\r
-\r
- Iterator i = anAttributes.keySet().iterator();\r
-\r
- while (!smartTag && i.hasNext()) {\r
- XMLReader.XMLName name = (XMLReader.XMLName) i.next();\r
- smartTag = smartTag || (name.getPrefix().equals(TAL_PREFIX));\r
- }\r
-\r
- if (!smartTag) {\r
- appendCode("<"+currentTag);\r
- i = anAttributes.entrySet().iterator();\r
-\r
- while (i.hasNext()) {\r
- Map.Entry entry = (Map.Entry) i.next();\r
-\r
- appendCode(" "+ normalizeXMLName((XMLReader.XMLName) entry.getKey()));\r
- appendCode("=\"");\r
- appendText((String) entry.getValue());\r
- appendCode("\"");\r
- }\r
- appendCode(">");\r
- }\r
- else {\r
- smartNode = new TALTemplate.SmartTemplateNode(currentTag);\r
- if (aTag.getPrefix().equals(TAL_PREFIX))\r
- smartNode.setOmitTag(parser.preparseTRUE());\r
-\r
- i = anAttributes.entrySet().iterator();\r
- while (i.hasNext()) {\r
- Map.Entry entry = (Map.Entry) i.next();\r
- XMLReader.XMLName name = (XMLReader.XMLName) entry.getKey();\r
-\r
- if (!name.getPrefix().equals(TAL_PREFIX)) {\r
- smartNode.addFixedAttribute(normalizeXMLName(name), (String) entry.getValue());\r
- }\r
- else {\r
- if (name.getLocalName().equalsIgnoreCase(DEFINITION_ATTRIBUTE)) {\r
- List definitions = StringRoutines.splitStringWithEscape((String) entry.getValue(), ';', '\\');\r
-\r
- Iterator j = definitions.iterator(); {\r
- List parts = StringRoutines.separateString((String) i.next(), " ");\r
-\r
- if (parts.size()==2) {\r
- smartNode.addDefinition(parser.preparseReferenceExpression((String) parts.get(0)), parser.preparseExpression((String) parts.get(1)));\r
- }\r
- }\r
- }\r
- else if (name.getLocalName().equalsIgnoreCase(CONDITION_ATTRIBUTE)) {\r
- smartNode.setCondition(parser.preparseBooleanExpression((String) entry.getValue()));\r
- }\r
- else if (name.getLocalName().equalsIgnoreCase(CONTENT_ATTRIBUTE)) {\r
- smartNode.setContent(parser.preparseStringExpression((String) entry.getValue()));\r
- }\r
- else if (name.getLocalName().equalsIgnoreCase(ERROR_ATTRIBUTE)) {\r
- smartNode.setError(parser.preparseStringExpression((String) entry.getValue()));\r
- }\r
- else if (name.getLocalName().equalsIgnoreCase(OMITTAG_ATTRIBUTE)) {\r
- if (((String) entry.getValue()).trim().length()==0)\r
- smartNode.setOmitTag(parser.preparseTRUE());\r
- else\r
- smartNode.setOmitTag(parser.preparseBooleanExpression((String) entry.getValue()));\r
- }\r
- else if (name.getLocalName().equalsIgnoreCase(REPLACE_ATTRIBUTE)) {\r
- smartNode.setOmitTag(parser.preparseTRUE());\r
- smartNode.setContent(parser.preparseStringExpression((String) entry.getValue()));\r
- }\r
- else if (name.getLocalName().equalsIgnoreCase(REPEAT_ATTRIBUTE)) {\r
- List parts = StringRoutines.separateString((String) entry.getValue(), " ");\r
-\r
- if (parts.size()==2) {\r
- smartNode.setRepeat(parser.preparseReferenceExpression((String) parts.get(0)), parser.preparseExpression((String) parts.get(1)));\r
- }\r
- }\r
- else if (name.getLocalName().equalsIgnoreCase(ATTRIBUTE_ATTRIBUTE)) {\r
- List attributes = StringRoutines.splitStringWithEscape((String) entry.getValue(), ';', '\\');\r
-\r
- Iterator j = attributes.iterator(); {\r
- List parts = StringRoutines.separateString((String) i.next(), " ");\r
-\r
- if (parts.size()==2) {\r
- smartNode.addModifiedAttribute((String) parts.get(0), parser.preparseExpression((String) parts.get(1)));\r
- }\r
- }\r
- }\r
- }\r
- }\r
- }\r
-\r
- flushData();\r
-\r
- return new TALHandler(parser);\r
- };\r
-\r
- public void endElement(XMLReader.SectionHandler aHandler) throws XMLReader.XMLReaderExc {\r
- if (!smartTag) {\r
- appendSubNode(((TALHandler) aHandler).getNode());\r
- appendCode("</"+currentTag+">");\r
- }\r
- else {\r
- smartNode.setBody(((TALHandler) aHandler).getNode());\r
- appendSubNode(smartNode);\r
- smartNode=null;\r
- }\r
- };\r
-\r
- protected void appendSubNode(TALTemplate.TemplateNode aNode) {\r
- compositeNode.appendSubNode(aNode);\r
- }\r
-\r
- protected void appendCode(String aCode) {\r
- data.append(aCode);\r
- }\r
-\r
- protected void appendText(String aText) {\r
- data.append(HTMLRoutines.encodeHTML(aText));\r
- }\r
-\r
- public void finishSection() throws XMLReader.XMLReaderExc {\r
- flushData();\r
- }\r
-\r
- public TALTemplate.TemplateNode getNode() {\r
- return compositeNode;\r
- }\r
-\r
- public void characters(String aCharacters) throws XMLReader.XMLReaderExc {\r
- appendText(aCharacters);\r
- }\r
- }\r
-}\r
+/*
+ * Copyright (C) 2005 The Mir-coders group
+ *
+ * This file is part of Mir.
+ *
+ * Mir is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Mir is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Mir; if not, write to the Free Software
+ * 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.
+ * 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.
+ */
+package mir.generator.tal;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+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.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.XMLParserEngine;
+import mir.util.xml.XMLParserExc;
+import mir.util.xml.XMLParserFailure;
+import mir.util.xml.XMLReaderTool;
+
+public class TALTemplateParser {
+ private TemplateNodeLibraryRegistry registry;
+
+ public TALTemplateParser(TemplateNodeLibraryRegistry aRegistry) {
+ registry = aRegistry;
+ }
+
+ public Template parse(String aData, TALExpressionParser aParser) throws TALExc, TALFailure {
+ return parse(new StringReader(aData), aParser);
+ }
+
+ public Template parse(File aFile, TALExpressionParser aParser) throws TALExc, TALFailure {
+ try {
+ return parse(new BufferedInputStream(new FileInputStream(aFile), 1024*128), aParser);
+ }
+ catch (FileNotFoundException e) {
+ throw new TALFailure(e);
+ }
+ }
+ public Template parse(InputStream anInputStream, TALExpressionParser aParser) throws TALExc, TALFailure {
+ return parse(new InputStreamReader(anInputStream), 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);
+ }
+ catch (XMLParserExc e) {
+ throw new TALFailure(e);
+ }
+
+ 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 TemplateNodeLibrary library;
+ private XMLName tag;
+ private Map attributes;
+ private Map templateContext;
+
+ 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(), plainData.toString()));
+ data.delete(0, data.length());
+ plainData.delete(0, plainData.length());
+ }
+ }
+
+ public void extra(String anExtraData) throws XMLParserExc, XMLParserFailure {
+ appendCode(anExtraData);
+ }
+
+ public TemplateNodeLibrary findLibrary(XMLName aName) {
+ TemplateNodeLibrary result = null;
+
+ if (aName.getNamespaceURI()!=null) {
+ result = registry.findLibraryForUrl(aName.getNamespaceURI());
+ }
+
+ if ((result == null) && (aName.getPrefix()!=null) && (aName.getPrefix().length()>0)) {
+ result = registry.findLibraryForPrefix(aName.getPrefix());
+ }
+
+ return result;
+ }
+
+ public SectionHandler startElement(mir.util.xml.XMLName aTag, Map anAttributes) throws XMLParserExc {
+ library = findLibrary(aTag);
+
+ Iterator i = anAttributes.keySet().iterator();
+ while (library==null && i.hasNext()) {
+ library=findLibrary((XMLName) i.next());
+ }
+
+ currentTag = XMLReaderTool.normalizeXMLName(aTag);
+
+ if (library == null) {
+ appendCode("<"+currentTag);
+ i = anAttributes.entrySet().iterator();
+
+ while (i.hasNext()) {
+ Map.Entry entry = (Map.Entry) i.next();
+
+ appendCode(" "+ XMLReaderTool.normalizeXMLName((XMLName) entry.getKey()));
+ appendCode("=\"");
+ appendText((String) entry.getValue());
+ appendCode("\"");
+ }
+ }
+ else {
+ tag = aTag;
+ attributes = anAttributes;
+ }
+
+ return new TALHandler(parser, templateContext);
+ }
+
+ public void endElement(mir.util.xml.SectionHandler aHandler) throws XMLParserExc {
+ if (library == null) {
+ 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(), templateContext));
+ tag = null;
+ attributes = null;
+ }
+ }
+
+ protected void appendSubNode(TemplateNode aNode) {
+ flushData();
+
+ compositeNode.appendSubNode(aNode);
+ }
+
+ protected void appendCode(String aCode) {
+ data.append(aCode);
+ }
+
+ protected void appendText(String aText) {
+ data.append(HTMLRoutines.encodeHTML(aText));
+ plainData.append(aText);
+ }
+
+ public void finishSection() throws XMLParserExc {
+ flushData();
+ }
+
+ public TemplateNode getNode() {
+ return compositeNode;
+ }
+
+ public void characters(String aCharacters) throws XMLParserExc {
+ appendText(aCharacters);
+ }
+
+ public void startSection() throws XMLParserExc, XMLParserFailure {
+ }
+ }
+}