]>
git.saurik.com Git - wxWidgets.git/blob - src/html/htmlpars.cpp
1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxHtmlParser class (generic parser)
4 // Author: Vaclav Slavik
6 // Copyright: (c) 1999 Vaclav Slavik
7 // Licence: wxWindows Licence
8 /////////////////////////////////////////////////////////////////////////////
12 #pragma implementation
15 #include "wx/wxprec.h"
18 #if wxUSE_HTML && wxUSE_STREAMS
28 #include "wx/tokenzr.h"
29 #include "wx/wfstream.h"
31 #include "wx/html/htmldefs.h"
32 #include "wx/html/htmlpars.h"
36 //-----------------------------------------------------------------------------
38 //-----------------------------------------------------------------------------
40 IMPLEMENT_ABSTRACT_CLASS(wxHtmlParser
,wxObject
)
43 wxObject
* wxHtmlParser::Parse(const wxString
& source
)
49 result
= GetProduct();
54 void wxHtmlParser::InitParser(const wxString
& source
)
59 void wxHtmlParser::DoneParser()
65 void wxHtmlParser::SetSource(const wxString
& src
)
69 m_Cache
= new wxHtmlTagsCache(m_Source
);
72 void wxHtmlParser::DoParsing(int begin_pos
, int end_pos
)
74 if (end_pos
<= begin_pos
) return;
77 char *temp
= new char[end_pos
- begin_pos
+ 1];
86 c
= m_Source
[(unsigned int) i
];
88 // continue building word:
97 wxHtmlTag
tag(m_Source
, i
, end_pos
, m_Cache
);
106 if (tag
.HasEnding()) i
= tag
.GetEndPos2();
107 else i
= tag
.GetBeginPos();
112 { // last word of block :-(
119 void wxHtmlParser::AddTag(const wxHtmlTag
& tag
)
124 h
= (wxHtmlTagHandler
*) m_HandlersHash
.Get(tag
.GetName());
126 inner
= h
->HandleTag(tag
);
130 DoParsing(tag
.GetBeginPos(), tag
.GetEndPos1());
134 void wxHtmlParser::AddTagHandler(wxHtmlTagHandler
*handler
)
136 wxString
s(handler
->GetSupportedTags());
137 wxStringTokenizer
tokenizer(s
, ", ");
139 while (tokenizer
.HasMoreTokens())
140 m_HandlersHash
.Put(tokenizer
.NextToken(), handler
);
142 if (m_HandlersList
.IndexOf(handler
) == wxNOT_FOUND
)
143 m_HandlersList
.Append(handler
);
145 handler
->SetParser(this);
148 void wxHtmlParser::PushTagHandler(wxHtmlTagHandler
*handler
, wxString tags
)
150 wxStringTokenizer
tokenizer(tags
, ", ");
153 if (m_HandlersStack
== NULL
)
155 m_HandlersStack
= new wxList
;
156 m_HandlersStack
->DeleteContents(TRUE
);
159 m_HandlersStack
->Insert(new wxHashTable(m_HandlersHash
));
161 while (tokenizer
.HasMoreTokens())
163 key
= tokenizer
.NextToken();
164 m_HandlersHash
.Delete(key
);
165 m_HandlersHash
.Put(key
, handler
);
169 void wxHtmlParser::PopTagHandler()
173 if (m_HandlersStack
== NULL
||
174 (first
= m_HandlersStack
->GetFirst()) == NULL
)
176 wxLogWarning(_("Warning: attempt to remove HTML tag handler from empty stack."));
179 m_HandlersHash
= *((wxHashTable
*) first
->GetData());
180 m_HandlersStack
->DeleteNode(first
);
183 wxHtmlParser::~wxHtmlParser()
185 if (m_HandlersStack
) delete m_HandlersStack
;
186 m_HandlersHash
.Clear();
187 m_HandlersList
.DeleteContents(TRUE
);
188 m_HandlersList
.Clear();
191 //-----------------------------------------------------------------------------
193 //-----------------------------------------------------------------------------
195 IMPLEMENT_ABSTRACT_CLASS(wxHtmlTagHandler
,wxObject
)