]>
git.saurik.com Git - wxWidgets.git/blob - src/html/htmltag.cpp
   1 ///////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     wxHtmlTag class (represents single tag) 
   4 // Author:      Vaclav Slavik 
   6 // Copyright:   (c) 1999 Vaclav Slavik 
   7 // Licence:     wxWindows Licence 
   8 ///////////////////////////////////////////////////////////////////////////// 
  12 #pragma implementation 
  15 #include "wx/wxprec.h" 
  28 #include "wx/html/htmltag.h" 
  29 #include <stdio.h> // for vsscanf 
  35 //----------------------------------------------------------------------------- 
  37 //----------------------------------------------------------------------------- 
  39 IMPLEMENT_CLASS(wxHtmlTagsCache
,wxObject
) 
  41 #define CACHE_INCREMENT  64 
  43 wxHtmlTagsCache::wxHtmlTagsCache(const wxString
& source
) 
  45     const wxChar 
*src 
= source
.c_str(); 
  46     int i
, tg
, pos
, stpos
; 
  47     int lng 
= source
.Length(); 
  56         if (src
[pos
] == wxT('<')) {  // tag found: 
  57             if (m_CacheSize 
% CACHE_INCREMENT 
== 0) 
  58                 m_Cache 
= (sCacheItem
*) realloc(m_Cache
, (m_CacheSize 
+ CACHE_INCREMENT
) * sizeof(sCacheItem
)); 
  60             m_Cache
[tg
].Key 
= stpos 
= pos
++; 
  62             while (src
[pos
] != wxT('>') && 
  63                    src
[pos
] != wxT(' ') && src
[pos
] != wxT('\r') &&  
  64                    src
[pos
] != wxT('\n') && src
[pos
] != wxT('\t')) { 
  65                 dummy
[i
] = src
[pos
++]; 
  66                 if ((dummy
[i
] >= wxT('a')) && (dummy
[i
] <= wxT('z'))) dummy
[i
] -= (wxT('a') - wxT('A')); 
  70             m_Cache
[tg
].Name 
= new wxChar
[i
+1]; 
  71             memcpy(m_Cache
[tg
].Name
, dummy
, (i
+1)*sizeof(wxChar
)); 
  73             while (src
[pos
] != wxT('>')) pos
++; 
  75             if (src
[stpos
+1] == wxT('/')) { // ending tag: 
  76                 m_Cache
[tg
].End1 
= m_Cache
[tg
].End2 
= -2; 
  77                 // find matching begin tag: 
  78                 for (i 
= tg
; i 
>= 0; i
--) 
  79                     if ((m_Cache
[i
].End1 
== -1) && (wxStrcmp(m_Cache
[i
].Name
, dummy
+1) == 0)) { 
  80                         m_Cache
[i
].End1 
= stpos
; 
  81                         m_Cache
[i
].End2 
= pos 
+ 1; 
  86                 m_Cache
[tg
].End1 
= m_Cache
[tg
].End2 
= -1; 
  93     // ok, we're done, now we'll free .Name members of cache - we don't need it anymore: 
  94     for (i 
= 0; i 
< m_CacheSize
; i
++) { 
  95         delete[] m_Cache
[i
].Name
; 
  96         m_Cache
[i
].Name 
= NULL
; 
 102 void wxHtmlTagsCache::QueryTag(int at
, int* end1
, int* end2
) 
 104     if (m_Cache 
== NULL
) return; 
 105     if (m_Cache
[m_CachePos
].Key 
!= at
) { 
 106         int delta 
= (at 
< m_Cache
[m_CachePos
].Key
) ? -1 : 1; 
 107         do {m_CachePos 
+= delta
;} while (m_Cache
[m_CachePos
].Key 
!= at
); 
 109     *end1 
= m_Cache
[m_CachePos
].End1
; 
 110     *end2 
= m_Cache
[m_CachePos
].End2
; 
 116 //----------------------------------------------------------------------------- 
 118 //----------------------------------------------------------------------------- 
 120 IMPLEMENT_CLASS(wxHtmlTag
,wxObject
) 
 122 wxHtmlTag::wxHtmlTag(const wxString
& source
, int pos
, int end_pos
, wxHtmlTagsCache
* cache
) : wxObject() 
 127     // fill-in name, params and begin pos: 
 128     m_Name 
= m_Params 
= wxEmptyString
; 
 130     if (source
[i
] == '/') {m_Ending 
= TRUE
; i
++;} 
 131     else m_Ending 
= FALSE
; 
 133     while ((i 
< end_pos
) &&  
 134                ((c 
= source
[i
++]) != ' ' && c 
!= '\r' && c 
!= '\n' && c 
!= '\t' && 
 136         if ((c 
>= 'a') && (c 
<= 'z')) c 
-= ('a' - 'A'); 
 140     if (source
[i
-1] != '>') 
 141         while ((i 
< end_pos
) && ((c 
= source
[i
++]) != '>')) { 
 142             if ((c 
>= 'a') && (c 
<= 'z')) c 
-= ('a' - 'A'); 
 143             if (c 
== '\r' || c 
== '\n' || c 
== '\t') c 
= ' '; // make future parsing a bit simpler 
 146                 while ((i 
< end_pos
) && ((c 
= source
[i
++]) != '"')) m_Params 
+= c
; 
 149             else if (c 
== '\'') { 
 150                 while ((i 
< end_pos
) && ((c 
= source
[i
++]) != '\'')) m_Params 
+= c
; 
 156    cache 
-> QueryTag(pos
, &m_End1
, &m_End2
); 
 157    if (m_End1 
> end_pos
) m_End1 
= end_pos
; 
 158    if (m_End2 
> end_pos
) m_End2 
= end_pos
; 
 163 bool wxHtmlTag::HasParam(const wxString
& par
) const 
 165     const wxChar 
*st 
= m_Params
, *p 
= par
; 
 166     const wxChar 
*st2
, *p2
; 
 168     if (*st 
== 0) return FALSE
; 
 169     if (*p 
== 0) return FALSE
; 
 170     for (st2 
= st
, p2 
= p
; ; st2
++) { 
 171         if (*p2 
== 0) return TRUE
; 
 172         if (*st2 
== 0) return FALSE
; 
 173         if (*p2 
!= *st2
) p2 
= p
; 
 174         if (*p2 
== *st2
) p2
++; 
 175         if (*st2 
== ' ') p2 
= p
; 
 176         else if (*st2 
== '=') { 
 178             while (*st2 
!= ' ') { 
 181                     while (*st2 
!= '"') st2
++; 
 184                 if (*st2 
== 0) return FALSE
; 
 192 wxString 
wxHtmlTag::GetParam(const wxString
& par
, bool with_commas
) const 
 194     const wxChar 
*st 
= m_Params
, *p 
= par
; 
 195     const wxChar 
*st2
, *p2
; 
 199     if (*st 
== 0) return ""; 
 200     if (*p 
== 0) return ""; 
 201     for (st2 
= st
, p2 
= p
; ; st2
++) { 
 202         if (*p2 
== 0) { // found 
 204             st2
++; // '=' character 
 207             if (!with_commas 
&& (*(st2
) == '"')) { 
 212             else if (!with_commas 
&& (*(st2
) == '\'')) { 
 218                 if (comma 
&& *st2 
== comma_char
) comma 
= FALSE
; 
 219                 else if ((*st2 
== ' ') && (!comma
)) break; 
 222             if (!with_commas 
&& (*(st2
-1) == comma_char
)) fnd
.RemoveLast(); 
 225         if (*st2 
== 0) return ""; 
 226         if (*p2 
!= *st2
) p2 
= p
; 
 227         if (*p2 
== *st2
) p2
++; 
 228         if (*st2 
== ' ') p2 
= p
; 
 229         else if (*st2 
== '=') { 
 231             while (*st2 
!= ' ') { 
 234                     while (*st2 
!= '"') st2
++; 
 236                 else if (*st2 
== '\'') { 
 238                     while (*st2 
!= '\'') st2
++; 
 248 int wxHtmlTag::ScanParam(const wxString
& par
, wxChar 
*format
, void *param
) const 
 250     wxString parval 
= GetParam(par
); 
 251     return wxSscanf((const wxChar
*)parval
, format
, param
);