dochandler.h 29.3 KB
Newer Older
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1 2 3 4 5
/******************************************************************************
 *
 * $Id$
 *
 *
6
 * Copyright (C) 1997-2002 by Dimitri van Heesch.
Dimitri van Heesch's avatar
Dimitri van Heesch committed
7 8 9 10 11 12 13 14 15
 *
 * 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.
 *
 */

Dimitri van Heesch's avatar
Dimitri van Heesch committed
16 17 18 19 20 21 22
#ifndef _DOCHANDLER_H
#define _DOCHANDLER_H

#include <qstring.h>
#include <qlist.h>
#include <qxml.h>

Dimitri van Heesch's avatar
Dimitri van Heesch committed
23
#include <doxmlintf.h>
Dimitri van Heesch's avatar
Dimitri van Heesch committed
24
#include "basehandler.h"
Dimitri van Heesch's avatar
Dimitri van Heesch committed
25
#include "baseiterator.h"
Dimitri van Heesch's avatar
Dimitri van Heesch committed
26

Dimitri van Heesch's avatar
Dimitri van Heesch committed
27 28 29 30 31 32 33 34
class ParagraphHandler;

//-----------------------------------------------------------------------------


/*! \brief Node representing a piece of text.
 *
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
35
class TextNode : public IDocText
Dimitri van Heesch's avatar
Dimitri van Heesch committed
36 37 38
{
  public:
    TextNode(const QString &t,int markup) 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
39 40 41 42 43 44 45
      : m_text(t), m_markup(markup) {}
    virtual ~TextNode() {}

    // IDocText
    virtual Kind kind() const { return Text; }
    virtual QString text() const { return m_text; }
    virtual int markup() const { return m_markup; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
46 47 48 49 50 51
  
  private:  
    QString m_text;
    int m_markup;
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
52 53 54 55 56
//-----------------------------------------------------------------------------

/*! \brief Node representing a change in the markup style.
 *
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
57
class MarkupModifierNode : public IDocMarkupModifier
Dimitri van Heesch's avatar
Dimitri van Heesch committed
58 59 60
{
  public:
    MarkupModifierNode(int markup,bool enabled) 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
61 62
      : m_markup(markup), m_enabled(enabled) {}
    virtual ~MarkupModifierNode() {}
Dimitri van Heesch's avatar
Dimitri van Heesch committed
63
  
Dimitri van Heesch's avatar
Dimitri van Heesch committed
64 65
    // IDocMarkupModifier
    virtual Kind kind() const { return MarkupModifier; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
66 67
    virtual bool enabled() const { return m_enabled; }
    virtual int markup() const { return m_markup; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
68

Dimitri van Heesch's avatar
Dimitri van Heesch committed
69 70 71 72 73
  private:
    int m_markup;
    bool m_enabled;
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
74 75 76 77 78 79

//-----------------------------------------------------------------------------

/*! \brief Handles markup commands in the XML input. 
 *
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
80 81 82
class MarkupHandler : public BaseFallBackHandler<MarkupHandler>
{
  public:
Dimitri van Heesch's avatar
Dimitri van Heesch committed
83
    MarkupHandler(QList<IDoc> &children,QString &curString);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
    virtual ~MarkupHandler();
    int markup() const { return m_curMarkup; }

    virtual void startBold(const QXmlAttributes &attrib);
    virtual void endBold();
    virtual void startEmphasis(const QXmlAttributes &attrib);
    virtual void endEmphasis();
    virtual void startComputerOutput(const QXmlAttributes &attrib);
    virtual void endComputerOutput();
    virtual void startCenter(const QXmlAttributes &attrib);
    virtual void endCenter();
    virtual void startSmallFont(const QXmlAttributes &attrib);
    virtual void endSmallFont();
    virtual void startSubscript(const QXmlAttributes &attrib);
    virtual void endSubscript();
    virtual void startSuperscript(const QXmlAttributes &attrib);
    virtual void endSuperscript();


  private:
    void addTextNode();

Dimitri van Heesch's avatar
Dimitri van Heesch committed
106
    QList<IDoc>    &m_children;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
107 108 109 110
    QString        &m_curString;
    int             m_curMarkup;
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
//-----------------------------------------------------------------------------

/*! \brief Node representing a paragraph of text and commands.
 *
 */
