1/////////////////////////////////////////////////////////////////////////////
2// Name:        htmltag.h
3// Purpose:     wxHtmlTag class (represents single tag)
4// Author:      Vaclav Slavik
5// RCS-ID:      $Id: htmltag.h 49563 2007-10-31 20:46:21Z VZ $
6// Copyright:   (c) 1999 Vaclav Slavik
7// Licence:     wxWindows licence
8/////////////////////////////////////////////////////////////////////////////
9
10#ifndef _WX_HTMLTAG_H_
11#define _WX_HTMLTAG_H_
12
13#include "wx/defs.h"
14
15#if wxUSE_HTML
16
17#include "wx/object.h"
18#include "wx/arrstr.h"
19
20class WXDLLIMPEXP_FWD_CORE wxColour;
21class WXDLLIMPEXP_FWD_HTML wxHtmlEntitiesParser;
22
23//-----------------------------------------------------------------------------
24// wxHtmlTagsCache
25//          - internal wxHTML class, do not use!
26//-----------------------------------------------------------------------------
27
28struct wxHtmlCacheItem;
29
30class WXDLLIMPEXP_HTML wxHtmlTagsCache : public wxObject
31{
32    DECLARE_DYNAMIC_CLASS(wxHtmlTagsCache)
33
34private:
35    wxHtmlCacheItem *m_Cache;
36    int m_CacheSize;
37    int m_CachePos;
38
39public:
40    wxHtmlTagsCache() : wxObject() {m_CacheSize = 0; m_Cache = NULL;}
41    wxHtmlTagsCache(const wxString& source);
42    virtual ~wxHtmlTagsCache() {free(m_Cache);}
43
44    // Finds parameters for tag starting at at and fills the variables
45    void QueryTag(int at, int* end1, int* end2);
46
47    DECLARE_NO_COPY_CLASS(wxHtmlTagsCache)
48};
49
50
51//--------------------------------------------------------------------------------
52// wxHtmlTag
53//                  This represents single tag. It is used as internal structure
54//                  by wxHtmlParser.
55//--------------------------------------------------------------------------------
56
57class WXDLLIMPEXP_HTML wxHtmlTag : public wxObject
58{
59    DECLARE_CLASS(wxHtmlTag)
60
61protected:
62    // constructs wxHtmlTag object based on HTML tag.
63    // The tag begins (with '<' character) at position pos in source
64    // end_pos is position where parsing ends (usually end of document)
65    wxHtmlTag(wxHtmlTag *parent,
66              const wxString& source, int pos, int end_pos,
67              wxHtmlTagsCache *cache,
68              wxHtmlEntitiesParser *entParser);
69    friend class wxHtmlParser;
70public:
71    virtual ~wxHtmlTag();
72
73    wxHtmlTag *GetParent() const {return m_Parent;}
74    wxHtmlTag *GetFirstSibling() const;
75    wxHtmlTag *GetLastSibling() const;
76    wxHtmlTag *GetChildren() const { return m_FirstChild; }
77    wxHtmlTag *GetPreviousSibling() const { return m_Prev; }
78    wxHtmlTag *GetNextSibling() const {return m_Next; }
79    // Return next tag, as if tree had been flattened
80    wxHtmlTag *GetNextTag() const;
81
82    // Returns tag's name in uppercase.
83    inline wxString GetName() const {return m_Name;}
84
85    // Returns true if the tag has given parameter. Parameter
86    // should always be in uppercase.
87    // Example : <IMG SRC="test.jpg"> HasParam("SRC") returns true
88    bool HasParam(const wxString& par) const;
89
90    // Returns value of the param. Value is in uppercase unless it is
91    // enclosed with "
92    // Example : <P align=right> GetParam("ALIGN") returns (RIGHT)
93    //           <P IMG SRC="WhaT.jpg"> GetParam("SRC") returns (WhaT.jpg)
94    //                           (or ("WhaT.jpg") if with_commas == true)
95    wxString GetParam(const wxString& par, bool with_commas = false) const;
96
97    // Convenience functions:
98    bool GetParamAsColour(const wxString& par, wxColour *clr) const;
99    bool GetParamAsInt(const wxString& par, int *clr) const;
100
101    // Scans param like scanf() functions family does.
102    // Example : ScanParam("COLOR", "\"#%X\"", &clr);
103    // This is always with with_commas=false
104    // Returns number of scanned values
105    // (like sscanf() does)
106    // NOTE: unlike scanf family, this function only accepts
107    //       *one* parameter !
108    int ScanParam(const wxString& par, const wxChar *format, void *param) const;
109
110    // Returns string containing all params.
111    wxString GetAllParams() const;
112
113    // return true if this there is matching ending tag
114    inline bool HasEnding() const {return m_End1 >= 0;}
115
116    // returns beginning position of _internal_ block of text
117    // See explanation (returned value is marked with *):
118    // bla bla bla <MYTAG>* bla bla intenal text</MYTAG> bla bla
119    inline int GetBeginPos() const {return m_Begin;}
120    // returns ending position of _internal_ block of text.
121    // bla bla bla <MYTAG> bla bla intenal text*</MYTAG> bla bla
122    inline int GetEndPos1() const {return m_End1;}
123    // returns end position 2 :
124    // bla bla bla <MYTAG> bla bla internal text</MYTAG>* bla bla
125    inline int GetEndPos2() const {return m_End2;}
126
127private:
128    wxString m_Name;
129    int m_Begin, m_End1, m_End2;
130    wxArrayString m_ParamNames, m_ParamValues;
131
132    // DOM tree relations:
133    wxHtmlTag *m_Next;
134    wxHtmlTag *m_Prev;
135    wxHtmlTag *m_FirstChild, *m_LastChild;
136    wxHtmlTag *m_Parent;
137
138    DECLARE_NO_COPY_CLASS(wxHtmlTag)
139};
140
141
142
143
144
145#endif
146
147#endif // _WX_HTMLTAG_H_
148
149