--- /dev/null
+/////////////////////////////////////////////////////////////////////////////
+// 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 <wx/wxprec.h>
+
+#include "wx/defs.h"
+#if wxUSE_HTML
+
+#ifdef __BORDLANDC__
+#pragma hdrstop
+#endif
+
+#ifndef WXPRECOMP
+#include <wx/wx.h>
+#endif
+
+#include <wx/tokenzr.h>
+#include <wx/wfstream.h>
+#include <wx/url.h>
+#include <wx/html/htmldefs.h>
+#include <wx/html/htmlparser.h>
+
+
+
+//-----------------------------------------------------------------------------
+// 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