|
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
|