00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #if !defined(FORMATTERTOXML_UNICODE_HEADER_GUARD_1357924680)
00017 #define FORMATTERTOXML_UNICODE_HEADER_GUARD_1357924680
00018
00019
00020
00021 #include "xalanc/XMLSupport/XMLSupportDefinitions.hpp"
00022
00023
00024
00025 #include "xalanc/XMLSupport/XalanXMLSerializerBase.hpp"
00026
00027
00028
00029 #include "xercesc/sax/AttributeList.hpp"
00030
00031
00032
00033 #include "xalanc/PlatformSupport/DoubleSupport.hpp"
00034 #include "xalanc/PlatformSupport/XalanOutputStream.hpp"
00035 #include "xalanc/PlatformSupport/XalanUnicode.hpp"
00036
00037
00038
00039 #include <xalanc/DOMSupport/DOMServices.hpp>
00040
00041
00042
00043 XALAN_CPP_NAMESPACE_BEGIN
00044
00045
00049 template<
00050 class UnicodeWriter,
00051 class ConstantsType,
00052 class CharPredicate,
00053 class IndentHandler,
00054 FormatterListener::eXMLVersion XMLVersion>
00055 class XALAN_XMLSUPPORT_EXPORT FormatterToXMLUnicode : public XalanXMLSerializerBase
00056 {
00057 public:
00058
00059 typedef typename UnicodeWriter::value_type value_type;
00060
00061 enum
00062 {
00063 eDefaultIndentAmount = 0
00064 };
00065
00082 FormatterToXMLUnicode(
00083 MemoryManager& theManager,
00084 Writer& writer,
00085 const XalanDOMString& encoding,
00086 const XalanDOMString& doctypeSystem = s_emptyString,
00087 const XalanDOMString& doctypePublic = s_emptyString,
00088 bool xmlDecl = true,
00089 const XalanDOMString& standalone = s_emptyString,
00090 size_type indent = eDefaultIndentAmount) :
00091 XalanXMLSerializerBase(
00092 theManager,
00093 XMLVersion,
00094 encoding,
00095 doctypeSystem,
00096 doctypePublic,
00097 xmlDecl,
00098 standalone),
00099 m_stringBuffer(theManager),
00100 m_writer(writer, theManager),
00101 m_constants(),
00102 m_charPredicate(),
00103 m_indentHandler(m_writer , indent)
00104 {
00105 }
00106
00107 static FormatterToXMLUnicode*
00108 create(
00109 MemoryManagerType& theManager,
00110 Writer& writer,
00111 const XalanDOMString& encoding,
00112 const XalanDOMString& doctypeSystem = s_emptyString,
00113 const XalanDOMString& doctypePublic = s_emptyString,
00114 bool xmlDecl = true,
00115 const XalanDOMString& standalone = s_emptyString,
00116 size_type indent = eDefaultIndentAmount)
00117 {
00118
00119 typedef FormatterToXMLUnicode ThisType;
00120
00121 XalanMemMgrAutoPtr<ThisType, false> theGuard( theManager , (ThisType*)theManager.allocate(sizeof(ThisType)));
00122
00123 ThisType* theResult = theGuard.get();
00124
00125 new (theResult) ThisType(
00126 theManager,
00127 writer,
00128 encoding,
00129 doctypeSystem,
00130 doctypePublic,
00131 xmlDecl,
00132 standalone,
00133 indent);
00134
00135 theGuard.release();
00136
00137 return theResult;
00138 }
00139
00140 virtual
00141 ~FormatterToXMLUnicode()
00142 {
00143 }
00144
00145 Writer*
00146 getWriter() const
00147 {
00148 return m_writer.getWriter();
00149 }
00150
00151
00152
00153 virtual void
00154 endDocument()
00155 {
00156 m_indentHandler.setStartNewLine(true);
00157
00158 m_indentHandler.indent();
00159
00160 flushBuffer();
00161 }
00162
00163 virtual void
00164 startElement(
00165 const XMLCh* const name,
00166 AttributeList& attrs)
00167 {
00168 generateDoctypeDecl(name);
00169
00170 writeParentTagEnd();
00171
00172 m_indentHandler.setPreserve(false);
00173
00174 m_indentHandler.indent();
00175
00176 m_indentHandler.setStartNewLine(true);
00177
00178 m_writer.write(value_type(XalanUnicode::charLessThanSign));
00179
00180 writeName(name);
00181
00182 const unsigned int nAttrs = attrs.getLength();
00183
00184 for (unsigned int i = 0; i < nAttrs ; i++)
00185 {
00186 processAttribute(attrs.getName(i), attrs.getValue(i));
00187 }
00188
00189
00190 openElementForChildren();
00191
00192 m_indentHandler.increaseIndent();
00193
00194 m_indentHandler.setPrevText(false);
00195 }
00196
00197 virtual void
00198 endElement(const XMLCh* const name)
00199 {
00200 m_indentHandler.decreaseIndent();
00201
00202 const bool hasChildNodes = childNodesWereAdded();
00203
00204 if (hasChildNodes == true)
00205 {
00206 m_indentHandler.indent();
00207
00208 m_writer.write(value_type(XalanUnicode::charLessThanSign));
00209 m_writer.write(value_type(XalanUnicode::charSolidus));
00210
00211 writeName(name);
00212 }
00213 else
00214 {
00215 if(m_spaceBeforeClose == true)
00216 {
00217 m_writer.write(value_type(XalanUnicode::charSpace));
00218 }
00219
00220 m_writer.write(value_type(XalanUnicode::charSolidus));
00221 }
00222
00223 m_writer.write(value_type(XalanUnicode::charGreaterThanSign));
00224
00225 if (hasChildNodes == true)
00226 {
00227 m_indentHandler.pop_preserve();
00228 }
00229
00230 m_indentHandler.setPrevText(false);
00231 }
00232
00233 virtual void
00234 charactersRaw(
00235 const XMLCh* const chars,
00236 const unsigned int length)
00237 {
00238 writeParentTagEnd();
00239
00240 m_indentHandler.setPreserve(true);
00241
00242 m_writer.write(chars, length);
00243 }
00244
00245
00246 virtual void
00247 entityReference(const XMLCh* const name)
00248 {
00249 writeParentTagEnd();
00250
00251 m_indentHandler.indent();
00252
00253 m_writer.write(value_type(XalanUnicode::charAmpersand));
00254
00255 writeName(name);
00256
00257 m_writer.write(value_type(XalanUnicode::charSemicolon));
00258 }
00259
00260 virtual void
00261 comment(const XMLCh* const data)
00262 {
00263 writeParentTagEnd();
00264
00265 m_indentHandler.indent();
00266
00267 m_writer.write(value_type(XalanUnicode::charLessThanSign));
00268 m_writer.write(value_type(XalanUnicode::charExclamationMark));
00269 m_writer.write(value_type(XalanUnicode::charHyphenMinus));
00270 m_writer.write(value_type(XalanUnicode::charHyphenMinus));
00271
00272 writeNormalizedData(data, XalanDOMString::length(data));
00273
00274 m_writer.write(value_type(XalanUnicode::charHyphenMinus));
00275 m_writer.write(value_type(XalanUnicode::charHyphenMinus));
00276 m_writer.write(value_type(XalanUnicode::charGreaterThanSign));
00277
00278 m_indentHandler.setStartNewLine(true);
00279 }
00280
00281 virtual const XalanDOMString&
00282 getEncoding() const
00283 {
00284 return m_constants.s_encodingString;
00285 }
00286
00287 protected:
00288
00289 virtual void
00290 flushBuffer()
00291 {
00292 m_writer.flushBuffer();
00293 }
00294
00295 void
00296 writeXMLHeader()
00297 {
00298
00299 m_writer.write(
00300 m_constants.s_xmlHeaderStartString,
00301 m_constants.s_xmlHeaderStartStringLength);
00302
00303 if (length(m_version) != 0)
00304 {
00305 m_writer.write(m_version);
00306 }
00307 else
00308 {
00309 m_writer.write(
00310 m_constants.s_defaultVersionString,
00311 m_constants.s_defaultVersionStringLength);
00312 }
00313>00304 a>00217 m_writer.write(value_type(XalanUnicode::charSpace));
00218 }
00219
00220 m_writer.write(value_type(XalanUnicode::charSolidus));
00221 }
00222
00223 m_writer.write(value_type(XalanUnicode::charGreaterThanSign));
00224
00225 if (hasChildNodes == true)
00226 {
00227 m_indentHandler.pop_preserve();
00228 }
00229
00230 m_indentHandler.setPrevText(false);
00231 }
00232
00233 virtual void
00234 charactersRaw(
00235 const XMLCh* const chars,
00236 const unsigned int length)
00237 {
00238 writeParentTagEnd();
00239
00240 m_indentHandler.setPreserve(true);
00241
00242 m_writer.write(chars, length);
00243 }
00244
00245
00246 virtual void
00247 entityReference(const XMLCh* const name)
00248 {
00249 writeParentTagEnd();
00250
00251 m_indentHandler.indent();
00252
00253 m_writer.write(value_type(XalanUnicode::charAmpersand));
00254
00255 writeName(name);
00256
00257 m_writer.write(value_type(XalanUnicode::charSemicolon));
00258 }
00259
00260 virtual void
00261 comment(const XMLCh* const data)
00262 {
00263 writeParentTagEnd();
00264
00265 m_indentHandler.indent();
00266
00267 m_writer.write(value_type(XalanUnicode::charLessThanSign));
00268 m_writer.write(value_type(XalanUnicode::charExclamationMark));
00269 m_writer.write(value_type(XalanUnicode::charHyphenMinus));
00270 m_writer.write(value_type(XalanUnicode::charHyphenMinus));
00271
00272 writeNormalizedData(data, XalanDOMString::length(data));
00273
00274 m_writer.write(value_type(XalanUnicode::charHyphenMinus));
00275 m_writer.write(value_type(XalanUnicode::charHyphenMinus));
00276 m_writer.write(value_type(XalanUnicode::charGreaterThanSign));
00277
00278 m_indentHandler.setStartNewLine(true);
00279 }
00280
00281 virtual const XalanDOMString&
00282 getEncoding() const
00283 {
00284 return m_constants.s_encodingString;
00285 }
00286
00287 protected:
00288
00289 virtual void
00290 flushBuffer()
00291 {
00292 m_writer.flushBuffer();
00293 }
00294
00295 void
00296 writeXMLHeader()
00297 {
00298
00299 m_writer.write(
00300 m_constants.s_xmlHeaderStartString,
00301 m_constants.s_xmlHeaderStartStringLength);
00302
00303 if (length(m_version) != 0)
00304 {
00305 m_writer.write(m_version);
00306 }
00307 else
00308 {
00309 m_writer.write(
00310 m_constants.s_defaultVersionString,
00311 m_constants.s_defaultVersionStringLength);
00312 }
00313>00304 a>00217 m_writer.write(value_type(XalanUnicode::charSpace));
00218 }
00219
00220 m_writer.write(value_type(XalanUnicode::charSolidus));
00221 }
00222
00223 m_writer.write(value_type(XalanUnicode::charGreaterThanSign));
00224
00225 if (hasChildNodes == true)
00226 {
00227 m_indentHandler.pop_preserve();
00228 }
00229
00230 m_indentHandler.setPrevText(false);
00231 }
00232
00233 virtual void
00234 charactersRaw(
00235 const XMLCh* const chars,
00236 const unsigned int length)
00237 {
00238 writeParentTagEnd();
00239
00240 m_indentHandler.setPreserve(true);
00241
00242 m_writer.write(chars, length);
00243 }
00244
00245
00246 virtual void
00247 entityReference(const XMLCh* const name)
00248 {
00249 writeParentTagEnd();
00250
00251 m_indentHandler.indent();
00252
00253 m_writer.write(value_type(XalanUnicode::charAmpersand));
00254
00255 writeName(name);
00256
00257 m_writer.write(value_type(XalanUnicode::charSemicolon));
00258 }
00259
00260 virtual void
00261 comment(const XMLCh* const data)
00262 {
00263 writeParentTagEnd();
00264
00265 m_indentHandler.indent();
00266
00267 m_writer.write(value_type(XalanUnicode::charLessThanSign));
00268 m_writer.write(value_type(XalanUnicode::charExclamationMark));
00269 m_writer.write(value_type(XalanUnicode::charHyphenMinus));
00270 m_writer.write(value_type(XalanUnicode::charHyphenMinus));
00271
00272 writeNormalizedData(data, XalanDOMString::length(data));
00273
00274 m_writer.write(value_type(XalanUnicode::charHyphenMinus));
00275 m_writer.write(value_type(XalanUnicode::charHyphenMinus));
00276 m_writer.write(value_type(XalanUnicode::charGreaterThanSign));
00277
00278 m_indentHandler.setStartNewLine(true);
00279 }
00280
00281 virtual const XalanDOMString&
00282 getEncoding() const
00283 {
00284 return m_constants.s_encodingString;
00285 }
00286
00287 protected:
00288
00289 virtual void
00290 flushBuffer()
00291 {
00292 m_writer.flushBuffer();
00293 }
00294
00295 void
00296 writeXMLHeader()
00297 {
00298
00299 m_writer.write(
00300 m_constants.s_xmlHeaderStartString,
00301 m_constants.s_xmlHeaderStartStringLength);
00302
00303 if (length(m_version) != 0)
00304 {
00305 m_writer.write(m_version);
00306 }
00307 else
00308 {
00309 m_writer.write(
00310 m_constants.s_defaultVersionString,
00311 m_constants.s_defaultVersionStringLength);
00312 }
00313>00304 a>00217 m_writer.write(value_type(XalanUnicode::charSpace));
00218 }
00219
00220 m_writer.write(value_type(XalanUnicode::charSolidus));
00221 }
00222
00223 m_writer.write(value_type(XalanUnicode::charGreaterThanSign));
00224
00225 if (hasChildNodes == true)
00226 {
00227 m_indentHandler.pop_preserve();
00228 }
00229
00230 m_indentHandler.setPrevText(false);
00231 }
00232
00233 virtual void
00234 charactersRaw(
00235 const XMLCh* const chars,
00236 const unsigned int length)
00237 {
00238 writeParentTagEnd();
00239
00240 m_indentHandler.setPreserve(true);
00241
00242 m_writer.write(chars, length);
00243 }
00244
00245
00246 virtual void
00247 entityReference(const XMLCh* const name)
00248 {
00249 writeParentTagEnd();
00250
00251 m_indentHandler.indent();
00252
00253 m_writer.write(value_type(XalanUnicode::charAmpersand));
00254
00255 writeName(name);
00256
00257 m_writer.write(value_type(XalanUnicode::charSemicolon));
00258 }
00259
00260 virtual void
00261 comment(const XMLCh* const data)
00262 {
00263 writeParentTagEnd();
00264
00265 m_indentHandler.indent();
00266
00267 m_writer.write(value_type(XalanUnicode::charLessThanSign));
00268 m_writer.write(value_type(XalanUnicode::charExclamationMark));
00269 m_writer.write(value_type(XalanUnicode::charHyphenMinus));
00270 m_writer.write(value_type(XalanUnicode::charHyphenMinus));
00271
00272 writeNormalizedData(data, XalanDOMString::length(data));
00273
00274 m_writer.write(value_type(XalanUnicode::charHyphenMinus));
00275 m_writer.write(value_type(XalanUnicode::charHyphenMinus));
00276 m_writer.write(value_type(XalanUnicode::charGreaterThanSign));
00277
00278 m_indentHandler.setStartNewLine(true);
00279 }
00280
00281 virtual const XalanDOMString&
00282 getEncoding() const
00283 {
00284 return m_constants.s_encodingString;
00285 }
00286
00287 protected:
00288
00289 virtual void
00290 flushBuffer()
00291 {
00292 m_writer.flushBuffer();
00293 }
00294
00295 void
00296 writeXMLHeader()
00297 {
00298
00299 m_writer.write(
00300 m_constants.s_xmlHeaderStartString,
00301 m_constants.s_xmlHeaderStartStringLength);
00302
00303 if (length(m_version) != 0)
00304 {
00305 m_writer.write(m_version);
00306 }
00307 else
00308 {
00309 m_writer.write(
00310 m_constants.s_defaultVersionString,
00311 m_constants.s_defaultVersionStringLength);
00312 }
00313>00304 a>00217 m_writer.write(value_type(XalanUnicode::charSpace));
00218 }
00219
00220 m_writer.write(value_type(XalanUnicode::charSolidus));
00221 }
00222
00223 m_writer.write(value_type(XalanUnicode::charGreaterThanSign));
00224
00225 if (hasChildNodes == true)
00226 {
00227 m_indentHandler.pop_preserve();
00228 }
00229
00230 m_indentHandler.setPrevText(false);
00231 }
00232
00233 virtual void
00234 charactersRaw(
00235 const XMLCh* const chars,
00236 const unsigned int length)
00237 {
00238 writeParentTagEnd();
00239
00240 m_indentHandler.setPreserve(true);
00241
00242 m_writer.write(chars, length);
00243 }
00244
00245
00246 virtual void
00247 entityReference(const XMLCh* const name)
00248 {
00249 writeParentTagEnd();
00250
00251 m_indentHandler.indent();
00252
00253 m_writer.write(value_type(XalanUnicode::charAmpersand));
00254
00255 writeName(name);
00256
00257 m_writer.write(value_type(XalanUnicode::charSemicolon));
00258 }
00259
00260 virtual void
00261 comment(const XMLCh* const data)
00262 {
00263 writeParentTagEnd();
00264
00265 m_indentHandler.indent();
00266
00267 m_writer.write(value_type(XalanUnicode::charLessThanSign));
00268 m_writer.write(value_type(XalanUnicode::charExclamationMark));
00269 m_writer.write(value_type(XalanUnicode::charHyphenMinus));
00270 m_writer.write(value_type(XalanUnicode::charHyphenMinus));
00271
00272 writeNormalizedData(data, XalanDOMString::length(data));
00273
00274 m_writer.write(value_type(XalanUnicode::charHyphenMinus));
00275 m_writer.write(value_type(XalanUnicode::charHyphenMinus));
00276 m_writer.write(value_type(XalanUnicode::charGreaterThanSign));
00277
00278 m_indentHandler.setStartNewLine(true);
00279 }
00280
00281 virtual const XalanDOMString&
00282 getEncoding() const
00283 {
00284 return m_constants.s_encodingString;
00285 }
00286
00287 protected:
00288
00289 virtual void
00290 flushBuffer()
00291 {
00292 m_writer.flushBuffer();
00293 }
00294
00295 void
00296 writeXMLHeader()
00297 {
00298
00299 m_writer.write(
00300 m_constants.s_xmlHeaderStartString,
00301 m_constants.s_xmlHeaderStartStringLength);
00302
00303 if (length(m_version) != 0)
00304 {
00305 m_writer.write(m_version);
00306 }
00307 else
00308 {
00309 m_writer.write(
00310 m_constants.s_defaultVersionString,
00311 m_constants.s_defaultVersionStringLength);
00312 }
00313>00304 a>00217 m_writer.write(value_type(XalanUnicode::charSpace));
00218 }
00219
00220 m_writer.write(value_type(XalanUnicode::charSolidus));
00221 }
00222
00223 m_writer.write(value_type(XalanUnicode::charGreaterThanSign));
00224
00225 if (hasChildNodes == true)
00226 {
00227 m_indentHandler.pop_preserve();
00228 }
00229
00230 m_indentHandler.setPrevText(false);
00231 }
00232
00233 virtual void
00234 charactersRaw(
00235 const XMLCh* const chars,
00236 const unsigned int length)
00237 {
00238 writeParentTagEnd();
00239
00240 m_indentHandler.setPreserve(true);
00241
00242 m_writer.write(chars, length);
00243 }
00244
00245
00246 virtual void
00247 entityReference(const XMLCh* const name)
00248 {
00249 writeParentTagEnd();
00250
00251 m_indentHandler.indent();
00252
00253 m_writer.write(value_type(XalanUnicode::charAmpersand));
00254
00255 writeName(name);
00256
00257 m_writer.write(value_type(XalanUnicode::charSemicolon));
00258 }
00259
00260 virtual void
00261 comment(const XMLCh* const data)
00262 {
00263 writeParentTagEnd();
00264
00265 m_indentHandler.indent();
00266
00267 m_writer.write(value_type(XalanUnicode::charLessThanSign));
00268 m_writer.write(value_type(XalanUnicode::charExclamationMark));
00269 m_writer.write(value_type(XalanUnicode::charHyphenMinus));
00270 m_writer.write(value_type(XalanUnicode::charHyphenMinus));
00271
00272 writeNormalizedData(data, XalanDOMString::length(data));
00273
00274 m_writer.write(value_type(XalanUnicode::charHyphenMinus));
00275 m_writer.write(value_type(XalanUnicode::charHyphenMinus));
00276 m_writer.write(value_type(XalanUnicode::charGreaterThanSign));
00277
00278 m_indentHandler.setStartNewLine(true);
00279 }
00280
00281 virtual const XalanDOMString&
00282 getEncoding() const
00283 {
00284 return m_constants.s_encodingString;
00285 }
00286
00287 protected:
00288
00289 virtual void
00290 flushBuffer()
00291 {
00292 m_writer.flushBuffer();
00293 }
00294
00295 void
00296 writeXMLHeader()
00297 {
00298
00299 m_writer.write(
00300 m_constants.s_xmlHeaderStartString,
00301 m_constants.s_xmlHeaderStartStringLength);
00302
00303 if (length(m_version) != 0)
00304 {
00305 m_writer.write(m_version);
00306 }
00307 else
00308 {
00309 m_writer.write(
00310 m_constants.s_defaultVersionString,
00311 m_constants.s_defaultVersionStringLength);
00312 }
00313>00304 a>00217 m_writer.write(value_type(XalanUnicode::charSpace));
00218 }
00219
00220 m_writer.write(value_type(XalanUnicode::charSolidus));
00221 }
00222
00223 m_writer.write(value_type(XalanUnicode::charGreaterThanSign));
00224
00225 if (hasChildNodes == true)
00226 {
00227 m_indentHandler.pop_preserve();
00228 }
00229
00230 m_indentHandler.setPrevText(false);
00231 }
00232
00233 virtual void
00234 charactersRaw(
00235 const XMLCh* const chars,
00236 const unsigned int length)
00237 {
00238 writeParentTagEnd();
00239
00240 m_indentHandler.setPreserve(true);
00241
00242 m_writer.write(chars, length);
00243 }
00244
00245
00246 virtual void
00247 entityReference(const XMLCh* const name)
00248 {
00249 writeParentTagEnd();
00250
00251 m_indentHandler.indent();
00252
00253 m_writer.write(value_type(