]> git.lyx.org Git - lyx.git/blobdiff - src/BiblioInfo.cpp
Routines for calculating numerical labels for BibTeX citations.
[lyx.git] / src / BiblioInfo.cpp
index 8c73ac1d8ec2eb956dbd1c255e6011836755d74d..bb9b27f7feab4b11993cedc35dcd0454ee5df9cd 100644 (file)
 #include "Encoding.h"
 #include "InsetIterator.h"
 #include "Paragraph.h"
+#include "TocBackend.h"
 
 #include "insets/Inset.h"
 #include "insets/InsetBibitem.h"
 #include "insets/InsetBibtex.h"
 #include "insets/InsetInclude.h"
 
+#include "support/convert.h"
 #include "support/docstream.h"
 #include "support/gettext.h"
 #include "support/lassert.h"
@@ -33,6 +35,8 @@
 
 #include "boost/regex.hpp"
 
+#include <set>
+
 using namespace std;
 using namespace lyx::support;
 
@@ -129,8 +133,8 @@ docstring convertLaTeXCommands(docstring const & str)
                        scanning_cmd = false;
                }
 
-               // was the last character a \? If so, then this is something like: \\
-               // or \$, so we'll just output it. That's probably not always right...
+               // was the last character a \? If so, then this is something like:
+               // \\ or \$, so we'll just output it. That's probably not always right...
                if (escaped) {
                        // exception: output \, as THIN SPACE
                        if (ch == ',')
@@ -602,6 +606,78 @@ void BiblioInfo::mergeBiblioInfo(BiblioInfo const & info)
 }
 
 
+namespace {
+       // used in xhtml to sort a list of BibTeXInfo objects
+       bool lSorter(BibTeXInfo const * lhs, BibTeXInfo const * rhs)
+       {
+               return lhs->getAbbreviatedAuthor() < rhs->getAbbreviatedAuthor();
+       }
+}
+
+
+void BiblioInfo::collectCitedEntries(Buffer const & buf)
+{
+       cited_entries_.clear();
+       // We are going to collect all the citation keys used in the document,
+       // getting them from the TOC.
+       // FIXME We may want to collect these differently, in the first case,
+       // so that we might have them in order of appearance.
+       set<docstring> citekeys;
+       Toc const & toc = buf.tocBackend().toc("citation");
+       Toc::const_iterator it = toc.begin();
+       Toc::const_iterator const en = toc.end();
+       for (; it != en; ++it) {
+               if (it->str().empty())
+                       continue;
+               vector<docstring> const keys = getVectorFromString(it->str());
+               citekeys.insert(keys.begin(), keys.end());
+       }
+       if (citekeys.empty())
+               return;
+       
+       // We have a set of the keys used in this document.
+       // We will now convert it to a list of the BibTeXInfo objects used in 
+       // this document...
+       vector<BibTeXInfo const *> bi;
+       set<docstring>::const_iterator cit = citekeys.begin();
+       set<docstring>::const_iterator const cen = citekeys.end();
+       for (; cit != cen; ++cit) {
+               BiblioInfo::const_iterator const bt = find(*cit);
+               if (bt == end() || !bt->second.isBibTeX())
+                       continue;
+               bi.push_back(&(bt->second));
+       }
+       // ...and sort it.
+       sort(bi.begin(), bi.end(), lSorter);
+       
+       // Now we can write the sorted keys
+       vector<BibTeXInfo const *>::const_iterator bit = bi.begin();
+       vector<BibTeXInfo const *>::const_iterator ben = bi.end();
+       for (; bit != ben; ++bit)
+               cited_entries_.push_back((*bit)->key());
+}
+
+
+void BiblioInfo::makeCitationLabels(Buffer const & buf)
+{
+       collectCitedEntries(buf);
+       // FIXME It'd be nice to do author-year as well as numerical
+       // and maybe even some other sorts of labels.
+       vector<docstring>::const_iterator it = cited_entries_.begin();
+       vector<docstring>::const_iterator const en = cited_entries_.end();
+       int keynumber = 0;
+       for (; it != en; ++it) {
+               map<docstring, BibTeXInfo>::iterator const biit = bimap_.find(*it);
+               // this shouldn't happen, but...
+               if (biit == bimap_.end())
+                       continue;
+               BibTeXInfo & entry = biit->second;
+               docstring const key = convert<docstring>(++keynumber);
+               entry.setCiteKey(key);
+       }
+}
+
+
 //////////////////////////////////////////////////////////////////////
 //
 // CitationStyle