X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/14d36de822b56374abeac03d4d7354784b6bb955..cda66071f17f062779a7009065e5ff7dd958440b:/src/html/htmltag.cpp diff --git a/src/html/htmltag.cpp b/src/html/htmltag.cpp index 8848884e57..0d71df7cf7 100644 --- a/src/html/htmltag.cpp +++ b/src/html/htmltag.cpp @@ -9,7 +9,7 @@ #ifdef __GNUG__ -#pragma implementation +#pragma implementation "htmltag.h" #endif #include "wx/wxprec.h" @@ -17,7 +17,7 @@ #include "wx/defs.h" #if wxUSE_HTML -#ifdef __BORDLANDC__ +#ifdef __BORLANDC__ #pragma hdrstop #endif @@ -57,6 +57,12 @@ IMPLEMENT_CLASS(wxHtmlTagsCache,wxObject) #define CACHE_INCREMENT 64 +bool wxIsCDATAElement(const wxChar *tag) +{ + return (wxStrcmp(tag, _T("SCRIPT")) == 0) || + (wxStrcmp(tag, _T("STYLE")) == 0); +} + wxHtmlTagsCache::wxHtmlTagsCache(const wxString& source) { const wxChar *src = source.c_str(); @@ -78,9 +84,9 @@ wxHtmlTagsCache::wxHtmlTagsCache(const wxString& source) tg = m_CacheSize++; m_Cache[tg].Key = stpos = pos++; - size_t i; + int i; for ( i = 0; - pos < lng && i < WXSIZEOF(tagBuffer) - 1 && + pos < lng && i < (int)WXSIZEOF(tagBuffer) - 1 && src[pos] != wxT('>') && !wxIsspace(src[pos]); i++, pos++ ) { @@ -108,6 +114,49 @@ wxHtmlTagsCache::wxHtmlTagsCache(const wxString& source) else { 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] != '<') { + // cast to wxChar needed to suppress warning in + // Unicode build + if ((wxChar)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; + } + } + } } }