blob: 6e96dba2dc28ec654cdd21e67a2fc3fd38488640 [file] [log] [blame]
/*
* The Apache Software License, Version 1.1
*
*
* Copyright (c) 1999 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* 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.
*
* 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.
*
* 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.
*
* 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.
*
* 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
* 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
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation and was
* originally based on software copyright (c) 1999, International
* Business Machines, Inc., http://www.ibm.com. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
/**
* @author David N. Bertoni <david_n_bertoni@lotus.com>
*/
// Class header file.
#include "FormatterToHTML.hpp"
#include <cassert>
#include <sax/AttributeList.hpp>
#include <Include/XalanAutoPtr.hpp>
#include <PlatformSupport/DOMStringHelper.hpp>
#include <PlatformSupport/PrefixResolver.hpp>
#include <PlatformSupport/Writer.hpp>
#include <PlatformSupport/XalanTranscodingServices.hpp>
#include <PlatformSupport/XalanUnicode.hpp>
#include <PlatformSupport/XalanXMLChar.hpp>
#include <DOMSupport/DOMServices.hpp>
const XalanDOMString FormatterToHTML::s_emptyString;
FormatterToHTML::FormatterToHTML(
Writer& writer,
const XalanDOMString& encoding,
const XalanDOMString& mediaType,
const XalanDOMString& doctypeSystem,
const XalanDOMString& doctypePublic,
bool doIndent,
int indent,
const XalanDOMString& version,
const XalanDOMString& standalone,
bool xmlDecl) :
FormatterToXML(
writer,
version,
doIndent,
indent,
encoding,
mediaType,
doctypeSystem,
doctypePublic,
xmlDecl,
standalone,
OUTPUT_METHOD_HTML),
m_currentElementName(),
m_inBlockElem(false),
m_isRawStack(),
m_isScriptOrStyleElem(false),
m_inScriptElemStack(),
m_escapeURLs(true),
m_isFirstElement(false),
m_isUTF8(XalanTranscodingServices::encodingIsUTF8(m_encoding)),
m_elementLevel(0),
m_hasNamespaceStack()
{
assert(s_elementFlags != 0 && s_dummyDesc != 0 && s_xalanHTMLEntities != 0);
initCharsMap();
}
FormatterToHTML::~FormatterToHTML()
{
}
void
FormatterToHTML::initAttrCharsMap()
{
FormatterToXML::initAttrCharsMap();
m_attrCharsMap[XalanUnicode::charLF] = 'S';
// These should _not_ be escaped...
m_attrCharsMap[XalanUnicode::charLessThanSign] = 0;
m_attrCharsMap[XalanUnicode::charGreaterThanSign] = 0;
for(XalanDOMString::size_type i = 160; i < SPECIALSSIZE; i++)
{
m_attrCharsMap[i] = 'S';
}
}
void
FormatterToHTML::initCharsMap()
{
initAttrCharsMap();
#if defined(XALAN_STRICT_ANSI_HEADERS)
std::memset(m_charsMap, 0, sizeof(m_charsMap));
#else
memset(m_charsMap, 0, sizeof(m_charsMap));
#endif
m_charsMap[XalanUnicode::charLF] = 'S';
m_charsMap[XalanUnicode::charLessThanSign] = 'S';
m_charsMap[XalanUnicode::charGreaterThanSign] = 'S';
m_charsMap[XalanUnicode::charAmpersand] = 'S';
#if defined(XALAN_STRICT_ANSI_HEADERS)
std::memset(m_charsMap, 'S', 10);
#else
memset(m_charsMap, 'S', 10);
#endif
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)
{
m_charsMap[j] = 'S';
}
}
const FormatterToHTML::ElemDesc&
FormatterToHTML::getElemDesc(const XalanDOMChar* name)
{
assert(s_elementFlags != 0 && s_dummyDesc != 0);
const ElementFlagsMapType::const_iterator i =
s_elementFlags->find(name);
if (i == s_elementFlags->end())
{
return *s_dummyDesc;
}
else
{
return (*i).second;
}
}
void
FormatterToHTML::startDocument()
{
// Clear the buffer, just in case...
clear(m_stringBuffer);
// Reset this, just in case...
m_elementLevel = 0;
m_isFirstElement = true;
m_startNewLine = false;
m_shouldWriteXMLHeader = false;
m_isScriptOrStyleElem = false;
m_isRawStack.clear();
m_inScriptElemStack.push_back(false);
m_hasNamespaceStack.clear();
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)
{
accumContent(s_doctypeHeaderStartString);
if(isEmptyPublic == false)
{
accumContent(s_doctypeHeaderPublicString);
accumContent(m_doctypePublic);
accumContent(XalanUnicode::charQuoteMark);
}
if(isEmptySystem == false)
{
if(isEmptyPublic == true)
{
accumContent(s_doctypeHeaderSystemString);
}
accumContent(XalanUnicode::charSpace);
accumContent(XalanUnicode::charQuoteMark);
accumContent(m_doctypeSystem);
accumContent(XalanUnicode::charQuoteMark);
}
accumContent(XalanUnicode::charGreaterThanSign);
outputLineSep();
}
m_needToOutputDocTypeDecl = false;
}
void
FormatterToHTML::endDocument()
{
assert(m_elementLevel == 0);
m_inScriptElemStack.pop_back();
FormatterToXML::endDocument();
}
void
FormatterToHTML::startElement(
const XMLCh* const name,
AttributeList& attrs)
{
if (pushHasNamespace(name) == true)
{
FormatterToXML::startElement(name, attrs);
}
else
{
writeParentTagEnd();
const ElemDesc& elemDesc =
getElemDesc(name);
const bool isBlockElement = elemDesc.is(ElemDesc::BLOCK);
if (equalsIgnoreCaseASCII(name, c_wstr(s_scriptString)) == true)
{
m_isScriptOrStyleElem = true;
m_inScriptElemStack.push_back(true);
}
else
{
if (equalsIgnoreCaseASCII(name, c_wstr(s_styleString)) == true)
{
m_isScriptOrStyleElem = true;
}
m_inScriptElemStack.push_back(m_inScriptElemStack.back());
}
// Increment the level...
++m_elementLevel;
if(m_ispreserve == true)
{
m_ispreserve = false;
}
else if(m_doIndent &&
m_elementLevel > 0 && m_isFirstElement == false &&
(m_inBlockElem == false || isBlockElement == true))
{
m_startNewLine = true;
indent(m_currentIndent);
}
m_inBlockElem = !isBlockElement;
m_isRawStack.push_back(elemDesc.is(ElemDesc::RAW));
accumContent(XalanUnicode::charLessThanSign);
accumName(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;
if (elemDesc.is(ElemDesc::HEADELEM) == true)
{
writeParentTagEnd();
if (m_doIndent)
indent(m_currentIndent);
accumContent(s_metaString);
accumContent(getEncoding());
accumContent(XalanUnicode::charQuoteMark);
accumContent(XalanUnicode::charGreaterThanSign);
}
// We've written the first element, so turn off the flag...
if (m_isFirstElement == true)
{
m_isFirstElement = false;
}
assert(m_elementLevel > 0);
}
}
void
FormatterToHTML::endElement(const XMLCh* const name)
{
if (popHasNamespace() == true)
{
FormatterToXML::endElement(name);
}
else
{
m_currentIndent -= m_indent;
const bool hasChildNodes = childNodesWereAdded();
assert(m_isRawStack.empty() == false);
assert(m_inScriptElemStack.empty() == false);
m_isRawStack.pop_back();
m_inScriptElemStack.pop_back();
const ElemDesc& elemDesc =
getElemDesc(name);
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)
{
indent(m_currentIndent);
}
accumContent(XalanUnicode::charLessThanSign);
accumContent(XalanUnicode::charSolidus);
accumName(name);
accumContent(XalanUnicode::charGreaterThanSign);
}
else
{
if(elemDesc.is(ElemDesc::EMPTY) == false)
{
accumContent(XalanUnicode::charGreaterThanSign);
accumContent(XalanUnicode::charLessThanSign);
accumContent(XalanUnicode::charSolidus);
accumName(name);
accumContent(XalanUnicode::charGreaterThanSign);
}
else
{
accumContent(XalanUnicode::charGreaterThanSign);
}
}
if (elemDesc.is(ElemDesc::WHITESPACESENSITIVE) == true)
{
m_ispreserve = true;
}
if (hasChildNodes == true)
{
if (m_preserves.empty() == false)
{
m_preserves.pop_back();
}
}
m_isprevtext = false;
// Decrement the level...
--m_elementLevel;
}
}
void
FormatterToHTML::characters(
const XMLCh* const chars,
const unsigned int length)
{
if(length != 0)
{
if(m_inCData == true)
{
cdata(chars, length);
}
else if(m_nextIsRaw)
{
m_nextIsRaw = false;
charactersRaw(chars, length);
}
else if (m_inScriptElemStack.back() == true)
{
charactersRaw(chars, length);
}
else if (m_isRawStack.empty() == false &&
m_isRawStack.back() == true)
{
writeParentTagEnd();
m_ispreserve = true;
if (shouldIndent() == true)
{
indent(m_currentIndent);
}
writeNormalizedChars(chars, 0, length, false);
}
else
{
writeParentTagEnd();
m_ispreserve = true;
writeCharacters(chars, length);
}
}
if (m_isprevtext == false)
{
m_isprevtext = true;
}
}
bool
FormatterToHTML::accumDefaultEntity(
XalanDOMChar ch,
XalanDOMString::size_type i,
const XalanDOMChar chars[],
XalanDOMString::size_type len,
bool escLF)
{
assert(s_xalanHTMLEntities != 0);
if(FormatterToXML::accumDefaultEntity(ch, i, chars, len, escLF) == false)
{
const XalanEntityReferenceMapType::const_iterator theIterator = s_xalanHTMLEntities->find(ch);
if (theIterator == s_xalanHTMLEntitiesIteratorEnd)
{
return false;
}
else
{
copyEntityIntoBuffer((*theIterator).second);
}
}
return true;
}
void
FormatterToHTML::entityReference(const XMLCh* const name)
{
accumContent(XalanUnicode::charAmpersand);
accumName(name);
accumContent(XalanUnicode::charSemicolon);
}
void
FormatterToHTML::cdata(
const XMLCh* const ch,
const unsigned int length)
{
if(m_isScriptOrStyleElem == true)
{
writeParentTagEnd();
m_ispreserve = true;
if (shouldIndent() == true)
{
indent(m_currentIndent);
}
writeNormalizedChars(ch, 0, length, true);
}
else if(m_stripCData == true)
{
writeParentTagEnd();
m_ispreserve = true;
if (shouldIndent() == true)
{
indent(m_currentIndent);
}
accumContent(ch, 0, length);
}
else
{
FormatterToXML::cdata(ch, length);
}
}
void
FormatterToHTML::processingInstruction(
const XMLCh* const target,
const XMLCh* const data)
{
// Use a fairly nasty hack to tell if the next node is supposed to be
// unescaped text.
if(equals(target, s_xsltNextIsRawString) == true &&
equals(data, s_formatterListenerString) == true)
{
m_nextIsRaw = true;
}
else
{
writeParentTagEnd();
if (shouldIndent() == true)
{
indent(m_currentIndent);
}
accumContent(XalanUnicode::charLessThanSign);
accumContent(XalanUnicode::charQuestionMark);
accumName(target);
if (length(data) > 0)
{
if(isXMLWhitespace(data[0]) == false)
{
accumContent(XalanUnicode::charSpace);
}
writeCharacters(data);
}
accumContent(XalanUnicode::charGreaterThanSign); // different from XML
// If outside of an element, then put in a new line. This whitespace
// is not significant.
if (m_elementLevel == 0)
{
outputLineSep();
}
m_startNewLine = true;
}
}
void
FormatterToHTML::writeCharacters(const XalanDOMString& theString)
{
writeCharacters(toCharArray(theString), length(theString));
}
void
FormatterToHTML::writeCharacters(
const XalanDOMChar* theString,
XalanDOMString::size_type theLength)
{
assert(theString != 0);
if (theLength == unsigned(-1))
{
theLength = length(theString);
}
for (XalanDOMString::size_type i = 0; i < theLength; ++i)
{
const XalanDOMChar ch = theString[i];
if(ch < SPECIALSSIZE && m_charsMap[ch] != 'S')
{
accumContent(ch);
}
else if (XalanUnicode::charLF == ch) // sta this can be removed?
{
outputLineSep();
}
else if (accumDefaultEntity(ch, i, theString, theLength, true) == false)
{
if (m_isUTF8 == true && 0xd800 <= ch && ch < 0xdc00)
{
// UTF-16 surrogate
XalanDOMChar next = 0;
if (i + 1 >= theLength)
{
throwInvalidUTF16SurrogateException(ch);
}
else
{
next = theString[++i];
if (!(0xdc00 <= next && next < 0xe000))
{
throwInvalidUTF16SurrogateException(ch, next);
}
next = XalanDOMChar(((ch - 0xd800) << 10) + next - 0xdc00 + 0x00010000);
}
writeNumberedEntityReference(next);
}
else if(ch >= 0x007Fu && ch <= m_maxCharacter)
{
// Hope this is right...
accumContent(ch);
}
else
{
writeNumberedEntityReference(ch);
}
}
}
}
void
FormatterToHTML::writeAttrString(const XalanDOMChar* theString)
{
assert(theString != 0);
const XalanDOMString::size_type theLength = length(theString);
for (XalanDOMString::size_type i = 0; i < theLength; i ++)
{
const XalanDOMChar ch = theString[i];
if(ch < SPECIALSSIZE && m_attrCharsMap[ch] != 'S')
{
accumContent(ch);
}
else if(XalanUnicode::charAmpersand == ch &&
i + 1 < theLength &&
XalanUnicode::charLeftCurlyBracket == theString[i + 1])
{
accumContent(ch); // no escaping in this case, as specified in 15.2
}
else if (accumDefaultEntity(ch, i, theString, theLength, true) == false)
{
if (0xd800 <= ch && ch < 0xdc00)
{
// UTF-16 surrogate
XalanDOMChar next = 0;
if (i + 1 >= theLength)
{
throwInvalidUTF16SurrogateException(ch);
}
else
{
next = theString[++i];
if (!(0xdc00 <= next && next < 0xe000))
{
throwInvalidUTF16SurrogateException(ch, next);
}
next = XalanDOMChar(((ch - 0xd800) << 10) + next -0xdc00 + 0x00010000);
}
accumContent(XalanUnicode::charAmpersand);
accumContent(XalanUnicode::charNumberSign);
accumContent(UnsignedLongToDOMString(next, m_stringBuffer));
clear(m_stringBuffer);
accumContent(XalanUnicode::charSemicolon);
}
else
{
writeNumberedEntityReference(ch);
}
}
}
}
void
FormatterToHTML::accumCommentData(const XalanDOMChar* data)
{
accumName(data);
}
void
FormatterToHTML::copyEntityIntoBuffer(const XalanDOMChar* s)
{
const XalanDOMString::size_type len = length(s);
accumContent(XalanUnicode::charAmpersand);
for(XalanDOMString::size_type i = 0; i < len; ++i)
{
accumContent(s[i]);
}
accumContent(XalanUnicode::charSemicolon);
}
void
FormatterToHTML::copyEntityIntoBuffer(const XalanDOMString& s)
{
const XalanDOMString::size_type len = length(s);
accumContent(XalanUnicode::charAmpersand);
for(XalanDOMString::size_type i = 0; i < len; ++i)
{
accumContent(charAt(s, i));
}
accumContent(XalanUnicode::charSemicolon);
}
void
FormatterToHTML::processAttribute(
const XalanDOMChar* name,
const XalanDOMChar* value,
const ElemDesc& elemDesc)
{
accumContent(XalanUnicode::charSpace);
if((length(value) == 0 || equalsIgnoreCaseASCII(name, value)) &&
elemDesc.isAttrFlagSet(name, ElemDesc::ATTREMPTY) == true)
{
accumName(name);
}
else
{
accumName(name);
accumContent(XalanUnicode::charEqualsSign);
accumContent(XalanUnicode::charQuoteMark);
if(elemDesc.isAttrFlagSet(name, ElemDesc::ATTRURL) == true)
{
writeAttrURI(value);
}
else
{
writeAttrString(value);
}
accumContent(XalanUnicode::charQuoteMark);
}
}
void
FormatterToHTML::writeAttrURI(const XalanDOMChar* theString)
{
assert(theString != 0);
// http://www.ietf.org/rfc/rfc2396.txt says:
// A URI is always in an "escaped" form, since escaping or unescaping a
// completed URI might change its semantics. Normally, the only time
// escape encodings can safely be made is when the URI is being created
// from its component parts; each component may have its own set of
// characters that are reserved, so only the mechanism responsible for
// generating or interpreting that component can determine whether or
// not escaping a character will change its semantics. Likewise, a URI
// must be separated into its components before the escaped characters
// within those components can be safely decoded.
//
// ...So we do our best to do limited escaping of the URL, without
// causing damage. If the URL is already properly escaped, in theory, this
// function should not change the string value.
const XalanDOMString::size_type len = length(theString);
for (XalanDOMString::size_type i = 0; i < len; ++i)
{
const XalanDOMChar ch = theString[i];
if (ch < 33 || ch > 126)
{
if (m_escapeURLs == true)
{
// For the gory details of encoding these characters as
// UTF-8 hex, see:
//
// Unicode, A Primer, by Tony Graham, p. 92.
//
if (ch == XalanUnicode::charSpace)
{
accumContent(ch);
}
else if(ch <= 0x7F)
{
accumHexNumber(ch);
}
else if(ch <= 0x7FF)
{
const XalanDOMChar highByte = XalanDOMChar((ch >> 6) | 0xC0);
const XalanDOMChar lowByte = XalanDOMChar((ch & 0x3F) | 0x80);
accumHexNumber(highByte);
accumHexNumber(lowByte);
}
else if(isUTF16Surrogate(ch) == true) // high surrogate
{
// I'm sure this can be done in 3 instructions, but I choose
// to try and do it exactly like it is done in the book, at least
// until we are sure this is totally clean. I don't think performance
// is a big issue with this particular function, though I could be
// wrong. Also, the stuff below clearly does more masking than
// it needs to do.
// Clear high 6 bits.
const XalanDOMChar highSurrogate = XalanDOMChar(ch & 0x03FF);
// Middle 4 bits (wwww) + 1
// "Note that the value of wwww from the high surrogate bit pattern
// is incremented to make the uuuuu bit pattern in the scalar value
// so the surrogate pair don't address the BMP."
const XalanDOMChar wwww = XalanDOMChar((highSurrogate & 0x03C0) >> 6);
const XalanDOMChar uuuuu = XalanDOMChar(wwww + 1);
// next 4 bits
const XalanDOMChar zzzz = XalanDOMChar((highSurrogate & 0x003C) >> 2);
// low 2 bits
const XalanDOMChar temp = XalanDOMChar(((highSurrogate & 0x0003) << 4) & 0x30);
// Get low surrogate character.
const XalanDOMChar nextChar = theString[++i];
// Clear high 6 bits.
const XalanDOMChar lowSurrogate = XalanDOMChar(nextChar & 0x03FF);
// put the middle 4 bits into the bottom of yyyyyy (byte 3)
const XalanDOMChar yyyyyy = XalanDOMChar(temp | ((lowSurrogate & 0x03C0) >> 6));
// bottom 6 bits.
const XalanDOMChar xxxxxx = XalanDOMChar(lowSurrogate & 0x003F);
const XalanDOMChar byte1 = XalanDOMChar(0xF0 | (uuuuu >> 2)); // top 3 bits of uuuuu
const XalanDOMChar byte2 = XalanDOMChar(0x80 | (((uuuuu & 0x03) << 4) & 0x30) | zzzz);
const XalanDOMChar byte3 = XalanDOMChar(0x80 | yyyyyy);
const XalanDOMChar byte4 = XalanDOMChar(0x80 | xxxxxx);
accumHexNumber(byte1);
accumHexNumber(byte2);
accumHexNumber(byte3);
accumHexNumber(byte4);
}
else
{
const XalanDOMChar highByte = XalanDOMChar((ch >> 12) | 0xE0);
const XalanDOMChar middleByte = XalanDOMChar(((ch & 0x0FC0) >> 6) | 0x80);
const XalanDOMChar lowByte = XalanDOMChar((ch & 0x3F) | 0x80);
accumHexNumber(highByte);
accumHexNumber(middleByte);
accumHexNumber(lowByte);
}
}
else if (ch < m_maxCharacter)
{
accumContent(ch);
}
else
{
accumContent(XalanUnicode::charAmpersand);
accumContent(XalanUnicode::charNumberSign);
accumContent(UnsignedLongToDOMString(ch, m_stringBuffer));
clear(m_stringBuffer);
accumContent(XalanUnicode::charSemicolon);
}
}
// Since http://www.ietf.org/rfc/rfc2396.txt refers to the URI grammar as
// not allowing quotes in the URI proper syntax, nor in the fragment
// identifier, we believe that double quotes should be escaped.
else if (ch == XalanUnicode::charQuoteMark)
{
if (m_escapeURLs == true)
{
accumContent(XalanUnicode::charPercentSign);
accumContent(XalanUnicode::charDigit_2);
accumContent(XalanUnicode::charDigit_2);
}
else
{
accumDefaultEntity(ch, i, theString, len, true);
}
}
else
{
accumContent(ch);
}
}
}
void
FormatterToHTML::accumHexNumber(const XalanDOMChar theChar)
{
accumContent(XalanUnicode::charPercentSign);
assert(length(m_stringBuffer) == 0);
UnsignedLongToHexDOMString(theChar, m_stringBuffer);
if (length(m_stringBuffer) == 1)
{
accumContent(XalanUnicode::charDigit_0);
}
accumContent(m_stringBuffer);
clear(m_stringBuffer);
}
typedef FormatterToHTML::ElementFlagsMapType ElementFlagsMapType;
typedef FormatterToHTML::ElemDesc ElemDesc;
bool
FormatterToHTML::popHasNamespace()
{
if (m_hasNamespaceStack.empty() == true)
{
return false;
}
else
{
const bool theValue = m_hasNamespaceStack.back();
m_hasNamespaceStack.pop_back();
return theValue;
}
}
bool
FormatterToHTML::pushHasNamespace(const XalanDOMChar* theElementName)
{
bool fHasNamespace = false;
if (m_prefixResolver != 0)
{
const XalanDOMString::size_type theLength = length(theElementName);
const XalanDOMString::size_type theColonIndex = indexOf(theElementName, XalanUnicode::charColon);
const XalanDOMString* thePrefix = &s_emptyString;
if (theColonIndex < theLength)
{
substring(theElementName, m_stringBuffer, 0, theColonIndex);
thePrefix = &m_stringBuffer;
}
assert(thePrefix != 0);
// Check for the namespace...
const XalanDOMString* const theNamespace =
m_prefixResolver->getNamespaceForPrefix(*thePrefix);
if (theNamespace != 0 && length(*theNamespace) != 0)
{
m_hasNamespaceStack.push_back(true);
fHasNamespace = true;
}
}
return fHasNamespace;
}
static void
initializeElementFlagsMap1(ElementFlagsMapType& theElementFlags)
{
#if defined(XALAN_NO_NAMESPACES)
typedef pair<ElementFlagsMapType::iterator, bool> PairType;
#else
typedef std::pair<ElementFlagsMapType::iterator, bool> PairType;
#endif
// HTML 4.0 loose DTD
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("BASEFONT")),
ElemDesc(0|ElemDesc::EMPTY)));
PairType theResult =
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("FRAME")),
ElemDesc(0|ElemDesc::EMPTY|ElemDesc::BLOCK)));
(*theResult.first).second.setAttr(c_wstr(XALAN_STATIC_UCODE_STRING("SRC")), ElemDesc::ATTRURL);
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("FRAMESET")),
ElemDesc(0|ElemDesc::BLOCK)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("NOFRAMES")),
ElemDesc(0|ElemDesc::BLOCK)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("ISINDEX")),
ElemDesc(0|ElemDesc::EMPTY|ElemDesc::BLOCK)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("APPLET")),
ElemDesc(0|ElemDesc::WHITESPACESENSITIVE)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("CENTER")),
ElemDesc(0|ElemDesc::BLOCK)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("DIR")),
ElemDesc(0|ElemDesc::BLOCK)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("MENU")),
ElemDesc(0|ElemDesc::BLOCK)));
// HTML 4.0 strict DTD
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("TT")),
ElemDesc(0|ElemDesc::FONTSTYLE)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("I")),
ElemDesc(0|ElemDesc::FONTSTYLE)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("B")),
ElemDesc(0|ElemDesc::FONTSTYLE)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("BIG")),
ElemDesc(0|ElemDesc::FONTSTYLE)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("SMALL")),
ElemDesc(0|ElemDesc::FONTSTYLE)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("EM")),
ElemDesc(0|ElemDesc::PHRASE)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("STRONG")),
ElemDesc(0|ElemDesc::PHRASE)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("DFN")),
ElemDesc(0|ElemDesc::PHRASE)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("CODE")),
ElemDesc(0|ElemDesc::PHRASE)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("SAMP")),
ElemDesc(0|ElemDesc::PHRASE)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("KBD")),
ElemDesc(0|ElemDesc::PHRASE)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("VAR")),
ElemDesc(0|ElemDesc::PHRASE)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("CITE")),
ElemDesc(0|ElemDesc::PHRASE)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("ABBR")),
ElemDesc(0|ElemDesc::PHRASE)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("ACRONYM")),
ElemDesc(0|ElemDesc::PHRASE)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("SUP")),
ElemDesc(0|ElemDesc::SPECIAL|ElemDesc::ASPECIAL)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("SUB")),
ElemDesc(0|ElemDesc::SPECIAL|ElemDesc::ASPECIAL)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("SPAN")),
ElemDesc(0|ElemDesc::SPECIAL|ElemDesc::ASPECIAL)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("BDO")),
ElemDesc(0|ElemDesc::SPECIAL|ElemDesc::ASPECIAL)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("BR")),
ElemDesc(0|ElemDesc::SPECIAL|ElemDesc::ASPECIAL|ElemDesc::EMPTY|ElemDesc::BLOCK)));
}
static void
initializeElementFlagsMap2(ElementFlagsMapType& theElementFlags)
{
#if defined(XALAN_NO_NAMESPACES)
typedef pair<ElementFlagsMapType::iterator, bool> PairType;
#else
typedef std::pair<ElementFlagsMapType::iterator, bool> PairType;
#endif
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("BODY")),
ElemDesc(0|ElemDesc::BLOCK)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("ADDRESS")),
ElemDesc(0|ElemDesc::BLOCK|ElemDesc::BLOCKFORM|ElemDesc::BLOCKFORMFIELDSET)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("DIV")),
ElemDesc(0|ElemDesc::BLOCK|ElemDesc::BLOCKFORM|ElemDesc::BLOCKFORMFIELDSET)));
PairType theResult =
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("A")),
ElemDesc(0|ElemDesc::SPECIAL)));
(*theResult.first).second.setAttr(c_wstr(XALAN_STATIC_UCODE_STRING("HREF")), ElemDesc::ATTRURL);
(*theResult.first).second.setAttr(c_wstr(XALAN_STATIC_UCODE_STRING("NAME")), ElemDesc::ATTRURL);
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("MAP")),
ElemDesc(0|ElemDesc::SPECIAL|ElemDesc::ASPECIAL|ElemDesc::BLOCK)));
theResult =
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("AREA")),
ElemDesc(0|ElemDesc::EMPTY|ElemDesc::BLOCK)));
(*theResult.first).second.setAttr(c_wstr(XALAN_STATIC_UCODE_STRING("HREF")), ElemDesc::ATTRURL);
(*theResult.first).second.setAttr(c_wstr(XALAN_STATIC_UCODE_STRING("NOHREF")), ElemDesc::ATTREMPTY);
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("LINK")),
ElemDesc(0|ElemDesc::HEADMISC|ElemDesc::EMPTY|ElemDesc::BLOCK)));
theResult =
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("IMG")),
ElemDesc(0|ElemDesc::SPECIAL|ElemDesc::ASPECIAL|ElemDesc::EMPTY|ElemDesc::WHITESPACESENSITIVE)));
(*theResult.first).second.setAttr(c_wstr(XALAN_STATIC_UCODE_STRING("SRC")), ElemDesc::ATTRURL);
(*theResult.first).second.setAttr(c_wstr(XALAN_STATIC_UCODE_STRING("LONGDESC")), ElemDesc::ATTRURL);
(*theResult.first).second.setAttr(c_wstr(XALAN_STATIC_UCODE_STRING("USEMAP")), ElemDesc::ATTRURL);
(*theResult.first).second.setAttr(c_wstr(XALAN_STATIC_UCODE_STRING("ISMAP")), ElemDesc::ATTREMPTY);
theResult =
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("OBJECT")),
ElemDesc(0|ElemDesc::SPECIAL|ElemDesc::ASPECIAL|ElemDesc::HEADMISC|ElemDesc::WHITESPACESENSITIVE)));
(*theResult.first).second.setAttr(c_wstr(XALAN_STATIC_UCODE_STRING("CLASSID")), ElemDesc::ATTRURL);
(*theResult.first).second.setAttr(c_wstr(XALAN_STATIC_UCODE_STRING("CODEBASE")), ElemDesc::ATTRURL);
(*theResult.first).second.setAttr(c_wstr(XALAN_STATIC_UCODE_STRING("DATA")), ElemDesc::ATTRURL);
(*theResult.first).second.setAttr(c_wstr(XALAN_STATIC_UCODE_STRING("ARCHIVE")), ElemDesc::ATTRURL);
(*theResult.first).second.setAttr(c_wstr(XALAN_STATIC_UCODE_STRING("USEMAP")), ElemDesc::ATTRURL);
(*theResult.first).second.setAttr(c_wstr(XALAN_STATIC_UCODE_STRING("DECLARE")), ElemDesc::ATTREMPTY);
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("PARAM")),
ElemDesc(0|ElemDesc::EMPTY)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("HR")),
ElemDesc(0|ElemDesc::BLOCK|ElemDesc::BLOCKFORM|ElemDesc::BLOCKFORMFIELDSET|ElemDesc::EMPTY)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("P")),
ElemDesc(0|ElemDesc::BLOCK|ElemDesc::BLOCKFORM|ElemDesc::BLOCKFORMFIELDSET)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("H1")),
ElemDesc(0|ElemDesc::HEAD|ElemDesc::BLOCK)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("H2")),
ElemDesc(0|ElemDesc::HEAD|ElemDesc::BLOCK)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("H3")),
ElemDesc(0|ElemDesc::HEAD|ElemDesc::BLOCK)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("H4")),
ElemDesc(0|ElemDesc::HEAD|ElemDesc::BLOCK)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("H5")),
ElemDesc(0|ElemDesc::HEAD|ElemDesc::BLOCK)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("H6")),
ElemDesc(0|ElemDesc::HEAD|ElemDesc::BLOCK)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("PRE")),
ElemDesc(0|ElemDesc::PREFORMATTED|ElemDesc::BLOCK)));
}
static void
initializeElementFlagsMap3(ElementFlagsMapType& theElementFlags)
{
#if defined(XALAN_NO_NAMESPACES)
typedef pair<ElementFlagsMapType::iterator, bool> PairType;
#else
typedef std::pair<ElementFlagsMapType::iterator, bool> PairType;
#endif
PairType theResult =
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("Q")),
ElemDesc(0|ElemDesc::SPECIAL|ElemDesc::ASPECIAL)));
(*theResult.first).second.setAttr(c_wstr(XALAN_STATIC_UCODE_STRING("CITE")), ElemDesc::ATTRURL);
theResult =
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("BLOCKQUOTE")),
ElemDesc(0|ElemDesc::BLOCK|ElemDesc::BLOCKFORM|ElemDesc::BLOCKFORMFIELDSET)));
(*theResult.first).second.setAttr(c_wstr(XALAN_STATIC_UCODE_STRING("CITE")), ElemDesc::ATTRURL);
theResult =
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("INS")),
ElemDesc(0)));
(*theResult.first).second.setAttr(c_wstr(XALAN_STATIC_UCODE_STRING("CITE")), ElemDesc::ATTRURL);
theResult =
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("DEL")),
ElemDesc(0)));
(*theResult.first).second.setAttr(c_wstr(XALAN_STATIC_UCODE_STRING("CITE")), ElemDesc::ATTRURL);
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("DL")),
ElemDesc(0|ElemDesc::BLOCK|ElemDesc::BLOCKFORM|ElemDesc::BLOCKFORMFIELDSET)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("DT")),
ElemDesc(0|ElemDesc::BLOCK)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("DD")),
ElemDesc(0|ElemDesc::BLOCK)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("OL")),
ElemDesc(0|ElemDesc::LIST|ElemDesc::BLOCK)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("UL")),
ElemDesc(0|ElemDesc::LIST|ElemDesc::BLOCK)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("LI")),
ElemDesc(0|ElemDesc::BLOCK)));
theResult =
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("FORM")),
ElemDesc(0|ElemDesc::BLOCK)));
(*theResult.first).second.setAttr(c_wstr(XALAN_STATIC_UCODE_STRING("ACTION")), ElemDesc::ATTRURL);
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("LABEL")),
ElemDesc(0|ElemDesc::FORMCTRL)));
theResult =
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("INPUT")),
ElemDesc(0|ElemDesc::FORMCTRL|ElemDesc::INLINELABEL|ElemDesc::EMPTY)));
(*theResult.first).second.setAttr(c_wstr(XALAN_STATIC_UCODE_STRING("SRC")), ElemDesc::ATTRURL);
(*theResult.first).second.setAttr(c_wstr(XALAN_STATIC_UCODE_STRING("USEMAP")), ElemDesc::ATTRURL);
(*theResult.first).second.setAttr(c_wstr(XALAN_STATIC_UCODE_STRING("CHECKED")), ElemDesc::ATTREMPTY);
(*theResult.first).second.setAttr(c_wstr(XALAN_STATIC_UCODE_STRING("DISABLED")), ElemDesc::ATTREMPTY);
(*theResult.first).second.setAttr(c_wstr(XALAN_STATIC_UCODE_STRING("ISMAP")), ElemDesc::ATTREMPTY);
(*theResult.first).second.setAttr(c_wstr(XALAN_STATIC_UCODE_STRING("READONLY")), ElemDesc::ATTREMPTY);
theResult =
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("SELECT")),
ElemDesc(0|ElemDesc::FORMCTRL|ElemDesc::INLINELABEL)));
(*theResult.first).second.setAttr(c_wstr(XALAN_STATIC_UCODE_STRING("DISABLED")), ElemDesc::ATTREMPTY);
(*theResult.first).second.setAttr(c_wstr(XALAN_STATIC_UCODE_STRING("MULTIPLE")), ElemDesc::ATTREMPTY);
theResult =
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("OPTGROUP")),
ElemDesc(0)));
(*theResult.first).second.setAttr(c_wstr(XALAN_STATIC_UCODE_STRING("DISABLED")), ElemDesc::ATTREMPTY);
theResult =
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("OPTION")),
ElemDesc(0)));
(*theResult.first).second.setAttr(c_wstr(XALAN_STATIC_UCODE_STRING("DISABLED")), ElemDesc::ATTREMPTY);
(*theResult.first).second.setAttr(c_wstr(XALAN_STATIC_UCODE_STRING("SELECTED")), ElemDesc::ATTREMPTY);
theResult =
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("TEXTAREA")),
ElemDesc(0|ElemDesc::FORMCTRL|ElemDesc::INLINELABEL)));
(*theResult.first).second.setAttr(c_wstr(XALAN_STATIC_UCODE_STRING("DISABLED")), ElemDesc::ATTREMPTY);
(*theResult.first).second.setAttr(c_wstr(XALAN_STATIC_UCODE_STRING("READONLY")), ElemDesc::ATTREMPTY);
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("FIELDSET")),
ElemDesc(0|ElemDesc::BLOCK|ElemDesc::BLOCKFORM)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("LEGEND")),
ElemDesc(0)));
}
static void
initializeElementFlagsMap4(ElementFlagsMapType& theElementFlags)
{
#if defined(XALAN_NO_NAMESPACES)
typedef pair<ElementFlagsMapType::iterator, bool> PairType;
#else
typedef std::pair<ElementFlagsMapType::iterator, bool> PairType;
#endif
PairType theResult =
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("BUTTON")),
ElemDesc(0|ElemDesc::FORMCTRL|ElemDesc::INLINELABEL)));
(*theResult.first).second.setAttr(c_wstr(XALAN_STATIC_UCODE_STRING("DISABLED")), ElemDesc::ATTREMPTY);
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("TABLE")),
ElemDesc(0|ElemDesc::BLOCK|ElemDesc::BLOCKFORM|ElemDesc::BLOCKFORMFIELDSET)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("CAPTION")),
ElemDesc(0|ElemDesc::BLOCK)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("THEAD")),
ElemDesc(0|ElemDesc::BLOCK)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("TFOOT")),
ElemDesc(0|ElemDesc::BLOCK)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("TBODY")),
ElemDesc(0|ElemDesc::BLOCK)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("COLGROUP")),
ElemDesc(0|ElemDesc::BLOCK)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("COL")),
ElemDesc(0|ElemDesc::EMPTY|ElemDesc::BLOCK)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("TR")),
ElemDesc(0|ElemDesc::BLOCK)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("TH")),
ElemDesc(0)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("TD")),
ElemDesc(0)));
theResult =
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("HEAD")),
ElemDesc(0|ElemDesc::BLOCK|ElemDesc::HEADELEM)));
(*theResult.first).second.setAttr(c_wstr(XALAN_STATIC_UCODE_STRING("PROFILE")), ElemDesc::ATTRURL);
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("TITLE")),
ElemDesc(0|ElemDesc::BLOCK)));
theResult =
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("BASE")),
ElemDesc(0|ElemDesc::EMPTY|ElemDesc::BLOCK)));
(*theResult.first).second.setAttr(c_wstr(XALAN_STATIC_UCODE_STRING("HREF")), ElemDesc::ATTRURL);
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("META")),
ElemDesc(0|ElemDesc::HEADMISC|ElemDesc::EMPTY|ElemDesc::BLOCK)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("STYLE")),
ElemDesc(0|ElemDesc::HEADMISC|ElemDesc::RAW|ElemDesc::BLOCK)));
theResult =
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("SCRIPT")),
ElemDesc(0|ElemDesc::SPECIAL|ElemDesc::ASPECIAL|ElemDesc::HEADMISC|ElemDesc::RAW)));
(*theResult.first).second.setAttr(c_wstr(XALAN_STATIC_UCODE_STRING("SRC")), ElemDesc::ATTRURL);
(*theResult.first).second.setAttr(c_wstr(XALAN_STATIC_UCODE_STRING("FOR")), ElemDesc::ATTRURL);
(*theResult.first).second.setAttr(c_wstr(XALAN_STATIC_UCODE_STRING("DEFER")), ElemDesc::ATTREMPTY);
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("NOSCRIPT")),
ElemDesc(0|ElemDesc::BLOCK|ElemDesc::BLOCKFORM|ElemDesc::BLOCKFORMFIELDSET)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("HTML")),
ElemDesc(0|ElemDesc::BLOCK)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("FONT")),
ElemDesc(0 | ElemDesc::FONTSTYLE)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("S")),
ElemDesc(0 | ElemDesc::FONTSTYLE)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("STRIKE")),
ElemDesc(0 | ElemDesc::FONTSTYLE)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("U")),
ElemDesc(0 | ElemDesc::FONTSTYLE)));
theElementFlags.insert(
ElementFlagsMapType::value_type(
c_wstr(XALAN_STATIC_UCODE_STRING("NOBR")),
ElemDesc(0 | ElemDesc::FONTSTYLE)));
}
void
FormatterToHTML::initializeElementFlagsMap(ElementFlagsMapType& theElementFlags)
{
initializeElementFlagsMap1(theElementFlags);
initializeElementFlagsMap2(theElementFlags);
initializeElementFlagsMap3(theElementFlags);
initializeElementFlagsMap4(theElementFlags);
}
typedef FormatterToHTML::XalanEntityReferenceMapType XalanEntityReferenceMapType;
static void
initializeXalanEntityReferenceMap1(XalanEntityReferenceMapType& theMap)
{
typedef XalanEntityReferenceMapType::value_type value_type;
//#
//# Character markup-significant
//#
// currently handled by FormatterToXML::accumDefaultEntity
//theMap[34] = XALAN_STATIC_UCODE_STRING("quot");
//theMap[38] = XALAN_STATIC_UCODE_STRING("amp");
//theMap[60] = XALAN_STATIC_UCODE_STRING("lt");
//theMap[62] = XALAN_STATIC_UCODE_STRING("gt");
theMap[160] = XALAN_STATIC_UCODE_STRING("nbsp");
//#
//# Character ISO 8859-1 characters
//#
theMap[161] = XALAN_STATIC_UCODE_STRING("iexcl");
theMap[162] = XALAN_STATIC_UCODE_STRING("cent");
theMap[163] = XALAN_STATIC_UCODE_STRING("pound");
theMap[164] = XALAN_STATIC_UCODE_STRING("curren");
theMap[165] = XALAN_STATIC_UCODE_STRING("yen");
theMap[166] = XALAN_STATIC_UCODE_STRING("brvbar");
theMap[167] = XALAN_STATIC_UCODE_STRING("sect");
theMap[168] = XALAN_STATIC_UCODE_STRING("uml");
theMap[169] = XALAN_STATIC_UCODE_STRING("copy");
theMap[170] = XALAN_STATIC_UCODE_STRING("ordf");
theMap[171] = XALAN_STATIC_UCODE_STRING("laquo");
theMap[172] = XALAN_STATIC_UCODE_STRING("not");
theMap[173] = XALAN_STATIC_UCODE_STRING("shy");
theMap[174] = XALAN_STATIC_UCODE_STRING("reg");
theMap[175] = XALAN_STATIC_UCODE_STRING("macr");
theMap[176] = XALAN_STATIC_UCODE_STRING("deg");
theMap[177] = XALAN_STATIC_UCODE_STRING("plusmn");
theMap[178] = XALAN_STATIC_UCODE_STRING("sup2");
theMap[179] = XALAN_STATIC_UCODE_STRING("sup3");
theMap[180] = XALAN_STATIC_UCODE_STRING("acute");
theMap[181] = XALAN_STATIC_UCODE_STRING("micro");
theMap[182] = XALAN_STATIC_UCODE_STRING("para");
theMap[183] = XALAN_STATIC_UCODE_STRING("middot");
theMap[184] = XALAN_STATIC_UCODE_STRING("cedil");
theMap[185] = XALAN_STATIC_UCODE_STRING("sup1");
theMap[186] = XALAN_STATIC_UCODE_STRING("ordm");
theMap[187] = XALAN_STATIC_UCODE_STRING("raquo");
theMap[188] = XALAN_STATIC_UCODE_STRING("frac14");
theMap[189] = XALAN_STATIC_UCODE_STRING("frac12");
theMap[190] = XALAN_STATIC_UCODE_STRING("frac34");
theMap[191] = XALAN_STATIC_UCODE_STRING("iquest");
theMap[192] = XALAN_STATIC_UCODE_STRING("Agrave");
theMap[193] = XALAN_STATIC_UCODE_STRING("Aacute");
theMap[194] = XALAN_STATIC_UCODE_STRING("Acirc");
theMap[195] = XALAN_STATIC_UCODE_STRING("Atilde");
theMap[196] = XALAN_STATIC_UCODE_STRING("Auml");
theMap[197] = XALAN_STATIC_UCODE_STRING("Aring");
theMap[198] = XALAN_STATIC_UCODE_STRING("AElig");
theMap[199] = XALAN_STATIC_UCODE_STRING("Ccedil");
theMap[200] = XALAN_STATIC_UCODE_STRING("Egrave");
theMap[201] = XALAN_STATIC_UCODE_STRING("Eacute");
theMap[202] = XALAN_STATIC_UCODE_STRING("Ecirc");
theMap[203] = XALAN_STATIC_UCODE_STRING("Euml");
theMap[204] = XALAN_STATIC_UCODE_STRING("Igrave");
theMap[205] = XALAN_STATIC_UCODE_STRING("Iacute");
theMap[206] = XALAN_STATIC_UCODE_STRING("Icirc");
theMap[207] = XALAN_STATIC_UCODE_STRING("Iuml");
theMap[208] = XALAN_STATIC_UCODE_STRING("ETH");
theMap[209] = XALAN_STATIC_UCODE_STRING("Ntilde");
theMap[210] = XALAN_STATIC_UCODE_STRING("Ograve");
theMap[211] = XALAN_STATIC_UCODE_STRING("Oacute");
theMap[212] = XALAN_STATIC_UCODE_STRING("Ocirc");
theMap[213] = XALAN_STATIC_UCODE_STRING("Otilde");
theMap[214] = XALAN_STATIC_UCODE_STRING("Ouml");
theMap[215] = XALAN_STATIC_UCODE_STRING("times");
theMap[216] = XALAN_STATIC_UCODE_STRING("Oslash");
theMap[217] = XALAN_STATIC_UCODE_STRING("Ugrave");
theMap[218] = XALAN_STATIC_UCODE_STRING("Uacute");
theMap[219] = XALAN_STATIC_UCODE_STRING("Ucirc");
theMap[220] = XALAN_STATIC_UCODE_STRING("Uuml");
theMap[221] = XALAN_STATIC_UCODE_STRING("Yacute");
theMap[222] = XALAN_STATIC_UCODE_STRING("THORN");
theMap[223] = XALAN_STATIC_UCODE_STRING("szlig");
theMap[224] = XALAN_STATIC_UCODE_STRING("agrave");
theMap[225] = XALAN_STATIC_UCODE_STRING("aacute");
theMap[226] = XALAN_STATIC_UCODE_STRING("acirc");
theMap[227] = XALAN_STATIC_UCODE_STRING("atilde");
theMap[228] = XALAN_STATIC_UCODE_STRING("auml");
theMap[229] = XALAN_STATIC_UCODE_STRING("aring");
theMap[230] = XALAN_STATIC_UCODE_STRING("aelig");
theMap[231] = XALAN_STATIC_UCODE_STRING("ccedil");
theMap[232] = XALAN_STATIC_UCODE_STRING("egrave");
theMap[233] = XALAN_STATIC_UCODE_STRING("eacute");
theMap[234] = XALAN_STATIC_UCODE_STRING("ecirc");
theMap[235] = XALAN_STATIC_UCODE_STRING("euml");
theMap[236] = XALAN_STATIC_UCODE_STRING("igrave");
theMap[237] = XALAN_STATIC_UCODE_STRING("iacute");
theMap[238] = XALAN_STATIC_UCODE_STRING("icirc");
theMap[239] = XALAN_STATIC_UCODE_STRING("iuml");
theMap[240] = XALAN_STATIC_UCODE_STRING("eth");
theMap[241] = XALAN_STATIC_UCODE_STRING("ntilde");
theMap[242] = XALAN_STATIC_UCODE_STRING("ograve");
theMap[243] = XALAN_STATIC_UCODE_STRING("oacute");
theMap[244] = XALAN_STATIC_UCODE_STRING("ocirc");
theMap[245] = XALAN_STATIC_UCODE_STRING("otilde");
theMap[246] = XALAN_STATIC_UCODE_STRING("ouml");
theMap[247] = XALAN_STATIC_UCODE_STRING("divide");
theMap[248] = XALAN_STATIC_UCODE_STRING("oslash");
theMap[249] = XALAN_STATIC_UCODE_STRING("ugrave");
theMap[250] = XALAN_STATIC_UCODE_STRING("uacute");
theMap[251] = XALAN_STATIC_UCODE_STRING("ucirc");
theMap[252] = XALAN_STATIC_UCODE_STRING("uuml");
theMap[253] = XALAN_STATIC_UCODE_STRING("yacute");
theMap[254] = XALAN_STATIC_UCODE_STRING("thorn");
theMap[255] = XALAN_STATIC_UCODE_STRING("yuml");
}
static void
initializeXalanEntityReferenceMap2(XalanEntityReferenceMapType& theMap)
{
typedef XalanEntityReferenceMapType::value_type value_type;
//#
//# Character symbols, mathematical symbols,
//#
//# Latin
theMap[402] = XALAN_STATIC_UCODE_STRING("fnof");
//#
//# Greek
theMap[913] = XALAN_STATIC_UCODE_STRING("Alpha");
theMap[914] = XALAN_STATIC_UCODE_STRING("Beta");
theMap[915] = XALAN_STATIC_UCODE_STRING("Gamma");
theMap[916] = XALAN_STATIC_UCODE_STRING("Delta");
theMap[917] = XALAN_STATIC_UCODE_STRING("Epsilon");
theMap[918] = XALAN_STATIC_UCODE_STRING("Zeta");
theMap[919] = XALAN_STATIC_UCODE_STRING("Eta");
theMap[920] = XALAN_STATIC_UCODE_STRING("Theta");
theMap[921] = XALAN_STATIC_UCODE_STRING("Iota");
theMap[922] = XALAN_STATIC_UCODE_STRING("Kappa");
theMap[923] = XALAN_STATIC_UCODE_STRING("Lambda");
theMap[924] = XALAN_STATIC_UCODE_STRING("Mu");
theMap[925] = XALAN_STATIC_UCODE_STRING("Nu");
theMap[926] = XALAN_STATIC_UCODE_STRING("Xi");
theMap[927] = XALAN_STATIC_UCODE_STRING("Omicron");
theMap[928] = XALAN_STATIC_UCODE_STRING("Pi");
theMap[929] = XALAN_STATIC_UCODE_STRING("Rho");
theMap[931] = XALAN_STATIC_UCODE_STRING("Sigma");
theMap[932] = XALAN_STATIC_UCODE_STRING("Tau");
theMap[933] = XALAN_STATIC_UCODE_STRING("Upsilon");
theMap[934] = XALAN_STATIC_UCODE_STRING("Phi");
theMap[935] = XALAN_STATIC_UCODE_STRING("Chi");
theMap[936] = XALAN_STATIC_UCODE_STRING("Psi");
theMap[937] = XALAN_STATIC_UCODE_STRING("Omega");
theMap[945] = XALAN_STATIC_UCODE_STRING("alpha");
theMap[946] = XALAN_STATIC_UCODE_STRING("beta");
theMap[947] = XALAN_STATIC_UCODE_STRING("gamma");
theMap[948] = XALAN_STATIC_UCODE_STRING("delta");
theMap[949] = XALAN_STATIC_UCODE_STRING("epsilon");
theMap[950] = XALAN_STATIC_UCODE_STRING("zeta");
theMap[951] = XALAN_STATIC_UCODE_STRING("eta");
theMap[952] = XALAN_STATIC_UCODE_STRING("theta");
theMap[953] = XALAN_STATIC_UCODE_STRING("iota");
theMap[954] = XALAN_STATIC_UCODE_STRING("kappa");
theMap[955] = XALAN_STATIC_UCODE_STRING("lambda");
theMap[956] = XALAN_STATIC_UCODE_STRING("mu");
theMap[957] = XALAN_STATIC_UCODE_STRING("nu");
theMap[958] = XALAN_STATIC_UCODE_STRING("xi");
theMap[959] = XALAN_STATIC_UCODE_STRING("omicron");
theMap[960] = XALAN_STATIC_UCODE_STRING("pi");
theMap[961] = XALAN_STATIC_UCODE_STRING("rho");
theMap[962] = XALAN_STATIC_UCODE_STRING("sigmaf");
theMap[963] = XALAN_STATIC_UCODE_STRING("sigma");
theMap[964] = XALAN_STATIC_UCODE_STRING("tau");
theMap[965] = XALAN_STATIC_UCODE_STRING("upsilon");
theMap[966] = XALAN_STATIC_UCODE_STRING("phi");
theMap[967] = XALAN_STATIC_UCODE_STRING("chi");
theMap[968] = XALAN_STATIC_UCODE_STRING("psi");
theMap[969] = XALAN_STATIC_UCODE_STRING("omega");
theMap[977] = XALAN_STATIC_UCODE_STRING("thetasym");
theMap[978] = XALAN_STATIC_UCODE_STRING("upsih");
theMap[982] = XALAN_STATIC_UCODE_STRING("piv");
}
static void
initializeXalanEntityReferenceMap3(XalanEntityReferenceMapType& theMap)
{
typedef XalanEntityReferenceMapType::value_type value_type;
//#
//# General
theMap[8226] = XALAN_STATIC_UCODE_STRING("bull");
theMap[8230] = XALAN_STATIC_UCODE_STRING("hellip");
theMap[8242] = XALAN_STATIC_UCODE_STRING("prime");
theMap[8243] = XALAN_STATIC_UCODE_STRING("Prime");
theMap[8254] = XALAN_STATIC_UCODE_STRING("oline");
theMap[8260] = XALAN_STATIC_UCODE_STRING("frasl");
//#
//# Letterlike
theMap[8472] = XALAN_STATIC_UCODE_STRING("weierp");
theMap[8465] = XALAN_STATIC_UCODE_STRING("image");
theMap[8476] = XALAN_STATIC_UCODE_STRING("real");
theMap[8482] = XALAN_STATIC_UCODE_STRING("trade");
theMap[8501] = XALAN_STATIC_UCODE_STRING("alefsym");
//#
//# Arrows
theMap[8592] = XALAN_STATIC_UCODE_STRING("larr");
theMap[8593] = XALAN_STATIC_UCODE_STRING("uarr");
theMap[8594] = XALAN_STATIC_UCODE_STRING("rarr");
theMap[8595] = XALAN_STATIC_UCODE_STRING("darr");
theMap[8596] = XALAN_STATIC_UCODE_STRING("harr");
theMap[8629] = XALAN_STATIC_UCODE_STRING("crarr");
theMap[8656] = XALAN_STATIC_UCODE_STRING("lArr");
theMap[8657] = XALAN_STATIC_UCODE_STRING("uArr");
theMap[8658] = XALAN_STATIC_UCODE_STRING("rArr");
theMap[8659] = XALAN_STATIC_UCODE_STRING("dArr");
theMap[8660] = XALAN_STATIC_UCODE_STRING("hArr");
//#
//# Mathematical
theMap[8704] = XALAN_STATIC_UCODE_STRING("forall");
theMap[8706] = XALAN_STATIC_UCODE_STRING("part");
theMap[8707] = XALAN_STATIC_UCODE_STRING("exist");
theMap[8709] = XALAN_STATIC_UCODE_STRING("empty");
theMap[8711] = XALAN_STATIC_UCODE_STRING("nabla");
theMap[8712] = XALAN_STATIC_UCODE_STRING("isin");
theMap[8713] = XALAN_STATIC_UCODE_STRING("notin");
theMap[8715] = XALAN_STATIC_UCODE_STRING("ni");
theMap[8719] = XALAN_STATIC_UCODE_STRING("prod");
theMap[8721] = XALAN_STATIC_UCODE_STRING("sum");
theMap[8722] = XALAN_STATIC_UCODE_STRING("minus");
theMap[8727] = XALAN_STATIC_UCODE_STRING("lowast");
theMap[8730] = XALAN_STATIC_UCODE_STRING("radic");
theMap[8733] = XALAN_STATIC_UCODE_STRING("prop");
theMap[8734] = XALAN_STATIC_UCODE_STRING("infin");
theMap[8736] = XALAN_STATIC_UCODE_STRING("ang");
theMap[8743] = XALAN_STATIC_UCODE_STRING("and");
theMap[8744] = XALAN_STATIC_UCODE_STRING("or");
theMap[8745] = XALAN_STATIC_UCODE_STRING("cap");
theMap[8746] = XALAN_STATIC_UCODE_STRING("cup");
theMap[8747] = XALAN_STATIC_UCODE_STRING("int");
theMap[8756] = XALAN_STATIC_UCODE_STRING("there4");
theMap[8764] = XALAN_STATIC_UCODE_STRING("sim");
theMap[8773] = XALAN_STATIC_UCODE_STRING("cong");
theMap[8776] = XALAN_STATIC_UCODE_STRING("asymp");
theMap[8800] = XALAN_STATIC_UCODE_STRING("ne");
theMap[8801] = XALAN_STATIC_UCODE_STRING("equiv");
theMap[8804] = XALAN_STATIC_UCODE_STRING("le");
theMap[8805] = XALAN_STATIC_UCODE_STRING("ge");
theMap[8834] = XALAN_STATIC_UCODE_STRING("sub");
theMap[8835] = XALAN_STATIC_UCODE_STRING("sup");
theMap[8836] = XALAN_STATIC_UCODE_STRING("nsub");
theMap[8838] = XALAN_STATIC_UCODE_STRING("sube");
theMap[8839] = XALAN_STATIC_UCODE_STRING("supe");
theMap[8853] = XALAN_STATIC_UCODE_STRING("oplus");
theMap[8855] = XALAN_STATIC_UCODE_STRING("otimes");
theMap[8869] = XALAN_STATIC_UCODE_STRING("perp");
theMap[8901] = XALAN_STATIC_UCODE_STRING("sdot");
}
static void
initializeXalanEntityReferenceMap4(XalanEntityReferenceMapType& theMap)
{
typedef XalanEntityReferenceMapType::value_type value_type;
//#
//# Miscellaneous
theMap[8968] = XALAN_STATIC_UCODE_STRING("lceil");
theMap[8969] = XALAN_STATIC_UCODE_STRING("rceil");
theMap[8970] = XALAN_STATIC_UCODE_STRING("lfloor");
theMap[8971] = XALAN_STATIC_UCODE_STRING("rfloor");
theMap[9001] = XALAN_STATIC_UCODE_STRING("lang");
theMap[9002] = XALAN_STATIC_UCODE_STRING("rang");
//#
//# Geometric
theMap[9674] = XALAN_STATIC_UCODE_STRING("loz");
//#
//# Miscellaneous
theMap[9824] = XALAN_STATIC_UCODE_STRING("spades");
theMap[9827] = XALAN_STATIC_UCODE_STRING("clubs");
theMap[9829] = XALAN_STATIC_UCODE_STRING("hearts");
theMap[9830] = XALAN_STATIC_UCODE_STRING("diams");
//#
//# Character internationalization characters
//#
//# Latin
theMap[338] = XALAN_STATIC_UCODE_STRING("OElig");
theMap[339] = XALAN_STATIC_UCODE_STRING("oelig");
//#
//# May not be supported Comment out???
theMap[352] = XALAN_STATIC_UCODE_STRING("Scaron");
theMap[353] = XALAN_STATIC_UCODE_STRING("scaron");
theMap[376] = XALAN_STATIC_UCODE_STRING("Yuml");
//#
//# Spacing
theMap[710] = XALAN_STATIC_UCODE_STRING("circ");
theMap[732] = XALAN_STATIC_UCODE_STRING("tilde");
//#
//# General
theMap[8194] = XALAN_STATIC_UCODE_STRING("ensp");
theMap[8195] = XALAN_STATIC_UCODE_STRING("emsp");
theMap[8201] = XALAN_STATIC_UCODE_STRING("thinsp");
theMap[8204] = XALAN_STATIC_UCODE_STRING("zwnj");
theMap[8205] = XALAN_STATIC_UCODE_STRING("zwj");
theMap[8206] = XALAN_STATIC_UCODE_STRING("lrm");
theMap[8207] = XALAN_STATIC_UCODE_STRING("rlm");
theMap[8211] = XALAN_STATIC_UCODE_STRING("ndash");
theMap[8212] = XALAN_STATIC_UCODE_STRING("mdash");
theMap[8216] = XALAN_STATIC_UCODE_STRING("lsquo");
theMap[8217] = XALAN_STATIC_UCODE_STRING("rsquo");
theMap[8218] = XALAN_STATIC_UCODE_STRING("sbquo");
theMap[8220] = XALAN_STATIC_UCODE_STRING("ldquo");
theMap[8221] = XALAN_STATIC_UCODE_STRING("rdquo");
theMap[8222] = XALAN_STATIC_UCODE_STRING("bdquo");
theMap[8224] = XALAN_STATIC_UCODE_STRING("dagger");
theMap[8225] = XALAN_STATIC_UCODE_STRING("Dagger");
theMap[8240] = XALAN_STATIC_UCODE_STRING("permil");
theMap[8249] = XALAN_STATIC_UCODE_STRING("lsaquo");
theMap[8250] = XALAN_STATIC_UCODE_STRING("rsaquo");
theMap[8364] = XALAN_STATIC_UCODE_STRING("euro");
}
void
FormatterToHTML::initializeXalanEntityReferenceMap(XalanEntityReferenceMapType& theMap)
{
initializeXalanEntityReferenceMap1(theMap);
initializeXalanEntityReferenceMap2(theMap);
initializeXalanEntityReferenceMap3(theMap);
initializeXalanEntityReferenceMap4(theMap);
}
static XalanAutoPtr<FormatterToHTML::ElementFlagsMapType> s_elementFlags;
const FormatterToHTML::ElementFlagsMapType* FormatterToHTML::s_elementFlags = 0;
static XalanAutoPtr<FormatterToHTML::XalanEntityReferenceMapType> s_xalanHTMLEntities;
const FormatterToHTML::XalanEntityReferenceMapType* FormatterToHTML::s_xalanHTMLEntities = 0;
static FormatterToHTML::XalanEntityReferenceMapType::const_iterator s_xalanHTMLEntitiesIteratorEnd;
const FormatterToHTML::XalanEntityReferenceMapType::const_iterator& FormatterToHTML::s_xalanHTMLEntitiesIteratorEnd = ::s_xalanHTMLEntitiesIteratorEnd;
static XalanAutoPtr<FormatterToHTML::ElemDesc> s_dummyDesc;
const FormatterToHTML::ElemDesc* FormatterToHTML::s_dummyDesc = 0;
static XalanDOMString s_doctypeHeaderStartString;
static XalanDOMString s_doctypeHeaderPublicString;
static XalanDOMString s_doctypeHeaderSystemString;
static XalanDOMString s_scriptString;
static XalanDOMString s_styleString;
static XalanDOMString s_ampString;
static XalanDOMString s_fnofString;
static XalanDOMString s_metaString;
const XalanDOMString& FormatterToHTML::s_doctypeHeaderStartString =
::s_doctypeHeaderStartString;
const XalanDOMString& FormatterToHTML::s_doctypeHeaderPublicString =
::s_doctypeHeaderPublicString;
const XalanDOMString& FormatterToHTML::s_doctypeHeaderSystemString =
::s_doctypeHeaderSystemString;
const XalanDOMString& FormatterToHTML::s_scriptString =
::s_scriptString;
const XalanDOMString& FormatterToHTML::s_styleString =
::s_styleString;
const XalanDOMString& FormatterToHTML::s_fnofString =
::s_fnofString;
const XalanDOMString& FormatterToHTML::s_metaString =
::s_metaString;
void
FormatterToHTML::initialize()
{
// Make sure there's nothing there first...
::s_elementFlags.reset();
::s_xalanHTMLEntities.reset();
::s_dummyDesc.reset();
// New everything in a local so that an exception will clean up everything...
XalanAutoPtr<ElementFlagsMapType> theElementFlags(new ElementFlagsMapType);
XalanAutoPtr<XalanEntityReferenceMapType> theHTMLEntities(new XalanEntityReferenceMapType);
XalanAutoPtr<FormatterToHTML::ElemDesc> theDummyDesc(new FormatterToHTML::ElemDesc(FormatterToHTML::ElemDesc::BLOCK));
// Do initialization...
initializeElementFlagsMap(*theElementFlags.get());
initializeXalanEntityReferenceMap(*theHTMLEntities.get());
::s_doctypeHeaderStartString = XALAN_STATIC_UCODE_STRING("<!DOCTYPE HTML");
::s_doctypeHeaderPublicString = XALAN_STATIC_UCODE_STRING(" PUBLIC \"");
::s_doctypeHeaderSystemString = XALAN_STATIC_UCODE_STRING(" SYSTEM");
::s_scriptString = XALAN_STATIC_UCODE_STRING("SCRIPT");
::s_styleString = XALAN_STATIC_UCODE_STRING("STYLE");
::s_fnofString = XALAN_STATIC_UCODE_STRING("fnof");
::s_metaString = XALAN_STATIC_UCODE_STRING("<META http-equiv=\"Content-Type\" content=\"text/html; charset=");
// Everythings cool, so let the globals own the objects...
::s_elementFlags = theElementFlags;
::s_xalanHTMLEntities = theHTMLEntities;
::s_dummyDesc = theDummyDesc;
// Update the class members...
s_elementFlags = ::s_elementFlags.get();
s_xalanHTMLEntities = ::s_xalanHTMLEntities.get();
s_dummyDesc = ::s_dummyDesc.get();
::s_xalanHTMLEntitiesIteratorEnd = ::s_xalanHTMLEntities->end();
}
void
FormatterToHTML::terminate()
{
s_elementFlags = 0;
s_xalanHTMLEntities = 0;
s_dummyDesc = 0;
::s_elementFlags.reset();
::s_xalanHTMLEntities.reset();
::s_dummyDesc.reset();
releaseMemory(::s_doctypeHeaderStartString);
releaseMemory(::s_doctypeHeaderPublicString);
releaseMemory(::s_doctypeHeaderSystemString);
releaseMemory(::s_scriptString);
releaseMemory(::s_styleString);
releaseMemory(::s_fnofString);
releaseMemory(::s_metaString);
}