X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/daa616fca06ce77df132d31eda6d1f829b449aad..9d4ca3aa8f594848a8f68140b25ec86549e12e98:/src/html/htmltag.cpp diff --git a/src/html/htmltag.cpp b/src/html/htmltag.cpp index 9b8049fdba..e725a033ab 100644 --- a/src/html/htmltag.cpp +++ b/src/html/htmltag.cpp @@ -22,11 +22,11 @@ #endif #ifndef WXPRECOMP -#include "wx/wx.h" #endif #include "wx/html/htmltag.h" #include "wx/html/htmlpars.h" +#include "wx/colour.h" #include // for vsscanf #include @@ -147,19 +147,35 @@ void wxHtmlTagsCache::QueryTag(int at, int* end1, int* end2) IMPLEMENT_CLASS(wxHtmlTag,wxObject) -wxHtmlTag::wxHtmlTag(const wxString& source, int pos, int end_pos, +wxHtmlTag::wxHtmlTag(wxHtmlTag *parent, + const wxString& source, int pos, int end_pos, wxHtmlTagsCache *cache, wxHtmlEntitiesParser *entParser) : wxObject() { + /* Setup DOM relations */ + + m_Next = NULL; + m_FirstChild = m_LastChild = NULL; + m_Parent = parent; + if (parent) + { + m_Prev = m_Parent->m_LastChild; + if (m_Prev == NULL) + m_Parent->m_FirstChild = this; + else + m_Prev->m_Next = this; + m_Parent->m_LastChild = this; + } + else + m_Prev = NULL; + + /* Find parameters and their values: */ + int i; wxChar c; // fill-in name, params and begin pos: i = pos+1; - if (source[i] == wxT('/')) - { m_Ending = TRUE; i++; } - else - m_Ending = FALSE; // find tag's name and convert it to uppercase: while ((i < end_pos) && @@ -206,7 +222,10 @@ wxHtmlTag::wxHtmlTag(const wxString& source, int pos, int end_pos, else if (state == ST_VALUE && quote == 0) { m_ParamNames.Add(pname); - m_ParamValues.Add(entParser->Parse(pvalue)); + if (entParser) + m_ParamValues.Add(entParser->Parse(pvalue)); + else + m_ParamValues.Add(pvalue); } break; } @@ -259,7 +278,10 @@ wxHtmlTag::wxHtmlTag(const wxString& source, int pos, int end_pos, // but wxHTML code relies on this... :( pvalue.MakeUpper(); } - m_ParamValues.Add(entParser->Parse(pvalue)); + if (entParser) + m_ParamValues.Add(entParser->Parse(pvalue)); + else + m_ParamValues.Add(pvalue); state = ST_BEFORE_NAME; } else @@ -277,6 +299,18 @@ wxHtmlTag::wxHtmlTag(const wxString& source, int pos, int end_pos, if (m_End2 > end_pos) m_End2 = end_pos; } +wxHtmlTag::~wxHtmlTag() +{ + wxHtmlTag *t1, *t2; + t1 = m_FirstChild; + while (t1) + { + t2 = t1->GetNextSibling(); + delete t1; + t1 = t2; + } +} + bool wxHtmlTag::HasParam(const wxString& par) const { return (m_ParamNames.Index(par, FALSE) != wxNOT_FOUND); @@ -304,6 +338,58 @@ int wxHtmlTag::ScanParam(const wxString& par, wxChar *format, void *param) const return wxSscanf(parval, format, param); } +bool wxHtmlTag::GetParamAsColour(const wxString& par, wxColour *clr) const +{ + wxString str = GetParam(par); + + if (str.IsEmpty()) return FALSE; + if (str.GetChar(0) == wxT('#')) + { + unsigned long tmp; + if (ScanParam(par, wxT("#%lX"), &tmp) != 1) + return FALSE; + *clr = wxColour((unsigned char)((tmp & 0xFF0000) >> 16), + (unsigned char)((tmp & 0x00FF00) >> 8), + (unsigned char)(tmp & 0x0000FF)); + return TRUE; + } + else + { + // Handle colours defined in HTML 4.0: + #define HTML_COLOUR(name,r,g,b) \ + if (str.IsSameAs(wxT(name), FALSE)) \ + { *clr = wxColour(r,g,b); return TRUE; } + HTML_COLOUR("black", 0x00,0x00,0x00) + HTML_COLOUR("silver", 0xC0,0xC0,0xC0) + HTML_COLOUR("gray", 0x80,0x80,0x80) + HTML_COLOUR("white", 0xFF,0xFF,0xFF) + HTML_COLOUR("maroon", 0x80,0x00,0x00) + HTML_COLOUR("red", 0xFF,0x00,0x00) + HTML_COLOUR("purple", 0x80,0x00,0x80) + HTML_COLOUR("fuchsia", 0xFF,0x00,0xFF) + HTML_COLOUR("green", 0x00,0x80,0x00) + HTML_COLOUR("lime", 0x00,0xFF,0x00) + HTML_COLOUR("olive", 0x80,0x80,0x00) + HTML_COLOUR("yellow", 0xFF,0xFF,0x00) + HTML_COLOUR("navy", 0x00,0x00,0x80) + HTML_COLOUR("blue", 0x00,0x00,0xFF) + HTML_COLOUR("teal", 0x00,0x80,0x80) + HTML_COLOUR("aqua", 0x00,0xFF,0xFF) + #undef HTML_COLOUR + } + + return FALSE; +} + +bool wxHtmlTag::GetParamAsInt(const wxString& par, int *clr) const +{ + if (!HasParam(par)) return FALSE; + long i; + bool succ = GetParam(par).ToLong(&i); + *clr = (int)i; + return succ; +} + wxString wxHtmlTag::GetAllParams() const { // VS: this function is for backward compatiblity only, @@ -322,4 +408,41 @@ wxString wxHtmlTag::GetAllParams() const return s; } +wxHtmlTag *wxHtmlTag::GetFirstSibling() const +{ + if (m_Parent) + return m_Parent->m_FirstChild; + else + { + wxHtmlTag *cur = (wxHtmlTag*)this; + while (cur->m_Prev) + cur = cur->m_Prev; + return cur; + } +} + +wxHtmlTag *wxHtmlTag::GetLastSibling() const +{ + if (m_Parent) + return m_Parent->m_LastChild; + else + { + wxHtmlTag *cur = (wxHtmlTag*)this; + while (cur->m_Next) + cur = cur->m_Next; + return cur; + } +} + +wxHtmlTag *wxHtmlTag::GetNextTag() const +{ + if (m_FirstChild) return m_FirstChild; + if (m_Next) return m_Next; + wxHtmlTag *cur = m_Parent; + if (!cur) return NULL; + while (cur->m_Parent && !cur->m_Next) + cur = cur->m_Parent; + return cur->m_Next; +} + #endif