++nTagsToClose;
}
}
}
// close tags between (parent) tbody and table
while (nTagsToClose > 0)
{
nTagsToClose--;
CHTMLTagWrapper *pLastTag = m_aOpenedTag.GetAt (m_aOpenedTag.GetCount() - 1);
if (pXHTMLWriter)
pXHTMLWriter->EndTag (pLastTag);
// remove last unclosed tag from tags quene
m_aOpenedTag.RemoveAt (m_aOpenedTag.GetCount() - 1);
//delete pLastTag;
//pLastTag = NULL;
}
}
// 4. clear m_bAddSpaceCharacter flag, if new tag must to caret-return.
if (CHTMLTagWrapper::IsNewLineStarting (pTag->getTagName().MakeLower()))
{
m_bAddSpaceCharacter = false;
m_bNewLineStarted = true;
}
else
{
}
// Add unclosed tag to the opened tag quene
CHTMLTagWrapper* pTagWrapper = new CHTMLTagWrapper(pTag);
CHTMLTagWrapper* pParentTagWrapper = m_aOpenedTag.IsEmpty() ? NULL : m_aOpenedTag.GetAt (m_aOpenedTag.GetCount() - 1);
if (NULL != pParentTagWrapper)
{
pParentTagWrapper->AddChild (pTagWrapper);
}
else
{
m_pTopTagWrapper = pTagWrapper; // head of tags tree
}
pTagWrapper->setParentTag (pParentTagWrapper);
if (!CheckForbiddenTag (pTag))
{
// Write started tag
if (pXHTMLWriter)
pXHTMLWriter->StartTag (pTagWrapper, pParentTagWrapper);
}
m_aOpenedTag.Add (pTagWrapper);
// Fire event
if (pProgressEvent)
pProgressEvent->OnProgress (0, bAbort);
}
virtual void EndTag(CLiteHTMLTag *pTag, DWORD dwAppData, bool &bAbort)
{
bAbort = false;
CStringA sTagName;
sTagName = pTag->getTagName();
ATLTRACE2 ("CLiteHTMLConverter::EndTag: %s\n", sTagName);
// Check unclosed tags
size_t nLastTag = m_aOpenedTag.GetCount() - 1;
while (nLastTag > 0)
{
//
CHTMLTagWrapper* pOpenedTag = m_aOpenedTag.GetAt (nLastTag);
if (NULL != pOpenedTag)
{
//
if (pOpenedTag->Tag()->getTagName() == pTag->getTagName())
{
// ok, it's a normal situation. removing last tag and closing it in the writer
if (!CheckForbiddenTag (pOpenedTag->Tag()))
{
if (pXHTMLWriter)
pXHTMLWriter->EndTag (pOpenedTag); // XHTMLWriter->EndTag (pOpenedTag);
}
m_aOpenedTag.RemoveAt (nLastTag);
//delete pOpenedTag;
//pOpenedTag = NULL;
break;
}
else
{
// we must to close a last opened tag, because
CStringA sTagLastName;
sTagLastName = pOpenedTag->Tag()->getTagName();
ATLTRACE2 ("Converter: EndTag(): force closing last opened tag (%s)\n", sTagLastName);
if (0 == sTagLastName.CompareNoCase ("body") && 0 != sTagName.CompareNoCase("body"))
{
ATLTRACE2 ("Converter: EndTag(): force closing last opened tag, but it is the tag! skipping.\n");
break;
}
if (0 == sTagLastName.CompareNoCase ("html") && 0 != sTagName.CompareNoCase("html"))
{
ATLTRACE2 ("Converter: EndTag(): force closing last opened tag, but it is the tag! skipping.\n");
break;
}
if (!CheckForbiddenTag (pOpenedTag->Tag()))
{
if (pXHTMLWriter)
pXHTMLWriter->EndTag (pOpenedTag);
}
m_aOpenedTag.RemoveAt (nLastTag);
//delete pOpenedTag;
//pOpenedTag = NULL;
}
}
else
{
ATLTRACE2 ("Converter: EndTag(): m_aOpenedTag.GetAt() returns NULL");
break;
}
nLastTag--;
}
if (pProgressEvent)
pProgressEvent->OnProgress (0, bAbort);
}
virtual void Characters(const CString &rText, DWORD dwAppData, bool &bAbort)
{
bAbort = false;
CStringA sText;
sText = rText;
ATLTRACE2 ("CLiteHTMLConverter::Characters: %s\n", sText);
// give last opened tag and add text to tag
if (!m_aOpenedTag.IsEmpty())
{
CHTMLTagWrapper *pTag = m_aOpenedTag.GetAt (m_aOpenedTag.GetCount() - 1);
if (NULL == pTag)
{
ATLTRACE2 ("CLiteHTMLConverter::Characters: %s : fail to get last opened tag\n", sText);
m_aOpenedTag.RemoveAt (m_aOpenedTag.GetCount() - 1);
return;
}
// attach text to tag
//pTag->Tag()->addText (rText);
bool cbAutoInlineClosing = CheckAutoInlineClosing (pTag->Tag());
const bool cbForbidden = CheckForbiddenTag (pTag->Tag());
if (cbAutoInlineClosing && !cbForbidden) // this tag is "inline closed" - ex. '
' tag
{
// Attach a text to the parent tag, because it wouldn't has text
if (m_aOpenedTag.GetCount() > 1)
{
for (int nParentTag = m_aOpenedTag.GetCount() - 2; nParentTag >= 0; --nParentTag)
{
CHTMLTagWrapper *pParentTag = m_aOpenedTag[nParentTag];
const bool cbParentTagAutoInlineClosing = CheckAutoInlineClosing (pParentTag->Tag());
const bool cbParentTagForbidden = CheckForbiddenTag (pParentTag->Tag());
if (!cbParentTagAutoInlineClosing && !cbParentTagAutoInlineClosing)
{
pTag = pParentTag; // we found parent tag fot text adding
cbAutoInlineClosing = false;
break;
}
}
}
}
if (!cbAutoInlineClosing && !cbForbidden)
{
CString sTagName = pTag->Tag()->getTagName();
pTag->Tag()->addText (rText);
// check parent 'pre' tag
CHTMLTagWrapper *pParentTag = pTag;
bool bPreTag = false;
while (NULL != pParentTag)
{
bPreTag = (0 == pParentTag->Tag()->getTagName().CompareNoCase(_T("pre")));
if (bPreTag)
break;
pParentTag = pParentTag->getParentTag();
}
if (bPreTag || 0 == sTagName.CompareNoCase (_T("textarea"))) // save all tabs, enters and speces for and