diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/cite.cpp | 142 |
1 files changed, 64 insertions, 78 deletions
diff --git a/src/cite.cpp b/src/cite.cpp index f0580ed..a1b964a 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,39 +165,37 @@ 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 + // s bibtex can find them without path (bibtex doesn't support paths or + // filenames with spaces!) + // Strictly not required when only latex is generated + // copy bib files to the latex output dir + 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(); @@ -226,7 +203,7 @@ void CiteDict::generatePage() const // 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 +265,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 +295,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); } |