|
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 |
#include <qdir.h>
|
|
Packit |
1c1d7e |
#include "htmldocvisitor.h"
|
|
Packit |
1c1d7e |
#include "docparser.h"
|
|
Packit |
1c1d7e |
#include "language.h"
|
|
Packit |
1c1d7e |
#include "doxygen.h"
|
|
Packit |
1c1d7e |
#include "outputgen.h"
|
|
Packit |
1c1d7e |
#include "dot.h"
|
|
Packit |
1c1d7e |
#include "message.h"
|
|
Packit |
1c1d7e |
#include "config.h"
|
|
Packit |
1c1d7e |
#include "htmlgen.h"
|
|
Packit |
1c1d7e |
#include "parserintf.h"
|
|
Packit |
1c1d7e |
#include "msc.h"
|
|
Packit |
1c1d7e |
#include "dia.h"
|
|
Packit |
1c1d7e |
#include "util.h"
|
|
Packit |
1c1d7e |
#include "vhdldocgen.h"
|
|
Packit |
1c1d7e |
#include "filedef.h"
|
|
Packit |
1c1d7e |
#include "memberdef.h"
|
|
Packit |
1c1d7e |
#include "htmlentity.h"
|
|
Packit |
1c1d7e |
#include "plantuml.h"
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static const int NUM_HTML_LIST_TYPES = 4;
|
|
Packit |
1c1d7e |
static const char types[][NUM_HTML_LIST_TYPES] = {"1", "a", "i", "A"};
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static QCString convertIndexWordToAnchor(const QString &word)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
static char hex[] = "0123456789abcdef";
|
|
Packit |
1c1d7e |
QCString result="a";
|
|
Packit |
1c1d7e |
const char *str = word.data();
|
|
Packit |
1c1d7e |
unsigned char c;
|
|
Packit |
1c1d7e |
if (str)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
while ((c = *str++))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ((c >= 'a' && c <= 'z') || // ALPHA
|
|
Packit |
1c1d7e |
(c >= 'A' && c <= 'Z') || // ALPHA
|
|
Packit |
1c1d7e |
(c >= '0' && c <= '9') || // DIGIT
|
|
Packit |
1c1d7e |
c == '-' ||
|
|
Packit |
1c1d7e |
c == '.' ||
|
|
Packit |
1c1d7e |
c == '_'
|
|
Packit |
1c1d7e |
)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
result += c;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
char enc[4];
|
|
Packit |
1c1d7e |
enc[0] = ':';
|
|
Packit |
1c1d7e |
enc[1] = hex[(c & 0xf0) >> 4];
|
|
Packit |
1c1d7e |
enc[2] = hex[c & 0xf];
|
|
Packit |
1c1d7e |
enc[3] = 0;
|
|
Packit |
1c1d7e |
result += enc;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return result;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static bool mustBeOutsideParagraph(DocNode *n)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
switch (n->kind())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
/*
|
|
Packit |
1c1d7e |
case DocNode::Kind_HtmlList:
|
|
Packit |
1c1d7e |
case DocNode::Kind_SimpleList:
|
|
Packit |
1c1d7e |
case DocNode::Kind_AutoList:
|
|
Packit |
1c1d7e |
/* */
|
|
Packit |
1c1d7e |
case DocNode::Kind_SimpleSect:
|
|
Packit |
1c1d7e |
case DocNode::Kind_ParamSect:
|
|
Packit |
1c1d7e |
case DocNode::Kind_HtmlDescList:
|
|
Packit |
1c1d7e |
case DocNode::Kind_XRefItem:
|
|
Packit |
1c1d7e |
/* */
|
|
Packit |
1c1d7e |
case DocNode::Kind_HtmlTable:
|
|
Packit |
1c1d7e |
/* <h?> */
|
|
Packit |
1c1d7e |
case DocNode::Kind_Section:
|
|
Packit |
1c1d7e |
case DocNode::Kind_HtmlHeader:
|
|
Packit |
1c1d7e |
/* \internal */
|
|
Packit |
1c1d7e |
case DocNode::Kind_Internal:
|
|
Packit |
1c1d7e |
/* */
|
|
Packit |
1c1d7e |
case DocNode::Kind_Include:
|
|
Packit |
1c1d7e |
case DocNode::Kind_Image:
|
|
Packit |
1c1d7e |
case DocNode::Kind_SecRefList:
|
|
Packit |
1c1d7e |
/* */
|
|
Packit |
1c1d7e |
case DocNode::Kind_HorRuler:
|
|
Packit |
1c1d7e |
/* CopyDoc gets paragraph markers from the wrapping DocPara node,
|
|
Packit |
1c1d7e |
* but needs to insert them for all documentation being copied to
|
|
Packit |
1c1d7e |
* preserve formatting.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
case DocNode::Kind_Copy:
|
|
Packit |
1c1d7e |
/* */
|
|
Packit |
1c1d7e |
case DocNode::Kind_HtmlBlockQuote:
|
|
Packit |
1c1d7e |
/* \parblock */
|
|
Packit |
1c1d7e |
case DocNode::Kind_ParBlock:
|
|
Packit |
1c1d7e |
return TRUE;
|
|
Packit |
1c1d7e |
case DocNode::Kind_Verbatim:
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DocVerbatim *dv = (DocVerbatim*)n;
|
|
Packit |
1c1d7e |
return dv->type()!=DocVerbatim::HtmlOnly || dv->isBlock();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
case DocNode::Kind_StyleChange:
|
|
Packit |
1c1d7e |
return ((DocStyleChange*)n)->style()==DocStyleChange::Preformatted ||
|
|
Packit |
1c1d7e |
((DocStyleChange*)n)->style()==DocStyleChange::Div ||
|
|
Packit |
1c1d7e |
((DocStyleChange*)n)->style()==DocStyleChange::Center;
|
|
Packit |
1c1d7e |
case DocNode::Kind_Formula:
|
|
Packit |
1c1d7e |
return !((DocFormula*)n)->isInline();
|
|
Packit |
1c1d7e |
default:
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static QString htmlAttribsToString(const HtmlAttribList &attribs)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QString result;
|
|
Packit |
1c1d7e |
HtmlAttribListIterator li(attribs);
|
|
Packit |
1c1d7e |
HtmlAttrib *att;
|
|
Packit |
1c1d7e |
for (li.toFirst();(att=li.current());++li)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (!att->value.isEmpty()) // ignore attribute without values as they
|
|
Packit |
1c1d7e |
// are not XHTML compliant
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
result+=" ";
|
|
Packit |
1c1d7e |
result+=att->name;
|
|
Packit |
1c1d7e |
result+="=\""+convertToXML(att->value)+"\"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return result;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//-------------------------------------------------------------------------
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
HtmlDocVisitor::HtmlDocVisitor(FTextStream &t,CodeOutputInterface &ci,
|
|
Packit |
1c1d7e |
Definition *ctx)
|
|
Packit |
1c1d7e |
: DocVisitor(DocVisitor_Html), m_t(t), m_ci(ci), m_insidePre(FALSE),
|
|
Packit |
1c1d7e |
m_hide(FALSE), m_ctx(ctx)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (ctx) m_langExt=ctx->getDefFileExtension();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//--------------------------------------
|
|
Packit |
1c1d7e |
// visitor functions for leaf nodes
|
|
Packit |
1c1d7e |
//--------------------------------------
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visit(DocWord *w)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("word: %s\n",w->word().data());
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
filter(w->word());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visit(DocLinkedWord *w)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
//printf("linked word: %s\n",w->word().data());
|
|
Packit |
1c1d7e |
startLink(w->ref(),w->file(),w->relPath(),w->anchor(),w->tooltip());
|
|
Packit |
1c1d7e |
filter(w->word());
|
|
Packit |
1c1d7e |
endLink();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visit(DocWhiteSpace *w)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
if (m_insidePre)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << w->chars();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << " ";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visit(DocSymbol *s)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
const char *res = HtmlEntityMapper::instance()->html(s->symbol());
|
|
Packit |
1c1d7e |
if (res)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << res;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
err("HTML: non supported HTML-entity found: %s\n",HtmlEntityMapper::instance()->html(s->symbol(),TRUE));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::writeObfuscatedMailAddress(const QCString &url)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "
|
|
Packit |
1c1d7e |
uint i;
|
|
Packit |
1c1d7e |
int size=3;
|
|
Packit |
1c1d7e |
for (i=0;i
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "+'" << url.mid(i,size) << "'";
|
|
Packit |
1c1d7e |
i+=size;
|
|
Packit |
1c1d7e |
if (size==3) size=2; else size=3;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
m_t << "; return false;\">";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visit(DocURL *u)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
if (u->isEmail()) // mail address
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString url = u->url();
|
|
Packit |
1c1d7e |
writeObfuscatedMailAddress(url);
|
|
Packit |
1c1d7e |
uint size=5,i;
|
|
Packit |
1c1d7e |
for (i=0;i
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
filter(url.mid(i,size));
|
|
Packit |
1c1d7e |
if (i<url.length()-size) m_t << "<span style=\"display: none;\">.nosp@m.";
|
|
Packit |
1c1d7e |
i+=size;
|
|
Packit |
1c1d7e |
if (size==5) size=4; else size=5;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
m_t << "";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // web address
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "
|
|
Packit |
1c1d7e |
m_t << u->url() << "\">";
|
|
Packit |
1c1d7e |
filter(u->url());
|
|
Packit |
1c1d7e |
m_t << "";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visit(DocLineBreak *)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
m_t << " \n";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visit(DocHorRuler *hr)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
forceEndParagraph(hr);
|
|
Packit |
1c1d7e |
m_t << " \n";
|
|
Packit |
1c1d7e |
forceStartParagraph(hr);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visit(DocStyleChange *s)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
switch (s->style())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case DocStyleChange::Bold:
|
|
Packit |
1c1d7e |
if (s->enable()) m_t << "<b" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "";
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case DocStyleChange::Italic:
|
|
Packit |
1c1d7e |
if (s->enable()) m_t << "<em" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "";
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case DocStyleChange::Code:
|
|
Packit |
1c1d7e |
if (s->enable()) m_t << "<code" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "";
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case DocStyleChange::Subscript:
|
|
Packit |
1c1d7e |
if (s->enable()) m_t << "<sub" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "</sub>";
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case DocStyleChange::Superscript:
|
|
Packit |
1c1d7e |
if (s->enable()) m_t << "<sup" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "</sup>";
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case DocStyleChange::Center:
|
|
Packit |
1c1d7e |
if (s->enable())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
forceEndParagraph(s);
|
|
Packit |
1c1d7e |
m_t << "<center" << htmlAttribsToString(s->attribs()) << ">";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "</center>";
|
|
Packit |
1c1d7e |
forceStartParagraph(s);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case DocStyleChange::Small:
|
|
Packit |
1c1d7e |
if (s->enable()) m_t << "<small" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "</small>";
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case DocStyleChange::Preformatted:
|
|
Packit |
1c1d7e |
if (s->enable())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
forceEndParagraph(s);
|
|
Packit |
1c1d7e |
m_t << "<pre" << htmlAttribsToString(s->attribs()) << ">";
|
|
Packit |
1c1d7e |
m_insidePre=TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_insidePre=FALSE;
|
|
Packit |
1c1d7e |
m_t << "";
|
|
Packit |
1c1d7e |
forceStartParagraph(s);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case DocStyleChange::Div:
|
|
Packit |
1c1d7e |
if (s->enable())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
forceEndParagraph(s);
|
|
Packit |
1c1d7e |
m_t << "<div" << htmlAttribsToString(s->attribs()) << ">";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "";
|
|
Packit |
1c1d7e |
forceStartParagraph(s);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case DocStyleChange::Span:
|
|
Packit |
1c1d7e |
if (s->enable()) m_t << "<span" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "";
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void visitPreCaption(FTextStream &t, DocVerbatim *s)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (s->hasCaption())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << "" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void visitPostCaption(FTextStream &t, DocVerbatim *s)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (s->hasCaption())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << "" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void visitCaption(HtmlDocVisitor *parent, QList<DocNode> children)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QListIterator<DocNode> cli(children);
|
|
Packit |
1c1d7e |
DocNode *n;
|
|
Packit |
1c1d7e |
for (cli.toFirst();(n=cli.current());++cli) n->accept(parent);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visit(DocVerbatim *s)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
QCString lang = m_langExt;
|
|
Packit |
1c1d7e |
if (!s->language().isEmpty()) // explicit language setting
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
lang = s->language();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
SrcLangExt langExt = getLanguageFromFileName(lang);
|
|
Packit |
1c1d7e |
switch(s->type())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case DocVerbatim::Code:
|
|
Packit |
1c1d7e |
forceEndParagraph(s);
|
|
Packit |
1c1d7e |
m_t << PREFRAG_START;
|
|
Packit |
1c1d7e |
Doxygen::parserManager->getParser(lang)
|
|
Packit |
1c1d7e |
->parseCode(m_ci,
|
|
Packit |
1c1d7e |
s->context(),
|
|
Packit |
1c1d7e |
s->text(),
|
|
Packit |
1c1d7e |
langExt,
|
|
Packit |
1c1d7e |
s->isExample(),
|
|
Packit |
1c1d7e |
s->exampleFile(),
|
|
Packit |
1c1d7e |
0, // fileDef
|
|
Packit |
1c1d7e |
-1, // startLine
|
|
Packit |
1c1d7e |
-1, // endLine
|
|
Packit |
1c1d7e |
FALSE, // inlineFragment
|
|
Packit |
1c1d7e |
0, // memberDef
|
|
Packit |
1c1d7e |
TRUE, // show line numbers
|
|
Packit |
1c1d7e |
m_ctx // search context
|
|
Packit |
1c1d7e |
);
|
|
Packit |
1c1d7e |
m_t << PREFRAG_END;
|
|
Packit |
1c1d7e |
forceStartParagraph(s);
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case DocVerbatim::Verbatim:
|
|
Packit |
1c1d7e |
forceEndParagraph(s);
|
|
Packit |
1c1d7e |
m_t << /*PREFRAG_START <<*/ "";
|
|
Packit |
1c1d7e |
filter(s->text());
|
|
Packit |
1c1d7e |
m_t << "" /*<< PREFRAG_END*/;
|
|
Packit |
1c1d7e |
forceStartParagraph(s);
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case DocVerbatim::HtmlOnly:
|
|
Packit |
1c1d7e |
if (s->isBlock()) forceEndParagraph(s);
|
|
Packit |
1c1d7e |
m_t << s->text();
|
|
Packit |
1c1d7e |
if (s->isBlock()) forceStartParagraph(s);
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case DocVerbatim::ManOnly:
|
|
Packit |
1c1d7e |
case DocVerbatim::LatexOnly:
|
|
Packit |
1c1d7e |
case DocVerbatim::XmlOnly:
|
|
Packit |
1c1d7e |
case DocVerbatim::RtfOnly:
|
|
Packit |
1c1d7e |
case DocVerbatim::DocbookOnly:
|
|
Packit |
1c1d7e |
/* nothing */
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
case DocVerbatim::Dot:
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
static int dotindex = 1;
|
|
Packit |
1c1d7e |
QCString fileName(4096);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
forceEndParagraph(s);
|
|
Packit |
1c1d7e |
fileName.sprintf("%s%d%s",
|
|
Packit |
1c1d7e |
(Config_getString(HTML_OUTPUT)+"/inline_dotgraph_").data(),
|
|
Packit |
1c1d7e |
dotindex++,
|
|
Packit |
1c1d7e |
".dot"
|
|
Packit |
1c1d7e |
);
|
|
Packit |
1c1d7e |
QFile file(fileName);
|
|
Packit |
1c1d7e |
if (!file.open(IO_WriteOnly))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
err("Could not open file %s for writing\n",fileName.data());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
file.writeBlock( s->text(), s->text().length() );
|
|
Packit |
1c1d7e |
file.close();
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
m_t << "" << endl;
|
|
Packit |
1c1d7e |
writeDotFile(fileName,s->relPath(),s->context());
|
|
Packit |
1c1d7e |
visitPreCaption(m_t, s);
|
|
Packit |
1c1d7e |
visitCaption(this, s->children());
|
|
Packit |
1c1d7e |
visitPostCaption(m_t, s);
|
|
Packit |
1c1d7e |
m_t << "" << endl;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (Config_getBool(DOT_CLEANUP)) file.remove();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
forceStartParagraph(s);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case DocVerbatim::Msc:
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
forceEndParagraph(s);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static int mscindex = 1;
|
|
Packit |
1c1d7e |
QCString baseName(4096);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
baseName.sprintf("%s%d",
|
|
Packit |
1c1d7e |
(Config_getString(HTML_OUTPUT)+"/inline_mscgraph_").data(),
|
|
Packit |
1c1d7e |
mscindex++
|
|
Packit |
1c1d7e |
);
|
|
Packit |
1c1d7e |
QFile file(baseName+".msc");
|
|
Packit |
1c1d7e |
if (!file.open(IO_WriteOnly))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
err("Could not open file %s.msc for writing\n",baseName.data());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString text = "msc {";
|
|
Packit |
1c1d7e |
text+=s->text();
|
|
Packit |
1c1d7e |
text+="}";
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
file.writeBlock( text, text.length() );
|
|
Packit |
1c1d7e |
file.close();
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
m_t << "" << endl;
|
|
Packit |
1c1d7e |
writeMscFile(baseName+".msc",s->relPath(),s->context());
|
|
Packit |
1c1d7e |
visitPreCaption(m_t, s);
|
|
Packit |
1c1d7e |
visitCaption(this, s->children());
|
|
Packit |
1c1d7e |
visitPostCaption(m_t, s);
|
|
Packit |
1c1d7e |
m_t << "" << endl;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (Config_getBool(DOT_CLEANUP)) file.remove();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
forceStartParagraph(s);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case DocVerbatim::PlantUML:
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
forceEndParagraph(s);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static QCString htmlOutput = Config_getString(HTML_OUTPUT);
|
|
Packit |
1c1d7e |
QCString baseName = writePlantUMLSource(htmlOutput,s->exampleFile(),s->text());
|
|
Packit |
1c1d7e |
m_t << "" << endl;
|
|
Packit |
1c1d7e |
writePlantUMLFile(baseName,s->relPath(),s->context());
|
|
Packit |
1c1d7e |
visitPreCaption(m_t, s);
|
|
Packit |
1c1d7e |
visitCaption(this, s->children());
|
|
Packit |
1c1d7e |
visitPostCaption(m_t, s);
|
|
Packit |
1c1d7e |
m_t << "" << endl;
|
|
Packit |
1c1d7e |
forceStartParagraph(s);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visit(DocAnchor *anc)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
m_t << "anchor() << "\">";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visit(DocInclude *inc)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
SrcLangExt langExt = getLanguageFromFileName(inc->extension());
|
|
Packit |
1c1d7e |
switch(inc->type())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case DocInclude::Include:
|
|
Packit |
1c1d7e |
forceEndParagraph(inc);
|
|
Packit |
1c1d7e |
m_t << PREFRAG_START;
|
|
Packit |
1c1d7e |
Doxygen::parserManager->getParser(inc->extension())
|
|
Packit |
1c1d7e |
->parseCode(m_ci,
|
|
Packit |
1c1d7e |
inc->context(),
|
|
Packit |
1c1d7e |
inc->text(),
|
|
Packit |
1c1d7e |
langExt,
|
|
Packit |
1c1d7e |
inc->isExample(),
|
|
Packit |
1c1d7e |
inc->exampleFile(),
|
|
Packit |
1c1d7e |
0, // fileDef
|
|
Packit |
1c1d7e |
-1, // startLine
|
|
Packit |
1c1d7e |
-1, // endLine
|
|
Packit |
1c1d7e |
TRUE, // inlineFragment
|
|
Packit |
1c1d7e |
0, // memberDef
|
|
Packit |
1c1d7e |
FALSE, // show line numbers
|
|
Packit |
1c1d7e |
m_ctx // search context
|
|
Packit |
1c1d7e |
);
|
|
Packit |
1c1d7e |
m_t << PREFRAG_END;
|
|
Packit |
1c1d7e |
forceStartParagraph(inc);
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case DocInclude::IncWithLines:
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
forceEndParagraph(inc);
|
|
Packit |
1c1d7e |
m_t << PREFRAG_START;
|
|
Packit |
1c1d7e |
QFileInfo cfi( inc->file() );
|
|
Packit |
1c1d7e |
FileDef fd( cfi.dirPath().utf8(), cfi.fileName().utf8() );
|
|
Packit |
1c1d7e |
Doxygen::parserManager->getParser(inc->extension())
|
|
Packit |
1c1d7e |
->parseCode(m_ci,
|
|
Packit |
1c1d7e |
inc->context(),
|
|
Packit |
1c1d7e |
inc->text(),
|
|
Packit |
1c1d7e |
langExt,
|
|
Packit |
1c1d7e |
inc->isExample(),
|
|
Packit |
1c1d7e |
inc->exampleFile(),
|
|
Packit |
1c1d7e |
&fd, // fileDef,
|
|
Packit |
1c1d7e |
-1, // start line
|
|
Packit |
1c1d7e |
-1, // end line
|
|
Packit |
1c1d7e |
FALSE, // inline fragment
|
|
Packit |
1c1d7e |
0, // memberDef
|
|
Packit |
1c1d7e |
TRUE, // show line numbers
|
|
Packit |
1c1d7e |
m_ctx // search context
|
|
Packit |
1c1d7e |
);
|
|
Packit |
1c1d7e |
m_t << PREFRAG_END;
|
|
Packit |
1c1d7e |
forceStartParagraph(inc);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case DocInclude::DontInclude:
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case DocInclude::HtmlInclude:
|
|
Packit |
1c1d7e |
m_t << inc->text();
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case DocInclude::LatexInclude:
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case DocInclude::VerbInclude:
|
|
Packit |
1c1d7e |
forceEndParagraph(inc);
|
|
Packit |
1c1d7e |
m_t << /*PREFRAG_START <<*/ "";
|
|
Packit |
1c1d7e |
filter(inc->text());
|
|
Packit |
1c1d7e |
m_t << "" /*<< PREFRAG_END*/;
|
|
Packit |
1c1d7e |
forceStartParagraph(inc);
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case DocInclude::Snippet:
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
forceEndParagraph(inc);
|
|
Packit |
1c1d7e |
m_t << PREFRAG_START;
|
|
Packit |
1c1d7e |
Doxygen::parserManager->getParser(inc->extension())
|
|
Packit |
1c1d7e |
->parseCode(m_ci,
|
|
Packit |
1c1d7e |
inc->context(),
|
|
Packit |
1c1d7e |
extractBlock(inc->text(),inc->blockId()),
|
|
Packit |
1c1d7e |
langExt,
|
|
Packit |
1c1d7e |
inc->isExample(),
|
|
Packit |
1c1d7e |
inc->exampleFile(),
|
|
Packit |
1c1d7e |
0,
|
|
Packit |
1c1d7e |
-1, // startLine
|
|
Packit |
1c1d7e |
-1, // endLine
|
|
Packit |
1c1d7e |
TRUE, // inlineFragment
|
|
Packit |
1c1d7e |
0, // memberDef
|
|
Packit |
1c1d7e |
FALSE, // show line number
|
|
Packit |
1c1d7e |
m_ctx // search context
|
|
Packit |
1c1d7e |
);
|
|
Packit |
1c1d7e |
m_t << PREFRAG_END;
|
|
Packit |
1c1d7e |
forceStartParagraph(inc);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case DocInclude::SnipWithLines:
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
forceEndParagraph(inc);
|
|
Packit |
1c1d7e |
m_t << PREFRAG_START;
|
|
Packit |
1c1d7e |
QFileInfo cfi( inc->file() );
|
|
Packit |
1c1d7e |
FileDef fd( cfi.dirPath().utf8(), cfi.fileName().utf8() );
|
|
Packit |
1c1d7e |
Doxygen::parserManager->getParser(inc->extension())
|
|
Packit |
1c1d7e |
->parseCode(m_ci,
|
|
Packit |
1c1d7e |
inc->context(),
|
|
Packit |
1c1d7e |
extractBlock(inc->text(),inc->blockId()),
|
|
Packit |
1c1d7e |
langExt,
|
|
Packit |
1c1d7e |
inc->isExample(),
|
|
Packit |
1c1d7e |
inc->exampleFile(),
|
|
Packit |
1c1d7e |
&fd,
|
|
Packit |
1c1d7e |
lineBlock(inc->text(),inc->blockId()),
|
|
Packit |
1c1d7e |
-1, // endLine
|
|
Packit |
1c1d7e |
FALSE, // inlineFragment
|
|
Packit |
1c1d7e |
0, // memberDef
|
|
Packit |
1c1d7e |
TRUE, // show line number
|
|
Packit |
1c1d7e |
m_ctx // search context
|
|
Packit |
1c1d7e |
);
|
|
Packit |
1c1d7e |
m_t << PREFRAG_END;
|
|
Packit |
1c1d7e |
forceStartParagraph(inc);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case DocInclude::SnippetDoc:
|
|
Packit |
1c1d7e |
case DocInclude::IncludeDoc:
|
|
Packit |
1c1d7e |
err("Internal inconsistency: found switch SnippetDoc / IncludeDoc in file: %s"
|
|
Packit |
1c1d7e |
"Please create a bug report\n",__FILE__);
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visit(DocIncOperator *op)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("DocIncOperator: type=%d first=%d, last=%d text=`%s'\n",
|
|
Packit |
1c1d7e |
// op->type(),op->isFirst(),op->isLast(),op->text().data());
|
|
Packit |
1c1d7e |
if (op->isFirst())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (!m_hide) m_t << PREFRAG_START;
|
|
Packit |
1c1d7e |
pushEnabled();
|
|
Packit |
1c1d7e |
m_hide=TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
SrcLangExt langExt = getLanguageFromFileName(m_langExt);
|
|
Packit |
1c1d7e |
if (op->type()!=DocIncOperator::Skip)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
popEnabled();
|
|
Packit |
1c1d7e |
if (!m_hide)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
Doxygen::parserManager->getParser(m_langExt)
|
|
Packit |
1c1d7e |
->parseCode(
|
|
Packit |
1c1d7e |
m_ci,
|
|
Packit |
1c1d7e |
op->context(),
|
|
Packit |
1c1d7e |
op->text(),
|
|
Packit |
1c1d7e |
langExt,
|
|
Packit |
1c1d7e |
op->isExample(),
|
|
Packit |
1c1d7e |
op->exampleFile(),
|
|
Packit |
1c1d7e |
0, // fileDef
|
|
Packit |
1c1d7e |
-1, // startLine
|
|
Packit |
1c1d7e |
-1, // endLine
|
|
Packit |
1c1d7e |
FALSE, // inline fragment
|
|
Packit |
1c1d7e |
0, // memberDef
|
|
Packit |
1c1d7e |
TRUE, // show line numbers
|
|
Packit |
1c1d7e |
m_ctx // search context
|
|
Packit |
1c1d7e |
);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
pushEnabled();
|
|
Packit |
1c1d7e |
m_hide=TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (op->isLast())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
popEnabled();
|
|
Packit |
1c1d7e |
if (!m_hide) m_t << PREFRAG_END;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (!m_hide) m_t << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visit(DocFormula *f)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
bool bDisplay = !f->isInline();
|
|
Packit |
1c1d7e |
if (bDisplay)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
forceEndParagraph(f);
|
|
Packit |
1c1d7e |
m_t << "" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (Config_getBool(USE_MATHJAX))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString text = f->text();
|
|
Packit |
1c1d7e |
bool closeInline = FALSE;
|
|
Packit |
1c1d7e |
if (!bDisplay && !text.isEmpty() && text.at(0)=='$' &&
|
|
Packit |
1c1d7e |
text.at(text.length()-1)=='$')
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
closeInline=TRUE;
|
|
Packit |
1c1d7e |
text = text.mid(1,text.length()-2);
|
|
Packit |
1c1d7e |
m_t << "\\(";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
m_t << convertToHtml(text);
|
|
Packit |
1c1d7e |
if (closeInline)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "\\)";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "
|
|
Packit |
1c1d7e |
<< (bDisplay ? "Dsp" : "Inl");
|
|
Packit |
1c1d7e |
m_t << "\" alt=\"";
|
|
Packit |
1c1d7e |
filterQuotedCdataAttr(f->text());
|
|
Packit |
1c1d7e |
m_t << "\"";
|
|
Packit |
1c1d7e |
// TODO: cache image dimensions on formula generation and give height/width
|
|
Packit |
1c1d7e |
// for faster preloading and better rendering of the page
|
|
Packit |
1c1d7e |
m_t << " src=\"" << f->relPath() << f->name() << ".png\"/>";
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (bDisplay)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << endl << "" << endl;
|
|
Packit |
1c1d7e |
forceStartParagraph(f);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visit(DocIndexEntry *e)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString anchor = convertIndexWordToAnchor(e->entry());
|
|
Packit |
1c1d7e |
if (e->member())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
anchor.prepend(e->member()->anchor()+"_");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
m_t << "";
|
|
Packit |
1c1d7e |
//printf("*** DocIndexEntry: word='%s' scope='%s' member='%s'\n",
|
|
Packit |
1c1d7e |
// e->entry().data(),
|
|
Packit |
1c1d7e |
// e->scope() ? e->scope()->name().data() : "<null>",
|
|
Packit |
1c1d7e |
// e->member() ? e->member()->name().data() : "<null>"
|
|
Packit |
1c1d7e |
// );
|
|
Packit |
1c1d7e |
Doxygen::indexList->addIndexItem(e->scope(),e->member(),anchor,e->entry());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visit(DocSimpleSectSep *)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "" << endl;
|
|
Packit |
1c1d7e |
m_t << "" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visit(DocCite *cite)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
if (!cite->file().isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
startLink(cite->ref(),cite->file(),cite->relPath(),cite->anchor());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "[";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
filter(cite->text());
|
|
Packit |
1c1d7e |
if (!cite->file().isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
endLink();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "]";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//--------------------------------------
|
|
Packit |
1c1d7e |
// visitor functions for compound nodes
|
|
Packit |
1c1d7e |
//--------------------------------------
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPre(DocAutoList *l)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("DocAutoList::visitPre\n");
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
forceEndParagraph(l);
|
|
Packit |
1c1d7e |
if (l->isEnumList())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//
|
|
Packit |
1c1d7e |
// Do list type based on depth:
|
|
Packit |
1c1d7e |
// 1.
|
|
Packit |
1c1d7e |
// a.
|
|
Packit |
1c1d7e |
// i.
|
|
Packit |
1c1d7e |
// A.
|
|
Packit |
1c1d7e |
// 1. (repeat)...
|
|
Packit |
1c1d7e |
//
|
|
Packit |
1c1d7e |
m_t << "depth() % NUM_HTML_LIST_TYPES] << "\">";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (!l->isPreformatted()) m_t << "\n";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPost(DocAutoList *l)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("DocAutoList::visitPost\n");
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
if (l->isEnumList())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (!l->isPreformatted()) m_t << "\n";
|
|
Packit |
1c1d7e |
forceStartParagraph(l);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPre(DocAutoListItem *)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
m_t << "";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPost(DocAutoListItem *li)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
m_t << "";
|
|
Packit |
1c1d7e |
if (!li->isPreformatted()) m_t << "\n";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
template<class T>
|
|
Packit |
1c1d7e |
bool isFirstChildNode(T *parent, DocNode *node)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return parent->children().getFirst()==node;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
template<class T>
|
|
Packit |
1c1d7e |
bool isLastChildNode(T *parent, DocNode *node)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return parent->children().getLast()==node;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool isSeparatedParagraph(DocSimpleSect *parent,DocPara *par)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QList<DocNode> nodes = parent->children();
|
|
Packit |
1c1d7e |
int i = nodes.findRef(par);
|
|
Packit |
1c1d7e |
if (i==-1) return FALSE;
|
|
Packit |
1c1d7e |
int count = parent->children().count();
|
|
Packit |
1c1d7e |
if (count>1 && i==0) // first node
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (nodes.at(i+1)->kind()==DocNode::Kind_SimpleSectSep)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (count>1 && i==count-1) // last node
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (nodes.at(i-1)->kind()==DocNode::Kind_SimpleSectSep)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (count>2 && i>0 && i
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (nodes.at(i-1)->kind()==DocNode::Kind_SimpleSectSep &&
|
|
Packit |
1c1d7e |
nodes.at(i+1)->kind()==DocNode::Kind_SimpleSectSep)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static int getParagraphContext(DocPara *p,bool &isFirst,bool &isLast)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int t=0;
|
|
Packit |
1c1d7e |
isFirst=FALSE;
|
|
Packit |
1c1d7e |
isLast=FALSE;
|
|
Packit |
1c1d7e |
if (p && p->parent())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
switch (p->parent()->kind())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case DocNode::Kind_ParBlock:
|
|
Packit |
1c1d7e |
{ // hierarchy: node N -> para -> parblock -> para
|
|
Packit |
1c1d7e |
// adapt return value to kind of N
|
|
Packit |
1c1d7e |
DocNode::Kind kind = DocNode::Kind_Para;
|
|
Packit |
1c1d7e |
if ( p->parent()->parent() && p->parent()->parent()->parent() )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
kind = p->parent()->parent()->parent()->kind();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
isFirst=isFirstChildNode((DocParBlock*)p->parent(),p);
|
|
Packit |
1c1d7e |
isLast =isLastChildNode ((DocParBlock*)p->parent(),p);
|
|
Packit |
1c1d7e |
t=0;
|
|
Packit |
1c1d7e |
if (isFirst)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (kind==DocNode::Kind_HtmlListItem ||
|
|
Packit |
1c1d7e |
kind==DocNode::Kind_SecRefItem)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t=1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (kind==DocNode::Kind_HtmlDescData ||
|
|
Packit |
1c1d7e |
kind==DocNode::Kind_XRefItem ||
|
|
Packit |
1c1d7e |
kind==DocNode::Kind_SimpleSect)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t=2;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (kind==DocNode::Kind_HtmlCell ||
|
|
Packit |
1c1d7e |
kind==DocNode::Kind_ParamList)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t=5;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (isLast)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (kind==DocNode::Kind_HtmlListItem ||
|
|
Packit |
1c1d7e |
kind==DocNode::Kind_SecRefItem)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t=3;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (kind==DocNode::Kind_HtmlDescData ||
|
|
Packit |
1c1d7e |
kind==DocNode::Kind_XRefItem ||
|
|
Packit |
1c1d7e |
kind==DocNode::Kind_SimpleSect)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t=4;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (kind==DocNode::Kind_HtmlCell ||
|
|
Packit |
1c1d7e |
kind==DocNode::Kind_ParamList)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t=6;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
case DocNode::Kind_AutoListItem:
|
|
Packit |
1c1d7e |
isFirst=isFirstChildNode((DocAutoListItem*)p->parent(),p);
|
|
Packit |
1c1d7e |
isLast =isLastChildNode ((DocAutoListItem*)p->parent(),p);
|
|
Packit |
1c1d7e |
t=1; // not used
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case DocNode::Kind_SimpleListItem:
|
|
Packit |
1c1d7e |
isFirst=TRUE;
|
|
Packit |
1c1d7e |
isLast =TRUE;
|
|
Packit |
1c1d7e |
t=1; // not used
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case DocNode::Kind_ParamList:
|
|
Packit |
1c1d7e |
isFirst=TRUE;
|
|
Packit |
1c1d7e |
isLast =TRUE;
|
|
Packit |
1c1d7e |
t=1; // not used
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case DocNode::Kind_HtmlListItem:
|
|
Packit |
1c1d7e |
isFirst=isFirstChildNode((DocHtmlListItem*)p->parent(),p);
|
|
Packit |
1c1d7e |
isLast =isLastChildNode ((DocHtmlListItem*)p->parent(),p);
|
|
Packit |
1c1d7e |
if (isFirst) t=1;
|
|
Packit |
1c1d7e |
if (isLast) t=3;
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case DocNode::Kind_SecRefItem:
|
|
Packit |
1c1d7e |
isFirst=isFirstChildNode((DocSecRefItem*)p->parent(),p);
|
|
Packit |
1c1d7e |
isLast =isLastChildNode ((DocSecRefItem*)p->parent(),p);
|
|
Packit |
1c1d7e |
if (isFirst) t=1;
|
|
Packit |
1c1d7e |
if (isLast) t=3;
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case DocNode::Kind_HtmlDescData:
|
|
Packit |
1c1d7e |
isFirst=isFirstChildNode((DocHtmlDescData*)p->parent(),p);
|
|
Packit |
1c1d7e |
isLast =isLastChildNode ((DocHtmlDescData*)p->parent(),p);
|
|
Packit |
1c1d7e |
if (isFirst) t=2;
|
|
Packit |
1c1d7e |
if (isLast) t=4;
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case DocNode::Kind_XRefItem:
|
|
Packit |
1c1d7e |
isFirst=isFirstChildNode((DocXRefItem*)p->parent(),p);
|
|
Packit |
1c1d7e |
isLast =isLastChildNode ((DocXRefItem*)p->parent(),p);
|
|
Packit |
1c1d7e |
if (isFirst) t=2;
|
|
Packit |
1c1d7e |
if (isLast) t=4;
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case DocNode::Kind_SimpleSect:
|
|
Packit |
1c1d7e |
isFirst=isFirstChildNode((DocSimpleSect*)p->parent(),p);
|
|
Packit |
1c1d7e |
isLast =isLastChildNode ((DocSimpleSect*)p->parent(),p);
|
|
Packit |
1c1d7e |
if (isFirst) t=2;
|
|
Packit |
1c1d7e |
if (isLast) t=4;
|
|
Packit |
1c1d7e |
if (isSeparatedParagraph((DocSimpleSect*)p->parent(),p))
|
|
Packit |
1c1d7e |
// if the paragraph is enclosed with separators it will
|
|
Packit |
1c1d7e |
// be included in .. so avoid addition paragraph
|
|
Packit |
1c1d7e |
// markers
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
isFirst=isLast=TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case DocNode::Kind_HtmlCell:
|
|
Packit |
1c1d7e |
isFirst=isFirstChildNode((DocHtmlCell*)p->parent(),p);
|
|
Packit |
1c1d7e |
isLast =isLastChildNode ((DocHtmlCell*)p->parent(),p);
|
|
Packit |
1c1d7e |
if (isFirst) t=5;
|
|
Packit |
1c1d7e |
if (isLast) t=6;
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
default:
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
//printf("para=%p parent()->kind=%d isFirst=%d isLast=%d t=%d\n",
|
|
Packit |
1c1d7e |
// p,p->parent()->kind(),isFirst,isLast,t);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return t;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPre(DocPara *p)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//printf("DocPara::visitPre: parent of kind %d ",
|
|
Packit |
1c1d7e |
// p->parent() ? p->parent()->kind() : -1);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool needsTag = FALSE;
|
|
Packit |
1c1d7e |
if (p && p->parent())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
switch (p->parent()->kind())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case DocNode::Kind_Section:
|
|
Packit |
1c1d7e |
case DocNode::Kind_Internal:
|
|
Packit |
1c1d7e |
case DocNode::Kind_HtmlListItem:
|
|
Packit |
1c1d7e |
case DocNode::Kind_HtmlDescData:
|
|
Packit |
1c1d7e |
case DocNode::Kind_HtmlCell:
|
|
Packit |
1c1d7e |
case DocNode::Kind_SimpleListItem:
|
|
Packit |
1c1d7e |
case DocNode::Kind_AutoListItem:
|
|
Packit |
1c1d7e |
case DocNode::Kind_SimpleSect:
|
|
Packit |
1c1d7e |
case DocNode::Kind_XRefItem:
|
|
Packit |
1c1d7e |
case DocNode::Kind_Copy:
|
|
Packit |
1c1d7e |
case DocNode::Kind_HtmlBlockQuote:
|
|
Packit |
1c1d7e |
case DocNode::Kind_ParBlock:
|
|
Packit |
1c1d7e |
needsTag = TRUE;
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case DocNode::Kind_Root:
|
|
Packit |
1c1d7e |
needsTag = !((DocRoot*)p->parent())->singleLine();
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
default:
|
|
Packit |
1c1d7e |
needsTag = FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// if the first element of a paragraph is something that should be outside of
|
|
Packit |
1c1d7e |
// the paragraph (,,,..) then that will already started the
|
|
Packit |
1c1d7e |
// paragraph and we don't need to do it here
|
|
Packit |
1c1d7e |
uint nodeIndex = 0;
|
|
Packit |
1c1d7e |
if (p && nodeIndex<p->children().count())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
while (nodeIndex<p->children().count() &&
|
|
Packit |
1c1d7e |
p->children().at(nodeIndex)->kind()==DocNode::Kind_WhiteSpace)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
nodeIndex++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (nodeIndex<p->children().count())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DocNode *n = p->children().at(nodeIndex);
|
|
Packit |
1c1d7e |
if (mustBeOutsideParagraph(n))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
needsTag = FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// check if this paragraph is the first or last child of a or .
|
|
Packit |
1c1d7e |
// this allows us to mark the tag with a special class so we can
|
|
Packit |
1c1d7e |
// fix the otherwise ugly spacing.
|
|
Packit |
1c1d7e |
int t;
|
|
Packit |
1c1d7e |
static const char *contexts[7] =
|
|
Packit |
1c1d7e |
{ "", // 0
|
|
Packit |
1c1d7e |
" class=\"startli\"", // 1
|
|
Packit |
1c1d7e |
" class=\"startdd\"", // 2
|
|
Packit |
1c1d7e |
" class=\"endli\"", // 3
|
|
Packit |
1c1d7e |
" class=\"enddd\"", // 4
|
|
Packit |
1c1d7e |
" class=\"starttd\"", // 5
|
|
Packit |
1c1d7e |
" class=\"endtd\"" // 6
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
bool isFirst;
|
|
Packit |
1c1d7e |
bool isLast;
|
|
Packit |
1c1d7e |
t = getParagraphContext(p,isFirst,isLast);
|
|
Packit |
1c1d7e |
//printf("startPara first=%d last=%d\n",isFirst,isLast);
|
|
Packit |
1c1d7e |
if (isFirst && isLast) needsTag=FALSE;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//printf(" needsTag=%d\n",needsTag);
|
|
Packit |
1c1d7e |
// write the paragraph tag (if needed)
|
|
Packit |
1c1d7e |
if (needsTag) m_t << "<p" << contexts[t] << ">";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPost(DocPara *p)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
bool needsTag = FALSE;
|
|
Packit |
1c1d7e |
if (p->parent())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
switch (p->parent()->kind())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case DocNode::Kind_Section:
|
|
Packit |
1c1d7e |
case DocNode::Kind_Internal:
|
|
Packit |
1c1d7e |
case DocNode::Kind_HtmlListItem:
|
|
Packit |
1c1d7e |
case DocNode::Kind_HtmlDescData:
|
|
Packit |
1c1d7e |
case DocNode::Kind_HtmlCell:
|
|
Packit |
1c1d7e |
case DocNode::Kind_SimpleListItem:
|
|
Packit |
1c1d7e |
case DocNode::Kind_AutoListItem:
|
|
Packit |
1c1d7e |
case DocNode::Kind_SimpleSect:
|
|
Packit |
1c1d7e |
case DocNode::Kind_XRefItem:
|
|
Packit |
1c1d7e |
case DocNode::Kind_Copy:
|
|
Packit |
1c1d7e |
case DocNode::Kind_HtmlBlockQuote:
|
|
Packit |
1c1d7e |
case DocNode::Kind_ParBlock:
|
|
Packit |
1c1d7e |
needsTag = TRUE;
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case DocNode::Kind_Root:
|
|
Packit |
1c1d7e |
needsTag = !((DocRoot*)p->parent())->singleLine();
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
default:
|
|
Packit |
1c1d7e |
needsTag = FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// if the last element of a paragraph is something that should be outside of
|
|
Packit |
1c1d7e |
// the paragraph (,,) then that will already have ended the
|
|
Packit |
1c1d7e |
// paragraph and we don't need to do it here
|
|
Packit |
1c1d7e |
int nodeIndex = p->children().count()-1;
|
|
Packit |
1c1d7e |
if (nodeIndex>=0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
while (nodeIndex>=0 && p->children().at(nodeIndex)->kind()==DocNode::Kind_WhiteSpace)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
nodeIndex--;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (nodeIndex>=0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DocNode *n = p->children().at(nodeIndex);
|
|
Packit |
1c1d7e |
if (mustBeOutsideParagraph(n))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
needsTag = FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool isFirst;
|
|
Packit |
1c1d7e |
bool isLast;
|
|
Packit |
1c1d7e |
getParagraphContext(p,isFirst,isLast);
|
|
Packit |
1c1d7e |
//printf("endPara first=%d last=%d\n",isFirst,isLast);
|
|
Packit |
1c1d7e |
if (isFirst && isLast) needsTag=FALSE;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//printf("DocPara::visitPost needsTag=%d\n",needsTag);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (needsTag) m_t << "\n";
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPre(DocRoot *)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPost(DocRoot *)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPre(DocSimpleSect *s)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
forceEndParagraph(s);
|
|
Packit |
1c1d7e |
m_t << "typeString() << "\">- ";
|
|
Packit |
1c1d7e |
switch(s->type())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case DocSimpleSect::See:
|
|
Packit |
1c1d7e |
m_t << theTranslator->trSeeAlso(); break;
|
|
Packit |
1c1d7e |
case DocSimpleSect::Return:
|
|
Packit |
1c1d7e |
m_t << theTranslator->trReturns(); break;
|
|
Packit |
1c1d7e |
case DocSimpleSect::Author:
|
|
Packit |
1c1d7e |
m_t << theTranslator->trAuthor(TRUE,TRUE); break;
|
|
Packit |
1c1d7e |
case DocSimpleSect::Authors:
|
|
Packit |
1c1d7e |
m_t << theTranslator->trAuthor(TRUE,FALSE); break;
|
|
Packit |
1c1d7e |
case DocSimpleSect::Version:
|
|
Packit |
1c1d7e |
m_t << theTranslator->trVersion(); break;
|
|
Packit |
1c1d7e |
case DocSimpleSect::Since:
|
|
Packit |
1c1d7e |
m_t << theTranslator->trSince(); break;
|
|
Packit |
1c1d7e |
case DocSimpleSect::Date:
|
|
Packit |
1c1d7e |
m_t << theTranslator->trDate(); break;
|
|
Packit |
1c1d7e |
case DocSimpleSect::Note:
|
|
Packit |
1c1d7e |
m_t << theTranslator->trNote(); break;
|
|
Packit |
1c1d7e |
case DocSimpleSect::Warning:
|
|
Packit |
1c1d7e |
m_t << theTranslator->trWarning(); break;
|
|
Packit |
1c1d7e |
case DocSimpleSect::Pre:
|
|
Packit |
1c1d7e |
m_t << theTranslator->trPrecondition(); break;
|
|
Packit |
1c1d7e |
case DocSimpleSect::Post:
|
|
Packit |
1c1d7e |
m_t << theTranslator->trPostcondition(); break;
|
|
Packit |
1c1d7e |
case DocSimpleSect::Copyright:
|
|
Packit |
1c1d7e |
m_t << theTranslator->trCopyright(); break;
|
|
Packit |
1c1d7e |
case DocSimpleSect::Invar:
|
|
Packit |
1c1d7e |
m_t << theTranslator->trInvariant(); break;
|
|
Packit |
1c1d7e |
case DocSimpleSect::Remark:
|
|
Packit |
1c1d7e |
m_t << theTranslator->trRemarks(); break;
|
|
Packit |
1c1d7e |
case DocSimpleSect::Attention:
|
|
Packit |
1c1d7e |
m_t << theTranslator->trAttention(); break;
|
|
Packit |
1c1d7e |
case DocSimpleSect::User: break;
|
|
Packit |
1c1d7e |
case DocSimpleSect::Rcs: break;
|
|
Packit |
1c1d7e |
case DocSimpleSect::Unknown: break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// special case 1: user defined title
|
|
Packit |
1c1d7e |
if (s->type()!=DocSimpleSect::User && s->type()!=DocSimpleSect::Rcs)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPost(DocSimpleSect *s)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
m_t << "\n";
|
|
Packit |
1c1d7e |
forceStartParagraph(s);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPre(DocTitle *)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPost(DocTitle *)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
m_t << "";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPre(DocSimpleList *sl)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
forceEndParagraph(sl);
|
|
Packit |
1c1d7e |
m_t << "
|
|
Packit |
1c1d7e |
if (!sl->isPreformatted()) m_t << "\n";
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPost(DocSimpleList *sl)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
m_t << "";
|
|
Packit |
1c1d7e |
if (!sl->isPreformatted()) m_t << "\n";
|
|
Packit |
1c1d7e |
forceStartParagraph(sl);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPre(DocSimpleListItem *)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
m_t << "";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPost(DocSimpleListItem *li)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
m_t << "";
|
|
Packit |
1c1d7e |
if (!li->isPreformatted()) m_t << "\n";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPre(DocSection *s)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
forceEndParagraph(s);
|
|
Packit |
1c1d7e |
m_t << "<h" << s->level() << ">";
|
|
Packit |
1c1d7e |
m_t << "anchor();
|
|
Packit |
1c1d7e |
m_t << "\">" << endl;
|
|
Packit |
1c1d7e |
filter(convertCharEntitiesToUTF8(s->title().data()));
|
|
Packit |
1c1d7e |
m_t << "</h" << s->level() << ">\n";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPost(DocSection *s)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
forceStartParagraph(s);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPre(DocHtmlList *s)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
forceEndParagraph(s);
|
|
Packit |
1c1d7e |
if (s->type()==DocHtmlList::Ordered)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "<ol" << htmlAttribsToString(s->attribs()) << ">\n";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "<ul" << htmlAttribsToString(s->attribs()) << ">\n";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPost(DocHtmlList *s)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
if (s->type()==DocHtmlList::Ordered)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (!s->isPreformatted()) m_t << "\n";
|
|
Packit |
1c1d7e |
forceStartParagraph(s);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPre(DocHtmlListItem *i)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
m_t << "<li" << htmlAttribsToString(i->attribs()) << ">";
|
|
Packit |
1c1d7e |
if (!i->isPreformatted()) m_t << "\n";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPost(DocHtmlListItem *)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
m_t << "\n";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPre(DocHtmlDescList *dl)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
forceEndParagraph(dl);
|
|
Packit |
1c1d7e |
m_t << "<dl" << htmlAttribsToString(dl->attribs()) << ">\n";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPost(DocHtmlDescList *dl)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
m_t << "\n";
|
|
Packit |
1c1d7e |
forceStartParagraph(dl);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPre(DocHtmlDescTitle *dt)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
m_t << "<dt" << htmlAttribsToString(dt->attribs()) << ">";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPost(DocHtmlDescTitle *)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
m_t << "\n";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPre(DocHtmlDescData *dd)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
m_t << "<dd" << htmlAttribsToString(dd->attribs()) << ">";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPost(DocHtmlDescData *)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
m_t << "\n";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPre(DocHtmlTable *t)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
forceEndParagraph(t);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (t->hasCaption())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "caption()->anchor() << "\">\n";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QString attrs = htmlAttribsToString(t->attribs());
|
|
Packit |
1c1d7e |
if (attrs.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "\n";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "<table" << htmlAttribsToString(t->attribs()) << ">\n";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPost(DocHtmlTable *t)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
m_t << "\n";
|
|
Packit |
1c1d7e |
forceStartParagraph(t);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPre(DocHtmlRow *tr)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
m_t << "<tr" << htmlAttribsToString(tr->attribs()) << ">\n";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPost(DocHtmlRow *)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
m_t << "\n";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPre(DocHtmlCell *c)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
if (c->isHeading())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "<th" << htmlAttribsToString(c->attribs()) << ">";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "<td" << htmlAttribsToString(c->attribs()) << ">";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPost(DocHtmlCell *c)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
if (c->isHeading()) m_t << ""; else m_t << "";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPre(DocHtmlCaption *c)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
m_t << "<caption" << htmlAttribsToString(c->attribs()) << ">";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPost(DocHtmlCaption *)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
m_t << "</caption>\n";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPre(DocInternal *)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
//forceEndParagraph(i);
|
|
Packit |
1c1d7e |
//m_t << "" << theTranslator->trForInternalUseOnly() << " " << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPost(DocInternal *)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
//forceStartParagraph(i);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPre(DocHRef *href)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
if (href->url().left(7)=="mailto:")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
writeObfuscatedMailAddress(href->url().mid(7));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString url = correctURL(href->url(),href->relPath());
|
|
Packit |
1c1d7e |
m_t << "
|
|
Packit |
1c1d7e |
<< htmlAttribsToString(href->attribs()) << ">";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPost(DocHRef *)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
m_t << "";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPre(DocHtmlHeader *header)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
forceEndParagraph(header);
|
|
Packit |
1c1d7e |
m_t << "<h" << header->level()
|
|
Packit |
1c1d7e |
<< htmlAttribsToString(header->attribs()) << ">";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPost(DocHtmlHeader *header)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
m_t << "</h" << header->level() << ">\n";
|
|
Packit |
1c1d7e |
forceStartParagraph(header);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPre(DocImage *img)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (img->type()==DocImage::Html)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
forceEndParagraph(img);
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
QString baseName=img->name();
|
|
Packit |
1c1d7e |
int i;
|
|
Packit |
1c1d7e |
if ((i=baseName.findRev('/'))!=-1 || (i=baseName.findRev('\\'))!=-1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
baseName=baseName.right(baseName.length()-i-1);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
m_t << "" << endl;
|
|
Packit |
1c1d7e |
QCString url = img->url();
|
|
Packit |
1c1d7e |
QCString sizeAttribs;
|
|
Packit |
1c1d7e |
if (!img->width().isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
sizeAttribs+=" width=\""+img->width()+"\"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (!img->height().isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
sizeAttribs+=" height=\""+img->height()+"\"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (url.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (img->name().right(4)==".svg")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "<object type=\"image/svg+xml\" data=\"" << img->relPath() << img->name()
|
|
Packit |
1c1d7e |
<< "\"" << sizeAttribs << htmlAttribsToString(img->attribs()) << ">" << baseName
|
|
Packit |
1c1d7e |
<< "</object>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "relPath() << img->name() << "\" alt=\""
|
|
Packit |
1c1d7e |
<< baseName << "\"" << sizeAttribs << htmlAttribsToString(img->attribs())
|
|
Packit |
1c1d7e |
<< "/>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (url.right(4)==".svg")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "<object type=\"image/svg+xml\" data=\"" << correctURL(url,img->relPath())
|
|
Packit |
1c1d7e |
<< "\"" << sizeAttribs << htmlAttribsToString(img->attribs()) << "></object>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "relPath()) << "\""
|
|
Packit |
1c1d7e |
<< sizeAttribs << htmlAttribsToString(img->attribs())
|
|
Packit |
1c1d7e |
<< "/>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (img->hasCaption())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // other format -> skip
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
pushEnabled();
|
|
Packit |
1c1d7e |
m_hide=TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPost(DocImage *img)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (img->type()==DocImage::Html)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
if (img->hasCaption())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
m_t << "" << endl;
|
|
Packit |
1c1d7e |
forceStartParagraph(img);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // other format
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
popEnabled();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPre(DocDotFile *df)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
m_t << "" << endl;
|
|
Packit |
1c1d7e |
writeDotFile(df->file(),df->relPath(),df->context());
|
|
Packit |
1c1d7e |
if (df->hasCaption())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPost(DocDotFile *df)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
if (df->hasCaption())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
m_t << "" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPre(DocMscFile *df)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
m_t << "" << endl;
|
|
Packit |
1c1d7e |
writeMscFile(df->file(),df->relPath(),df->context());
|
|
Packit |
1c1d7e |
if (df->hasCaption())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPost(DocMscFile *df)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
if (df->hasCaption())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
m_t << "" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPre(DocDiaFile *df)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
m_t << "" << endl;
|
|
Packit |
1c1d7e |
writeDiaFile(df->file(),df->relPath(),df->context());
|
|
Packit |
1c1d7e |
if (df->hasCaption())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPost(DocDiaFile *df)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
if (df->hasCaption())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
m_t << "" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPre(DocLink *lnk)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
startLink(lnk->ref(),lnk->file(),lnk->relPath(),lnk->anchor());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPost(DocLink *)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
endLink();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPre(DocRef *ref)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
if (!ref->file().isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// when ref->isSubPage()==TRUE we use ref->file() for HTML and
|
|
Packit |
1c1d7e |
// ref->anchor() for LaTeX/RTF
|
|
Packit |
1c1d7e |
startLink(ref->ref(),ref->file(),ref->relPath(),ref->isSubPage() ? QCString() : ref->anchor());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (!ref->hasLinkText()) filter(ref->targetTitle());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPost(DocRef *ref)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
if (!ref->file().isEmpty()) endLink();
|
|
Packit |
1c1d7e |
//m_t << " ";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPre(DocSecRefItem *ref)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
QString refName=ref->file();
|
|
Packit |
1c1d7e |
if (refName.right(Doxygen::htmlFileExtension.length())!=
|
|
Packit |
1c1d7e |
QString(Doxygen::htmlFileExtension))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
refName+=Doxygen::htmlFileExtension;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
m_t << "anchor() << "\">";
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPost(DocSecRefItem *)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
m_t << "\n";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPre(DocSecRefList *s)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
forceEndParagraph(s);
|
|
Packit |
1c1d7e |
m_t << "" << endl;
|
|
Packit |
1c1d7e |
m_t << "
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPost(DocSecRefList *s)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
m_t << "" << endl;
|
|
Packit |
1c1d7e |
m_t << "" << endl;
|
|
Packit |
1c1d7e |
forceStartParagraph(s);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//void HtmlDocVisitor::visitPre(DocLanguage *l)
|
|
Packit |
1c1d7e |
//{
|
|
Packit |
1c1d7e |
// QString langId = Config_getEnum(OUTPUT_LANGUAGE);
|
|
Packit |
1c1d7e |
// if (l->id().lower()!=langId.lower())
|
|
Packit |
1c1d7e |
// {
|
|
Packit |
1c1d7e |
// pushEnabled();
|
|
Packit |
1c1d7e |
// m_hide = TRUE;
|
|
Packit |
1c1d7e |
// }
|
|
Packit |
1c1d7e |
//}
|
|
Packit |
1c1d7e |
//
|
|
Packit |
1c1d7e |
//void HtmlDocVisitor::visitPost(DocLanguage *l)
|
|
Packit |
1c1d7e |
//{
|
|
Packit |
1c1d7e |
// QString langId = Config_getEnum(OUTPUT_LANGUAGE);
|
|
Packit |
1c1d7e |
// if (l->id().lower()!=langId.lower())
|
|
Packit |
1c1d7e |
// {
|
|
Packit |
1c1d7e |
// popEnabled();
|
|
Packit |
1c1d7e |
// }
|
|
Packit |
1c1d7e |
//}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPre(DocParamSect *s)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
forceEndParagraph(s);
|
|
Packit |
1c1d7e |
QCString className;
|
|
Packit |
1c1d7e |
QCString heading;
|
|
Packit |
1c1d7e |
switch(s->type())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case DocParamSect::Param:
|
|
Packit |
1c1d7e |
heading=theTranslator->trParameters();
|
|
Packit |
1c1d7e |
className="params";
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case DocParamSect::RetVal:
|
|
Packit |
1c1d7e |
heading=theTranslator->trReturnValues();
|
|
Packit |
1c1d7e |
className="retval";
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case DocParamSect::Exception:
|
|
Packit |
1c1d7e |
heading=theTranslator->trExceptions();
|
|
Packit |
1c1d7e |
className="exception";
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case DocParamSect::TemplateParam:
|
|
Packit |
1c1d7e |
heading=theTranslator->trTemplateParameters();
|
|
Packit |
1c1d7e |
className="tparams";
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
default:
|
|
Packit |
1c1d7e |
ASSERT(0);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
m_t << "- ";
|
|
Packit |
1c1d7e |
m_t << heading;
|
|
Packit |
1c1d7e |
m_t << "" << endl;
|
|
Packit |
1c1d7e |
m_t << " " << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPost(DocParamSect *s)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
m_t << " " << endl;
|
|
Packit |
1c1d7e |
m_t << " " << endl;
|
|
Packit |
1c1d7e |
m_t << "" << endl;
|
|
Packit |
1c1d7e |
forceStartParagraph(s);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPre(DocParamList *pl)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("DocParamList::visitPre\n");
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
m_t << " ";
|
|
Packit |
1c1d7e |
DocParamSect *sect = 0;
|
|
Packit |
1c1d7e |
if (pl->parent()->kind()==DocNode::Kind_ParamSect)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
sect=(DocParamSect*)pl->parent();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (sect && sect->hasInOutSpecifier())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "";
|
|
Packit |
1c1d7e |
if (pl->direction()!=DocParamSect::Unspecified)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "[";
|
|
Packit |
1c1d7e |
if (pl->direction()==DocParamSect::In)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "in";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (pl->direction()==DocParamSect::Out)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "out";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (pl->direction()==DocParamSect::InOut)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "in,out";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
m_t << "]";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
m_t << "";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (sect && sect->hasTypeSpecifier())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "";
|
|
Packit |
1c1d7e |
QListIterator<DocNode> li(pl->paramTypes());
|
|
Packit |
1c1d7e |
DocNode *type;
|
|
Packit |
1c1d7e |
bool first=TRUE;
|
|
Packit |
1c1d7e |
for (li.toFirst();(type=li.current());++li)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (!first) m_t << " | "; else first=FALSE;
|
|
Packit |
1c1d7e |
if (type->kind()==DocNode::Kind_Word)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
visit((DocWord*)type);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (type->kind()==DocNode::Kind_LinkedWord)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
visit((DocLinkedWord*)type);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
m_t << "";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
m_t << "";
|
|
Packit |
1c1d7e |
//QStrListIterator li(pl->parameters());
|
|
Packit |
1c1d7e |
//const char *s;
|
|
Packit |
1c1d7e |
QListIterator<DocNode> li(pl->parameters());
|
|
Packit |
1c1d7e |
DocNode *param;
|
|
Packit |
1c1d7e |
bool first=TRUE;
|
|
Packit |
1c1d7e |
for (li.toFirst();(param=li.current());++li)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (!first) m_t << ","; else first=FALSE;
|
|
Packit |
1c1d7e |
if (param->kind()==DocNode::Kind_Word)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
visit((DocWord*)param);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (param->kind()==DocNode::Kind_LinkedWord)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
visit((DocLinkedWord*)param);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
m_t << "";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPost(DocParamList *)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("DocParamList::visitPost\n");
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
m_t << "" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPre(DocXRefItem *x)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
if (x->title().isEmpty()) return;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
forceEndParagraph(x);
|
|
Packit |
1c1d7e |
bool anonymousEnum = x->file()=="@";
|
|
Packit |
1c1d7e |
if (!anonymousEnum)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "key() << "\">
|
|
Packit |
1c1d7e |
<< x->relPath() << x->file() << Doxygen::htmlFileExtension
|
|
Packit |
1c1d7e |
<< "#" << x->anchor() << "\">";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "key() << "\">- ";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
filter(x->title());
|
|
Packit |
1c1d7e |
m_t << ":";
|
|
Packit |
1c1d7e |
if (!anonymousEnum) m_t << "";
|
|
Packit |
1c1d7e |
m_t << "";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPost(DocXRefItem *x)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
if (x->title().isEmpty()) return;
|
|
Packit |
1c1d7e |
m_t << "" << endl;
|
|
Packit |
1c1d7e |
forceStartParagraph(x);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPre(DocInternalRef *ref)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
startLink(0,ref->file(),ref->relPath(),ref->anchor());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPost(DocInternalRef *)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
endLink();
|
|
Packit |
1c1d7e |
m_t << " ";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPre(DocCopy *)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPost(DocCopy *)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPre(DocText *)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPost(DocText *)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPre(DocHtmlBlockQuote *b)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
forceEndParagraph(b);
|
|
Packit |
1c1d7e |
QString attrs = htmlAttribsToString(b->attribs());
|
|
Packit |
1c1d7e |
if (attrs.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "\n";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "<blockquote" << htmlAttribsToString(b->attribs()) << ">\n";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPost(DocHtmlBlockQuote *b)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
m_t << "" << endl;
|
|
Packit |
1c1d7e |
forceStartParagraph(b);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPre(DocVhdlFlow *vf)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
if (VhdlDocGen::getFlowMember()) // use VHDL flow chart creator
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
forceEndParagraph(vf);
|
|
Packit |
1c1d7e |
QCString fname=FlowChart::convertNameToFileName();
|
|
Packit |
1c1d7e |
m_t << "";
|
|
Packit |
1c1d7e |
m_t << "flowchart: " ; // TODO: translate me
|
|
Packit |
1c1d7e |
m_t << "
|
|
Packit |
1c1d7e |
m_t << fname.data();
|
|
Packit |
1c1d7e |
m_t << ".svg\">";
|
|
Packit |
1c1d7e |
m_t << VhdlDocGen::getFlowMember()->name().data();
|
|
Packit |
1c1d7e |
m_t << "";
|
|
Packit |
1c1d7e |
if (vf->hasCaption())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << " ";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPost(DocVhdlFlow *vf)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
if (VhdlDocGen::getFlowMember()) // use VHDL flow chart creator
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "";
|
|
Packit |
1c1d7e |
forceStartParagraph(vf);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPre(DocParBlock *)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::visitPost(DocParBlock *)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (m_hide) return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::filter(const char *str)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (str==0) return;
|
|
Packit |
1c1d7e |
const char *p=str;
|
|
Packit |
1c1d7e |
char c;
|
|
Packit |
1c1d7e |
while (*p)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
c=*p++;
|
|
Packit |
1c1d7e |
switch(c)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case '<': m_t << "<"; break;
|
|
Packit |
1c1d7e |
case '>': m_t << ">"; break;
|
|
Packit |
1c1d7e |
case '&': m_t << "&"; break;
|
|
Packit |
1c1d7e |
default: m_t << c;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/// Escape basic entities to produce a valid CDATA attribute value,
|
|
Packit |
1c1d7e |
/// assume that the outer quoting will be using the double quote "
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::filterQuotedCdataAttr(const char* str)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (str==0) return;
|
|
Packit |
1c1d7e |
const char *p=str;
|
|
Packit |
1c1d7e |
char c;
|
|
Packit |
1c1d7e |
while (*p)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
c=*p++;
|
|
Packit |
1c1d7e |
switch(c)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case '&': m_t << "&"; break;
|
|
Packit |
1c1d7e |
case '"': m_t << """; break;
|
|
Packit |
1c1d7e |
case '<': m_t << "<"; break;
|
|
Packit |
1c1d7e |
case '>': m_t << ">"; break;
|
|
Packit |
1c1d7e |
default: m_t << c;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::startLink(const QCString &ref,const QCString &file,
|
|
Packit |
1c1d7e |
const QCString &relPath,const QCString &anchor,
|
|
Packit |
1c1d7e |
const QCString &tooltip)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("HtmlDocVisitor: file=%s anchor=%s\n",file.data(),anchor.data());
|
|
Packit |
1c1d7e |
if (!ref.isEmpty()) // link to entity imported via tag file
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "
|
|
Packit |
1c1d7e |
m_t << externalLinkTarget() << externalRef(relPath,ref,FALSE);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // local link
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
m_t << "href=\"";
|
|
Packit |
1c1d7e |
m_t << externalRef(relPath,ref,TRUE);
|
|
Packit |
1c1d7e |
if (!file.isEmpty()) m_t << file << Doxygen::htmlFileExtension;
|
|
Packit |
1c1d7e |
if (!anchor.isEmpty()) m_t << "#" << anchor;
|
|
Packit |
1c1d7e |
m_t << "\"";
|
|
Packit |
1c1d7e |
if (!tooltip.isEmpty()) m_t << " title=\"" << convertToHtml(tooltip) << "\"";
|
|
Packit |
1c1d7e |
m_t << ">";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::endLink()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_t << "";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::pushEnabled()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
m_enabled.push(new bool(m_hide));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::popEnabled()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
bool *v=m_enabled.pop();
|
|
Packit |
1c1d7e |
ASSERT(v!=0);
|
|
Packit |
1c1d7e |
m_hide = *v;
|
|
Packit |
1c1d7e |
delete v;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::writeDotFile(const QCString &fn,const QCString &relPath,
|
|
Packit |
1c1d7e |
const QCString &context)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString baseName=fn;
|
|
Packit |
1c1d7e |
int i;
|
|
Packit |
1c1d7e |
if ((i=baseName.findRev('/'))!=-1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
baseName=baseName.right(baseName.length()-i-1);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if ((i=baseName.find('.'))!=-1) // strip extension
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
baseName=baseName.left(i);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
baseName.prepend("dot_");
|
|
Packit |
1c1d7e |
QCString outDir = Config_getString(HTML_OUTPUT);
|
|
Packit |
1c1d7e |
writeDotGraphFromFile(fn,outDir,baseName,GOF_BITMAP);
|
|
Packit |
1c1d7e |
writeDotImageMapFromFile(m_t,fn,outDir,relPath,baseName,context);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::writeMscFile(const QCString &fileName,
|
|
Packit |
1c1d7e |
const QCString &relPath,
|
|
Packit |
1c1d7e |
const QCString &context)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString baseName=fileName;
|
|
Packit |
1c1d7e |
int i;
|
|
Packit |
1c1d7e |
if ((i=baseName.findRev('/'))!=-1) // strip path
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
baseName=baseName.right(baseName.length()-i-1);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if ((i=baseName.find('.'))!=-1) // strip extension
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
baseName=baseName.left(i);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
baseName.prepend("msc_");
|
|
Packit |
1c1d7e |
QCString outDir = Config_getString(HTML_OUTPUT);
|
|
Packit |
1c1d7e |
QCString imgExt = getDotImageExtension();
|
|
Packit |
1c1d7e |
MscOutputFormat mscFormat = MSC_BITMAP;
|
|
Packit |
1c1d7e |
if ("svg" == imgExt)
|
|
Packit |
1c1d7e |
mscFormat = MSC_SVG;
|
|
Packit |
1c1d7e |
writeMscGraphFromFile(fileName,outDir,baseName,mscFormat);
|
|
Packit |
1c1d7e |
writeMscImageMapFromFile(m_t,fileName,outDir,relPath,baseName,context,mscFormat);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::writeDiaFile(const QCString &fileName,
|
|
Packit |
1c1d7e |
const QCString &relPath,
|
|
Packit |
1c1d7e |
const QCString &)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString baseName=fileName;
|
|
Packit |
1c1d7e |
int i;
|
|
Packit |
1c1d7e |
if ((i=baseName.findRev('/'))!=-1) // strip path
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
baseName=baseName.right(baseName.length()-i-1);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if ((i=baseName.find('.'))!=-1) // strip extension
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
baseName=baseName.left(i);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
baseName.prepend("dia_");
|
|
Packit |
1c1d7e |
QCString outDir = Config_getString(HTML_OUTPUT);
|
|
Packit |
1c1d7e |
writeDiaGraphFromFile(fileName,outDir,baseName,DIA_BITMAP);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
m_t << "" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::writePlantUMLFile(const QCString &fileName,
|
|
Packit |
1c1d7e |
const QCString &relPath,
|
|
Packit |
1c1d7e |
const QCString &)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString baseName=fileName;
|
|
Packit |
1c1d7e |
int i;
|
|
Packit |
1c1d7e |
if ((i=baseName.findRev('/'))!=-1) // strip path
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
baseName=baseName.right(baseName.length()-i-1);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if ((i=baseName.findRev('.'))!=-1) // strip extension
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
baseName=baseName.left(i);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
static QCString outDir = Config_getString(HTML_OUTPUT);
|
|
Packit |
1c1d7e |
QCString imgExt = getDotImageExtension();
|
|
Packit |
1c1d7e |
if (imgExt=="svg")
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
generatePlantUMLOutput(fileName,outDir,PUML_SVG);
|
|
Packit |
1c1d7e |
//m_t << "<iframe scrolling=\"no\" frameborder=\"0\" src=\"" << relPath << baseName << ".svg" << "\" />" << endl;
|
|
Packit |
1c1d7e |
//m_t << "This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead. ";
|
|
Packit |
1c1d7e |
//m_t << "</iframe>" << endl;
|
|
Packit |
1c1d7e |
m_t << "<object type=\"image/svg+xml\" data=\"" << relPath << baseName << ".svg\"></object>" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
generatePlantUMLOutput(fileName,outDir,PUML_BITMAP);
|
|
Packit |
1c1d7e |
m_t << "" << endl;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/** Returns TRUE if the child nodes in paragraph \a para until \a nodeIndex
|
|
Packit |
1c1d7e |
contain a style change node that is still active and that style change is one that
|
|
Packit |
1c1d7e |
must be located outside of a paragraph, i.e. it is a center, div, or pre tag.
|
|
Packit |
1c1d7e |
See also bug746162.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
static bool insideStyleChangeThatIsOutsideParagraph(DocPara *para,int nodeIndex)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("insideStyleChangeThatIsOutputParagraph(index=%d)\n",nodeIndex);
|
|
Packit |
1c1d7e |
int styleMask=0;
|
|
Packit |
1c1d7e |
bool styleOutsideParagraph=FALSE;
|
|
Packit |
1c1d7e |
while (nodeIndex>=0 && !styleOutsideParagraph)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DocNode *n = para->children().at(nodeIndex);
|
|
Packit |
1c1d7e |
if (n->kind()==DocNode::Kind_StyleChange)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DocStyleChange *sc = (DocStyleChange*)n;
|
|
Packit |
1c1d7e |
if (!sc->enable()) // remember styles that has been closed already
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
styleMask|=(int)sc->style();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
bool paraStyle = sc->style()==DocStyleChange::Center ||
|
|
Packit |
1c1d7e |
sc->style()==DocStyleChange::Div ||
|
|
Packit |
1c1d7e |
sc->style()==DocStyleChange::Preformatted;
|
|
Packit |
1c1d7e |
//printf("Found style change %s enabled=%d\n",sc->styleString(),sc->enable());
|
|
Packit |
1c1d7e |
if (sc->enable() && (styleMask&(int)sc->style())==0 && // style change that is still active
|
|
Packit |
1c1d7e |
paraStyle
|
|
Packit |
1c1d7e |
)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
styleOutsideParagraph=TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
nodeIndex--;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return styleOutsideParagraph;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/** Used for items found inside a paragraph, which due to XHTML restrictions
|
|
Packit |
1c1d7e |
* have to be outside of the paragraph. This method will forcefully end
|
|
Packit |
1c1d7e |
* the current paragraph and forceStartParagraph() will restart it.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::forceEndParagraph(DocNode *n)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("forceEndParagraph(%p) %d\n",n,n->kind());
|
|
Packit |
1c1d7e |
if (n->parent() && n->parent()->kind()==DocNode::Kind_Para)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DocPara *para = (DocPara*)n->parent();
|
|
Packit |
1c1d7e |
int nodeIndex = para->children().findRef(n);
|
|
Packit |
1c1d7e |
nodeIndex--;
|
|
Packit |
1c1d7e |
if (nodeIndex<0) return; // first node
|
|
Packit |
1c1d7e |
while (nodeIndex>=0 &&
|
|
Packit |
1c1d7e |
para->children().at(nodeIndex)->kind()==DocNode::Kind_WhiteSpace
|
|
Packit |
1c1d7e |
)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
nodeIndex--;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (nodeIndex>=0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DocNode *n = para->children().at(nodeIndex);
|
|
Packit |
1c1d7e |
//printf("n=%p kind=%d outside=%d\n",n,n->kind(),mustBeOutsideParagraph(n));
|
|
Packit |
1c1d7e |
if (mustBeOutsideParagraph(n)) return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
nodeIndex--;
|
|
Packit |
1c1d7e |
bool styleOutsideParagraph=insideStyleChangeThatIsOutsideParagraph(para,nodeIndex);
|
|
Packit |
1c1d7e |
bool isFirst;
|
|
Packit |
1c1d7e |
bool isLast;
|
|
Packit |
1c1d7e |
getParagraphContext(para,isFirst,isLast);
|
|
Packit |
1c1d7e |
//printf("forceEnd first=%d last=%d styleOutsideParagraph=%d\n",isFirst,isLast,styleOutsideParagraph);
|
|
Packit |
1c1d7e |
if (isFirst && isLast) return;
|
|
Packit |
1c1d7e |
if (styleOutsideParagraph) return;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
m_t << "";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/** Used for items found inside a paragraph, which due to XHTML restrictions
|
|
Packit |
1c1d7e |
* have to be outside of the paragraph. This method will forcefully start
|
|
Packit |
1c1d7e |
* the paragraph, that was previously ended by forceEndParagraph().
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
void HtmlDocVisitor::forceStartParagraph(DocNode *n)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("forceStartParagraph(%p) %d\n",n,n->kind());
|
|
Packit |
1c1d7e |
if (n->parent() && n->parent()->kind()==DocNode::Kind_Para) // if we are inside a paragraph
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DocPara *para = (DocPara*)n->parent();
|
|
Packit |
1c1d7e |
int nodeIndex = para->children().findRef(n);
|
|
Packit |
1c1d7e |
int numNodes = para->children().count();
|
|
Packit |
1c1d7e |
bool styleOutsideParagraph=insideStyleChangeThatIsOutsideParagraph(para,nodeIndex);
|
|
Packit |
1c1d7e |
if (styleOutsideParagraph) return;
|
|
Packit |
1c1d7e |
nodeIndex++;
|
|
Packit |
1c1d7e |
if (nodeIndex==numNodes) return; // last node
|
|
Packit |
1c1d7e |
while (nodeIndex
|
|
Packit |
1c1d7e |
para->children().at(nodeIndex)->kind()==DocNode::Kind_WhiteSpace
|
|
Packit |
1c1d7e |
)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
nodeIndex++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (nodeIndex
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DocNode *n = para->children().at(nodeIndex);
|
|
Packit |
1c1d7e |
if (mustBeOutsideParagraph(n)) return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return; // only whitespace at the end!
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool isFirst;
|
|
Packit |
1c1d7e |
bool isLast;
|
|
Packit |
1c1d7e |
getParagraphContext(para,isFirst,isLast);
|
|
Packit |
1c1d7e |
//printf("forceStart first=%d last=%d\n",isFirst,isLast);
|
|
Packit |
1c1d7e |
if (isFirst && isLast) return;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
m_t << "";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|