1 /******************************************************************************
6 * Copyright (C) 1997-2015 by Dimitri van Heesch.
8 * Permission to use, copy, modify, and distribute this software and its
9 * documentation under the terms of the GNU General Public License is hereby
10 * granted. No representations are made about the suitability of this software
11 * for any purpose. It is provided "as is" without express or implied warranty.
12 * See the GNU General Public License for more details.
14 * Documents produced by Doxygen are derivative works derived from the
15 * input used in their production; they are not affected by this license.
19 #ifndef _LATEXDOCVISITOR_H
20 #define _LATEXDOCVISITOR_H
22 #include "docvisitor.h"
29 class CodeOutputInterface;
31 /*! @brief Concrete visitor implementation for LaTeX output. */
32 class LatexDocVisitor : public DocVisitor
35 LatexDocVisitor(FTextStream &t,CodeOutputInterface &ci,
36 const char *langExt,bool insideTabbing);
38 //--------------------------------------
39 // visitor functions for leaf nodes
40 //--------------------------------------
42 void visit(DocWord *);
43 void visit(DocLinkedWord *);
44 void visit(DocWhiteSpace *);
45 void visit(DocSymbol *);
47 void visit(DocLineBreak *);
48 void visit(DocHorRuler *);
49 void visit(DocStyleChange *);
50 void visit(DocVerbatim *);
51 void visit(DocAnchor *);
52 void visit(DocInclude *);
53 void visit(DocIncOperator *);
54 void visit(DocFormula *);
55 void visit(DocIndexEntry *);
56 void visit(DocSimpleSectSep *);
57 void visit(DocCite *);
59 //--------------------------------------
60 // visitor functions for compound nodes
61 //--------------------------------------
63 void visitPre(DocAutoList *);
64 void visitPost(DocAutoList *);
65 void visitPre(DocAutoListItem *);
66 void visitPost(DocAutoListItem *);
67 void visitPre(DocPara *);
68 void visitPost(DocPara *);
69 void visitPre(DocRoot *);
70 void visitPost(DocRoot *);
71 void visitPre(DocSimpleSect *);
72 void visitPost(DocSimpleSect *);
73 void visitPre(DocTitle *);
74 void visitPost(DocTitle *);
75 void visitPre(DocSimpleList *);
76 void visitPost(DocSimpleList *);
77 void visitPre(DocSimpleListItem *);
78 void visitPost(DocSimpleListItem *);
79 void visitPre(DocSection *s);
80 void visitPost(DocSection *);
81 void visitPre(DocHtmlList *s);
82 void visitPost(DocHtmlList *s);
83 void visitPre(DocHtmlListItem *);
84 void visitPost(DocHtmlListItem *);
85 //void visitPre(DocHtmlPre *);
86 //void visitPost(DocHtmlPre *);
87 void visitPre(DocHtmlDescList *);
88 void visitPost(DocHtmlDescList *);
89 void visitPre(DocHtmlDescTitle *);
90 void visitPost(DocHtmlDescTitle *);
91 void visitPre(DocHtmlDescData *);
92 void visitPost(DocHtmlDescData *);
93 void visitPre(DocHtmlTable *t);
94 void visitPost(DocHtmlTable *t);
95 void visitPre(DocHtmlCaption *);
96 void visitPost(DocHtmlCaption *);
97 void visitPre(DocHtmlRow *);
98 void visitPost(DocHtmlRow *) ;
99 void visitPre(DocHtmlCell *);
100 void visitPost(DocHtmlCell *);
101 void visitPre(DocInternal *);
102 void visitPost(DocInternal *);
103 void visitPre(DocHRef *);
104 void visitPost(DocHRef *);
105 void visitPre(DocHtmlHeader *);
106 void visitPost(DocHtmlHeader *) ;
107 void visitPre(DocImage *);
108 void visitPost(DocImage *);
109 void visitPre(DocDotFile *);
110 void visitPost(DocDotFile *);
111 void visitPre(DocMscFile *);
112 void visitPost(DocMscFile *);
113 void visitPre(DocDiaFile *);
114 void visitPost(DocDiaFile *);
115 void visitPre(DocLink *lnk);
116 void visitPost(DocLink *);
117 void visitPre(DocRef *ref);
118 void visitPost(DocRef *);
119 void visitPre(DocSecRefItem *);
120 void visitPost(DocSecRefItem *);
121 void visitPre(DocSecRefList *);
122 void visitPost(DocSecRefList *);
123 void visitPre(DocParamSect *);
124 void visitPost(DocParamSect *);
125 void visitPre(DocParamList *);
126 void visitPost(DocParamList *);
127 void visitPre(DocXRefItem *);
128 void visitPost(DocXRefItem *);
129 void visitPre(DocInternalRef *);
130 void visitPost(DocInternalRef *);
131 void visitPre(DocCopy *);
132 void visitPost(DocCopy *);
133 void visitPre(DocText *);
134 void visitPost(DocText *);
135 void visitPre(DocHtmlBlockQuote *);
136 void visitPost(DocHtmlBlockQuote *);
137 void visitPre(DocVhdlFlow *);
138 void visitPost(DocVhdlFlow *);
139 void visitPre(DocParBlock *);
140 void visitPost(DocParBlock *);
146 ActiveRowSpan(DocHtmlCell *c,int rs,int cs,int col)
147 : cell(c), rowSpan(rs), colSpan(cs), column(col) {}
154 typedef QList<ActiveRowSpan> RowSpanList;
156 //--------------------------------------
158 //--------------------------------------
160 void filter(const char *str);
161 void startLink(const QCString &ref,const QCString &file,
162 const QCString &anchor,bool refToTable=FALSE);
163 void endLink(const QCString &ref,const QCString &file,
164 const QCString &anchor,bool refToTable=FALSE);
165 QCString escapeMakeIndexChars(const char *s);
166 void startDotFile(const QCString &fileName,const QCString &width,
167 const QCString &height, bool hasCaption);
168 void endDotFile(bool hasCaption);
170 void startMscFile(const QCString &fileName,const QCString &width,
171 const QCString &height, bool hasCaption);
172 void endMscFile(bool hasCaption);
173 void writeMscFile(const QCString &fileName, DocVerbatim *s);
175 void startDiaFile(const QCString &fileName,const QCString &width,
176 const QCString &height, bool hasCaption);
177 void endDiaFile(bool hasCaption);
178 void writeDiaFile(const QCString &fileName, DocVerbatim *s);
179 void writePlantUMLFile(const QCString &fileName, DocVerbatim *s);
184 //--------------------------------------
186 //--------------------------------------
189 CodeOutputInterface &m_ci;
194 bool m_insideTabbing;
195 QStack<bool> m_enabled;
200 TableState() : numCols(0), currentColumn(0), inRowSpan(FALSE),
201 inColSpan(FALSE), firstRow(FALSE)
202 { rowSpans.setAutoDelete(TRUE); }
203 RowSpanList rowSpans;
210 QStack<TableState> m_tableStateStack; // needed for nested tables
211 RowSpanList m_emptyRowSpanList;
213 void pushTableState()
215 m_tableStateStack.push(new TableState);
219 delete m_tableStateStack.pop();
221 int currentColumn() const
223 return !m_tableStateStack.isEmpty() ? m_tableStateStack.top()->currentColumn : 0;
225 void setCurrentColumn(int col)
227 if (!m_tableStateStack.isEmpty()) m_tableStateStack.top()->currentColumn = col;
231 return !m_tableStateStack.isEmpty() ? m_tableStateStack.top()->numCols : 0;
233 void setNumCols(int num)
235 if (!m_tableStateStack.isEmpty()) m_tableStateStack.top()->numCols = num;
237 bool inRowSpan() const
239 return !m_tableStateStack.isEmpty() ? m_tableStateStack.top()->inRowSpan : FALSE;
241 void setInRowSpan(bool b)
243 if (!m_tableStateStack.isEmpty()) m_tableStateStack.top()->inRowSpan = b;
245 bool inColSpan() const
247 return !m_tableStateStack.isEmpty() ? m_tableStateStack.top()->inColSpan : FALSE;
249 void setInColSpan(bool b)
251 if (!m_tableStateStack.isEmpty()) m_tableStateStack.top()->inColSpan = b;
253 bool firstRow() const
255 return !m_tableStateStack.isEmpty() ? m_tableStateStack.top()->firstRow : FALSE;
257 void setFirstRow(bool b)
259 if (!m_tableStateStack.isEmpty()) m_tableStateStack.top()->firstRow = b;
261 const RowSpanList &rowSpans()
263 return !m_tableStateStack.isEmpty() ? m_tableStateStack.top()->rowSpans : m_emptyRowSpanList;
265 void addRowSpan(ActiveRowSpan *span)
267 if (!m_tableStateStack.isEmpty()) m_tableStateStack.top()->rowSpans.append(span);
269 bool insideTable() const
271 return !m_tableStateStack.isEmpty();