18 #if !defined(FORMATTERTOXML_UNICODE_HEADER_GUARD_1357924680) 19 #define FORMATTERTOXML_UNICODE_HEADER_GUARD_1357924680 31 #include "xercesc/sax/AttributeList.hpp" 45 XALAN_CPP_NAMESPACE_BEGIN
65 eDefaultIndentAmount = 0
85 MemoryManager& theManager,
92 size_type indent = eDefaultIndentAmount) :
101 m_stringBuffer(theManager),
102 m_writer(writer, theManager),
105 m_indentHandler(m_writer , indent)
111 MemoryManager& theManager,
125 ThisType*
const theResult =
126 new (theGuard.get()) ThisType(
149 return m_writer.getWriter();
157 m_indentHandler.setStartNewLine(
true);
159 m_indentHandler.indent();
168 const XMLCh*
const name,
169 AttributeList& attrs)
175 m_indentHandler.setPreserve(
false);
177 m_indentHandler.indent();
179 m_indentHandler.setStartNewLine(
true);
185 const XalanSize_t nAttrs = attrs.getLength();
187 for (XalanSize_t i = 0; i < nAttrs ; i++)
189 processAttribute(attrs.getName(i), attrs.getValue(i));
195 m_indentHandler.increaseIndent();
197 m_indentHandler.setPrevText(
false);
203 m_indentHandler.decreaseIndent();
207 if (hasChildNodes ==
true)
209 m_indentHandler.indent();
218 if(m_spaceBeforeClose ==
true)
228 if (hasChildNodes ==
true)
230 m_indentHandler.pop_preserve();
233 m_indentHandler.setPrevText(
false);
238 const XMLCh*
const chars,
243 m_indentHandler.setPreserve(
true);
245 m_writer.write(chars, length);
254 m_indentHandler.indent();
268 m_indentHandler.indent();
281 m_indentHandler.setStartNewLine(
true);
289 m_writer.flushBuffer();
295 m_writer.flushWriter();
303 m_constants.s_xmlHeaderStartString,
304 m_constants.s_xmlHeaderStartStringLength);
306 if (m_version.empty() ==
false)
308 m_writer.write(m_version);
313 m_constants.s_defaultVersionString,
314 m_constants.s_defaultVersionStringLength);
319 m_constants.s_xmlHeaderEncodingString,
320 m_constants.s_xmlHeaderEncodingStringLength);
322 m_writer.write(m_encoding);
324 if (m_standalone.empty() ==
false)
327 m_constants.s_xmlHeaderStandaloneString,
328 m_constants.s_xmlHeaderStandaloneStringLength);
330 m_writer.write(m_standalone);
334 m_constants.s_xmlHeaderEndString,
335 m_constants.s_xmlHeaderEndStringLength);
339 m_indentHandler.outputLineSep();
349 m_constants.s_doctypeHeaderStartString,
350 m_constants.s_doctypeHeaderStartStringLength);
352 m_writer.write(name);
354 if (m_doctypePublic.empty() ==
false)
358 m_constants.s_doctypeHeaderPublicString,
359 m_constants.s_doctypeHeaderPublicStringLength);
361 writeName(m_doctypePublic.c_str());
371 m_constants.s_doctypeHeaderSystemString,
372 m_constants.s_doctypeHeaderSystemStringLength);
375 writeName(m_doctypeSystem.c_str());
391 m_indentHandler.indent();
406 writeNormalizedData(data, len);
421 m_indentHandler.setPreserve(
true);
428 const XalanDOMChar ch = chars[i];
430 if(m_charPredicate.range(ch) ==
true)
432 safeWriteContent(chars + firstIndex, i - firstIndex);
434 i = writeNormalizedCharBig(chars, i, length);
440 else if(m_charPredicate.content(ch) ==
false)
446 safeWriteContent(chars + firstIndex, i - firstIndex);
448 writeDefaultEscape(ch);
456 safeWriteContent(chars + firstIndex, i - firstIndex);
458 m_indentHandler.setPrevText(
true);
471 m_indentHandler.setPreserve(
true);
473 m_indentHandler.indent();
476 m_constants.s_cdataOpenString,
477 m_constants.s_cdataOpenStringLength);
479 bool outsideCDATA =
false;
481 writeCDATAChars(chars, length, outsideCDATA);
483 if (outsideCDATA ==
false)
486 m_constants.s_cdataCloseString,
487 m_constants.s_cdataCloseStringLength);
497 m_writer.outputNewline();
506 assert(m_charPredicate.content(ch) ==
true);
508 if(!writeDefaultEntity(ch))
516 if(m_charPredicate.isForbidden(ch) ==
true)
525 writeNumericCharacterReference(ch);
537 assert(m_charPredicate.attribute(ch) ==
true);
539 if(writeDefaultAttributeEntity(ch) ==
false)
541 if(m_charPredicate.isForbidden(ch) ==
true)
550 writeNumericCharacterReference(ch);
566 m_constants.s_lessThanEntityString,
567 m_constants.s_lessThanEntityStringLength);
572 m_constants.s_greaterThanEntityString,
573 m_constants.s_greaterThanEntityStringLength);
578 m_constants.s_ampersandEntityString,
579 m_constants.s_ampersandEntityStringLength);
596 if (writeDefaultEntity(ch) ==
true)
603 m_constants.s_quoteEntityString,
604 m_constants.s_quoteEntityStringLength);
625 m_indentHandler.setPrevText(
false);
627 m_indentHandler.push_preserve();
640 const XalanDOMChar chars[],
650 if(m_charPredicate.isCharRefForbidden(ch))
659 start = m_writer.write( chars, start, length);
673 m_stringBuffer.clear();
680 const XalanDOMChar chars[],
684 assert(start < length);
686 const XalanDOMChar ch = chars[start];
688 assert(m_charPredicate.range(ch) ==
true);
690 if (XMLVersion == XML_VERSION_1_1 &&
693 writeNumericCharacterReference(ch);
697 start = m_writer.write(chars, start, length);
711 const XalanDOMChar chars[],
724 const XalanDOMChar theChar = chars[i];
731 if (outsideCDATA ==
true)
734 m_constants.s_cdataCloseString,
735 m_constants.s_cdataCloseStringLength);
742 m_constants.s_cdataCloseString,
743 m_constants.s_cdataCloseStringLength);
746 m_constants.s_cdataOpenString,
747 m_constants.s_cdataOpenStringLength);
751 outsideCDATA =
false;
761 else if(m_charPredicate.isCharRefForbidden(theChar))
770 i = m_writer.writeCDATAChar(chars, i, length, outsideCDATA);
777 if(outsideCDATA ==
true)
780 m_constants.s_cdataOpenString,
781 m_constants.s_cdataOpenStringLength);
794 const XalanDOMChar* theString,
797 assert(theString != 0);
802 while(i < theStringLength)
804 const XalanDOMChar ch = theString[i];
806 if(m_charPredicate.range(ch) ==
true)
808 safeWriteContent(theString + firstIndex, i - firstIndex);
810 i = writeNormalizedCharBig(theString, i, theStringLength);
816 else if (m_charPredicate.attribute(ch) ==
false)
822 safeWriteContent(theString + firstIndex, i - firstIndex);
824 writeDefaultAttributeEscape(ch);
832 safeWriteContent(theString + firstIndex, i - firstIndex);
844 const XalanDOMChar* name,
845 const XalanDOMChar* value)
851 writeAttrString(value,
length(value));
862 const XalanDOMChar* theData,
865 for (
size_type i = 0; i < theLength; ++i)
867 const XalanDOMChar theChar = theData[i];
869 i = writeNormalizedChar(theChar, theData, i, theLength);
875 const XalanDOMChar* theChars,
880 m_writer.write(value_type(theChars[i]));
885 writeName(
const XalanDOMChar* theChars)
887 assert( theChars != 0);
889 m_writer.writeNameChar(theChars,
length(theChars));
907 UnicodeWriter m_writer;
909 ConstantsType m_constants;
911 CharPredicate m_charPredicate;
913 IndentHandler m_indentHandler;
918 XALAN_CPP_NAMESPACE_END
922 #endif // FORMATTERTOXML_UNICODE_HEADER_GUARD_1357924680
bool childNodesWereAdded()
Determine if an element ever had any children added.
static void throwInvalidXMLCharacterException(XalanUnicodeChar ch, const XalanDOMString &theXMLversion, MemoryManager &theManager)
Throw an exception when an invalid character for the specific XML version is encountered.
bool getNeedToOutputDoctypeDecl() const
Determine if it a DOCTYPE declaration needs to be written.
virtual void outputNewline()=0
void openElementForChildren()
Open an element for possibile children.
void generateDoctypeDecl(const XalanDOMChar *name)
XalanXMLSerializerBase serves as a base class for XML serializers based on FormatterListener events...
#define XALAN_XMLSUPPORT_EXPORT
NumberToDOMString(double theValue, XalanDOMString &theResult)
Converts a double value into a XalanDOMString.
MemoryManager & getMemoryManager()
bool markParentForChildren()
Mark the parent element as having a child.
bool operator==(const ElemAttributeSet &theLHS, const ElemAttributeSet &theRHS)
XalanDOMString::size_type length(const XalanDOMString &theString)
Get the length of a XalanDOMString.
bool isXMLWhitespace(XalanDOMChar theChar)
Determines whether character represents white space.
virtual void flushBuffer()=0