// children: itemizedlist, orderedlist, parameterlist, simplesect, ref,
//           variablelist, hruler, linebreak, ulink, email, link
//           programlisting, formula, image, dotfile, indexentry,
//           table
//
// children handled by MarkupHandler: 
//           bold, computeroutput, emphasis, center,
//           small, subscript, superscript. 
//
class ParagraphHandler : public IDocPara, 
                         public BaseHandler<ParagraphHandler>
{
    friend class ParagraphIterator;

  public:
    virtual void startParagraph(const QXmlAttributes& attrib);
    virtual void endParagraph();
    virtual void startItemizedList(const QXmlAttributes& attrib);
    virtual void startOrderedList(const QXmlAttributes& attrib);
    virtual void startParameterList(const QXmlAttributes& attrib);
    virtual void startSimpleSect(const QXmlAttributes& attrib);
    virtual void startRef(const QXmlAttributes& attrib);
    virtual void startVariableList(const QXmlAttributes& attrib);
    virtual void startHRuler(const QXmlAttributes& attrib);
    virtual void startLineBreak(const QXmlAttributes& attrib);
    virtual void startULink(const QXmlAttributes& attrib);
    virtual void startEMail(const QXmlAttributes& attrib);
    virtual void startLink(const QXmlAttributes& attrib);
    virtual void startProgramListing(const QXmlAttributes& attrib);
    virtual void startFormula(const QXmlAttributes& attrib);
    virtual void startImage(const QXmlAttributes& attrib);
    virtual void startDotFile(const QXmlAttributes& attrib);
    virtual void startIndexEntry(const QXmlAttributes& attrib);
    virtual void startTable(const QXmlAttributes& attrib);

    ParagraphHandler(IBaseHandler *parent);
    virtual ~ParagraphHandler();

    // IDocPara
    virtual Kind kind() const { return Para; }
    virtual IDocIterator *contents() const;

  private:
    void addTextNode();
    IBaseHandler   *m_parent;
    QList<IDoc>  m_children;
    MarkupHandler  *m_markupHandler;
};
Dimitri van Heesch's avatar
Dimitri van Heesch committed
164

165 166 167 168 169 170 171
class ParagraphIterator : public BaseIterator<IDocIterator,IDoc,IDoc>
{
  public:
    ParagraphIterator(const ParagraphHandler &handler) : 
      BaseIterator<IDocIterator,IDoc,IDoc>(handler.m_children) {}
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
172 173 174 175 176
//-----------------------------------------------------------------------------

/*! \brief Node representing a list item.
 *
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
177
class ListItemHandler : public IDocListItem, public BaseHandler<ListItemHandler>
Dimitri van Heesch's avatar
Dimitri van Heesch committed
178
{
Dimitri van Heesch's avatar
Dimitri van Heesch committed
179
    friend class ListItemIterator;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
180 181 182 183 184 185 186
  public:
    ListItemHandler(IBaseHandler *parent);
    virtual ~ListItemHandler();
    virtual void startListItem(const QXmlAttributes& attrib);
    virtual void endListItem();
    virtual void startParagraph(const QXmlAttributes& attrib);

Dimitri van Heesch's avatar
Dimitri van Heesch committed
187 188
    // IDocItem
    virtual Kind kind() const { return ListItem; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
189
    virtual IDocIterator *contents() const;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
190

Dimitri van Heesch's avatar
Dimitri van Heesch committed
191 192
  private:
    IBaseHandler   *m_parent;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
193
    QList<IDoc>  m_children;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
194 195
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
196 197 198 199 200 201 202
class ListItemIterator : public BaseIterator<IDocIterator,IDoc,IDoc>
{
  public:
    ListItemIterator(const ListItemHandler &handler) : 
      BaseIterator<IDocIterator,IDoc,IDoc>(handler.m_children) {}
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
203 204 205 206 207 208

//-----------------------------------------------------------------------------

/*! \brief Node representing list of items.
 *
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
209
class OrderedListHandler : public IDocOrderedList, public BaseHandler<OrderedListHandler>
Dimitri van Heesch's avatar
Dimitri van Heesch committed
210
{
Dimitri van Heesch's avatar
Dimitri van Heesch committed
211
    friend class OrderedListIterator;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
212
  public:
Dimitri van Heesch's avatar
Dimitri van Heesch committed
213 214 215 216 217
    OrderedListHandler(IBaseHandler *parent);
    virtual ~OrderedListHandler();
    virtual void startOrderedList(const QXmlAttributes& attrib);
    virtual void endOrderedList();
    virtual void startOrderedListItem(const QXmlAttributes& attrib);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
218

Dimitri van Heesch's avatar
Dimitri van Heesch committed
219 220 221
    // IDocOrderedList
    virtual Kind kind() const { return OrderedList; }
    virtual IDocIterator *elements() const;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
222

Dimitri van Heesch's avatar
Dimitri van Heesch committed
223 224
  private:
    IBaseHandler   *m_parent;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
225
    QList<IDoc>  m_children;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
226 227 228 229 230 231 232
};

class OrderedListIterator : public BaseIterator<IDocIterator,IDoc,IDoc>
{
  public:
    OrderedListIterator(const OrderedListHandler &handler) : 
      BaseIterator<IDocIterator,IDoc,IDoc>(handler.m_children) {}
Dimitri van Heesch's avatar
Dimitri van Heesch committed
233 234
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
235 236 237

//-----------------------------------------------------------------------------

Dimitri van Heesch's avatar
Dimitri van Heesch committed
238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268
/*! \brief Node representing list of items.
 *
 */
class ItemizedListHandler : public IDocItemizedList, public BaseHandler<ItemizedListHandler>
{
    friend class ItemizedListIterator;
  public:
    ItemizedListHandler(IBaseHandler *parent);
    virtual ~ItemizedListHandler();
    virtual void startItemizedList(const QXmlAttributes& attrib);
    virtual void endItemizedList();
    virtual void startItemizedListItem(const QXmlAttributes& attrib);

    // IDocItemizedList
    virtual Kind kind() const { return ItemizedList; }
    virtual IDocIterator *elements() const;

