#ifdef __GNUG__
-#pragma implementation
+#pragma implementation "htmltag.h"
#endif
#include "wx/wxprec.h"
#include "wx/defs.h"
#if wxUSE_HTML
-#ifdef __BORDLANDC__
+#ifdef __BORLANDC__
#pragma hdrstop
#endif
#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();
- int i, tg, pos, stpos;
+ int tg, stpos;
int lng = source.Length();
wxChar tagBuffer[256];
m_CacheSize = 0;
m_CachePos = 0;
- pos = 0;
+ int pos = 0;
while (pos < lng)
{
if (src[pos] == wxT('<')) // tag found:
tg = m_CacheSize++;
m_Cache[tg].Key = stpos = pos++;
+ 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++ )
{
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;
+ }
+ }
+ }
}
}
}
// ok, we're done, now we'll free .Name members of cache - we don't need it anymore:
- for (i = 0; i < m_CacheSize; i++)
+ for (int i = 0; i < m_CacheSize; i++)
{
delete[] m_Cache[i].Name;
m_Cache[i].Name = NULL;