From 012be55afdfd7a6fc3b289972b6db7bcda1ebe53 Mon Sep 17 00:00:00 2001 From: Richard Heck Date: Fri, 8 Jan 2010 16:40:41 +0000 Subject: [PATCH] Move the collection of citations and sorting routines into BiblioInfo. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@32887 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/BiblioInfo.cpp | 55 +++++++++++++++++++++++++++++++++ src/BiblioInfo.h | 9 ++++++ src/Buffer.cpp | 14 ++++++--- src/Buffer.h | 2 ++ src/insets/InsetBibtex.cpp | 63 ++++++++------------------------------ 5 files changed, 88 insertions(+), 55 deletions(-) diff --git a/src/BiblioInfo.cpp b/src/BiblioInfo.cpp index 66fcd39fe1..d8297d0303 100644 --- a/src/BiblioInfo.cpp +++ b/src/BiblioInfo.cpp @@ -19,6 +19,7 @@ #include "Encoding.h" #include "InsetIterator.h" #include "Paragraph.h" +#include "TocBackend.h" #include "insets/Inset.h" #include "insets/InsetBibitem.h" @@ -33,6 +34,8 @@ #include "boost/regex.hpp" +#include + using namespace std; using namespace lyx::support; @@ -602,6 +605,58 @@ 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 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 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 bi; + set::const_iterator cit = citekeys.begin(); + set::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::const_iterator bit = bi.begin(); + vector::const_iterator ben = bi.end(); + for (; bit != ben; ++bit) + cited_entries_.push_back((*bit)->key()); +} + + ////////////////////////////////////////////////////////////////////// // // CitationStyle diff --git a/src/BiblioInfo.h b/src/BiblioInfo.h index 037b9bf58f..0cb21fc0cb 100644 --- a/src/BiblioInfo.h +++ b/src/BiblioInfo.h @@ -170,6 +170,11 @@ public: */ std::vector const getAuthorYearStrings(docstring const & key, Buffer const & buf) const; + /// Collects the cited entries from buf. + void collectCitedEntries(Buffer const & buf); + /// A list of BibTeX keys cited in the current document, sorted by + /// the last name of the author. + std::vector const & citedEntries() const { return cited_entries_; } /// const_iterator begin() const { return bimap_.begin(); } /// @@ -195,6 +200,10 @@ private: std::set entry_types_; /// our map: keys --> BibTeXInfo std::map bimap_; + /// a possibly sorted list of entries cited in our Buffer. + /// do not try to make this a vector or anything of + /// the sort, because reloads will invalidate those pointers. + std::vector cited_entries_; }; } // namespace lyx diff --git a/src/Buffer.cpp b/src/Buffer.cpp index b116f0f094..d922ae7eb7 100644 --- a/src/Buffer.cpp +++ b/src/Buffer.cpp @@ -1457,8 +1457,8 @@ void Buffer::writeLyXHTMLSource(odocstream & os, LaTeXFeatures features(*this, params(), runparams); validate(features); updateLabels(UpdateMaster, true); - - d->texrow.reset(); + checkBibInfoCache(); + d->bibinfo_.collectCitedEntries(*this); if (!only_body) { os << "\n"; @@ -1639,6 +1639,13 @@ BiblioInfo const & Buffer::masterBibInfo() const BiblioInfo const & Buffer::localBibInfo() const +{ + checkBibInfoCache(); + return d->bibinfo_; +} + + +void Buffer::checkBibInfoCache() const { if (d->bibinfoCacheValid_) { support::FileNameList const & bibfilesCache = getBibfilesCache(); @@ -1660,8 +1667,7 @@ BiblioInfo const & Buffer::localBibInfo() const for (InsetIterator it = inset_iterator_begin(inset()); it; ++it) it->fillWithBibKeys(d->bibinfo_, it); d->bibinfoCacheValid_ = true; - } - return d->bibinfo_; + } } diff --git a/src/Buffer.h b/src/Buffer.h index 67e09ba49e..f52bb828b8 100644 --- a/src/Buffer.h +++ b/src/Buffer.h @@ -568,6 +568,8 @@ private: void updateMacros(DocIterator & it, DocIterator & scope) const; /// + void checkBibInfoCache() const; + /// void setLabel(ParIterator & it) const; /// void collectRelatives(BufferSet & bufs) const; diff --git a/src/insets/InsetBibtex.cpp b/src/insets/InsetBibtex.cpp index a38f4a7bb4..2c426c72f4 100644 --- a/src/insets/InsetBibtex.cpp +++ b/src/insets/InsetBibtex.cpp @@ -25,7 +25,6 @@ #include "output_xhtml.h" #include "OutputParams.h" #include "TextClass.h" -#include "TocBackend.h" #include "frontends/alert.h" @@ -910,69 +909,31 @@ void InsetBibtex::validate(LaTeXFeatures & features) const } -namespace { - // used in xhtml to sort a list of BibTeXInfo objects - bool lSorter(BibTeXInfo const * lhs, BibTeXInfo const * rhs) - { - return lhs->getAbbreviatedAuthor() < rhs->getAbbreviatedAuthor(); - } -} - - docstring InsetBibtex::xhtml(XHTMLStream & xs, OutputParams const &) const { - // We are going to collect all the citation keys used in the document, - // getting them from the TOC. - Toc const & toc = buffer().tocBackend().toc("citation"); - Toc::const_iterator it = toc.begin(); - Toc::const_iterator const en = toc.end(); - vector citekeys; - for (; it != en; ++it) { - if (it->str().empty()) - continue; - vector const keys = getVectorFromString(it->str()); - citekeys.insert(citekeys.end(), keys.begin(), keys.end()); - } - if (citekeys.empty()) - return docstring(); - sort(citekeys.begin(), citekeys.end()); - vector::iterator uit = - unique(citekeys.begin(), citekeys.end()); - citekeys.erase(uit, citekeys.end()); - // We now have a sorted, unique list of the keys used in this document. - // We will now convert it to a list of the BibTeXInfo objects used in - // this document... - vector binfo; - vector::const_iterator cit = citekeys.begin(); - vector::const_iterator const cen = citekeys.end(); - BiblioInfo const & bi = buffer().masterBibInfo(); - for (; cit != cen; ++cit) { - BiblioInfo::const_iterator const bt = bi.find(*cit); - if (bt == bi.end() || !bt->second.isBibTeX()) - continue; - binfo.push_back(&(bt->second)); - } - // ...and sort it. - sort(binfo.begin(), binfo.end(), lSorter); - // Finally, then, we are ready for output. + BiblioInfo const & bibinfo = buffer().masterBibInfo(); + vector const & cites = bibinfo.citedEntries(); xs << StartTag("h2", "class='bibtex'") << _("References") << EndTag("h2") << StartTag("div", "class='bibtex'"); // Now we loop over the entries - vector::const_iterator vit = binfo.begin(); - vector::const_iterator const ven = binfo.end(); + vector::const_iterator vit = cites.begin(); + vector::const_iterator const ven = cites.end(); for (; vit != ven; ++vit) { - BibTeXInfo const * bip = *vit; + BiblioInfo::const_iterator const biit = bibinfo.find(*vit); + if (biit == bibinfo.end()) + continue; + BibTeXInfo const & entry = biit->second; xs << StartTag("div", "class='bibtexentry'"); // FIXME XHTML // The same name/id problem we have elsewhere. - string const attr = "id='" + to_utf8(bip->key()) + "'"; + string const attr = "id='" + to_utf8(entry.key()) + "'"; xs << CompTag("a", attr); - docstring label = bip->label(); + docstring label = entry.label(); if (label.empty()) - label = bip->key(); + label = entry.key(); xs << StartTag("span", "class='bibtexlabel'") << label << EndTag("span"); @@ -980,7 +941,7 @@ docstring InsetBibtex::xhtml(XHTMLStream & xs, OutputParams const &) const // which will give us all the cross-referenced info. But for every // entry, so there's a lot of repitition. This should be fixed. xs << StartTag("span", "class='bibtexinfo'") - << bi.getInfo(bip->key()) + << bibinfo.getInfo(entry.key()) << EndTag("span") << EndTag("div"); } -- 2.39.2