1 /////////////////////////////////////////////////////////////////////////////
2 // Name:        src/html/m_fonts.cpp
3 // Purpose:     wxHtml module for fonts & colors of fonts
4 // Author:      Vaclav Slavik
5 // RCS-ID:      $Id: m_fonts.cpp 39371 2006-05-28 13:51:34Z VZ $
6 // Copyright:   (c) 1999 Vaclav Slavik
7 // Licence:     wxWindows licence
8 /////////////////////////////////////////////////////////////////////////////
9 
10 #include "wx/wxprec.h"
11 
12 #ifdef __BORLANDC__
13     #pragma hdrstop
14 #endif
15 
16 #if wxUSE_HTML && wxUSE_STREAMS
17 
18 #ifndef WXPRECOMP
19 #endif
20 
21 #include "wx/html/forcelnk.h"
22 #include "wx/html/m_templ.h"
23 #include "wx/fontenum.h"
24 #include "wx/tokenzr.h"
25 
26 FORCE_LINK_ME(m_fonts)
27 
28 
29 TAG_HANDLER_BEGIN(FONT, "FONT" )
30 
31     TAG_HANDLER_VARS
32         wxArrayString m_Faces;
33 
TAG_HANDLER_CONSTR(FONT)34     TAG_HANDLER_CONSTR(FONT) { }
35 
TAG_HANDLER_PROC(tag)36     TAG_HANDLER_PROC(tag)
37     {
38         wxColour oldclr = m_WParser->GetActualColor();
39         int oldsize = m_WParser->GetFontSize();
40         wxString oldface = m_WParser->GetFontFace();
41 
42         if (tag.HasParam(wxT("COLOR")))
43         {
44             wxColour clr;
45             if (tag.GetParamAsColour(wxT("COLOR"), &clr))
46             {
47                 m_WParser->SetActualColor(clr);
48                 m_WParser->GetContainer()->InsertCell(new wxHtmlColourCell(clr));
49             }
50         }
51 
52         if (tag.HasParam(wxT("SIZE")))
53         {
54             int tmp = 0;
55             wxChar c = tag.GetParam(wxT("SIZE")).GetChar(0);
56             if (tag.GetParamAsInt(wxT("SIZE"), &tmp))
57             {
58                 if (c == wxT('+') || c == wxT('-'))
59                     m_WParser->SetFontSize(oldsize+tmp);
60                 else
61                     m_WParser->SetFontSize(tmp);
62                 m_WParser->GetContainer()->InsertCell(
63                     new wxHtmlFontCell(m_WParser->CreateCurrentFont()));
64             }
65         }
66 
67         if (tag.HasParam(wxT("FACE")))
68         {
69             if (m_Faces.GetCount() == 0)
70                 m_Faces = wxFontEnumerator::GetFacenames();
71 
72             wxStringTokenizer tk(tag.GetParam(wxT("FACE")), wxT(","));
73             int index;
74 
75             while (tk.HasMoreTokens())
76             {
77                 if ((index = m_Faces.Index(tk.GetNextToken(), false)) != wxNOT_FOUND)
78                 {
79                     m_WParser->SetFontFace(m_Faces[index]);
80                     m_WParser->GetContainer()->InsertCell(new wxHtmlFontCell(m_WParser->CreateCurrentFont()));
81                     break;
82                 }
83             }
84         }
85 
86         ParseInner(tag);
87 
88         if (oldface != m_WParser->GetFontFace())
89         {
90             m_WParser->SetFontFace(oldface);
91             m_WParser->GetContainer()->InsertCell(new wxHtmlFontCell(m_WParser->CreateCurrentFont()));
92         }
93         if (oldsize != m_WParser->GetFontSize())
94         {
95             m_WParser->SetFontSize(oldsize);
96             m_WParser->GetContainer()->InsertCell(new wxHtmlFontCell(m_WParser->CreateCurrentFont()));
97         }
98         if (oldclr != m_WParser->GetActualColor())
99         {
100             m_WParser->SetActualColor(oldclr);
101             m_WParser->GetContainer()->InsertCell(new wxHtmlColourCell(oldclr));
102         }
103         return true;
104     }
105 
106 TAG_HANDLER_END(FONT)
107 
108 
109 TAG_HANDLER_BEGIN(FACES_U, "U,STRIKE")
110 
TAG_HANDLER_CONSTR(FACES_U)111     TAG_HANDLER_CONSTR(FACES_U) { }
112 
TAG_HANDLER_PROC(tag)113     TAG_HANDLER_PROC(tag)
114     {
115         int underlined = m_WParser->GetFontUnderlined();
116 
117         m_WParser->SetFontUnderlined(true);
118         m_WParser->GetContainer()->InsertCell(
119             new wxHtmlFontCell(m_WParser->CreateCurrentFont()));
120 
121         ParseInner(tag);
122 
123         m_WParser->SetFontUnderlined(underlined);
124         m_WParser->GetContainer()->InsertCell(
125             new wxHtmlFontCell(m_WParser->CreateCurrentFont()));
126         return true;
127     }
128 
129 TAG_HANDLER_END(FACES_U)
130 
131 
132 
133 
134 TAG_HANDLER_BEGIN(FACES_B, "B,STRONG")
TAG_HANDLER_CONSTR(FACES_B)135     TAG_HANDLER_CONSTR(FACES_B) { }
136 
TAG_HANDLER_PROC(tag)137     TAG_HANDLER_PROC(tag)
138     {
139         int bold = m_WParser->GetFontBold();
140 
141         m_WParser->SetFontBold(true);
142         m_WParser->GetContainer()->InsertCell(
143             new wxHtmlFontCell(m_WParser->CreateCurrentFont()));
144 
145         ParseInner(tag);
146 
147         m_WParser->SetFontBold(bold);
148         m_WParser->GetContainer()->InsertCell(
149             new wxHtmlFontCell(m_WParser->CreateCurrentFont()));
150         return true;
151     }
152 
153 TAG_HANDLER_END(FACES_B)
154 
155 
156 
157 
158 TAG_HANDLER_BEGIN(FACES_I, "I,EM,CITE,ADDRESS")
TAG_HANDLER_CONSTR(FACES_I)159     TAG_HANDLER_CONSTR(FACES_I) { }
160 
TAG_HANDLER_PROC(tag)161     TAG_HANDLER_PROC(tag)
162     {
163         int italic = m_WParser->GetFontItalic();
164 
165         m_WParser->SetFontItalic(true);
166         m_WParser->GetContainer()->InsertCell(
167             new wxHtmlFontCell(m_WParser->CreateCurrentFont()));
168 
169         ParseInner(tag);
170 
171         m_WParser->SetFontItalic(italic);
172         m_WParser->GetContainer()->InsertCell(
173             new wxHtmlFontCell(m_WParser->CreateCurrentFont()));
174         return true;
175     }
176 
177 TAG_HANDLER_END(FACES_I)
178 
179 
180 
181 
182 TAG_HANDLER_BEGIN(FACES_TT, "TT,CODE,KBD,SAMP")
TAG_HANDLER_CONSTR(FACES_TT)183     TAG_HANDLER_CONSTR(FACES_TT) { }
184 
TAG_HANDLER_PROC(tag)185     TAG_HANDLER_PROC(tag)
186     {
187         int fixed = m_WParser->GetFontFixed();
188 
189         m_WParser->SetFontFixed(true);
190         m_WParser->GetContainer()->InsertCell(
191             new wxHtmlFontCell(m_WParser->CreateCurrentFont()));
192 
193         ParseInner(tag);
194 
195         m_WParser->SetFontFixed(fixed);
196         m_WParser->GetContainer()->InsertCell(
197             new wxHtmlFontCell(m_WParser->CreateCurrentFont()));
198         return true;
199     }
200 
201 TAG_HANDLER_END(FACES_TT)
202 
203 
204 
205 
206 
207 TAG_HANDLER_BEGIN(Hx, "H1,H2,H3,H4,H5,H6")
TAG_HANDLER_CONSTR(Hx)208     TAG_HANDLER_CONSTR(Hx) { }
209 
TAG_HANDLER_PROC(tag)210     TAG_HANDLER_PROC(tag)
211     {
212         int old_size, old_b, old_i, old_u, old_f, old_al;
213         wxHtmlContainerCell *c;
214 
215         old_size = m_WParser->GetFontSize();
216         old_b = m_WParser->GetFontBold();
217         old_i = m_WParser->GetFontItalic();
218         old_u = m_WParser->GetFontUnderlined();
219         old_f = m_WParser->GetFontFixed();
220         old_al = m_WParser->GetAlign();
221 
222         m_WParser->SetFontBold(true);
223         m_WParser->SetFontItalic(false);
224         m_WParser->SetFontUnderlined(false);
225         m_WParser->SetFontFixed(false);
226 
227         if (tag.GetName() == wxT("H1"))
228                 m_WParser->SetFontSize(7);
229         else if (tag.GetName() == wxT("H2"))
230                 m_WParser->SetFontSize(6);
231         else if (tag.GetName() == wxT("H3"))
232                 m_WParser->SetFontSize(5);
233         else if (tag.GetName() == wxT("H4"))
234         {
235                 m_WParser->SetFontSize(5);
236                 m_WParser->SetFontItalic(true);
237                 m_WParser->SetFontBold(false);
238         }
239         else if (tag.GetName() == wxT("H5"))
240                 m_WParser->SetFontSize(4);
241         else if (tag.GetName() == wxT("H6"))
242         {
243                 m_WParser->SetFontSize(4);
244                 m_WParser->SetFontItalic(true);
245                 m_WParser->SetFontBold(false);
246         }
247 
248         c = m_WParser->GetContainer();
249         if (c->GetFirstChild())
250         {
251             m_WParser->CloseContainer();
252             m_WParser->OpenContainer();
253             c = m_WParser->GetContainer();
254         }
255         c = m_WParser->GetContainer();
256 
257         c->SetAlign(tag);
258         c->InsertCell(new wxHtmlFontCell(m_WParser->CreateCurrentFont()));
259         c->SetIndent(m_WParser->GetCharHeight(), wxHTML_INDENT_TOP);
260         m_WParser->SetAlign(c->GetAlignHor());
261 
262         ParseInner(tag);
263 
264         m_WParser->SetFontSize(old_size);
265         m_WParser->SetFontBold(old_b);
266         m_WParser->SetFontItalic(old_i);
267         m_WParser->SetFontUnderlined(old_u);
268         m_WParser->SetFontFixed(old_f);
269         m_WParser->SetAlign(old_al);
270 
271         m_WParser->GetContainer()->InsertCell(
272             new wxHtmlFontCell(m_WParser->CreateCurrentFont()));
273         m_WParser->CloseContainer();
274         m_WParser->OpenContainer();
275         c = m_WParser->GetContainer();
276         c->SetIndent(m_WParser->GetCharHeight(), wxHTML_INDENT_TOP);
277 
278         return true;
279     }
280 
281 TAG_HANDLER_END(Hx)
282 
283 
284 TAG_HANDLER_BEGIN(BIGSMALL, "BIG,SMALL")
TAG_HANDLER_CONSTR(BIGSMALL)285     TAG_HANDLER_CONSTR(BIGSMALL) { }
286 
TAG_HANDLER_PROC(tag)287     TAG_HANDLER_PROC(tag)
288     {
289         int oldsize = m_WParser->GetFontSize();
290         int sz = (tag.GetName() == wxT("BIG")) ? +1 : -1;
291 
292         m_WParser->SetFontSize(sz);
293         m_WParser->GetContainer()->InsertCell(
294             new wxHtmlFontCell(m_WParser->CreateCurrentFont()));
295 
296         ParseInner(tag);
297 
298         m_WParser->SetFontSize(oldsize);
299         m_WParser->GetContainer()->InsertCell(
300             new wxHtmlFontCell(m_WParser->CreateCurrentFont()));
301         return true;
302     }
303 
304 TAG_HANDLER_END(BIGSMALL)
305 
306 
307 
308 
309 TAGS_MODULE_BEGIN(Fonts)
310 
311     TAGS_MODULE_ADD(FONT)
312     TAGS_MODULE_ADD(FACES_U)
313     TAGS_MODULE_ADD(FACES_I)
314     TAGS_MODULE_ADD(FACES_B)
315     TAGS_MODULE_ADD(FACES_TT)
316     TAGS_MODULE_ADD(Hx)
317     TAGS_MODULE_ADD(BIGSMALL)
318 
319 TAGS_MODULE_END(Fonts)
320 
321 
322 #endif
323