X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBiblioInfo.h;h=efe4bff233948d61e5785959e87a0f2815bd320f;hb=c393abbe12c360eec07a3dcbb5929e6b7c0ad329;hp=9ebc866ec6df84d2dda218f4ccc39a2fba1a074c;hpb=32950f6c6ca3b556357fd70ae0a3edbad443f86e;p=lyx.git diff --git a/src/BiblioInfo.h b/src/BiblioInfo.h index 9ebc866ec6..efe4bff233 100644 --- a/src/BiblioInfo.h +++ b/src/BiblioInfo.h @@ -53,8 +53,6 @@ public: BibTeXInfo(bool ib) : is_bibtex_(ib) {} /// constructor that sets the entryType BibTeXInfo(docstring const & key, docstring const & type); - /// - bool hasField(docstring const & field) const; /// \return the short form of an authorlist docstring const getAbbreviatedAuthor() const; /// @@ -63,9 +61,8 @@ public: docstring const getXRef() const; /// \return formatted BibTeX data suitable for framing. /// \param pointer to crossref information - docstring const getInfo(BibTeXInfo const * const xref = 0) const; - /// - int count(docstring const & f) const { return bimap_.count(f); } + docstring const & getInfo(BibTeXInfo const * const xref, + Buffer const & buf, bool richtext) const; /// const_iterator find(docstring const & f) const { return bimap_.find(f); } /// @@ -85,21 +82,66 @@ public: /// void setAllData(docstring const & d) { all_data_ = d; } /// + void label(docstring const & d) { label_= d; } + /// + docstring const & label() const { return label_; } + /// + docstring const & key() const { return bib_key_; } + /// numerical key for citing this entry. currently used only + /// by XHTML output routines. + docstring citeNumber() const { return cite_number_; } + /// + void setCiteNumber(docstring const & num) { cite_number_ = num; } + /// a,b,c, etc, for author-year. currently used only by XHTML + /// output routines. + char modifier() const { return modifier_; } + /// + void setModifier(char c) { modifier_ = c; } + /// docstring entryType() const { return entry_type_; } + /// + bool isBibTeX() const { return is_bibtex_; } private: - /// like operator[], except it will also check the given xref + /// like operator[], except, if the field is empty, it will attempt + /// to get the data from xref BibTeXInfo object, which would normally + /// be the one referenced in the crossref field. docstring getValueForKey(std::string const & key, BibTeXInfo const * const xref = 0) const; + /// replace %keys% in a format string with their values + /// called from getInfo() + /// format strings may contain: + /// %key%, which represents a key + /// {%key%[[format]]}, which prints format if key is non-empty + /// the latter may optionally contain an `else' clause as well: + /// {%key%[[if format]][[else format]]} + /// material intended only for rich text (HTML) output should be + /// wrapped in "{!" and "!}". it will be removed if richtext is + /// false. + /// a simple macro facility is also available. keys that look like + /// "%!key%" are substituted with their definition. + /// moreover, keys that look like "%_key%" are treated as translatable + /// so that things like "pp." and "vol." can be translated. + docstring expandFormat(std::string const & fmt, + BibTeXInfo const * const xref, int & counter, + Buffer const & buf, bool richtext) const; /// true if from BibTeX; false if from bibliography environment bool is_bibtex_; /// the BibTeX key for this entry docstring bib_key_; + /// the label that will appear in citations + /// this is easily set from bibliography environments, but has + /// to be calculated for entries we get from BibTeX + docstring label_; /// a single string containing all BibTeX data associated with this key docstring all_data_; /// the BibTeX entry type (article, book, incollection, ...) docstring entry_type_; /// a cache for getInfo() mutable docstring info_; + /// + docstring cite_number_; + /// + char modifier_; /// our map: std::map bimap_; }; @@ -119,14 +161,25 @@ public: std::vector const getEntries() const; /// \return the short form of an authorlist docstring const getAbbreviatedAuthor(docstring const & key) const; - /// \return the year from the bibtex data record + /// \return the year from the bibtex data record for \param key + /// if \param use_modifier is true, then we will also append any + /// modifier for this entry (e.g., 1998b). /// 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; + /// not present in the record itself. + docstring const getYear(docstring const & key, + bool use_modifier = false) const; + /// + docstring const getCiteNumber(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; + /// If \param richtext is true, then it will output any richtext tags + /// marked in the citation format and escape < and > elsewhere. + docstring const getInfo(docstring const & key, Buffer const & buf, + bool richtext = false) const; + /// Is this a reference from a bibtex database + /// or from a bibliography environment? + bool isBibtex(docstring const & key) const; /** * "Translates" the available Citation Styles into strings for a given key, * either numerical or author-year depending upon the active engine. (See @@ -156,6 +209,16 @@ 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. + /// Make sure you have called collectCitedEntries() before you try to + /// use this. You should probably call it just before you use this. + std::vector const & citedEntries() const + { return cited_entries_; } + /// + void makeCitationLabels(Buffer const & buf); /// const_iterator begin() const { return bimap_.begin(); } /// @@ -181,6 +244,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