  private:
    IBaseHandler   *m_parent;
    QList<IDoc>  m_children;
};

class ItemizedListIterator : public BaseIterator<IDocIterator,IDoc,IDoc>
{
  public:
    ItemizedListIterator(const ItemizedListHandler &handler) : 
      BaseIterator<IDocIterator,IDoc,IDoc>(handler.m_children) {}
};


//-----------------------------------------------------------------------------
Dimitri van Heesch's avatar
Dimitri van Heesch committed
269 270 271
/*! \brief Node representing a parameter.
 *
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
272
class ParameterHandler : public IDocParameter, 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
273 274 275 276 277
                         public BaseHandler<ParameterHandler>
{
  public:
    ParameterHandler(IBaseHandler *parent);
    virtual ~ParameterHandler();
278 279 280 281 282
    virtual void startParameterName(const QXmlAttributes& attrib);
    virtual void endParameterName();
    virtual void startParameterDescription(const QXmlAttributes& attrib);
    virtual void endParameterDescription();
    virtual void startParagraph(const QXmlAttributes& attrib);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
283

Dimitri van Heesch's avatar
Dimitri van Heesch committed
284 285
    // IDocParameter
    virtual Kind kind() const { return Parameter; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
286 287
    virtual QString name() const { return m_name; }
    virtual IDocPara *description() const { return m_description; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
288

Dimitri van Heesch's avatar
Dimitri van Heesch committed
289 290 291 292 293 294 295 296 297 298 299
  private:
    IBaseHandler     *m_parent;
    QString           m_name;
    ParagraphHandler *m_description;
};

//-----------------------------------------------------------------------------

/* \brief Node representing a parameter list.
 *
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
300
class ParameterListHandler : public IDocParameterList, 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
301 302
                             public BaseHandler<ParameterListHandler>
{
Dimitri van Heesch's avatar
Dimitri van Heesch committed
303
    friend class ParameterListIterator;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
304 305 306 307 308
  public:
    ParameterListHandler(IBaseHandler *parent);
    virtual ~ParameterListHandler();
    virtual void startParameterList(const QXmlAttributes& attrib);
    virtual void endParameterList();
309 310
    virtual void startParameterName(const QXmlAttributes& attrib);
    virtual void startParameterDescription(const QXmlAttributes& attrib);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
311

Dimitri van Heesch's avatar
Dimitri van Heesch committed
312 313
    // IDocParameterList
    virtual Kind kind() const { return ParameterList; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
314 315
    virtual Types listType() const { return m_type; }
    virtual IDocIterator *params() const;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
316

Dimitri van Heesch's avatar
Dimitri van Heesch committed
317 318 319 320
  private:
    IBaseHandler            *m_parent;
    QList<ParameterHandler>  m_parameters;
    ParameterHandler        *m_curParam;
321 322 323
    Types                    m_type;
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
324 325 326 327 328 329 330
class ParameterListIterator : public BaseIterator<IDocIterator,IDoc,ParameterHandler>
{
  public:
    ParameterListIterator(const ParameterListHandler &handler) : 
      BaseIterator<IDocIterator,IDoc,ParameterHandler>(handler.m_parameters) {}
};

331 332
//-----------------------------------------------------------------------------

333 334 335
/* \brief Node representing a horizontal ruler
 *
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
336
class LineBreakHandler : public IDocLineBreak, public BaseHandler<LineBreakHandler>
337 338 339 340 341 342 343 344
{
  public:
    LineBreakHandler(IBaseHandler *parent);
    virtual ~LineBreakHandler();

    void startLineBreak(const QXmlAttributes& attrib);
    void endLineBreak();

Dimitri van Heesch's avatar
Dimitri van Heesch committed
345 346 347
    // IDocLineBreak
    virtual Kind kind() const { return LineBreak; }

348 349 350 351 352 353
  private:
    IBaseHandler   *m_parent;
};

//-----------------------------------------------------------------------------

Dimitri van Heesch's avatar
Dimitri van Heesch committed
354 355 356
/* \brief Node representing a link to section
 *
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
357
class LinkHandler : public IDocLink, public BaseHandler<LinkHandler>
Dimitri van Heesch's avatar
Dimitri van Heesch committed
358 359 360 361 362 363 364 365
{
  public:
    LinkHandler(IBaseHandler *parent);
    virtual ~LinkHandler();

    void startLink(const QXmlAttributes& attrib);
    void endLink();

Dimitri van Heesch's avatar
Dimitri van Heesch committed
366 367
    // IDocLink
    virtual Kind kind() const { return Link; }
368 369
    virtual QString refId() const { return m_ref; }
    virtual QString text() const { return m_text; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
370

Dimitri van Heesch's avatar
Dimitri van Heesch committed
371 372 373 374 375 376 377 378 379 380 381 382
  private:
    IBaseHandler   *m_parent;
    QString         m_ref;
    QString         m_text;
};


//-----------------------------------------------------------------------------

/* \brief Node representing a link to an email address
 *
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
383
class EMailHandler : public IDocEMail, public BaseHandler<EMailHandler>
Dimitri van Heesch's avatar
Dimitri van Heesch committed
384 385 386 387 388 389 390 391
{
  public:
    EMailHandler(IBaseHandler *parent);
    virtual ~EMailHandler();

    void startEMail(const QXmlAttributes& attrib);
    void endEMail();

Dimitri van Heesch's avatar
Dimitri van Heesch committed
392 393
    // IDocEMail
    virtual Kind kind() const { return EMail; }
394
    virtual QString address() const { return m_address; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
395

Dimitri van Heesch's avatar
Dimitri van Heesch committed
396 397 398 399 400 401 402 403 404 405 406
  private:
    IBaseHandler   *m_parent;
    QString         m_address;
};


//-----------------------------------------------------------------------------

/* \brief Node representing a link to an URL
 *
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
407
class ULinkHandler : public IDocULink, public BaseHandler<ULinkHandler>
Dimitri van Heesch's avatar
Dimitri van Heesch committed
408 409 410 411 412 413 414 415
{
  public:
    ULinkHandler(IBaseHandler *parent);
    virtual ~ULinkHandler();

    void startULink(const QXmlAttributes& attrib);
    void endULink();

Dimitri van Heesch's avatar
Dimitri van Heesch committed
416 417
    // IDocULink
    virtual Kind kind() const { return ULink; }
418 419
    virtual QString url() const { return m_url; }
    virtual QString text() const { return m_text; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
420

Dimitri van Heesch's avatar
Dimitri van Heesch committed
421 422 423 424 425 426 427 428
  private:
    IBaseHandler   *m_parent;
    QString         m_url;
    QString         m_text;
};

//-----------------------------------------------------------------------------

429 430 431
/* \brief Node representing a horizontal ruler
 *
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
432
class HRulerHandler : public IDocHRuler, public BaseHandler<HRulerHandler>
433 434 435 436 437 438 439 440
{
  public:
    HRulerHandler(IBaseHandler *parent);
    virtual ~HRulerHandler();

    void startHRuler(const QXmlAttributes& attrib);
    void endHRuler();

Dimitri van Heesch's avatar
Dimitri van Heesch committed
441 442 443
    // IDocHRuler
    virtual Kind kind() const { return HRuler; }

444 445 446 447 448 449 450 451 452
  private:
    IBaseHandler   *m_parent;
};

//-----------------------------------------------------------------------------

/* \brief Node representing a reference to another item
 *
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
453
class RefHandler : public IDocRef, public BaseHandler<RefHandler>
454 455 456 457 458 459
{
  public:
    RefHandler(IBaseHandler *parent);
    virtual ~RefHandler();
    void startRef(const QXmlAttributes& attrib);
    void endRef();
Dimitri van Heesch's avatar
Dimitri van Heesch committed
460 461 462

    // IDocRef
    virtual Kind kind() const { return Ref; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
463
    virtual QString refId() const { return m_refId; }
464 465 466
    virtual TargetKind targetKind() const { return m_targetKind; }
    virtual QString external() const { return m_extId; }
    virtual QString text() const { return m_linkText; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
467

468 469
  private:
    IBaseHandler   *m_parent;
470 471 472 473
    QString         m_refId;
    QString         m_extId;
    QString         m_linkText;
    TargetKind      m_targetKind;
474 475 476 477 478 479 480 481 482 483 484
};

//-----------------------------------------------------------------------------

/* \brief Node representing the title of a section
 *
 */
// children: text, ref
// children handled by MarkupHandler: 
//           bold, computeroutput, emphasis, center,
//           small, subscript, superscript. 
Dimitri van Heesch's avatar
Dimitri van Heesch committed
485
class TitleHandler : public IDocTitle, public BaseHandler<TitleHandler>
486
{
Dimitri van Heesch's avatar
Dimitri van Heesch committed
487
    friend class TitleIterator;
488 489 490 491 492 493 494
  public:
    TitleHandler(IBaseHandler *parent);
    virtual ~TitleHandler();
    virtual void startTitle(const QXmlAttributes& attrib);
    virtual void endTitle();
    virtual void startRef(const QXmlAttributes& attrib);
    void addTextNode();
Dimitri van Heesch's avatar
Dimitri van Heesch committed
495 496 497 498 499

    // IDocTitle
    virtual Kind kind() const { return Title; }
    virtual IDocIterator *title() const;

500 501
  private:
    IBaseHandler   *m_parent;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
502
    QList<IDoc>  m_children;
503 504 505
    MarkupHandler  *m_markupHandler;
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
506 507 508 509 510 511 512
class TitleIterator : public BaseIterator<IDocIterator,IDoc,IDoc>
{
  public:
    TitleIterator(const TitleHandler &handler) : 
      BaseIterator<IDocIterator,IDoc,IDoc>(handler.m_children) {}
};

513 514
//-----------------------------------------------------------------------------

515 516 517
/* \brief Node representing a simple section with an unnumbered header.
 *
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
518
// children: title, para
Dimitri van Heesch's avatar
Dimitri van Heesch committed
519
class SimpleSectHandler : public IDocSimpleSect, 
520 521 522 523 524 525 526
                          public BaseHandler<SimpleSectHandler>
{
  public:
    SimpleSectHandler(IBaseHandler *parent);
    virtual ~SimpleSectHandler();
    virtual void startSimpleSect(const QXmlAttributes& attrib);
    virtual void endSimpleSect();
Dimitri van Heesch's avatar
Dimitri van Heesch committed
527 528
    virtual void startTitle(const QXmlAttributes& attrib);
    virtual void startParagraph(const QXmlAttributes& attrib);
529

Dimitri van Heesch's avatar
Dimitri van Heesch committed
530 531
    // IDocSimpleSect
    virtual Kind kind() const { return SimpleSect; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
532 533 534
    virtual Types sectionType() const { return m_type; }
    virtual IDocTitle *title() const { return m_title; }
    virtual IDocPara *description() const { return m_paragraph; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
535

536 537
  private:
    IBaseHandler            *m_parent;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
538
    ParagraphHandler        *m_paragraph;
539
    Types                    m_type;
540 541 542 543 544
    TitleHandler            *m_title;
};

//-----------------------------------------------------------------------------

Dimitri van Heesch's avatar
Dimitri van Heesch committed
545 546 547
/* \brief Node representing an named item of a VariableList.
 *
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
548 549
class VariableListEntryHandler : public IDocVariableListEntry, 
                                 public BaseHandler<VariableListEntryHandler>
550 551 552 553 554 555 556 557 558 559 560 561 562
{
  public:
    virtual void startVarListEntry(const QXmlAttributes& attrib);
    virtual void endVarListEntry();
    virtual void startListItem(const QXmlAttributes& attrib);
    virtual void endListItem();
    virtual void startTerm(const QXmlAttributes& attrib);
    virtual void endTerm();
    virtual void startParagraph(const QXmlAttributes& attrib);

    VariableListEntryHandler(IBaseHandler *parent);
    virtual ~VariableListEntryHandler();

Dimitri van Heesch's avatar
Dimitri van Heesch committed
563 564
    // IDocVariableListEntry
    virtual Kind kind() const { return VariableListEntry; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
565 566
    virtual QString term() const { return m_term; }
    virtual IDocPara *description() const { return m_description; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
567

568 569 570 571 572 573 574 575 576 577 578 579
  private:
    IBaseHandler     *m_parent;
    QString           m_term;
    ParagraphHandler *m_description;
};

//-----------------------------------------------------------------------------

/*! \brief Node representing a list of named items.
 *
 */
// children: varlistentry, listitem
Dimitri van Heesch's avatar
Dimitri van Heesch committed
580 581
class VariableListHandler : public IDocVariableList, 
                            public BaseHandler<VariableListHandler>
582
{
Dimitri van Heesch's avatar
Dimitri van Heesch committed
583 584
    friend class VariableListIterator;
    
585 586 587 588 589 590 591 592 593
  public:
    virtual void startVariableList(const QXmlAttributes& attrib);
    virtual void endVariableList();
    virtual void startVarListEntry(const QXmlAttributes& attrib);
    virtual void startListItem(const QXmlAttributes& attrib);
    
    VariableListHandler(IBaseHandler *parent);
    virtual ~VariableListHandler();

Dimitri van Heesch's avatar
Dimitri van Heesch committed
594 595
    // IDocVariableList
    virtual Kind kind() const { return VariableList; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
596
    virtual IDocIterator *entries() const;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
597

598 599 600 601
  private:
    IBaseHandler   *m_parent;
    QList<VariableListEntryHandler> m_entries;
    VariableListEntryHandler *m_curEntry;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
602 603
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
604 605 606 607 608 609 610
class VariableListIterator : public BaseIterator<IDocIterator,IDoc,VariableListEntryHandler>
{
  public:
    VariableListIterator(const VariableListHandler &handler) : 
      BaseIterator<IDocIterator,IDoc,VariableListEntryHandler>(handler.m_entries) {}
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
611 612
//-----------------------------------------------------------------------------

613 614 615
/*! \brief Node representing a highlighted text fragment.
 *
 */
616
// children: ref
Dimitri van Heesch's avatar
Dimitri van Heesch committed
617
class HighlightHandler : public IDocHighlight, public BaseHandler<HighlightHandler>
618
{
619
    friend class HighlightIterator;
620 621 622 623 624
  public:
    HighlightHandler(IBaseHandler *parent);
    virtual ~HighlightHandler();
    void startHighlight(const QXmlAttributes& attrib);
    void endHighlight();
625
    virtual void startRef(const QXmlAttributes&);
626

Dimitri van Heesch's avatar
Dimitri van Heesch committed
627 628
    // IDocHighlight
    virtual Kind kind() const { return Highlight; }
629 630
    virtual HighlightKind highlightKind() const { return m_hl; }
    virtual IDocIterator *codeElements() const;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
631

632
  private:
633 634
    void addTextNode();
    
635
    IBaseHandler   *m_parent;
636 637 638 639 640 641 642 643 644 645
    HighlightKind  m_hl;
    QString        m_hlString;
    QList<IDoc>    m_children;
};

class HighlightIterator : public BaseIterator<IDocIterator,IDoc,IDoc>
{
  public:
    HighlightIterator(const HighlightHandler &handler) : 
      BaseIterator<IDocIterator,IDoc,IDoc>(handler.m_children) {}
646 647 648 649 650 651 652 653
};

//-----------------------------------------------------------------------------

/*! \brief Node representing a line of code.
 *
 */
// children: linenumber, highlight, anchor, ref
Dimitri van Heesch's avatar
Dimitri van Heesch committed
654
class CodeLineHandler : public IDocCodeLine, public BaseHandler<CodeLineHandler>
Dimitri van Heesch's avatar
Dimitri van Heesch committed
655
{
656
    friend class CodeLineIterator;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
657 658 659 660 661 662
  public:

    virtual void startCodeLine(const QXmlAttributes&);
    virtual void endCodeLine();
    virtual void startLineNumber(const QXmlAttributes&);
    virtual void endLineNumber();
663 664
    virtual void startHighlight(const QXmlAttributes&);
    virtual void startRef(const QXmlAttributes&);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
665 666 667
    
    CodeLineHandler(IBaseHandler *parent);
    virtual ~CodeLineHandler();
668

Dimitri van Heesch's avatar
Dimitri van Heesch committed
669 670
    // IDocCodeLine
    virtual Kind kind() const { return CodeLine; }
671 672 673
    virtual int lineNumber() const { return m_lineNumber; }
    virtual QString refId() const { return m_refId; }
    virtual IDocIterator *codeElements() const;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
674

Dimitri van Heesch's avatar
Dimitri van Heesch committed
675
  private:
676 677
    void addTextNode();

Dimitri van Heesch's avatar
Dimitri van Heesch committed
678 679
    IBaseHandler   *m_parent;
    int            m_lineNumber;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
680
    QString        m_refId;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
681
    QList<IDoc> m_children;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
682 683
};

684 685 686 687 688 689 690
class CodeLineIterator : public BaseIterator<IDocIterator,IDoc,IDoc>
{
  public:
    CodeLineIterator(const CodeLineHandler &handler) : 
      BaseIterator<IDocIterator,IDoc,IDoc>(handler.m_children) {}
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
691 692 693 694 695
//-----------------------------------------------------------------------------

/*! \brief Node representing a program listing
 *
 */
696
// children: codeline, linenumber
Dimitri van Heesch's avatar
Dimitri van Heesch committed
697
class ProgramListingHandler : public IDocProgramListing, public BaseHandler<ProgramListingHandler>
Dimitri van Heesch's avatar
Dimitri van Heesch committed
698
{
699
    friend class ProgramListingIterator;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
700 701 702 703 704 705 706 707
  public:
    virtual void startProgramListing(const QXmlAttributes& attrib);
    virtual void endProgramListing();
    virtual void startCodeLine(const QXmlAttributes&);
    virtual void startLineNumber(const QXmlAttributes&);

    ProgramListingHandler(IBaseHandler *parent);
    virtual ~ProgramListingHandler();
Dimitri van Heesch's avatar
Dimitri van Heesch committed
708 709 710

    // IDocProgramListing
    virtual Kind kind() const { return ProgramListing; }
711
    virtual IDocIterator *codeLines() const;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
712

Dimitri van Heesch's avatar
Dimitri van Heesch committed
713
  private:
714 715
    IBaseHandler           *m_parent;
    QList<CodeLineHandler>  m_children;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
716 717 718 719 720
    bool m_hasLineNumber;
};

//-----------------------------------------------------------------------------

721 722 723 724 725 726 727 728 729
class ProgramListingIterator : public BaseIterator<IDocIterator,IDoc,CodeLineHandler>
{
  public:
    ProgramListingIterator(const ProgramListingHandler &handler) : 
      BaseIterator<IDocIterator,IDoc,CodeLineHandler>(handler.m_children) {}
};

//-----------------------------------------------------------------------------

730 731 732 733
/*! \brief Node representing a formula.
 *
 */
// children: -
Dimitri van Heesch's avatar
Dimitri van Heesch committed
734
class FormulaHandler : public IDocFormula, public BaseHandler<FormulaHandler>
735 736 737 738 739 740 741
{
  public:
    FormulaHandler(IBaseHandler *parent);
    virtual ~FormulaHandler();
    void startFormula(const QXmlAttributes& attrib);
    void endFormula();

Dimitri van Heesch's avatar
Dimitri van Heesch committed
742 743
    // IDocFormula
    virtual Kind kind() const { return Formula; }
744 745
    virtual QString id() const { return m_id; }
    virtual QString text() const { return m_text; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
746

747 748 749 750 751 752 753 754 755 756 757 758
  private:
    IBaseHandler  *m_parent;
    QString        m_id;
    QString        m_text;
};

//-----------------------------------------------------------------------------

/*! \brief Node representing an image.
 *
 */
// children: -
Dimitri van Heesch's avatar
Dimitri van Heesch committed
759
class ImageHandler : public IDocImage, public BaseHandler<ImageHandler>
760 761 762 763 764 765 766
{
  public:
    ImageHandler(IBaseHandler *parent);
    virtual ~ImageHandler();
    void startImage(const QXmlAttributes& attrib);
    void endImage();

Dimitri van Heesch's avatar
Dimitri van Heesch committed
767 768
    // IDocImage
    virtual Kind kind() const { return Image; }
769 770
    virtual QString name() const { return m_name; }
    virtual QString caption() const { return m_caption; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
771

772 773 774 775 776 777 778 779 780 781 782 783
  private:
    IBaseHandler  *m_parent;
    QString        m_name;
    QString        m_caption;
};

//-----------------------------------------------------------------------------

/*! \brief Node representing a dot file.
 *
 */
// children: -
Dimitri van Heesch's avatar
Dimitri van Heesch committed
784
class DotFileHandler : public IDocDotFile, public BaseHandler<DotFileHandler>
785 786 787 788 789 790 791
{
  public:
    DotFileHandler(IBaseHandler *parent);
    virtual ~DotFileHandler();
    void startDotFile(const QXmlAttributes& attrib);
    void endDotFile();

Dimitri van Heesch's avatar
Dimitri van Heesch committed
792 793
    // IDocDotFile
    virtual Kind kind() const { return DotFile; }
794 795
    virtual QString name() const { return m_name; }
    virtual QString caption() const { return m_caption; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
796

797 798 799 800 801 802 803 804 805 806 807 808
  private:
    IBaseHandler  *m_parent;
    QString        m_name;
    QString        m_caption;
};

//-----------------------------------------------------------------------------

/*! \brief Node representing an entry in the index.
 *
 */
// children: -
Dimitri van Heesch's avatar
Dimitri van Heesch committed
809
class IndexEntryHandler : public IDocIndexEntry, public BaseHandler<IndexEntryHandler>
810 811 812 813 814 815 816 817 818 819 820
{
  public:
    IndexEntryHandler(IBaseHandler *parent);
    virtual ~IndexEntryHandler();
    void startIndexEntry(const QXmlAttributes& attrib);
    void endIndexEntry();
    void startPrimaryIE(const QXmlAttributes& attrib);
    void endPrimaryIE();
    void startSecondaryIE(const QXmlAttributes& attrib);
    void endSecondaryIE();

Dimitri van Heesch's avatar
Dimitri van Heesch committed
821 822
    // IDocIndexEntry
    virtual Kind kind() const { return IndexEntry; }
823 824
    virtual QString primary() const { return m_primary; }
    virtual QString secondary() const { return m_secondary; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
825

826 827 828 829 830 831 832 833
  private:
    IBaseHandler  *m_parent;
    QString        m_primary;
    QString        m_secondary;
};

//-----------------------------------------------------------------------------

Dimitri van Heesch's avatar
Dimitri van Heesch committed
834 835 836 837
/*! \brief Node representing an entry in the table entry.
 *
 */
// children: para
Dimitri van Heesch's avatar
Dimitri van Heesch committed
838
class EntryHandler : public IDocEntry, public BaseHandler<EntryHandler>
Dimitri van Heesch's avatar
Dimitri van Heesch committed
839
{
840
    friend class EntryIterator;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
841 842 843 844 845 846 847
  public:
    EntryHandler(IBaseHandler *parent);
    virtual ~EntryHandler();
    void startEntry(const QXmlAttributes& attrib);
    void endEntry();
    void startParagraph(const QXmlAttributes& attrib);

Dimitri van Heesch's avatar
Dimitri van Heesch committed
848 849
    // IDocEntry
    virtual Kind kind() const { return Entry; }
850
    virtual IDocIterator *contents() const;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
851

Dimitri van Heesch's avatar
Dimitri van Heesch committed
852 853
  private:
    IBaseHandler   *m_parent;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
854
    QList<IDoc>  m_children;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
855 856
};

857 858 859 860 861 862 863
class EntryIterator : public BaseIterator<IDocIterator,IDoc,IDoc>
{
  public:
    EntryIterator(const EntryHandler &handler) : 
      BaseIterator<IDocIterator,IDoc,IDoc>(handler.m_children) {}
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
864 865 866 867 868 869
//-----------------------------------------------------------------------------

/*! \brief Node representing an entry in the table row.
 *
 */
// children: entry
Dimitri van Heesch's avatar
Dimitri van Heesch committed
870
class RowHandler : public IDocRow, public BaseHandler<RowHandler>
Dimitri van Heesch's avatar
Dimitri van Heesch committed
871
{
872
    friend class RowIterator;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
873 874 875 876 877 878 879
  public:
    RowHandler(IBaseHandler *parent);
    virtual ~RowHandler();
    void startRow(const QXmlAttributes& attrib);
    void endRow();
    void startEntry(const QXmlAttributes& attrib);

Dimitri van Heesch's avatar
Dimitri van Heesch committed
880 881
    // IDocRow
    virtual Kind kind() const { return Row; }
882
    virtual IDocIterator *entries() const;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
883

Dimitri van Heesch's avatar
Dimitri van Heesch committed
884 885 886 887 888
  private:
    IBaseHandler        *m_parent;
    QList<EntryHandler>  m_children;
};

889 890 891 892 893 894 895
class RowIterator : public BaseIterator<IDocIterator,IDoc,EntryHandler>
{
  public:
    RowIterator(const RowHandler &handler) : 
      BaseIterator<IDocIterator,IDoc,EntryHandler>(handler.m_children) {}
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
896 897 898 899 900
//-----------------------------------------------------------------------------

/*! \brief Node representing an entry in the table.
 *
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
901
// children: row, caption
Dimitri van Heesch's avatar
Dimitri van Heesch committed
902
class TableHandler : public IDocTable, public BaseHandler<TableHandler>
Dimitri van Heesch's avatar
Dimitri van Heesch committed
903
{
904
    friend class TableIterator;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
905 906 907 908 909 910
  public:
    TableHandler(IBaseHandler *parent);
    virtual ~TableHandler();
    void startTable(const QXmlAttributes& attrib);
    void endTable();
    void startRow(const QXmlAttributes& attrib);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
911 912
    void startCaption(const QXmlAttributes& attrib);
    void endCaption();
Dimitri van Heesch's avatar
Dimitri van Heesch committed
913

Dimitri van Heesch's avatar
Dimitri van Heesch committed
914 915
    // IDocTable
    virtual Kind kind() const { return Table; }
916 917 918
    virtual IDocIterator *rows() const;
    virtual int numColumns() const { return m_numColumns; }
    virtual QString caption() const { return m_caption; }
Dimitri van Heesch's avatar
Dimitri van Heesch committed
919

Dimitri van Heesch's avatar
Dimitri van Heesch committed
920 921 922 923
  private:
    IBaseHandler      *m_parent;
    QList<RowHandler>  m_children;
    int                m_numColumns;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
924
    QString            m_caption;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
925 926
};

927
class TableIterator : public BaseIterator<IDocIterator,IDoc,RowHandler>
Dimitri van Heesch's avatar
Dimitri van Heesch committed
928 929
{
  public:
930 931
    TableIterator(const TableHandler &handler) : 
      BaseIterator<IDocIterator,IDoc,RowHandler>(handler.m_children) {}
Dimitri van Heesch's avatar
Dimitri van Heesch committed
932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975
};


//-----------------------------------------------------------------------------

/*! \brief Node representing a section.
 *
 */
// children: text, ref
// children handled by MarkupHandler: 
//           bold, computeroutput, emphasis, center,
//           small, subscript, superscript. 
class DocSectionHandler : public IDocSection, public BaseHandler<DocSectionHandler>
{
    friend class DocSectionIterator;
  public:
    DocSectionHandler(IBaseHandler *parent,int level);
    virtual ~DocSectionHandler();
    virtual void startDocSection(const QXmlAttributes& attrib);
    virtual void endDocSection();
    virtual void startRef(const QXmlAttributes& attrib);
    void addTextNode();

    // IDocSection
    virtual Kind kind() const { return Section; }
    virtual QString id() const { return m_id; }
    virtual int level() const { return m_level; }
    virtual IDocIterator *title() const;

  private:
    IBaseHandler   *m_parent;
    QList<IDoc>  m_children;
    MarkupHandler  *m_markupHandler;
    QString         m_id;
    int             m_level;
};

class DocSectionIterator : public BaseIterator<IDocIterator,IDoc,IDoc>
{
  public:
    DocSectionIterator(const DocSectionHandler &handler) : 
      BaseIterator<IDocIterator,IDoc,IDoc>(handler.m_children) {}
};

Dimitri van Heesch's avatar
Dimitri van Heesch committed
976
//-----------------------------------------------------------------------------
Dimitri van Heesch's avatar
Dimitri van Heesch committed
977

Dimitri van Heesch's avatar
Dimitri van Heesch committed
978 979 980
/*! \brief Node representing a documentation block.
 *
 */
Dimitri van Heesch's avatar
Dimitri van Heesch committed
981 982
// children: para, title, sect1, sect2, sect3
class DocHandler : public IDocRoot, public BaseHandler<DocHandler>
Dimitri van Heesch's avatar
Dimitri van Heesch committed
983
{
Dimitri van Heesch's avatar
Dimitri van Heesch committed
984
    friend class DocIterator;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
985 986 987 988
  public:
    virtual void startDoc(const QXmlAttributes& attrib);
    virtual void endDoc();
    virtual void startParagraph(const QXmlAttributes& attrib);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
989 990 991 992
    virtual void startSect1(const QXmlAttributes& attrib);
    virtual void startSect2(const QXmlAttributes& attrib);
    virtual void startSect3(const QXmlAttributes& attrib);
    virtual void startTitle(const QXmlAttributes& attrib);
Dimitri van Heesch's avatar
Dimitri van Heesch committed
993 994 995

    DocHandler(IBaseHandler *parent);
    virtual ~DocHandler();
996
    
Dimitri van Heesch's avatar
Dimitri van Heesch committed
997 998 999 1000
    // IDocRoot
    virtual Kind kind() const { return Root; }
    virtual IDocIterator *contents() const;

Dimitri van Heesch's avatar
Dimitri van Heesch committed
1001 1002
  private:
    IBaseHandler *m_parent;
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1003 1004 1005 1006 1007 1008 1009 1010
    QList<IDoc> m_children;
};

class DocIterator : public BaseIterator<IDocIterator,IDoc,IDoc>
{
  public:
    DocIterator(const DocHandler &handler) : 
      BaseIterator<IDocIterator,IDoc,IDoc>(handler.m_children) {}
Dimitri van Heesch's avatar
Dimitri van Heesch committed
1011 1012
};

1013 1014 1015
void dochandler_init();
void dochandler_exit();

Dimitri van Heesch's avatar
Dimitri van Heesch committed
1016
#endif