docparser.h 48.3 KB
Newer Older
1 2
/******************************************************************************
 *
3
 * 
4 5
 *
 *
Dimitri van Heesch's avatar
Dimitri van Heesch committed
6
 * Copyright (C) 1997-2014 by Dimitri van Heesch.
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
 *
 * Permission to use, copy, modify, and distribute this software and its
 * documentation under the terms of the GNU General Public License is hereby 
 * granted. No representations are made about the suitability of this software 
 * for any purpose. It is provided "as is" without express or implied warranty.
 * See the GNU General Public License for more details.
 *
 * Documents produced by Doxygen are derivative works derived from the
 * input used in their production; they are not affected by this license.
 *
 */

#ifndef _DOCPARSER_H
#define _DOCPARSER_H

22 23
#include <stdio.h>

24
#include <qlist.h>
25
#include <qcstring.h>
26 27

#include "docvisitor.h"
28
#include "htmlattrib.h"
29

30
class DocNode;
31
class MemberDef;
32 33
class Definition;
class MemberGroup;
34
class SectionDict;
35

36 37
//---------------------------------------------------------------------------

38

39
/*! Main entry point for the documentation parser.
40 41
 *  @param fileName  File in which the documentation block is found (or the
 *                   name of the example file in case isExample is TRUE).
42
 *  @param startLine Line at which the documentation block is found.
43
 *  @param context   Class or namespace to which this block belongs.
44 45
 *  @param md        Member definition to which the documentation belongs.
 *                   Can be 0.
46
 *  @param input     String representation of the documentation block.
47 48
 *  @param indexWords Indicates whether or not words should be put in the 
 *                   search index.
49
 *  @param isExample TRUE if the documentation belongs to an example.
Dimitri van Heesch's avatar
Dimitri van Heesch committed
50
 *  @param exampleName Base name of the example file (0 if isExample is FALSE).
51 52
 *  @param singleLine Output should be presented on a single line, so without
 *                   starting a new paragraph at the end.
53 54 55
 *  @param linkFromIndex TRUE if the documentation is generated from an
 *                   index page. In this case context is not used to determine
 *                   the relative path when making a link.
56 57 58
 *  @returns         Root node of the abstract syntax tree. Ownership of the
 *                   pointer is handed over to the caller.
 */
59
DocRoot *validatingParseDoc(const char *fileName,int startLine,
60 61
                            Definition *context, MemberDef *md,
                            const char *input,bool indexWords,
62
                            bool isExample,const char *exampleName=0,
63
                            bool singleLine=FALSE,bool linkFromIndex=FALSE);
64 65 66 67

/*! Main entry point for parsing simple text fragments. These 
 *  fragments are limited to words, whitespace and symbols.
 */
68
DocText *validatingParseText(const char *input);
69

70
/*! Searches for section and anchor commands in the input */
71 72 73 74
void docFindSections(const char *input,
                     Definition *d,
                     MemberGroup *m,
                     const char *fileName);
75

76 77
//---------------------------------------------------------------------------

Dimitri van Heesch's avatar
Dimitri van Heesch committed
78
/** Abstract node interface with type information. */
79 80 81
class DocNode
{
  public:
82
    /*! Available node types. */
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
    enum Kind { Kind_Root           = 0, 
                Kind_Word           = 1, 
                Kind_WhiteSpace     = 2, 
                Kind_Para           = 3, 
                Kind_AutoList       = 4, 
                Kind_AutoListItem   = 5,
                Kind_Symbol         = 6,
                Kind_URL            = 7,
                Kind_StyleChange    = 8,
                Kind_SimpleSect     = 9,
                Kind_Title          = 10,
                Kind_SimpleList     = 11,
                Kind_SimpleListItem = 12,
                Kind_Section        = 13,
                Kind_Verbatim       = 14,
                Kind_XRefItem       = 15,
                Kind_HtmlList       = 16,
                Kind_HtmlListItem   = 17,
Dimitri van Heesch's avatar
Dimitri van Heesch committed
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
                Kind_HtmlDescList   = 18,
                Kind_HtmlDescData   = 19,
                Kind_HtmlDescTitle  = 20,
                Kind_HtmlTable      = 21,
                Kind_HtmlRow        = 22,
                Kind_HtmlCell       = 23,
                Kind_HtmlCaption    = 24,
                Kind_LineBreak      = 25,
                Kind_HorRuler       = 26,
                Kind_Anchor         = 27,
                Kind_IndexEntry     = 28,
                Kind_Internal       = 29,
                Kind_HRef           = 30,
                Kind_Include        = 31,
                Kind_IncOperator    = 32,
                Kind_HtmlHeader     = 33,
                Kind_Image          = 34,
                Kind_DotFile        = 35,
                Kind_Link           = 36,
                Kind_Ref            = 37,
                Kind_Formula        = 38,
                Kind_SecRefItem     = 39,
                Kind_SecRefList     = 40,
124
                Kind_SimpleSectSep  = 41,
Dimitri van Heesch's avatar
Dimitri van Heesch committed
125 126 127 128 129
                Kind_LinkedWord     = 42,
                Kind_ParamSect      = 43,
                Kind_ParamList      = 44,
                Kind_InternalRef    = 45,
                Kind_Copy           = 46,
130
                Kind_Text           = 47,
131
                Kind_MscFile        = 48,
132
                Kind_HtmlBlockQuote = 49,
133
                Kind_VhdlFlow       = 50,
134 135
                Kind_ParBlock       = 51,
                Kind_DiaFile        = 52
136
              };
137
    /*! Creates a new node */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
138
    DocNode() : m_parent(0), m_insidePre(FALSE) {}
Dimitri van Heesch's avatar
Dimitri van Heesch committed
139

140
    /*! Destroys a node. */
141
    virtual ~DocNode() {}
Dimitri van Heesch's avatar
Dimitri van Heesch committed
142

143
    /*! Returns the kind of node. Provides runtime type information */
144
    virtual Kind kind() const = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
145

146
    /*! Returns the parent of this node or 0 for the root node. */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
147 148 149 150
    DocNode *parent() const { return m_parent; }

