You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by db...@locus.apache.org on 2000/05/18 20:37:32 UTC
cvs commit: xml-xalan/c/src/XMLSupport Formatter.hpp FormatterListener.cpp FormatterListener.hpp FormatterToDOM.cpp FormatterToHTML.cpp FormatterToHTML.hpp FormatterToText.cpp FormatterToXML.cpp FormatterToXML.hpp XMLParserLiaisonDefault.cpp
dbertoni 00/05/18 11:37:30
Modified: c/src/XMLSupport Formatter.hpp FormatterListener.cpp
FormatterListener.hpp FormatterToDOM.cpp
FormatterToHTML.cpp FormatterToHTML.hpp
FormatterToText.cpp FormatterToXML.cpp
FormatterToXML.hpp XMLParserLiaisonDefault.cpp
Log:
Competely re-worked FormatterToHTML and FormatterToXML. Made some changes to support switching formatters "on-the-fly"
Revision Changes Path
1.4 +0 -28 xml-xalan/c/src/XMLSupport/Formatter.hpp
Index: Formatter.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XMLSupport/Formatter.hpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- Formatter.hpp 2000/04/11 14:42:59 1.3
+++ Formatter.hpp 2000/05/18 18:37:20 1.4
@@ -79,34 +79,6 @@
{
public:
-#if defined(XALAN_INLINE_INITIALIZATION)
-
- /**
- * Output results as XML.
- */
- const int OUTPUT_METH_XML = 1;
-
- /**
- * Output results as HTML.
- */
- const int OUTPUT_METH_HTML = 2;
-
- /**
- * Output results as TEXT.
- */
- const int OUTPUT_METH_TEXT = 3;
-
-#else
-
- enum eFormats
- {
- OUTPUT_METH_XML = 1,
- OUTPUT_METH_HTML = 2,
- OUTPUT_METH_TEXT = 3
- };
-
-#endif
-
Formatter();
virtual
1.2 +4 -3 xml-xalan/c/src/XMLSupport/FormatterListener.cpp
Index: FormatterListener.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XMLSupport/FormatterListener.cpp,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- FormatterListener.cpp 1999/12/18 19:47:52 1.1
+++ FormatterListener.cpp 2000/05/18 18:37:23 1.2
@@ -55,7 +55,7 @@
* <http://www.apache.org/>.
*/
/**
- * $Id: FormatterListener.cpp,v 1.1 1999/12/18 19:47:52 robweir Exp $
+ * $Id: FormatterListener.cpp,v 1.2 2000/05/18 18:37:23 dbertoni Exp $
*
* $State: Exp $
*
@@ -69,8 +69,9 @@
-FormatterListener::FormatterListener() :
- DocumentHandler()
+FormatterListener::FormatterListener(eFormat theFormat) :
+ DocumentHandler(),
+ m_outputFormat(theFormat)
{
}
1.7 +23 -3 xml-xalan/c/src/XMLSupport/FormatterListener.hpp
Index: FormatterListener.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XMLSupport/FormatterListener.hpp,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- FormatterListener.hpp 2000/04/11 14:43:00 1.6
+++ FormatterListener.hpp 2000/05/18 18:37:23 1.7
@@ -58,7 +58,7 @@
#define FORMATTERLISTENER_HEADER_GUARD_1357924680
/**
- * $Id: FormatterListener.hpp,v 1.6 2000/04/11 14:43:00 dbertoni Exp $
+ * $Id: FormatterListener.hpp,v 1.7 2000/05/18 18:37:23 dbertoni Exp $
*
* $State: Exp $
*
@@ -84,11 +84,28 @@
{
public:
- FormatterListener();
- virtual
+ enum eFormat
+ {
+ OUTPUT_METHOD_NONE = 0,
+ OUTPUT_METHOD_XML = 1,
+ OUTPUT_METHOD_HTML = 2,
+ OUTPUT_METHOD_TEXT = 3,
+ OUTPUT_METHOD_DOM = 4,
+ OUTPUT_METHOD_OTHER = 5
+ };
+
+ FormatterListener(eFormat theFormat);
+ virtual
~FormatterListener();
+
+ eFormat
+ getOutputFormat() const
+ {
+ return m_outputFormat;
+ }
+
/**
* Receive notification of character data. If available, when the
* disable-output-escaping attribute is used, output raw text without
@@ -185,6 +202,9 @@
const XMLCh* const name,
AttributeList& attrs) = 0;
+private:
+
+ const eFormat m_outputFormat;
};
1.7 +2 -0 xml-xalan/c/src/XMLSupport/FormatterToDOM.cpp
Index: FormatterToDOM.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XMLSupport/FormatterToDOM.cpp,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- FormatterToDOM.cpp 2000/04/11 14:43:00 1.6
+++ FormatterToDOM.cpp 2000/05/18 18:37:23 1.7
@@ -87,6 +87,7 @@
XalanDocument* doc,
XalanDocumentFragment* docFrag,
XalanElement* currentElement) :
+ FormatterListener(OUTPUT_METHOD_DOM),
m_doc(doc),
m_docFrag(docFrag),
m_currentElem(currentElement),
@@ -100,6 +101,7 @@
FormatterToDOM::FormatterToDOM(
XalanDocument* doc,
XalanElement* elem) :
+ FormatterListener(OUTPUT_METHOD_DOM),
m_doc(doc),
m_docFrag(0),
m_currentElem(elem),
1.17 +1196 -678 xml-xalan/c/src/XMLSupport/FormatterToHTML.cpp
Index: FormatterToHTML.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XMLSupport/FormatterToHTML.cpp,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- FormatterToHTML.cpp 2000/05/15 15:52:49 1.16
+++ FormatterToHTML.cpp 2000/05/18 18:37:23 1.17
@@ -55,7 +55,7 @@
* <http://www.apache.org/>.
*/
/**
- * $Id: FormatterToHTML.cpp,v 1.16 2000/05/15 15:52:49 dbertoni Exp $
+ * $Id: FormatterToHTML.cpp,v 1.17 2000/05/18 18:37:23 dbertoni Exp $
*
* $State: Exp $
*
@@ -71,12 +71,14 @@
#include <cassert>
#include <climits>
+#include <map>
-#include <sax/SAXException.hpp>
+#include <sax/AttributeList.hpp>
+
#include <PlatformSupport/DOMStringHelper.hpp>
#include <PlatformSupport/Writer.hpp>
@@ -85,46 +87,171 @@
#include <DOMSupport/DOMServices.hpp>
+
+#if defined(XALAN_WIDE_STRING_UCODE_PROBLEM)
+static const char* const theHTMLSymbols1[] =
+{
+ "Alpha", "Beta",
+ "Gamma", "Delta", "Epsilon", "Zeta",
+ "Eta", "Theta", "Iota", "Kappa",
+ "Lambda", "Mu", "Nu", "Xi",
+ "Omicron", "Pi", "Rho", "", "Sigma",
+ "Tau", "Upsilon", "Phi", "Chi",
+ "Psi", "Omega", 0
+};
+
+static const char* const theHTMLSymbols2[] =
+{
+ "alpha", "beta",
+ "gamma", "delta", "epsilon", "zeta",
+ "eta", "theta", "iota", "kappa",
+ "lambda", "mu", "nu", "xi",
+ "omicron", "pi", "rho", "sigmaf",
+ "sigma", "tau", "upsilon", "phi",
+ "chi", "psi", "omega", "thetasym",
+ "upsih", "piv", 0
+};
+#else
+static const XalanDOMChar* const theHTMLSymbols1[] =
+{
+ L"Alpha", L"Beta",
+ L"Gamma", L"Delta", L"Epsilon", L"Zeta",
+ L"Eta", L"Theta", L"Iota", L"Kappa",
+ L"Lambda", L"Mu", L"Nu", L"Xi",
+ L"Omicron", L"Pi", L"Rho", L"", L"Sigma",
+ L"Tau", L"Upsilon", L"Phi", L"Chi",
+ L"Psi", L"Omega", 0
+};
+
+static const XalanDOMChar* const theHTMLSymbols2[] =
+{
+ L"alpha", L"beta",
+ L"gamma", L"delta", L"epsilon", L"zeta",
+ L"eta", L"theta", L"iota", L"kappa",
+ L"lambda", L"mu", L"nu", L"xi",
+ L"omicron", L"pi", L"rho", L"sigmaf",
+ L"sigma", L"tau", L"upsilon", L"phi",
+ L"chi", L"psi", L"omega", L"thetasym",
+ L"upsih", L"piv", 0
+};
+#endif
+
+
+#if defined(XALAN_WIDE_STRING_UCODE_PROBLEM)
+static const char* const theHTMLLatin1Symbols[] =
+{
+ "nbsp", "iexcl", "cent", "pound",
+ "curren", "yen", "brvbar", "sect",
+ "uml", "copy", "ordf", "laquo",
+ "not", "shy", "reg", "macr", "deg",
+ "plusmn", "sup2", "sup3", "acute",
+ "micro", "para", "middot", "cedil",
+ "sup1", "ordm", "raquo", "frac14",
+ "frac12", "frac34", "iquest",
+ "Agrave", "Aacute", "Acirc",
+ "Atilde", "Auml", "Aring", "AElig",
+ "Ccedil", "Egrave", "Eacute", "Ecirc",
+ "Euml", "Igrave", "Iacute", "Icirc",
+ "Iuml", "ETH", "Ntilde", "Ograve",
+ "Oacute", "Ocirc", "Otilde", "Ouml",
+ "times", "Oslash", "Ugrave", "Uacute",
+ "Ucirc", "Uuml", "Yacute", "THORN",
+ "szlig", "agrave", "aacute", "acirc",
+ "atilde", "auml", "aring", "aelig",
+ "ccedil", "egrave", "eacute", "ecirc",
+ "euml", "igrave", "iacute", "icirc",
+ "iuml", "eth", "ntilde", "ograve",
+ "oacute", "ocirc", "otilde", "ouml",
+ "divide", "oslash", "ugrave", "uacute",
+ "ucirc", "uuml", "yacute", "thorn",
+ "yuml"
+};
+#else
+static const XMLCh* const theHTMLLatin1Symbols[] =
+{
+ L"nbsp", L"iexcl", L"cent", L"pound",
+ L"curren", L"yen", L"brvbar", L"sect",
+ L"uml", L"copy", L"ordf", L"laquo",
+ L"not", L"shy", L"reg", L"macr", L"deg",
+ L"plusmn", L"sup2", L"sup3", L"acute",
+ L"micro", L"para", L"middot", L"cedil",
+ L"sup1", L"ordm", L"raquo", L"frac14",
+ L"frac12", L"frac34", L"iquest",
+ L"Agrave", L"Aacute", L"Acirc",
+ L"Atilde", L"Auml", L"Aring", L"AElig",
+ L"Ccedil", L"Egrave", L"Eacute", L"Ecirc",
+ L"Euml", L"Igrave", L"Iacute", L"Icirc",
+ L"Iuml", L"ETH", L"Ntilde", L"Ograve",
+ L"Oacute", L"Ocirc", L"Otilde", L"Ouml",
+ L"times", L"Oslash", L"Ugrave", L"Uacute",
+ L"Ucirc", L"Uuml", L"Yacute", L"THORN",
+ L"szlig", L"agrave", L"aacute", L"acirc",
+ L"atilde", L"auml", L"aring", L"aelig",
+ L"ccedil", L"egrave", L"eacute", L"ecirc",
+ L"euml", L"igrave", L"iacute", L"icirc",
+ L"iuml", L"eth", L"ntilde", L"ograve",
+ L"oacute", L"ocirc", L"otilde", L"ouml",
+ L"divide", L"oslash", L"ugrave", L"uacute",
+ L"ucirc", L"uuml", L"yacute", L"thorn",
+ L"yuml"
+};
+#endif
+
+
+const FormatterToHTML::ElementFlagsMapType FormatterToHTML::s_elementFlags =
+ FormatterToHTML::createElementFlagsMap();
+
-const FormatterToHTML::EmptiesSetType FormatterToHTML::s_empties =
- FormatterToHTML::createEmpties();
+const FormatterToHTML::ElemDesc FormatterToHTML::s_dummyDesc(ElemDesc::BLOCK);
-const FormatterToHTML::EmptiesSetType FormatterToHTML::s_attrempties =
- FormatterToHTML::createAttrEmpties();
-const FormatterToHTML::HTMLAttributesVectorType FormatterToHTML::s_HTMLlat1 =
- FormatterToHTML::createAttributes();
+const XalanDOMCharVectorType FormatterToHTML::s_doctypeHeaderStartString =
+ MakeXalanDOMCharVector(c_wstr(XALAN_STATIC_UCODE_STRING("<!DOCTYPE HTML")));
-const FormatterToHTML::HTMLSymbolsVectorType FormatterToHTML::s_HTMLsymbol1 =
- FormatterToHTML::createSymbols();
+const XalanDOMCharVectorType FormatterToHTML::s_doctypeHeaderPublicString =
+ MakeXalanDOMCharVector(c_wstr(XALAN_STATIC_UCODE_STRING(" PUBLIC \"")));
-const FormatterToHTML::StringSetType FormatterToHTML::s_nonblockelems =
- FormatterToHTML::createNonBlockElems();
+const XalanDOMCharVectorType FormatterToHTML::s_doctypeHeaderSystemString =
+ MakeXalanDOMCharVector(c_wstr(XALAN_STATIC_UCODE_STRING(" SYSTEM")));
-const FormatterToHTML::StringSetType FormatterToHTML::s_escapetb =
- FormatterToHTML::createEscapeElems();
-const FormatterToHTML::AttributesMapType FormatterToHTML::s_attruris =
- FormatterToHTML::createAttributesMap();
+const XalanDOMCharVectorType FormatterToHTML::s_scriptString =
+ MakeXalanDOMCharVector(c_wstr(XALAN_STATIC_UCODE_STRING("SCRIPT")));
+const XalanDOMCharVectorType FormatterToHTML::s_styleString =
+ MakeXalanDOMCharVector(c_wstr(XALAN_STATIC_UCODE_STRING("STYLE")));
+const XalanDOMCharVectorType FormatterToHTML::s_ltString =
+ MakeXalanDOMCharVector(c_wstr(XALAN_STATIC_UCODE_STRING("lt")));
+
+const XalanDOMCharVectorType FormatterToHTML::s_gtString =
+ MakeXalanDOMCharVector(c_wstr(XALAN_STATIC_UCODE_STRING("gt")));
+
+const XalanDOMCharVectorType FormatterToHTML::s_ampString =
+ MakeXalanDOMCharVector(c_wstr(XALAN_STATIC_UCODE_STRING("amp")));
+
+const XalanDOMCharVectorType FormatterToHTML::s_fnofString =
+ MakeXalanDOMCharVector(c_wstr(XALAN_STATIC_UCODE_STRING("fnof")));
+
+
FormatterToHTML::FormatterToHTML(
Writer& writer,
- const XalanDOMString& version,
- bool doIndent,
- int indent,
const XalanDOMString& encoding,
const XalanDOMString& mediaType,
const XalanDOMString& doctypeSystem,
const XalanDOMString& doctypePublic,
- bool xmlDecl,
- const XalanDOMString& standalone) :
- FormatterToXML( writer, version, doIndent, indent,
+ bool doIndent,
+ int indent,
+ const XalanDOMString& version,
+ const XalanDOMString& standalone,
+ bool xmlDecl) :
+ FormatterToXML(writer, version, doIndent, indent,
encoding, mediaType, doctypeSystem, doctypePublic,
- xmlDecl, standalone),
+ xmlDecl, standalone, OUTPUT_METHOD_HTML),
m_currentElementName(),
m_inBlockElem(false)
{
+ initCharsMap();
}
@@ -134,227 +261,254 @@
}
+
void
-FormatterToHTML::startDocument()
+FormatterToHTML::initAttrCharsMap()
{
- m_needToOutputDocTypeDecl = true;
- m_startNewLine = false;
-
- if(true == m_needToOutputDocTypeDecl)
+ FormatterToXML::initAttrCharsMap();
+
+ m_attrCharsMap['\n'] = 'S';
+ m_attrCharsMap['<'] = 0;
+ m_attrCharsMap['>'] = 0;
+}
+
+
+
+void
+FormatterToHTML::initCharsMap()
+{
+ initAttrCharsMap();
+
+ memset(m_charsMap, 0, sizeof(m_charsMap));
+
+ m_charsMap['\n'] = 'S';
+ m_charsMap['<'] = 'S';
+ m_charsMap['>'] = 'S';
+ m_charsMap['&'] = 'S';
+
+ memset(m_charsMap, 'S', 10);
+
+ m_charsMap[0x0A] = 'S';
+ m_charsMap[0x0D] = 'S';
+
+ for(int i = 160; i < SPECIALSSIZE; ++i)
+ {
+ m_charsMap[i] = 'S';
+ }
+
+ for(int j = m_maxCharacter; j < SPECIALSSIZE; ++j)
{
- // Output the header if either the System or Public attributes are
- // specified
- if((! isEmpty(m_doctypeSystem)) || (! isEmpty(m_doctypePublic)))
- {
- m_writer.write(XALAN_STATIC_UCODE_STRING("<!DOCTYPE HTML"));
- if(! isEmpty(m_doctypePublic))
- {
- m_writer.write(XALAN_STATIC_UCODE_STRING(" PUBLIC \""));
- m_writer.write(m_doctypePublic);
- m_writer.write(XALAN_STATIC_UCODE_STRING("\""));
- }
- if(! isEmpty(m_doctypeSystem))
- {
- if(isEmpty(m_doctypePublic))
- m_writer.write(XALAN_STATIC_UCODE_STRING(" SYSTEM \""));
- else
- m_writer.write(XALAN_STATIC_UCODE_STRING(" \""));
- m_writer.write(m_doctypeSystem);
- m_writer.write(XALAN_STATIC_UCODE_STRING("\""));
- }
- m_writer.write(XALAN_STATIC_UCODE_STRING(">"));
- m_writer.write(m_lineSep);
- }
+ m_charsMap[j] = 'S';
}
- m_needToOutputDocTypeDecl = false;
}
-void
-FormatterToHTML::endDocument()
+
+
+const FormatterToHTML::ElemDesc&
+FormatterToHTML::getElemDesc(const XalanDOMString& name)
{
- try
+ const ElementFlagsMapType::const_iterator i =
+ s_elementFlags.find(name);
+
+ if (i == s_elementFlags.end())
{
- m_writer.write(m_lineSep);
+ return s_dummyDesc;
}
- catch(...)
+ else
{
- throw SAXException();
+ return i->second;
}
-
- FormatterToXML::endDocument();
}
void
-FormatterToHTML::startElement(
- const XMLCh* const name,
- AttributeList& attrs)
+FormatterToHTML::startDocument()
{
- // @@ JMD: this block is not in the java version any more ...
- XalanDOMString theName(name);
- if(true == m_needToOutputDocTypeDecl)
+ m_startNewLine = false;
+ m_shouldWriteXMLHeader = false;
+
+ const bool isEmptySystem =
+ isEmpty(m_doctypeSystem);
+
+ const bool isEmptyPublic =
+ isEmpty(m_doctypePublic);
+
+ // Output the header if either the System or Public attributes are
+ // specified
+ if(isEmptySystem == false || isEmptyPublic == false)
{
- try
+ accum(s_doctypeHeaderStartString);
+
+ if(isEmptyPublic == false)
{
- if((! isEmpty(m_doctypeSystem)) || (! isEmpty(m_doctypePublic)))
- {
- m_writer.write(XALAN_STATIC_UCODE_STRING("<!DOCTYPE "));
- m_writer.write(name);
- if(! isEmpty(m_doctypePublic))
- {
- m_writer.write(XALAN_STATIC_UCODE_STRING(" PUBLIC \""));
- m_writer.write(m_doctypePublic);
- m_writer.write(XALAN_STATIC_UCODE_STRING("\""));
- }
- if(! isEmpty(m_doctypeSystem))
- {
- if(isEmpty(m_doctypePublic))
- m_writer.write(XALAN_STATIC_UCODE_STRING(" SYSTEM \""));
- else
- m_writer.write(XALAN_STATIC_UCODE_STRING(" \""));
- m_writer.write(m_doctypeSystem);
- m_writer.write(XALAN_STATIC_UCODE_STRING("\""));
- }
- m_writer.write(XALAN_STATIC_UCODE_STRING(">"));
- m_writer.write(m_lineSep);
- }
+ accum(s_doctypeHeaderPublicString);
+ accum(m_doctypePublic);
+ accum('"');
}
- // java: catch(IOException ioe)
- catch(...)
+
+ if(isEmptySystem == false)
{
- throw SAXException("IO error");
+ if(isEmptyPublic == true)
+ {
+ accum(s_doctypeHeaderSystemString);
+ }
+
+ accum(' ');
+ accum('"');
+
+ accum(m_doctypeSystem);
+ accum('"');
}
+
+ accum('>');
+
+ outputLineSep();
}
+
m_needToOutputDocTypeDecl = false;
+}
- bool savedDoIndent = m_doIndent;
- XalanDOMString nameUpper = toUpperCase(theName);
- // If the previous element is a non-block element or the next
- // element is a non-block element, then do not indent.
- bool isBlockElement =
- ((s_nonblockelems.end() != s_nonblockelems.find(nameUpper)) ||
- ((! isEmpty(m_currentElementName) &&
- (s_nonblockelems.end() !=
- s_nonblockelems.find(m_currentElementName)))))
- ? false : true;
+void
+FormatterToHTML::startElement(
+ const XMLCh* const name,
+ AttributeList& attrs)
+{
+ const bool savedDoIndent = m_doIndent;
- try
- {
- writeParentTagEnd();
+ writeParentTagEnd();
- if (m_ispreserve)
- m_ispreserve = false;
- else if(m_doIndent
- && (!isEmpty(m_currentElementName))
- && (!m_inBlockElem || isBlockElement))
- {
- m_startNewLine = true;
- indent(m_writer, m_currentIndent);
- }
- m_inBlockElem = !isBlockElement;
-
- // @@@ JMD: need to provide equivalent functionality here ...
- // m_isRawStack.push(elemDesc.is(ElemDesc.RAW));
-
- m_currentElementName = nameUpper;
+ const XalanDOMString nameUpper = toUpperCase(name);
- m_writer.write('<');
- m_writer.write(name);
+ const ElemDesc& elemDesc =
+ getElemDesc(nameUpper);
- int nAttrs = attrs.getLength();
- for (int i = 0; i < nAttrs ; i++)
- {
- processAttribute(attrs.getName(i), attrs.getValue(i));
- }
- // Flag the current element as not yet having any children.
- openElementForChildren();
+ bool isBlockElement = elemDesc.is(ElemDesc::BLOCK);
- m_currentIndent += m_indent;
- m_isprevtext = false;
- }
- catch(...)
+ if(m_ispreserve == true)
{
- throw SAXException("IO error");
+ m_ispreserve = false;
}
- m_doIndent = savedDoIndent;
+ else if(m_doIndent &&
+ length(m_currentElementName) != 0 &&
+ (m_inBlockElem == false || isBlockElement == true))
+ {
+ m_startNewLine = true;
+
+ indent(m_currentIndent);
+ }
+
+ m_inBlockElem = !isBlockElement;
+
+ m_isRawStack.push(elemDesc.is(ElemDesc::RAW));
+
+ m_currentElementName = nameUpper;
+
+ accum('<');
+ accum(name);
+
+ const unsigned int nAttrs = attrs.getLength();
+
+ for (unsigned int i = 0; i < nAttrs ; i++)
+ {
+ processAttribute(attrs.getName(i), attrs.getValue(i), elemDesc);
+ }
+
+ // Flag the current element as not yet having any children.
+ openElementForChildren();
+
+ m_currentIndent += m_indent;
+
+ m_isprevtext = false;
+
+ m_doIndent = savedDoIndent;
}
-
+
void
-FormatterToHTML::endElement(
- const XMLCh* const name)
+FormatterToHTML::endElement(const XMLCh* const name)
{
- try
- {
- m_currentIndent -= m_indent;
- // name = name.toUpperCase();
- const bool hasChildNodes = childNodesWereAdded();
+ m_currentIndent -= m_indent;
+
+ const bool hasChildNodes = childNodesWereAdded();
-// @@ JMD: need to provide this ...
-// m_isRawStack.pop();
+ m_isRawStack.pop();
+
+ const XalanDOMString nameUpper = toUpperCase(name);
- // @@ JMD: check that this doesn't change name ...
- XalanDOMString nameUpper = toUpperCase(name);
- bool isBlockElement = s_nonblockelems.end() == s_nonblockelems.find(nameUpper);
+ const ElemDesc& elemDesc =
+ getElemDesc(nameUpper);
- bool shouldIndent = false;
- if(m_ispreserve)
- {
- m_ispreserve = false;
- }
- else if(m_doIndent && (!m_inBlockElem || isBlockElement))
+ const bool isBlockElement = elemDesc.is(ElemDesc::BLOCK);
+
+ bool shouldIndent = false;
+
+ if(m_ispreserve == true)
+ {
+ m_ispreserve = false;
+ }
+ else if(m_doIndent == true && (m_inBlockElem == false || isBlockElement == true))
+ {
+ m_startNewLine = true;
+
+ shouldIndent = true;
+ }
+
+ m_inBlockElem = !isBlockElement;
+
+ if (hasChildNodes)
+ {
+ if (shouldIndent == true)
{
- m_startNewLine = true;
- shouldIndent = true;
+ indent(m_currentIndent);
}
- m_inBlockElem = !isBlockElement;
+ accum('<');
+ accum('/');
+ accum(name);
+ accum('>');
- if (hasChildNodes == true)
+ m_currentElementName = name;
+ }
+ else
+ {
+ if(elemDesc.is(ElemDesc::EMPTY) == false)
{
+ accum('>');
+
if (shouldIndent == true)
- indent(m_writer, m_currentIndent);
- m_writer.write(XALAN_STATIC_UCODE_STRING("</"));
- m_writer.write(name);
- m_writer.write(XALAN_STATIC_UCODE_STRING(">"));
+ {
+ indent(m_currentIndent);
+ }
+
+ accum('<');
+ accum('/');
+ accum(name);
+ accum('>');
}
else
{
- if(s_empties.find(toUpperCase(name)) == s_empties.end())
- {
- m_writer.write(XALAN_STATIC_UCODE_STRING(">"));
- if (shouldIndent)
- indent(m_writer, m_currentIndent);
- m_writer.write(XALAN_STATIC_UCODE_STRING("</"));
- m_writer.write(name);
- m_writer.write(XALAN_STATIC_UCODE_STRING(">"));
- }
- else
- {
- m_writer.write(XALAN_STATIC_UCODE_STRING(">"));
- }
+ accum('>');
}
-/*
- @@@ JMD: need to provide equivalent functionality here ...
- if (elemDesc.is(ElemDesc.WHITESPACESENSITIVE))
- m_ispreserve = true;
-*/
+ }
- if (hasChildNodes == true)
+ if (elemDesc.is(ElemDesc::WHITESPACESENSITIVE) == true)
+ {
+ m_ispreserve = true;
+ }
+
+ if (hasChildNodes == true)
+ {
+ if (m_preserves.empty() == false)
{
- m_ispreserve = m_preserves.top();
m_preserves.pop();
}
- m_isprevtext = false;
- }
- catch(...)
- {
- throw SAXException();
- }
+ }
+
+ m_isprevtext = false;
}
@@ -364,139 +518,165 @@
const XMLCh* const chars,
const unsigned int length)
{
- if(0 == length) return;
-
- if(m_nextIsRaw)
+ if(length != 0)
{
- m_nextIsRaw = false;
- charactersRaw (chars, length);
- return;
- }
+ if(m_inCData == true)
+ {
+ cdata(chars, length);
+ }
+ else if(m_nextIsRaw)
+ {
+ m_nextIsRaw = false;
- if((! isEmpty(m_currentElementName)) &&
- (equalsIgnoreCase(m_currentElementName, XALAN_STATIC_UCODE_STRING("SCRIPT")) ||
- equalsIgnoreCase(m_currentElementName, XALAN_STATIC_UCODE_STRING("STYLE"))))
- {
- try
+ charactersRaw(chars, length);
+ }
+ else if (m_isRawStack.empty() == false &&
+ m_isRawStack.top() == true)
{
writeParentTagEnd();
+
m_ispreserve = true;
- if (shouldIndent())
- indent(m_writer, m_currentIndent);
- // m_writer.write(XALAN_STATIC_UCODE_STRING("<![CDATA["));
- // m_writer.write(chars, 0, length);
+
+ if (shouldIndent() == true)
+ {
+ indent(m_currentIndent);
+ }
+
writeNormalizedChars(chars, 0, length, false);
- // m_writer.write(XALAN_STATIC_UCODE_STRING("]]>"));
- return;
}
- // java: catch(IOException ioe)
- catch(...)
+ else
{
- throw SAXException("IO error");
- }
- }
+ writeParentTagEnd();
- try
- {
- writeParentTagEnd();
- m_ispreserve = true;
- int pos = 0;
- int end = length;
- for (int i = 0; i < end; i ++)
- {
- const XMLCh ch = chars[i];
- int chNum = ch;
- if ('\n' == ch)
- {
- m_charBuf[pos++] = m_lineSep;
- }
- else if ('<' == ch)
- {
- pos = copyEntityIntoBuf(XALAN_STATIC_UCODE_STRING("lt"), pos);
- }
- else if ('>' == ch)
- {
- pos = copyEntityIntoBuf(XALAN_STATIC_UCODE_STRING("gt"), pos);
- }
- else if ('&' == ch)
- {
- pos = copyEntityIntoBuf(XALAN_STATIC_UCODE_STRING("amp"), pos);
- }
- else if((chNum >= 9) && (chNum <= 126))
- {
- m_charBuf[pos++] = ch;
- }
- else if((chNum >= 160) && (chNum <= 255))
- {
- pos = copyEntityIntoBuf(s_HTMLlat1[ch-160], pos);
- }
- else if((chNum >= 913) && (chNum <= 982))
- {
- pos = copyEntityIntoBuf(s_HTMLsymbol1[ch-913], pos);
- }
- else if (402 == ch)
- {
- pos = copyEntityIntoBuf(XALAN_STATIC_UCODE_STRING("fnof"), pos);
- }
- else if (m_isUTF8 && (0xd800 <= chNum && chNum < 0xdc00))
- {
- // UTF-16 surrogate
- copyUTF16IntoBuf( chars, i, pos, length);
- }
- else if((ch >= 0x7F) && (ch <= m_maxCharacter))
- {
- // Hope this is right...
- m_charBuf[pos++] = ch;
- }
- else
+ m_ispreserve = true;
+
+ unsigned int pos = 0;
+
+ for (unsigned int i = 0; i < length; ++i)
{
- XalanDOMString ds;
- m_charBuf[pos++] = '&';
- m_charBuf[pos++] = '#';
- ds = LongToDOMString(chNum);
- const XalanDOMChar* const pb = c_wstr(ds);
- const int nIntStr = ds.length();
+ const XalanDOMChar ch = chars[i];
+
+ if(ch < SPECIALSSIZE && m_charsMap[ch] != 'S')
+ {
+ accum(ch);
- for(int k = 0; k < nIntStr; k++)
+ continue;
+ }
+ else if (0x0A == ch && i + 1 < length && 0x0D == chars[i + 1])
{
- m_charBuf[pos++] = *(pb+k);
+ outputLineSep();
+
+ ++i;
}
- m_charBuf[pos++] = ';';
- }
+ if (0x0D == ch && i + 1 < length && 0x0A == chars[i + 1])
+ {
+ outputLineSep();
- // Use 80 as a best guess safe buffer
- if(pos > MAXSAFECHARBUF)
- {
- m_writer.write(m_charBuf, 0, pos);
- pos = 0;
+ ++i;
+ }
+ else if (0x0D == ch)
+ {
+ outputLineSep();
+
+ ++i;
+ }
+ else if ('\n' == ch)
+ {
+ outputLineSep();
+ }
+ else if ('<' == ch)
+ {
+ pos = copyEntityIntoBuffer(s_ltString, pos);
+ }
+ else if ('>' == ch)
+ {
+ pos = copyEntityIntoBuffer(s_gtString, pos);
+ }
+ else if ('&' == ch)
+ {
+ pos = copyEntityIntoBuffer(s_ampString, pos);
+ }
+ else if(ch >= 9 && ch <= 126)
+ {
+ accum(ch);
+ }
+ else if(ch >= 160 && ch <= 255)
+ {
+ pos = copyEntityIntoBuffer(theHTMLLatin1Symbols[ch - 160], pos);
+ }
+ else if(ch >= 913 && ch <= 937 && ch != 930)
+ {
+ pos = copyEntityIntoBuffer(theHTMLSymbols1[ch - 913], pos);
+ }
+ else if(ch >= 945 && ch <= 969)
+ {
+ pos = copyEntityIntoBuffer(theHTMLSymbols2[ch - 945], pos);
+ }
+ else if(ch >= 977 && ch <= 978)
+ {
+ // subtract the unused characters
+ pos = copyEntityIntoBuffer(theHTMLSymbols2[ch - 945 - 7], pos);
+ }
+ else if(ch == 982)
+ {
+ // subtract the unused characters
+ pos = copyEntityIntoBuffer(theHTMLSymbols2[ch - 945 - 10], pos);
+ }
+ else if (402 == ch)
+ {
+ pos = copyEntityIntoBuffer(s_fnofString, pos);
+ }
+ else if (m_isUTF8 == true && 0xd800 <= ch && ch < 0xdc00)
+ {
+ // UTF-16 surrogate
+ unsigned int next = 0;
+
+ if (i + 1 >= length)
+ {
+ throwInvalidUTF16SurrogateException(ch);
+ }
+ else
+ {
+ next = chars[++i];
+
+ if (!(0xdc00 <= next && next < 0xe000))
+ {
+ throwInvalidUTF16SurrogateException(ch, next);
+ }
+
+ next = ((ch - 0xd800) << 10) + next - 0xdc00 + 0x00010000;
+ }
+
+ writeNumberedEntityReference(next);
+ }
+ else if(ch >= 0x007Fu && ch <= m_maxCharacter)
+ {
+ // Hope this is right...
+ accum(ch);
+ }
+ else
+ {
+ writeNumberedEntityReference(ch);
+ }
}
}
-
- m_writer.write(m_charBuf, 0, pos);
- m_isprevtext = true;
}
- // java: catch(IOException ioe)
- catch(...)
+
+ if (m_isprevtext == false)
{
- throw SAXException("IO error");
+ m_isprevtext = true;
}
}
+
void
FormatterToHTML::entityReference(const XMLCh* const name)
{
- try
- {
- m_writer.write(XALAN_STATIC_UCODE_STRING("&"));
- m_writer.write(name);
- m_writer.write(XALAN_STATIC_UCODE_STRING(";"));
- }
- catch(...)
- {
- throw SAXException();
- }
+ accum('&');
+ accum(name);
+ accum(';');
}
@@ -506,455 +686,793 @@
const XMLCh* const ch,
const unsigned int length)
{
- if(equalsIgnoreCase(m_currentElementName, XALAN_STATIC_UCODE_STRING("SCRIPT")) ||
- equalsIgnoreCase(m_currentElementName, XALAN_STATIC_UCODE_STRING("STYLE")))
+ if(equalsIgnoreCase(m_currentElementName, c_wstr(s_scriptString)) == true ||
+ equalsIgnoreCase(m_currentElementName, c_wstr(s_styleString)) == true)
{
- try
- {
- writeParentTagEnd();
- m_ispreserve = true;
- if (shouldIndent() == true)
- {
- indent(m_writer, m_currentIndent);
- }
- // was: m_writer.write(ch, 0, length);
- writeNormalizedChars(ch, 0, length, true);
- }
- catch(...)
+ writeParentTagEnd();
+
+ m_ispreserve = true;
+
+ if (shouldIndent() == true)
{
- throw SAXException();
+ indent(m_currentIndent);
}
+
+ writeNormalizedChars(ch, 0, length, true);
}
else if(m_stripCData == true)
{
- try
- {
- writeParentTagEnd();
-
- m_ispreserve = true;
+ writeParentTagEnd();
- if (shouldIndent() == true)
- {
- indent(m_writer, m_currentIndent);
- }
+ m_ispreserve = true;
- // m_writer.write("<![CDATA[");
- m_writer.write(ch, 0, length);
- // m_writer.write("]]>");
- }
- catch(...)
+ if (shouldIndent() == true)
{
- throw SAXException();
+ indent(m_currentIndent);
}
+
+ accum(ch, 0, length);
}
else
{
- characters(ch, length);
+ cdata(ch, length);
}
}
-void FormatterToHTML::processingInstruction(
- const XMLCh* const target,
- const XMLCh* const data)
-
-{
- FormatterToXML::processingInstruction( target, data, true);
-}
void
-FormatterToHTML::processAttribute(
- const XalanDOMChar* name,
- const XalanDOMChar* value)
+FormatterToHTML::processingInstruction(
+ const XMLCh* const target,
+ const XMLCh* const data)
+
{
- try
+ // Use a fairly nasty hack to tell if the next node is supposed to be
+ // unescaped text.
+ if(equals(target, c_wstr(s_xsltNextIsRawString)) == true &&
+ equals(data, c_wstr(s_formatterToDOMString)) == true)
+ {
+ m_nextIsRaw = true;
+ }
+ else
{
- if(!equals(name, DOMServices::s_XMLNamespace) &&
- !startsWith(name, DOMServices::s_XMLNamespaceWithSeparator))
+ writeParentTagEnd();
+
+ if (shouldIndent() == true)
{
- XalanDOMString pval;
- XalanDOMString aname = toLowerCase(name);
- if (equals(aname, XALAN_STATIC_UCODE_STRING("xml:lang"))) aname = XALAN_STATIC_UCODE_STRING("lang");
- // qualify with an element??
- AttributesMapType::const_iterator it =
- (s_attruris.find(toLowerCase(m_currentElementName)));
- if (it != s_attruris.end())
- {
- const StringSetType val = (*it).second;
- // Determine if value is in the set of strings
- if(val.find(aname) != val.end())
- pval = prepAttrURI(value, m_attrSpecialChars, m_encoding);
- else
- pval = prepAttrString(value, m_attrSpecialChars, m_encoding);
- }
- else
- pval = prepAttrString(value, m_attrSpecialChars, m_encoding);
+ indent(m_currentIndent);
+ }
- if(s_attrempties.find(aname) == s_attrempties.end())
- {
- m_writer.write(XALAN_STATIC_UCODE_STRING(" "));
- m_writer.write(name);
- m_writer.write(XALAN_STATIC_UCODE_STRING("=\""));
- m_writer.write(pval);
- m_writer.write(XALAN_STATIC_UCODE_STRING("\""));
- }
- else
+ accum('<');
+ accum('?');
+ accum(target);
+
+ if (length(data) > 0)
+ {
+ if(isSpace(data[0]) == false)
{
- m_writer.write(XALAN_STATIC_UCODE_STRING(" "));
- if((pval.length() == 0) || equalsIgnoreCase(pval, aname))
- {
- m_writer.write(name);
- }
- else
- {
- m_writer.write(name);
- m_writer.write(XALAN_STATIC_UCODE_STRING("=\""));
- m_writer.write(pval);
- m_writer.write(XALAN_STATIC_UCODE_STRING("\""));
- }
+ accum(' ');
}
+
+ accum(data);
}
- }
- catch(...)
- {
- throw SAXException();
+
+ accum('>'); // different from XML
+
+ m_startNewLine = true;
}
}
-/**
- * Returns the specified <var>string</var> after substituting non ASCII characters,
- * with <CODE>%HH</CODE>, where HH is the hex of the byte value.
- *
- * @param string String to convert to XML format.
- * @param specials Characters, should be represented in character references.
- * @param encoding CURRENTLY NOT IMPLEMENTED.
- * @return XML-formatted string.
- */
-const XalanDOMString
-FormatterToHTML::prepAttrURI(
- const XalanDOMString& string,
- const XalanDOMString& /* specials */,
+
+void
+FormatterToHTML::writeAttrString(
+ const XalanDOMChar* string,
const XalanDOMString& /* encoding */)
{
- XalanDOMString sb;
-
- const unsigned int theLength = length(string);
+ const unsigned int strLen = length(string);
- for (unsigned int i = 0; i < theLength; i ++)
- {
- const XalanDOMChar ch = charAt(string, i);
- XalanDOMString sch(&ch, 1);
-
- const int ich = ch;
+ for (unsigned int i = 0; i < strLen; i ++)
+ {
+ const XalanDOMChar ch = string[i];
- if(((ch > 0x1F) && // X'00 - 1F' not valid
- (ch < 0x7F)) && // X'7F' not valid
- (s_escapetb.find(sch)== s_escapetb.end()) ) // characters in the table
+ if(ch < SPECIALSSIZE && m_attrCharsMap[ch] != 'S')
{
- sb += sch; // valid character, append it
+ accum(ch);
}
- else
+ else if('&' == ch &&
+ i + 1 < strLen &&
+ '{' == string[i + 1])
+ {
+ accum(ch); // no escaping in this case, as specified in 15.2
+ }
+ else if (accumDefaultEntity(ch, i, string, strLen, false) == false)
{
- // need to escape the character
- const int mask1 = 0xFF00;
- const int mask2 = 0x00FF;
- assert (ich < 0xFFFF);
- const int b1 = (int)(((ich) & mask1) >> 8);
- const int b2 = (int)((ich) & mask2);
+ if (0xd800 <= ch && ch < 0xdc00)
+ {
+ // UTF-16 surrogate
- // if first 8 bytes are 0, no need to append them.
- if (b1 != 0)
- {
- sb += XALAN_STATIC_UCODE_STRING("%");
- sb += LongToHexDOMString(b1);
- }
+ unsigned int next = 0;
- sb += XALAN_STATIC_UCODE_STRING("%");
- sb += LongToHexDOMString(b2);
- }
- }
+ if (i + 1 >= strLen)
+ {
+ throwInvalidUTF16SurrogateException(ch);
+ }
+ else
+ {
+ next = string[++i];
+
+ if (!(0xdc00 <= next && next < 0xe000))
+ {
+ throwInvalidUTF16SurrogateException(ch, next);
+ }
- return sb;
+ next = ((ch - 0xd800) << 10) + next -0xdc00 + 0x00010000;
+ }
+
+ accum('&');
+ accum('#');
+ accum('x');
+ accum(UnsignedLongToHexDOMString(next));
+ accum(';');
+ }
+ else if(ch >= 160 && ch <= 255)
+ {
+ accum('&');
+ accum(theHTMLLatin1Symbols[ch - 160]);
+ accum(';');
+ }
+ else if(ch >= 913 && ch <= 937 && ch != 930)
+ {
+ accum('&');
+ accum(theHTMLSymbols1[ch - 913]);
+ accum(';');
+ }
+ else if(ch >= 945 && ch <= 969)
+ {
+ accum('&');
+ accum(theHTMLSymbols2[ch - 945]);
+ accum(';');
+ }
+ else if(ch >= 977 && ch <= 978)
+ {
+ accum('&');
+ // substracting the number of unused characters
+ accum(theHTMLSymbols2[ch - 945 - 7]);
+ accum(';');
+ }
+ else if(ch == 982)
+ {
+ accum('&');
+ // substracting the number of unused characters
+ accum(theHTMLSymbols2[ch - 945 - 10]);
+ accum(';');
+ }
+ else if (402 == ch)
+ {
+ accum('&');
+ accum('f');
+ accum('n');
+ accum('o');
+ accum('f');
+ accum(';');
+ }
+ else
+ {
+ accum('&');
+ accum('#');
+ accum('x');
+ accum(UnsignedLongToHexDOMString(ch));
+ accum(';');
+ }
+ }
+ }
}
-
+
-FormatterToHTML::EmptiesSetType
-FormatterToHTML::createEmpties()
+unsigned int
+FormatterToHTML::copyEntityIntoBuffer(
+ const XalanDOMChar* s,
+ unsigned int pos)
{
- EmptiesSetType theEmpties;
+ const unsigned int len = length(s);
- theEmpties.insert(XALAN_STATIC_UCODE_STRING("AREA"));
- theEmpties.insert(XALAN_STATIC_UCODE_STRING("BASE"));
- theEmpties.insert(XALAN_STATIC_UCODE_STRING("BR"));
- theEmpties.insert(XALAN_STATIC_UCODE_STRING("COL"));
- theEmpties.insert(XALAN_STATIC_UCODE_STRING("HR"));
- theEmpties.insert(XALAN_STATIC_UCODE_STRING("IMG"));
- theEmpties.insert(XALAN_STATIC_UCODE_STRING("INPUT"));
- theEmpties.insert(XALAN_STATIC_UCODE_STRING("LINK"));
- theEmpties.insert(XALAN_STATIC_UCODE_STRING("META"));
- theEmpties.insert(XALAN_STATIC_UCODE_STRING("PARAM"));
+ accum('&');
- // HTML 4.0 loose DTD
- theEmpties.insert(XALAN_STATIC_UCODE_STRING("BASEFONT"));
- theEmpties.insert(XALAN_STATIC_UCODE_STRING("FRAME"));
- theEmpties.insert(XALAN_STATIC_UCODE_STRING("ISINDEX"));
-
- return theEmpties;
-}
-
-FormatterToHTML::EmptiesSetType
-FormatterToHTML::createAttrEmpties()
-{
- EmptiesSetType theEmpties;
- theEmpties.insert(XALAN_STATIC_UCODE_STRING("checked"));
- theEmpties.insert(XALAN_STATIC_UCODE_STRING("disabled"));
- theEmpties.insert(XALAN_STATIC_UCODE_STRING("readonly"));
- theEmpties.insert(XALAN_STATIC_UCODE_STRING("multiple"));
- theEmpties.insert(XALAN_STATIC_UCODE_STRING("disabled"));
- theEmpties.insert(XALAN_STATIC_UCODE_STRING("selected"));
- return theEmpties;
-}
-
-FormatterToHTML::StringSetType
-FormatterToHTML::createNonBlockElems()
-{
- StringSetType theElems;
- theElems.insert(XALAN_STATIC_UCODE_STRING("FONT"));
- // s_nonblockelems.insert(XALAN_STATIC_UCODE_STRING("A"));
- theElems.insert(XALAN_STATIC_UCODE_STRING("TD"));
- theElems.insert(XALAN_STATIC_UCODE_STRING("IMG"));
- theElems.insert(XALAN_STATIC_UCODE_STRING("B"));
- theElems.insert(XALAN_STATIC_UCODE_STRING("I"));
- theElems.insert(XALAN_STATIC_UCODE_STRING("Q"));
- return theElems;
-}
-
-FormatterToHTML::StringSetType
-FormatterToHTML::createEscapeElems()
-{
- StringSetType theElems;
- theElems.insert(XALAN_STATIC_UCODE_STRING("%"));
- theElems.insert(XALAN_STATIC_UCODE_STRING("<"));
- theElems.insert(XALAN_STATIC_UCODE_STRING(">"));
-// theElems.insert(XALAN_STATIC_UCODE_STRING(" "));
-// theElems.insert(XALAN_STATIC_UCODE_STRING("#"));
- theElems.insert(XALAN_STATIC_UCODE_STRING("{"));
- theElems.insert(XALAN_STATIC_UCODE_STRING("}"));
- theElems.insert(XALAN_STATIC_UCODE_STRING("["));
- theElems.insert(XALAN_STATIC_UCODE_STRING("]"));
-// theElems.insert(XALAN_STATIC_UCODE_STRING("\\"));
- theElems.insert(XALAN_STATIC_UCODE_STRING("|"));
- theElems.insert(XALAN_STATIC_UCODE_STRING("^"));
- theElems.insert(XALAN_STATIC_UCODE_STRING("\""));
-// theElems.insert(XALAN_STATIC_UCODE_STRING("'"));
- return theElems;
+ for(unsigned int i= 0; i < len; ++i)
+ {
+ accum(s[i]);
+ }
+
+ accum(';');
+
+ return pos;
}
+
-FormatterToHTML::AttributesMapType
-FormatterToHTML::createAttributesMap()
+
+void
+FormatterToHTML::processAttribute(
+ const XalanDOMChar* name,
+ const XalanDOMChar* value,
+ const ElemDesc& elemDesc)
{
-#if !defined(XALAN_NO_NAMESPACES)
- using std::make_pair;
-#endif
+ const XalanDOMString nameUpper = toUpperCase(name);
+
+ accum(' ');
- AttributesMapType theAtts;
- StringSetType URLAttrsHREFSingle;
- URLAttrsHREFSingle.insert(XALAN_STATIC_UCODE_STRING("href"));
- StringSetType URLAttrsCITESingle;
- URLAttrsCITESingle.insert(XALAN_STATIC_UCODE_STRING("cite"));
-
- theAtts.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("base")), URLAttrsHREFSingle));
- theAtts.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("link")), URLAttrsHREFSingle));
- theAtts.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("area")), URLAttrsHREFSingle));
- // From the HTML 4.0 spec: Note. The same conversion based on UTF-8
- // should be applied to values of the name attribute for the A element.
-
- StringSetType URLAttrs_A;
- URLAttrs_A.insert(XALAN_STATIC_UCODE_STRING("href"));
- URLAttrs_A.insert(XALAN_STATIC_UCODE_STRING("name"));
- theAtts.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("a")), URLAttrs_A));
-
- StringSetType URLAttrs_INPUT;
- URLAttrs_A.insert(XALAN_STATIC_UCODE_STRING("src"));
- URLAttrs_A.insert(XALAN_STATIC_UCODE_STRING("usemap"));
- theAtts.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("input")), URLAttrs_INPUT));
-
- StringSetType URLAttrs_SCRIPT;
- URLAttrs_A.insert(XALAN_STATIC_UCODE_STRING("src"));
- URLAttrs_A.insert(XALAN_STATIC_UCODE_STRING("for"));
- theAtts.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("script")), URLAttrs_SCRIPT));
-
- StringSetType URLAttrs_IMG;
- URLAttrs_A.insert(XALAN_STATIC_UCODE_STRING("src"));
- URLAttrs_A.insert(XALAN_STATIC_UCODE_STRING("longdesc"));
- URLAttrs_A.insert(XALAN_STATIC_UCODE_STRING("usemap"));
- theAtts.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("img")), URLAttrs_IMG));
-
- StringSetType URLAttrs_OBJECT;
- URLAttrs_A.insert(XALAN_STATIC_UCODE_STRING("classid"));
- URLAttrs_A.insert(XALAN_STATIC_UCODE_STRING("codebase"));
- URLAttrs_A.insert(XALAN_STATIC_UCODE_STRING("data"));
- URLAttrs_A.insert(XALAN_STATIC_UCODE_STRING("archive"));
- URLAttrs_A.insert(XALAN_STATIC_UCODE_STRING("usemap"));
- theAtts.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("object")), URLAttrs_OBJECT));
-
- theAtts.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("q")), URLAttrsCITESingle));
- theAtts.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("blockquote")), URLAttrsCITESingle));
- theAtts.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("ins")), URLAttrsCITESingle));
- theAtts.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("del")), URLAttrsCITESingle));
-
- StringSetType URLAttrs_FORM;
- URLAttrs_A.insert(XALAN_STATIC_UCODE_STRING("action"));
- theAtts.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("form")), URLAttrs_FORM));
-
- StringSetType URLAttrs_HEAD;
- URLAttrs_A.insert(XALAN_STATIC_UCODE_STRING("profile"));
- theAtts.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("head")), URLAttrs_HEAD));
- return theAtts;
+ if(elemDesc.isAttrFlagSet(nameUpper, ElemDesc::ATTREMPTY) == true &&
+ (length(value) == 0) || equalsIgnoreCase(value, name) == true)
+ {
+ accum(name);
+ }
+ else
+ {
+ accum(name);
+ accum('=');
+ accum('\"');
+
+ if(elemDesc.isAttrFlagSet(nameUpper, ElemDesc::ATTRURL) == true)
+ {
+ writeAttrURI(value, m_encoding);
+ }
+ else
+ {
+ writeAttrString(value, m_encoding);
+ }
+
+ accum('\"');
+ }
}
+
+
-FormatterToHTML::HTMLAttributesVectorType
-FormatterToHTML::createAttributes()
+void
+FormatterToHTML::writeAttrURI(
+ const XalanDOMChar* string,
+ const XalanDOMString encoding)
{
-#if defined(XALAN_WIDE_STRING_UCODE_PROBLEM)
- static const char* const theHTMLAttributes[] =
- {
- "nbsp", "iexcl", "cent", "pound",
- "curren", "yen", "brvbar", "sect",
- "uml", "copy", "ordf", "laquo",
- "not", "shy", "reg", "macr", "deg",
- "plusmn", "sup2", "sup3", "acute",
- "micro", "para", "middot", "cedil",
- "sup1", "ordm", "raquo", "frac14",
- "frac12", "frac34", "iquest",
- "Agrave", "Aacute", "Acirc",
- "Atilde", "Auml", "Aring", "AElig",
- "Ccedil", "Egrave", "Eacute", "Ecirc",
- "Euml", "Igrave", "Iacute", "Icirc",
- "Iuml", "ETH", "Ntilde", "Ograve",
- "Oacute", "Ocirc", "Otilde", "Ouml",
- "times", "Oslash", "Ugrave", "Uacute",
- "Ucirc", "Uuml", "Yacute", "THORN",
- "szlig", "agrave", "aacute", "acirc",
- "atilde", "auml", "aring", "aelig",
- "ccedil", "egrave", "eacute", "ecirc",
- "euml", "igrave", "iacute", "icirc",
- "iuml", "eth", "ntilde", "ograve",
- "oacute", "ocirc", "otilde", "ouml",
- "divide", "oslash", "ugrave", "uacute",
- "ucirc", "uuml", "yacute", "thorn",
- "yuml"
- };
-#else
- static const XMLCh* const theHTMLAttributes[] =
- {
- L"nbsp", L"iexcl", L"cent", L"pound",
- L"curren", L"yen", L"brvbar", L"sect",
- L"uml", L"copy", L"ordf", L"laquo",
- L"not", L"shy", L"reg", L"macr", L"deg",
- L"plusmn", L"sup2", L"sup3", L"acute",
- L"micro", L"para", L"middot", L"cedil",
- L"sup1", L"ordm", L"raquo", L"frac14",
- L"frac12", L"frac34", L"iquest",
- L"Agrave", L"Aacute", L"Acirc",
- L"Atilde", L"Auml", L"Aring", L"AElig",
- L"Ccedil", L"Egrave", L"Eacute", L"Ecirc",
- L"Euml", L"Igrave", L"Iacute", L"Icirc",
- L"Iuml", L"ETH", L"Ntilde", L"Ograve",
- L"Oacute", L"Ocirc", L"Otilde", L"Ouml",
- L"times", L"Oslash", L"Ugrave", L"Uacute",
- L"Ucirc", L"Uuml", L"Yacute", L"THORN",
- L"szlig", L"agrave", L"aacute", L"acirc",
- L"atilde", L"auml", L"aring", L"aelig",
- L"ccedil", L"egrave", L"eacute", L"ecirc",
- L"euml", L"igrave", L"iacute", L"icirc",
- L"iuml", L"eth", L"ntilde", L"ograve",
- L"oacute", L"ocirc", L"otilde", L"ouml",
- L"divide", L"oslash", L"ugrave", L"uacute",
- L"ucirc", L"uuml", L"yacute", L"thorn",
- L"yuml"
- };
-#endif
+ const unsigned int len = length(string);
- static const size_t theArraySize =
- sizeof(theHTMLAttributes) / sizeof(theHTMLAttributes[0]);
+ for (unsigned int i = 0; i < len; ++i)
+ {
+ const XalanDOMChar ch = string[i];
- HTMLAttributesVectorType theAttributes;
+ // if first 8 bytes are 0, no need to append them.
+ if (ch < 9 || ch > 127 || ch == '"' || ch == ' ')
+ {
+ const unsigned int b1 = (ch & 0xFF00) >> 8;
+ const unsigned int b2 = ch & 0x00FF;
- theAttributes.reserve(theArraySize);
+ if(b1 != 0)
+ {
+ accum('%');
- for(size_t i = 0; i < theArraySize; i++)
- {
-#if defined(XALAN_WIDE_STRING_UCODE_PROBLEM)
- theAttributes.push_back(initializeAndTranscode(theHTMLAttributes[i]));
-#else
- theAttributes.push_back(theHTMLAttributes[i]);
-#endif
- }
+ accum(UnsignedLongToHexDOMString(b1));
+ }
- return theAttributes;
+ accum('%');
+ accum(UnsignedLongToHexDOMString(b2));
+ }
+ else
+ {
+ accum(ch);
+ }
+ }
}
-FormatterToHTML::HTMLSymbolsVectorType
-FormatterToHTML::createSymbols()
+FormatterToHTML::ElementFlagsMapType
+FormatterToHTML::createElementFlagsMap()
{
-#if defined(XALAN_WIDE_STRING_UCODE_PROBLEM)
- static const char* const theHTMLSymbols[] =
- {
- "Alpha", "Beta",
- "Gamma", "Delta", "Epsilon", "Zeta",
- "Eta", "Theta", "Iota", "Kappa",
- "Lambda", "Mu", "Nu", "Xi",
- "Omicron", "Pi", "Rho", "", "Sigma",
- "Tau", "Upsilon", "Phi", "Chi",
- "Psi", "Omega", "alpha", "beta",
- "gamma", "delta", "epsilon", "zeta",
- "eta", "theta", "iota", "kappa",
- "lambda", "mu", "nu", "xi",
- "omicron", "pi", "rho", "sigmaf",
- "sigma", "tau", "upsilon", "phi",
- "chi", "psi", "omega", "thetasym",
- "upsih", "piv"
- };
+#if defined(XALAN_NO_NAMESPACES)
+ typedef pair<ElementFlagsMapType::iterator, bool> PairType;
#else
- static const XMLCh* const theHTMLSymbols[] =
- {
- L"Alpha", L"Beta",
- L"Gamma", L"Delta", L"Epsilon", L"Zeta",
- L"Eta", L"Theta", L"Iota", L"Kappa",
- L"Lambda", L"Mu", L"Nu", L"Xi",
- L"Omicron", L"Pi", L"Rho", L"", L"Sigma",
- L"Tau", L"Upsilon", L"Phi", L"Chi",
- L"Psi", L"Omega", L"alpha", L"beta",
- L"gamma", L"delta", L"epsilon", L"zeta",
- L"eta", L"theta", L"iota", L"kappa",
- L"lambda", L"mu", L"nu", L"xi",
- L"omicron", L"pi", L"rho", L"sigmaf",
- L"sigma", L"tau", L"upsilon", L"phi",
- L"chi", L"psi", L"omega", L"thetasym",
- L"upsih", L"piv"
- };
+ typedef std::pair<ElementFlagsMapType::iterator, bool> PairType;
#endif
- static const size_t theArraySize =
- sizeof(theHTMLSymbols) / sizeof(theHTMLSymbols[0]);
+ ElementFlagsMapType theElementFlags;
- HTMLSymbolsVectorType theSymbols;
-
- theSymbols.reserve(theArraySize);
-
- for(size_t i = 0; i < theArraySize; i++)
- {
-#if defined(XALAN_WIDE_STRING_UCODE_PROBLEM)
- theSymbols.push_back(initializeAndTranscode(theHTMLSymbols[i]));
-#else
- theSymbols.push_back(theHTMLSymbols[i]);
-#endif
- }
+ // HTML 4.0 loose DTD
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("BASEFONT"),
+ ElemDesc(0|ElemDesc::EMPTY)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("FRAME"),
+ ElemDesc(0|ElemDesc::EMPTY|ElemDesc::BLOCK)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("FRAMESET"),
+ ElemDesc(0|ElemDesc::BLOCK)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("NOFRAMES"),
+ ElemDesc(0|ElemDesc::BLOCK)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("ISINDEX"),
+ ElemDesc(0|ElemDesc::EMPTY|ElemDesc::BLOCK)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("APPLET"),
+ ElemDesc(0|ElemDesc::WHITESPACESENSITIVE)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("CENTER"),
+ ElemDesc(0|ElemDesc::BLOCK)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("DIR"),
+ ElemDesc(0|ElemDesc::BLOCK)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("MENU"),
+ ElemDesc(0|ElemDesc::BLOCK)));
+
+
+ // HTML 4.0 strict DTD
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("TT"),
+ ElemDesc(0|ElemDesc::FONTSTYLE)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("I"),
+ ElemDesc(0|ElemDesc::FONTSTYLE)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("B"),
+ ElemDesc(0|ElemDesc::FONTSTYLE)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("BIG"),
+ ElemDesc(0|ElemDesc::FONTSTYLE)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("SMALL"),
+ ElemDesc(0|ElemDesc::FONTSTYLE)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("EM"),
+ ElemDesc(0|ElemDesc::PHRASE)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("STRONG"),
+ ElemDesc(0|ElemDesc::PHRASE)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("DFN"),
+ ElemDesc(0|ElemDesc::PHRASE)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("CODE"),
+ ElemDesc(0|ElemDesc::PHRASE)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("SAMP"),
+ ElemDesc(0|ElemDesc::PHRASE)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("KBD"),
+ ElemDesc(0|ElemDesc::PHRASE)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("VAR"),
+ ElemDesc(0|ElemDesc::PHRASE)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("CITE"),
+ ElemDesc(0|ElemDesc::PHRASE)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("ABBR"),
+ ElemDesc(0|ElemDesc::PHRASE)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("ACRONYM"),
+ ElemDesc(0|ElemDesc::PHRASE)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("SUP"),
+ ElemDesc(0|ElemDesc::SPECIAL|ElemDesc::ASPECIAL)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("SUB"),
+ ElemDesc(0|ElemDesc::SPECIAL|ElemDesc::ASPECIAL)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("SPAN"),
+ ElemDesc(0|ElemDesc::SPECIAL|ElemDesc::ASPECIAL)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("BDO"),
+ ElemDesc(0|ElemDesc::SPECIAL|ElemDesc::ASPECIAL)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("BR"),
+ ElemDesc(0|ElemDesc::SPECIAL|ElemDesc::ASPECIAL|ElemDesc::EMPTY|ElemDesc::BLOCK)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("BODY"),
+ ElemDesc(0|ElemDesc::BLOCK)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("ADDRESS"),
+ ElemDesc(0|ElemDesc::BLOCK|ElemDesc::BLOCKFORM|ElemDesc::BLOCKFORMFIELDSET)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("DIV"),
+ ElemDesc(0|ElemDesc::BLOCK|ElemDesc::BLOCKFORM|ElemDesc::BLOCKFORMFIELDSET)));
+
+ PairType theResult =
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("A"),
+ ElemDesc(0|ElemDesc::SPECIAL)));
+
+ theResult.first->second.setAttr(XALAN_STATIC_UCODE_STRING("HREF"), ElemDesc::ATTRURL);
+ theResult.first->second.setAttr(XALAN_STATIC_UCODE_STRING("NAME"), ElemDesc::ATTRURL);
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("MAP"),
+ ElemDesc(0|ElemDesc::SPECIAL|ElemDesc::ASPECIAL|ElemDesc::BLOCK)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("AREA"),
+ ElemDesc(0|ElemDesc::EMPTY|ElemDesc::BLOCK)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("LINK"),
+ ElemDesc(0|ElemDesc::HEADMISC|ElemDesc::EMPTY|ElemDesc::BLOCK)));
+
+ theResult =
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("IMG"),
+ ElemDesc(0|ElemDesc::SPECIAL|ElemDesc::ASPECIAL|ElemDesc::EMPTY|ElemDesc::WHITESPACESENSITIVE)));
+
+ theResult.first->second.setAttr(XALAN_STATIC_UCODE_STRING("SRC"), ElemDesc::ATTRURL);
+ theResult.first->second.setAttr(XALAN_STATIC_UCODE_STRING("LONGDESC"), ElemDesc::ATTRURL);
+ theResult.first->second.setAttr(XALAN_STATIC_UCODE_STRING("USEMAP"), ElemDesc::ATTRURL);
+
+ theResult =
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("OBJECT"),
+ ElemDesc(0|ElemDesc::SPECIAL|ElemDesc::ASPECIAL|ElemDesc::HEADMISC|ElemDesc::WHITESPACESENSITIVE)));
+
+ theResult.first->second.setAttr(XALAN_STATIC_UCODE_STRING("CLASSID"), ElemDesc::ATTRURL);
+ theResult.first->second.setAttr(XALAN_STATIC_UCODE_STRING("CODEBASE"), ElemDesc::ATTRURL);
+ theResult.first->second.setAttr(XALAN_STATIC_UCODE_STRING("DATA"), ElemDesc::ATTRURL);
+ theResult.first->second.setAttr(XALAN_STATIC_UCODE_STRING("ARCHIVE"), ElemDesc::ATTRURL);
+ theResult.first->second.setAttr(XALAN_STATIC_UCODE_STRING("USEMAP"), ElemDesc::ATTRURL);
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("PARAM"),
+ ElemDesc(0|ElemDesc::EMPTY)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("HR"),
+ ElemDesc(0|ElemDesc::BLOCK|ElemDesc::BLOCKFORM|ElemDesc::BLOCKFORMFIELDSET|ElemDesc::EMPTY)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("P"),
+ ElemDesc(0|ElemDesc::BLOCK|ElemDesc::BLOCKFORM|ElemDesc::BLOCKFORMFIELDSET)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("H1"),
+ ElemDesc(0|ElemDesc::HEAD|ElemDesc::BLOCK)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("H2"),
+ ElemDesc(0|ElemDesc::HEAD|ElemDesc::BLOCK)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("H3"),
+ ElemDesc(0|ElemDesc::HEAD|ElemDesc::BLOCK)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("H4"),
+ ElemDesc(0|ElemDesc::HEAD|ElemDesc::BLOCK)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("H5"),
+ ElemDesc(0|ElemDesc::HEAD|ElemDesc::BLOCK)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("H6"),
+ ElemDesc(0|ElemDesc::HEAD|ElemDesc::BLOCK)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("PRE"),
+ ElemDesc(0|ElemDesc::PREFORMATTED|ElemDesc::BLOCK)));
+
+ theResult =
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("Q"),
+ ElemDesc(0|ElemDesc::SPECIAL|ElemDesc::ASPECIAL)));
+
+ theResult.first->second.setAttr(XALAN_STATIC_UCODE_STRING("CITE"), ElemDesc::ATTRURL);
+
+ theResult =
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("BLOCKQUOTE"),
+ ElemDesc(0|ElemDesc::BLOCK|ElemDesc::BLOCKFORM|ElemDesc::BLOCKFORMFIELDSET)));
+
+ theResult.first->second.setAttr(XALAN_STATIC_UCODE_STRING("CITE"), ElemDesc::ATTRURL);
+
+ theResult =
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("INS"),
+ ElemDesc(0)));
+
+ theResult.first->second.setAttr(XALAN_STATIC_UCODE_STRING("CITE"), ElemDesc::ATTRURL);
+
+ theResult =
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("DEL"),
+ ElemDesc(0)));
+
+ theResult.first->second.setAttr(XALAN_STATIC_UCODE_STRING("CITE"), ElemDesc::ATTRURL);
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("DL"),
+ ElemDesc(0|ElemDesc::BLOCK|ElemDesc::BLOCKFORM|ElemDesc::BLOCKFORMFIELDSET)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("DT"),
+ ElemDesc(0|ElemDesc::BLOCK)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("DD"),
+ ElemDesc(0|ElemDesc::BLOCK)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("OL"),
+ ElemDesc(0|ElemDesc::LIST|ElemDesc::BLOCK)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("UL"),
+ ElemDesc(0|ElemDesc::LIST|ElemDesc::BLOCK)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("LI"),
+ ElemDesc(0|ElemDesc::BLOCK)));
+
+ theResult =
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("FORM"),
+ ElemDesc(0|ElemDesc::BLOCK)));
+
+ theResult.first->second.setAttr(XALAN_STATIC_UCODE_STRING("ACTION"), ElemDesc::ATTRURL);
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("LABEL"),
+ ElemDesc(0|ElemDesc::FORMCTRL)));
+
+ theResult =
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("INPUT"),
+ ElemDesc(0|ElemDesc::FORMCTRL|ElemDesc::INLINELABEL|ElemDesc::EMPTY)));
+
+ theResult.first->second.setAttr(XALAN_STATIC_UCODE_STRING("SRC"), ElemDesc::ATTRURL);
+ theResult.first->second.setAttr(XALAN_STATIC_UCODE_STRING("USEMAP"), ElemDesc::ATTRURL);
+ theResult.first->second.setAttr(XALAN_STATIC_UCODE_STRING("CHECKED"), ElemDesc::ATTREMPTY);
+ theResult.first->second.setAttr(XALAN_STATIC_UCODE_STRING("DISABLED"), ElemDesc::ATTREMPTY);
+ theResult.first->second.setAttr(XALAN_STATIC_UCODE_STRING("READONLY"), ElemDesc::ATTREMPTY);
+
+ theResult =
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("SELECT"),
+ ElemDesc(0|ElemDesc::FORMCTRL|ElemDesc::INLINELABEL)));
+
+ theResult.first->second.setAttr(XALAN_STATIC_UCODE_STRING("READONLY"), ElemDesc::ATTREMPTY);
+ theResult.first->second.setAttr(XALAN_STATIC_UCODE_STRING("MULTIPLE"), ElemDesc::ATTREMPTY);
+
+ theResult =
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("OPTGROUP"),
+ ElemDesc(0)));
+
+ theResult.first->second.setAttr(XALAN_STATIC_UCODE_STRING("DISABLED"), ElemDesc::ATTREMPTY);
+
+ theResult =
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("OPTION"),
+ ElemDesc(0)));
+
+ theResult.first->second.setAttr(XALAN_STATIC_UCODE_STRING("DISABLED"), ElemDesc::ATTREMPTY);
+ theResult.first->second.setAttr(XALAN_STATIC_UCODE_STRING("SELECTED"), ElemDesc::ATTREMPTY);
+
+ theResult =
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("TEXTAREA"),
+ ElemDesc(0|ElemDesc::FORMCTRL|ElemDesc::INLINELABEL)));
+
+ theResult.first->second.setAttr(XALAN_STATIC_UCODE_STRING("DISABLED"), ElemDesc::ATTREMPTY);
+ theResult.first->second.setAttr(XALAN_STATIC_UCODE_STRING("READONLY"), ElemDesc::ATTREMPTY);
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("FIELDSET"),
+ ElemDesc(0|ElemDesc::BLOCK|ElemDesc::BLOCKFORM)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("LEGEND"),
+ ElemDesc(0)));
+
+ theResult =
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("BUTTON"),
+ ElemDesc(0|ElemDesc::FORMCTRL|ElemDesc::INLINELABEL)));
+
+ theResult.first->second.setAttr(XALAN_STATIC_UCODE_STRING("DISABLED"), ElemDesc::ATTREMPTY);
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("TABLE"),
+ ElemDesc(0|ElemDesc::BLOCK|ElemDesc::BLOCKFORM|ElemDesc::BLOCKFORMFIELDSET)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("CAPTION"),
+ ElemDesc(0|ElemDesc::BLOCK)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("THEAD"),
+ ElemDesc(0|ElemDesc::BLOCK)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("TFOOT"),
+ ElemDesc(0|ElemDesc::BLOCK)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("TBODY"),
+ ElemDesc(0|ElemDesc::BLOCK)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("COLGROUP"),
+ ElemDesc(0|ElemDesc::BLOCK)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("COL"),
+ ElemDesc(0|ElemDesc::EMPTY|ElemDesc::BLOCK)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("TR"),
+ ElemDesc(0|ElemDesc::BLOCK)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("TH"),
+ ElemDesc(0)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("TD"),
+ ElemDesc(0)));
+
+ theResult =
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("HEAD"),
+ ElemDesc(0|ElemDesc::BLOCK)));
+
+ theResult.first->second.setAttr(XALAN_STATIC_UCODE_STRING("PROFILE"), ElemDesc::ATTRURL);
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("TITLE"),
+ ElemDesc(0|ElemDesc::BLOCK)));
+
+ theResult =
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("BASE"),
+ ElemDesc(0|ElemDesc::EMPTY|ElemDesc::BLOCK)));
+
+ theResult.first->second.setAttr(XALAN_STATIC_UCODE_STRING("HREF"), ElemDesc::ATTRURL);
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("META"),
+ ElemDesc(0|ElemDesc::HEADMISC|ElemDesc::EMPTY|ElemDesc::BLOCK)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("STYLE"),
+ ElemDesc(0|ElemDesc::HEADMISC|ElemDesc::RAW|ElemDesc::BLOCK)));
+
+ theResult =
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("SCRIPT"),
+ ElemDesc(0|ElemDesc::SPECIAL|ElemDesc::ASPECIAL|ElemDesc::HEADMISC|ElemDesc::RAW)));
+
+ theResult.first->second.setAttr(XALAN_STATIC_UCODE_STRING("SRC"), ElemDesc::ATTRURL);
+ theResult.first->second.setAttr(XALAN_STATIC_UCODE_STRING("FOR"), ElemDesc::ATTRURL);
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("NOSCRIPT"),
+ ElemDesc(0|ElemDesc::BLOCK|ElemDesc::BLOCKFORM|ElemDesc::BLOCKFORMFIELDSET)));
+
+ theElementFlags.insert(
+ ElementFlagsMapType::value_type(
+ XALAN_STATIC_UCODE_STRING("HTML"),
+ ElemDesc(0|ElemDesc::BLOCK)));
- return theSymbols;
+ return theElementFlags;
}
1.8 +213 -90 xml-xalan/c/src/XMLSupport/FormatterToHTML.hpp
Index: FormatterToHTML.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XMLSupport/FormatterToHTML.hpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- FormatterToHTML.hpp 2000/05/15 15:52:49 1.7
+++ FormatterToHTML.hpp 2000/05/18 18:37:23 1.8
@@ -58,7 +58,7 @@
#define FORMATTERTOHTML_HEADER_GUARD_1357924680
/**
- * $Id: FormatterToHTML.hpp,v 1.7 2000/05/15 15:52:49 dbertoni Exp $
+ * $Id: FormatterToHTML.hpp,v 1.8 2000/05/18 18:37:23 dbertoni Exp $
*
* $State: Exp $
*
@@ -81,9 +81,16 @@
// Base class header file.
#include <XMLSupport/FormatterToXML.hpp>
+
+
+#include <PlatformSupport/DOMStringHelper.hpp>
+
+
+
#include <XPath/QName.hpp>
+
/**
* FormatterToHTML formats SAX-style events into HTML.
*/
@@ -92,19 +99,6 @@
public:
-#if defined(XALAN_NO_NAMESPACES)
-# define XALAN_STD
-#else
-# define XALAN_STD std::
-#endif
- typedef XALAN_STD set<XalanDOMString> EmptiesSetType;
- typedef XALAN_STD vector<XalanDOMString> HTMLAttributesVectorType;
- typedef XALAN_STD vector<XalanDOMString> HTMLSymbolsVectorType;
- typedef XALAN_STD set<XalanDOMString> StringSetType;
- typedef XALAN_STD map<XalanDOMString, StringSetType> AttributesMapType;
-#undef XALAN_STD
-
-
/**
* Constructor for customized encoding and doctype.
* @param writer The character output stream to use.
@@ -114,15 +108,15 @@
*/
FormatterToHTML(
Writer& writer,
- const XalanDOMString& version,
- bool doIndent,
- int indent,
- const XalanDOMString& encoding,
- const XalanDOMString& mediaType,
- const XalanDOMString& doctypeSystem,
- const XalanDOMString& doctypePublic,
- bool xmlDecl,
- const XalanDOMString& standalone);
+ const XalanDOMString& encoding = XalanDOMString(),
+ const XalanDOMString& mediaType = XalanDOMString(),
+ const XalanDOMString& doctypeSystem = XalanDOMString(),
+ const XalanDOMString& doctypePublic = XalanDOMString(),
+ bool doIndent = true,
+ int indent = 4,
+ const XalanDOMString& version = XalanDOMString(),
+ const XalanDOMString& standalone = XalanDOMString(),
+ bool xmlDecl = false);
virtual
~FormatterToHTML();
@@ -134,9 +128,6 @@
startDocument();
virtual void
- endDocument();
-
- virtual void
startElement(
const XMLCh* const name,
AttributeList& attrs);
@@ -167,71 +158,215 @@
const XMLCh* const data);
+protected:
+
// These methods are new ...
+ /**
+ * Write an attribute string.
+ * @param string The string to write.
+ * @param encoding The current encoding.
+ */
+ virtual void
+ writeAttrString(
+ const XalanDOMChar* string,
+ const XalanDOMString& encoding);
+
+private:
+
+ class ElemDesc
+ {
+ public:
+
+ enum eFlags
+ {
+ EMPTY = (1 << 1),
+ FLOW = (1 << 2),
+ BLOCK = (1 << 3),
+ BLOCKFORM = (1 << 4),
+ BLOCKFORMFIELDSET = (1 << 5),
+ CDATA = (1 << 6),
+ PCDATA = (1 << 7),
+ RAW = (1 << 8),
+ INLINE = (1 << 9),
+ INLINEA = (1 << 10),
+ INLINELABEL = (1 << 11),
+ FONTSTYLE = (1 << 12),
+ PHRASE = (1 << 13),
+ FORMCTRL = (1 << 14),
+ SPECIAL = (1 << 15),
+ ASPECIAL = (1 << 16),
+ HEADMISC = (1 << 17),
+ HEAD = (1 << 18),
+ LIST = (1 << 19),
+ PREFORMATTED = (1 << 20),
+ WHITESPACESENSITIVE = (1 << 21),
+
+ ATTRURL = (1 << 1),
+ ATTREMPTY = (1 << 2)
+ };
+
+ ElemDesc(unsigned int flags = 0) :
+ m_flags(flags)
+ {
+ }
+
+ ~ElemDesc()
+ {
+ }
+
+ bool
+ is(unsigned int flags) const
+ {
+ return m_flags & flags ? true : false;
+ }
+
+ void
+ setAttr(
+ const XalanDOMString& name,
+ unsigned int flags)
+ {
+ m_attrs.insert(AttributeMapType::value_type(name, flags));
+ }
+
+ bool
+ isAttrFlagSet(
+ const XalanDOMString& name,
+ unsigned int flags) const
+ {
+ const AttributeMapType::const_iterator i =
+ m_attrs.find(name);
+
+ if (i == m_attrs.end())
+ {
+ return false;
+ }
+ else
+ {
+ return i->second & flags ? true : false;
+ }
+ }
+
+ private:
+
+ #if defined(XALAN_NO_NAMESPACES)
+ typedef map<DOMString, unsigned int> AttributeMapType;
+ #else
+ typedef std::map<DOMString, unsigned int> AttributeMapType;
+ #endif
+
+ const unsigned int m_flags;
+
+ AttributeMapType m_attrs;
+ };
+
+#if defined(XALAN_NO_NAMESPACES)
+ typedef map<DOMString, ElemDesc> ElementFlagsMapType;
+#else
+ typedef std::map<DOMString, ElemDesc> ElementFlagsMapType;
+#endif
+
+ static const ElementFlagsMapType s_elementFlags;
+
/**
- * Initialize the list of HTML elements that do not contain text, for
- * example, "BR"
- *
- * @return set of strings for elements
+ * Dummy description for elements not found.
*/
- static EmptiesSetType
- createEmpties();
+ static const ElemDesc s_dummyDesc;
/**
- * Initialize the list of attributes for HTML elements that do not contain
- * text, for example, "checked."
- *
- * @return set of strings for elements
+ * The string "<!DOCTYPE HTML".
*/
- static EmptiesSetType
- createAttrEmpties();
+ static const XalanDOMCharVectorType s_doctypeHeaderStartString;
/**
- * Initialize the list of entity reference names, for example, "nbsp."
- *
- * @return vector of strings
+ * The string " PUBLIC \"".
*/
- static HTMLAttributesVectorType
- createAttributes();
+ static const XalanDOMCharVectorType s_doctypeHeaderPublicString;
/**
- * Initialize the list of HTML non-block elements, for example, "BR".
- * These are present alone and do not have the closing "/>" needed for
- * valid XML.
- *
- * @return vector of strings
+ * The string " SYSTEM".
*/
- static StringSetType
- createNonBlockElems();
+ static const XalanDOMCharVectorType s_doctypeHeaderSystemString;
/**
- * Initialize the list of symbols that must be escaped, for example, "<"
- *
- * @return set of strings
+ * The string "SCRIPT".
*/
- static StringSetType
- createEscapeElems();
+ static const XalanDOMCharVectorType s_scriptString;
/**
- * Initialize the map of valid attributes for HTML tags. For example, the
- * tag "A" can have attributes of "HREF" and "NAME"
- *
- * @return map of attributes to vector of tags
+ * The string "STYLE".
+ */
+ static const XalanDOMCharVectorType s_styleString;
+
+ /**
+ * The string "lt".
+ */
+ static const XalanDOMCharVectorType s_ltString;
+
+ /**
+ * The string "gt".
+ */
+ static const XalanDOMCharVectorType s_gtString;
+
+ /**
+ * The string "amp.
+ */
+ static const XalanDOMCharVectorType s_ampString;
+
+ /**
+ * The string "fnof".
*/
- static AttributesMapType
- createAttributesMap();
+ static const XalanDOMCharVectorType s_fnofString;
/**
- * Initialize the list of names for symbols, for example, "chi" for the
- * Greek letter Chi.
+ * Set the attribute characters what will require special mapping.
+ */
+ void
+ initAttrCharsMap();
+
+ /**
+ * Set the output characters what will require special mapping.
+ */
+ void
+ initCharsMap();
+
+ unsigned int
+ copyEntityIntoBuffer(
+ const XalanDOMChar* s,
+ unsigned int pos);
+
+ unsigned int
+ copyEntityIntoBuffer(
+ const XalanDOMString& s,
+ unsigned int pos)
+ {
+ return copyEntityIntoBuffer(c_wstr(s), pos);
+ }
+
+ unsigned int
+ copyEntityIntoBuffer(
+ const XalanDOMCharVectorType& s,
+ unsigned int pos)
+ {
+ return copyEntityIntoBuffer(c_wstr(s), pos);
+ }
+
+ /**
+ * Get an ElemDesc instance for the specified name.
*
- * @return vector of strings for symbol names
+ * @param name the name to search.
+ * @return a const reference to the ElemDesc instance.
*/
- static HTMLSymbolsVectorType
- createSymbols();
+ static const ElemDesc&
+ getElemDesc(const XalanDOMString& name);
-protected:
+ /**
+ * Initialize the map of element flags.
+ *
+ * @return map of element flags.
+ */
+ static ElementFlagsMapType
+ createElementFlagsMap();
/**
* Process an attribute.
@@ -241,39 +376,27 @@
virtual void
processAttribute(
const XalanDOMChar* name,
- const XalanDOMChar* value);
+ const XalanDOMChar* value,
+ const ElemDesc& elemDesc);
/**
- * Returns the specified <var>string</var> after substituting non ASCII characters,
+ * Write the specified <var>string</var> after substituting non ASCII characters,
* with <CODE>%HH</CODE>, where HH is the hex of the byte value.
*
* @param string String to convert to XML format.
* @param specials Chracters, should be represeted in chracter referenfces.
* @param encoding CURRENTLY NOT IMPLEMENTED.
- * @return XML-formatted string.
- * @see #backReference
- * NOTE: return value destroyed on subsequent calls
- */
- const XalanDOMString
- prepAttrURI(
- const XalanDOMString& string,
- const XalanDOMString& specials,
- const XalanDOMString& encoding);
- // java: throws SAXException
-
-private:
+ */
+ void
+ writeAttrURI(
+ const XalanDOMChar* string,
+ const XalanDOMString encoding);
- static const EmptiesSetType s_empties;
- static const EmptiesSetType s_attrempties;
- static const HTMLAttributesVectorType s_HTMLlat1;
- static const HTMLSymbolsVectorType s_HTMLsymbol1;
- static const StringSetType s_nonblockelems;
- static const AttributesMapType s_attruris;
- static const StringSetType s_escapetb;
+ XalanDOMString m_currentElementName;
- XalanDOMString m_currentElementName;
- bool m_inBlockElem;
+ bool m_inBlockElem;
+ BoolStackType m_isRawStack;
};
1.6 +2 -2 xml-xalan/c/src/XMLSupport/FormatterToText.cpp
Index: FormatterToText.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XMLSupport/FormatterToText.cpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- FormatterToText.cpp 2000/03/21 03:22:45 1.5
+++ FormatterToText.cpp 2000/05/18 18:37:23 1.6
@@ -67,8 +67,8 @@
-FormatterToText::FormatterToText(
- Writer& pw) :
+FormatterToText::FormatterToText(Writer& pw) :
+ FormatterListener(OUTPUT_METHOD_TEXT),
m_pw(pw)
{
}
1.18 +929 -732 xml-xalan/c/src/XMLSupport/FormatterToXML.cpp
Index: FormatterToXML.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XMLSupport/FormatterToXML.cpp,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -r1.17 -r1.18
--- FormatterToXML.cpp 2000/05/15 15:52:48 1.17
+++ FormatterToXML.cpp 2000/05/18 18:37:23 1.18
@@ -10,33 +10,33 @@
* are met:
*
* 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
+ * notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
*
* 3. The end-user documentation included with the redistribution,
- * if any, must include the following acknowledgment:
- * "This product includes software developed by the
- * Apache Software Foundation (http://www.apache.org/)."
- * Alternately, this acknowledgment may appear in the software itself,
- * if and wherever such third-party acknowledgments normally appear.
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Xalan" and "Apache Software Foundation" must
- * not be used to endorse or promote products derived from this
- * software without prior written permission. For written
- * permission, please contact apache@apache.org.
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
- * nor may "Apache" appear in their name, without prior written
- * permission of the Apache Software Foundation.
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
@@ -61,10 +61,6 @@
-#include <string>
-
-
-
#include <sax/AttributeList.hpp>
#include <sax/SAXException.hpp>
@@ -74,80 +70,135 @@
#include <PlatformSupport/Writer.hpp>
+
+static XalanDOMChar theDefaultAttrSpecialChars[] = {'<', '>', '&', '"', '\r', '\n' };
+
+
+const XalanDOMCharVectorType FormatterToXML::s_xsltNextIsRawString =
+ MakeXalanDOMCharVector(c_wstr(XALAN_STATIC_UCODE_STRING("xslt-next-is-raw")));
+
+const XalanDOMCharVectorType FormatterToXML::s_formatterToDOMString =
+ MakeXalanDOMCharVector(c_wstr(XALAN_STATIC_UCODE_STRING("formatter-to-dom")));
+
+const XalanDOMCharVectorType FormatterToXML::s_defaultMIMEEncoding =
+ MakeXalanDOMCharVector(c_wstr(XALAN_STATIC_UCODE_STRING("UTF-8")));
+
+const XalanDOMCharVectorType FormatterToXML::s_doctypeHeaderStartString =
+ MakeXalanDOMCharVector(c_wstr(XALAN_STATIC_UCODE_STRING("<!DOCTYPE ")));
+
+const XalanDOMCharVectorType FormatterToXML::s_doctypeHeaderPublicString =
+ MakeXalanDOMCharVector(c_wstr(XALAN_STATIC_UCODE_STRING(" PUBLIC \"")));
+
+const XalanDOMCharVectorType FormatterToXML::s_doctypeHeaderSystemString =
+ MakeXalanDOMCharVector(c_wstr(XALAN_STATIC_UCODE_STRING(" SYSTEM \"")));
+
+const XalanDOMCharVectorType FormatterToXML::s_defaultVersionString =
+ MakeXalanDOMCharVector(c_wstr(XALAN_STATIC_UCODE_STRING("1.0")));
-static XalanDOMString theDefaultAttrSpecialChars(XALAN_STATIC_UCODE_STRING("<>&\"\r\n"));
+const XalanDOMCharVectorType FormatterToXML::s_xmlHeaderStartString =
+ MakeXalanDOMCharVector(c_wstr(XALAN_STATIC_UCODE_STRING("<?xml version=\"")));
+const XalanDOMCharVectorType FormatterToXML::s_xmlHeaderEncodingString =
+ MakeXalanDOMCharVector(c_wstr(XALAN_STATIC_UCODE_STRING("\" encoding=\"")));
-const XalanDOMString FormatterToXML::DEFAULT_MIME_ENCODING = XALAN_STATIC_UCODE_STRING("UTF-8");
+const XalanDOMCharVectorType FormatterToXML::s_xmlHeaderStandaloneString =
+ MakeXalanDOMCharVector(c_wstr(XALAN_STATIC_UCODE_STRING("\" standalone=\"")));
+const XalanDOMCharVectorType FormatterToXML::s_xmlHeaderEndString =
+ MakeXalanDOMCharVector(c_wstr(XALAN_STATIC_UCODE_STRING("\"?>")));
-XalanDOMChar FormatterToXML::m_charBuf[MAXCHARBUF];
+const XalanDOMCharVectorType FormatterToXML::s_windows1250EncodingString =
+ MakeXalanDOMCharVector(c_wstr(XALAN_STATIC_UCODE_STRING("WINDOWS-1250")));
-// This should be OK on all platforms ??
-XalanDOMChar FormatterToXML::m_lineSep = '\n';
+const XalanDOMCharVectorType FormatterToXML::s_usASCIIEncodingString =
+ MakeXalanDOMCharVector(c_wstr(XALAN_STATIC_UCODE_STRING("US-ASCII")));
-bool FormatterToXML::m_javaEncodingIsISO = false;
+const XalanDOMCharVectorType FormatterToXML::s_asciiEncodingString =
+ MakeXalanDOMCharVector(c_wstr(XALAN_STATIC_UCODE_STRING("ASCII")));
+const XalanDOMCharVectorType FormatterToXML::s_utf8EncodingString=
+ MakeXalanDOMCharVector(c_wstr(XALAN_STATIC_UCODE_STRING("UTF-8")));
+XalanDOMChar FormatterToXML::s_lineSep = '\n';
+
+
+bool FormatterToXML::s_javaEncodingIsISO = false;
+
+
+const FormatterToXML::DOMCharBufferType::size_type FormatterToXML::s_maxBufferSize = 8 * 1024;
+
+
FormatterToXML::FormatterToXML(
- Writer& writer,
- const XalanDOMString& /* version */,
- bool doIndent,
- int indent,
- const XalanDOMString& encoding,
- const XalanDOMString& /*mediaType */,
- const XalanDOMString& doctypeSystem,
- const XalanDOMString& doctypePublic,
- bool xmlDecl,
- const XalanDOMString& standalone) :
- FormatterListener(),
- m_attrSpecialChars(theDefaultAttrSpecialChars),
- m_currentIndent(0),
- m_doctypePublic(doctypePublic),
- m_doctypeSystem(doctypeSystem),
- m_doIndent(doIndent),
- m_elemStack(),
- m_encoding(encoding),
- m_standalone(standalone),
- m_escapeCData(false),
- m_indent(indent),
+ Writer& writer,
+ const XalanDOMString& version,
+ bool doIndent,
+ int indent,
+ const XalanDOMString& encoding,
+ const XalanDOMString& mediaType,
+ const XalanDOMString& doctypeSystem,
+ const XalanDOMString& doctypePublic,
+ bool xmlDecl,
+ const XalanDOMString& standalone,
+ eFormat format) :
+ FormatterListener(format),
+ m_writer(writer),
+ m_maxCharacter(0x7Fu),
+ m_attrCharsMap(),
+ m_charsMap(),
+ m_shouldWriteXMLHeader(xmlDecl),
m_ispreserve(false),
- m_isprevtext(false),
- m_level(0),
- m_maxCharacter(0x007F),
+ m_doIndent(doIndent),
+ m_startNewLine(false),
m_needToOutputDocTypeDecl(true),
+ m_isprevtext(false),
+ m_stripCData(false),
m_nextIsRaw(false),
+ m_inCData(false),
+ m_isUTF8(false),
+ m_doctypeSystem(doctypeSystem),
+ m_doctypePublic(doctypePublic),
+ m_encoding(isEmpty(encoding) == false ? encoding :
+ XalanDOMString(&s_defaultMIMEEncoding[0], s_defaultMIMEEncoding.size() - 1)),
+ m_currentIndent(0),
+ m_indent(indent),
m_preserves(),
- m_shouldWriteXMLHeader(xmlDecl),
+ m_shouldFlush(true),
+ m_bytesEqualChars(false),
m_spaceBeforeClose(false),
- m_startNewLine(true),
- m_stripCData(false),
- m_version(),
- m_writer(writer)
+ m_escapeCData(false),
+ m_inEntityRef(false),
+ m_version(version),
+ m_standalone(standalone),
+ m_mediaType(mediaType),
+ m_attrSpecialChars(theDefaultAttrSpecialChars),
+ m_charBuf(s_maxBufferSize),
+ m_byteBuf(s_maxBufferSize),
+ m_pos(0),
+ m_level(0),
+ m_elemStack()
{
- if(! isEmpty(m_doctypePublic))
+ initCharsMap();
+
+ if(isEmpty(m_doctypePublic) == false)
{
- if(startsWith(m_doctypePublic, XALAN_STATIC_UCODE_STRING("-//W3C//DTD XHTML")))
+ if(startsWith(
+ m_doctypePublic,
+ XALAN_STATIC_UCODE_STRING("-//W3C//DTD XHTML")) == true)
+ {
m_spaceBeforeClose = true;
+ }
}
- // Determine the last printable character based on the output format
- // @@ JMD: We don't have no OutputFormat class yet ...
- // java: m_maxCharacter = format.getLastPrintable();
+ m_isUTF8 = equals(m_encoding, s_utf8EncodingString); // || isEmpty(m_encoding);
- m_isUTF8 = equals(m_encoding, XALAN_STATIC_UCODE_STRING("UTF-8")) || isEmpty(m_encoding);
- if(isEmpty(m_encoding))
+ if (equals(m_encoding, s_windows1250EncodingString) == true ||
+ equals(m_encoding, s_usASCIIEncodingString) == true ||
+ equals(m_encoding, s_asciiEncodingString) == true)
{
-/*
- @@ JMD: Not supported yet:
- java:
- encoding = System.getProperty("file.encoding");
- encoding = (null != encoding) ?
- FormatterToXML.convertJava2MimeEncoding(encoding ) : DEFAULT_MIME_ENCODING;
-*/
- m_encoding = DEFAULT_MIME_ENCODING;
+ m_bytesEqualChars = true;
}
+#if 0
DOMString2IntMapType::const_iterator it =
s_revsize.find(toUpperCase(m_encoding));
@@ -157,8 +208,9 @@
it = s_revsize.find(toUpperCase(m_encoding));
if (it != s_revsize.end())
{
- m_maxCharacter = (*it).second;
+ m_maxCharacter = (*it).second;
}
+#endif
}
@@ -170,26 +222,406 @@
void
-FormatterToXML::setDocumentLocator(const Locator* const /* locator */)
+FormatterToXML::initAttrCharsMap()
{
- // I don't do anything with this yet.
+ memset(m_attrCharsMap, 0, sizeof(m_attrCharsMap));
+
+ const unsigned int nSpecials = length(m_attrSpecialChars);
+
+ for(unsigned int i = 0; i < nSpecials; ++i)
+ {
+ m_attrCharsMap[charAt(m_attrSpecialChars, i)] = 'S';
+ }
+
+ m_attrCharsMap[0x0A] = 'S';
+ m_attrCharsMap[0x0D] = 'S';
}
+void
+FormatterToXML::initCharsMap()
+{
+ initAttrCharsMap();
+
+ memset(m_charsMap, 0, sizeof(m_charsMap));
+ m_charsMap['\n'] = 'S';
+ m_charsMap['<'] = 'S';
+ m_charsMap['>'] = 'S';
+ m_charsMap['&'] = 'S';
+
+ memset(m_charsMap, 'S', 20);
+
+ m_charsMap[0x0A] = 'S';
+ m_charsMap[0x0D] = 'S';
+ m_charsMap[9] = '\0';
+
+ for(int i = m_maxCharacter; i < SPECIALSSIZE; ++i)
+ {
+ m_charsMap[i] = 'S';
+ }
+}
+
+
+
void
+FormatterToXML::outputDocTypeDecl(const XalanDOMString& name)
+{
+ accum(s_doctypeHeaderStartString); // "<!DOCTYPE "
+
+ accum(name);
+
+ if(length(m_doctypePublic) != 0)
+ {
+ accum(s_doctypeHeaderPublicString); // " PUBLIC \""
+ accum(m_doctypePublic);
+ accum('"');
+ accum(' ');
+ accum('"');
+ }
+ else
+ {
+ accum(s_doctypeHeaderSystemString); // " SYSTEM \""
+ }
+
+ accum(m_doctypeSystem);
+ accum('"');
+ accum('>');
+
+ outputLineSep();
+}
+
+
+
+void
+FormatterToXML::accum(char ch)
+{
+ if(m_bytesEqualChars == true)
+ {
+ m_byteBuf[m_pos++] = ch;
+
+ if(m_pos == s_maxBufferSize)
+ {
+ flushBytes();
+ }
+ }
+ else
+ {
+ m_charBuf[m_pos++] = ch;
+
+ if(m_pos == s_maxBufferSize)
+ {
+ flushChars();
+ }
+ }
+}
+
+
+
+void
+FormatterToXML::accum(XalanDOMChar ch)
+{
+ if(m_bytesEqualChars == true)
+ {
+ m_byteBuf[m_pos++] = static_cast<ByteBufferType::value_type>(ch);
+
+ if(m_pos == s_maxBufferSize)
+ {
+ flushBytes();
+ }
+ }
+ else
+ {
+ m_charBuf[m_pos++] = ch;
+
+ if(m_pos == s_maxBufferSize)
+ {
+ flushChars();
+ }
+ }
+}
+
+
+
+void
+FormatterToXML::accum(
+ const XalanDOMChar chars[],
+ unsigned int start,
+ unsigned int length)
+{
+ const DOMCharBufferType::size_type n = start + length;
+
+ if(m_bytesEqualChars == true)
+ {
+ for(DOMCharBufferType::size_type i = start; i < n; ++i)
+ {
+ m_byteBuf[m_pos++] = static_cast<ByteBufferType::value_type>(chars[i]);
+
+ if(m_pos == s_maxBufferSize)
+ {
+ flushBytes();
+ }
+ }
+ }
+ else
+ {
+ for(DOMCharBufferType::size_type i = start; i < n; ++i)
+ {
+ m_charBuf[m_pos++] = chars[i];
+
+ if(m_pos == s_maxBufferSize)
+ {
+ flushChars();
+ }
+ }
+ }
+}
+
+
+
+void
+FormatterToXML::accum(const XalanDOMString& str)
+{
+ accum(c_wstr(str), 0, length(str));
+}
+
+
+
+void
+FormatterToXML::accum(const XalanDOMCharVectorType& theVector)
+{
+ accum(c_wstr(theVector), 0, theVector.size() - 1);
+}
+
+
+
+void
+FormatterToXML::throwInvalidUTF16SurrogateException(XalanDOMChar ch)
+{
+ const XalanDOMString theMessage("Invalid UTF-16 surrogate detected: " +
+ UnsignedLongToHexDOMString(ch) +
+ " ?");
+
+ throw SAXException(c_wstr(theMessage));
+}
+
+
+
+void
+FormatterToXML::throwInvalidUTF16SurrogateException(
+ XalanDOMChar ch,
+ unsigned int next)
+{
+ const XalanDOMString theMessage("Invalid UTF-16 surrogate detected: " +
+ UnsignedLongToHexDOMString(ch) +
+ UnsignedLongToHexDOMString(next) +
+ " ?");
+
+ throw SAXException(c_wstr(theMessage));
+}
+
+
+
+void
+FormatterToXML::accumDefaultEscape(
+ XalanDOMChar ch,
+ unsigned int i,
+ const XalanDOMChar chars[],
+ unsigned int len,
+ bool escLF)
+{
+ if(!accumDefaultEntity(ch, i, chars, len, escLF))
+ {
+ if (0xd800 <= ch && ch < 0xdc00)
+ {
+ // UTF-16 surrogate
+ unsigned int next = 0;
+
+ if (i + 1 >= len)
+ {
+ throwInvalidUTF16SurrogateException(ch);
+ }
+ else
+ {
+ next = chars[++i];
+
+ if (!(0xdc00 <= next && next < 0xe000))
+ {
+ throwInvalidUTF16SurrogateException(ch, next);
+ }
+
+ next = ((ch-0xd800) << 10) + next - 0xdc00 + 0x00010000;
+ }
+
+ writeNumberedEntityReference(next);
+ }
+ else
+ {
+ if(ch > m_maxCharacter || (ch < SPECIALSSIZE && m_attrCharsMap[ch] == 'S'))
+ {
+ writeNumberedEntityReference(ch);
+ }
+ else
+ {
+ accum(ch);
+ }
+ }
+ }
+}
+
+
+
+bool
+FormatterToXML::accumDefaultEntity(
+ XalanDOMChar ch,
+ unsigned int i,
+ const XalanDOMChar chars[],
+ unsigned int len,
+ bool escLF)
+{
+ if (escLF == false &&
+ 0x0D == ch &&
+ i + 1 < len &&
+ 0x0A == chars[i + 1])
+ {
+ outputLineSep();
+
+ i++;
+ }
+ else if (escLF == false &&
+ 0x0A == ch &&
+ i + 1 < len &&
+ 0x0D == chars[i + 1])
+ {
+ outputLineSep();
+
+ i++;
+ }
+ else if (escLF == false && 0x0D == ch)
+ {
+ outputLineSep();
+
+ i++;
+ }
+ else if (escLF == false && '\n' == ch)
+ {
+ outputLineSep();
+ }
+ else if ('<' == ch)
+ {
+ accum('&');
+ accum('l');
+ accum('t');
+ accum(';');
+ }
+ else if ('>' == ch)
+ {
+ accum('&');
+ accum('g');
+ accum('t');
+ accum(';');
+ }
+ else if ('&' == ch)
+ {
+ accum('&');
+ accum('a');
+ accum('m');
+ accum('p');
+ accum(';');
+ }
+ else if ('"' == ch)
+ {
+ accum('&');
+ accum('q');
+ accum('u');
+ accum('o');
+ accum('t');
+ accum(';');
+ }
+ else if ('\'' == ch)
+ {
+ accum('&');
+ accum('a');
+ accum('p');
+ accum('o');
+ accum('s');
+ accum(';');
+ }
+ else
+ {
+ return false;
+ }
+
+ return true;
+}
+
+
+
+void
+FormatterToXML::flushBytes()
+{
+ m_writer.write(&m_byteBuf[0], 0, m_pos);
+
+ m_pos = 0;
+}
+
+
+
+void
+FormatterToXML::flushChars()
+{
+ m_writer.write(&m_charBuf[0], 0, m_pos);
+
+ m_pos = 0;
+}
+
+
+
+void
+FormatterToXML::flush()
+{
+ if(m_bytesEqualChars == true)
+ {
+ flushBytes();
+ }
+ else
+ {
+ flushChars();
+ }
+}
+
+
+
+void
+FormatterToXML::flushWriter()
+{
+ m_writer.flush();
+}
+
+
+
+void
+FormatterToXML::setDocumentLocator(const Locator* const /* locator */)
+{
+ // I don't do anything with this yet.
+}
+
+
+
+void
FormatterToXML::startDocument()
{
- try
+ if(m_inEntityRef == false)
{
m_needToOutputDocTypeDecl = true;
m_startNewLine = false;
- if(m_shouldWriteXMLHeader)
+ if(m_shouldWriteXMLHeader == true)
{
- XalanDOMString encoding = m_encoding;
- if(isEmpty(encoding))
+ XalanDOMString encoding = m_encoding;
+
+ if(isEmpty(encoding) == true)
{
/*
java:
@@ -205,28 +637,31 @@
*/
encoding = XALAN_STATIC_UCODE_STRING("ISO-8859-1");
}
+
+ accum(s_xmlHeaderStartString); // "<?xml version=\""
- XalanDOMString version = (isEmpty(m_version)) ? XALAN_STATIC_UCODE_STRING("1.0") : m_version;
+ if (length(m_version) != 0)
+ {
+ accum(m_version);
+ }
+ else
+ {
+ accum(s_defaultVersionString);
+ }
- m_writer.write(XALAN_STATIC_UCODE_STRING("<?xml version=\""));
- m_writer.write(version);
- m_writer.write(XALAN_STATIC_UCODE_STRING("\" encoding=\""));
- m_writer.write(encoding);
+ accum(s_xmlHeaderEncodingString); // "\" encoding=\""
+ accum(encoding);
if (length(m_standalone) != 0)
{
- m_writer.write(XALAN_STATIC_UCODE_STRING("\" standalone=\""));
- m_writer.write(m_standalone);
+ accum(s_xmlHeaderStandaloneString);
+ accum(m_standalone);
}
- m_writer.write(XALAN_STATIC_UCODE_STRING("\"?>"));
- m_writer.write(m_lineSep);
- }
- }
- // java: catch(IOException ioe)
- catch(...)
- {
- throw SAXException("IO error");
+ accum(s_xmlHeaderEndString);
+
+ outputLineSep();
+ }
}
}
@@ -235,14 +670,13 @@
void
FormatterToXML::endDocument()
{
- try
+ if(m_doIndent == true && m_isprevtext == false)
{
- m_writer.flush();
+ outputLineSep();
}
- catch(...)
- {
- throw SAXException();
- }
+
+ flush();
+ flushWriter();
}
@@ -252,43 +686,38 @@
const XMLCh* const name,
AttributeList& attrs)
{
- try
+ if(m_inEntityRef == false)
{
- if((true == m_needToOutputDocTypeDecl) && (! isEmpty(m_doctypeSystem)))
+ if(true == m_needToOutputDocTypeDecl &&
+ isEmpty(m_doctypeSystem) == false)
{
- m_writer.write(XALAN_STATIC_UCODE_STRING("<!DOCTYPE "));
- m_writer.write(name);
- if(! isEmpty(m_doctypePublic))
- {
- m_writer.write(XALAN_STATIC_UCODE_STRING(" PUBLIC \""));
- m_writer.write(m_doctypePublic);
- m_writer.write(XALAN_STATIC_UCODE_STRING("\""));
- }
- if(isEmpty(m_doctypePublic))
- m_writer.write(XALAN_STATIC_UCODE_STRING(" SYSTEM \""));
- else
- m_writer.write(XALAN_STATIC_UCODE_STRING(" \""));
- m_writer.write(m_doctypeSystem);
- m_writer.write(XALAN_STATIC_UCODE_STRING("\">"));
- m_writer.write(m_lineSep);
+ outputDocTypeDecl(name);
+
+ m_needToOutputDocTypeDecl = false;
}
- m_needToOutputDocTypeDecl = false;
+
writeParentTagEnd();
+
m_ispreserve = false;
- if (shouldIndent() && m_startNewLine)
+
+ if (shouldIndent() == true &&
+ m_startNewLine == true)
{
- indent(m_writer, m_currentIndent);
+ indent(m_currentIndent);
}
+
m_startNewLine = true;
+
+ accum('<');
+ accum(name);
- m_writer.write('<');
- m_writer.write(name);
+ const unsigned int nAttrs = attrs.getLength();
- int nAttrs = attrs.getLength();
- for (int i = 0; i < nAttrs ; i++)
+ for (unsigned int i = 0; i < nAttrs ; i++)
{
processAttribute(attrs.getName(i), attrs.getValue(i));
}
+
// Flag the current element as not yet having any children.
openElementForChildren();
@@ -296,11 +725,6 @@
m_isprevtext = false;
}
- // java: catch(IOException ioe)
- catch(...)
- {
- throw SAXException("IO error");
- }
}
@@ -308,45 +732,91 @@
void
FormatterToXML::endElement(const XMLCh* const name)
{
- try
+ m_currentIndent -= m_indent;
+
+ const bool hasChildNodes = childNodesWereAdded();
+
+ if (hasChildNodes == true)
{
- m_currentIndent -= m_indent;
+ if (shouldIndent() == true)
+ {
+ indent(m_currentIndent);
+ }
+
+ accum('<');
+ accum('/');
+ accum(name);
+ }
+ else
+ {
+ if(m_spaceBeforeClose == true)
+ {
+ accum(' ');
+ }
+
+ accum('/');
+ }
- const bool hasChildNodes = childNodesWereAdded();
+ accum('>');
- if (hasChildNodes == true)
+ if (hasChildNodes == true)
+ {
+ if (m_preserves.size() == 0)
{
- if (shouldIndent() == true)
- indent(m_writer, m_currentIndent);
- m_writer.write(XALAN_STATIC_UCODE_STRING("</"));
- m_writer.write(name);
- m_writer.write(XALAN_STATIC_UCODE_STRING(">"));
+ m_ispreserve = false;
}
else
{
- if(m_spaceBeforeClose)
- m_writer.write(XALAN_STATIC_UCODE_STRING(" />"));
- else
- m_writer.write(XALAN_STATIC_UCODE_STRING("/>"));
+ m_ispreserve = m_preserves.top();
+
+ m_preserves.pop();
}
+ }
- if (hasChildNodes == true)
+ m_isprevtext = false;
+}
+
+
+
+void
+FormatterToXML::processingInstruction(
+ const XMLCh* const target,
+ const XMLCh* const data)
+{
+ if(m_inEntityRef == false)
+ {
+ // Use a fairly nasty hack to tell if the next node is supposed to be
+ // unescaped text.
+ if(equals(target, c_wstr(s_xsltNextIsRawString)) == true
+ && equals(data, c_wstr(s_formatterToDOMString)) == true)
+ {
+ m_nextIsRaw = true;
+ }
+ else
{
- if (m_preserves.size() == 0)
+ writeParentTagEnd();
+
+ if (shouldIndent() == true)
{
- m_ispreserve = false;
+ indent(m_currentIndent);
}
- else
+
+ accum('<');
+ accum('?');
+ accum(target);
+
+ if (length(data) > 0 && !isSpace(data[0]))
{
- m_ispreserve = m_preserves.top();
- m_preserves.pop();
+ accum(' ');
}
+
+ accum(data);
+
+ accum('?');
+ accum('>');
+
+ m_startNewLine = true;
}
- m_isprevtext = false;
- }
- catch(...)
- {
- throw SAXException();
}
}
@@ -357,223 +827,222 @@
const XMLCh* const chars,
const unsigned int length)
{
- if(0 == length)
- return;
-
- if(m_nextIsRaw)
+ if(m_inEntityRef == false && length != 0)
{
- m_nextIsRaw = false;
- charactersRaw (chars, length);
- return;
- }
-
- try
- {
- writeParentTagEnd();
- m_ispreserve = true;
- int pos = 0;
- int end = length;
- for (int i = 0; i < end; i ++)
+ if(m_inCData == true)
{
- const XMLCh ch = chars[i];
- const int chNum = ch;
- if ('\n' == ch)
- {
- m_charBuf[pos++] = m_lineSep;
- }
- else if ('<' == ch)
- {
- pos = copyEntityIntoBuf(XALAN_STATIC_UCODE_STRING("lt"), pos);
- }
- else if ('>' == ch)
- {
- pos = copyEntityIntoBuf(XALAN_STATIC_UCODE_STRING("gt"), pos);
- }
- else if ('&' == ch)
- {
- pos = copyEntityIntoBuf(XALAN_STATIC_UCODE_STRING("amp"), pos);
- }
- // Regular old ASCII character
- else if((((chNum >= 20) && (chNum <= 126))
- || (chNum == 10)
- || (chNum == 13)
- || (chNum == 9)))
- {
- // System.out.println("ch: "+ch);
- m_charBuf[pos++] = ch;
- }
- else if((chNum >= 20) && (ch <= m_maxCharacter))
- {
- // System.out.println("ch(2): "+ch);
- // Hope this is right...
- m_charBuf[pos++] = ch;
- }
- else
+ cdata(chars, length);
+ }
+ else if(m_nextIsRaw)
+ {
+ m_nextIsRaw = false;
+
+ charactersRaw(chars, length);
+ }
+ else
+ {
+ writeParentTagEnd();
+
+ m_ispreserve = true;
+
+ for (unsigned int i = 0; i < length; ++i)
{
- copyBigCharIntoBuf(chars, i, pos, length);
+ const XalanDOMChar ch = chars[i];
+
+ if(ch < SPECIALSSIZE && m_charsMap[ch] != 'S')
+ {
+ accum(ch);
+ }
+ else
+ {
+ accumDefaultEscape(ch, i, chars, length, false);
+ }
}
- // Use 80 as a best guess safe buffer
- if(pos > MAXSAFECHARBUF)
+
+ if (m_isprevtext == false)
{
- m_writer.write(m_charBuf, 0, pos);
- pos = 0;
+ m_isprevtext = true;
}
}
-
- // System.out.println(new String(m_charBuf, 0, pos));
- m_writer.write(m_charBuf, 0, pos);
- m_isprevtext = true;
- }
- // java: catch(IOException ioe)
- catch(...)
- {
- throw SAXException("IO error");
}
-
}
+
+
void
FormatterToXML::charactersRaw(
const XMLCh* const chars,
const unsigned int length)
{
- try
+ if(m_inEntityRef == false)
{
writeParentTagEnd();
+
m_ispreserve = true;
- m_writer.write(chars, 0, length);
- m_writer.flush();
- }
- // java: catch(IOException ioe)
- catch(...)
- {
- throw SAXException();
+
+ accum(chars, 0, length);
}
}
-void FormatterToXML::copyBigCharIntoBuf(
- const XMLCh* const chars, // Character string to process
- int& i, // Index into 'chars'
- int& pos, // Index in m_charBuf
- int length, // Length of 'chars' string
- XalanDOMChar* theBuffer /* m_charBuf */ // Buffer to write to
- )
-/*
- * Processes a non-ASCII character either in hexadecimal format (&#Xnnn;) if
- * the character is in the range 0xd800 to 0xdc00 or decimal format (&#nnn;),
- * and places the result in member 'm_charBuf.' Side effect, indices 'i' and
- * 'pos' are incremented. On exit, 'theBuffer' will contain a null terminated
- * Unicode string.
- */
+
+
+void
+FormatterToXML::writeAttrString(
+ const XalanDOMChar* string,
+ const XalanDOMString& /* encoding */)
{
- XalanDOMString msg(XALAN_STATIC_UCODE_STRING("Invalid UTF-16 surrogate detected: "));
- XalanDOMString ds;
+ const unsigned int len = length(string);
- const int c = chars[i];
+ for (unsigned int i = 0; i < len; i ++)
+ {
+ const XalanDOMChar ch = string[i];
- if (0xd800 <= c && c < 0xdc00)
- {
- // UTF-16 surrogate
- int next;
- if (i+1 >= length)
- {
- msg = append(msg, LongToHexDOMString(c));
- msg = append(msg, XALAN_STATIC_UCODE_STRING(" ?"));
- throw SAXException(c_wstr(msg));
- }
- else
+ if(ch < SPECIALSSIZE &&
+ m_attrCharsMap[ch] != 'S')
{
- next = chars[++i];
- if (!(0xdc00 <= next && next < 0xe000))
- {
- msg = append(msg, LongToHexDOMString(c));
- msg = append(msg, XALAN_STATIC_UCODE_STRING(" "));
- msg = append(msg, LongToHexDOMString(next));
- throw SAXException(c_wstr(msg));
- }
- next = ((c-0xd800)<<10)+next-0xdc00+0x00010000;
- }
- theBuffer[pos++] = '&';
- theBuffer[pos++] = '#';
- theBuffer[pos++] = 'x';
- ds = LongToHexDOMString(next);
- const XalanDOMChar* pb = c_wstr(ds);
- int nIntStr = ds.length();
- for(int k = 0; k < nIntStr; k++)
- {
- theBuffer[pos++] = *(pb+k);
+ accum(ch);
}
- theBuffer[pos++] = ';';
- }
- else
- {
- theBuffer[pos++] = '&';
- theBuffer[pos++] = '#';
- ds = LongToDOMString(c);
- const XalanDOMChar* pb = c_wstr(ds);
- int nIntStr = ds.length();
- for(int k = 0; k < nIntStr; k++)
+ else
{
- theBuffer[pos++] = *(pb+k);
+ accumDefaultEscape(ch, i, string, len, true);
}
- theBuffer[pos++] = ';';
- }
- theBuffer[pos] = 0; // null terminate
+ }
}
-void FormatterToXML::writeBigChar(const XalanDOMChar* const ch, int& i, int end)
-/*
- * Writes a non-ASCII character either in hexadecimal format (&#Xnnn;) if the
- * character is in the range 0xd800 to 0xdc00 or decimal format (&#nnn;); as a
- * side effect the current character index (i) is incremented
- */
-{
- XalanDOMChar buffer[32]; // Should be big enough
- int pos = 0;
- copyBigCharIntoBuf(ch, i, pos, end, buffer);
- m_writer.write(buffer);
-}
+
-void FormatterToXML::writeNormalizedChars(
- const XalanDOMChar* const ch,
- int start, int length,
- bool isCData)
+void
+FormatterToXML::writeNormalizedChars(
+ const XalanDOMChar ch[],
+ unsigned int start,
+ unsigned int length,
+ bool isCData)
{
- int end = start+length;
- for(int i = start; i < end; i++)
- {
- XalanDOMChar c = ch[i];
- if('\n' == c)
+ unsigned int end = start + length;
+
+ for(unsigned int i = start; i < end; i++)
+ {
+ const XalanDOMChar c = ch[i];
+
+ if (0x0D == c &&
+ i + 1 < end &&
+ 0x0A == ch[i + 1])
+ {
+ outputLineSep();
+
+ i++;
+ }
+ else if (0x0A == c &&
+ i + 1 < end &&
+ 0x0D == ch[i + 1])
+ {
+ outputLineSep();
+
+ i++;
+ }
+ else if('\n' == c)
{
- m_writer.write(m_lineSep);
+ outputLineSep();
}
- else if(isCData && (c > m_maxCharacter))
+ else if(isCData == true && c > m_maxCharacter)
{
if(i != 0)
- m_writer.write(XALAN_STATIC_UCODE_STRING("]]>"));
- writeBigChar(ch, i, end);
- // @@ JMD: this differs from java
- // java: if((i != 0) && (i < (end-1)))
- if( (i < (end-1)))
- m_writer.write(XALAN_STATIC_UCODE_STRING("<![CDATA["));
+ {
+ accum(XALAN_STATIC_UCODE_STRING("]]>"));
+ }
+
+ // This needs to go into a function...
+ if (0xd800 <= ((int)c) && ((int)c) < 0xdc00)
+ {
+ // UTF-16 surrogate
+ unsigned int next = 0;
+
+ if (i + 1 >= end)
+ {
+ throwInvalidUTF16SurrogateException(c);
+ }
+ else
+ {
+ next = ch[++i];
+
+ if (!(0xdc00 <= next && next < 0xe000))
+ {
+ throwInvalidUTF16SurrogateException(c, next);
+ }
+
+ next = ((c-0xd800) << 10) + next - 0xdc00 + 0x00010000;
+ }
+
+ writeNumberedEntityReference(next);
+ }
+ else
+ {
+ writeNumberedEntityReference(c);
+ }
+
+ if(i != 0 && i < end - 1)
+ {
+ accum(XALAN_STATIC_UCODE_STRING("<![CDATA["));
+ }
}
- else if(isCData && ((i < (end-2)) && (']' == c) &&
- (']' == ch[i+1]) && ('>' == ch[i+2])))
+ else if(isCData == true &&
+ i < end - 2 &&
+ ']' == c &&
+ ']' == ch[i + 1] &&
+ '>' == ch[ i + 2])
{
- m_writer.write(XALAN_STATIC_UCODE_STRING("]]]]><![CDATA[>"));
- i+=2;
+ accum(XALAN_STATIC_UCODE_STRING("]]]]><![CDATA[>"));
+
+ i += 2;
}
else
{
if(c <= m_maxCharacter)
+ {
+ accum(c);
+ }
+ // This needs to go into a function...
+ else if (0xd800 <= c && c < 0xdc00)
{
- m_writer.write(c);
+ // UTF-16 surrogate
+ unsigned int next = 0;
+
+ if (i + 1 >= end)
+ {
+ throwInvalidUTF16SurrogateException(c);
+ }
+ else
+ {
+ next = ch[++i];
+
+ if (!(0xdc00 <= next && next < 0xe000))
+ {
+ throwInvalidUTF16SurrogateException(c, next);
+ }
+
+ next = ((c - 0xd800) << 10) + next - 0xdc00 + 0x00010000;
+ }
+
+ writeNumberedEntityReference(next);
}
else
- writeBigChar(ch, i, end);
+ {
+ writeNumberedEntityReference(c);
+ }
}
- }
+ }
+}
+
+
+
+void
+FormatterToXML::writeNumberedEntityReference(unsigned long theNumber)
+{
+ accum('&');
+ accum('#');
+ accum(UnsignedLongToDOMString(theNumber));
+ accum(';');
}
@@ -581,23 +1050,16 @@
void
FormatterToXML::entityReference(const XMLCh* const name)
{
- try
- {
- writeParentTagEnd();
+ writeParentTagEnd();
- if (shouldIndent() == true)
- {
- indent(m_writer, m_currentIndent);
- }
-
- m_writer.write(XALAN_STATIC_UCODE_STRING("&"));
- m_writer.write(name);
- m_writer.write(XALAN_STATIC_UCODE_STRING(";"));
- }
- catch(...)
+ if (shouldIndent() == true)
{
- throw SAXException();
+ indent(m_currentIndent);
}
+
+ m_writer.write('&');
+ m_writer.write(name);
+ m_writer.write(';');
}
@@ -606,66 +1068,10 @@
FormatterToXML::ignorableWhitespace(
const XMLCh* const chars,
const unsigned int length)
-{
- characters(chars, length);
-}
-
-void
-FormatterToXML::processingInstruction(
- const XMLCh* const target,
- const XMLCh* const data)
-{
- processingInstruction( target, data, false);
-}
-
-void
-FormatterToXML::processingInstruction(
- const XMLCh* const target,
- const XMLCh* const data,
- bool isHTML)
{
-// @@ Need to add this --
-// if(m_inEntityRef)
-// return;
-
- // Use a fairly nasty hack to tell if the next node is supposed to be
- // unescaped text.
- if(equals(target, XALAN_STATIC_UCODE_STRING("xslt-next-is-raw"))
- && equals(data, XALAN_STATIC_UCODE_STRING("formatter-to-dom")))
- {
- m_nextIsRaw = true;
- }
- else
+ if (length > 0)
{
- try
- {
- writeParentTagEnd();
-
- if (shouldIndent() == true)
- {
- indent(m_writer, m_currentIndent);
- }
-
- m_writer.write(XALAN_STATIC_UCODE_STRING("<?"));
- m_writer.write(target);
-
- if (length(data) > 0 && !isSpace(data[0]))
- {
- m_writer.write(XALAN_STATIC_UCODE_STRING(" "));
- }
-
- m_writer.write(data);
- if (isHTML)
- m_writer.write(XALAN_STATIC_UCODE_STRING(">"));
- else
- m_writer.write(XALAN_STATIC_UCODE_STRING("?>"));
-
- m_startNewLine = true;
- }
- catch(...)
- {
- throw SAXException();
- }
+ characters(chars, length);
}
}
@@ -682,25 +1088,28 @@
void
FormatterToXML::comment(const XMLCh* const data)
{
- try
+ if(m_inEntityRef == false)
{
writeParentTagEnd();
if (shouldIndent() == true)
{
- indent(m_writer, m_currentIndent);
+ indent(m_currentIndent);
}
- m_writer.write(XALAN_STATIC_UCODE_STRING("<!--"));
- m_writer.write(data);
- m_writer.write(XALAN_STATIC_UCODE_STRING("-->"));
+ accum('<');
+ accum('!');
+ accum('-');
+ accum('-');
+ accum(data);
+
+ accum('-');
+ accum('-');
+ accum('>');
+
m_startNewLine = true;
}
- catch(...)
- {
- throw SAXException();
- }
}
@@ -708,17 +1117,16 @@
void
FormatterToXML::cdata(
const XMLCh* const ch,
- const unsigned int length)
+ const unsigned int length)
{
+ if(m_nextIsRaw == true)
+ {
+ m_nextIsRaw = false;
- try
+ charactersRaw(ch, length);
+ }
+ else
{
- if(m_nextIsRaw)
- {
- m_nextIsRaw = false;
- charactersRaw (ch, length);
- return;
- }
if(m_escapeCData) // Should normally always be false.
{
characters(ch, length);
@@ -726,32 +1134,37 @@
else
{
writeParentTagEnd();
+
m_ispreserve = true;
- if (shouldIndent())
- indent(m_writer, m_currentIndent);
- if(!m_stripCData)
+
+ if (shouldIndent() == true)
{
- if(((length >= 1) && (ch[0] <= m_maxCharacter)))
+ indent(m_currentIndent);
+ }
+
+ if(m_stripCData == false)
+ {
+ if(length >= 1 &&
+ ch[0] <= m_maxCharacter)
{
- m_writer.write(XALAN_STATIC_UCODE_STRING("<![CDATA["));
+ accum(XALAN_STATIC_UCODE_STRING("<![CDATA["));
}
}
- // m_writer.write(ch, 0, length);
+
writeNormalizedChars(ch, 0, length, !m_stripCData);
- if(!m_stripCData)
+
+ if(m_stripCData == false)
{
- if(((length >= 1) && (ch[(length)-1] <= m_maxCharacter)))
+ if(length >= 1 &&
+ ch[length - 1] <= m_maxCharacter)
{
- m_writer.write(XALAN_STATIC_UCODE_STRING("]]>"));
+ accum(']');
+ accum(']');
+ accum('>');
}
}
}
}
- // java: catch(IOException ioe)
- catch(...)
- {
- throw SAXException("IO error");
- }
}
@@ -759,31 +1172,24 @@
void
FormatterToXML::writeParentTagEnd()
{
- try
+ if(!m_elemStack.empty())
{
- if(!m_elemStack.empty())
+ // See if the parent element has already been flagged as having children.
+ if(false == m_elemStack.top())
{
- // See if the parent element has already been flagged as having children.
- if(false == m_elemStack.top())
- {
- m_writer.write(XALAN_STATIC_UCODE_STRING(">"));
- m_isprevtext = false;
+ accum('>');
+ m_isprevtext = false;
- m_elemStack.pop();
- m_elemStack.push(true);
+ m_elemStack.pop();
+ m_elemStack.push(true);
- m_preserves.push(m_ispreserve);
- }
+ m_preserves.push(m_ispreserve);
}
}
- catch(...)
- {
- throw SAXException();
- }
}
-
+
void
FormatterToXML::openElementForChildren()
{
@@ -811,248 +1217,38 @@
void
FormatterToXML::processAttribute(
- const XalanDOMChar* name,
- const XalanDOMChar* value)
-{
- try
- {
- m_writer.write(XALAN_STATIC_UCODE_STRING(" "));
- m_writer.write(name);
- m_writer.write(XALAN_STATIC_UCODE_STRING("=\""));
- m_writer.write(prepAttrString(value, m_attrSpecialChars, m_encoding));
- m_writer.write(XALAN_STATIC_UCODE_STRING("\""));
- }
- catch(...)
- {
- throw SAXException();
- }
-}
-
-
-
-XalanDOMString
-FormatterToXML::prepAttrString(
- const XalanDOMChar* string,
- const XalanDOMString& specials,
- const XalanDOMString& /* encoding */)
-{
- const unsigned int theLength = length(string);
- const unsigned int theSpecialsLength = length(specials);
-
- // we'll do the work into a buffer pre-allocated to
- // twice the size of the original string, giving some
- // room to grow without reallocating.
- //
- // Whem XalanDOMString has gets a better += operator
- // for XalanDOMChar and XalanDOMChar*, a more straightforward
- // solution will give good performance
-#if !defined(XALAN_NO_NAMESPACES)
- using std::vector;
-#endif
-
- vector<XalanDOMChar> vec;
-
- vec.reserve(theLength * 2);
-
- for (unsigned int i = 0; i < theLength; i ++)
- {
- const XalanDOMChar ch = charAt(string, i);
-
- const int chNum = ch;
-
- const unsigned int index = indexOf(specials, ch);
-
- if (index < theSpecialsLength)
- {
- vec.push_back('&');
- vec.push_back('#');
- const DOMString ds = LongToDOMString(ch);
- const unsigned int dsLen = length(ds);
- const XMLCh* pb = c_wstr(ds);
- for(unsigned int k = 0; k < dsLen; k++)
- vec.push_back(*pb++);
- vec.push_back(';');
- }
- else if (0xd800 <= chNum && chNum < 0xdc00)
- {
- // UTF-16 surrogate
- int next = 0;
-
- if (i + 1 >= theLength)
- {
- throw SAXException();
-
- // $$$ ToDo: Fix this!!!
-// throw new SAXException("Invalid UTF-16 surrogate detected: "
-// +Integer.toHexString(ch)+ " ?");
- }
- else
- {
- next = charAt(string, ++i);
-
- if (!(0xdc00 <= next && next < 0xe000))
- {
- throw SAXException();
-
- // $$$ ToDo: Fix this!!!
-// throw new SAXException("Invalid UTF-16 surrogate detected: "
-// +Integer.toHexString(ch)+" "+Integer.toHexString(next));
- }
-
- next = ((ch-0xd800)<<10) + next - 0xdc00 + 0x00010000;
- }
-
- vec.push_back('&');
- vec.push_back('#');
- vec.push_back('x');
-
- const XalanDOMString num = LongToHexDOMString(next);
- const unsigned int numLength = length(num);
-
- for (unsigned int k=0; k < numLength; k++)
- vec.push_back(charAt(num, k));
-
- vec.push_back(';');
- }
-/*
- else if (null != ctbc && !ctbc.canConvert(ch))
- {
- sb.append("&#x");
- sb.append(Integer.toString((int)ch, 16));
- sb.append(";");
- }
-*/
- else
- {
- vec.push_back(ch);
- }
- }
-
- vec.push_back(0);
-
- if (vec.size() == 1)
- {
- // Uh oh, we have to fake out XalanDOMString and
- // give it an extra null...
- vec.push_back(0);
- }
-
- return XalanDOMString(vec.begin(), vec.size() - 1);
-}
-
-
-
-bool
-FormatterToXML::shouldIndent() const
+ const XalanDOMChar* name,
+ const XalanDOMChar* value)
{
- return m_doIndent && (!m_ispreserve && !m_isprevtext);
+ accum(' ');
+ accum(name);
+ accum('=');
+ accum('"');
+ writeAttrString(value, m_encoding);
+ accum('"');
}
void
-FormatterToXML::printSpace(
- Writer& pw,
- int n)
+FormatterToXML::indent(int n)
{
- try
+ if(m_startNewLine == true)
{
- for (int i = 0; i < n; i++)
- {
- pw.write(' ');
- }
+ outputLineSep();
}
- catch(...)
+
+ if(m_doIndent == true)
{
- throw SAXException();
+ printSpace(n);
}
}
-
-void
-FormatterToXML::indent(
- Writer& pw,
- int n)
-{
- try
- {
- if(m_startNewLine == true)
- {
- pw.write('\n');
- }
- if(m_doIndent == true)
- {
- printSpace(pw, n);
- }
- }
- catch(...)
- {
- throw SAXException();
- }
-}
+#if 0
-int FormatterToXML::copyEntityIntoBuf(
- const XalanDOMString& s,
- int pos)
-{
- const unsigned int l = length(s);
- m_charBuf[pos++] = '&';
- for(unsigned int i = 0; i < l; i++)
- {
- m_charBuf[pos++] = charAt(s, i);
- }
- m_charBuf[pos++] = ';';
- return pos;
-}
-int FormatterToXML::copyUTF16IntoBuf(
- const XalanDOMChar* const chars, // Character string to process
- int& i, // Index into 'chars'
- int& pos, // Index in m_charBuf
- int length // Length of 'chars' string
- )
-/*
- * Processes a UTF-16 surrogate character sequence, and places the result in
- * member 'm_charBuf.' Side effect, indices 'i' and 'pos' are incremented.
- * Method consumes two characters from the input buffer
- */
-{
- XalanDOMString msg(XALAN_STATIC_UCODE_STRING("Invalid UTF-16 surrogate detected: "));
- // UTF-16 surrogate
- int next;
- const int ch = chars[i];
- if (i+1 >= length)
- {
- msg = append(msg, LongToHexDOMString(ch));
- throw SAXException(c_wstr(msg));
- }
- else
- {
- next = chars[++i];
- if (!(0xdc00 <= next && next < 0xe000))
- {
- msg = append(msg, LongToHexDOMString(ch));
- msg = append(msg, XALAN_STATIC_UCODE_STRING(" "));
- msg = append(msg, LongToHexDOMString(next));
- throw SAXException(c_wstr(msg));
- }
- next = ((ch-0xd800)<<10)+next-0xdc00+0x00010000;
- }
- m_charBuf[pos++] = '&';
- m_charBuf[pos++] = '#';
- XalanDOMString ds;
- ds = LongToDOMString(ch);
- const XalanDOMChar* pb = c_wstr(ds);
- int nIntStr = ds.length();
- for(int k = 0; k < nIntStr; k++)
- {
- m_charBuf[pos++] = pb[k];
- }
- m_charBuf[pos++] = ';';
- return pos;
-}
FormatterToXML::DOMStringMapType FormatterToXML::s_enchash;
FormatterToXML::DOMStringMapType FormatterToXML::s_revhash;
@@ -1111,7 +1307,7 @@
unsigned int dashindex = (encoding != null ? encoding.indexOf('-') : -1);
if(3 == dashindex)
{
- String ISOprefix = new String(encoding.toCharArray(), 0, 3);
+ String ISOprefix = new String(encoding.toCharArray(), 0, 3);
if (ISOprefix.equals("ISO") == true)
javaEncodingIsISO = true;
}
@@ -1128,54 +1324,54 @@
// Make a table to maximum character sizes before we
// need to resort to escaping in the XML.
// TODO: To tell the truth, I'm guessing a bit here.
- // s_revsize.insert(make_pair("CP1252", 0xFF)); // Windows Latin-1
- s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("WINDOWS-1250")), 0xFF)); // Windows 1250 Peter Smolik
- s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("UTF-8")), 0xFFFF)); // Universal Transformation Format 8
- s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("US-ASCII")), 0x7F));
- s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-1")), 0xFF));
- s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-2")), 0xFF));
- s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-3")), 0xFF));
- s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-4")), 0xFF));
- s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-5")), 0xFF));
- s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-6")), 0xFF));
- s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-7")), 0xFF));
- s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-8")), 0xFF));
- s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-9")), 0xFF));
- s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-2022-JP")), 0xFFFF));
- s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("SHIFT_JIS")), 0xFFFF));
- s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EUC-JP")), 0xFFFF));
- s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("GB2312")), 0xFFFF));
- s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("BIG5")), 0xFFFF));
- s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EUC-KR")), 0xFFFF));
- s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-2022-KR")), 0xFFFF));
- s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("KOI8-R")), 0xFFFF));
- s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-US")), 0xFF));
- s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-CA")), 0xFF));
- s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-NL")), 0xFF));
- s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-DK")), 0xFF));
- s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-NO")), 0xFF));
- s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-FI")), 0xFF));
- s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-SE")), 0xFF));
- s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-IT")), 0xFF));
- s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-ES")), 0xFF));
- s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-GB")), 0xFF));
- s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-FR")), 0xFF));
- s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-AR1")), 0xFF));
- s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-HE")), 0xFF));
- s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-CH")), 0xFF));
+ // s_revsize.insert(make_pair("CP1252", 0xFF)); // Windows Latin-1
+ s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("WINDOWS-1250")), 0xFF)); // Windows 1250 Peter Smolik
+ s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("UTF-8")), 0xFFFF)); // Universal Transformation Format 8
+ s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("US-ASCII")), 0x7F));
+ s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-1")), 0xFF));
+ s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-2")), 0xFF));
+ s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-3")), 0xFF));
+ s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-4")), 0xFF));
+ s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-5")), 0xFF));
+ s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-6")), 0xFF));
+ s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-7")), 0xFF));
+ s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-8")), 0xFF));
+ s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-9")), 0xFF));
+ s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-2022-JP")), 0xFFFF));
+ s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("SHIFT_JIS")), 0xFFFF));
+ s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EUC-JP")), 0xFFFF));
+ s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("GB2312")), 0xFFFF));
+ s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("BIG5")), 0xFFFF));
+ s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EUC-KR")), 0xFFFF));
+ s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-2022-KR")), 0xFFFF));
+ s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("KOI8-R")), 0xFFFF));
+ s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-US")), 0xFF));
+ s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-CA")), 0xFF));
+ s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-NL")), 0xFF));
+ s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-DK")), 0xFF));
+ s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-NO")), 0xFF));
+ s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-FI")), 0xFF));
+ s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-SE")), 0xFF));
+ s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-IT")), 0xFF));
+ s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-ES")), 0xFF));
+ s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-GB")), 0xFF));
+ s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-FR")), 0xFF));
+ s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-AR1")), 0xFF));
+ s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-HE")), 0xFF));
+ s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-CH")), 0xFF));
s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-ROECE")), 0xFF));
- s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-YU")), 0xFF));
- s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-IS")), 0xFF));
- s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-AR2")), 0xFF));
+ s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-YU")), 0xFF));
+ s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-IS")), 0xFF));
+ s_revsize.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-AR2")), 0xFF));
- // <preferred MIME name>, <Java encoding name>
+ // <preferred MIME name>, <Java encoding name>
// s_enchash.insert(make_pair("ISO 8859-1", "CP1252")); // Close enough, I guess
s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("WINDOWS-1250")), XalanDOMString(XALAN_STATIC_UCODE_STRING("CP1250")))); // Peter Smolik
s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("UTF-8")), XalanDOMString(XALAN_STATIC_UCODE_STRING("UTF8"))));
if(useISOPrefix)
{
s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("US-ASCII")),
- XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO8859_1")))); // ?
+ XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO8859_1")))); // ?
s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-1")),
XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO8859_1"))));
s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-2")),
@@ -1198,7 +1394,7 @@
else
{
s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("US-ASCII")),
- XalanDOMString(XALAN_STATIC_UCODE_STRING("8859_1")))); // ?
+ XalanDOMString(XALAN_STATIC_UCODE_STRING("8859_1")))); // ?
s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-1")),
XalanDOMString(XALAN_STATIC_UCODE_STRING("8859_1"))));
s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-2")),
@@ -1218,41 +1414,41 @@
s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-9")),
XalanDOMString(XALAN_STATIC_UCODE_STRING("8859_9"))));
}
- s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-2022-JP")), XalanDOMString(XALAN_STATIC_UCODE_STRING("JIS"))));
- s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("SHIFT_JIS")), XalanDOMString(XALAN_STATIC_UCODE_STRING("SJIS"))));
- s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EUC-JP")), XalanDOMString(XALAN_STATIC_UCODE_STRING("EUCJIS"))));
- s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("GB2312")), XalanDOMString(XALAN_STATIC_UCODE_STRING("GB2312"))));
- s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("BIG5")), XalanDOMString(XALAN_STATIC_UCODE_STRING("Big5"))));
- s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EUC-KR")), XalanDOMString(XALAN_STATIC_UCODE_STRING("KSC5601"))));
- s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-2022-KR")), XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO2022KR"))));
- s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("KOI8-R")), XalanDOMString(XALAN_STATIC_UCODE_STRING("KOI8_R"))));
- s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-US")), XalanDOMString(XALAN_STATIC_UCODE_STRING("CP037"))));
- s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-CA")), XalanDOMString(XALAN_STATIC_UCODE_STRING("CP037"))));
- s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-NL")), XalanDOMString(XALAN_STATIC_UCODE_STRING("CP037"))));
- s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-DK")), XalanDOMString(XALAN_STATIC_UCODE_STRING("CP277"))));
- s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-NO")), XalanDOMString(XALAN_STATIC_UCODE_STRING("CP277"))));
- s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-FI")), XalanDOMString(XALAN_STATIC_UCODE_STRING("CP278"))));
- s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-SE")), XalanDOMString(XALAN_STATIC_UCODE_STRING("CP278"))));
- s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-IT")), XalanDOMString(XALAN_STATIC_UCODE_STRING("CP280"))));
- s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-ES")), XalanDOMString(XALAN_STATIC_UCODE_STRING("CP284"))));
- s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-GB")), XalanDOMString(XALAN_STATIC_UCODE_STRING("CP285"))));
- s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-FR")), XalanDOMString(XALAN_STATIC_UCODE_STRING("CP297"))));
- s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-AR1")), XalanDOMString(XALAN_STATIC_UCODE_STRING("CP420"))));
- s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-HE")), XalanDOMString(XALAN_STATIC_UCODE_STRING("CP424"))));
- s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-CH")), XalanDOMString(XALAN_STATIC_UCODE_STRING("CP500"))));
+ s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-2022-JP")), XalanDOMString(XALAN_STATIC_UCODE_STRING("JIS"))));
+ s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("SHIFT_JIS")), XalanDOMString(XALAN_STATIC_UCODE_STRING("SJIS"))));
+ s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EUC-JP")), XalanDOMString(XALAN_STATIC_UCODE_STRING("EUCJIS"))));
+ s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("GB2312")), XalanDOMString(XALAN_STATIC_UCODE_STRING("GB2312"))));
+ s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("BIG5")), XalanDOMString(XALAN_STATIC_UCODE_STRING("Big5"))));
+ s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EUC-KR")), XalanDOMString(XALAN_STATIC_UCODE_STRING("KSC5601"))));
+ s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-2022-KR")), XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO2022KR"))));
+ s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("KOI8-R")), XalanDOMString(XALAN_STATIC_UCODE_STRING("KOI8_R"))));
+ s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-US")), XalanDOMString(XALAN_STATIC_UCODE_STRING("CP037"))));
+ s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-CA")), XalanDOMString(XALAN_STATIC_UCODE_STRING("CP037"))));
+ s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-NL")), XalanDOMString(XALAN_STATIC_UCODE_STRING("CP037"))));
+ s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-DK")), XalanDOMString(XALAN_STATIC_UCODE_STRING("CP277"))));
+ s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-NO")), XalanDOMString(XALAN_STATIC_UCODE_STRING("CP277"))));
+ s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-FI")), XalanDOMString(XALAN_STATIC_UCODE_STRING("CP278"))));
+ s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-SE")), XalanDOMString(XALAN_STATIC_UCODE_STRING("CP278"))));
+ s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-IT")), XalanDOMString(XALAN_STATIC_UCODE_STRING("CP280"))));
+ s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-ES")), XalanDOMString(XALAN_STATIC_UCODE_STRING("CP284"))));
+ s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-GB")), XalanDOMString(XALAN_STATIC_UCODE_STRING("CP285"))));
+ s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-FR")), XalanDOMString(XALAN_STATIC_UCODE_STRING("CP297"))));
+ s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-AR1")), XalanDOMString(XALAN_STATIC_UCODE_STRING("CP420"))));
+ s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-HE")), XalanDOMString(XALAN_STATIC_UCODE_STRING("CP424"))));
+ s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-CH")), XalanDOMString(XALAN_STATIC_UCODE_STRING("CP500"))));
s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-ROECE")), XalanDOMString(XALAN_STATIC_UCODE_STRING("CP870"))));
- s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-YU")), XalanDOMString(XALAN_STATIC_UCODE_STRING("CP870"))));
- s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-IS")), XalanDOMString(XALAN_STATIC_UCODE_STRING("CP871"))));
- s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-AR2")), XalanDOMString(XALAN_STATIC_UCODE_STRING("CP918"))));
+ s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-YU")), XalanDOMString(XALAN_STATIC_UCODE_STRING("CP870"))));
+ s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-IS")), XalanDOMString(XALAN_STATIC_UCODE_STRING("CP871"))));
+ s_enchash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-AR2")), XalanDOMString(XALAN_STATIC_UCODE_STRING("CP918"))));
// j:CNS11643 -> EUC-TW?
// ISO-2022-CN? ISO-2022-CN-EXT?
- // <Java encoding name>, <preferred MIME name>
+ // <Java encoding name>, <preferred MIME name>
s_revhash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("CP1252")), XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-1")))); // Close enough, I guess
s_revhash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("CP1250")), XalanDOMString(XALAN_STATIC_UCODE_STRING("windows-1250")))); // Peter Smolik
s_revhash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("UTF8")), XalanDOMString(XALAN_STATIC_UCODE_STRING("UTF-8"))));
- //s_revhash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO8859_1")), XalanDOMString(XALAN_STATIC_UCODE_STRING("US-ASCII")))); // ?
+ //s_revhash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO8859_1")), XalanDOMString(XALAN_STATIC_UCODE_STRING("US-ASCII")))); // ?
if(useISOPrefix)
{
s_revhash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO8859_1")), XalanDOMString(XALAN_STATIC_UCODE_STRING("ISO-8859-1"))));
@@ -1304,3 +1500,4 @@
s_revhash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("CP871")), XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-IS"))));
s_revhash.insert(make_pair(XalanDOMString(XALAN_STATIC_UCODE_STRING("CP918")), XalanDOMString(XALAN_STATIC_UCODE_STRING("EBCDIC-CP-AR2"))));
}
+#endif
\ No newline at end of file
1.11 +565 -199 xml-xalan/c/src/XMLSupport/FormatterToXML.hpp
Index: FormatterToXML.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XMLSupport/FormatterToXML.hpp,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- FormatterToXML.hpp 2000/05/15 15:52:47 1.10
+++ FormatterToXML.hpp 2000/05/18 18:37:23 1.11
@@ -67,15 +67,15 @@
#include <stack>
#include <vector>
-#include <map>
+//#include <map>
-#include <sax/AttributeList.hpp>
+#include <XalanDOM/XalanDOMString.hpp>
-#include <XalanDOM/XalanDOMString.hpp>
+#include <PlatformSupport/DOMStringHelper.hpp>
@@ -84,6 +84,7 @@
+class AttributeList;
class Writer;
@@ -95,52 +96,7 @@
{
public:
-#if defined(XALAN_NO_NAMESPACES)
-# define XALAN_STD
-#else
-# define XALAN_STD std::
-#endif
- typedef XALAN_STD map<XalanDOMString, XalanDOMString> DOMStringMapType;
- typedef XALAN_STD map<XalanDOMString, int> DOMString2IntMapType;
- typedef XALAN_STD stack<bool> BoolStackType;
-#undef XALAN_STD
-
- /**
- * These are characters that will be escaped in the output.
- */
- XalanDOMString m_attrSpecialChars;
-
- static const XalanDOMString DEFAULT_MIME_ENCODING;
-
- /**
- * If true, cdata sections are simply stripped of their
- * CDATA brackets, without escaping.
- */
- bool m_stripCData;
-
- /**
- * If true, characters in cdata sections are
- * escaped, instead of being writted out as
- * cdata sections.
- */
- bool m_escapeCData;
-
- /**
- * If true, XML header should be written to output.
- */
- bool m_shouldWriteXMLHeader;
-
/**
- * Number of spaces to indent, default is 2.
- */
- int m_indent;
-
- /**
- * Tells the XML version, for writing out to the XML decl.
- */
- XalanDOMString m_version;
-
- /**
* Constructor for customized encoding and doctype.
*
* @param writer character output stream to use
@@ -157,35 +113,25 @@
* declaration
* @param standalone true if the XSLT processor should output a
* standalone document declaration
+ *
+ * @param format should be used only by derived classes.
*/
FormatterToXML(
- Writer& writer,
- const XalanDOMString& version,
- bool doIndent,
- int indent,
- const XalanDOMString& encoding,
- const XalanDOMString& mediaType,
- const XalanDOMString& doctypeSystem,
- const XalanDOMString& doctypePublic,
- bool xmlDecl,
- const XalanDOMString& standalone);
+ Writer& writer,
+ const XalanDOMString& version = XalanDOMString(),
+ bool doIndent = false,
+ int indent = 0,
+ const XalanDOMString& encoding = XalanDOMString(),
+ const XalanDOMString& mediaType = XalanDOMString(),
+ const XalanDOMString& doctypeSystem = XalanDOMString(),
+ const XalanDOMString& doctypePublic = XalanDOMString(),
+ bool xmlDecl = true,
+ const XalanDOMString& standalone = XalanDOMString(),
+ eFormat format = OUTPUT_METHOD_XML);
virtual
~FormatterToXML();
- /**
- * Normalize the characters, but don't escape.
- *
- * @param ch pointer to characters from the XML document
- * @param start starting offset
- * @return length of array
- * @param isCData true if characters are CDATA
- */
- void writeNormalizedChars(
- const XalanDOMChar* ch,
- int start,
- int length,
- bool isCData);
// These methods are inherited from FormatterListener ...
@@ -241,194 +187,440 @@
const XMLCh* const ch,
const unsigned int length);
-protected:
+#if 0
+ /**
+ * Convert a MIME charset name, also known as an XML encoding name, to a Java encoding name.
+ * @param mimeCharsetName Case insensitive MIME charset name: <code>UTF-8, US-ASCII, ISO-8859-1,
+ * ISO-8859-2, ISO-8859-3, ISO-8859-4, ISO-8859-5, ISO-8859-6,
+ * ISO-8859-7, ISO-8859-8, ISO-8859-9, ISO-2022-JP, Shift_JIS,
+ * EUC-JP, GB2312, Big5, EUC-KR, ISO-2022-KR, KOI8-R,
+ * EBCDIC-CP-US, EBCDIC-CP-CA, EBCDIC-CP-NL, EBCDIC-CP-DK,
+ * EBCDIC-CP-NO, EBCDIC-CP-FI, EBCDIC-CP-SE, EBCDIC-CP-IT,
+ * EBCDIC-CP-ES, EBCDIC-CP-GB, EBCDIC-CP-FR, EBCDIC-CP-AR1,
+ * EBCDIC-CP-HE, EBCDIC-CP-CH, EBCDIC-CP-ROECE, EBCDIC-CP-YU,
+ * EBCDIC-CP-IS and EBCDIC-CP-AR2</code>.
+ * @return Java encoding name, or <var>null</var> if <var>mimeCharsetName</var>
+ * is unknown.
+ * @see #reverse
+ */
+
+ static const XalanDOMString
+ convertMime2JavaEncoding(const XalanDOMString& mimeCharsetName);
+
+ static const XalanDOMString
+ convertJava2MimeEncoding(const XalanDOMString& encoding);
+
+#endif
- void FormatterToXML::copyBigCharIntoBuf(
- const XalanDOMChar* chars, // Character string to process
- int& i, // Index into 'chars'
- int& pos, // Index in m_charBuf
- int length, // Length of 'chars' string
- XalanDOMChar* buf = m_charBuf // Buffer to write to
- );
+ const Writer&
+ getWriter() const
+ {
+ return m_writer;
+ }
+
+ Writer&
+ getWriter()
+ {
+ return m_writer;
+ }
+
+ const XalanDOMString&
+ getDoctypeSystem() const
+ {
+ return m_doctypeSystem;
+ }
+
+ const XalanDOMString&
+ getDoctypePublic() const
+ {
+ return m_doctypePublic;
+ }
+
+ const XalanDOMString&
+ getEncoding() const
+ {
+ return m_encoding;
+ }
+
+ const XalanDOMString&
+ getMediaType() const
+ {
+ return m_mediaType;
+ }
+
+ const XalanDOMString&
+ getVersion() const
+ {
+ return m_version;
+ }
+
+ const XalanDOMString&
+ getStandalone() const
+ {
+ return m_standalone;
+ }
+ bool
+ getShouldWriteXMLHeader() const
+ {
+ return m_shouldWriteXMLHeader;
+ }
+
void
- writeBigChar(
- const XalanDOMChar* ch,
- int& i,
- int end);
+ setShouldWriteXMLHeader(bool b)
+ {
+ m_shouldWriteXMLHeader = b;
+ }
+ bool
+ getStripCData() const
+ {
+ return m_stripCData;
+ }
+
void
- writeParentTagEnd();
-
+ setStripCData(bool b)
+ {
+ m_stripCData = b;
+ }
+
+ bool
+ getEscapeCData() const
+ {
+ return m_escapeCData;
+ }
+
void
- openElementForChildren();
+ setEscapeCData(bool b)
+ {
+ m_escapeCData = b;
+ }
bool
- childNodesWereAdded();
+ getDoIndent() const
+ {
+ return m_doIndent;
+ }
+
+ int
+ getIndent() const
+ {
+ return m_indent;
+ }
+protected:
+
+ /**
+ * The writer where the XML will be written.
+ */
+ Writer& m_writer;
+
/**
- * Process an attribute.
- * @param name The name of the attribute.
- * @param value The value of the attribute.
+ * Output a line break.
*/
void
- processAttribute(
- const XalanDOMChar* name,
- const XalanDOMChar* value);
+ outputLineSep()
+ {
+ accum(s_lineSep);
+ }
/**
- * Returns the specified <var>string</var> after substituting <VAR>specials</VAR>,
- * and UTF-16 surrogates for chracter references <CODE>&#xnn</CODE>.
+ * Append a character to the buffer.
*
- * @param string String to convert to XML format.
- * @param specials Chracters, should be represeted in chracter referenfces.
- * @param encoding CURRENTLY NOT IMPLEMENTED.
- * @return XML-formatted string.
- * @see #backReference
+ * @ch the character to append.
*/
- static XalanDOMString
- prepAttrString(
- const XalanDOMChar* string,
- const XalanDOMString& specials,
- const XalanDOMString& encoding);
-
- virtual bool
- shouldIndent() const;
-
+ void
+ accum(char ch);
+
/**
- * Prints <var>n</var> spaces.
- * @param pw The character output stream to use.
- * @param n Number of spaces to print.
- * @exception IOException Thrown if <var>pw</var> is invalid.
+ * Append a wide character to the buffer.
+ *
+ * @ch the character to append.
*/
- static void
- printSpace(
- Writer& pw,
- int n);
+ void
+ accum(XalanDOMChar ch);
+
+ /**
+ * Append an array of wide character to the buffer.
+ *
+ * @chars the array to append
+ * @start the offset into the array to start from
+ * @length the number of characters to append
+ */
+ void
+ accum(
+ const XalanDOMChar chars[],
+ unsigned int start,
+ unsigned int length);
+
+ /**
+ * Append a string to the buffer.
+ *
+ * @param str the string to append
+ */
+ void
+ accum(const XalanDOMString& str);
+
+ /**
+ * Append a vector of wide characters to the buffer.
+ *
+ * @param theVector the vector to append
+ */
+ void
+ accum(const XalanDOMCharVectorType& theVector);
+
+ /**
+ * Escape and accum a character.
+ */
+ void
+ accumDefaultEscape(
+ XalanDOMChar ch,
+ unsigned int i,
+ const XalanDOMChar chars[],
+ unsigned int len,
+ bool escLF);
+
+ /**
+ * Handle one of the default entities, return false if it
+ * is not a default entity.
+ */
+ bool
+ accumDefaultEntity(
+ XalanDOMChar ch,
+ unsigned int i,
+ const XalanDOMChar chars[],
+ unsigned int len,
+ bool escLF);
+
+ /**
+ * Set the attribute characters what will require special mapping.
+ */
+ void
+ initAttrCharsMap();
+
+ /**
+ * Set the output characters what will require special mapping.
+ */
+ void
+ initCharsMap();
+
+ /**
+ * Flush the byte buffer.
+ */
+ void
+ flushBytes();
/**
+ * Flush the char buffer.
+ */
+ void
+ flushChars();
+
+ void
+ flush();
+
+ void
+ flushWriter();
+
+ void
+ openElementForChildren();
+
+ bool
+ childNodesWereAdded();
+
+ bool
+ shouldIndent() const
+ {
+ return m_doIndent && (!m_ispreserve && !m_isprevtext);
+ }
+
+ /**
+ * Check to see if a parent's ">" has been written, and, if
+ * it has not, write it.
+ */
+ void
+ writeParentTagEnd();
+
+ /**
* Prints a newline character and <var>n</var> spaces.
- * @param pw The character output stream to use.
* @param n Number of spaces to print.
- * @exception IOException Thrown if <var>pw</var> is invalid.
*/
void
- indent(
- Writer& pw,
- int n);
- /**
- * Convert a MIME charset name, also known as an XML encoding name, to a Java encoding name.
- * @param mimeCharsetName Case insensitive MIME charset name: <code>UTF-8, US-ASCII, ISO-8859-1,
- * ISO-8859-2, ISO-8859-3, ISO-8859-4, ISO-8859-5, ISO-8859-6,
- * ISO-8859-7, ISO-8859-8, ISO-8859-9, ISO-2022-JP, Shift_JIS,
- * EUC-JP, GB2312, Big5, EUC-KR, ISO-2022-KR, KOI8-R,
- * EBCDIC-CP-US, EBCDIC-CP-CA, EBCDIC-CP-NL, EBCDIC-CP-DK,
- * EBCDIC-CP-NO, EBCDIC-CP-FI, EBCDIC-CP-SE, EBCDIC-CP-IT,
- * EBCDIC-CP-ES, EBCDIC-CP-GB, EBCDIC-CP-FR, EBCDIC-CP-AR1,
- * EBCDIC-CP-HE, EBCDIC-CP-CH, EBCDIC-CP-ROECE, EBCDIC-CP-YU,
- * EBCDIC-CP-IS and EBCDIC-CP-AR2</code>.
- * @return Java encoding name, or <var>null</var> if <var>mimeCharsetName</var>
- * is unknown.
- * @see #reverse
- */
+ indent(int n);
- static const XalanDOMString
- convertMime2JavaEncoding(const XalanDOMString& mimeCharsetName);
+ /**
+ * Write normalized characters to the writer.
+ * @param ch the string to write.
+ * @param start the start offset into the string.
+ * @param length the length of the string.
+ * @param isCData true if writing CDATA.
+ */
+ virtual void
+ writeNormalizedChars(
+ const XalanDOMChar ch[],
+ unsigned int start,
+ unsigned int length,
+ bool isCData);
- static const XalanDOMString
- convertJava2MimeEncoding(const XalanDOMString& encoding);
+ /**
+ * Write a number into the buffer as an entity
+ * reference.
+ * @param theNumber the number to write.
+ */
+ void
+ writeNumberedEntityReference(unsigned long theNumber);
- static void
- initEncodings();
+ /**
+ * Write an attribute string.
+ * @param string The string to write.
+ * @param encoding The current encoding.
+ */
+ virtual void
+ writeAttrString(
+ const XalanDOMChar* string,
+ const XalanDOMString& encoding);
-protected:
+ /**
+ * Throw an exception when an invalid
+ * surrogate is encountered.
+ * @param ch The first character in the surrogate
+ */
+ static void
+ throwInvalidUTF16SurrogateException(XalanDOMChar ch);
- enum { MAXCHARBUF = 4096, MAXSAFECHARBUF = MAXCHARBUF - 256 };
+ /**
+ * Throw an exception when an invalid
+ * surrogate is encountered.
+ * @param ch The first character in the surrogate
+ * @param next The next character in the surrogate
+ */
+ static void
+ throwInvalidUTF16SurrogateException(
+ XalanDOMChar ch,
+ unsigned int next);
- static XalanDOMChar m_charBuf[MAXCHARBUF];
- static XalanDOMChar m_lineSep;
- bool m_needToOutputDocTypeDecl;
- Writer& m_writer;
+ enum eDummy { SPECIALSSIZE = 256};
/**
- * The maximum character value before we have to resort
+ * The maximum character size before we have to resort
* to escaping.
*/
- unsigned int m_maxCharacter;
-
+ XalanDOMChar m_maxCharacter;
+
+ XalanDOMChar m_attrCharsMap[SPECIALSSIZE];
+
+ XalanDOMChar m_charsMap[SPECIALSSIZE];
+
/**
- * The character encoding. Not currently used.
+ * If true, XML header should be written to output.
*/
- XalanDOMString m_encoding;
+ bool m_shouldWriteXMLHeader;
/**
- * Test for standalone part of header.
+ * State flag to tell if preservation of whitespace
+ * is important.
*/
- const XalanDOMString m_standalone;
+ bool m_ispreserve;
/**
- * Tell if the next text should be raw.
+ * Flag to tell if indenting (pretty-printing) is on.
*/
- bool m_nextIsRaw;
+ bool m_doIndent;
- /**
- * A stack of Boolean objects that tell if the given element
- * has children.
- */
- BoolStackType m_elemStack;
+ /**
+ * Flag to signal that a newline should be added.
+ */
+ bool m_startNewLine;
- bool m_ispreserve;
- BoolStackType m_preserves;
+ /**
+ * Flag to tell that we need to add the doctype decl,
+ * which we can't do until the first element is
+ * encountered.
+ */
+ bool m_needToOutputDocTypeDecl;
+
/**
* State flag that tells if the previous node processed
* was text, so we can tell if we should preserve whitespace.
*/
- bool m_isprevtext;
- bool m_doIndent;
- int m_currentIndent;
- int m_level;
- XalanDOMString m_doctypeSystem;
- XalanDOMString m_doctypePublic;
- bool m_startNewLine;
+ bool m_isprevtext;
- /**
- * Assume java encoding names are the same as the ISO encoding names if this is true.
- */
- static bool m_javaEncodingIsISO;
+ /**
+ * If true, cdata sections are simply stripped of their
+ * CDATA brackets, without escaping.
+ */
+ bool m_stripCData;
+
+ /**
+ * Tell if the next text should be raw.
+ */
+ bool m_nextIsRaw;
+
+ /**
+ * Tells if we're in CData section.
+ */
+ bool m_inCData;
/**
* Flag to quickly tell if the encoding is UTF8.
*/
- bool m_isUTF8;
+ bool m_isUTF8;
- /**
- * Add space before '/>' for XHTML.
- */
- bool m_spaceBeforeClose;
+ /**
+ * The System ID for the doc type.
+ */
+ const XalanDOMString m_doctypeSystem;
- static DOMStringMapType s_enchash;
- static DOMStringMapType s_revhash;
+ /**
+ * The public ID for the doc type.
+ */
+ const XalanDOMString m_doctypePublic;
+
+ /**
+ * The character encoding. Not currently used.
+ */
+ const XalanDOMString m_encoding;
- static DOMString2IntMapType s_revsize;
+ /**
+ * Flag to keep track of the indent amount.
+ */
+ int m_currentIndent;
+ /**
+ * Amount to indent.
+ */
+ int m_indent;
+
+ /**
+ * The text "xslt-next-is-raw".
+ */
+ static const XalanDOMCharVectorType s_xsltNextIsRawString;
- int copyEntityIntoBuf(
- const XalanDOMString& s,
- int pos);
-
- int copyUTF16IntoBuf(
- const XalanDOMChar* chars,
- int& i, // Index into 'chars'
- int& pos, // Index in m_charBuf
- int length // Length of 'chars' string
- );
+ /**
+ * The string "formatter-to-dom".
+ */
+ static const XalanDOMCharVectorType s_formatterToDOMString;
- void FormatterToXML::processingInstruction(
- const XMLCh* const target,
- const XMLCh* const data,
- bool isHTML);
+#if defined(XALAN_NO_NAMESPACES)
+// typedef map<XalanDOMString, XalanDOMString> DOMStringMapType;
+// typedef map<XalanDOMString, int> DOMString2IntMapType;
+ typedef stack<bool> BoolStackType;
+ typedef vector<XalanDOMChar> DOMCharBufferType;
+ typedef vector<char> ByteBufferType;
+#else
+// typedef std::map<XalanDOMString, XalanDOMString> DOMStringMapType;
+// typedef std::map<XalanDOMString, int> DOMString2IntMapType;
+ typedef std::stack<bool> BoolStackType;
+ typedef std::vector<XalanDOMChar> DOMCharBufferType;
+ typedef std::vector<char> ByteBufferType;
+#endif
+
+ /**
+ * Stack to keep track of whether or not we need to
+ * preserve whitespace.
+ */
+ BoolStackType m_preserves;
-
private:
// These are not implemented.
@@ -439,6 +631,180 @@
bool
operator==(const FormatterToXML&) const;
+
+ /**
+ * Initialize the static codings table.
+ */
+ static void
+ initEncodings();
+
+ /**
+ * Output the doc type declaration.
+ *
+ * @param name the name of the doctype.
+ */
+ void
+ outputDocTypeDecl(const XalanDOMString& name);
+
+ /**
+ * Process an attribute.
+ * @param name The name of the attribute.
+ * @param value The value of the attribute.
+ */
+ void
+ processAttribute(
+ const XalanDOMChar* name,
+ const XalanDOMChar* value);
+
+ /**
+ * Prints <var>n</var> spaces.
+ * @param n Number of spaces to print.
+ */
+ void
+ printSpace(int n)
+ {
+ for (int i = 0; i < n; i ++)
+ {
+ accum(' ');
+ }
+ }
+
+ // Data members...
+ bool m_shouldFlush;
+ bool m_bytesEqualChars;
+
+ /**
+ * Add space before '/>' for XHTML.
+ */
+ bool m_spaceBeforeClose;
+
+ /**
+ * If true, characters in cdata sections are
+ * escaped, instead of being writted out as
+ * cdata sections.
+ */
+ bool m_escapeCData;
+
+ /**
+ * Tells if we're in an EntityRef event.
+ */
+ bool m_inEntityRef;
+
+ /**
+ * Assume java encoding names are the same as the ISO encoding names if this is true.
+ */
+ static bool s_javaEncodingIsISO;
+
+ /**
+ * Tells the XML version, for writing out to the XML decl.
+ */
+ const XalanDOMString m_version;
+
+ /**
+ * Text for standalone part of header.
+ */
+ const XalanDOMString m_standalone;
+
+ /**
+ * The media type. Not used right now.
+ */
+ const XalanDOMString m_mediaType;
+
+ /**
+ * These are characters that will be escaped in the output.
+ */
+ const XalanDOMString m_attrSpecialChars;
+
+ /**
+ * The default MIME encoding.
+ */
+ static const XalanDOMCharVectorType s_defaultMIMEEncoding;
+
+ /**
+ * The string "<!DOCTYPE ".
+ */
+ static const XalanDOMCharVectorType s_doctypeHeaderStartString;
+
+ /**
+ * The string " PUBLIC \"".
+ */
+ static const XalanDOMCharVectorType s_doctypeHeaderPublicString;
+
+ /**
+ * The string " SYSTEM \"".
+ */
+ static const XalanDOMCharVectorType s_doctypeHeaderSystemString;
+
+ /**
+ * The string "<?xml version=\"".
+ */
+ static const XalanDOMCharVectorType s_xmlHeaderStartString;
+
+ /**
+ * The string "<?xml version=\"".
+ */
+ static const XalanDOMCharVectorType s_xmlHeaderEncodingString;
+
+ /**
+ * The string "\" standalone=\"".
+ */
+ static const XalanDOMCharVectorType s_xmlHeaderStandaloneString;
+
+ /**
+ * The string "\"?>".
+ */
+ static const XalanDOMCharVectorType s_xmlHeaderEndString;
+
+ /**
+ * The string "1.0".
+ */
+ static const XalanDOMCharVectorType s_defaultVersionString;
+
+ /**
+ * The string "WINDOWS-1250".
+ */
+ static const XalanDOMCharVectorType s_windows1250EncodingString;
+
+ /**
+ * The string "US-ASCII".
+ */
+ static const XalanDOMCharVectorType s_usASCIIEncodingString;
+
+ /**
+ * The string "ASCII".
+ */
+ static const XalanDOMCharVectorType s_asciiEncodingString;
+
+ /**
+ * The string "UTF-8".
+ */
+ static const XalanDOMCharVectorType s_utf8EncodingString;
+
+
+ DOMCharBufferType m_charBuf;
+
+ ByteBufferType m_byteBuf;
+
+ ByteBufferType::size_type m_pos;
+
+ static const DOMCharBufferType::size_type s_maxBufferSize;
+
+ /**
+ * Current level of indent.
+ */
+ int m_level;
+
+ /**
+ * A stack of Boolean objects that tell if the given element
+ * has children.
+ */
+ BoolStackType m_elemStack;
+
+ /**
+ * Use the system line seperator to write line breaks. This should
+ * always be '\n'.
+ */
+ static XalanDOMChar s_lineSep;
};
1.6 +14 -24 xml-xalan/c/src/XMLSupport/XMLParserLiaisonDefault.cpp
Index: XMLParserLiaisonDefault.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XMLSupport/XMLParserLiaisonDefault.cpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- XMLParserLiaisonDefault.cpp 2000/04/11 14:43:02 1.5
+++ XMLParserLiaisonDefault.cpp 2000/05/18 18:37:23 1.6
@@ -224,18 +224,17 @@
XALAN_STATIC_UCODE_STRING("http://www.w3.org/TR/REC-html40")) == true)
{
FormatterToHTML* const htmlFormatVisitor =
- new FormatterToHTML(pw,
- XalanDOMString(),
- format,
- m_Indent,
+ new FormatterToHTML(
+ pw,
XalanDOMString(), // encoding
XalanDOMString(), // media type
- // @@ JMD: ??
- // was: "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n",
XalanDOMString(), // doctypeSystem
XalanDOMString(), // doctypePublic
- false, // xmlDecl
- XalanDOMString()); // standalone,
+ format,
+ m_Indent,
+ XalanDOMString(), // version
+ XalanDOMString(), // standalone
+ false); // xmlDecl
#if defined(XALAN_OLD_AUTO_PTR)
@@ -243,8 +242,6 @@
#else
visitor.reset(htmlFormatVisitor);
#endif
-
- htmlFormatVisitor->m_attrSpecialChars = m_SpecialCharacters;
}
else
{
@@ -265,8 +262,6 @@
#else
visitor.reset(fToXML);
#endif
-
- fToXML->m_attrSpecialChars = m_SpecialCharacters;
}
if(visitor.get() != 0)
@@ -289,18 +284,17 @@
XALAN_STATIC_UCODE_STRING("http://www.w3.org/TR/REC-html40")) == true)
{
FormatterToHTML* const htmlFormatVisitor =
- new FormatterToHTML(pw,
- XalanDOMString(),
- format,
- m_Indent,
+ new FormatterToHTML(
+ pw,
XalanDOMString(), // encoding
XalanDOMString(), // media type
- // @@ JMD: ??
- // was: "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n",
XalanDOMString(), // doctypeSystem
XalanDOMString(), // doctypePublic
- false, // xmlDecl
- XalanDOMString()); // standalone
+ format,
+ m_Indent,
+ XalanDOMString(), // version
+ XalanDOMString(), // standalone
+ false); // xmlDecl
if (m_fOwnListener == true)
{
@@ -309,8 +303,6 @@
m_FormatterListener = htmlFormatVisitor;
m_fOwnListener = true;
-
- htmlFormatVisitor->m_attrSpecialChars = m_SpecialCharacters;
}
else if(0 == m_FormatterListener)
{
@@ -325,8 +317,6 @@
XalanDOMString(), // doctypePublic
true, // xmlDecl
XalanDOMString()); // standalone
-
- fToXML->m_attrSpecialChars = m_SpecialCharacters;
m_FormatterListener = fToXML;
m_fOwnListener = true;