From 07521a7f050607609b9d04e8f3c58ed4754c47c3 Mon Sep 17 00:00:00 2001 From: albert-github Date: Wed, 6 Jan 2016 15:44:20 +0100 Subject: Bug 760086 - Figure title needs to be on separate line in order for it to work Implemented caption possibility in RTF documentation for the different image formats, including some streamlining of the code. --- src/rtfdocvisitor.cpp | 171 ++++++++++++++++++++++++++------------------------ src/rtfdocvisitor.h | 12 ++-- 2 files changed, 98 insertions(+), 85 deletions(-) diff --git a/src/rtfdocvisitor.cpp b/src/rtfdocvisitor.cpp index 2ea35cc..cb3b34c 100644 --- a/src/rtfdocvisitor.cpp +++ b/src/rtfdocvisitor.cpp @@ -231,6 +231,13 @@ void RTFDocVisitor::visit(DocStyleChange *s) } } +static void visitCaption(RTFDocVisitor *parent, QList children) +{ + QListIterator cli(children); + DocNode *n; + for (cli.toFirst();(n=cli.current());++cli) n->accept(parent); +} + void RTFDocVisitor::visit(DocVerbatim *s) { if (m_hide) return; @@ -288,9 +295,11 @@ void RTFDocVisitor::visit(DocVerbatim *s) } file.writeBlock( s->text(), s->text().length() ); file.close(); - m_t << "\\par{\\qc "; // center picture - writeDotFile(fileName); - m_t << "} "; + + writeDotFile(fileName, s->hasCaption()); + visitCaption(this, s->children()); + includePicturePostRTF(true, s->hasCaption()); + if (Config_getBool("DOT_CLEANUP")) file.remove(); } break; @@ -314,9 +323,11 @@ void RTFDocVisitor::visit(DocVerbatim *s) text+="}"; file.writeBlock( text, text.length() ); file.close(); - m_t << "\\par{\\qc "; // center picture - writeMscFile(baseName); - m_t << "} "; + + writeMscFile(baseName, s->hasCaption()); + visitCaption(this, s->children()); + includePicturePostRTF(true, s->hasCaption()); + if (Config_getBool("DOT_CLEANUP")) file.remove(); } break; @@ -325,9 +336,9 @@ void RTFDocVisitor::visit(DocVerbatim *s) static QCString rtfOutput = Config_getString("RTF_OUTPUT"); QCString baseName = writePlantUMLSource(rtfOutput,s->exampleFile(),s->text()); - m_t << "\\par{\\qc "; // center picture - writePlantUMLFile(baseName); - m_t << "} "; + writePlantUMLFile(baseName, s->hasCaption()); + visitCaption(this, s->children()); + includePicturePostRTF(true, s->hasCaption()); } break; } @@ -1022,76 +1033,95 @@ void RTFDocVisitor::visitPost(DocHtmlHeader *) void RTFDocVisitor::visitPre(DocImage *img) { DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocImage)}\n"); - if (img->type()==DocImage::Rtf) + includePicturePreRTF(img->name(), img->type()==DocImage::Rtf, img->hasCaption()); +} + +void RTFDocVisitor::includePicturePreRTF(const QCString name, const bool isTypeRTF, const bool hasCaption) +{ + if (isTypeRTF) { m_t << "\\par" << endl; m_t << "{" << endl; m_t << rtf_Style_Reset << endl; - m_t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \""; - m_t << img->name(); - m_t << "\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl; - m_t << "}" << endl; + if (hasCaption || m_lastIsPara) m_t << "\\par" << endl; + m_t << "\\pard \\qc { \\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \""; + m_t << name; + m_t << "\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt Image}}" << endl; + m_t << "\\par" << endl; + if (hasCaption) + { + m_t << "\\pard \\qc \\b"; + m_t << "{Image \\field\\flddirty{\\*\\fldinst { SEQ Image \\\\*Arabic }}{\\fldrslt {\\noproof 1}} "; + } m_lastIsPara=TRUE; } else // other format -> skip { + pushEnabled(); + m_hide=TRUE; } - // hide caption since it is not supported at the moment - pushEnabled(); - m_hide=TRUE; } -void RTFDocVisitor::visitPost(DocImage *) +void RTFDocVisitor::visitPost(DocImage *img) { DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocImage)}\n"); - popEnabled(); + includePicturePostRTF(img->type()==DocImage::Rtf, img->hasCaption()); +} + +void RTFDocVisitor::includePicturePostRTF(const bool isTypeRTF, const bool hasCaption) +{ + if (isTypeRTF) + { + if (m_hide) return; + if (hasCaption) + { + m_t << "}" <file()); - - // hide caption since it is not supported at the moment - pushEnabled(); - m_hide=TRUE; + writeDotFile(df); } -void RTFDocVisitor::visitPost(DocDotFile *) +void RTFDocVisitor::visitPost(DocDotFile *df) { DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocDotFile)}\n"); - popEnabled(); + includePicturePostRTF(true, df->hasCaption()); } void RTFDocVisitor::visitPre(DocMscFile *df) { DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocMscFile)}\n"); - writeMscFile(df->file()); - - // hide caption since it is not supported at the moment - pushEnabled(); - m_hide=TRUE; + writeMscFile(df); } -void RTFDocVisitor::visitPost(DocMscFile *) +void RTFDocVisitor::visitPost(DocMscFile *df) { DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocMscFile)}\n"); - popEnabled(); + includePicturePostRTF(true, df->hasCaption()); } void RTFDocVisitor::visitPre(DocDiaFile *df) { DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocDiaFile)}\n"); - writeDiaFile(df->file()); - - // hide caption since it is not supported at the moment - pushEnabled(); - m_hide=TRUE; + writeDiaFile(df); } -void RTFDocVisitor::visitPost(DocDiaFile *) +void RTFDocVisitor::visitPost(DocDiaFile *df) { DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocDiaFile)}\n"); - popEnabled(); + includePicturePostRTF(true, df->hasCaption()); } void RTFDocVisitor::visitPre(DocLink *lnk) @@ -1662,28 +1692,29 @@ void RTFDocVisitor::popEnabled() delete v; } -void RTFDocVisitor::writeDotFile(const QCString &fileName) +void RTFDocVisitor::writeDotFile(DocDotFile *df) { - QCString baseName=fileName; + writeDotFile(df->file(), df->hasCaption()); +} +void RTFDocVisitor::writeDotFile(const QCString &filename, const bool hasCaption) +{ + QCString baseName=filename; int i; if ((i=baseName.findRev('/'))!=-1) { baseName=baseName.right(baseName.length()-i-1); } QCString outDir = Config_getString("RTF_OUTPUT"); - writeDotGraphFromFile(fileName,outDir,baseName,GOF_BITMAP); - if (!m_lastIsPara) m_t << "\\par" << endl; - m_t << "{" << endl; - m_t << rtf_Style_Reset; - m_t << "\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \""; + writeDotGraphFromFile(filename,outDir,baseName,GOF_BITMAP); QCString imgExt = getDotImageExtension(); - m_t << baseName << "." << imgExt; - m_t << "\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl; - m_t << "}" << endl; - m_lastIsPara=TRUE; + includePicturePreRTF(baseName + "." + imgExt, true, hasCaption); } -void RTFDocVisitor::writeMscFile(const QCString &fileName) +void RTFDocVisitor::writeMscFile(DocMscFile *df) +{ + writeMscFile(df->file(), df->hasCaption()); +} +void RTFDocVisitor::writeMscFile(const QCString &fileName, const bool hasCaption) { QCString baseName=fileName; int i; @@ -1693,37 +1724,23 @@ void RTFDocVisitor::writeMscFile(const QCString &fileName) } QCString outDir = Config_getString("RTF_OUTPUT"); writeMscGraphFromFile(fileName,outDir,baseName,MSC_BITMAP); - if (!m_lastIsPara) m_t << "\\par" << endl; - m_t << "{" << endl; - m_t << rtf_Style_Reset; - m_t << "\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \""; - m_t << baseName << ".png"; - m_t << "\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl; - m_t << "}" << endl; - m_lastIsPara=TRUE; + includePicturePreRTF(baseName + ".png", true, hasCaption); } -void RTFDocVisitor::writeDiaFile(const QCString &fileName) +void RTFDocVisitor::writeDiaFile(DocDiaFile *df) { - QCString baseName=fileName; + QCString baseName=df->file(); int i; if ((i=baseName.findRev('/'))!=-1) { baseName=baseName.right(baseName.length()-i-1); } QCString outDir = Config_getString("RTF_OUTPUT"); - writeDiaGraphFromFile(fileName,outDir,baseName,DIA_BITMAP); - if (!m_lastIsPara) m_t << "\\par" << endl; - m_t << "{" << endl; - m_t << rtf_Style_Reset; - m_t << "\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \""; - m_t << baseName << ".png"; - m_t << "\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl; - m_t << "}" << endl; - m_lastIsPara=TRUE; + writeDiaGraphFromFile(df->file(),outDir,baseName,DIA_BITMAP); + includePicturePreRTF(baseName + ".png", true, df->hasCaption()); } -void RTFDocVisitor::writePlantUMLFile(const QCString &fileName) +void RTFDocVisitor::writePlantUMLFile(const QCString &fileName, const bool hasCaption) { QCString baseName=fileName; int i; @@ -1733,13 +1750,5 @@ void RTFDocVisitor::writePlantUMLFile(const QCString &fileName) } QCString outDir = Config_getString("RTF_OUTPUT"); generatePlantUMLOutput(fileName,outDir,PUML_BITMAP); - if (!m_lastIsPara) m_t << "\\par" << endl; - m_t << "{" << endl; - m_t << rtf_Style_Reset; - m_t << "\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \""; - m_t << baseName << ".png"; - m_t << "\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl; - m_t << "}" << endl; - m_lastIsPara=TRUE; + includePicturePreRTF(baseName + ".png", true, hasCaption); } - diff --git a/src/rtfdocvisitor.h b/src/rtfdocvisitor.h index 0e759c1..1e927e7 100644 --- a/src/rtfdocvisitor.h +++ b/src/rtfdocvisitor.h @@ -152,10 +152,14 @@ class RTFDocVisitor : public DocVisitor void pushEnabled(); void popEnabled(); - void writeDotFile(const QCString &fileName); - void writeMscFile(const QCString &fileName); - void writeDiaFile(const QCString &fileName); - void writePlantUMLFile(const QCString &fileName); + void includePicturePreRTF(const QCString name, const bool isTypeRTF, const bool hasCaption); + void includePicturePostRTF(const bool isTypeRTF, const bool hasCaption); + void writeDotFile(const QCString &fileName, const bool hasCaption); + void writeDotFile(DocDotFile *); + void writeMscFile(const QCString &fileName, const bool hasCaption); + void writeMscFile(DocMscFile *); + void writeDiaFile(DocDiaFile *); + void writePlantUMLFile(const QCString &fileName, const bool hasCaption); //-------------------------------------- // state variables -- cgit v0.12