From 32950f6c6ca3b556357fd70ae0a3edbad443f86e Mon Sep 17 00:00:00 2001 From: Richard Heck Date: Sat, 17 Jan 2009 00:16:31 +0000 Subject: [PATCH] Improve the display of BibTeX info in InsetCitation by retrieving missing fields from the crossref. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@28193 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/BiblioInfo.cpp | 65 ++++++++++++++++++++++++++++++++++++---------- src/BiblioInfo.h | 11 +++++++- 2 files changed, 61 insertions(+), 15 deletions(-) diff --git a/src/BiblioInfo.cpp b/src/BiblioInfo.cpp index 1e32445891..be8c369ab6 100644 --- a/src/BiblioInfo.cpp +++ b/src/BiblioInfo.cpp @@ -72,6 +72,16 @@ docstring const & BibTeXInfo::operator[](string const & field) const } +docstring BibTeXInfo::getValueForKey(string const & key, + BibTeXInfo const * const xref) const +{ + docstring const ret = operator[](key); + if (!ret.empty() or !xref) + return ret; + return (*xref)[key]; +} + + docstring familyName(docstring const & name) { if (name.empty()) @@ -174,6 +184,14 @@ docstring const BibTeXInfo::getYear() const } +docstring const BibTeXInfo::getXRef() const +{ + if (!is_bibtex_) + return docstring(); + return operator[]("crossref"); +} + + namespace { docstring convertLaTeXCommands(docstring const & str) @@ -274,7 +292,7 @@ namespace { } // anon namespace -docstring const BibTeXInfo::getInfo() const +docstring const BibTeXInfo::getInfo(BibTeXInfo const * const xref) const { if (!info_.empty()) return info_; @@ -290,31 +308,31 @@ docstring const BibTeXInfo::getInfo() const // field to customize the output based upon entry type. // Search for all possible "required" fields - docstring author = operator[]("author"); + docstring author = getValueForKey("author", xref); if (author.empty()) - author = operator[]("editor"); + author = getValueForKey("editor", xref); - docstring year = operator[]("year"); - docstring title = operator[]("title"); - docstring docLoc = operator[]("pages"); + docstring year = getValueForKey("year", xref); + docstring title = getValueForKey("title", xref); + docstring docLoc = getValueForKey("pages", xref); if (docLoc.empty()) { - docLoc = operator[]("chapter"); + docLoc = getValueForKey("chapter", xref); if (!docLoc.empty()) docLoc = from_ascii("Ch. ") + docLoc; } else { docLoc = from_ascii("pp. ") + docLoc; } - docstring media = operator[]("journal"); + docstring media = getValueForKey("journal", xref); if (media.empty()) { - media = operator[]("publisher"); + media = getValueForKey("publisher", xref); if (media.empty()) { - media = operator[]("school"); + media = getValueForKey("school", xref); if (media.empty()) - media = operator[]("institution"); + media = getValueForKey("institution"); } } - docstring volume = operator[]("volume"); + docstring volume = getValueForKey("volume", xref); odocstringstream result; if (!author.empty()) @@ -324,7 +342,7 @@ docstring const BibTeXInfo::getInfo() const if (!media.empty()) result << ", " << media; if (!year.empty()) - result << ", " << year; + result << " (" << year << ")"; if (!docLoc.empty()) result << ", " << docLoc; @@ -408,6 +426,18 @@ docstring const BiblioInfo::getYear(docstring const & key) const if (it == end()) return docstring(); BibTeXInfo const & data = it->second; + docstring year = data.getYear(); + if (!year.empty()) + return year; + // let's try the crossref + docstring const xref = data.getXRef(); + if (xref.empty()) + return year; // no luck + BiblioInfo::const_iterator const xrefit = find(xref); + if (xrefit == end()) + return year; // no luck again + BibTeXInfo const & xref_data = xrefit->second; + return xref_data.getYear(); return data.getYear(); } @@ -418,7 +448,14 @@ docstring const BiblioInfo::getInfo(docstring const & key) const if (it == end()) return docstring(); BibTeXInfo const & data = it->second; - return data.getInfo(); + BibTeXInfo const * xrefptr = 0; + docstring const xref = data.getXRef(); + if (!xref.empty()) { + BiblioInfo::const_iterator const xrefit = find(xref); + if (xrefit != end()) + xrefptr = &(xrefit->second); + } + return data.getInfo(xrefptr); } diff --git a/src/BiblioInfo.h b/src/BiblioInfo.h index f0a9b1180e..9ebc866ec6 100644 --- a/src/BiblioInfo.h +++ b/src/BiblioInfo.h @@ -59,8 +59,11 @@ public: docstring const getAbbreviatedAuthor() const; /// docstring const getYear() const; + /// + docstring const getXRef() const; /// \return formatted BibTeX data suitable for framing. - docstring const getInfo() const; + /// \param pointer to crossref information + docstring const getInfo(BibTeXInfo const * const xref = 0) const; /// int count(docstring const & f) const { return bimap_.count(f); } /// @@ -84,6 +87,9 @@ public: /// docstring entryType() const { return entry_type_; } private: + /// like operator[], except it will also check the given xref + docstring getValueForKey(std::string const & key, + BibTeXInfo const * const xref = 0) const; /// true if from BibTeX; false if from bibliography environment bool is_bibtex_; /// the BibTeX key for this entry @@ -114,9 +120,12 @@ public: /// \return the short form of an authorlist docstring const getAbbreviatedAuthor(docstring const & key) const; /// \return the year from the bibtex data record + /// Note that this will get the year from the crossref if it's + /// not present in the record itself docstring const getYear(docstring const & key) const; /// \return formatted BibTeX data associated with a given key. /// Empty if no info exists. + /// Note that this will retrieve data from the crossref as needed. docstring const getInfo(docstring const & key) const; /** * "Translates" the available Citation Styles into strings for a given key, -- 2.39.5