X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBiblioInfo.h;h=f4051bf2251a7b526d0de0306bdae7971e1db753;hb=5d96ee69eb9173779932575cb6d6ce70db9860b9;hp=43b949a6e45dc3e3b8939b2e44908e0285a16502;hpb=fb84ccd9fb8fbe1eeb764580964a333acb2e6c0d;p=lyx.git diff --git a/src/BiblioInfo.h b/src/BiblioInfo.h index 43b949a6e4..f4051bf225 100644 --- a/src/BiblioInfo.h +++ b/src/BiblioInfo.h @@ -6,7 +6,7 @@ * * \author Angus Leeming * \author Herbert Voß - * \author Richard Heck + * \author Richard Kimberly Heck * \author Julien Rioux * * Full author contact details are available in file CREDITS. @@ -17,8 +17,6 @@ #include "support/docstring.h" -#include "Citation.h" - #include #include #include @@ -27,11 +25,19 @@ namespace lyx { class Buffer; +class BufferParams; +class CitationStyle; +class CiteItem; +class XMLStream; /// \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); + +/// Transforms the information about authors into a (directly written to a XMLStream). +docstring authorsToDocBookAuthorGroup(docstring const & authorsString, XMLStream & xs, Buffer const & buf); /// Class to represent information about a BibTeX or @@ -45,30 +51,37 @@ public: /// and the values are the associated field values. typedef std::map::const_iterator const_iterator; /// - BibTeXInfo() : is_bibtex_(true), modifier_(0) {} + typedef std::vector const BibTeXInfoList; + /// + BibTeXInfo() : is_bibtex_(true), num_bib_key_(0), modifier_(0) {} /// argument sets isBibTeX_, so should be false only if it's coming /// from a bibliography environment - BibTeXInfo(bool ib) : is_bibtex_(ib), modifier_(0) {} + BibTeXInfo(bool ib) : is_bibtex_(ib), num_bib_key_(0), modifier_(0) {} /// constructor that sets the entryType BibTeXInfo(docstring const & key, docstring const & type); - /// \return the short form of an authorlist, used for sorting - /// this will be translated to the UI language if buf is null + /// \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 getAbbreviatedAuthor( - Buffer const * buf = 0, bool jurabib_style = false) const; + docstring const getAuthorOrEditorList(Buffer const * buf = nullptr, + 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 getYear() const; /// - docstring const getXRef() const; + void getLocators(docstring & doi, docstring & url, docstring & file) const; /// \return formatted BibTeX data suitable for framing. - /// \param pointer to crossref information - docstring const & getInfo(BibTeXInfo const * const xref, - Buffer const & buf, bool richtext) const; + /// \param vector of pointers to crossref/xdata information + docstring const & getInfo(BibTeXInfoList const & xrefs, + Buffer const & buf, CiteItem const & ci, + docstring const & format = docstring()) const; /// \return formatted BibTeX data for a citation label - docstring const getLabel(BibTeXInfo const * const xref, - Buffer const & buf, docstring const & format, bool richtext, - const docstring & before, const docstring & after, - const docstring & dialog, bool next = false) const; + 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); } /// @@ -91,6 +104,9 @@ public: void label(docstring const & d) { label_= d; } /// void key(docstring const & d) { bib_key_= d; } + /// Record the number of occurences of the same key + /// (duplicates are allowed with qualified citation lists) + void numKey(int const i) { num_bib_key_ = i; } /// docstring const & label() const { return label_; } /// @@ -111,11 +127,10 @@ public: 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. + /// 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, - docstring const & before, docstring const & after, docstring const & dialog, - BibTeXInfo const * const xref, size_t maxsize = 4096) const; + 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: @@ -133,14 +148,15 @@ private: /// 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, - BibTeXInfo const * const xref, int & counter, - Buffer const & buf, docstring before = docstring(), - docstring after = docstring(), docstring dialog = docstring(), - bool next = false) const; + 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 docstring bib_key_; + /// Number of occurences of the same key + int num_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 @@ -153,6 +169,8 @@ private: mutable docstring info_; /// a cache for getInfo(richtext = true) mutable docstring info_richtext_; + /// cache for last format pattern + mutable docstring format_; /// docstring cite_number_; /// @@ -166,57 +184,73 @@ 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, Buffer const & buf) 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). - /// 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. /// 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; + /// get either local pdf or web location of the citation referenced by key. + /// DOI/file are prefixed so they form proper URL for generic qt handler + void getLocators(docstring const & key, docstring & doi, docstring & url, docstring & file) 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. - /// If \param richtext is true, then it will output any richtext tags - /// marked in the citation format and escape < and > elsewhere. + /// 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, - bool richtext = false) const; + CiteItem const & ci, docstring const & format = docstring()) 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, bool for_xhtml, - size_t max_size, docstring const & before, docstring const & after, - docstring const & dialog = docstring()) const; + 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 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. - std::vector const getCiteStrings(std::vector const & keys, + /// 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, - docstring const & before, docstring const & after, docstring const & dialog, - size_t max_size) const; + 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