X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/69941f05864fa8b37856ccc1338124bfac756a2b..f44fdfb032152a62cc0e3a4c0f09330cfab76710:/src/html/htmlpars.cpp diff --git a/src/html/htmlpars.cpp b/src/html/htmlpars.cpp index 8692fccc95..65066aeddc 100644 --- a/src/html/htmlpars.cpp +++ b/src/html/htmlpars.cpp @@ -12,17 +12,17 @@ #pragma implementation #endif -#include +#include "wx/wxprec.h" #include "wx/defs.h" -#if wxUSE_HTML +#if wxUSE_HTML && wxUSE_STREAMS #ifdef __BORDLANDC__ #pragma hdrstop #endif #ifndef WXPRECOMP -#include +#include "wx/wx.h" #endif #include "wx/tokenzr.h" @@ -69,11 +69,13 @@ void wxHtmlParser::DoneParser() -#define HTML_MAX_BUFLEN 1024 void wxHtmlParser::DoParsing(int begin_pos, int end_pos) { - char temp[HTML_BUFLEN], c; + if (end_pos <= begin_pos) return; + + char c; + char *temp = new char[end_pos - begin_pos + 1]; int i; int templen; @@ -81,16 +83,11 @@ void wxHtmlParser::DoParsing(int begin_pos, int end_pos) i = begin_pos; while (i < end_pos) { - c = m_Source[i]; + c = m_Source[(unsigned int) i]; // continue building word: if (c != '<') { temp[templen++] = c; - if (templen == HTML_BUFLEN-1) { - temp[templen] = 0; - AddText(temp); - templen = 0; - } i++; } @@ -112,6 +109,7 @@ void wxHtmlParser::DoParsing(int begin_pos, int end_pos) temp[templen] = 0; AddText(temp); } + delete[] temp; } @@ -137,11 +135,7 @@ void wxHtmlParser::AddTagHandler(wxHtmlTagHandler *handler) wxString s(handler -> GetSupportedTags()); wxStringTokenizer tokenizer(s, ", "); -#if (wxVERSION_NUMBER < 2100) - while (tokenizer.HasMoreToken()) -#else while (tokenizer.HasMoreTokens()) -#endif m_HandlersHash.Put(tokenizer.NextToken(), handler); if (m_HandlersList.IndexOf(handler) == wxNOT_FOUND) @@ -152,8 +146,46 @@ void wxHtmlParser::AddTagHandler(wxHtmlTagHandler *handler) +void wxHtmlParser::PushTagHandler(wxHtmlTagHandler *handler, wxString tags) +{ + wxStringTokenizer tokenizer(tags, ", "); + wxString key; + + if (m_HandlersStack == NULL) { + m_HandlersStack = new wxList; + m_HandlersStack -> DeleteContents(TRUE); + } + + m_HandlersStack -> Insert(new wxHashTable(m_HandlersHash)); + + while (tokenizer.HasMoreTokens()) { + key = tokenizer.NextToken(); + m_HandlersHash.Delete(key); + m_HandlersHash.Put(key, handler); + } +} + + + +void wxHtmlParser::PopTagHandler() +{ + wxNode *first; + + if (m_HandlersStack == NULL || + (first = m_HandlersStack -> GetFirst()) == NULL) + { + wxLogWarning(_("Warning: attempt to remove HTML tag handler from empty stack.")); + return; + } + m_HandlersHash = *((wxHashTable*) first -> GetData()); + m_HandlersStack -> DeleteNode(first); +} + + + wxHtmlParser::~wxHtmlParser() { + if (m_HandlersStack) delete m_HandlersStack; m_HandlersHash.Clear(); m_HandlersList.DeleteContents(TRUE); m_HandlersList.Clear(); @@ -166,5 +198,5 @@ wxHtmlParser::~wxHtmlParser() //----------------------------------------------------------------------------- IMPLEMENT_ABSTRACT_CLASS(wxHtmlTagHandler,wxObject) +#endif -#endif \ No newline at end of file