X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBiblioInfo.h;h=162cad19f283b7a1c11a67eff529bae4d33e49b8;hb=28be7d552f62cc02fa86d7f79201d089bfb2d7b5;hp=394d9c416bace03349ef6abd72a196b3079858ba;hpb=ce349ad806dd713777e48bd0c10ee5270077a09a;p=lyx.git diff --git a/src/BiblioInfo.h b/src/BiblioInfo.h index 394d9c416b..162cad19f2 100644 --- a/src/BiblioInfo.h +++ b/src/BiblioInfo.h @@ -7,6 +7,7 @@ * \author Angus Leeming * \author Herbert Voß * \author Richard Heck + * \author Julien Rioux * * Full author contact details are available in file CREDITS. */ @@ -16,24 +17,23 @@ #include "support/docstring.h" +#include "BufferParams.h" #include "Citation.h" -#include #include #include +#include namespace lyx { - + class Buffer; -/// FIXME: To Citation.cpp? -/// Returns a vector of available Citation styles. -std::vector citeStyles(CiteEngine); /// \param latex_str a LaTeX command, "cite", "Citep*", etc -CitationStyle citationStyleFromString(std::string const & latex_str); +CitationStyle citationStyleFromString(std::string const & latex_str, + BufferParams const &); /// the other way round -std::string citationStyleToString(CitationStyle const &); +std::string citationStyleToString(CitationStyle const &, bool const latex = false); /// Class to represent information about a BibTeX or @@ -43,32 +43,45 @@ std::string citationStyleToString(CitationStyle const &); /// std::map. class BibTeXInfo { public: - /// The keys are BibTeX fields (e.g., author, title, etc), + /// The keys are BibTeX fields (e.g., author, title, etc), /// and the values are the associated field values. typedef std::map::const_iterator const_iterator; /// - BibTeXInfo() : is_bibtex_(true) {} + typedef std::vector const BibTeXInfoList; + /// + BibTeXInfo() : is_bibtex_(true), modifier_(0) {} /// argument sets isBibTeX_, so should be false only if it's coming /// from a bibliography environment - BibTeXInfo(bool ib) : is_bibtex_(ib) {} + BibTeXInfo(bool ib) : is_bibtex_(ib), modifier_(0) {} /// constructor that sets the entryType BibTeXInfo(docstring const & key, docstring const & type); - /// \return the short form of an authorlist - docstring const getAbbreviatedAuthor() const; - /// - docstring const getYear() const; + /// \return an author or editor list (short form by default), + /// used for sorting. + /// This will be translated to the UI language if buf is null + /// otherwise, it will be translated to the buffer language. + docstring const getAuthorOrEditorList(Buffer const * buf = 0, + bool full = false, bool forceshort = false) const; + /// Same for a specific author role (editor, author etc.) + docstring const getAuthorList(Buffer const * buf, docstring const & author, + bool const full = false, bool const forceshort = false, + bool const allnames = false, bool const beginning = true) const; /// - docstring const getXRef() const; + docstring const getYear() const; /// \return formatted BibTeX data suitable for framing. - /// \param pointer to crossref information - docstring const & getInfo(BibTeXInfo const * const xref = 0) const; + /// \param vector of pointers to crossref/xdata information + docstring const & getInfo(BibTeXInfoList const xrefs, + Buffer const & buf, CiteItem const & ci) const; + /// \return formatted BibTeX data for a citation label + docstring const getLabel(BibTeXInfoList const xrefs, + Buffer const & buf, docstring const & format, + CiteItem const & ci, bool next = false, bool second = false) const; /// const_iterator find(docstring const & f) const { return bimap_.find(f); } /// const_iterator end() const { return bimap_.end(); } /// \return value for field f /// note that this will create an empty field if it does not exist - docstring & operator[](docstring const & f) + docstring & operator[](docstring const & f) { return bimap_[f]; } /// \return value for field f /// this one, since it is const, will simply return docstring() if @@ -83,6 +96,8 @@ public: /// void label(docstring const & d) { label_= d; } /// + void key(docstring const & d) { bib_key_= d; } + /// docstring const & label() const { return label_; } /// docstring const & key() const { return bib_key_; } @@ -91,21 +106,41 @@ public: 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 + /// 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, 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; + /// to get the data from xref BibTeXInfo objects, which would normally + /// be the one referenced in the crossref or xdata field. + docstring getValueForKey(std::string const & key, Buffer const & buf, + CiteItem const & ci, BibTeXInfoList const xrefs, size_t maxsize = 4096) 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 "!}". These markers are to be postprocessed + /// by processRichtext(); this step is left as a separate routine since + /// expandFormat() is recursive while postprocessing should be done + /// only once on the final string (just like convertLaTeXCommands). + /// 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(docstring const & fmt, + BibTeXInfoList const xrefs, int & counter, + Buffer const & buf, CiteItem const & ci, + bool next = false, bool second = false) const; /// true if from BibTeX; false if from bibliography environment bool is_bibtex_; /// the BibTeX key for this entry @@ -120,7 +155,9 @@ private: docstring entry_type_; /// a cache for getInfo() mutable docstring info_; - /// + /// a cache for getInfo(richtext = true) + mutable docstring info_richtext_; + /// docstring cite_number_; /// char modifier_; @@ -133,68 +170,75 @@ private: /// from BibTeX or from bibliography environments. class BiblioInfo { public: + /// + typedef std::vector BibTeXInfoList; /// bibliography key --> data for that key typedef std::map::const_iterator const_iterator; + /// Get a vector with all external data (crossref, xdata) + std::vector const getXRefs(BibTeXInfo const & data, + bool const nested = false) const; /// \return a sorted vector of bibliography keys std::vector const getKeys() const; /// \return a sorted vector of present BibTeX fields std::vector const getFields() const; /// \return a sorted vector of BibTeX entry types in use std::vector const getEntries() const; - /// \return the short form of an authorlist - docstring const getAbbreviatedAuthor(docstring const & key) const; + /// \return author or editor list (abbreviated form by default) + docstring const getAuthorOrEditorList(docstring const & key, Buffer const & buf) const; /// \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. + /// If no legacy year field is present, check for date (common in + /// biblatex) and extract the year from there. + /// Note further that this will get the year from the crossref or xdata + /// if it's not present in the record itself. docstring const getYear(docstring const & key, bool use_modifier = false) const; + /// \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). + /// If no legacy year field is present, check for date (common in + /// biblatex) and extract the year from there. + /// Note further that this will get the year from the crossref or xdata + /// if it's not present in the record itself. + /// If no year is found, \return "No year" translated to the buffer + /// language. + docstring const getYear(docstring const & key, Buffer const & buf, + 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; + /// Empty if no info exists. + /// Note that this will retrieve data from the crossref or xdata as needed. + /// \param ci contains further context information, such as if it should + /// output any richtext tags marked in the citation format and escape < and > + /// elsewhere, and the general output context. + docstring const getInfo(docstring const & key, Buffer const & buf, + CiteItem const & ci) const; + /// \return formatted BibTeX data for citation labels. + /// Citation labels can have more than one key. + docstring const getLabel(std::vector keys, Buffer const & buf, + std::string const & style, CiteItem const & ci) const; /// Is this a reference from a bibtex database /// or from a bibliography environment? - bool const 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 - * below for those methods.) - */ - std::vector const - getCiteStrings(docstring const & key, Buffer const & buf) const; - /** - * "Translates" the available Citation Styles into strings for a given key. - * The returned string is displayed by the GUI. - * [XX] is used in place of the actual reference - * Eg, the vector will contain: [XX], Jones et al. [XX], ... - * User supplies : - * the key, - * the buffer - */ - std::vector const - getNumericalStrings(docstring const & key, Buffer const & buf) const; - /** - * "Translates" the available Citation Styles into strings for a given key. - * The returned string is displayed by the GUI. - * Eg, the vector will contain: - * Jones et al. (1990), (Jones et al. 1990), Jones et al. 1990, ... - * User supplies : - * the key, - * the buffer - */ - std::vector const - getAuthorYearStrings(docstring const & key, Buffer const & buf) const; - /// Collects the cited entries from buf. - void collectCitedEntries(Buffer const & buf); + bool isBibtex(docstring const & key) const; + /// A vector holding a pair of lyx cite command and the respective + /// output for a given (list of) key(s). + typedef std::vector> CiteStringMap; + /// Translates the available citation styles into strings for a given + /// list of keys, using either numerical or author-year style depending + /// upon the active engine. The function returns a CiteStringMap with the first + /// element being the lyx cite command, the second being the formatted + /// citation reference. + CiteStringMap const getCiteStrings( + std::vector const & keys, + std::vector const & styles, Buffer const & buf, + CiteItem const & ci) const; /// 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 + /// 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 + std::vector const & citedEntries() const { return cited_entries_; } /// void makeCitationLabels(Buffer const & buf); @@ -217,6 +261,8 @@ public: /// void addEntryType(docstring const & f) { entry_types_.insert(f); } private: + /// Collects the cited entries from buf. + void collectCitedEntries(Buffer const & buf); /// std::set field_names_; /// @@ -225,7 +271,7 @@ private: 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. + /// the sort, because reloads will invalidate those pointers. std::vector cited_entries_; };