X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/fae05df5a988883e9c6683ccded766dfb7b84b1b..5526e819eca4465ed5520d49bccfebc6a28045e0:/src/html/htmlparser.cpp diff --git a/src/html/htmlparser.cpp b/src/html/htmlparser.cpp new file mode 100644 index 0000000000..ff72c7d6cb --- /dev/null +++ b/src/html/htmlparser.cpp @@ -0,0 +1,169 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: htmlparser.cpp +// Purpose: wxHtmlParser class (generic parser) +// Author: Vaclav Slavik +// Copyright: (c) 1999 Vaclav Slavik +// Licence: wxWindows Licence +///////////////////////////////////////////////////////////////////////////// + + +#ifdef __GNUG__ +#pragma implementation +#endif + +#include + +#include "wx/defs.h" +#if wxUSE_HTML + +#ifdef __BORDLANDC__ +#pragma hdrstop +#endif + +#ifndef WXPRECOMP +#include +#endif + +#include +#include +#include +#include +#include + + + +//----------------------------------------------------------------------------- +// wxHtmlParser +//----------------------------------------------------------------------------- + +IMPLEMENT_ABSTRACT_CLASS(wxHtmlParser,wxObject) + + +wxObject* wxHtmlParser::Parse(const wxString& source) +{ + wxObject *result; + + InitParser(source); + DoParsing(); + result = GetProduct(); + DoneParser(); + return result; +} + + + +void wxHtmlParser::InitParser(const wxString& source) +{ + m_Source = source; + m_Cache = new wxHtmlTagsCache(m_Source); +} + + + +void wxHtmlParser::DoneParser() +{ + delete m_Cache; + m_Cache = NULL; +} + + + +#define HTML_MAX_BUFLEN 1024 + +void wxHtmlParser::DoParsing(int begin_pos, int end_pos) +{ + char temp[HTML_BUFLEN], c; + int i; + int templen; + + templen = 0; + i = begin_pos; + + while (i < end_pos) { + c = m_Source[i]; + + // continue building word: + if (c != '<') { + temp[templen++] = c; + if (templen == HTML_BUFLEN-1) { + temp[templen] = 0; + AddText(temp); + templen = 0; + } + i++; + } + + else if (c == '<') { + wxHtmlTag tag(m_Source, i, end_pos, m_Cache); + + if (templen) { + temp[templen] = 0; + AddText(temp); + templen = 0; + } + AddTag(tag); + if (tag.HasEnding()) i = tag.GetEndPos2(); + else i = tag.GetBeginPos(); + } + } + + if (templen) { // last word of block :-( + temp[templen] = 0; + AddText(temp); + } +} + + + +void wxHtmlParser::AddTag(const wxHtmlTag& tag) +{ + wxHtmlTagHandler *h; + bool inner = FALSE; + + h = (wxHtmlTagHandler*) m_HandlersHash.Get(tag.GetName()); + if (h) + inner = h -> HandleTag(tag); + if (!inner) { + if (tag.HasEnding()) + DoParsing(tag.GetBeginPos(), tag.GetEndPos1()); + } +} + + + +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) + m_HandlersList.Append(handler); + + handler -> SetParser(this); +} + + + +wxHtmlParser::~wxHtmlParser() +{ + m_HandlersHash.Clear(); + m_HandlersList.DeleteContents(TRUE); + m_HandlersList.Clear(); +} + + + +//----------------------------------------------------------------------------- +// wxHtmlTagHandler +//----------------------------------------------------------------------------- + +IMPLEMENT_ABSTRACT_CLASS(wxHtmlTagHandler,wxObject) + +#endif \ No newline at end of file