/* -*-mode:c++; c-file-style: "gnu";-*- */ /* * $Id: HTMLClasses.h,v 1.17 2014/04/23 20:55:05 sebdiaz Exp $ * * Copyright (C) 1996 - 2004 Stephen F. Booth * 2007 Sebastien DIAZ * Part of the GNU cgicc library, http://www.gnu.org/software/cgicc * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA */ #ifndef _HTMLCLASSES_H_ #define _HTMLCLASSES_H_ 1 /*! \file HTMLClasses.h * \brief The header file containing HTML output classes. * * One class is defined for each element in the HTML 4.0 standard. */ #include "CgiDefs.h" #include "HTMLAtomicElement.h" #include "HTMLBooleanElement.h" #include "HTMLDoctype.h" // ============================================================ // Macros defining types of elements // ============================================================ /*! * \brief Create an HTML element rendering class * * \param name The name of the class to define * \param tag The text to output when this tag is rendered */ #define TAG(name, tag) \ class name##Tag { \ public: \ inline static const char *getName() { return tag; } \ } /*! * \brief Create an atomic HTML element * * Atomic HTML elements maintain no internal on/off state. For * example, \c br and \c meta are atomic elements. * \param name The name of the class to define * \param tag The text to output when this tag is rendered */ #define ATOMIC_ELEMENT(name, tag) \ TAG(name, tag); \ typedef HTMLAtomicElement name /*! * \brief An HTML element maintaining an internal on/off state * * Boolean HTML elements maintain an internal state, and the output * rendered depends on the current state. For example, \c h1 and \c * title are boolean elements. * \param name The name of the class to define * \param tag The text to output when this tag is rendered */ #define BOOLEAN_ELEMENT(name, tag) \ TAG(name, tag); \ typedef HTMLBooleanElement name // ============================================================ // HTML 4.0 elements - for details see http://www.w3.org/ // ============================================================ namespace cgicc { // ============================================================ // Class comment - needs special render function // ============================================================ class nullTag { public: inline static const char *getName() { return 0; } }; /*! \class comment HTMLClasses.h cgicc/HTMLClasses.h * \brief An HTML comment */ class comment : public HTMLBooleanElement { virtual void render(std::ostream &out) const { if (getData().empty() && false == dataSpecified()) { swapState(); out << (getState() ? ""); } else out << ""; } }; BOOLEAN_ELEMENT(html, "html"); // HTML document BOOLEAN_ELEMENT(head, "head"); // document head BOOLEAN_ELEMENT(title, "title"); // document title ATOMIC_ELEMENT(meta, "meta"); // meta data BOOLEAN_ELEMENT(style, "style"); // style sheet BOOLEAN_ELEMENT(body, "body"); // document body BOOLEAN_ELEMENT(div, "div"); // block-level grouping BOOLEAN_ELEMENT(span, "span"); // inline grouping BOOLEAN_ELEMENT(h1, "h1"); // level 1 heading BOOLEAN_ELEMENT(h2, "h2"); // level 2 heading BOOLEAN_ELEMENT(h3, "h3"); // level 3 heading BOOLEAN_ELEMENT(h4, "h4"); // level 4 heading BOOLEAN_ELEMENT(h5, "h5"); // level 5 heading BOOLEAN_ELEMENT(h6, "h6"); // level 6 heading BOOLEAN_ELEMENT(address, "address"); // contact information // text markup BOOLEAN_ELEMENT(em, "em"); // emphasis BOOLEAN_ELEMENT(strong, "strong"); // stronger emphasis BOOLEAN_ELEMENT(cite, "cite"); // citation/reference BOOLEAN_ELEMENT(dfn, "dfn"); // defining instance BOOLEAN_ELEMENT(code, "code"); // computer code BOOLEAN_ELEMENT(samp, "samp"); // sample output BOOLEAN_ELEMENT(kbd, "kbd"); // user input BOOLEAN_ELEMENT(var, "var"); // variable/argument BOOLEAN_ELEMENT(abbr, "abbr"); // abbreviated form BOOLEAN_ELEMENT(acronym, "acronym"); // acronym BOOLEAN_ELEMENT(blockquote, "blockquote"); // block-level quotation BOOLEAN_ELEMENT(q, "q"); // inline quotation BOOLEAN_ELEMENT(sub, "sub"); // subscript BOOLEAN_ELEMENT(sup, "sup"); // superscript BOOLEAN_ELEMENT(p, "p"); // paragraph ATOMIC_ELEMENT(br, "br"); // line break BOOLEAN_ELEMENT(pre, "pre"); // preformatted text BOOLEAN_ELEMENT(ins, "ins"); // inserted text BOOLEAN_ELEMENT(del, "del"); // deleted text BOOLEAN_ELEMENT(bdo, "bdo"); // overriding direction // lists BOOLEAN_ELEMENT(ul, "ul"); // unordered list BOOLEAN_ELEMENT(ol, "ol"); // ordered list BOOLEAN_ELEMENT(li, "li"); // list item BOOLEAN_ELEMENT(dl, "dl"); // definition list BOOLEAN_ELEMENT(dt, "dt"); // term to be defined BOOLEAN_ELEMENT(dd, "dd"); // definition of term // tables BOOLEAN_ELEMENT(table, "table"); // table element BOOLEAN_ELEMENT(caption, "caption"); // table caption BOOLEAN_ELEMENT(thead, "thead"); // table head section BOOLEAN_ELEMENT(tfoot, "tfoot"); // table foot section BOOLEAN_ELEMENT(tbody, "tbody"); // table body section BOOLEAN_ELEMENT(colgroup, "colgroup"); // vertical section ATOMIC_ELEMENT(col, "col"); // column attributes BOOLEAN_ELEMENT(tr, "tr"); // table row BOOLEAN_ELEMENT(th, "th"); // table header cell BOOLEAN_ELEMENT(td, "td"); // table data cell // links BOOLEAN_ELEMENT(a, "a"); // anchor ATOMIC_ELEMENT(link, "link"); // document link ATOMIC_ELEMENT(base, "base"); // path information // objects ATOMIC_ELEMENT(img, "img"); // inline image BOOLEAN_ELEMENT(object, "object"); // generic object ATOMIC_ELEMENT(param, "param"); // object parameters BOOLEAN_ELEMENT(map, "map"); // client image map ATOMIC_ELEMENT(area, "area"); // image map region ATOMIC_ELEMENT(hr, "hr"); // horizontal rule // fonts - preferably use stylesheets BOOLEAN_ELEMENT(tt, "tt"); // monospaced text BOOLEAN_ELEMENT(i, "i"); // italic text style BOOLEAN_ELEMENT(b, "b"); // bold text style BOOLEAN_ELEMENT(big, "big"); // large font BOOLEAN_ELEMENT(small, "small"); // small font // frames - not part of the strict DTD BOOLEAN_ELEMENT(frameset, "frameset"); // frame layout ATOMIC_ELEMENT(frame, "frame"); // frame contents BOOLEAN_ELEMENT(noframes, "noframes"); // alternative text BOOLEAN_ELEMENT(iframe, "iframe"); // inline frame // forms BOOLEAN_ELEMENT(form, "form"); // form element ATOMIC_ELEMENT(input, "input"); // generic input BOOLEAN_ELEMENT(button, "button"); // special button BOOLEAN_ELEMENT(select, "select"); // option menu BOOLEAN_ELEMENT(optgroup, "optgroup"); // option group BOOLEAN_ELEMENT(option, "option"); // option item BOOLEAN_ELEMENT(textarea, "textarea"); // multi-line text input BOOLEAN_ELEMENT(label, "label"); // input label BOOLEAN_ELEMENT(fieldset, "fieldset"); // grouping input fields BOOLEAN_ELEMENT(legend, "legend"); // caption for field set // scripts BOOLEAN_ELEMENT(script, "script"); // script element BOOLEAN_ELEMENT(noscript, "noscript"); // alternative text } // namespace cgicc #endif /* ! _HTMLCLASSES_H_ */