diff options
author | Dimitri van Heesch <dimitri@stack.nl> | 2002-10-30 20:57:53 (GMT) |
---|---|---|
committer | Dimitri van Heesch <dimitri@stack.nl> | 2002-10-30 20:57:53 (GMT) |
commit | afc47efd97b995277e5635107b00001fc025cdff (patch) | |
tree | dd06bd100b0bd88b6ee40c8464efac800a749c32 /src/perlmodgen.cpp | |
parent | dc404b516e366ca10ad325d399ef0bd47d065863 (diff) | |
download | Doxygen-afc47efd97b995277e5635107b00001fc025cdff.zip Doxygen-afc47efd97b995277e5635107b00001fc025cdff.tar.gz Doxygen-afc47efd97b995277e5635107b00001fc025cdff.tar.bz2 |
Release-1.2.18-20021030
Diffstat (limited to 'src/perlmodgen.cpp')
-rw-r--r-- | src/perlmodgen.cpp | 928 |
1 files changed, 796 insertions, 132 deletions
diff --git a/src/perlmodgen.cpp b/src/perlmodgen.cpp index 377488b..596aa0b 100644 --- a/src/perlmodgen.cpp +++ b/src/perlmodgen.cpp @@ -102,9 +102,11 @@ class PerlModOutput { public: - PerlModOutput(PerlModOutputStream *os) : m_stream(os), m_indentation(0) { m_spaces[0] = 0; } + PerlModOutput() : m_stream(0), m_indentation(0) { m_spaces[0] = 0; } virtual ~PerlModOutput() { } + inline void setPerlModOutputStream(PerlModOutputStream *os) { m_stream = os; } + inline PerlModOutput &openSave() { iopenSave(); return *this; } inline PerlModOutput &closeSave(QString &s) { icloseSave(s); return *this; } @@ -479,8 +481,9 @@ void PerlModDocVisitor::visit(DocSymbol *sy) case DocSymbol::BSlash: s = "\\\\"; break; case DocSymbol::Copy: s = "(c)"; break; case DocSymbol::Apos: s = "\\\'"; break; - default: + case DocSymbol::Unknown: err("Error: unknown symbol found\n"); + break; } enterText(); if (c != 0) @@ -509,8 +512,6 @@ void PerlModDocVisitor::visit(DocStyleChange *s) case DocStyleChange::Superscript: break; // superscript case DocStyleChange::Center: break; // center case DocStyleChange::Small: break; // small - default: - err("Error: unknown style found.\n"); } } @@ -618,7 +619,7 @@ void PerlModDocVisitor::visitPre(DocAutoList *l) openItem(l->isEnumList() ? "ordered_list" : "itemized_list"); openSubBlock("content"); } -void PerlModDocVisitor::visitPost(DocAutoList *) { closeSubBlock(); } +void PerlModDocVisitor::visitPost(DocAutoList *) { closeSubBlock(); closeItem(); } void PerlModDocVisitor::visitPre(DocAutoListItem *) { openSubBlock(); } void PerlModDocVisitor::visitPost(DocAutoListItem *) { closeSubBlock(); } @@ -644,7 +645,7 @@ void PerlModDocVisitor::visitPost(DocRoot *) void PerlModDocVisitor::visitPre(DocSimpleSect *s) { leaveText(); - const char *type; + const char *type = 0; switch (s->type()) { case DocSimpleSect::See: type = "see"; break; @@ -662,7 +663,9 @@ void PerlModDocVisitor::visitPre(DocSimpleSect *s) case DocSimpleSect::Remark: type = "remark"; break; case DocSimpleSect::Attention: type = "attention"; break; case DocSimpleSect::User: type = "par"; break; - default: type = "illegal"; break; + case DocSimpleSect::Unknown: + err("Error: unknown simple section found\n"); + break; } m_output.openSave().openList(type); } @@ -995,7 +998,9 @@ void PerlModDocVisitor::visitPre(DocParamSect *s) case DocParamSect::Param: type = "params"; break; case DocParamSect::RetVal: type = "retvals"; break; case DocParamSect::Exception: type = "exceptions"; break; - default: ASSERT(0); + case DocParamSect::Unknown: + err("Error: unknown parameter section found\n"); + break; } m_output.openSave().openList(type); } @@ -1103,13 +1108,15 @@ static void addTemplateArgumentList(ArgumentList *al,PerlModOutput &output,const output.closeList(); } -//static void addMemberTemplateLists(MemberDef *md,PerlModOutput &output) -//{ -// ClassDef *cd = md->getClassDef(); -// const char *cname = cd ? cd->name().data() : 0; -// if (md->templateArguments()) // function template prefix -// addTemplateArgumentList(md->templateArguments(),output,cname); -//} +#if 0 +static void addMemberTemplateLists(MemberDef *md,PerlModOutput &output) +{ + ClassDef *cd = md->getClassDef(); + const char *cname = cd ? cd->name().data() : 0; + if (md->templateArguments()) // function template prefix + addTemplateArgumentList(md->templateArguments(),output,cname); +} +#endif static void addTemplateList(ClassDef *cd,PerlModOutput &output) { @@ -1161,7 +1168,59 @@ static const char *getVirtualnessName(Specifier virt) return 0; } -static void generatePerlModForMember(MemberDef *md,PerlModOutput &output,Definition *) +static QString pathDoxyfile; +static QString pathDoxyExec; + +void setPerlModDoxyfile(const QString &qs) +{ + pathDoxyfile = qs; + pathDoxyExec = QDir::currentDirPath(); +} + +class PerlModGenerator +{ +public: + + PerlModOutput output; + + QString pathDoxyModelPM; + QString pathDoxyDocsTex; + QString pathDoxyFormatTex; + QString pathDoxyLatexTex; + QString pathDoxyLatexDVI; + QString pathDoxyLatexPDF; + QString pathDoxyTemplateTex; + QString pathDoxyDocsPM; + QString pathDoxyLatexPL; + QString pathDoxyLatexTemplatePL; + QString pathDoxyRules; + QString pathMakefile; + + void generatePerlModForMember(MemberDef *md,Definition *); + void generatePerlModSection(Definition *d, + MemberList *ml,const char *name,const char *header=0); + void addListOfAllMembers(ClassDef *cd, PerlModOutput &output); + void generatePerlModForClass(ClassDef *cd, PerlModOutput &output); + void generatePerlModForNamespace(NamespaceDef *nd, PerlModOutput &output); + void generatePerlModForFile(FileDef *fd, PerlModOutput &output); + void generatePerlModForGroup(GroupDef *gd, PerlModOutput &output); + void generatePerlModForPage(PageInfo *pi, PerlModOutput &output); + + bool createOutputFile(QFile &f, const char *s); + bool createOutputDir(QDir &perlModDir); + bool generateDoxyLatexTex(); + bool generateDoxyFormatTex(); + bool generateDoxyModelPM(); + bool generateDoxyLatexPL(); + bool generateDoxyLatexTemplatePL(); + bool generateDoxyRules(); + bool generateMakefile(); + bool generatePerlModOutput(); + + void generate(); +}; + +void PerlModGenerator::generatePerlModForMember(MemberDef *md,Definition *) { // + declaration/definition arg lists @@ -1184,7 +1243,6 @@ static void generatePerlModForMember(MemberDef *md,PerlModOutput &output,Definit case MemberDef::Define: memType="define"; break; case MemberDef::EnumValue: ASSERT(0); break; case MemberDef::Property: memType="property"; break; - case MemberDef::Event: memType="event"; break; case MemberDef::Variable: memType="variable"; break; case MemberDef::Typedef: memType="typedef"; break; case MemberDef::Enumeration: memType="enum"; break; @@ -1194,6 +1252,7 @@ static void generatePerlModForMember(MemberDef *md,PerlModOutput &output,Definit case MemberDef::Friend: memType="friend"; isFunc=TRUE; break; case MemberDef::DCOP: memType="dcop"; isFunc=TRUE; break; case MemberDef::Slot: memType="slot"; isFunc=TRUE; break; + case MemberDef::Event: memType="event"; break; } QCString scopeName; @@ -1324,8 +1383,8 @@ static void generatePerlModForMember(MemberDef *md,PerlModOutput &output,Definit output.closeHash(); } -static void generatePerlModSection(Definition *d,PerlModOutput &output, - MemberList *ml,const char *name,const char *header=0) +void PerlModGenerator::generatePerlModSection(Definition *d, + MemberList *ml,const char *name,const char *header) { if (ml->count()==0) return; // empty list @@ -1339,13 +1398,13 @@ static void generatePerlModSection(Definition *d,PerlModOutput &output, MemberDef *md; for (mli.toFirst();(md=mli.current());++mli) { - generatePerlModForMember(md,output,d); + generatePerlModForMember(md,d); } output.closeList() .closeHash(); } -static void addListOfAllMembers(ClassDef *cd, PerlModOutput &output) +void PerlModGenerator::addListOfAllMembers(ClassDef *cd, PerlModOutput &output) { output.openList("all_members"); MemberNameInfoSDict::Iterator mnii(*cd->memberNameInfoSDict()); @@ -1376,7 +1435,7 @@ static void addListOfAllMembers(ClassDef *cd, PerlModOutput &output) output.closeList(); } -static void generatePerlModForClass(ClassDef *cd, PerlModOutput &output) +void PerlModGenerator::generatePerlModForClass(ClassDef *cd, PerlModOutput &output) { // + brief description // + detailed description @@ -1465,31 +1524,31 @@ static void generatePerlModForClass(ClassDef *cd, PerlModOutput &output) MemberGroupSDict::Iterator mgli(*cd->memberGroupSDict); MemberGroup *mg; for (;(mg=mgli.current());++mgli) - generatePerlModSection(cd,output,mg->members(),"user_defined",mg->header()); - - generatePerlModSection(cd,output,&cd->pubTypes,"public_typedefs"); - generatePerlModSection(cd,output,&cd->pubMethods,"public_methods"); - generatePerlModSection(cd,output,&cd->pubAttribs,"public_members"); - generatePerlModSection(cd,output,&cd->pubSlots,"public_slots"); - generatePerlModSection(cd,output,&cd->signals,"signals"); - generatePerlModSection(cd,output,&cd->dcopMethods,"dcop_methods"); - generatePerlModSection(cd,output,&cd->properties,"properties"); - generatePerlModSection(cd,output,&cd->pubStaticMethods,"public_static_methods"); - generatePerlModSection(cd,output,&cd->pubStaticAttribs,"public_static_members"); - generatePerlModSection(cd,output,&cd->proTypes,"protected_typedefs"); - generatePerlModSection(cd,output,&cd->proMethods,"protected_methods"); - generatePerlModSection(cd,output,&cd->proAttribs,"protected_members"); - generatePerlModSection(cd,output,&cd->proSlots,"protected_slots"); - generatePerlModSection(cd,output,&cd->proStaticMethods,"protected_static_methods"); - generatePerlModSection(cd,output,&cd->proStaticAttribs,"protected_static_members"); - generatePerlModSection(cd,output,&cd->priTypes,"private_typedefs"); - generatePerlModSection(cd,output,&cd->priMethods,"private_methods"); - generatePerlModSection(cd,output,&cd->priAttribs,"private_members"); - generatePerlModSection(cd,output,&cd->priSlots,"private_slots"); - generatePerlModSection(cd,output,&cd->priStaticMethods,"private_static_methods"); - generatePerlModSection(cd,output,&cd->priStaticAttribs,"private_static_members"); - generatePerlModSection(cd,output,&cd->friends,"friend_methods"); - generatePerlModSection(cd,output,&cd->related,"related_methods"); + generatePerlModSection(cd,mg->members(),"user_defined",mg->header()); + + generatePerlModSection(cd,&cd->pubTypes,"public_typedefs"); + generatePerlModSection(cd,&cd->pubMethods,"public_methods"); + generatePerlModSection(cd,&cd->pubAttribs,"public_members"); + generatePerlModSection(cd,&cd->pubSlots,"public_slots"); + generatePerlModSection(cd,&cd->signals,"signals"); + generatePerlModSection(cd,&cd->dcopMethods,"dcop_methods"); + generatePerlModSection(cd,&cd->properties,"properties"); + generatePerlModSection(cd,&cd->pubStaticMethods,"public_static_methods"); + generatePerlModSection(cd,&cd->pubStaticAttribs,"public_static_members"); + generatePerlModSection(cd,&cd->proTypes,"protected_typedefs"); + generatePerlModSection(cd,&cd->proMethods,"protected_methods"); + generatePerlModSection(cd,&cd->proAttribs,"protected_members"); + generatePerlModSection(cd,&cd->proSlots,"protected_slots"); + generatePerlModSection(cd,&cd->proStaticMethods,"protected_static_methods"); + generatePerlModSection(cd,&cd->proStaticAttribs,"protected_static_members"); + generatePerlModSection(cd,&cd->priTypes,"private_typedefs"); + generatePerlModSection(cd,&cd->priMethods,"private_methods"); + generatePerlModSection(cd,&cd->priAttribs,"private_members"); + generatePerlModSection(cd,&cd->priSlots,"private_slots"); + generatePerlModSection(cd,&cd->priStaticMethods,"private_static_methods"); + generatePerlModSection(cd,&cd->priStaticAttribs,"private_static_members"); + generatePerlModSection(cd,&cd->friends,"friend_methods"); + generatePerlModSection(cd,&cd->related,"related_methods"); addPerlModDocBlock(output,"brief",cd->getDefFileName(),cd->getDefLine(),cd->name(),0,cd->briefDescription()); addPerlModDocBlock(output,"detailed",cd->getDefFileName(),cd->getDefLine(),cd->name(),0,cd->documentation()); @@ -1523,7 +1582,7 @@ static void generatePerlModForClass(ClassDef *cd, PerlModOutput &output) output.closeHash(); } -static void generatePerlModForNamespace(NamespaceDef *nd, PerlModOutput &output) +void PerlModGenerator::generatePerlModForNamespace(NamespaceDef *nd, PerlModOutput &output) { // + contained class definitions // + contained namespace definitions @@ -1568,14 +1627,14 @@ static void generatePerlModForNamespace(NamespaceDef *nd, PerlModOutput &output) MemberGroupSDict::Iterator mgli(*nd->memberGroupSDict); MemberGroup *mg; for (;(mg=mgli.current());++mgli) - generatePerlModSection(nd,output,mg->members(),"user-defined",mg->header()); + generatePerlModSection(nd,mg->members(),"user-defined",mg->header()); - generatePerlModSection(nd,output,&nd->decDefineMembers,"defines"); - generatePerlModSection(nd,output,&nd->decProtoMembers,"prototypes"); - generatePerlModSection(nd,output,&nd->decTypedefMembers,"typedefs"); - generatePerlModSection(nd,output,&nd->decEnumMembers,"enums"); - generatePerlModSection(nd,output,&nd->decFuncMembers,"functions"); - generatePerlModSection(nd,output,&nd->decVarMembers,"variables"); + generatePerlModSection(nd,&nd->decDefineMembers,"defines"); + generatePerlModSection(nd,&nd->decProtoMembers,"prototypes"); + generatePerlModSection(nd,&nd->decTypedefMembers,"typedefs"); + generatePerlModSection(nd,&nd->decEnumMembers,"enums"); + generatePerlModSection(nd,&nd->decFuncMembers,"functions"); + generatePerlModSection(nd,&nd->decVarMembers,"variables"); addPerlModDocBlock(output,"brief",nd->getDefFileName(),nd->getDefLine(),0,0,nd->briefDescription()); addPerlModDocBlock(output,"detailed",nd->getDefFileName(),nd->getDefLine(),0,0,nd->documentation()); @@ -1583,7 +1642,7 @@ static void generatePerlModForNamespace(NamespaceDef *nd, PerlModOutput &output) output.closeHash(); } -static void generatePerlModForFile(FileDef *fd, PerlModOutput &output) +void PerlModGenerator::generatePerlModForFile(FileDef *fd, PerlModOutput &output) { // + includes files // + includedby files @@ -1633,12 +1692,12 @@ static void generatePerlModForFile(FileDef *fd, PerlModOutput &output) } output.closeList(); - generatePerlModSection(fd,output,&fd->decDefineMembers,"defines"); - generatePerlModSection(fd,output,&fd->decProtoMembers,"prototypes"); - generatePerlModSection(fd,output,&fd->decTypedefMembers,"typedefs"); - generatePerlModSection(fd,output,&fd->decEnumMembers,"enums"); - generatePerlModSection(fd,output,&fd->decFuncMembers,"functions"); - generatePerlModSection(fd,output,&fd->decVarMembers,"variables"); + generatePerlModSection(fd,&fd->decDefineMembers,"defines"); + generatePerlModSection(fd,&fd->decProtoMembers,"prototypes"); + generatePerlModSection(fd,&fd->decTypedefMembers,"typedefs"); + generatePerlModSection(fd,&fd->decEnumMembers,"enums"); + generatePerlModSection(fd,&fd->decFuncMembers,"functions"); + generatePerlModSection(fd,&fd->decVarMembers,"variables"); addPerlModDocBlock(output,"brief",fd->getDefFileName(),fd->getDefLine(),0,0,fd->briefDescription()); addPerlModDocBlock(output,"detailed",fd->getDefFileName(),fd->getDefLine(),0,0,fd->documentation()); @@ -1646,7 +1705,7 @@ static void generatePerlModForFile(FileDef *fd, PerlModOutput &output) output.closeHash(); } -static void generatePerlModForGroup(GroupDef *gd, PerlModOutput &output) +void PerlModGenerator::generatePerlModForGroup(GroupDef *gd, PerlModOutput &output) { // + members // + member groups @@ -1734,14 +1793,14 @@ static void generatePerlModForGroup(GroupDef *gd, PerlModOutput &output) MemberGroupSDict::Iterator mgli(*gd->memberGroupSDict); MemberGroup *mg; for (;(mg=mgli.current());++mgli) - generatePerlModSection(gd,output,mg->members(),"user-defined",mg->header()); + generatePerlModSection(gd,mg->members(),"user-defined",mg->header()); - generatePerlModSection(gd,output,&gd->decDefineMembers,"defines"); - generatePerlModSection(gd,output,&gd->decProtoMembers,"prototypes"); - generatePerlModSection(gd,output,&gd->decTypedefMembers,"typedefs"); - generatePerlModSection(gd,output,&gd->decEnumMembers,"enums"); - generatePerlModSection(gd,output,&gd->decFuncMembers,"functions"); - generatePerlModSection(gd,output,&gd->decVarMembers,"variables"); + generatePerlModSection(gd,&gd->decDefineMembers,"defines"); + generatePerlModSection(gd,&gd->decProtoMembers,"prototypes"); + generatePerlModSection(gd,&gd->decTypedefMembers,"typedefs"); + generatePerlModSection(gd,&gd->decEnumMembers,"enums"); + generatePerlModSection(gd,&gd->decFuncMembers,"functions"); + generatePerlModSection(gd,&gd->decVarMembers,"variables"); addPerlModDocBlock(output,"brief",gd->getDefFileName(),gd->getDefLine(),0,0,gd->briefDescription()); addPerlModDocBlock(output,"detailed",gd->getDefFileName(),gd->getDefLine(),0,0,gd->documentation()); @@ -1749,7 +1808,7 @@ static void generatePerlModForGroup(GroupDef *gd, PerlModOutput &output) output.closeHash(); } -static void generatePerlModForPage(PageInfo *pi, PerlModOutput &output) +void PerlModGenerator::generatePerlModForPage(PageInfo *pi, PerlModOutput &output) { // + name // + title @@ -1767,16 +1826,76 @@ static void generatePerlModForPage(PageInfo *pi, PerlModOutput &output) addPerlModDocBlock(output,"detailed",pi->defFileName,pi->defLine,0,0,pi->doc); } -void generatePerlMod() +bool PerlModGenerator::generatePerlModOutput() { - // + classes - // + namespaces - // + files - // - packages - // + groups - // + related pages - // - examples + QFile outputFile; + if (!createOutputFile(outputFile, pathDoxyDocsPM)) + return false; + + QTextStream outputTextStream(&outputFile); + PerlModOutputStream outputStream(&outputTextStream); + output.setPerlModOutputStream(&outputStream); + output.add("$doxydocs =\n").openHash(); + + output.openList("classes"); + ClassSDict::Iterator cli(Doxygen::classSDict); + ClassDef *cd; + for (cli.toFirst();(cd=cli.current());++cli) + generatePerlModForClass(cd,output); + output.closeList(); + + output.openList("namespaces"); + NamespaceSDict::Iterator nli(Doxygen::namespaceSDict); + NamespaceDef *nd; + for (nli.toFirst();(nd=nli.current());++nli) + generatePerlModForNamespace(nd,output); + output.closeList(); + + output.openList("files"); + FileNameListIterator fnli(Doxygen::inputNameList); + FileName *fn; + for (;(fn=fnli.current());++fnli) + { + FileNameIterator fni(*fn); + FileDef *fd; + for (;(fd=fni.current());++fni) + generatePerlModForFile(fd,output); + } + output.closeList(); + + output.openList("groups"); + GroupSDict::Iterator gli(Doxygen::groupSDict); + GroupDef *gd; + for (;(gd=gli.current());++gli) + generatePerlModForGroup(gd,output); + output.closeList(); + + output.openList("pages"); + PageSDict::Iterator pdi(*Doxygen::pageSDict); + PageInfo *pi=0; + for (pdi.toFirst();(pi=pdi.current());++pdi) + generatePerlModForPage(pi,output); + if (Doxygen::mainPage) + generatePerlModForPage(Doxygen::mainPage,output); + output.closeList(); + + output.closeHash().add(";\n1;\n"); + return true; +} + +bool PerlModGenerator::createOutputFile(QFile &f, const char *s) +{ + f.setName(s); + if (!f.open(IO_WriteOnly)) + { + err("Cannot open file %s for writing!\n", s); + return false; + } + return true; +} +bool PerlModGenerator::createOutputDir(QDir &perlModDir) +{ QCString outputDirectory = Config_getString("OUTPUT_DIRECTORY"); if (outputDirectory.isEmpty()) { @@ -1811,75 +1930,620 @@ void generatePerlMod() if (!dir.mkdir(outputDirectory)) { err("Cannot create directory %s\n",outputDirectory.data()); - return; + return false; } } - QDir perlmodDir(outputDirectory+"/perlmod"); - if (!perlmodDir.exists() && !perlmodDir.mkdir(outputDirectory+"/perlmod")) + perlModDir.setPath(outputDirectory+"/perlmod"); + if (!perlModDir.exists() && !perlModDir.mkdir(outputDirectory+"/perlmod")) { err("Could not create perlmod directory in %s\n",outputDirectory.data()); - return; + return false; + } + return true; +} + +bool PerlModGenerator::generateDoxyModelPM() +{ + QFile doxyModelPM; + if (!createOutputFile(doxyModelPM, pathDoxyModelPM)) + return false; + + QTextStream doxyModelPMStream(&doxyModelPM); + doxyModelPMStream << + "sub memberlist($) {\n" + " my $prefix = $_[0];\n" + " return\n" + "\t[ \"hash\", $prefix . \"s\",\n" + "\t {\n" + "\t members =>\n" + "\t [ \"list\", $prefix . \"List\",\n" + "\t\t[ \"hash\", $prefix,\n" + "\t\t {\n" + "\t\t kind => [ \"string\", $prefix . \"Kind\" ],\n" + "\t\t name => [ \"string\", $prefix . \"Name\" ],\n" + "\t\t static => [ \"string\", $prefix . \"Static\" ],\n" + "\t\t virtualness => [ \"string\", $prefix . \"Virtualness\" ],\n" + "\t\t protection => [ \"string\", $prefix . \"Protection\" ],\n" + "\t\t type => [ \"string\", $prefix . \"Type\" ],\n" + "\t\t parameters =>\n" + "\t\t [ \"list\", $prefix . \"Params\",\n" + "\t\t\t[ \"hash\", $prefix . \"Param\",\n" + "\t\t\t {\n" + "\t\t\t declaration_name => [ \"string\", $prefix . \"ParamName\" ],\n" + "\t\t\t type => [ \"string\", $prefix . \"ParamType\" ],\n" + "\t\t\t },\n" + "\t\t\t],\n" + "\t\t ],\n" + "\t\t detailed =>\n" + "\t\t [ \"hash\", $prefix . \"Detailed\",\n" + "\t\t\t{\n" + "\t\t\t doc => [ \"doc\", $prefix . \"DetailedDoc\" ],\n" + "\t\t\t return => [ \"doc\", $prefix . \"Return\" ],\n" + "\t\t\t see => [ \"doc\", $prefix . \"See\" ],\n" + "\t\t\t params =>\n" + "\t\t\t [ \"list\", $prefix . \"PDBlocks\",\n" + "\t\t\t [ \"hash\", $prefix . \"PDBlock\",\n" + "\t\t\t\t{\n" + "\t\t\t\t parameters =>\n" + "\t\t\t\t [ \"list\", $prefix . \"PDParams\",\n" + "\t\t\t\t [ \"hash\", $prefix . \"PDParam\",\n" + "\t\t\t\t\t{\n" + "\t\t\t\t\t name => [ \"string\", $prefix . \"PDParamName\" ],\n" + "\t\t\t\t\t},\n" + "\t\t\t\t ],\n" + "\t\t\t\t ],\n" + "\t\t\t\t doc => [ \"doc\", $prefix . \"PDDoc\" ],\n" + "\t\t\t\t},\n" + "\t\t\t ],\n" + "\t\t\t ],\n" + "\t\t\t},\n" + "\t\t ],\n" + "\t\t },\n" + "\t\t],\n" + "\t ],\n" + "\t },\n" + "\t];\n" + "}\n" + "\n" + "$doxymodel =\n" + " [ \"hash\", \"Root\",\n" + " {\n" + "\tfiles =>\n" + "\t [ \"list\", \"Files\",\n" + "\t [ \"hash\", \"File\",\n" + "\t {\n" + "\t\tname => [ \"string\", \"FileName\" ],\n" + "\t\ttypedefs => memberlist(\"FileTypedef\"),\n" + "\t\tvariables => memberlist(\"FileVariable\"),\n" + "\t\tfunctions => memberlist(\"FileFunction\"),\n" + "\t\tdetailed =>\n" + "\t\t [ \"hash\", \"FileDetailed\",\n" + "\t\t {\n" + "\t\t doc => [ \"doc\", \"FileDetailedDoc\" ],\n" + "\t\t },\n" + "\t\t ],\n" + "\t },\n" + "\t ],\n" + "\t ],\n" + "\tclasses =>\n" + "\t [ \"list\", \"Classes\",\n" + "\t [ \"hash\", \"Class\",\n" + "\t {\n" + "\t\tname => [ \"string\", \"ClassName\" ],\n" + "\t\tpublic_typedefs => memberlist(\"ClassPublicTypedef\"),\n" + "\t\tpublic_methods => memberlist(\"ClassPublicMethod\"),\n" + "\t\tpublic_members => memberlist(\"ClassPublicMember\"),\n" + "\t\tprotected_typedefs => memberlist(\"ClassProtectedTypedef\"),\n" + "\t\tprotected_methods => memberlist(\"ClassProtectedMethod\"),\n" + "\t\tprotected_members => memberlist(\"ClassProtectedMember\"),\n" + "\t\tprivate_typedefs => memberlist(\"ClassPrivateTypedef\"),\n" + "\t\tprivate_methods => memberlist(\"ClassPrivateMethod\"),\n" + "\t\tprivate_members => memberlist(\"ClassPrivateMember\"),\n" + "\t\tdetailed =>\n" + "\t\t [ \"hash\", \"ClassDetailed\",\n" + "\t\t {\n" + "\t\t doc => [ \"doc\", \"ClassDetailedDoc\" ],\n" + " \t\t },\n" + "\t\t ],\n" + "\t },\n" + "\t ],\n" + "\t ],\n" + " },\n" + " ];\n" + "\n" + "1;\n"; + + return true; +} + +bool PerlModGenerator::generateDoxyRules() +{ + QFile doxyRules; + if (!createOutputFile(doxyRules, pathDoxyRules)) + return false; + + bool perlmodLatex = Config_getBool("PERLMOD_LATEX"); + + QTextStream doxyRulesStream(&doxyRules); + doxyRulesStream << + "DOXYEXECPATH = " << pathDoxyExec << "\n" + "DOXYFILE = " << pathDoxyfile << "\n" + "DOXYDOCS_PM = " << pathDoxyDocsPM << "\n" + "DOXYMODEL_PM = " << pathDoxyModelPM << "\n" + "DOXYRULES = " << pathDoxyRules << "\n"; + if (perlmodLatex) + doxyRulesStream << + "DOXYLATEX_PL = " << pathDoxyLatexPL << "\n" + "DOXYLATEXTEMPLATE_PL = " << pathDoxyLatexTemplatePL << "\n" + "DOXYTEMPLATE_TEX = " << pathDoxyTemplateTex << "\n" + "DOXYDOCS_TEX = " << pathDoxyDocsTex << "\n" + "DOXYFORMAT_TEX = " << pathDoxyFormatTex << "\n" + "DOXYLATEX_TEX = " << pathDoxyLatexTex << "\n" + "DOXYLATEX_DVI = " << pathDoxyLatexDVI << "\n" + "DOXYLATEX_PDF = " << pathDoxyLatexPDF << "\n"; + + doxyRulesStream << + "\n" + ".PHONY: clean-perlmod\n" + "clean-perlmod:\n" + "\trm -f $(DOXYMODEL_PM) $(DOXYDOCS_PM)"; + if (perlmodLatex) + doxyRulesStream << + " \\\n" + "\t$(DOXYLATEX_PL) $(DOXYLATEXTEMPLATE_PL) \\\n" + "\t$(DOXYDOCS_TEX) $(DOXYTEMPLATE_TEX) \\\n" + "\t$(DOXYFORMAT_TEX) $(DOXYLATEX_TEX) \\\n" + "\t$(DOXYLATEX_PDF) $(DOXYLATEX_DVI) \\\n" + "\t$(addprefix $(DOXYLATEX_TEX:tex=),out aux log)"; + doxyRulesStream << "\n\n"; + + doxyRulesStream << + "$(DOXYRULES) $(DOXYMAKEFILE) $(DOXYMODEL_PM) $(DOXYDOCS_PM)"; + if (perlmodLatex) { + doxyRulesStream << + " \\\n" + "$(DOXYLATEX_PL) $(DOXYLATEXTEMPLATE_PL) \\\n" + "$(DOXYFORMAT_TEX) $(DOXYLATEX_TEX)"; + } + doxyRulesStream << + ": $(DOXYFILE)\n" + "\tcd $(DOXYEXECPATH) ; doxygen \"$<\"\n"; + + if (perlmodLatex) { + doxyRulesStream << + "\n" + "$(DOXYDOCS_TEX): $(DOXYLATEX_PL) $(DOXYDOCS_PM)\n" + "\tperl -I\"$(<D)\" \"$<\" >\"$@\"\n" + "\n" + "$(DOXYTEMPLATE_TEX): $(DOXYLATEXTEMPLATE_PL) $(DOXYMODEL_PM)\n" + "\tperl -I\"$(<D)\" \"$<\" >\"$@\"\n" + "\n" + "$(DOXYLATEX_PDF) $(DOXYLATEX_DVI): $(DOXYLATEX_TEX) $(DOXYFORMAT_TEX) $(DOXYTEMPLATE_TEX) $(DOXYDOCS_TEX)\n" + "\n" + "$(DOXYLATEX_PDF): $(DOXYLATEX_TEX)\n" + "\tpdflatex -interaction=nonstopmode \"$<\"\n" + "\n" + "$(DOXYLATEX_DVI): $(DOXYLATEX_TEX)\n" + "\tlatex -interaction=nonstopmode \"$<\"\n"; } - QCString fileName=outputDirectory+"/perlmod/DoxyDocs.pm"; - QFile f(fileName); - if (!f.open(IO_WriteOnly)) - { - err("Cannot open file %s for writing!\n",fileName.data()); - return; + return true; +} + +bool PerlModGenerator::generateMakefile() +{ + QFile makefile; + if (!createOutputFile(makefile, pathMakefile)) + return false; + + bool perlmodLatex = Config_getBool("PERLMOD_LATEX"); + + QTextStream makefileStream(&makefile); + makefileStream << + ".PHONY: default clean" << (perlmodLatex ? " pdf" : "") << "\n" + "default: " << (perlmodLatex ? "pdf" : "clean") << "\n" + "\n" + "include " << pathDoxyRules << "\n" + "\n" + "clean: clean-perlmod\n"; + + if (perlmodLatex) { + makefileStream << + "pdf: $(DOXYLATEX_PDF)\n" + "dvi: $(DOXYLATEX_DVI)\n"; } - - QTextStream t(&f); - PerlModOutputStream os(&t); - PerlModOutput output(&os); - output.add("$doxydocs =\n").openHash(); - - output.openList("classes"); - ClassSDict::Iterator cli(Doxygen::classSDict); - ClassDef *cd; - for (cli.toFirst();(cd=cli.current());++cli) - generatePerlModForClass(cd,output); - output.closeList(); - output.openList("namespaces"); - NamespaceSDict::Iterator nli(Doxygen::namespaceSDict); - NamespaceDef *nd; - for (nli.toFirst();(nd=nli.current());++nli) - generatePerlModForNamespace(nd,output); - output.closeList(); + return true; +} + +bool PerlModGenerator::generateDoxyLatexTemplatePL() +{ + QFile doxyLatexTemplatePL; + if (!createOutputFile(doxyLatexTemplatePL, pathDoxyLatexTemplatePL)) + return false; + + QTextStream doxyLatexTemplatePLStream(&doxyLatexTemplatePL); + doxyLatexTemplatePLStream << + "use DoxyModel;\n" + "\n" + "sub template($) {\n" + "\tmy $model = $_[0];\n" + "\tmy ($type, $name) = @$model[0, 1];\n" + "\tif ($type eq \"string\") {\n" + "\t\tprint \"\\\\def\\\\\" . $name . \"#1{#1}%\\n\";\n" + "\t} elsif ($type eq \"doc\") {\n" + "\t\tprint \"\\\\def\\\\\" . $name . \"#1{#1}%\\n\";\n" + "\t} elsif ($type eq \"hash\") {\n" + "\t\tmy ($key, $value);\n" + "\t\twhile (($key, $submodel) = each %{$$model[2]}) {\n" + "\t\t\tmy $subname = $$submodel[1];\n" + "\t\t\tprint \"\\\\def\\\\\" . $subname . \"Empty{}%\\n\";\n" + "\t\t\tprint \"\\\\def\\\\field\" . $subname . \"Empty{\\\\\" . $subname . \"Empty}%\\n\";\n" + "\t\t\ttemplate($submodel);\n" + "\t\t}\n" + "\t\tprint \"\\\\def\\\\\" . $name . \"{}%\\n\";\n" + "\t} elsif ($type eq \"list\") {\n" + "\t\ttemplate($$model[2]);\n" + "\t\tprint \"\\\\def\\\\\" . $name . \"#1{#1}%\\n\";\n" + "\t\tprint \"\\\\def\\\\\" . $name . \"Sep{}%\\n\";\n" + "\t}\n" + "}\n" + "\n" + "template($doxymodel);\n"; + + return true; +} + +bool PerlModGenerator::generateDoxyLatexPL() +{ + QFile doxyLatexPL; + if (!createOutputFile(doxyLatexPL, pathDoxyLatexPL)) + return false; + + QTextStream doxyLatexPLStream(&doxyLatexPL); + doxyLatexPLStream << + "use DoxyModel;\n" + "use DoxyDocs;\n" + "\n" + "sub latex_quote($) {\n" + "\tmy $text = $_[0];\n" + "\t$text =~ s/\\\\/\\\\textbackslash /g;\n" + "\t$text =~ s/~/\\\\textasciitilde /g;\n" + "\t$text =~ s/</\\\\textasciiless /g;\n" + "\t$text =~ s/>/\\\\textasciigreater /g;\n" + "\t$text =~ s/\\\\^/\\\\textasciicircum /g;\n" + "\t$text =~ s/[\\$&%#_{}]/\\\\$&/g;\n" + "\tprint $text;\n" + "}\n" + "\n" + "sub generate_doc($) {\n" + "\tmy $doc = $_[0];\n" + "\tfor my $item (@$doc) {\n" + "\t\tmy $type = $$item{type};\n" + "\t\tif ($type eq \"text\") {\n" + "\t\t\tlatex_quote($$item{content});\n" + "\t\t} elsif ($type eq \"para\") {\n" + "\t\t\tgenerate_doc($$item{content});\n" + "#\t\t\tprint \"\\\\par\\n\";\n" + "\t\t} elsif ($type eq \"bold\") {\n" + "\t\t\tprint \"\\\\textbf{\";\n" + "\t\t\tgenerate_doc($$item{content});\n" + "\t\t\tprint \"}\";\n" + "\t\t} elsif ($type eq \"emphasis\") {\n" + "\t\t\tprint \"\\\\textit{\";\n" + "\t\t\tgenerate_doc($$item{content});\n" + "\t\t\tprint \"}\";\n" + "\t\t} elsif ($type eq \"url\") {\n" + "\t\t\tlatex_quote($$item{content});\n" + "\t\t}\n" + "\t}\n" + "}\n" + "\n" + "sub generate($$) {\n" + "\tmy ($item, $model) = @_;\n" + "\tmy ($type, $name) = @$model[0, 1];\n" + "\tif ($type eq \"string\") {\n" + "\t\tprint \"\\\\\" . $name . \"{\";\n" + "\t\tlatex_quote($item);\n" + "\t\tprint \"}\";\n" + "\t} elsif ($type eq \"doc\") {\n" + "\t\tif (@$item) {\n" + "\t\t\tprint \"\\\\\" . $name . \"{\";\n" + "\t\t\tgenerate_doc($item);\n" + "\t\t\tprint \"}%\\n\";\n" + "\t\t} else {\n" + "\t\t\tprint \"\\\\\" . $name . \"Empty%\\n\";\n" + "\t\t}\n" + "\t} elsif ($type eq \"hash\") {\n" + "\t\tmy ($key, $value);\n" + "\t\twhile (($key, $submodel) = each %{$$model[2]}) {\n" + "\t\t\tmy $subname = $$submodel[1];\n" + "\t\t\tprint \"\\\\def\\\\field\" . $subname . \"{\";\n" + "\t\t\tif ($$item{$key}) {\n" + "\t\t\t\tgenerate($$item{$key}, $submodel);\n" + "\t\t\t} else {\n" + "\t\t\t\t\tprint \"\\\\\" . $subname . \"Empty%\\n\";\n" + "\t\t\t}\n" + "\t\t\tprint \"}%\\n\";\n" + "\t\t}\n" + "\t\tprint \"\\\\\" . $name . \"%\\n\";\n" + "\t} elsif ($type eq \"list\") {\n" + "\t\tmy $index = 0;\n" + "\t\tif (@$item) {\n" + "\t\t\tprint \"\\\\\" . $name . \"{%\\n\";\n" + "\t\t\tfor my $subitem (@$item) {\n" + "\t\t\t\tif ($index) {\n" + "\t\t\t\t\tprint \"\\\\\" . $name . \"Sep%\\n\";\n" + "\t\t\t\t}\n" + "\t\t\t\tgenerate($subitem, $$model[2]);\n" + "\t\t\t\t$index++;\n" + "\t\t\t}\n" + "\t\t\tprint \"}%\\n\";\n" + "\t\t} else {\n" + "\t\t\tprint \"\\\\\" . $name . \"Empty%\\n\";\n" + "\t\t}\n" + "\t}\n" + "}\n" + "\n" + "generate($doxydocs, $doxymodel);\n"; + + return true; +} + +bool PerlModGenerator::generateDoxyFormatTex() +{ + QFile doxyFormatTex; + if (!createOutputFile(doxyFormatTex, pathDoxyFormatTex)) + return false; + + QTextStream doxyFormatTexStream(&doxyFormatTex); + doxyFormatTexStream << + "\\input{" << pathDoxyTemplateTex << "}\n" + "\n" + "\\newbox\\BoxA\n" + "\\dimendef\\DimenA=151\\relax\n" + "\\dimendef\\DimenB=152\\relax\n" + "\\countdef\\ZoneDepth=151\\relax\n" + "\n" + "\\def\\Ifxcscs#1#2{%\n" + "\\expandafter\\let\\expandafter\\Ifxcscsa\\csname#1\\endcsname%\n" + "\\expandafter\\let\\expandafter\\Ifxcscsb\\csname#2\\endcsname%\n" + "\\ifx\\Ifxcscsa\\Ifxcscsb}%\n" + "\n" + "\\def\\Cs#1{\\csname#1\\endcsname}%\n" + "\\def\\Defcs#1{\\expandafter\\def\\csname#1\\endcsname}%\n" + "\\def\\Letcs#1{\\expandafter\\let\\csname#1\\endcsname}%\n" + "\\def\\Heading#1{\\vskip 4mm\\relax\\textbf{#1}}%\n" + "\\def\\See#1{\\begin{flushleft}\\Heading{See also: }#1\\end{flushleft}}%\n" + "\n" + "\\def\\Frame#1{\\vskip 3mm\\relax\\fbox{ \\vbox{\\hsize0.95\\hsize\\vskip 1mm\\relax%\n" + "\\raggedright#1\\vskip 0.5mm\\relax} }}%\n" + "\n" + "\\def\\Zone#1#2#3{%\n" + "\\Defcs{#1}{\n" + "\\advance\\ZoneDepth1\\relax%\n" + "\\Letcs{Mode\\number\\ZoneDepth}0%\n" + "\\Letcs{Present\\number\\ZoneDepth}0%\n" + "#2%\n" + "\\expandafter\\if\\Cs{Present\\number\\ZoneDepth}1%\n" + "\\advance\\ZoneDepth-1\\relax%\n" + "\\Letcs{Present\\number\\ZoneDepth}1%\n" + "\\expandafter\\if\\Cs{Mode\\number\\ZoneDepth}1%\n" + "\\advance\\ZoneDepth1\\relax%\n" + "\\Letcs{Mode\\number\\ZoneDepth}1%\n" + "#3%\n" + "\\advance\\ZoneDepth-1\\relax\\fi%\n" + "\\advance\\ZoneDepth1\\relax\\fi%\n" + "\\advance\\ZoneDepth-1\\relax}}%\n" + "\n" + "\\def\\Member#1#2{%\n" + "\\Defcs{Test#1}{\\Cs{field#1Detailed}%\n" + "\\Ifxcscs{field#1DetailedDoc}{field#1DetailedDocEmpty}\\else\\Letcs{Present#1}1\\fi}\n" + "\\Defcs{#1}{\\Letcs{Present#1}0%\n" + "\\Cs{Test#1}\\if1\\Cs{Present#1}\\Letcs{Present\\number\\ZoneDepth}1%\n" + "\\if1\\Cs{Mode\\number\\ZoneDepth}#2\\fi\\fi}}%\n" + "%\n" + "\\def\\TypedefMemberList#1#2{%\n" + "\\Defcs{#1DetailedDoc}##1{\\vskip 5.5mm\\relax##1}%\n" + "\\Defcs{#1Name}##1{\\textbf{##1}}%\n" + "\\Defcs{#1See}##1{\\See{##1}}%\n" + "%\n" + "\\Zone{#1s}{\\Cs{field#1List}}{\\subsubsection{#2}\\Cs{field#1List}}%\n" + "\\Member{#1}{\\Frame{typedef \\Cs{field#1Type} \\Cs{field#1Name}}%\n" + "\\Cs{field#1DetailedDoc}\\Cs{field#1See}\\vskip 5mm\\relax}}%\n" + "\n" + "\\def\\VariableMemberList#1#2{%\n" + "\\Defcs{#1DetailedDoc}##1{\\vskip 5.5mm\\relax##1}%\n" + "\\Defcs{#1Name}##1{\\textbf{##1}}%\n" + "\\Defcs{#1See}##1{\\See{##1}}%\n" + "%\n" + "\\Zone{#1s}{\\Cs{field#1List}}{\\subsubsection{#2}\\Cs{field#1List}}%\n" + "\\Member{#1}{\\Frame{\\Cs{field#1Type}{} \\Cs{field#1Name}}%\n" + "\\Cs{field#1DetailedDoc}\\Cs{field#1See}\\vskip 5mm\\relax}}%\n" + "\n" + "\\def\\FunctionMemberList#1#2{%\n" + "\\Defcs{#1PDParamName}##1{\\textit{##1}}%\n" + "\\Defcs{#1PDParam}{\\Cs{field#1PDParamName}}%\n" + "\\Defcs{#1PDParamsSep}{, }%\n" + "\\Defcs{#1PDBlocksSep}{\\vskip 2mm\\relax}%\n" + "%\n" + "\\Defcs{#1PDBlocks}##1{%\n" + "\\Heading{Parameters:}\\vskip 1.5mm\\relax%\n" + "\\DimenA0pt\\relax%\n" + "\\Defcs{#1PDBlock}{\\setbox\\BoxA\\hbox{\\Cs{field#1PDParams}}%\n" + "\\ifdim\\DimenA<\\wd\\BoxA\\DimenA\\wd\\BoxA\\fi}%\n" + "##1%\n" + "\\advance\\DimenA3mm\\relax\n" + "\\DimenB\\hsize\\advance\\DimenB-\\DimenA\\relax%\n" + "\\Defcs{#1PDBlock}{\\hbox to\\hsize{\\vtop{\\hsize\\DimenA\\relax%\n" + "\\Cs{field#1PDParams}}\\hfill%\n" + "\\vtop{\\hsize\\DimenB\\relax\\Cs{field#1PDDoc}}}}%\n" + "##1}%\n" + "%\n" + "\\Defcs{#1ParamName}##1{\\textit{##1}}%\n" + "\\Defcs{#1Param}{\\Cs{field#1ParamType}{} \\Cs{field#1ParamName}}%\n" + "\\Defcs{#1ParamsSep}{, }%\n" + "%\n" + "\\Defcs{#1Name}##1{\\textbf{##1}}%\n" + "\\Defcs{#1See}##1{\\See{##1}}%\n" + "\\Defcs{#1Return}##1{\\Heading{Returns: }##1}%\n" + "\\Defcs{field#1Title}{\\Frame{\\Cs{field#1Type}{} \\Cs{field#1Name}(\\Cs{field#1Params})}}%\n" + "%\n" + "\\Zone{#1s}{\\Cs{field#1List}}{\\subsubsection{#2}\\Cs{field#1List}}%\n" + "\\Member{#1}{\n" + "\\Cs{field#1Title}\\vskip 6mm\\relax\\Cs{field#1DetailedDoc}%\n" + "\\Cs{field#1Return}\\Cs{field#1PDBlocks}\\Cs{field#1See}\\vskip 5mm\\relax}}\n" + "\n" + "\\TypedefMemberList{FileTypedef}{Typedefs}%\n" + "\\VariableMemberList{FileVariable}{Variables}%\n" + "\\FunctionMemberList{FileFunction}{Functions}%\n" + "\n" + "\\def\\FileDetailed{\\fieldFileDetailedDoc\\par}%\n" + "\n" + "\\def\\TestFile{\\fieldFileTypedefs\\fieldFileVariables\\fieldFileFunctions}%\n" + "\\Zone{File}{\\TestFile}{\\subsection{\\fieldFileName}\\fieldFileDetailed\\TestFile}%\n" + "\n" + "\\TypedefMemberList{ClassPublicTypedef}{Public Typedefs}\n" + "\\TypedefMemberList{ClassProtectedTypedef}{Protected Typedefs}\n" + "\\TypedefMemberList{ClassPrivateTypedef}{Private Typedefs}\n" + "\\VariableMemberList{ClassPublicMember}{Public Members}\n" + "\\VariableMemberList{ClassProtectedMember}{Protected Members}\n" + "\\VariableMemberList{ClassPrivateMember}{Private Members}\n" + "\\FunctionMemberList{ClassPublicMethod}{Public Methods}\n" + "\\FunctionMemberList{ClassProtectedMethod}{Protected Methods}\n" + "\\FunctionMemberList{ClassPrivateMethod}{Private Methods}\n" + "\n" + "\\def\\ClassDetailed{\\fieldClassDetailedDoc\\par}%\n" + "\n" + "\\def\\TestClass{%\n" + "\\fieldClassPublicTypedefs\\fieldClassPublicMembers\\fieldClassPublicMethods%\n" + "\\fieldClassProtectedTypedefs\\fieldClassProtectedMembers\\fieldClassProtectedMethods%\n" + "\\fieldClassPrivateTypedefs\\fieldClassPrivateMembers\\fieldClassPrivateMethods}%\n" + "\n" + "\\Zone{Class}{\\TestClass}{\\subsection{\\fieldClassName}\\fieldClassDetailed\\TestClass}%\n" + "\n" + "\\Zone{AllFiles}{\\fieldFiles}{\\section{Files}\\fieldFiles}%\n" + "\\Zone{AllClasses}{\\fieldClasses}{\\section{Classes}\\fieldClasses}%\n" + "\n" + "\\newlength{\\oldparskip}%\n" + "\\newlength{\\oldparindent}%\n" + "\\newlength{\\oldfboxrule}%\n" + "\n" + "\\ZoneDepth0%\n" + "\\Letcs{Mode0}1%\n" + "\n" + "\\def\\EmitDoxyDocs{%\n" + "\\setlength{\\oldparskip}{\\parskip}%\n" + "\\setlength{\\oldparindent}{\\parindent}%\n" + "\\setlength{\\oldfboxrule}{\\fboxrule}%\n" + "\\setlength{\\parskip}{0cm}%\n" + "\\setlength{\\parindent}{0cm}%\n" + "\\setlength{\\fboxrule}{1pt}%\n" + "\\AllFiles\\AllClasses%\n" + "\\setlength{\\parskip}{\\oldparskip}%\n" + "\\setlength{\\parindent}{\\oldparindent}%\n" + "\\setlength{\\fboxrule}{\\oldfboxrule}}\n"; + + return true; +} + +bool PerlModGenerator::generateDoxyLatexTex() +{ + QFile doxyLatexTex; + if (!createOutputFile(doxyLatexTex, pathDoxyLatexTex)) + return false; + + QTextStream doxyLatexTexStream(&doxyLatexTex); + doxyLatexTexStream << + "\\documentclass[a4paper,12pt]{article}\n" + "\\usepackage[latin1]{inputenc}\n" + "\\usepackage[none]{hyphenat}\n" + "\\usepackage[T1]{fontenc}\n" + "\\usepackage{hyperref}\n" + "\\usepackage{times}\n" + "\n" + "\\input{doxyformat}\n" + "\n" + "\\begin{document}\n" + "\\input{" << pathDoxyDocsTex << "}\n" + "\\EmitDoxyDocs\n" + "\\end{document}\n"; + + return true; +} + +void PerlModGenerator::generate() +{ + // + classes + // + namespaces + // + files + // - packages + // + groups + // + related pages + // - examples - output.openList("files"); - FileNameListIterator fnli(Doxygen::inputNameList); - FileName *fn; - for (;(fn=fnli.current());++fnli) - { - FileNameIterator fni(*fn); - FileDef *fd; - for (;(fd=fni.current());++fni) - generatePerlModForFile(fd,output); + QDir perlModDir; + if (!createOutputDir(perlModDir)) + return; + + bool perlmodLatex = Config_getBool("PERLMOD_LATEX"); + + pathDoxyDocsPM = perlModDir.absPath() + "/DoxyDocs.pm"; + pathDoxyModelPM = perlModDir.absPath() + "/DoxyModel.pm"; + pathMakefile = perlModDir.absPath() + "/Makefile"; + pathDoxyRules = perlModDir.absPath() + "/doxyrules.make"; + + if (perlmodLatex) { + pathDoxyTemplateTex = perlModDir.absPath() + "/doxytemplate.tex"; + pathDoxyFormatTex = perlModDir.absPath() + "/doxyformat.tex"; + pathDoxyLatexTex = perlModDir.absPath() + "/doxylatex.tex"; + pathDoxyLatexDVI = perlModDir.absPath() + "/doxylatex.dvi"; + pathDoxyLatexPDF = perlModDir.absPath() + "/doxylatex.pdf"; + pathDoxyDocsTex = perlModDir.absPath() + "/doxydocs.tex"; + pathDoxyLatexPL = perlModDir.absPath() + "/doxylatex.pl"; + pathDoxyLatexTemplatePL = perlModDir.absPath() + "/doxylatex-template.pl"; } - output.closeList(); - output.openList("groups"); - GroupSDict::Iterator gli(Doxygen::groupSDict); - GroupDef *gd; - for (;(gd=gli.current());++gli) - generatePerlModForGroup(gd,output); - output.closeList(); + if (!(generatePerlModOutput() + && generateDoxyModelPM() + && generateMakefile() + && generateDoxyRules())) + return; - output.openList("pages"); - PageSDict::Iterator pdi(*Doxygen::pageSDict); - PageInfo *pi=0; - for (pdi.toFirst();(pi=pdi.current());++pdi) - generatePerlModForPage(pi,output); - if (Doxygen::mainPage) - generatePerlModForPage(Doxygen::mainPage,output); - output.closeList(); + if (perlmodLatex) { + if (!(generateDoxyLatexTemplatePL() + && generateDoxyLatexPL() + && generateDoxyLatexTex() + && generateDoxyFormatTex())) + return; + } +} - output.closeHash().add(";\n1;\n"); +void generatePerlMod() +{ + PerlModGenerator pmg; + pmg.generate(); } // Local Variables: // c-basic-offset: 2 // End: + +/* This elisp function for XEmacs makes Control-Z transform + the text in the region into a valid C string. + + (global-set-key '(control z) (lambda () (interactive) + (save-excursion + (if (< (mark) (point)) (exchange-point-and-mark)) + (let ((start (point)) (replacers + '(("\\\\" "\\\\\\\\") + ("\"" "\\\\\"") + ("\t" "\\\\t") + ("^.*$" "\"\\&\\\\n\"")))) + (while replacers + (while (re-search-forward (caar replacers) (mark) t) + (replace-match (cadar replacers) t)) + (goto-char start) + (setq replacers (cdr replacers))))))) +*/ |