Orb/Doxygen/src/mangen.cpp
changeset 0 42188c7ea2d9
child 4 468f4c8d3d5b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Orb/Doxygen/src/mangen.cpp	Thu Jan 21 17:29:01 2010 +0000
@@ -0,0 +1,715 @@
+/******************************************************************************
+ *
+ * 
+ *
+ * Copyright (C) 1997-2008 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby 
+ * granted. No representations are made about the suitability of this software 
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+/* http://www.cubic.org/source/archive/fileform/txt/man/ has some
+   nice introductions to groff and man pages. */
+
+#include <stdlib.h>
+
+#include "qtbc.h"
+#include <qdir.h>
+#include "message.h"
+#include "mangen.h"
+#include "config.h"
+#include "util.h"
+#include "doxygen.h"
+#include <string.h>
+#include "docparser.h"
+#include "mandocvisitor.h"
+
+static QCString getExtension()
+{
+  QCString ext = Config_getString("MAN_EXTENSION");
+  if( ext.length() >= 2 &&
+      ext.data()[0] == '.')
+  {
+    ext = ext.mid(1, ext.length()-1);
+  }
+  else
+  {
+    ext = "3"; 
+  }
+  return ext;
+}
+
+ManGenerator::ManGenerator() : OutputGenerator()
+{
+  dir=Config_getString("MAN_OUTPUT")+"/man" + getExtension();
+  firstCol=TRUE;
+  paragraph=FALSE;
+  col=0;
+  upperCase=FALSE;
+  insideTabbing=FALSE;
+  inHeader=FALSE;
+}
+
+ManGenerator::~ManGenerator()
+{
+}
+
+//void ManGenerator::append(const OutputGenerator *g)
+//{
+//  QCString r=g->getContents();
+//  if (upperCase)
+//    t << r.upper();
+//  else
+//    t << r;
+//  if (!r.isEmpty())
+//    firstCol = r.at(r.length()-1)=='\n';
+//  else
+//    firstCol = ((ManGenerator *)g)->firstCol;
+//  col+=((ManGenerator *)g)->col;
+//  inHeader=((ManGenerator *)g)->inHeader;
+//  paragraph=FALSE;
+//}
+
+void ManGenerator::init()
+{
+  QCString ext = getExtension();
+  QCString &manOutput = Config_getString("MAN_OUTPUT");
+  
+  QDir d(manOutput);
+  if (!d.exists() && !d.mkdir(manOutput))
+  {
+    err("Could not create output directory %s\n",manOutput.data());
+    exit(1);
+  }
+  d.setPath(manOutput+"/man"+ext);
+  if (!d.exists() && !d.mkdir(manOutput+"/man"+ext))
+  {
+    err("Could not create output directory %s/man%s\n",manOutput.data(),ext.data());
+    exit(1);
+  }
+  createSubDirs(d);
+}
+
+static QCString buildFileName(const char *name)
+{
+  QCString fileName;
+
+  const char *p=name;
+  char c;
+  while ((c=*p++))
+  {
+    switch (c)
+    {
+      case ':':
+        fileName+="_";
+        if (*p==':') p++;
+        break;
+      case '<':
+      case '>':
+      case '&':
+      case '*':
+      case '!':
+      case '^':
+      case '~':
+      case '%':
+      case '+':
+      case '/':
+        fileName+="_";
+        break;
+      default:
+        fileName+=c;
+    }
+  }
+
+  QCString &manExtension = Config_getString("MAN_EXTENSION");
+  if (convertToQCString(fileName.right(2))!=manExtension) 
+  {
+    fileName+=manExtension;
+  }
+
+  return fileName;
+}
+
+void ManGenerator::startFile(const char *,const char *manName,const char *)
+{
+  startPlainFile( buildFileName( manName ) );
+  firstCol=TRUE;
+}
+
+void ManGenerator::endFile()
+{
+  t << endl;
+  endPlainFile();
+}
+
+void ManGenerator::endTitleHead(const char *,const char *name)
+{
+  t << ".TH \"" << name << "\" " << getExtension() << " \"" 
+    << dateToString(FALSE) << "\" \"";
+  if (!Config_getString("PROJECT_NUMBER").isEmpty())
+    t << "Version " << Config_getString("PROJECT_NUMBER") << "\" \"";
+  if (Config_getString("PROJECT_NAME").isEmpty()) 
+    t << "Doxygen";
+  else
+    t << Config_getString("PROJECT_NAME");
+  t << "\" \\\" -*- nroff -*-" << endl;
+  t << ".ad l" << endl;
+  t << ".nh" << endl;
+  t << ".SH NAME" << endl;
+  t << name << " \\- ";
+  firstCol=FALSE;
+  inHeader=TRUE;
+}
+
+void ManGenerator::newParagraph()
+{
+  if (!paragraph)
+  {
+    if (!firstCol) t << endl;
+    t << ".PP" << endl;
+    firstCol=TRUE;
+  }
+  paragraph=TRUE;
+}
+
+void ManGenerator::startParagraph()
+{
+  if (!paragraph)
+  {
+    if (!firstCol) t << endl;
+    t << ".PP" << endl;
+    firstCol=TRUE;
+  }
+  paragraph=TRUE;
+}
+
+void ManGenerator::endParagraph()
+{
+}
+
+void ManGenerator::writeString(const char *text)
+{
+  docify(text);
+}
+
+void ManGenerator::startIndexItem(const char *,const char *)
+{
+}
+
+void ManGenerator::endIndexItem(const char *,const char *)
+{
+}
+
+void ManGenerator::writeStartAnnoItem(const char *,const char *,
+                                       const char *,const char *)
+{
+}
+
+void ManGenerator::writeObjectLink(const char *,const char *,
+                                    const char *, const char *name)
+{
+  startBold(); docify(name); endBold();
+}
+
+void ManGenerator::writeCodeLink(const char *,const char *,
+                                 const char *, const char *name,
+                                 const char *)
+{
+  docify(name);
+}
+
+void ManGenerator::startHtmlLink(const char *)
+{
+}
+
+void ManGenerator::endHtmlLink()
+{
+}
+
+//void ManGenerator::writeMailLink(const char *url)
+//{
+//  docify(url);
+//}
+
+void ManGenerator::startGroupHeader()
+{
+  if (!firstCol) t << endl;
+  t << ".SH \"";
+  upperCase=TRUE;
+  firstCol=FALSE;
+}
+
+void ManGenerator::endGroupHeader()
+{
+  t << "\"\n.PP " << endl;
+  firstCol=TRUE;
+  paragraph=TRUE;
+  upperCase=FALSE;
+}
+
+void ManGenerator::startMemberHeader()
+{
+  if (!firstCol) t << endl;
+  t << ".SS \"";
+}
+
+void ManGenerator::endMemberHeader()
+{
+  t << "\"\n";
+  firstCol=TRUE;
+  paragraph=FALSE;
+}
+
+void ManGenerator::docify(const char *str)
+{
+  if (str)
+  {
+    const char *p=str;
+    char c=0;
+    while ((c=*p++)) 
+    {
+      switch(c)
+      {
+        case '\\': t << "\\\\"; col++; break;
+        case '\n': t << "\n"; col=0; break;
+        case '\"':  c = '\''; // no break!
+        default: t << c; col++; break;
+      }
+    }
+    firstCol=(c=='\n');
+    //printf("%s",str);fflush(stdout);
+  }
+  paragraph=FALSE;
+}
+
+void ManGenerator::codify(const char *str)
+{
+  //static char spaces[]="        ";
+  if (str)
+  {
+    const char *p=str;
+    char c;
+    int spacesToNextTabStop;
+    while (*p)
+    {
+      c=*p++;
+      switch(c)
+      {
+        case '\t':  spacesToNextTabStop =
+                          Config_getInt("TAB_SIZE") - (col%Config_getInt("TAB_SIZE"));
+                    t << Doxygen::spaces.left(spacesToNextTabStop); 
+                    col+=spacesToNextTabStop; 
+                    break;
+        case '\n':  t << "\n"; firstCol=TRUE; col=0; break;
+        case '\\':  t << "\\"; col++; break;
+        case '\"':  c = '\''; // no break!
+        default:    t << c; firstCol=FALSE; col++; break;
+      }
+    }
+    //printf("%s",str);fflush(stdout);
+  }
+  paragraph=FALSE;
+}
+
+void ManGenerator::writeChar(char c)
+{
+  firstCol=(c=='\n');
+  if (firstCol) col=0; else col++;
+  switch (c)
+  {
+    case '\\': t << "\\\\"; break;
+  case '\"': c = '\''; // no break!
+    default:   t << c; break;
+  }
+  //printf("%c",c);fflush(stdout);
+  paragraph=FALSE;
+}
+
+void ManGenerator::startDescList(SectionTypes)      
+{
+  if (!firstCol) 
+  { t << endl << ".PP" << endl; 
+    firstCol=TRUE; paragraph=TRUE; 
+    col=0;
+  }
+  paragraph=FALSE;
+  startBold();
+}
+
+void ManGenerator::startTitle() 
+{ 
+  if (!firstCol) t << endl; 
+  t << ".SH \""; 
+  firstCol=FALSE;
+  paragraph=FALSE;
+}
+
+void ManGenerator::endTitle()
+{
+    t << "\"";
+}
+
+void ManGenerator::startItemListItem() 
+{ 
+  if (!firstCol) t << endl; 
+  t << ".TP" << endl; 
+  firstCol=TRUE;
+  paragraph=FALSE;
+  col=0;
+} 
+
+void ManGenerator::endItemListItem()
+{
+}
+
+void ManGenerator::startCodeFragment() 
+{ 
+  newParagraph();
+  t << ".nf" << endl; 
+  firstCol=TRUE;
+  paragraph=FALSE;
+}
+
+void ManGenerator::endCodeFragment()   
+{ 
+  if (!firstCol) t << endl;
+  t << ".fi" << endl; 
+  firstCol=TRUE;
+  paragraph=FALSE;
+  col=0;
+}
+
+void ManGenerator::startMemberDoc(const char *,const char *,const char *,const char *) 
+{ 
+  if (!firstCol) t << endl;
+  t << ".SS \""; 
+  firstCol=FALSE;
+  paragraph=FALSE;
+}
+
+void ManGenerator::startDoxyAnchor(const char *,const char *manName,
+                                   const char *, const char *name,
+                                   const char *)
+{
+    // something to be done?
+    if( !Config_getBool("MAN_LINKS") ) 
+    {
+	return; // no
+    }
+
+    // the name of the link file is derived from the name of the anchor:
+    // - truncate after an (optional) ::
+    QCString baseName = name;
+    int i=baseName.findRev(':');
+    if (i!=-1) baseName=baseName.right(baseName.length()-i-1);
+    
+    // - remove dangerous characters and append suffix, then add dir prefix
+    QCString fileName=dir+"/"+buildFileName( baseName );
+    QFile linkfile( fileName );
+    // - only create file if it doesn't exist already
+    if ( !linkfile.open( IO_ReadOnly ) ) 
+    {
+	if ( linkfile.open( IO_WriteOnly ) ) 
+        {
+	      QTextStream linkstream;
+	      linkstream.setDevice(&linkfile);
+	      linkstream.setEncoding(QTextStream::UnicodeUTF8);
+	      linkstream << ".so man" << getExtension() << "/" << buildFileName( manName ) << endl;
+	}
+    }
+    linkfile.close();
+}
+
+void ManGenerator::endMemberDoc(bool)
+{
+    t << "\"";
+}
+
+void ManGenerator::startSubsection()    
+{ 
+  if (!firstCol) t << endl;
+  t << ".SS \""; 
+  firstCol=FALSE;
+  paragraph=FALSE;
+}
+
+void ManGenerator::endSubsection()
+{
+  t << "\"";
+}
+
+
+void ManGenerator::startSubsubsection() 
+{ 
+  if (!firstCol) t << endl;
+  t << "\n.SS \""; 
+  firstCol=FALSE;
+  paragraph=FALSE;
+}
+
+void ManGenerator::endSubsubsection()
+{
+  t << "\"";
+}
+
+void ManGenerator::writeSynopsis()      
+{ 
+  if (!firstCol) t << endl;
+  t << ".SH SYNOPSIS\n.br\n.PP\n"; 
+  firstCol=TRUE;
+  paragraph=FALSE;
+}
+
+void ManGenerator::startDescItem()
+{
+  if (!firstCol) t << endl;
+  t << ".IP \"";
+  firstCol=FALSE;
+}
+
+//void ManGenerator::endDescTitle()
+//{
+//  endBold();
+//  paragraph=TRUE;
+//}
+
+void ManGenerator::startDescForItem()
+{
+  if (!firstCol) t << endl;
+  if (!paragraph) t << ".in -1c" << endl;
+  t << ".in +1c" << endl;
+  firstCol=TRUE;
+  paragraph=FALSE;
+  col=0;
+}
+
+void ManGenerator::endDescForItem()
+{
+}
+
+void ManGenerator::endDescItem()
+{
+  t << "\" 1c" << endl;
+  firstCol=TRUE;
+}
+
+void ManGenerator::startAnonTypeScope(int indentLevel)
+{
+  if (indentLevel==0)
+  {
+    insideTabbing=TRUE;
+  }
+}
+
+void ManGenerator::endAnonTypeScope(int indentLevel)
+{
+  if (indentLevel==0)
+  {
+    insideTabbing=FALSE;
+  }
+}
+
+
+void ManGenerator::startMemberItem(int) 
+{ 
+  if (firstCol && !insideTabbing) t << ".in +1c\n";
+  t << "\n.ti -1c\n.RI \""; 
+  firstCol=FALSE;
+}
+
+void ManGenerator::endMemberItem() 
+{ 
+  t << "\"\n.br"; 
+}
+
+void ManGenerator::startMemberList() 
+{ 
+  if (!insideTabbing)
+  {
+    t << "\n.in +1c"; firstCol=FALSE; 
+  }
+}
+
+void ManGenerator::endMemberList() 
+{ 
+  if (!insideTabbing)
+  {
+    t << "\n.in -1c"; firstCol=FALSE; 
+  }
+}
+
+void ManGenerator::startMemberGroupHeader(bool)
+{
+  t << "\n.PP\n.RI \"\\fB";
+}
+
+void ManGenerator::endMemberGroupHeader()
+{
+  t << "\\fP\"\n.br\n";
+  firstCol=TRUE;
+}
+
+void ManGenerator::startMemberGroupDocs()
+{
+}
+
+void ManGenerator::endMemberGroupDocs()
+{
+  t << "\n.PP";
+}
+
+void ManGenerator::startMemberGroup()
+{
+  t << "\n.in +1c";
+}
+
+void ManGenerator::endMemberGroup(bool)
+{
+  t << "\n.in -1c";
+  firstCol=FALSE;
+}
+
+void ManGenerator::startSection(const char *,const char *,SectionInfo::SectionType type)
+{
+  if( !inHeader ) 
+  {
+    switch(type)
+    {
+      case SectionInfo::Page:          startGroupHeader(); break;
+      case SectionInfo::Section:       startGroupHeader(); break;
+      case SectionInfo::Subsection:    startMemberHeader(); break;
+      case SectionInfo::Subsubsection: startMemberHeader(); break;
+      case SectionInfo::Paragraph:     startMemberHeader(); break;
+      default: ASSERT(0); break;
+    }
+  }
+}
+
+void ManGenerator::endSection(const char *,SectionInfo::SectionType type)
+{
+  if( !inHeader )
+  {
+    switch(type)
+    {
+      case SectionInfo::Page:          endGroupHeader(); break;
+      case SectionInfo::Section:       endGroupHeader(); break;
+      case SectionInfo::Subsection:    endMemberHeader(); break;
+      case SectionInfo::Subsubsection: endMemberHeader(); break;
+      case SectionInfo::Paragraph:     endMemberHeader(); break;
+      default: ASSERT(0); break;
+    }
+  }
+  else
+  {
+    t << "\n";
+    firstCol=TRUE;
+    paragraph=FALSE;
+    inHeader=FALSE;
+  }
+}
+
+void ManGenerator::startSimpleSect(SectionTypes,const char *,
+                                   const char *,const char *title)
+{
+  if (!firstCol) 
+  { t << endl << ".PP" << endl; 
+    firstCol=TRUE; paragraph=TRUE; 
+    col=0;
+  }
+  paragraph=FALSE;
+  startBold();
+  docify(title);
+  endBold();
+  paragraph=TRUE;
+}
+
+void ManGenerator::endSimpleSect()
+{
+}
+
+void ManGenerator::startParamList(ParamListTypes,const char *title)
+{
+  if (!firstCol) 
+  { t << endl << ".PP" << endl; 
+    firstCol=TRUE; paragraph=TRUE; 
+    col=0;
+  }
+  paragraph=FALSE;
+  startBold();
+  docify(title);
+  endBold();
+  paragraph=TRUE;
+}
+
+void ManGenerator::endParamList()
+{
+}
+
+void ManGenerator::printDoc(DocNode *n,const char *langExt)
+{
+  ManDocVisitor *visitor = new ManDocVisitor(t,*this,langExt);
+  n->accept(visitor);
+  delete visitor; 
+  firstCol=FALSE;
+  paragraph = FALSE;
+}
+
+void ManGenerator::startConstraintList(const char *header)
+{
+  if (!firstCol) 
+  { t << endl << ".PP" << endl; 
+    firstCol=TRUE; paragraph=TRUE; 
+    col=0;
+  }
+  paragraph=FALSE;
+  startBold();
+  docify(header);
+  endBold();
+  paragraph=TRUE;
+}
+
+void ManGenerator::startConstraintParam()
+{
+  startItemListItem();
+  startEmphasis();
+}
+
+void ManGenerator::endConstraintParam()
+{
+  endEmphasis();
+  endItemListItem();
+  t << " : ";
+}
+
+void ManGenerator::startConstraintType()
+{
+  startEmphasis();
+}
+
+void ManGenerator::endConstraintType()
+{
+  endEmphasis();
+}
+
+void ManGenerator::startConstraintDocs()
+{
+}
+
+void ManGenerator::endConstraintDocs()
+{
+  t << endl; firstCol=TRUE;
+}
+
+void ManGenerator::endConstraintList()
+{
+}
+
+
+