PTLib  Version 2.14.3
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
html.h
Go to the documentation of this file.
1 /*
2  * html.h
3  *
4  * HyperText Markup Language stream classes.
5  *
6  * Portable Windows Library
7  *
8  * Copyright (c) 1993-2002 Equivalence Pty. Ltd.
9  *
10  * The contents of this file are subject to the Mozilla Public License
11  * Version 1.0 (the "License"); you may not use this file except in
12  * compliance with the License. You may obtain a copy of the License at
13  * http://www.mozilla.org/MPL/
14  *
15  * Software distributed under the License is distributed on an "AS IS"
16  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
17  * the License for the specific language governing rights and limitations
18  * under the License.
19  *
20  * The Original Code is Portable Windows Library.
21  *
22  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
23  *
24  * Contributor(s): ______________________________________.
25  *
26  * $Revision: 31255 $
27  * $Author: rjongbloed $
28  * $Date: 2014-01-23 12:50:37 +1100 (Thu, 23 Jan 2014) $
29  */
30 
31 #ifndef PTLIB_HTML_H
32 #define PTLIB_HTML_H
33 
34 #ifdef P_USE_PRAGMA
35 #pragma interface
36 #endif
37 
38 
39 
41 // PHTML
42 
49 class PHTML : public PStringStream
50 {
52 
53  public:
54  enum ElementInSet {
99  };
100 
105  PHTML(
106  ElementInSet initialState = NumElementsInSet
107  );
108  PHTML(
109  const char * cstr
110  );
111  PHTML(
112  const PString & str
113  );
114 
115  ~PHTML();
116 
122  const PHTML & html
123  ) { AssignContents(html); return *this; }
125  const PString & str
126  ) { AssignContents(str); return *this; }
128  const char * cstr
129  ) { AssignContents(PString(cstr)); return *this; }
131  char ch
132  ) { AssignContents(PString(ch)); return *this; }
133 
134 
135  // New functions for class.
136  PBoolean Is(ElementInSet elmt) const;
137  void Set(ElementInSet elmt);
138  void Clr(ElementInSet elmt);
139  void Toggle(ElementInSet elmt);
140 
141 
142  class Escaped {
143  public:
144  Escaped(const char * str) : m_str(str) { }
145  private:
146  void Output(ostream & strm) const;
147  const char * m_str;
148  friend ostream & operator<<(ostream & strm, const Escaped & e) { e.Output(strm); return strm; }
149  };
150  static PString Escape(const char * str);
151 
152  class Element {
153  public:
154  virtual ~Element() {}
155  protected:
158  const char * nam,
159  const char * att,
160  ElementInSet elmt,
161  ElementInSet req,
162  OptionalCRLF opt
163  ) : name(nam), attr(att), inElement(elmt), reqElement(req), crlf(opt) { }
164  virtual void Output(PHTML & html) const;
165  virtual void AddAttr(PHTML & html) const;
166  private:
167  PString name;
168  PString attr;
169  ElementInSet inElement;
170  ElementInSet reqElement;
171  OptionalCRLF crlf;
172  friend ostream & operator<<(ostream & strm, const Element & elmt)
173  { elmt.Output((PHTML&)strm); return strm; }
174  };
175 
176  class HTML : public Element {
177  public:
178  HTML(const char * attr = NULL);
179  virtual ~HTML() {}
180  };
181 
182  class Head : public Element {
183  public:
184  Head();
185  virtual ~Head() {}
186  protected:
187  virtual void Output(PHTML & html) const;
188  };
189 
190  class Body : public Element {
191  public:
192  Body(const char * attr = NULL);
193  virtual ~Body() {}
194  protected:
195  virtual void Output(PHTML & html) const;
196  };
197 
198  class Title : public Element {
199  public:
200  Title();
201  Title(const char * titleCStr);
202  Title(const PString & titleStr);
203  virtual ~Title() {}
204  protected:
205  virtual void Output(PHTML & html) const;
206  private:
207  const char * titleString;
208  };
209 
210  class Banner : public Element {
211  public:
212  Banner(const char * attr = NULL);
213  virtual ~Banner() {}
214  };
215 
216  class Division : public Element {
217  public:
218  Division(const char * attr = NULL);
219  virtual ~Division() {}
220  };
221 
222  class Heading : public Element {
223  public:
224  Heading(int number,
225  int sequence = 0,
226  int skip = 0,
227  const char * attr = NULL);
228  Heading(int number,
229  const char * image,
230  int sequence = 0,
231  int skip = 0,
232  const char * attr = NULL);
233  Heading(int number,
234  const PString & imageStr,
235  int sequence = 0,
236  int skip = 0,
237  const char * attr = NULL);
238  virtual ~Heading() {}
239  protected:
240  virtual void AddAttr(PHTML & html) const;
241  private:
242  int num;
243  const char * srcString;
244  int seqNum, skipSeq;
245  };
246 
247  class BreakLine : public Element {
248  public:
249  BreakLine(const char * attr = NULL);
250  virtual ~BreakLine() {}
251  };
252 
253  class Paragraph : public Element {
254  public:
255  Paragraph(const char * attr = NULL);
256  virtual ~Paragraph() {}
257  };
258 
259  class PreFormat : public Element {
260  public:
261  PreFormat(int widthInChars = 0,
262  const char * attr = NULL);
263  virtual ~PreFormat() {}
264  protected:
265  virtual void AddAttr(PHTML & html) const;
266  private:
267  int width;
268  };
269 
270  class HotLink : public Element {
271  public:
272  HotLink(const char * href = NULL, const char * attr = NULL);
273  virtual ~HotLink() {}
274  protected:
275  virtual void AddAttr(PHTML & html) const;
276  private:
277  const char * hrefString;
278  };
279 
280  class Target : public Element {
281  public:
282  Target(const char * name = NULL, const char * attr = NULL);
283  virtual ~Target() {}
284  protected:
285  virtual void AddAttr(PHTML & html) const;
286  private:
287  const char * nameString;
288  };
289 
290  class ImageElement : public Element {
291  protected:
292  ImageElement(const char * nam,
293  const char * attr,
294  ElementInSet elmt,
295  ElementInSet req,
296  OptionalCRLF opt,
297  const char * image);
298  virtual ~ImageElement() {}
299  virtual void AddAttr(PHTML & html) const;
300  const char * srcString;
301  };
302 
303  class Image : public ImageElement {
304  public:
305  Image(const char * src,
306  int width = 0,
307  int height = 0,
308  const char * attr = NULL);
309  Image(const char * src,
310  const char * alt,
311  int width = 0,
312  int height = 0,
313  const char * attr = NULL);
314  virtual ~Image() {}
315  protected:
316  virtual void AddAttr(PHTML & html) const;
317  private:
318  const char * altString;
319  int width, height;
320  };
321 
322  class HRule : public ImageElement {
323  public:
324  HRule(const char * image = NULL, const char * attr = NULL);
325  virtual ~HRule() {}
326  };
327 
328  class Note : public ImageElement {
329  public:
330  Note(const char * image = NULL, const char * attr = NULL);
331  virtual ~Note() {}
332  };
333 
334  class Address : public Element {
335  public:
336  Address(const char * attr = NULL);
337  virtual ~Address() {}
338  };
339 
340  class BlockQuote : public Element {
341  public:
342  BlockQuote(const char * attr = NULL);
343  virtual ~BlockQuote() {}
344  };
345 
346  class Credit : public Element {
347  public:
348  Credit(const char * attr = NULL);
349  virtual ~Credit() {}
350  };
351 
352  class SetTab : public Element {
353  public:
354  SetTab(const char * id, const char * attr = NULL);
355  virtual ~SetTab() {}
356  protected:
357  virtual void AddAttr(PHTML & html) const;
358  private:
359  const char * ident;
360  };
361 
362  class Tab : public Element {
363  public:
364  Tab(int indent, const char * attr = NULL);
365  Tab(const char * id, const char * attr = NULL);
366  virtual ~Tab() {}
367  protected:
368  virtual void AddAttr(PHTML & html) const;
369  private:
370  const char * ident;
371  int indentSize;
372  };
373 
374 
375  class Bold : public Element {
376  public: Bold() : Element("B", NULL, InBold, InBody, NoCRLF) { }
377  virtual ~Bold() {}
378  };
379  class Italic : public Element {
380  public:
382  : Element("I", NULL, InItalic, InBody, NoCRLF) { }
383  virtual ~Italic() {}
384  };
385  class TeleType : public Element {
386  public:
388  : Element("TT", NULL, InTeleType, InBody, NoCRLF) { }
389  virtual ~TeleType() {}
390  };
391  class Underline : public Element {
392  public:
394  : Element("U", NULL, InUnderline, InBody, NoCRLF) { }
395  virtual ~Underline() {}
396  };
397  class StrikeThrough : public Element {
398  public:
400  : Element("S", NULL, InStrikeThrough, InBody, NoCRLF) { }
401  virtual ~StrikeThrough() {}
402  };
403  class Big : public Element {
404  public:
405  Big()
406  : Element("BIG", NULL, InBig, InBody, NoCRLF) { }
407  virtual ~Big() {}
408  };
409  class Small : public Element {
410  public:
411  Small()
412  : Element("SMALL", NULL, InSmall, InBody, NoCRLF) { }
413  virtual ~Small() {}
414  };
415  class Subscript : public Element {
416  public:
418  : Element("SUB", NULL, InSubscript, InBody, NoCRLF) { }
419  virtual ~Subscript() {}
420  };
421  class Superscript : public Element {
422  public:
424  : Element("SUP", NULL, InSuperscript, InBody, NoCRLF) { }
425  virtual ~Superscript() {}
426  };
427  class Emphasis : public Element {
428  public:
430  : Element("EM", NULL, InEmphasis, InBody, NoCRLF) { }
431  virtual ~Emphasis() {}
432  };
433  class Cite : public Element {
434  public:
435  Cite()
436  : Element("CITE", NULL, InCite, InBody, NoCRLF) { }
437  virtual ~Cite() {}
438  };
439  class Strong : public Element {
440  public:
442  : Element("STRONG", NULL, InStrong, InBody, NoCRLF) { }
443  virtual ~Strong() {}
444  };
445  class Code : public Element {
446  public:
447  Code()
448  : Element("CODE", NULL, InCode, InBody, NoCRLF) { }
449  virtual ~Code() {}
450  };
451  class Sample : public Element {
452  public:
454  : Element("SAMP", NULL, InSample, InBody, NoCRLF) { }
455  virtual ~Sample() {}
456  };
457  class Keyboard : public Element {
458  public:
460  : Element("KBD", NULL, InKeyboard, InBody, NoCRLF) { }
461  virtual ~Keyboard() {}
462  };
463  class Variable : public Element {
464  public:
466  : Element("VAR", NULL, InVariable, InBody, NoCRLF) { }
467  virtual ~Variable() {}
468  };
469  class Definition : public Element {
470  public:
472  : Element("DFN", NULL, InDefinition, InBody, NoCRLF) { }
473  virtual ~Definition() {}
474  };
475  class Quote : public Element {
476  public:
477  Quote()
478  : Element("Q", NULL, InQuote, InBody, NoCRLF) { }
479  virtual ~Quote() {}
480  };
481  class Author : public Element {
482  public:
484  : Element("AU", NULL, InAuthor, InBody, NoCRLF) { }
485  virtual ~Author() {}
486  };
487  class Person : public Element {
488  public:
490  : Element("PERSON", NULL, InPerson, InBody, NoCRLF) { }
491  virtual ~Person() {}
492  };
493  class Acronym : public Element {
494  public:
496  : Element("ACRONYM", NULL, InAcronym, InBody, NoCRLF) { }
497  virtual ~Acronym() {}
498  };
499  class Abbrev : public Element {
500  public:
502  : Element("ABBREV", NULL, InAbbrev, InBody, NoCRLF) { }
503  virtual ~Abbrev() {}
504  };
505  class InsertedText : public Element {
506  public:
508  : Element("INS", NULL, InInsertedText, InBody, NoCRLF) { }
509  virtual ~InsertedText() {}
510  };
511  class DeletedText : public Element {
512  public:
514  : Element("DEL", NULL, InDeletedText, InBody, NoCRLF) { }
515  public:
516  virtual ~DeletedText() {}
517  };
518 
519  class SimpleList : public Element {
520  public:
521  SimpleList(const char * attr = NULL);
522  virtual ~SimpleList() {}
523  protected:
524  virtual void AddAttr(PHTML & html) const;
525  };
526 
527  class BulletList : public Element {
528  public:
529  BulletList(const char * attr = NULL);
530  virtual ~BulletList() {}
531  };
532 
533  class OrderedList : public Element {
534  public:
535  OrderedList(int seqNum = 0, const char * attr = NULL);
536  virtual ~OrderedList() {}
537  protected:
538  virtual void AddAttr(PHTML & html) const;
539  private:
540  int sequenceNum;
541  };
542 
543  class DefinitionList : public Element {
544  public:
545  DefinitionList(const char * attr = NULL);
546  virtual ~DefinitionList() {}
547  };
548 
549  class ListHeading : public Element {
550  public:
551  ListHeading(const char * attr = NULL);
552  virtual ~ListHeading() {}
553  };
554 
555  class ListItem : public Element {
556  public:
557  ListItem(int skip = 0, const char * attr = NULL);
558  virtual ~ListItem() {}
559  protected:
560  virtual void AddAttr(PHTML & html) const;
561  private:
562  int skipSeq;
563  };
564 
565  class DefinitionTerm : public Element {
566  public:
567  DefinitionTerm(const char * attr = NULL);
568  virtual ~DefinitionTerm() {}
569  protected:
570  virtual void Output(PHTML & html) const;
571  };
572 
573  class DefinitionItem : public Element {
574  public:
575  DefinitionItem(const char * attr = NULL);
576  virtual ~DefinitionItem() {}
577  protected:
578  virtual void Output(PHTML & html) const;
579  };
580 
581 
582  enum TableAttr {
605  };
606  #define P_DECL_HTML_TABLE_CTOR(cls) \
607  cls(const char * attr = NULL); \
608  cls(TableAttr attr1, const char * attr = NULL); \
609  cls(TableAttr attr1, TableAttr attr2, const char * attr = NULL); \
610  cls(TableAttr attr1, TableAttr attr2, TableAttr attr3, const char * attr = NULL); \
611  cls(TableAttr attr1, TableAttr attr2, TableAttr attr3, TableAttr attr4, const char * attr = NULL); \
612  cls(TableAttr attr1, TableAttr attr2, TableAttr attr3, TableAttr attr4, TableAttr attr5, const char * attr = NULL); \
613 
614  class TableStart : public Element
615  {
616  public:
618  virtual ~TableStart()
619  {
620  }
621  protected:
622  virtual void Output(PHTML & html) const;
623  virtual void AddAttr(PHTML & html) const;
624  };
625  friend class TableStart;
626 
627  class TableEnd : public Element {
628  public:
629  TableEnd();
630  virtual ~TableEnd() {}
631  protected:
632  virtual void Output(PHTML & html) const;
633  };
634  friend class TableEnd;
635 
636  class TableRow : public Element {
637  public:
639  virtual ~TableRow() {}
640  };
641 
642  class TableHeader : public Element {
643  public:
645  virtual ~TableHeader() {}
646  };
647 
648  class TableData : public Element {
649  public:
651  virtual ~TableData() {}
652  };
653 
654 
655  class Form : public Element {
656  public:
657  Form(
658  const char * method = NULL,
659  const char * action = NULL,
660  const char * encoding = NULL,
661  const char * script = NULL
662  );
663  virtual ~Form() {}
664  protected:
665  virtual void AddAttr(PHTML & html) const;
666  private:
667  const char * methodString;
668  const char * actionString;
669  const char * mimeTypeString;
670  const char * scriptString;
671  };
672 
676  };
677  class FieldElement : public Element {
678  protected:
679  FieldElement(
680  const char * nam,
681  const char * attr,
682  ElementInSet elmt,
683  OptionalCRLF opt,
684  DisableCodes disabled
685  );
686  virtual ~FieldElement() {}
687  virtual void AddAttr(PHTML & html) const;
688  private:
689  PBoolean disabledFlag;
690  };
691 
692  class Select : public FieldElement {
693  public:
694  Select(
695  const char * fname = NULL,
696  const char * attr = NULL
697  );
698  Select(
699  const char * fname,
700  DisableCodes disabled,
701  const char * attr = NULL
702  );
703  virtual ~Select() {}
704  protected:
705  virtual void AddAttr(PHTML & html) const;
706  private:
707  const char * nameString;
708  };
709 
713  };
714  class Option : public FieldElement {
715  public:
716  Option(
717  const char * attr = NULL
718  );
719  Option(
720  SelectionCodes select,
721  const char * attr = NULL
722  );
723  Option(
724  DisableCodes disabled,
725  const char * attr = NULL
726  );
727  Option(
728  SelectionCodes select,
729  DisableCodes disabled,
730  const char * attr = NULL
731  );
732  virtual ~Option() {}
733  protected:
734  virtual void AddAttr(PHTML & html) const;
735  private:
736  PBoolean selectedFlag;
737  };
738 
739  class FormField : public FieldElement {
740  protected:
741  FormField(
742  const char * nam,
743  const char * attr,
744  ElementInSet elmt,
745  OptionalCRLF opt,
746  DisableCodes disabled,
747  const char * fname
748  );
749  virtual ~FormField() {}
750  virtual void AddAttr(PHTML & html) const;
751  private:
752  const char * nameString;
753  };
754 
755  class TextArea : public FormField {
756  public:
757  TextArea(
758  const char * fname,
759  DisableCodes disabled = Enabled,
760  const char * attr = NULL
761  );
762  TextArea(
763  const char * fname,
764  int rows, int cols,
765  DisableCodes disabled = Enabled,
766  const char * attr = NULL
767  );
768  virtual ~TextArea() {}
769  protected:
770  virtual void AddAttr(PHTML & html) const;
771  private:
772  int numRows, numCols;
773  };
774 
775  class InputField : public FormField {
776  protected:
777  InputField(
778  const char * type,
779  const char * fname,
780  DisableCodes disabled,
781  const char * attr
782  );
783  virtual ~InputField() {}
784  virtual void AddAttr(PHTML & html) const;
785  private:
786  const char * typeString;
787  };
788 
789  class HiddenField : public InputField {
790  public:
791  HiddenField(
792  const char * fname,
793  const char * value,
794  const char * attr = NULL
795  );
796  virtual ~HiddenField() {}
797  protected:
798  virtual void AddAttr(PHTML & html) const;
799  private:
800  const char * valueString;
801  };
802 
803  class InputText : public InputField {
804  public:
805  InputText(
806  const char * fname,
807  int size,
808  const char * init = NULL,
809  const char * attr = NULL
810  );
811  InputText(
812  const char * fname,
813  int size,
814  DisableCodes disabled,
815  const char * attr = NULL
816  );
817  InputText(
818  const char * fname,
819  int size,
820  int maxLength,
821  DisableCodes disabled = Enabled,
822  const char * attr = NULL
823  );
824  InputText(
825  const char * fname,
826  int size,
827  const char * init,
828  int maxLength,
829  DisableCodes disabled = Enabled,
830  const char * attr = NULL
831  );
832  virtual ~InputText() {}
833  protected:
834  InputText(
835  const char * type,
836  const char * fname,
837  int size,
838  const char * init,
839  int maxLength,
840  DisableCodes disabled,
841  const char * attr
842  );
843  virtual void AddAttr(PHTML & html) const;
844  private:
845  const char * value;
846  int width, length;
847  };
848 
849  class InputPassword : public InputText {
850  public:
852  const char * fname,
853  int size,
854  const char * init = NULL,
855  const char * attr = NULL
856  );
858  const char * fname,
859  int size,
860  DisableCodes disabled,
861  const char * attr = NULL
862  );
864  const char * fname,
865  int size,
866  int maxLength,
867  DisableCodes disabled = Enabled,
868  const char * attr = NULL
869  );
871  const char * fname,
872  int size,
873  const char * init,
874  int maxLength,
875  DisableCodes disabled = Enabled,
876  const char * attr = NULL
877  );
878  virtual ~InputPassword() {}
879  };
880 
884  };
885  class RadioButton : public InputField {
886  public:
887  RadioButton(
888  const char * fname,
889  const char * value,
890  const char * attr = NULL
891  );
892  RadioButton(
893  const char * fname,
894  const char * value,
895  DisableCodes disabled,
896  const char * attr = NULL
897  );
898  RadioButton(
899  const char * fname,
900  const char * value,
901  CheckedCodes check,
902  DisableCodes disabled = Enabled,
903  const char * attr = NULL
904  );
905  virtual ~RadioButton() {}
906  protected:
907  RadioButton(
908  const char * type,
909  const char * fname,
910  const char * value,
911  CheckedCodes check,
912  DisableCodes disabled,
913  const char * attr
914  );
915  virtual void AddAttr(PHTML & html) const;
916  private:
917  const char * valueString;
918  PBoolean checkedFlag;
919  };
920 
921  class CheckBox : public RadioButton {
922  public:
923  CheckBox(
924  const char * fname,
925  const char * attr = NULL
926  );
927  CheckBox(
928  const char * fname,
929  DisableCodes disabled,
930  const char * attr = NULL
931  );
932  CheckBox(
933  const char * fname,
934  CheckedCodes check,
935  DisableCodes disabled = Enabled,
936  const char * attr = NULL
937  );
938  virtual ~CheckBox() {}
939  };
940 
941 
942  class InputNumber : public InputField {
943  public:
944  InputNumber(
945  const char * fname,
946  int min, int max,
947  int value = 0,
948  DisableCodes disabled = Enabled,
949  const char * attr = NULL
950  );
951  virtual ~InputNumber() {}
952  protected:
953  InputNumber(
954  const char * type,
955  const char * fname,
956  int min, int max,
957  int value,
958  DisableCodes disabled,
959  const char * attr
960  );
961  virtual void AddAttr(PHTML & html) const;
962  private:
963  void Construct(int min, int max, int value);
964  int minValue, maxValue, initValue;
965  };
966 
967  class InputRange : public InputNumber {
968  public:
969  InputRange(
970  const char * fname,
971  int min, int max,
972  int value = 0,
973  DisableCodes disabled = Enabled,
974  const char * attr = NULL
975  );
976  virtual ~InputRange() {}
977  };
978 
979  class InputFile : public InputField {
980  public:
981  InputFile(
982  const char * fname,
983  const char * accept = NULL,
984  DisableCodes disabled = Enabled,
985  const char * attr = NULL
986  );
987  virtual ~InputFile() {}
988  protected:
989  virtual void AddAttr(PHTML & html) const;
990  private:
991  const char * acceptString;
992  };
993 
994  class InputImage : public InputField {
995  public:
996  InputImage(
997  const char * fname,
998  const char * src = NULL,
999  DisableCodes disabled = Enabled,
1000  const char * attr = NULL
1001  );
1002  virtual ~InputImage() {}
1003  protected:
1004  InputImage(
1005  const char * type,
1006  const char * fname,
1007  const char * src,
1008  DisableCodes disabled,
1009  const char * attr
1010  );
1011  virtual void AddAttr(PHTML & html) const;
1012  private:
1013  const char * srcString;
1014  };
1015 
1016  class InputScribble : public InputImage {
1017  public:
1018  InputScribble(
1019  const char * fname,
1020  const char * src = NULL,
1021  DisableCodes disabled = Enabled,
1022  const char * attr = NULL
1023  );
1024  virtual ~InputScribble() {}
1025  };
1026 
1027  class ResetButton : public InputImage {
1028  public:
1029  ResetButton(
1030  const char * title,
1031  const char * fname = NULL,
1032  const char * src = NULL,
1033  DisableCodes disabled = Enabled,
1034  const char * attr = NULL
1035  );
1036  virtual ~ResetButton() {}
1037  protected:
1038  ResetButton(
1039  const char * type,
1040  const char * title,
1041  const char * fname = NULL,
1042  const char * src = NULL,
1043  DisableCodes disabled = Enabled,
1044  const char * attr = NULL
1045  );
1046  virtual void AddAttr(PHTML & html) const;
1047  private:
1048  const char * titleString;
1049  };
1050 
1051  class SubmitButton : public ResetButton {
1052  public:
1053  SubmitButton(
1054  const char * title,
1055  const char * fname = NULL,
1056  const char * src = NULL,
1057  DisableCodes disabled = Enabled,
1058  const char * attr = NULL
1059  );
1060  virtual ~SubmitButton() {}
1061  };
1062 
1063 
1064  protected:
1065  virtual void AssignContents(const PContainer & c);
1066 
1067  private:
1068  ElementInSet initialElement;
1069  BYTE elementSet[NumElementsInSet/8+1];
1070  PINDEX tableNestLevel;
1071 };
1072 
1073 
1074 #endif // PTLIB_HTML_H
1075 
1076 
1077 // End Of File ///////////////////////////////////////////////////////////////