|
From: <pm_...@us...> - 2011-08-31 15:47:13
|
Revision: 4440
http://mxquery.svn.sourceforge.net/mxquery/?rev=4440&view=rev
Author: pm_fischer
Date: 2011-08-31 15:47:06 +0000 (Wed, 31 Aug 2011)
Log Message:
-----------
- support for cdata-section in Serializer
- support for open-only serialization in HTML mode (e.g. <br>
- <script> content is not escaped in HTML mode
Modified Paths:
--------------
trunk/MXQuery/src/ch/ethz/mxquery/xdmio/XDMSerializer.java
trunk/MXQuery_Testing/src/ch/ethz/mxquery/test/HTMLSerializerTests.java
Modified: trunk/MXQuery/src/ch/ethz/mxquery/xdmio/XDMSerializer.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/xdmio/XDMSerializer.java 2011-08-31 11:22:41 UTC (rev 4439)
+++ trunk/MXQuery/src/ch/ethz/mxquery/xdmio/XDMSerializer.java 2011-08-31 15:47:06 UTC (rev 4440)
@@ -26,6 +26,7 @@
import ch.ethz.mxquery.contextConfig.Context;
import ch.ethz.mxquery.contextConfig.XQStaticContext;
import ch.ethz.mxquery.datamodel.Namespace;
+import ch.ethz.mxquery.datamodel.QName;
import ch.ethz.mxquery.datamodel.types.Type;
import ch.ethz.mxquery.datamodel.types.TypeDictionary;
import ch.ethz.mxquery.datamodel.types.TypeInfo;
@@ -55,7 +56,8 @@
protected boolean startTagStarted = false;
private static TypeDictionary dictionary = Context.getDictionary();
private XDMSerializerSettings settings;
-
+ private QName cdataRoot; // topmost node for CDATA sections
+ private boolean inScriptTag; // for HTML, no escaping inside script tags
//private static boolean endTagFound = false;
private final static String xhtml_empty_elems [] = {"area",
@@ -110,11 +112,32 @@
case Type.START_TAG :
stream.print("<" + tok.getName());
startTagStarted = true;
+ if (settings.getCdataSectionElements() != null && cdataRoot == null) {
+ QName qn = new QName(tok.getNS(),tok.getPrefix(),tok.getName());
+ if (settings.getCdataSectionElements().contains(qn))
+ cdataRoot = qn;
+ }
+ if (tok.getName().equals("script") && settings.getOutputMethod().equals(XDMSerializerSettings.METHOD_HTML))
+ inScriptTag = true;
break;
case Type.END_TAG :
+ // if we have the root of a cdata section, check if the current
+ if (cdataRoot != null && settings.getCdataSectionElements().size() != 0) {
+ QName qn = new QName(tok.getNS(),tok.getPrefix(),tok.getName());
+ if (cdataRoot.equals(qn))
+ cdataRoot = null;
+ }
+ if (tok.getName().equals("script") && settings.getOutputMethod().equals(XDMSerializerSettings.METHOD_HTML))
+ inScriptTag = false;
+ // HTML serialization skips end elements from empty content
+ if ((settings.getOutputMethod().equals(XDMSerializerSettings.METHOD_HTML) &&
+ xhtml_empty_set.contains(tok.getName())))
+ stream.print(">");
+ else
if (prevEventType == Type.START_TAG || Type.isAttribute(prevEventType))
- if (!settings.getOutputMethod().equals(XDMSerializerSettings.METHOD_XHTML))
+ if (!(settings.getOutputMethod().equals(XDMSerializerSettings.METHOD_XHTML) ||
+ settings.getOutputMethod().equals(XDMSerializerSettings.METHOD_HTML)))
stream.print("/>");
else if (xhtml_empty_set.contains(tok.getName()))
stream.print(" />");
@@ -141,7 +164,13 @@
}
if ( Type.isAtomicType(type, dictionary) || type == Type.UNTYPED) {
- String serValue = getSerializedValue(tok);
+ String serValue;
+ if (cdataRoot == null)
+ if (!inScriptTag)
+ serValue = getSerializedValue(tok);
+ else serValue = tok.getText();
+ else
+ serValue = "<![CDATA["+tok.getText()+"]]>";
stream.print(serValue);
}
Modified: trunk/MXQuery_Testing/src/ch/ethz/mxquery/test/HTMLSerializerTests.java
===================================================================
--- trunk/MXQuery_Testing/src/ch/ethz/mxquery/test/HTMLSerializerTests.java 2011-08-31 11:22:41 UTC (rev 4439)
+++ trunk/MXQuery_Testing/src/ch/ethz/mxquery/test/HTMLSerializerTests.java 2011-08-31 15:47:06 UTC (rev 4440)
@@ -1,8 +1,10 @@
package ch.ethz.mxquery.test;
+import ch.ethz.mxquery.datamodel.QName;
import ch.ethz.mxquery.model.XDMIterator;
import ch.ethz.mxquery.query.PreparedStatement;
import ch.ethz.mxquery.testsuite.XQueryTestBase;
+import ch.ethz.mxquery.util.Set;
import ch.ethz.mxquery.xdmio.XDMSerializer;
import ch.ethz.mxquery.xdmio.XDMSerializerSettings;
@@ -125,5 +127,171 @@
result.close(false);
assertEquals(resultBuffer.toString().trim(), "<html><head><script></script></head><body>'</body></html>");
};
+
+ public void testHTMLSerialization() throws Exception{
+ String query = "<html><head/><body/></html>";
+ PreparedStatement prep = prepareQuery(query, false,false, false, false, false);
+
+ result = prep.evaluate();
+ resultBuffer = new StringBuffer();
+ storeBuffer = new StringBuffer();
+ XDMSerializerSettings ser = prep.getOutputSettings();
+ if (ser == null)
+ ser = new XDMSerializerSettings();
+ ser.setOutputMethod(XDMSerializerSettings.METHOD_HTML);
+ ser.setOmitXMLDeclaration(true);
+ XDMSerializer ip = new XDMSerializer(ser);
+ resultBuffer.append(ip.eventsToXML(result));
+
+ prep.applyPUL();
+ if (result.getExpressionCategoryType(false) == XDMIterator.EXPR_CATEGORY_UPDATING)
+ storeBuffer.append(result.getContext().getStores().toString());
+ result.close(false);
+ assertEquals(resultBuffer.toString().trim(), "<html><head></head><body></body></html>");
+ };
+
+ public void testHTMLSerialization_2() throws Exception{
+ String query = "<html><head><script/></head><body><br/></body></html>";
+ PreparedStatement prep = prepareQuery(query, false,false, false, false, false);
+
+ result = prep.evaluate();
+ resultBuffer = new StringBuffer();
+ storeBuffer = new StringBuffer();
+ XDMSerializerSettings ser = prep.getOutputSettings();
+ if (ser == null)
+ ser = new XDMSerializerSettings();
+ ser.setOutputMethod(XDMSerializerSettings.METHOD_HTML);
+ ser.setOmitXMLDeclaration(true);
+ XDMSerializer ip = new XDMSerializer(ser);
+ resultBuffer.append(ip.eventsToXML(result));
+
+ prep.applyPUL();
+ if (result.getExpressionCategoryType(false) == XDMIterator.EXPR_CATEGORY_UPDATING)
+ storeBuffer.append(result.getContext().getStores().toString());
+ result.close(false);
+ assertEquals(resultBuffer.toString().trim(), "<html><head><script></script></head><body><br></body></html>");
+ };
+
+
+ public void testHTMLSerialization_3() throws Exception{
+ String query = "<html><head><script/></head><body><area/><base/><br/><col/><hr/><img/><input/><link/><meta/><basefont/><frame/><isindex/><param/></body></html>";
+ PreparedStatement prep = prepareQuery(query, false,false, false, false, false);
+
+ result = prep.evaluate();
+ resultBuffer = new StringBuffer();
+ storeBuffer = new StringBuffer();
+ XDMSerializerSettings ser = prep.getOutputSettings();
+ if (ser == null)
+ ser = new XDMSerializerSettings();
+ ser.setOutputMethod(XDMSerializerSettings.METHOD_HTML);
+ ser.setOmitXMLDeclaration(true);
+ XDMSerializer ip = new XDMSerializer(ser);
+ resultBuffer.append(ip.eventsToXML(result));
+
+ prep.applyPUL();
+ if (result.getExpressionCategoryType(false) == XDMIterator.EXPR_CATEGORY_UPDATING)
+ storeBuffer.append(result.getContext().getStores().toString());
+ result.close(false);
+ assertEquals(resultBuffer.toString().trim(), "<html><head><script></script></head><body><area><base><br><col><hr><img><input><link><meta><basefont><frame><isindex><param></body></html>");
+ };
+
+ public void testHTMLSerialization_Script() throws Exception{
+ String query = "<html><head><script><![CDATA[if (a < b) foo()]]></script></head><body></body></html>";
+ PreparedStatement prep = prepareQuery(query, false,false, false, false, false);
+
+ result = prep.evaluate();
+ resultBuffer = new StringBuffer();
+ storeBuffer = new StringBuffer();
+ XDMSerializerSettings ser = prep.getOutputSettings();
+ if (ser == null)
+ ser = new XDMSerializerSettings();
+ ser.setOutputMethod(XDMSerializerSettings.METHOD_HTML);
+ ser.setOmitXMLDeclaration(true);
+ XDMSerializer ip = new XDMSerializer(ser);
+ resultBuffer.append(ip.eventsToXML(result));
+
+ prep.applyPUL();
+ if (result.getExpressionCategoryType(false) == XDMIterator.EXPR_CATEGORY_UPDATING)
+ storeBuffer.append(result.getContext().getStores().toString());
+ result.close(false);
+ assertEquals(resultBuffer.toString().trim(), "<html><head><script>if (a < b) foo()</script></head><body></body></html>");
+ };
+
+
+ public void testXMLCDATASerialization() throws Exception{
+ String query = "<html><head><script/></head><body>'</body></html>";
+ PreparedStatement prep = prepareQuery(query, false,false, false, false, false);
+
+ result = prep.evaluate();
+ resultBuffer = new StringBuffer();
+ storeBuffer = new StringBuffer();
+ XDMSerializerSettings ser = prep.getOutputSettings();
+ if (ser == null)
+ ser = new XDMSerializerSettings();
+ Set cdata = new Set();
+ cdata.add(new QName("body"));
+ ser.setCdataSectionElements(cdata);
+ ser.setOmitXMLDeclaration(true);
+ XDMSerializer ip = new XDMSerializer(ser);
+ resultBuffer.append(ip.eventsToXML(result));
+
+ prep.applyPUL();
+ if (result.getExpressionCategoryType(false) == XDMIterator.EXPR_CATEGORY_UPDATING)
+ storeBuffer.append(result.getContext().getStores().toString());
+ result.close(false);
+ assertEquals(resultBuffer.toString().trim(), "<html><head><script/></head><body><![CDATA[']]></body></html>");
+ };
+
+
+ public void testXMLCDATASerializationDesc() throws Exception{
+ String query = "<html><head><script/></head><body><p>Mickey</p><p>Mouse</p>show</body></html>";
+ PreparedStatement prep = prepareQuery(query, false,false, false, false, false);
+
+ result = prep.evaluate();
+ resultBuffer = new StringBuffer();
+ storeBuffer = new StringBuffer();
+ XDMSerializerSettings ser = prep.getOutputSettings();
+ if (ser == null)
+ ser = new XDMSerializerSettings();
+ Set cdata = new Set();
+ cdata.add(new QName("body"));
+ ser.setCdataSectionElements(cdata);
+ ser.setOmitXMLDeclaration(true);
+ XDMSerializer ip = new XDMSerializer(ser);
+ resultBuffer.append(ip.eventsToXML(result));
+
+ prep.applyPUL();
+ if (result.getExpressionCategoryType(false) == XDMIterator.EXPR_CATEGORY_UPDATING)
+ storeBuffer.append(result.getContext().getStores().toString());
+ result.close(false);
+ assertEquals(resultBuffer.toString().trim(), "<html><head><script/></head><body><p><![CDATA[Mickey]]></p><p><![CDATA[Mouse]]></p><![CDATA[show]]></body></html>");
+ };
+
+ public void testXMLCDATASerializationDescManyElemens() throws Exception{
+ String query = "<html><head><script/></head><body><p>Mickey</p><p>Mouse</p>show</body></html>";
+ PreparedStatement prep = prepareQuery(query, false,false, false, false, false);
+
+ result = prep.evaluate();
+ resultBuffer = new StringBuffer();
+ storeBuffer = new StringBuffer();
+ XDMSerializerSettings ser = prep.getOutputSettings();
+ if (ser == null)
+ ser = new XDMSerializerSettings();
+ Set cdata = new Set();
+ cdata.add(new QName("body"));
+ cdata.add(new QName("p"));
+ ser.setCdataSectionElements(cdata);
+ ser.setOmitXMLDeclaration(true);
+ XDMSerializer ip = new XDMSerializer(ser);
+ resultBuffer.append(ip.eventsToXML(result));
+
+ prep.applyPUL();
+ if (result.getExpressionCategoryType(false) == XDMIterator.EXPR_CATEGORY_UPDATING)
+ storeBuffer.append(result.getContext().getStores().toString());
+ result.close(false);
+ assertEquals(resultBuffer.toString().trim(), "<html><head><script/></head><body><p><![CDATA[Mickey]]></p><p><![CDATA[Mouse]]></p><![CDATA[show]]></body></html>");
+ };
+
+
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|