Blame src/latexdocvisitor.h

Packit 1c1d7e
/******************************************************************************
Packit 1c1d7e
 *
Packit 1c1d7e
 * 
Packit 1c1d7e
 *
Packit 1c1d7e
 *
Packit 1c1d7e
 * Copyright (C) 1997-2015 by Dimitri van Heesch.
Packit 1c1d7e
 *
Packit 1c1d7e
 * Permission to use, copy, modify, and distribute this software and its
Packit 1c1d7e
 * documentation under the terms of the GNU General Public License is hereby 
Packit 1c1d7e
 * granted. No representations are made about the suitability of this software 
Packit 1c1d7e
 * for any purpose. It is provided "as is" without express or implied warranty.
Packit 1c1d7e
 * See the GNU General Public License for more details.
Packit 1c1d7e
 *
Packit 1c1d7e
 * Documents produced by Doxygen are derivative works derived from the
Packit 1c1d7e
 * input used in their production; they are not affected by this license.
Packit 1c1d7e
 *
Packit 1c1d7e
 */
Packit 1c1d7e
Packit 1c1d7e
#ifndef _LATEXDOCVISITOR_H
Packit 1c1d7e
#define _LATEXDOCVISITOR_H
Packit 1c1d7e
Packit 1c1d7e
#include "docvisitor.h"
Packit 1c1d7e
#include <qstack.h>
Packit 1c1d7e
#include <qcstring.h>
Packit 1c1d7e
#include <qlist.h>
Packit 1c1d7e
//#include <qmap.h>
Packit 1c1d7e
Packit 1c1d7e
class FTextStream;
Packit 1c1d7e
class CodeOutputInterface;
Packit 1c1d7e
Packit 1c1d7e
/*! @brief Concrete visitor implementation for LaTeX output. */
Packit 1c1d7e
class LatexDocVisitor : public DocVisitor
Packit 1c1d7e
{
Packit 1c1d7e
  public:
Packit 1c1d7e
    LatexDocVisitor(FTextStream &t,CodeOutputInterface &ci,
Packit 1c1d7e
                    const char *langExt,bool insideTabbing);
Packit 1c1d7e
    
Packit 1c1d7e
    //--------------------------------------
Packit 1c1d7e
    // visitor functions for leaf nodes
Packit 1c1d7e
    //--------------------------------------
Packit 1c1d7e
    
Packit 1c1d7e
    void visit(DocWord *);
Packit 1c1d7e
    void visit(DocLinkedWord *);
Packit 1c1d7e
    void visit(DocWhiteSpace *);
Packit 1c1d7e
    void visit(DocSymbol *);
Packit 1c1d7e
    void visit(DocURL *);
Packit 1c1d7e
    void visit(DocLineBreak *);
Packit 1c1d7e
    void visit(DocHorRuler *);
Packit 1c1d7e
    void visit(DocStyleChange *);
Packit 1c1d7e
    void visit(DocVerbatim *);
Packit 1c1d7e
    void visit(DocAnchor *);
Packit 1c1d7e
    void visit(DocInclude *);
Packit 1c1d7e
    void visit(DocIncOperator *);
Packit 1c1d7e
    void visit(DocFormula *);
Packit 1c1d7e
    void visit(DocIndexEntry *);
Packit 1c1d7e
    void visit(DocSimpleSectSep *);
Packit 1c1d7e
    void visit(DocCite *);
Packit 1c1d7e
Packit 1c1d7e
    //--------------------------------------
Packit 1c1d7e
    // visitor functions for compound nodes
Packit 1c1d7e
    //--------------------------------------
Packit 1c1d7e
    
Packit 1c1d7e
    void visitPre(DocAutoList *);
Packit 1c1d7e
    void visitPost(DocAutoList *);
Packit 1c1d7e
    void visitPre(DocAutoListItem *);
Packit 1c1d7e
    void visitPost(DocAutoListItem *);
Packit 1c1d7e
    void visitPre(DocPara *);
Packit 1c1d7e
    void visitPost(DocPara *);
Packit 1c1d7e
    void visitPre(DocRoot *);
Packit 1c1d7e
    void visitPost(DocRoot *);
Packit 1c1d7e
    void visitPre(DocSimpleSect *);
Packit 1c1d7e
    void visitPost(DocSimpleSect *);
Packit 1c1d7e
    void visitPre(DocTitle *);
Packit 1c1d7e
    void visitPost(DocTitle *);
Packit 1c1d7e
    void visitPre(DocSimpleList *);
Packit 1c1d7e
    void visitPost(DocSimpleList *);
Packit 1c1d7e
    void visitPre(DocSimpleListItem *);
Packit 1c1d7e
    void visitPost(DocSimpleListItem *);
Packit 1c1d7e
    void visitPre(DocSection *s);
Packit 1c1d7e
    void visitPost(DocSection *);
Packit 1c1d7e
    void visitPre(DocHtmlList *s);
Packit 1c1d7e
    void visitPost(DocHtmlList *s);
Packit 1c1d7e
    void visitPre(DocHtmlListItem *);
Packit 1c1d7e
    void visitPost(DocHtmlListItem *);
Packit 1c1d7e
    //void visitPre(DocHtmlPre *);
Packit 1c1d7e
    //void visitPost(DocHtmlPre *);
Packit 1c1d7e
    void visitPre(DocHtmlDescList *);
Packit 1c1d7e
    void visitPost(DocHtmlDescList *);
Packit 1c1d7e
    void visitPre(DocHtmlDescTitle *);
Packit 1c1d7e
    void visitPost(DocHtmlDescTitle *);
Packit 1c1d7e
    void visitPre(DocHtmlDescData *);
Packit 1c1d7e
    void visitPost(DocHtmlDescData *);
Packit 1c1d7e
    void visitPre(DocHtmlTable *t);
Packit 1c1d7e
    void visitPost(DocHtmlTable *t);
Packit 1c1d7e
    void visitPre(DocHtmlCaption *);
Packit 1c1d7e
    void visitPost(DocHtmlCaption *);
Packit 1c1d7e
    void visitPre(DocHtmlRow *);
Packit 1c1d7e
    void visitPost(DocHtmlRow *) ;
Packit 1c1d7e
    void visitPre(DocHtmlCell *);
Packit 1c1d7e
    void visitPost(DocHtmlCell *);
Packit 1c1d7e
    void visitPre(DocInternal *);
Packit 1c1d7e
    void visitPost(DocInternal *);
Packit 1c1d7e
    void visitPre(DocHRef *);
Packit 1c1d7e
    void visitPost(DocHRef *);
Packit 1c1d7e
    void visitPre(DocHtmlHeader *);
Packit 1c1d7e
    void visitPost(DocHtmlHeader *) ;
Packit 1c1d7e
    void visitPre(DocImage *);
Packit 1c1d7e
    void visitPost(DocImage *);
Packit 1c1d7e
    void visitPre(DocDotFile *);
Packit 1c1d7e
    void visitPost(DocDotFile *);
Packit 1c1d7e
    void visitPre(DocMscFile *);
Packit 1c1d7e
    void visitPost(DocMscFile *);
Packit 1c1d7e
    void visitPre(DocDiaFile *);
Packit 1c1d7e
    void visitPost(DocDiaFile *);
Packit 1c1d7e
    void visitPre(DocLink *lnk);
Packit 1c1d7e
    void visitPost(DocLink *);
Packit 1c1d7e
    void visitPre(DocRef *ref);
Packit 1c1d7e
    void visitPost(DocRef *);
Packit 1c1d7e
    void visitPre(DocSecRefItem *);
Packit 1c1d7e
    void visitPost(DocSecRefItem *);
Packit 1c1d7e
    void visitPre(DocSecRefList *);
Packit 1c1d7e
    void visitPost(DocSecRefList *);
Packit 1c1d7e
    void visitPre(DocParamSect *);
Packit 1c1d7e
    void visitPost(DocParamSect *);
Packit 1c1d7e
    void visitPre(DocParamList *);
Packit 1c1d7e
    void visitPost(DocParamList *);
Packit 1c1d7e
    void visitPre(DocXRefItem *);
Packit 1c1d7e
    void visitPost(DocXRefItem *);
Packit 1c1d7e
    void visitPre(DocInternalRef *);
Packit 1c1d7e
    void visitPost(DocInternalRef *);
Packit 1c1d7e
    void visitPre(DocCopy *);
Packit 1c1d7e
    void visitPost(DocCopy *);
Packit 1c1d7e
    void visitPre(DocText *);
Packit 1c1d7e
    void visitPost(DocText *);
Packit 1c1d7e
    void visitPre(DocHtmlBlockQuote *);
Packit 1c1d7e
    void visitPost(DocHtmlBlockQuote *);
Packit 1c1d7e
    void visitPre(DocVhdlFlow *);
Packit 1c1d7e
    void visitPost(DocVhdlFlow *);
Packit 1c1d7e
    void visitPre(DocParBlock *);
Packit 1c1d7e
    void visitPost(DocParBlock *);
Packit 1c1d7e
Packit 1c1d7e
  private:
Packit 1c1d7e
Packit 1c1d7e
    struct ActiveRowSpan
Packit 1c1d7e
    {
Packit 1c1d7e
      ActiveRowSpan(DocHtmlCell *c,int rs,int cs,int col) 
Packit 1c1d7e
        : cell(c), rowSpan(rs), colSpan(cs), column(col) {}
Packit 1c1d7e
      DocHtmlCell *cell;
Packit 1c1d7e
      int rowSpan;
Packit 1c1d7e
      int colSpan;
Packit 1c1d7e
      int column;
Packit 1c1d7e
    };
Packit 1c1d7e
Packit 1c1d7e
    typedef QList<ActiveRowSpan> RowSpanList;
Packit 1c1d7e
Packit 1c1d7e
    //--------------------------------------
Packit 1c1d7e
    // helper functions 
Packit 1c1d7e
    //--------------------------------------
Packit 1c1d7e
    
Packit 1c1d7e
    void filter(const char *str);
Packit 1c1d7e
    void startLink(const QCString &ref,const QCString &file,
Packit 1c1d7e
                   const QCString &anchor,bool refToTable=FALSE);
Packit 1c1d7e
    void endLink(const QCString &ref,const QCString &file,
Packit 1c1d7e
                 const QCString &anchor,bool refToTable=FALSE);
Packit 1c1d7e
    QCString escapeMakeIndexChars(const char *s);
Packit 1c1d7e
    void startDotFile(const QCString &fileName,const QCString &width,
Packit 1c1d7e
                      const QCString &height, bool hasCaption);
Packit 1c1d7e
    void endDotFile(bool hasCaption);
Packit 1c1d7e
Packit 1c1d7e
    void startMscFile(const QCString &fileName,const QCString &width,
Packit 1c1d7e
                      const QCString &height, bool hasCaption);
Packit 1c1d7e
    void endMscFile(bool hasCaption);
Packit 1c1d7e
    void writeMscFile(const QCString &fileName, DocVerbatim *s);
Packit 1c1d7e
Packit 1c1d7e
    void startDiaFile(const QCString &fileName,const QCString &width,
Packit 1c1d7e
                      const QCString &height, bool hasCaption);
Packit 1c1d7e
    void endDiaFile(bool hasCaption);
Packit 1c1d7e
    void writeDiaFile(const QCString &fileName, DocVerbatim *s);
Packit 1c1d7e
    void writePlantUMLFile(const QCString &fileName, DocVerbatim *s);
Packit 1c1d7e
Packit 1c1d7e
    void pushEnabled();
Packit 1c1d7e
    void popEnabled();
Packit 1c1d7e
Packit 1c1d7e
    //--------------------------------------
Packit 1c1d7e
    // state variables
Packit 1c1d7e
    //--------------------------------------
Packit 1c1d7e
Packit 1c1d7e
    FTextStream &m_;;
Packit 1c1d7e
    CodeOutputInterface &m_ci;
Packit 1c1d7e
    bool m_insidePre;
Packit 1c1d7e
    bool m_insideItem;
Packit 1c1d7e
    bool m_hide;
Packit 1c1d7e
    bool m_hideCaption;
Packit 1c1d7e
    bool m_insideTabbing;
Packit 1c1d7e
    QStack<bool> m_enabled;
Packit 1c1d7e
    QCString m_langExt;
Packit 1c1d7e
Packit 1c1d7e
    struct TableState
Packit 1c1d7e
    {
Packit 1c1d7e
      TableState() : numCols(0), currentColumn(0), inRowSpan(FALSE), 
Packit 1c1d7e
                     inColSpan(FALSE), firstRow(FALSE)
Packit 1c1d7e
      { rowSpans.setAutoDelete(TRUE); }
Packit 1c1d7e
      RowSpanList rowSpans;
Packit 1c1d7e
      int  numCols;
Packit 1c1d7e
      int currentColumn;
Packit 1c1d7e
      bool inRowSpan;
Packit 1c1d7e
      bool inColSpan;
Packit 1c1d7e
      bool firstRow;
Packit 1c1d7e
    };
Packit 1c1d7e
    QStack<TableState> m_tableStateStack; // needed for nested tables
Packit 1c1d7e
    RowSpanList m_emptyRowSpanList;
Packit 1c1d7e
Packit 1c1d7e
    void pushTableState()
Packit 1c1d7e
    {
Packit 1c1d7e
      m_tableStateStack.push(new TableState);
Packit 1c1d7e
    }
Packit 1c1d7e
    void popTableState()
Packit 1c1d7e
    {
Packit 1c1d7e
      delete m_tableStateStack.pop();
Packit 1c1d7e
    }
Packit 1c1d7e
    int currentColumn() const
Packit 1c1d7e
    {
Packit 1c1d7e
      return !m_tableStateStack.isEmpty() ? m_tableStateStack.top()->currentColumn : 0;
Packit 1c1d7e
    }
Packit 1c1d7e
    void setCurrentColumn(int col)
Packit 1c1d7e
    {
Packit 1c1d7e
      if (!m_tableStateStack.isEmpty()) m_tableStateStack.top()->currentColumn = col;
Packit 1c1d7e
    }
Packit 1c1d7e
    int numCols() const
Packit 1c1d7e
    {
Packit 1c1d7e
      return !m_tableStateStack.isEmpty() ? m_tableStateStack.top()->numCols : 0;
Packit 1c1d7e
    }
Packit 1c1d7e
    void setNumCols(int num)
Packit 1c1d7e
    {
Packit 1c1d7e
      if (!m_tableStateStack.isEmpty()) m_tableStateStack.top()->numCols = num;
Packit 1c1d7e
    }
Packit 1c1d7e
    bool inRowSpan() const
Packit 1c1d7e
    {
Packit 1c1d7e
      return !m_tableStateStack.isEmpty() ? m_tableStateStack.top()->inRowSpan : FALSE;
Packit 1c1d7e
    }
Packit 1c1d7e
    void setInRowSpan(bool b)
Packit 1c1d7e
    {
Packit 1c1d7e
      if (!m_tableStateStack.isEmpty()) m_tableStateStack.top()->inRowSpan = b;
Packit 1c1d7e
    }
Packit 1c1d7e
    bool inColSpan() const
Packit 1c1d7e
    {
Packit 1c1d7e
      return !m_tableStateStack.isEmpty() ? m_tableStateStack.top()->inColSpan : FALSE;
Packit 1c1d7e
    }
Packit 1c1d7e
    void setInColSpan(bool b)
Packit 1c1d7e
    {
Packit 1c1d7e
      if (!m_tableStateStack.isEmpty()) m_tableStateStack.top()->inColSpan = b;
Packit 1c1d7e
    }
Packit 1c1d7e
    bool firstRow() const
Packit 1c1d7e
    {
Packit 1c1d7e
      return !m_tableStateStack.isEmpty() ? m_tableStateStack.top()->firstRow : FALSE;
Packit 1c1d7e
    }
Packit 1c1d7e
    void setFirstRow(bool b)
Packit 1c1d7e
    {
Packit 1c1d7e
      if (!m_tableStateStack.isEmpty()) m_tableStateStack.top()->firstRow = b;
Packit 1c1d7e
    }
Packit 1c1d7e
    const RowSpanList &rowSpans()
Packit 1c1d7e
    {
Packit 1c1d7e
      return !m_tableStateStack.isEmpty() ? m_tableStateStack.top()->rowSpans : m_emptyRowSpanList;
Packit 1c1d7e
    }
Packit 1c1d7e
    void addRowSpan(ActiveRowSpan *span)
Packit 1c1d7e
    {
Packit 1c1d7e
      if (!m_tableStateStack.isEmpty()) m_tableStateStack.top()->rowSpans.append(span);
Packit 1c1d7e
    }
Packit 1c1d7e
    bool insideTable() const
Packit 1c1d7e
    {
Packit 1c1d7e
      return !m_tableStateStack.isEmpty();
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
};
Packit 1c1d7e
Packit 1c1d7e
#endif