emsApplication/sdk/include/cgicc/HTMLElement.h

383 lines
10 KiB
C++

/* -*-mode:c++; c-file-style: "gnu";-*- */
/*
* $Id: HTMLElement.h,v 1.9 2014/04/23 20:55:06 sebdiaz Exp $
*
* Copyright (C) 1996 - 2004 Stephen F. Booth <sbooth@gnu.org>
* 2007 Sebastien DIAZ <sebastien.diaz@gmail.com>
* 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 _HTMLELEMENT_H_
#define _HTMLELEMENT_H_ 1
#ifdef __GNUG__
# pragma interface
#endif
/*! \file HTMLElement.h
* \brief Class dealing with HTML elements
*
* For example, \c a, \c img, \c html, and \c body, are all HTML elements.
*/
#include <string>
#include "CgiDefs.h"
#include "MStreamable.h"
#include "HTMLAttributeList.h"
namespace cgicc {
class HTMLElementList;
// ============================================================
// Class HTMLElement
// ============================================================
/*! \class HTMLElement HTMLElement.h cgicc/HTMLElement.h
* \brief Class representing an HTML element.
*
* An HTML element is any entity enclosed in angle brackets (\< and \>)
* interpreted as HTML, for example \c a, \c img, \c html, and \c body.
*
* This class is an abstract base class that defines the interface
* for all HTMLElement subclasses.
*/
class CGICC_API HTMLElement : public MStreamable
{
public:
/*!
* \brief Possible types of HTMLElements
*
* An HTMLElement is either atomic, meaning it has no corresponding
* closing tag (elements such as \c hr and \c br are atomic) or
* boolean (elements such as \c a and \c ol are boolean)
*/
enum EElementType {
/*! Atomic element, such as \c hr */
eAtomic,
/*! Boolean element, such as \c strong */
eBoolean
};
// ============================================================
/*! \name Constructors and Destructor */
//@{
/*!
* \brief Copy constructor.
*
* Sets the name and internal state of this element to those of \c element
* \param element The HTMLElement to copy.
*/
HTMLElement(const HTMLElement& element);
/*!
* \brief Destructor
*
* Delete this HTMLElement object
*/
virtual ~HTMLElement();
//@}
// ============================================================
/*! \name Overloaded Operators */
//@{
/*!
* \brief Compare two HTMLElements for equality.
*
* HTMLElements are equal if they have the same name
* \param element The HTMLElement to compare to this one.
* \return \c true if the two HTMLElements are equal, \c false otherwise.
*/
bool
operator== (const HTMLElement& element) const;
/*!
* \brief Compare two HTMLElements for inequality.
*
* HTMLElements are equal if they have the same name
* \param element The HTMLElement to compare to this one.
* \return \c false if the two HTMLElements are equal, \c true otherwise.
*/
inline bool
operator!= (const HTMLElement& element) const
{ return ! operator==(element); }
#ifdef WIN32
/* Dummy operator for MSVC++ */
inline bool
operator< (const HTMLElement& element) const
{ return false; }
#endif
/*!
* \brief Assignment operator
*
* Sets the name and internal state of this element to those of \c element
* \param element The HTMLElement to copy
* \return A reference to \c this
*/
HTMLElement&
operator= (const HTMLElement& element);
//@}
// ============================================================
/*! \name Accessor Methods
* Information on the element
*/
//@{
/*!
* \brief Get the name of this element.
*
* For example, \c html or \c body.
* \return The name of this element.
*/
virtual const char*
getName() const = 0;
/*!
* \brief Get the data contained in this element, if any.
*
* This is only applicable for boolean elements
* \return The data contained in this element.
*/
inline std::string
getData() const
{ return fData; }
/*!
* \brief Get the type of this element
*
* Most HTMLElements are boolean
* \return The type of this element
*/
inline EElementType
getType() const
{ return fType; }
//@}
// ============================================================
/*! \name Mutator Methods
* Set properties of the element
*/
//@{
/*!
* \brief Set the data contained in this element.
*
* The data is the text contained between the opening and closing tags
* \param data The data to store in this element.
*/
inline void
setData(const std::string& data)
{ fData = data; }
//@}
// ============================================================
/*!
* \brief Clone this HTMLElement
*
* This performs a deep copy of the element
* \return A pointer to a newly-allocated copy of \c this.
*/
virtual HTMLElement*
clone() const = 0;
// ============================================================
/*! \name Embedded HTMLElement Management
* Manage elements embedded in this one
*/
//@{
/*!
* \brief Get the HTMLElementList embedded in this element, if any.
*
* If this method returns 0, no elements are embedded
* \return The embedded element list.
*/
inline const HTMLElementList*
getEmbedded() const
{ return fEmbedded; }
/*!
* \brief Set the HTMLElementList associated with this element.
*
* This is usually called by subclass constructors
* \param embedded The HTMLElementList containing the HTMLElements
* embedded in this element.
*/
void
setEmbedded(const HTMLElementList& embedded);
/*!
* \brief Add an embedded HTMLElement in this one
*
*
* \param element A reference to an HTMLElement to embed in this one
* \return A reference to \c this
*/
HTMLElement&
add(const HTMLElement& element);
/*!
* \brief Add an embedded HTMLElement in this one
*
* This element takes ownership of \c element, which should not be deleted.
* \param element A pointer to an HTMLElement to embed.
* \return A reference to \c this
*/
HTMLElement&
add(HTMLElement *element);
//@}
// ============================================================
/*! \name HTMLAttribute Management
* Manage attributes embedded in this element
*/
//@{
/*!
* \brief Get the attributes associated with this element.
*
* If this method returns 0, no attributes are embedded
* \return The attribute list.
*/
inline const HTMLAttributeList*
getAttributes() const
{ return fAttributes; }
/*!
* \brief Set the attributes associated with this element.
*
* This is usually called by subclass constructors
* \param attributes The HTMLAttributeList containing the HTMLAttributes
* belonging to this element.
*/
void
setAttributes(const HTMLAttributeList& attributes);
/*!
* \brief Set an HTMLAttribute on this HTMLElement
*
*
* \param name The name of the HTMLAttribute to set
* \return A reference to \c this
*/
HTMLElement&
set(const std::string& name);
/*!
* \brief Set an HTMLAttribute on this HTMLElement
*
*
* \param name The name of the HTMLAttribute
* \param value The value of the HTMLAttribute
* \return A reference to \c this
*/
HTMLElement&
set(const std::string& name,
const std::string& value);
//@}
// ============================================================
/*! \name Boolean element methods
* Methods specific to boolean elements
*/
//@{
/*!
* \brief Swap the state of the boolean element
*
* A state of \c true means the element is active
*/
virtual void
swapState() const
{}
/*!
* \brief Get the state of this boolean element
*
*
* \return \c true if the element is active, \c false otherwise
*/
virtual bool
getState() const
{ return false; }
//@}
/*!
* \brief Render this HTMLElement to an ostream
*
* This is used for output
* \param out The ostream to which to write
*/
virtual void
render(std::ostream& out) const;
protected:
/*!
* \brief Subclass constructor
*
* This allows the subclasses to fully specify all properties
* \param attributes A pointer to an HTMLAttributeList containing the
* HTMLAttributes for this HTMLElement, if any
* \param embedded A pointer to the embedded HTMLElement, if any
* \param data A pointer to the data, if any
* \param type The type of element
*/
HTMLElement(const HTMLAttributeList *attributes,
const HTMLElement *embedded,
const std::string *data,
EElementType type);
/*!
* \brief For subclasses only
*
* Returns \c true if data was specified in the constructor.
* \return \c true if data was specified in the constructor, \c false otherwise
*/
inline bool
dataSpecified() const
{ return fDataSpecified; }
private:
HTMLElement() {}
HTMLAttributeList *fAttributes;
HTMLElementList *fEmbedded;
std::string fData;
EElementType fType;
bool fDataSpecified;
};
} // namespace cgicc
#endif /* ! _HTMLELEMENT_H_ */