X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/223d09f6b523aac674ef9b72a883dfa8d37c5d4e..4b1f6faaa2c062d0797ae85c66ebe2c927946992:/src/html/htmlpars.cpp diff --git a/src/html/htmlpars.cpp b/src/html/htmlpars.cpp index d3f772440f..ab88ab7d46 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" @@ -51,53 +51,53 @@ wxObject* wxHtmlParser::Parse(const wxString& source) return result; } - - void wxHtmlParser::InitParser(const wxString& source) { - m_Source = source; - m_Cache = new wxHtmlTagsCache(m_Source); + SetSource(source); } - - - + void wxHtmlParser::DoneParser() { delete m_Cache; m_Cache = NULL; } - - -#define HTML_MAX_BUFLEN 1024 +void wxHtmlParser::SetSource(const wxString& src) +{ + m_Source = src; + delete m_Cache; + m_Cache = new wxHtmlTagsCache(m_Source); +} 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; templen = 0; i = begin_pos; - while (i < end_pos) { - c = m_Source[i]; + while (i < end_pos) + { + c = m_Source[(unsigned int) i]; // continue building word: - if (c != '<') { + if (c != '<') + { temp[templen++] = c; - if (templen == HTML_BUFLEN-1) { - temp[templen] = 0; - AddText(temp); - templen = 0; - } i++; } - else if (c == '<') { + else if (c == '<') + { wxHtmlTag tag(m_Source, i, end_pos, m_Cache); - if (templen) { + if (templen) + { temp[templen] = 0; AddText(temp); templen = 0; @@ -108,14 +108,14 @@ void wxHtmlParser::DoParsing(int begin_pos, int end_pos) } } - if (templen) { // last word of block :-( + if (templen) + { // last word of block :-( temp[templen] = 0; AddText(temp); } + delete[] temp; } - - void wxHtmlParser::AddTag(const wxHtmlTag& tag) { wxHtmlTagHandler *h; @@ -123,44 +123,71 @@ void wxHtmlParser::AddTag(const wxHtmlTag& tag) h = (wxHtmlTagHandler*) m_HandlersHash.Get(tag.GetName()); if (h) - inner = h -> HandleTag(tag); - if (!inner) { + inner = h->HandleTag(tag); + if (!inner) + { if (tag.HasEnding()) DoParsing(tag.GetBeginPos(), tag.GetEndPos1()); } } - - void wxHtmlParser::AddTagHandler(wxHtmlTagHandler *handler) { - wxString s(handler -> GetSupportedTags()); + 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) m_HandlersList.Append(handler); - handler -> SetParser(this); + handler->SetParser(this); } +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(); } - - //----------------------------------------------------------------------------- // wxHtmlTagHandler //-----------------------------------------------------------------------------