- if (*p2 == 0) // found
- {
- wxString fnd = wxEmptyString;
- st2++; // '=' character
- comma = FALSE;
- comma_char = wxT('\0');
- if (!with_commas && (*(st2) == wxT('"')))
- {
- st2++;
- comma = TRUE;
- comma_char = wxT('"');
- }
- else if (!with_commas && (*(st2) == wxT('\'')))
- {
- st2++;
- comma = TRUE;
- comma_char = wxT('\'');
- }
-
- while (*st2 != 0)
- {
- if (comma && *st2 == comma_char) comma = FALSE;
- else if ((*st2 == wxT(' ')) && (!comma)) break;
- fnd += (*(st2++));
- }
- if (!with_commas && (*(st2-1) == comma_char)) fnd.RemoveLast();
- return fnd;
- }
- if (*st2 == 0) return wxEmptyString;
- if (*p2 != *st2) p2 = &invalid;
- if (*p2 == *st2) p2++;
- if (*st2 == wxT(' ')) p2 = p;
- else if (*st2 == wxT('='))
- {
- p2 = p;
- while (*st2 != wxT(' '))
- {
- if (*st2 == wxT('"'))
- {
- st2++;
- while (*st2 != wxT('"')) st2++;
- }
- else if (*st2 == wxT('\''))
- {
- st2++;
- while (*st2 != wxT('\'')) st2++;
- }
- st2++;
- }
- }
+ #define HTML_COLOUR(name, r, g, b) \
+ if (str.IsSameAs(wxS(name), false)) \
+ { clr->Set(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
+ }
+
+ // then try to parse #rrggbb representations or set from other well
+ // known names (note that this doesn't strictly conform to HTML spec,
+ // but it doesn't do real harm -- but it *must* be done after the standard
+ // colors are handled above):
+ if (clr->Set(str))
+ return true;
+
+ return false;
+}
+
+bool wxHtmlTag::GetParamAsColour(const wxString& par, wxColour *clr) const
+{
+ const wxString str = GetParam(par);
+ return !str.empty() && ParseAsColour(str, clr);
+}
+
+bool wxHtmlTag::GetParamAsInt(const wxString& par, int *clr) const
+{
+ if ( !HasParam(par) )
+ return false;
+
+ long i;
+ if ( !GetParam(par).ToLong(&i) )
+ return false;
+
+ *clr = (int)i;
+ return true;
+}
+
+bool
+wxHtmlTag::GetParamAsIntOrPercent(const wxString& par,
+ int* value,
+ bool& isPercent) const
+{
+ const wxString param = GetParam(par);
+ if ( param.empty() )
+ return false;
+
+ wxString num;
+ if ( param.EndsWith("%", &num) )
+ {
+ isPercent = true;
+ }
+ else
+ {
+ isPercent = false;
+ num = param;
+ }
+
+ long lValue;
+ if ( !num.ToLong(&lValue) )
+ return false;
+
+ if ( lValue > INT_MAX || lValue < INT_MIN )
+ return false;
+
+ *value = static_cast<int>(lValue);
+
+ return true;
+}
+
+wxString wxHtmlTag::GetAllParams() const
+{
+ // VS: this function is for backward compatibility only,
+ // never used by wxHTML
+ wxString s;
+ size_t cnt = m_ParamNames.GetCount();
+ for (size_t i = 0; i < cnt; i++)
+ {
+ s << m_ParamNames[i];
+ s << wxT('=');
+ if (m_ParamValues[i].Find(wxT('"')) != wxNOT_FOUND)
+ s << wxT('\'') << m_ParamValues[i] << wxT('\'');
+ else
+ s << wxT('"') << m_ParamValues[i] << wxT('"');