fixed parsing of CDATA elements (<script> and <style>) (Bill Nalen)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@19287 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -127,6 +127,8 @@ void wxHtmlParser::CreateDOMTree()
|
|||||||
m_CurTextPiece = 0;
|
m_CurTextPiece = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern bool wxIsCDATAElement(const wxChar *tag);
|
||||||
|
|
||||||
void wxHtmlParser::CreateDOMSubTree(wxHtmlTag *cur,
|
void wxHtmlParser::CreateDOMSubTree(wxHtmlTag *cur,
|
||||||
int begin_pos, int end_pos,
|
int begin_pos, int end_pos,
|
||||||
wxHtmlTagsCache *cache)
|
wxHtmlTagsCache *cache)
|
||||||
@@ -137,6 +139,15 @@ void wxHtmlParser::CreateDOMSubTree(wxHtmlTag *cur,
|
|||||||
int i = begin_pos;
|
int i = begin_pos;
|
||||||
int textBeginning = begin_pos;
|
int textBeginning = begin_pos;
|
||||||
|
|
||||||
|
// If the tag contains CDATA text, we include the text between beginning
|
||||||
|
// and ending tag verbosely. Setting i=end_pos will skip to the very
|
||||||
|
// end of this function where text piece is added, bypassing any child
|
||||||
|
// tags parsing (CDATA element can't have child elements by definition):
|
||||||
|
if (cur != NULL && wxIsCDATAElement(cur->GetName().c_str()))
|
||||||
|
{
|
||||||
|
i = end_pos;
|
||||||
|
}
|
||||||
|
|
||||||
while (i < end_pos)
|
while (i < end_pos)
|
||||||
{
|
{
|
||||||
c = m_Source.GetChar(i);
|
c = m_Source.GetChar(i);
|
||||||
@@ -209,6 +220,7 @@ void wxHtmlParser::CreateDOMSubTree(wxHtmlTag *cur,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
i = chd->GetBeginPos();
|
i = chd->GetBeginPos();
|
||||||
|
|
||||||
textBeginning = i;
|
textBeginning = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -57,6 +57,12 @@ IMPLEMENT_CLASS(wxHtmlTagsCache,wxObject)
|
|||||||
|
|
||||||
#define CACHE_INCREMENT 64
|
#define CACHE_INCREMENT 64
|
||||||
|
|
||||||
|
inline bool wxIsCDATAElement(const wxChar *tag)
|
||||||
|
{
|
||||||
|
return (wxStrcmp(tag, _T("SCRIPT")) == 0) ||
|
||||||
|
(wxStrcmp(tag, _T("STYLE")) == 0);
|
||||||
|
}
|
||||||
|
|
||||||
wxHtmlTagsCache::wxHtmlTagsCache(const wxString& source)
|
wxHtmlTagsCache::wxHtmlTagsCache(const wxString& source)
|
||||||
{
|
{
|
||||||
const wxChar *src = source.c_str();
|
const wxChar *src = source.c_str();
|
||||||
@@ -108,6 +114,47 @@ wxHtmlTagsCache::wxHtmlTagsCache(const wxString& source)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_Cache[tg].End1 = m_Cache[tg].End2 = -1;
|
m_Cache[tg].End1 = m_Cache[tg].End2 = -1;
|
||||||
|
|
||||||
|
if (wxIsCDATAElement(tagBuffer))
|
||||||
|
{
|
||||||
|
// find next matching tag
|
||||||
|
int tag_len = wxStrlen(tagBuffer);
|
||||||
|
while (pos < lng)
|
||||||
|
{
|
||||||
|
// find the ending tag
|
||||||
|
while (pos + 1 < lng &&
|
||||||
|
(src[pos] != '<' || src[pos+1] != '/'))
|
||||||
|
++pos;
|
||||||
|
if (src[pos] == '<')
|
||||||
|
++pos;
|
||||||
|
|
||||||
|
// see if it matches
|
||||||
|
int match_pos = 0;
|
||||||
|
while (pos < lng && match_pos < tag_len && src[pos] != '>' && src[pos] != '<') {
|
||||||
|
if (wxToupper(src[pos]) == tagBuffer[match_pos]) {
|
||||||
|
++match_pos;
|
||||||
|
}
|
||||||
|
else if (src[pos] == wxT(' ') || src[pos] == wxT('\n') ||
|
||||||
|
src[pos] == wxT('\r') || src[pos] == wxT('\t')) {
|
||||||
|
// need to skip over these
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
match_pos = 0;
|
||||||
|
}
|
||||||
|
++pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
// found a match
|
||||||
|
if (match_pos == tag_len) {
|
||||||
|
pos = pos - tag_len - 3;
|
||||||
|
stpos = pos;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
++pos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user