    /*! Sets a new parent for this node. */
    void setParent(DocNode *parent) { m_parent = parent; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
151

152 153 154 155
    /*! Acceptor function for node visitors. Part of the visitor pattern. 
     *  @param v Abstract visitor.
     */
    virtual void accept(DocVisitor *v) = 0;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
156

157 158
    /*! Returns TRUE iff this node is inside a preformatted section */
    bool isPreformatted() const { return m_insidePre; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
159

Dimitri van Heesch's avatar
Dimitri van Heesch committed
160
  protected:
161 162
    /*! Sets whether or not this item is inside a preformatted section */
    void setInsidePreformatted(bool p) { m_insidePre = p; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
163
    DocNode *m_parent;
164
  private:
Dimitri van Heesch's avatar
Dimitri van Heesch committed
165

166
    bool m_insidePre;
167 168
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
169
/** Default accept implementation for compound nodes in the abstract
170 171 172 173 174 175
 *  syntax tree.
 */
template<class T> class CompAccept
{
  public:
    CompAccept() { m_children.setAutoDelete(TRUE); }
176
    virtual ~CompAccept() {}
177 178 179 180 181 182 183 184
    void accept(T *obj, DocVisitor *v) 
    { 
      v->visitPre(obj); 
      QListIterator<DocNode> cli(m_children);
      DocNode *n;
      for (cli.toFirst();(n=cli.current());++cli) n->accept(v);
      v->visitPost(obj); 
    }
185 186
    const QList<DocNode> &children() const { return m_children; }
    QList<DocNode> &children() { return m_children; }
187 188 189 190 191 192
  
  protected:
    QList<DocNode> m_children;
};


Dimitri van Heesch's avatar
Dimitri van Heesch committed
193
/** Node representing a word 
194 195 196 197
 */
class DocWord : public DocNode
{
  public:
198 199
    DocWord(DocNode *parent,const QCString &word);
    QCString word() const { return m_word; }
200 201 202 203
    Kind kind() const { return Kind_Word; }
    void accept(DocVisitor *v) { v->visit(this); }

  private:
204
    QCString  m_word;
205 206
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
207
/** Node representing a word that can be linked to something
208 209 210 211
 */
class DocLinkedWord : public DocNode
{
  public:
212 213 214 215
    DocLinkedWord(DocNode *parent,const QCString &word,
                  const QCString &ref,const QCString &file,
                  const QCString &anchor,const QCString &tooltip);
    QCString word() const       { return m_word; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
216
    Kind kind() const          { return Kind_LinkedWord; }
217 218 219 220 221
    QCString file() const       { return m_file; }
    QCString relPath() const    { return m_relPath; }
    QCString ref() const        { return m_ref; }
    QCString anchor() const     { return m_anchor; }
    QCString tooltip() const    { return m_tooltip; }
222 223 224
    void accept(DocVisitor *v) { v->visit(this); }

  private:
225 226 227 228 229 230
    QCString  m_word;
    QCString  m_ref;
    QCString  m_file;
    QCString  m_relPath;
    QCString  m_anchor;
    QCString  m_tooltip;
231 232
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
233
/** Node representing an URL (or email address) */
234 235 236
class DocURL : public DocNode
{
  public:
237
    DocURL(DocNode *parent,const QCString &url,bool isEmail) : 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
238
      m_url(url), m_isEmail(isEmail) { m_parent=parent; }
239
    QCString url() const        { return m_url; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
240
    Kind kind() const          { return Kind_URL; }
241
    void accept(DocVisitor *v) { v->visit(this); }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
242
    bool isEmail() const       { return m_isEmail; }
243 244

  private:
245
    QCString  m_url;
246
    bool m_isEmail;
247 248
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
249
/** Node representing a line break */
250 251 252
class DocLineBreak : public DocNode
{
  public:
Dimitri van Heesch's avatar
Dimitri van Heesch committed
253
    DocLineBreak(DocNode *parent) { m_parent=parent; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
254
    Kind kind() const          { return Kind_LineBreak; }
255 256 257 258 259
    void accept(DocVisitor *v) { v->visit(this); }

  private:
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
260
/** Node representing a horizonal ruler */
261 262 263
class DocHorRuler : public DocNode
{
  public:
Dimitri van Heesch's avatar
Dimitri van Heesch committed
264
    DocHorRuler(DocNode *parent) { m_parent = parent; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
265
    Kind kind() const          { return Kind_HorRuler; }
266 267 268 269 270
    void accept(DocVisitor *v) { v->visit(this); }

  private:
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
271
/** Node representing an anchor */
272 273 274
class DocAnchor : public DocNode
{
  public:
275
    DocAnchor(DocNode *parent,const QCString &id,bool newAnchor);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
276
    Kind kind() const          { return Kind_Anchor; }
277 278
    QCString anchor() const    { return m_anchor; }
    QCString file() const      { return m_file; }
279 280 281
    void accept(DocVisitor *v) { v->visit(this); }

  private:
282 283
    QCString  m_anchor;
    QCString  m_file;
284 285
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
286
/** Node representing a citation of some bibliographic reference */
287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307
class DocCite : public DocNode
{
  public:
    DocCite(DocNode *parent,const QCString &target,const QCString &context);
    Kind kind() const            { return Kind_Ref; }
    QCString file() const        { return m_file; }
    QCString relPath() const     { return m_relPath; }
    QCString ref() const         { return m_ref; }
    QCString anchor() const      { return m_anchor; }
    QCString text() const        { return m_text; }
    void accept(DocVisitor *v) { v->visit(this); }

  private:
    QCString   m_file;
    QCString   m_relPath;
    QCString   m_ref;
    QCString   m_anchor;
    QCString   m_text;
};


Dimitri van Heesch's avatar
Dimitri van Heesch committed
308
/** Node representing a style change */
309 310 311 312
class DocStyleChange : public DocNode
{
  public:
    enum Style { Bold, Italic, Code, Center, Small, 
313 314
                 Subscript, Superscript, Preformatted,
                 Span, Div
315
               };
316 317
    DocStyleChange(DocNode *parent,uint position,Style s,bool enable,
                   const HtmlAttribList *attribs=0) : 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
318 319
      m_position(position), m_style(s), m_enable(enable)
      { m_parent = parent; if (attribs) m_attribs=*attribs; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
320 321
    Kind kind() const                     { return Kind_StyleChange; }
    Style style() const                   { return m_style; }
322
    const char *styleString() const;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
323 324 325
    bool enable() const                   { return m_enable; }
    uint position() const                 { return m_position; }
    void accept(DocVisitor *v)            { v->visit(this); }
326
    const HtmlAttribList &attribs() const { return m_attribs; }
327 328

  private:
329 330 331
    uint     m_position;
    Style    m_style;
    bool     m_enable;
332
    HtmlAttribList m_attribs;
333 334
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
335
/** Node representing a special symbol */
336 337 338
class DocSymbol : public DocNode
{
  public:
339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397
    enum SymType { Sym_Unknown = -1,
                   Sym_nbsp, Sym_iexcl, Sym_cent, Sym_pound, Sym_curren,
                   Sym_yen, Sym_brvbar, Sym_sect, Sym_uml, Sym_copy,
                   Sym_ordf, Sym_laquo, Sym_not, Sym_shy, Sym_reg,
                   Sym_macr, Sym_deg, Sym_plusmn, Sym_sup2, Sym_sup3,
                   Sym_acute, Sym_micro, Sym_para, Sym_middot, Sym_cedil,
                   Sym_sup1, Sym_ordm, Sym_raquo, Sym_frac14, Sym_frac12,
                   Sym_frac34, Sym_iquest, Sym_Agrave, Sym_Aacute, Sym_Acirc,
                   Sym_Atilde, Sym_Auml, Sym_Aring, Sym_AElig, Sym_Ccedil,
                   Sym_Egrave, Sym_Eacute, Sym_Ecirc, Sym_Euml, Sym_Igrave,
                   Sym_Iacute, Sym_Icirc, Sym_Iuml, Sym_ETH, Sym_Ntilde,
                   Sym_Ograve, Sym_Oacute, Sym_Ocirc, Sym_Otilde, Sym_Ouml,
                   Sym_times, Sym_Oslash, Sym_Ugrave, Sym_Uacute, Sym_Ucirc,
                   Sym_Uuml, Sym_Yacute, Sym_THORN, Sym_szlig, Sym_agrave,
                   Sym_aacute, Sym_acirc, Sym_atilde, Sym_auml, Sym_aring,
                   Sym_aelig, Sym_ccedil, Sym_egrave, Sym_eacute, Sym_ecirc,
                   Sym_euml, Sym_igrave, Sym_iacute, Sym_icirc, Sym_iuml,
                   Sym_eth, Sym_ntilde, Sym_ograve, Sym_oacute, Sym_ocirc,
                   Sym_otilde, Sym_ouml, Sym_divide, Sym_oslash, Sym_ugrave,
                   Sym_uacute, Sym_ucirc, Sym_uuml, Sym_yacute, Sym_thorn,
                   Sym_yuml, Sym_fnof, Sym_Alpha, Sym_Beta, Sym_Gamma,
                   Sym_Delta, Sym_Epsilon, Sym_Zeta, Sym_Eta, Sym_Theta,
                   Sym_Iota, Sym_Kappa, Sym_Lambda, Sym_Mu, Sym_Nu,
                   Sym_Xi, Sym_Omicron, Sym_Pi, Sym_Rho, Sym_Sigma,
                   Sym_Tau, Sym_Upsilon, Sym_Phi, Sym_Chi, Sym_Psi,
                   Sym_Omega, Sym_alpha, Sym_beta, Sym_gamma, Sym_delta,
                   Sym_epsilon, Sym_zeta, Sym_eta, Sym_theta, Sym_iota,
                   Sym_kappa, Sym_lambda, Sym_mu, Sym_nu, Sym_xi,
                   Sym_omicron, Sym_pi, Sym_rho, Sym_sigmaf, Sym_sigma,
                   Sym_tau, Sym_upsilon, Sym_phi, Sym_chi, Sym_psi,
                   Sym_omega, Sym_thetasym, Sym_upsih, Sym_piv, Sym_bull,
                   Sym_hellip, Sym_prime, Sym_Prime, Sym_oline, Sym_frasl,
                   Sym_weierp, Sym_image, Sym_real, Sym_trade, Sym_alefsym,
                   Sym_larr, Sym_uarr, Sym_rarr, Sym_darr, Sym_harr,
                   Sym_crarr, Sym_lArr, Sym_uArr, Sym_rArr, Sym_dArr,
                   Sym_hArr, Sym_forall, Sym_part, Sym_exist, Sym_empty,
                   Sym_nabla, Sym_isin, Sym_notin, Sym_ni, Sym_prod,
                   Sym_sum, Sym_minus, Sym_lowast, Sym_radic, Sym_prop,
                   Sym_infin, Sym_ang, Sym_and, Sym_or, Sym_cap,
                   Sym_cup, Sym_int, Sym_there4, Sym_sim, Sym_cong,
                   Sym_asymp, Sym_ne, Sym_equiv, Sym_le, Sym_ge,
                   Sym_sub, Sym_sup, Sym_nsub, Sym_sube, Sym_supe,
                   Sym_oplus, Sym_otimes, Sym_perp, Sym_sdot, Sym_lceil,
                   Sym_rceil, Sym_lfloor, Sym_rfloor, Sym_lang, Sym_rang,
                   Sym_loz, Sym_spades, Sym_clubs, Sym_hearts, Sym_diams,
                   Sym_quot, Sym_amp, Sym_lt, Sym_gt, Sym_OElig,
                   Sym_oelig, Sym_Scaron, Sym_scaron, Sym_Yuml, Sym_circ,
                   Sym_tilde, Sym_ensp, Sym_emsp, Sym_thinsp, Sym_zwnj,
                   Sym_zwj, Sym_lrm, Sym_rlm, Sym_ndash, Sym_mdash,
                   Sym_lsquo, Sym_rsquo, Sym_sbquo, Sym_ldquo, Sym_rdquo,
                   Sym_bdquo, Sym_dagger, Sym_Dagger, Sym_permil, Sym_lsaquo,
                   Sym_rsaquo, Sym_euro,

                   /* doxygen extensions */
                   Sym_tm, Sym_apos,

                   /* doxygen commands mapped */
                   Sym_BSlash, Sym_At, Sym_Less, Sym_Greater, Sym_Amp,
                   Sym_Dollar, Sym_Hash, Sym_DoubleColon, Sym_Percent, Sym_Pipe,
398
                   Sym_Quot, Sym_Minus
399
                 };
400 401 402 403 404 405 406 407 408 409
    enum PerlType { Perl_unknown = 0, Perl_string, Perl_char, Perl_symbol, Perl_umlaut,
                    Perl_acute, Perl_grave, Perl_circ, Perl_slash, Perl_tilde,
                    Perl_cedilla, Perl_ring
                  };
    typedef struct PerlSymb {
      const char     *symb;
      const PerlType  type;
    }PerlSymb;
    DocSymbol(DocNode *parent,SymType s) : 
      m_symbol(s) { m_parent = parent; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
410 411
    SymType symbol() const     { return m_symbol; }
    Kind kind() const          { return Kind_Symbol; }
412
    void accept(DocVisitor *v) { v->visit(this); }
413
    static SymType decodeSymbol(const QCString &symName);
414 415

  private:
416
    SymType  m_symbol;
417 418
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
419
/** Node representing some amount of white space */
420 421 422
class DocWhiteSpace : public DocNode
{
  public:
423
    DocWhiteSpace(DocNode *parent,const QCString &chars) : 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
424
      m_chars(chars) { m_parent = parent; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
425
    Kind kind() const          { return Kind_WhiteSpace; }
426
    QCString chars() const      { return m_chars; }
427 428
    void accept(DocVisitor *v) { v->visit(this); }
  private:
429
    QCString  m_chars;
430 431
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
432
/** Node representing a verbatim, unparsed text fragment */
433 434 435
class DocVerbatim : public DocNode
{
  public:
436
    enum Type { Code, HtmlOnly, ManOnly, LatexOnly, RtfOnly, XmlOnly, Verbatim, Dot, Msc, DocbookOnly, PlantUML };
437 438
    DocVerbatim(DocNode *parent,const QCString &context,
                const QCString &text, Type t,bool isExample,
439
                const QCString &exampleFile,bool isBlock=FALSE,const QCString &lang=QCString());
440 441
    Kind kind() const            { return Kind_Verbatim; }
    Type type() const            { return m_type; }
442 443
    QCString text() const        { return m_text; }
    QCString context() const     { return m_context; }
444 445
    void accept(DocVisitor *v)   { v->visit(this); }
    bool isExample() const       { return m_isExample; }
446 447
    QCString exampleFile() const { return m_exampleFile; }
    QCString relPath() const     { return m_relPath; }
448
    QCString language() const    { return m_lang; }
449
    bool isBlock() const         { return m_isBlock; }
450 451

  private:
452 453
    QCString  m_context;
    QCString  m_text;
454 455
    Type      m_type;
    bool      m_isExample;
456 457
    QCString  m_exampleFile;
    QCString  m_relPath;
458
    QCString  m_lang;
459
    bool      m_isBlock;
460 461
};

462

Dimitri van Heesch's avatar
Dimitri van Heesch committed
463
/** Node representing an included text block from file */
464 465 466
class DocInclude : public DocNode
{
  public:
467
  enum Type { Include, DontInclude, VerbInclude, HtmlInclude, LatexInclude, IncWithLines, Snippet };
468 469
    DocInclude(DocNode *parent,const QCString &file,
               const QCString context, Type t,
Dimitri van Heesch's avatar
Dimitri van Heesch committed
470 471
               bool isExample,const QCString exampleFile,
               const QCString blockId) : 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
472
      m_file(file), m_context(context), m_type(t),
Dimitri van Heesch's avatar
Dimitri van Heesch committed
473 474 475
      m_isExample(isExample), m_exampleFile(exampleFile),
      m_blockId(blockId) { m_parent = parent; }
    Kind kind() const            { return Kind_Include; }
476 477
    QCString file() const        { return m_file; }
    QCString extension() const   { int i=m_file.findRev('.'); 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
478 479 480 481 482 483
                                   if (i!=-1) 
                                     return m_file.right(m_file.length()-i); 
                                   else 
                                     return ""; 
                                 }
    Type type() const            { return m_type; }
484 485
    QCString text() const        { return m_text; }
    QCString context() const     { return m_context; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
486 487
    QCString blockId() const     { return m_blockId; }
    bool isExample() const       { return m_isExample; }
488
    QCString exampleFile() const { return m_exampleFile; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
489
    void accept(DocVisitor *v)   { v->visit(this); }
490
    void parse();
491 492

  private:
493 494 495
    QCString  m_file;
    QCString  m_context;
    QCString  m_text;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
496 497
    Type      m_type;
    bool      m_isExample;
498
    QCString  m_exampleFile;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
499
    QCString  m_blockId;
500 501
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
502
/** Node representing a include/dontinclude operator block */
503 504 505 506
class DocIncOperator : public DocNode
{
  public:
    enum Type { Line, SkipLine, Skip, Until };
507 508
    DocIncOperator(DocNode *parent,Type t,const QCString &pat,
                   const QCString &context,bool isExample,const QCString &exampleFile) : 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
509
      m_type(t), m_pattern(pat), m_context(context), 
510
      m_isFirst(FALSE), m_isLast(FALSE),
Dimitri van Heesch's avatar
Dimitri van Heesch committed
511
      m_isExample(isExample), m_exampleFile(exampleFile) { m_parent = parent; }
512 513
    Kind kind() const           { return Kind_IncOperator; }
    Type type() const           { return m_type; }
514 515 516
    QCString text() const        { return m_text; }
    QCString pattern() const     { return m_pattern; }
    QCString context() const     { return m_context; }
517 518 519
    void accept(DocVisitor *v)  { v->visit(this); }
    bool isFirst() const        { return m_isFirst; }
    bool isLast() const         { return m_isLast; }
520 521
    void markFirst(bool v=TRUE) { m_isFirst = v; }
    void markLast(bool v=TRUE)  { m_isLast = v; }
522
    bool isExample() const      { return m_isExample; }
523
    QCString exampleFile() const { return m_exampleFile; }
524
    void parse();
525 526

  private:
527
    Type     m_type;
528 529 530
    QCString  m_text;
    QCString  m_pattern;
    QCString  m_context;
531 532
    bool     m_isFirst;
    bool     m_isLast;
533
    bool     m_isExample;
534
    QCString  m_exampleFile;
535 536
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
537
/** Node representing an item of a cross-referenced list */
538 539 540
class DocFormula : public DocNode
{
  public:
541
    DocFormula(DocNode *parent,int id);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
542
    Kind kind() const          { return Kind_Formula; }
543 544 545
    QCString name() const       { return m_name; }
    QCString text() const       { return m_text; }
    QCString relPath() const    { return m_relPath; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
546
    int id() const             { return m_id; }
547
    void accept(DocVisitor *v) { v->visit(this); }
548
    bool isInline()            { return m_text.length()>0 ? m_text.at(0)!='\\' : TRUE; }
549 550

  private:
551 552 553
    QCString  m_name;
    QCString  m_text;
    QCString  m_relPath;
554
    int      m_id;
555 556
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
557
/** Node representing an entry in the index. */
558
class DocIndexEntry : public DocNode
559 560
{
  public:
561
    DocIndexEntry(DocNode *parent,Definition *scope,MemberDef *md) 
562
      : m_scope(scope), m_member(md){ m_parent = parent; }
563
    Kind kind() const { return Kind_IndexEntry; }
564
    int parse();
565 566
    Definition *scope() const    { return m_scope;  }
    MemberDef *member() const    { return m_member; }
567
    QCString entry() const        { return m_entry;  }
568
    void accept(DocVisitor *v)   { v->visit(this);  }
569 570

  private:
571
    QCString     m_entry;
572 573
    Definition *m_scope;
    MemberDef  *m_member;
574 575
};

576 577
//-----------------------------------------------------------------------

Dimitri van Heesch's avatar
Dimitri van Heesch committed
578 579
/** Node representing a copy of documentation block. */
class DocCopy : public DocNode
580 581
{
  public:
582
    DocCopy(DocNode *parent,const QCString &link,bool copyBrief,bool copyDetails) 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
583 584
      : m_link(link), 
        m_copyBrief(copyBrief), m_copyDetails(copyDetails) { m_parent = parent; }
585
    Kind kind() const          { return Kind_Copy; }
586
    QCString link() const       { return m_link; }
587 588
    void accept(DocVisitor * /*v*/) { /*CompAccept<DocCopy>::accept(this,v);*/ }
    void parse(QList<DocNode> &children);
589 590

  private:
591
    QCString  m_link;
592 593
    bool     m_copyBrief;
    bool     m_copyDetails;
594 595
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
596
/** Node representing an auto List */
597 598 599
class DocAutoList : public CompAccept<DocAutoList>, public DocNode
{
  public:
Dimitri van Heesch's avatar
Dimitri van Heesch committed
600
    DocAutoList(DocNode *parent,int indent,bool isEnumList,int depth);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
601 602 603
    Kind kind() const          { return Kind_AutoList; }
    bool isEnumList() const    { return m_isEnumList; }
    int  indent() const        { return m_indent; }
604
    int depth() const          { return m_depth; }
605
    void accept(DocVisitor *v) { CompAccept<DocAutoList>::accept(this,v); }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
606
    int parse();
607 608

  private:
609 610
    int      m_indent;
    bool     m_isEnumList;
611
    int      m_depth;
612 613
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
614
/** Node representing an item of a auto list */
615 616 617
class DocAutoListItem : public CompAccept<DocAutoListItem>, public DocNode
{
  public:
Dimitri van Heesch's avatar
Dimitri van Heesch committed
618
    DocAutoListItem(DocNode *parent,int indent,int num);
619 620 621 622 623 624 625 626 627 628 629
    Kind kind() const          { return Kind_AutoListItem; }
    int itemNumber() const     { return m_itemNum; }
    void accept(DocVisitor *v) { CompAccept<DocAutoListItem>::accept(this,v); }
    int parse();

  private:
    int m_indent;
    int m_itemNum;
};


630

Dimitri van Heesch's avatar
Dimitri van Heesch committed
631
/** Node representing a simple section title */
632 633 634
class DocTitle : public CompAccept<DocTitle>, public DocNode
{
  public:
Dimitri van Heesch's avatar
Dimitri van Heesch committed
635
    DocTitle(DocNode *parent) { m_parent = parent; }
636
    void parse();
637
    void parseFromString(const QCString &title);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
638
    Kind kind() const          { return Kind_Title; }
639 640 641 642 643
    void accept(DocVisitor *v) { CompAccept<DocTitle>::accept(this,v); }

  private:
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
644
/** Node representing an item of a cross-referenced list */
645 646 647
class DocXRefItem : public CompAccept<DocXRefItem>, public DocNode
{
  public:
648
    DocXRefItem(DocNode *parent,int id,const char *key);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
649
    Kind kind() const          { return Kind_XRefItem; }
650 651 652 653 654
    QCString file() const       { return m_file; }
    QCString anchor() const     { return m_anchor; }
    QCString title() const      { return m_title; }
    QCString relPath() const    { return m_relPath; }
    QCString key() const        { return m_key; }
655
    void accept(DocVisitor *v) { CompAccept<DocXRefItem>::accept(this,v); }
656
    bool parse();
657 658

  private:
659
    int      m_id;
660 661 662 663 664
    QCString  m_key;
    QCString  m_file;
    QCString  m_anchor;
    QCString  m_title;
    QCString  m_relPath;
665 666
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
667
/** Node representing an image */
668 669 670
class DocImage : public CompAccept<DocImage>, public DocNode
{
  public:
671
    enum Type { Html, Latex, Rtf, DocBook };
Dimitri van Heesch's avatar
Dimitri van Heesch committed
672 673 674 675
    DocImage(DocNode *parent,const HtmlAttribList &attribs,
             const QCString &name,Type t,const QCString &url=QCString());
    Kind kind() const           { return Kind_Image; }
    Type type() const           { return m_type; }
676
    QCString name() const       { return m_name; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
677
    bool hasCaption() const     { return !m_children.isEmpty(); }
678 679 680
    QCString width() const      { return m_width; }
    QCString height() const     { return m_height; }
    QCString relPath() const    { return m_relPath; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
681
    QCString url() const        { return m_url; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
682
    const HtmlAttribList &attribs() const { return m_attribs; }
683
    void accept(DocVisitor *v) { CompAccept<DocImage>::accept(this,v); }
684
    void parse();
685 686

  private:
Dimitri van Heesch's avatar
Dimitri van Heesch committed
687
    HtmlAttribList m_attribs;
688
    QCString  m_name;
689
    Type     m_type;
690 691 692
    QCString  m_width;
    QCString  m_height;
    QCString  m_relPath;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
693
    QCString  m_url;
694 695
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
696
/** Node representing a dot file */
697 698 699
class DocDotFile : public CompAccept<DocDotFile>, public DocNode
{
  public:
700
    DocDotFile(DocNode *parent,const QCString &name,const QCString &context);
701
    void parse();
702
    Kind kind() const          { return Kind_DotFile; }
703 704 705
    QCString name() const       { return m_name; }
    QCString file() const       { return m_file; }
    QCString relPath() const    { return m_relPath; }
706
    bool hasCaption() const    { return !m_children.isEmpty(); }
707 708 709
    QCString width() const      { return m_width; }
    QCString height() const     { return m_height; }
    QCString context() const    { return m_context; }
710 711
    void accept(DocVisitor *v) { CompAccept<DocDotFile>::accept(this,v); }
  private:
712 713 714 715 716 717
    QCString  m_name;
    QCString  m_file;
    QCString  m_relPath;
    QCString  m_width;
    QCString  m_height;
    QCString  m_context;
718 719
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
720
/** Node representing a msc file */
721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743
class DocMscFile : public CompAccept<DocMscFile>, public DocNode
{
  public:
    DocMscFile(DocNode *parent,const QCString &name,const QCString &context);
    void parse();
    Kind kind() const          { return Kind_MscFile; }
    QCString name() const      { return m_name; }
    QCString file() const      { return m_file; }
    QCString relPath() const   { return m_relPath; }
    bool hasCaption() const    { return !m_children.isEmpty(); }
    QCString width() const     { return m_width; }
    QCString height() const    { return m_height; }
    QCString context() const   { return m_context; }
    void accept(DocVisitor *v) { CompAccept<DocMscFile>::accept(this,v); }
  private:
    QCString  m_name;
    QCString  m_file;
    QCString  m_relPath;
    QCString  m_width;
    QCString  m_height;
    QCString  m_context;
};

744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767
/** Node representing a dia file */
class DocDiaFile : public CompAccept<DocDiaFile>, public DocNode
{
  public:
    DocDiaFile(DocNode *parent,const QCString &name,const QCString &context);
    void parse();
    Kind kind() const          { return Kind_DiaFile; }
    QCString name() const      { return m_name; }
    QCString file() const      { return m_file; }
    QCString relPath() const   { return m_relPath; }
    bool hasCaption() const    { return !m_children.isEmpty(); }
    QCString width() const     { return m_width; }
    QCString height() const    { return m_height; }
    QCString context() const   { return m_context; }
    void accept(DocVisitor *v) { CompAccept<DocDiaFile>::accept(this,v); }
  private:
    QCString  m_name;
    QCString  m_file;
    QCString  m_relPath;
    QCString  m_width;
    QCString  m_height;
    QCString  m_context;
};

768 769 770 771 772 773 774 775 776 777 778
/** Node representing a VHDL flow chart */
class DocVhdlFlow : public CompAccept<DocVhdlFlow>, public DocNode
{
  public:
    DocVhdlFlow(DocNode *parent);
    void parse();
    Kind kind() const    { return Kind_VhdlFlow; }
    bool hasCaption()    { return !m_children.isEmpty(); }
    void accept(DocVisitor *v) { CompAccept<DocVhdlFlow>::accept(this,v); }
  private:
};
779

Dimitri van Heesch's avatar
Dimitri van Heesch committed
780
/** Node representing a link to some item */
781 782 783
class DocLink : public CompAccept<DocLink>, public DocNode
{
  public:
784 785
    DocLink(DocNode *parent,const QCString &target);
    QCString parse(bool,bool isXmlLink=FALSE);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
786
    Kind kind() const          { return Kind_Link; }
787 788 789 790
    QCString file() const       { return m_file; }
    QCString relPath() const    { return m_relPath; }
    QCString ref() const        { return m_ref; }
    QCString anchor() const     { return m_anchor; }
791 792 793
    void accept(DocVisitor *v) { CompAccept<DocLink>::accept(this,v); }

  private:
794 795 796 797 798
    QCString  m_file;
    QCString  m_relPath;
    QCString  m_ref;
    QCString  m_anchor;
    QCString  m_refText;
799 800
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
801
/** Node representing a reference to some item */
802 803 804
class DocRef : public CompAccept<DocRef>, public DocNode
{
  public:
805
    DocRef(DocNode *parent,const QCString &target,const QCString &context);
806
    void parse();
807
    Kind kind() const            { return Kind_Ref; }
808 809 810 811 812
    QCString file() const         { return m_file; }
    QCString relPath() const      { return m_relPath; }
    QCString ref() const          { return m_ref; }
    QCString anchor() const       { return m_anchor; }
    QCString targetTitle() const  { return m_text; }
813 814 815
    bool hasLinkText() const     { return !m_children.isEmpty(); }
    bool refToAnchor() const     { return m_refToAnchor; }
    bool refToSection() const    { return m_refToSection; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
816
    bool isSubPage() const       { return m_isSubPage; }
817
    void accept(DocVisitor *v)   { CompAccept<DocRef>::accept(this,v); }
818 819

  private:
820 821
    bool      m_refToSection;
    bool      m_refToAnchor;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
822
    bool      m_isSubPage;
823 824 825 826 827
    QCString   m_file;
    QCString   m_relPath;
    QCString   m_ref;
    QCString   m_anchor;
    QCString   m_text;
828 829
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
830
/** Node representing an internal reference to some item */
831
class DocInternalRef : public CompAccept<DocInternalRef>, public DocNode
832 833
{
  public:
834
    DocInternalRef(DocNode *parent,const QCString &target);
835 836
    void parse();
    Kind kind() const            { return Kind_Ref; }
837 838 839
    QCString file() const         { return m_file; }
    QCString relPath() const      { return m_relPath; }
    QCString anchor() const       { return m_anchor; }
840
    void accept(DocVisitor *v)   { CompAccept<DocInternalRef>::accept(this,v); }
841 842

  private:
843 844 845
    QCString   m_file;
    QCString   m_relPath;
    QCString   m_anchor;
846 847
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
848
/** Node representing a Hypertext reference */
849 850 851
class DocHRef : public CompAccept<DocHRef>, public DocNode
{
  public:
Dimitri van Heesch's avatar
Dimitri van Heesch committed
852 853 854
    DocHRef(DocNode *parent,const HtmlAttribList &attribs,const QCString &url,
           const QCString &relPath) : 
      m_attribs(attribs), m_url(url), m_relPath(relPath) { m_parent = parent; }
855
    int parse();
856
    QCString url() const        { return m_url; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
857 858 859
    QCString relPath() const    { return m_relPath; }
    Kind kind() const           { return Kind_HRef; }
    void accept(DocVisitor *v)  { CompAccept<DocHRef>::accept(this,v); }
860
    const HtmlAttribList &attribs() const { return m_attribs; }
861 862

  private:
863
    HtmlAttribList m_attribs;
864
    QCString   m_url;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
865
    QCString   m_relPath;
866 867
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
868
/** Node Html heading */
869 870 871
class DocHtmlHeader : public CompAccept<DocHtmlHeader>, public DocNode
{
  public:
872
    DocHtmlHeader(DocNode *parent,const HtmlAttribList &attribs,int level) : 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
873
       m_level(level), m_attribs(attribs) { m_parent = parent; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
874 875
    int level() const                     { return m_level; }
    Kind kind() const                     { return Kind_HtmlHeader; }
876
    const HtmlAttribList &attribs() const { return m_attribs; }
877
    void accept(DocVisitor *v) { CompAccept<DocHtmlHeader>::accept(this,v); }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
878
    int parse();
879 880

  private:
881 882
    int           m_level;
    HtmlAttribList m_attribs;
883 884
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
885
/** Node representing a Html description item */
886 887 888
class DocHtmlDescTitle : public CompAccept<DocHtmlDescTitle>, public DocNode
{
  public:
889
    DocHtmlDescTitle(DocNode *parent,const HtmlAttribList &attribs) : 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
890
      m_attribs(attribs) { m_parent = parent; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
891
    Kind kind() const                     { return Kind_HtmlDescTitle; }
892
    const HtmlAttribList &attribs() const { return m_attribs; }
893
    void accept(DocVisitor *v) { CompAccept<DocHtmlDescTitle>::accept(this,v); }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
894
    int parse();
895 896

  private:
897
    HtmlAttribList m_attribs;
898 899
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
900
/** Node representing a Html description list */
901 902 903
class DocHtmlDescList : public CompAccept<DocHtmlDescList>, public DocNode
{
  public:
Dimitri van Heesch's avatar
Dimitri van Heesch committed
904 905
    DocHtmlDescList(DocNode *parent,const HtmlAttribList &attribs) :
      m_attribs(attribs) { m_parent = parent; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
906
    Kind kind() const                     { return Kind_HtmlDescList; }
907
    const HtmlAttribList &attribs() const { return m_attribs; }
908
    void accept(DocVisitor *v) { CompAccept<DocHtmlDescList>::accept(this,v); }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
909
    int parse();
910 911

  private:
912
    HtmlAttribList m_attribs;
913 914
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
915
/** Node representing a normal section */
916 917 918
class DocSection : public CompAccept<DocSection>, public DocNode
{
  public:
919
    DocSection(DocNode *parent,int level,const QCString &id) :
Dimitri van Heesch's avatar
Dimitri van Heesch committed
920
      m_level(level), m_id(id) { m_parent = parent; } 
921 922
    Kind kind() const          { return Kind_Section; }
    int level() const          { return m_level; }
923 924 925 926
    QCString title() const      { return m_title; }
    QCString anchor() const     { return m_anchor; }
    QCString id() const         { return m_id; }
    QCString file() const       { return m_file; }
927
    void accept(DocVisitor *v) { CompAccept<DocSection>::accept(this,v); }
928
    int parse();
929 930

  private:
931
    int      m_level;
932 933 934 935
    QCString  m_id;
    QCString  m_title;
    QCString  m_anchor;
    QCString  m_file;
936 937
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
938
/** Node representing a reference to a section */
939 940 941
class DocSecRefItem : public CompAccept<DocSecRefItem>, public DocNode
{
  public:
942
    DocSecRefItem(DocNode *parent,const QCString &target) : 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
943
      m_target(target) { m_parent = parent; }
944
    Kind kind() const          { return Kind_SecRefItem; }
945 946 947
    QCString target() const     { return m_target; }
    QCString file() const       { return m_file; }
    QCString anchor() const     { return m_anchor; }
948
    void accept(DocVisitor *v) { CompAccept<DocSecRefItem>::accept(this,v); }
949
    void parse();
950 951

  private:
952 953 954
    QCString  m_target;
    QCString  m_file;
    QCString  m_anchor;
955 956
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
957
/** Node representing a list of section references */
958 959 960
class DocSecRefList : public CompAccept<DocSecRefList>, public DocNode
{
  public:
Dimitri van Heesch's avatar
Dimitri van Heesch committed
961
    DocSecRefList(DocNode *parent) { m_parent = parent; }
962
    void parse();
Dimitri van Heesch's avatar
Dimitri van Heesch committed
963
    Kind kind() const          { return Kind_SecRefList; }
964 965 966 967 968
    void accept(DocVisitor *v) { CompAccept<DocSecRefList>::accept(this,v); }

  private:
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
969
/** Node representing an internal section of documentation */
970 971 972
class DocInternal : public CompAccept<DocInternal>, public DocNode
{
  public:
Dimitri van Heesch's avatar
Dimitri van Heesch committed
973
    DocInternal(DocNode *parent) { m_parent = parent; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
974
    int parse(int);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
975
    Kind kind() const          { return Kind_Internal; }
976 977 978 979 980
    void accept(DocVisitor *v) { CompAccept<DocInternal>::accept(this,v); }

  private:
};

981 982 983 984 985 986 987 988 989 990 991 992 993
/** Node representing an block of paragraphs */
class DocParBlock : public CompAccept<DocParBlock>, public DocNode
{
  public:
    DocParBlock(DocNode *parent) { m_parent = parent; }
    int parse();
    Kind kind() const          { return Kind_ParBlock; }
    void accept(DocVisitor *v) { CompAccept<DocParBlock>::accept(this,v); }

  private:
};


Dimitri van Heesch's avatar
Dimitri van Heesch committed
994
/** Node representing a simple list */
995 996 997
class DocSimpleList : public CompAccept<DocSimpleList>, public DocNode
{
  public:
Dimitri van Heesch's avatar
Dimitri van Heesch committed
998
    DocSimpleList(DocNode *parent) { m_parent = parent; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
999
    Kind kind() const          { return Kind_SimpleList; }
1000
    void accept(DocVisitor *v) { CompAccept<DocSimpleList>::accept(this,v); }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1001
    int parse();
1002 1003 1004 1005

  private:
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
1006
/** Node representing a Html list */
1007 1008 1009 1010
class DocHtmlList : public CompAccept<DocHtmlList>, public DocNode
{
  public:
    enum Type { Unordered, Ordered };
1011
    DocHtmlList(DocNode *parent,const HtmlAttribList &attribs,Type t) : 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1012
      m_type(t), m_attribs(attribs) { m_parent = parent; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1013 1014 1015
    Kind kind() const          { return Kind_HtmlList; }
    Type type() const          { return m_type; }
    void accept(DocVisitor *v) { CompAccept<DocHtmlList>::accept(this,v); }
1016
    const HtmlAttribList &attribs() const { return m_attribs; }
1017
    int parse();
1018
    int parseXml();
1019 1020

  private:
1021 1022
    Type          m_type;
    HtmlAttribList m_attribs;
1023 1024
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
1025
/** Node representing a simple section */
1026 1027 1028 1029 1030 1031
class DocSimpleSect : public CompAccept<DocSimpleSect>, public DocNode
{
  public:
    enum Type 
    {  
       Unknown, See, Return, Author, Authors, Version, Since, Date,
1032
       Note, Warning, Copyright, Pre, Post, Invar, Remark, Attention, User, Rcs
1033 1034 1035
    };
    DocSimpleSect(DocNode *parent,Type t);
    virtual ~DocSimpleSect();
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1036 1037
    Kind kind() const       { return Kind_SimpleSect; }
    Type type() const       { return m_type; }
1038
    QCString typeString() const;
1039
    void accept(DocVisitor *v);
1040
    int parse(bool userTitle,bool needsSeparator);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1041
    int parseRcs();
1042
    int parseXml();
1043
    void appendLinkWord(const QCString &word);
1044 1045 1046 1047 1048 1049

  private:
    Type            m_type;
    DocTitle *      m_title;
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
1050
/** Node representing a separator between two simple sections of the
1051 1052 1053 1054 1055
 *  same type. 
 */
class DocSimpleSectSep : public DocNode
{
  public:
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1056
    DocSimpleSectSep(DocNode *parent) { m_parent = parent; }
1057 1058 1059 1060 1061 1062
    Kind kind() const { return Kind_SimpleSectSep; }
    void accept(DocVisitor *v) { v->visit(this); }

  private:
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
1063
/** Node representing a parameter section */
1064 1065
class DocParamSect : public CompAccept<DocParamSect>, public DocNode
{
1066
    friend class DocParamList;
1067 1068 1069
  public:
    enum Type 
    {  
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1070
       Unknown, Param, RetVal, Exception, TemplateParam
1071
    };
1072 1073 1074 1075 1076
    enum Direction
    {
       In=1, Out=2, InOut=3, Unspecified=0
    };
    DocParamSect(DocNode *parent,Type t) 
1077
      : m_type(t), m_hasInOutSpecifier(FALSE), m_hasTypeSpecifier(FALSE) 
1078
    { m_parent = parent; }
1079
    int parse(const QCString &cmdName,bool xmlContext,Direction d);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1080 1081
    Kind kind() const          { return Kind_ParamSect; }
    Type type() const          { return m_type; }
1082
    void accept(DocVisitor *v) { CompAccept<DocParamSect>::accept(this,v); }
1083 1084
    bool hasInOutSpecifier() const { return m_hasInOutSpecifier; }
    bool hasTypeSpecifier() const  { return m_hasTypeSpecifier; }
1085 1086 1087

  private:
    Type            m_type;
1088 1089
    bool            m_hasInOutSpecifier;
    bool            m_hasTypeSpecifier;
1090 1091
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
1092
/** Node representing a paragraph in the documentation tree */
1093 1094 1095
class DocPara : public CompAccept<DocPara>, public DocNode
{
  public:
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1096 1097
    DocPara(DocNode *parent) : 
             m_isFirst(FALSE), m_isLast(FALSE) { m_parent = parent; }
1098
    int parse();
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1099 1100 1101
    Kind kind() const           { return Kind_Para; }
    bool isEmpty() const        { return m_children.isEmpty(); }
    void accept(DocVisitor *v)  { CompAccept<DocPara>::accept(this,v); }
1102 1103
    void markFirst(bool v=TRUE) { m_isFirst=v; }
    void markLast(bool v=TRUE)  { m_isLast=v; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1104 1105
    bool isFirst() const        { return m_isFirst; }
    bool isLast() const         { return m_isLast; }
1106

1107 1108 1109
    int handleCommand(const QCString &cmdName);
    int handleHtmlStartTag(const QCString &tagName,const HtmlAttribList &tagHtmlAttribs);
    int handleHtmlEndTag(const QCString &tagName);
1110
    int handleSimpleSection(DocSimpleSect::Type t,bool xmlContext=FALSE);
1111
    int handleXRefItem();
1112
    int handleParamSection(const QCString &cmdName,DocParamSect::Type t,
1113
                           bool xmlContext,
1114
                           int direction);
1115 1116 1117
    void handleIncludeOperator(const QCString &cmdName,DocIncOperator::Type t);
    void handleImage(const QCString &cmdName);
    void handleDotFile(const QCString &cmdName);
1118
    void handleMscFile(const QCString &cmdName);
1119
    void handleDiaFile(const QCString &cmdName);
1120 1121
    void handleInclude(const QCString &cmdName,DocInclude::Type t);
    void handleLink(const QCString &cmdName,bool isJavaLink);
1122
    void handleCite();
1123 1124
    void handleRef(const QCString &cmdName);
    void handleSection(const QCString &cmdName);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1125
    void handleInheritDoc();
1126
    void handleVhdlFlow();
1127
    int handleStartCode();
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1128
    int handleHtmlHeader(const HtmlAttribList &tagHtmlAttribs,int level);
1129

1130
    bool injectToken(int tok,const QCString &tokText);
1131 1132

  private:
1133
    QCString  m_sectionId;
1134 1135 1136 1137
    bool     m_isFirst;
    bool     m_isLast;
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
1138
/** Node representing a parameter list. */
1139 1140 1141
class DocParamList : public DocNode
{
  public:
1142
    DocParamList(DocNode *parent,DocParamSect::Type t,DocParamSect::Direction d) 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1143
      : m_type(t), m_dir(d), m_isFirst(TRUE), m_isLast(TRUE)
1144 1145 1146 1147 1148
    { m_paragraphs.setAutoDelete(TRUE); 
      m_params.setAutoDelete(TRUE); 
      m_paramTypes.setAutoDelete(TRUE);
      m_parent = parent; 
    }
1149
    virtual ~DocParamList()         { }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1150
    Kind kind() const               { return Kind_ParamList; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1151
    const QList<DocNode> &parameters()    { return m_params; }
1152
    const QList<DocNode> &paramTypes()    { return m_paramTypes; }
1153
    DocParamSect::Type type() const { return m_type; }
1154
    DocParamSect::Direction direction() const { return m_dir; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1155 1156 1157 1158
    void markFirst(bool b=TRUE)     { m_isFirst=b; }
    void markLast(bool b=TRUE)      { m_isLast=b; }
    bool isFirst() const            { return m_isFirst; }
    bool isLast() const             { return m_isLast; }
1159 1160 1161
    void accept(DocVisitor *v)
    { 
      v->visitPre(this); 
1162 1163 1164
      QListIterator<DocPara> cli(m_paragraphs);
      DocNode *n;
      for (cli.toFirst();(n=cli.current());++cli) n->accept(v);
1165 1166
      v->visitPost(this); 
    }
1167 1168
    int parse(const QCString &cmdName);
    int parseXml(const QCString &paramName);
1169 1170

  private:
1171
    QList<DocPara>          m_paragraphs;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1172
    QList<DocNode>          m_params;
1173
    QList<DocNode>          m_paramTypes;
1174 1175 1176 1177
    DocParamSect::Type      m_type;
    DocParamSect::Direction m_dir;
    bool                    m_isFirst;
    bool                    m_isLast;
1178 1179
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
1180
/** Node representing a simple list item */
1181 1182 1183
class DocSimpleListItem : public DocNode
{
  public:
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1184 1185
    DocSimpleListItem(DocNode *parent)
    { m_paragraph=new DocPara(this); m_parent = parent; }
1186 1187
    int parse();
    virtual ~DocSimpleListItem() { delete m_paragraph; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1188
    Kind kind() const            { return Kind_SimpleListItem; }
1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199
    void accept(DocVisitor *v)
    {
      v->visitPre(this); 
      m_paragraph->accept(v);
      v->visitPost(this); 
    }

  private:
    DocPara *m_paragraph;
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
1200
/** Node representing a HTML list item */
1201 1202 1203
class DocHtmlListItem : public CompAccept<DocHtmlListItem>, public DocNode
{
  public:
1204
    DocHtmlListItem(DocNode *parent,const HtmlAttribList &attribs,int num) : 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1205
      m_attribs(attribs), m_itemNum(num) { m_parent = parent; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1206 1207
    Kind kind() const                     { return Kind_HtmlListItem; }
    int itemNumber() const                { return m_itemNum; }
1208
    const HtmlAttribList &attribs() const { return m_attribs; }
1209
    void accept(DocVisitor *v) { CompAccept<DocHtmlListItem>::accept(this,v); }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1210
    int parse();
1211
    int parseXml();
1212 1213

  private:
1214
    HtmlAttribList m_attribs;
1215
    int            m_itemNum;
1216 1217
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
1218
/** Node representing a HTML description data */
1219 1220 1221
class DocHtmlDescData : public CompAccept<DocHtmlDescData>, public DocNode
{
  public:
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1222
    DocHtmlDescData(DocNode *parent) { m_parent = parent; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1223
    Kind kind() const                     { return Kind_HtmlDescData; }
1224
    const HtmlAttribList &attribs() const { return m_attribs; }
1225
    void accept(DocVisitor *v) { CompAccept<DocHtmlDescData>::accept(this,v); }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1226
    int parse();
1227 1228

  private:
1229
    HtmlAttribList m_attribs;
1230 1231
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
1232
/** Node representing a HTML table cell */
1233 1234
class DocHtmlCell : public CompAccept<DocHtmlCell>, public DocNode
{
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1235
    friend class DocHtmlTable;
1236
  public:
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1237
    enum Alignment { Left, Right, Center };
1238
    DocHtmlCell(DocNode *parent,const HtmlAttribList &attribs,bool isHeading) : 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1239
       m_isHeading(isHeading), 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1240 1241
       m_isFirst(FALSE), m_isLast(FALSE), m_attribs(attribs),
       m_rowIdx(-1), m_colIdx(-1) { m_parent = parent; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1242 1243 1244 1245 1246
    bool isHeading() const      { return m_isHeading; }
    bool isFirst() const        { return m_isFirst; }
    bool isLast() const         { return m_isLast; }
    Kind kind() const           { return Kind_HtmlCell; }
    void accept(DocVisitor *v)  { CompAccept<DocHtmlCell>::accept(this,v); }
1247
    void markFirst(bool v=TRUE) { m_isFirst=v; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1248 1249 1250
    void markLast(bool v=TRUE)  { m_isLast=v; }
    const HtmlAttribList &attribs() const { return m_attribs; }
    int parse();
1251
    int parseXml();
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1252 1253 1254 1255 1256
    int rowIndex() const        { return m_rowIdx; }
    int columnIndex() const     { return m_colIdx; }
    int rowSpan() const;
    int colSpan() const;
    Alignment alignment() const;
1257 1258

  private:
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1259 1260
    void setRowIndex(int idx)    { m_rowIdx = idx; }
    void setColumnIndex(int idx) { m_colIdx = idx; }
1261
    bool           m_isHeading;
1262 1263
    bool           m_isFirst;
    bool           m_isLast;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1264 1265 1266
    HtmlAttribList m_attribs;
    int            m_rowIdx;
    int            m_colIdx;
1267 1268
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
1269
/** Node representing a HTML table caption */
1270 1271 1272
class DocHtmlCaption : public CompAccept<DocHtmlCaption>, public DocNode
{
  public:
1273
    DocHtmlCaption(DocNode *parent,const HtmlAttribList &attribs) : 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1274
      m_attribs(attribs) { m_parent = parent; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1275
    Kind kind() const          { return Kind_HtmlCaption; }
1276
    void accept(DocVisitor *v) { CompAccept<DocHtmlCaption>::accept(this,v); }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1277 1278
    const HtmlAttribList &attribs() const { return m_attribs; }
    int parse();
1279 1280

  private:
1281
    HtmlAttribList m_attribs;
1282 1283
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
1284
/** Node representing a HTML table row */
1285 1286
class DocHtmlRow : public CompAccept<DocHtmlRow>, public DocNode
{
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1287
    friend class DocHtmlTable;
1288
  public:
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1289
    DocHtmlRow(DocNode *parent,const HtmlAttribList &attribs) : 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1290
      m_attribs(attribs), m_visibleCells(-1), m_rowIdx(-1) { m_parent = parent; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1291 1292
    Kind kind() const          { return Kind_HtmlRow; }
    uint numCells() const      { return m_children.count(); }
1293
    void accept(DocVisitor *v) { CompAccept<DocHtmlRow>::accept(this,v); }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1294 1295
    const HtmlAttribList &attribs() const { return m_attribs; }
    int parse();
1296
    int parseXml(bool header);
1297 1298 1299
    bool isHeading() const     { return m_children.count()>0 && 
                                 ((DocHtmlCell*)m_children.getFirst())->isHeading(); 
                               }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1300 1301 1302
    void setVisibleCells(int n) { m_visibleCells = n; }
    int visibleCells() const    { return m_visibleCells; }
    int rowIndex() const        { return m_rowIdx; }
1303 1304

  private:
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1305
    void setRowIndex(int idx)    { m_rowIdx = idx; }
1306
    HtmlAttribList m_attribs;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1307 1308
    int m_visibleCells;
    int m_rowIdx;
1309 1310
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
1311
/** Node representing a HTML table */
1312 1313 1314
class DocHtmlTable : public CompAccept<DocHtmlTable>, public DocNode
{
  public:
1315
    DocHtmlTable(DocNode *parent,const HtmlAttribList &attribs) 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1316
      : m_attribs(attribs) { m_caption=0; m_parent = parent; }
1317 1318 1319 1320
    ~DocHtmlTable()         { delete m_caption; }
    Kind kind() const       { return Kind_HtmlTable; }
    uint numRows() const    { return m_children.count(); }
    bool hasCaption()       { return m_caption!=0; }
1321
    const HtmlAttribList &attribs() const { return m_attribs; }
1322
    int parse();
1323
    int parseXml();
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1324
    uint numColumns() const { return m_numCols; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1325
    void accept(DocVisitor *v);
1326 1327

  private:
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1328
    void computeTableGrid();
1329
    DocHtmlCaption    *m_caption;
1330
    HtmlAttribList     m_attribs;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1331
    int m_numCols;
1332 1333
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
1334
/** Node representing an HTML blockquote */
1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346
class DocHtmlBlockQuote : public CompAccept<DocHtmlBlockQuote>, public DocNode
{
  public:
    DocHtmlBlockQuote(DocNode *parent,const HtmlAttribList &attribs)
      : m_attribs(attribs) { m_parent = parent; }
    Kind kind() const       { return Kind_HtmlBlockQuote; }
    int parse();
    void accept(DocVisitor *v) { CompAccept<DocHtmlBlockQuote>::accept(this,v); }
    const HtmlAttribList &attribs() const { return m_attribs; }

  private:
    HtmlAttribList m_attribs;
1347 1348
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
1349
/** Root node of a text fragment */
1350 1351 1352
class DocText : public CompAccept<DocText>, public DocNode
{
  public:
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1353
    DocText() {}
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1354
    Kind kind() const       { return Kind_Text; }
1355
    void accept(DocVisitor *v) { CompAccept<DocText>::accept(this,v); }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1356
    void parse();
1357
    bool isEmpty() const    { return m_children.isEmpty(); }
1358
};
1359

Dimitri van Heesch's avatar
Dimitri van Heesch committed
1360
/** Root node of documentation tree */
1361 1362 1363
class DocRoot : public CompAccept<DocRoot>, public DocNode
{
  public:
1364
    DocRoot(bool indent,bool sl) : m_indent(indent), m_singleLine(sl) {}
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1365
    Kind kind() const       { return Kind_Root; }
1366
    void accept(DocVisitor *v) { CompAccept<DocRoot>::accept(this,v); }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1367
    void parse();
1368 1369
    bool indent() const { return m_indent; }
    bool singleLine() const { return m_singleLine; }
1370
    bool isEmpty() const { return m_children.isEmpty(); }
1371 1372 1373 1374

  private:
    bool m_indent;
    bool m_singleLine;
1375 1376 1377 1378
};


#endif