diff options
-rw-r--r-- | src/cite.cpp | 143 | ||||
-rw-r--r-- | src/config.xml | 4 |
2 files changed, 65 insertions, 82 deletions
diff --git a/src/cite.cpp b/src/cite.cpp index f0580ed..378e7ee 100644 --- a/src/cite.cpp +++ b/src/cite.cpp @@ -37,6 +37,8 @@ static const char *bib2xhtml_pl = const QCString CiteConsts::fileName("citelist"); const QCString CiteConsts::anchorPrefix("CITEREF_"); +const QCString bibTmpFile("bibTmpFile_"); +const QCString bibTmpDir("bibTmpDir/"); //-------------------------------------------------------------------------- @@ -45,51 +47,6 @@ CiteDict::CiteDict(int size) : m_entries(size, FALSE) m_entries.setAutoDelete(TRUE); } -static QCString getListOfBibFiles(const QCString &sep,bool namesOnly) -{ - QCString result; - QStrList &citeDataList = Config_getList("CITE_BIB_FILES"); - const char *bibdata = citeDataList.first(); - while (bibdata) - { - int i; - QCString bibFile = bibdata; - if (namesOnly && bibFile.right(4)==".bib") // strip extension - { - bibFile = bibFile.left(bibFile.length()-4); - } - else - { - if (!namesOnly && bibFile.right(4)!=".bib") bibFile += ".bib"; - } - if ((i=bibFile.findRev('/'))!=-1) // strip path - { - bibFile = bibFile.mid(i+1); - } - if (!bibFile.isEmpty()) - { - if (namesOnly) // bare names - { - result+=bibFile; - } - else // add quotes for paths with spaces - { - result+="\""+bibFile+"\""; - } - bibdata = citeDataList.next(); - if (bibdata) - { - result+=sep; - } - } - else - { - bibdata = citeDataList.next(); - } - } - return result; -} - void CiteDict::writeLatexBibliography(FTextStream &t) { if (m_entries.isEmpty()) @@ -108,7 +65,29 @@ void CiteDict::writeLatexBibliography(FTextStream &t) "\\phantomsection\n" "\\addcontentsline{toc}{" << unit << "}{" << theTranslator->trCiteReferences() << "}\n" "\\bibliographystyle{" << style << "}\n" - "\\bibliography{" << getListOfBibFiles(",",TRUE) << "}\n" + "\\bibliography{"; + QStrList &citeDataList = Config_getList("CITE_BIB_FILES"); + QCString latexOutputDir = Config_getString("LATEX_OUTPUT")+"/"; + int i = 0; + const char *bibdata = citeDataList.first(); + while (bibdata) + { + QCString bibFile = bibdata; + // Note: file can now have multiple dots + if (!bibFile.isEmpty() && bibFile.right(4)!=".bib") bibFile+=".bib"; + QFileInfo fi(bibFile); + if (fi.exists()) + { + if (!bibFile.isEmpty()) + { + if (i) t << ","; + i++; + t << bibTmpFile << QString().setNum(i); + } + } + bibdata = citeDataList.next(); + } + t << "}\n" "\n"; } @@ -186,47 +165,44 @@ void CiteDict::generatePage() const f.writeBlock(bstData, bstData.length()); f.close(); - // 4. for html we just copy the bib files to the output so that - // bibtex can find them without path (bibtex doesn't support path's - // with spaces!) - QList<QCString> tempFiles; - tempFiles.setAutoDelete(TRUE); + // 4. for all formats we just copy the bib files to as special output directory + // so bibtex can find them without path (bibtex doesn't support paths or + // filenames with spaces!) + // Strictly not required when only latex is generated + QStrList &citeDataList = Config_getList("CITE_BIB_FILES"); + QCString bibOutputDir = outputDir+"/"+bibTmpDir; + QCString bibOutputFiles = ""; QDir thisDir; - if (Config_getBool("GENERATE_HTML")) + thisDir.mkdir(bibOutputDir); + const char *bibdata = citeDataList.first(); + int i = 0; + while (bibdata) { - // copy bib files to the latex output dir - QStrList &citeDataList = Config_getList("CITE_BIB_FILES"); - QCString bibOutputDir = outputDir+"/"; - QFileInfo fo(bibOutputDir); - const char *bibdata = citeDataList.first(); - while (bibdata) + QCString bibFile = bibdata; + if (!bibFile.isEmpty() && bibFile.right(4)!=".bib") bibFile+=".bib"; + QFileInfo fi(bibFile); + if (fi.exists()) { - QCString bibFile = bibdata; - if (!bibFile.isEmpty() && bibFile.right(4)!=".bib") bibFile+=".bib"; - QFileInfo fi(bibFile); - if (fi.exists() && fi.dirPath(TRUE)!=fo.absFilePath()) - { - if (!bibFile.isEmpty()) - { - QCString destFile=bibOutputDir+fi.fileName().data(); - copyFile(bibFile,destFile); - tempFiles.append(new QCString(destFile)); - } - } - else if (!fi.exists()) + if (!bibFile.isEmpty()) { - err("bib file %s not found!\n",bibFile.data()); + ++i; + copyFile(bibFile,bibOutputDir + bibTmpFile + QCString().setNum(i) + ".bib"); + bibOutputFiles = bibOutputFiles + " " + bibTmpDir + bibTmpFile + QCString().setNum(i) + ".bib"; } - bibdata = citeDataList.next(); } + else if (!fi.exists()) + { + err("bib file %s not found!\n",bibFile.data()); + } + bibdata = citeDataList.next(); } - QCString oldDir = QDir::currentDirPath().utf8(); + QString oldDir = QDir::currentDirPath(); QDir::setCurrent(outputDir); // 5. run bib2xhtml perl script on the generated file which will insert the // bibliography in citelist.doc - portable_system("perl","\""+bib2xhtmlFile+"\" "+getListOfBibFiles(" ",FALSE)+" \""+ + portable_system("perl","\""+bib2xhtmlFile+"\" "+bibOutputFiles+" \""+ citeListFile+"\""); QDir::setCurrent(oldDir); @@ -288,17 +264,22 @@ void CiteDict::generatePage() const // copy bib files to the latex output dir QStrList &citeDataList = Config_getList("CITE_BIB_FILES"); QCString latexOutputDir = Config_getString("LATEX_OUTPUT")+"/"; + int i = 0; const char *bibdata = citeDataList.first(); while (bibdata) { QCString bibFile = bibdata; + // Note: file can now have multiple dots if (!bibFile.isEmpty() && bibFile.right(4)!=".bib") bibFile+=".bib"; QFileInfo fi(bibFile); if (fi.exists()) { if (!bibFile.isEmpty()) { - copyFile(bibFile,latexOutputDir+fi.fileName().data()); + // bug_700510, multile times the same name were overwriting; creating new names + // also for names with spaces + ++i; + copyFile(bibFile,latexOutputDir + bibTmpFile + QCString().setNum(i) + ".bib"); } } else @@ -313,10 +294,14 @@ void CiteDict::generatePage() const thisDir.remove(citeListFile); thisDir.remove(doxygenBstFile); thisDir.remove(bib2xhtmlFile); - while (!tempFiles.isEmpty()) + bibdata = citeDataList.first(); + // we might try to remove too many files as empty files didn't get a coresponding new file + // but the remove function does not emit an error for it and we don't catch the error return + // so no problem. + for (unsigned int j = 1; j <= citeDataList.count(); j++) { - QCString *s=tempFiles.take(0); - thisDir.remove(*s); + thisDir.remove(bibOutputDir + bibTmpFile + QCString().setNum(j) + ".bib"); } + thisDir.rmdir(bibOutputDir); } diff --git a/src/config.xml b/src/config.xml index 5f18037..f83ee55 100644 --- a/src/config.xml +++ b/src/config.xml @@ -1145,9 +1145,7 @@ FILE_VERSION_INFO = "cleartool desc -fmt \%Vn" \c bibtex tool to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. For \f$\mbox{\LaTeX}\f$ the style of the bibliography can be controlled using \ref cfg_latex_bib_style "LATEX_BIB_STYLE". - To use this - feature you need \c bibtex and \c perl available in the search path. Do not use - file names with spaces, \c bibtex cannot handle them. + To use this feature you need \c bibtex and \c perl available in the search path. See also \ref cmdcite "\\cite" for info how to create references. ]]> </docs> |