Blame src/latexdocvisitor.h

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