2007-08-14 16:50:51 +00:00
|
|
|
|
// -*- C++ -*-
|
|
|
|
|
/**
|
2007-08-20 17:04:36 +00:00
|
|
|
|
* \file BiblioInfo.h
|
2007-08-14 16:50:51 +00:00
|
|
|
|
* This file is part of LyX, the document processor.
|
|
|
|
|
* Licence details can be found in the file COPYING.
|
|
|
|
|
*
|
|
|
|
|
* \author Angus Leeming
|
|
|
|
|
* \author Herbert Vo<EFBFBD>
|
2007-08-20 16:30:02 +00:00
|
|
|
|
* \author Richard Heck
|
2007-08-14 16:50:51 +00:00
|
|
|
|
*
|
|
|
|
|
* Full author contact details are available in file CREDITS.
|
|
|
|
|
*/
|
|
|
|
|
|
2008-04-20 15:00:11 +00:00
|
|
|
|
#ifndef BIBLIOINFO_H
|
|
|
|
|
#define BIBLIOINFO_H
|
2007-08-14 16:50:51 +00:00
|
|
|
|
|
2007-08-20 16:30:02 +00:00
|
|
|
|
#include "support/docstring.h"
|
2007-08-14 16:50:51 +00:00
|
|
|
|
|
2008-04-20 15:00:11 +00:00
|
|
|
|
#include "Citation.h"
|
|
|
|
|
|
2007-08-14 16:50:51 +00:00
|
|
|
|
#include <vector>
|
2007-08-20 16:30:02 +00:00
|
|
|
|
#include <map>
|
|
|
|
|
#include <set>
|
|
|
|
|
|
2007-08-14 16:50:51 +00:00
|
|
|
|
|
|
|
|
|
namespace lyx {
|
|
|
|
|
|
2007-08-20 16:30:02 +00:00
|
|
|
|
class Buffer;
|
2007-08-14 16:50:51 +00:00
|
|
|
|
|
2008-04-20 15:00:11 +00:00
|
|
|
|
/// FIXME: To Citation.cpp?
|
2007-08-14 16:50:51 +00:00
|
|
|
|
/// Returns a vector of available Citation styles.
|
2008-04-20 15:00:11 +00:00
|
|
|
|
std::vector<CiteStyle> citeStyles(CiteEngine);
|
|
|
|
|
/// \param latex_str a LaTeX command, "cite", "Citep*", etc
|
|
|
|
|
CitationStyle citationStyleFromString(std::string const & latex_str);
|
2010-03-02 15:01:47 +00:00
|
|
|
|
/// the other way round
|
2008-04-20 15:00:11 +00:00
|
|
|
|
std::string citationStyleToString(CitationStyle const &);
|
2007-08-14 16:50:51 +00:00
|
|
|
|
|
|
|
|
|
|
2007-08-20 16:30:02 +00:00
|
|
|
|
/// Class to represent information about a BibTeX or
|
|
|
|
|
/// bibliography entry.
|
Backport r27635, r28193, r28194, r28220, r29094, and r29095. The point
of these, taken together, is to improve the display of information in
InsetCitation and GuiCitation, by gathering missing data from the
crossref, if one is defined, basically as BibTeX does.
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/branches/BRANCH_1_6_X@29312 a592a061-630c-0410-9148-cb99ea01b6c8
2009-04-18 15:29:36 +00:00
|
|
|
|
/// This class basically wraps a std::map, and many of its
|
|
|
|
|
/// methods simply delegate to the corresponding methods of
|
|
|
|
|
/// std::map.
|
2008-02-14 05:00:54 +00:00
|
|
|
|
class BibTeXInfo {
|
2007-08-20 16:30:02 +00:00
|
|
|
|
public:
|
|
|
|
|
///
|
2008-02-14 05:00:54 +00:00
|
|
|
|
typedef std::map<docstring, docstring>::const_iterator const_iterator;
|
2008-04-25 20:03:03 +00:00
|
|
|
|
///
|
|
|
|
|
BibTeXInfo() : is_bibtex_(true) {}
|
2008-02-14 05:00:54 +00:00
|
|
|
|
/// argument sets isBibTeX_, so should be false only if it's coming
|
|
|
|
|
/// from a bibliography environment
|
2008-04-25 20:03:03 +00:00
|
|
|
|
BibTeXInfo(bool ib) : is_bibtex_(ib) {}
|
2008-02-14 05:00:54 +00:00
|
|
|
|
/// constructor that sets the entryType
|
|
|
|
|
BibTeXInfo(docstring const & key, docstring const & type);
|
2007-08-20 16:30:02 +00:00
|
|
|
|
///
|
2010-02-13 08:40:10 +00:00
|
|
|
|
bool isBibtex() const { return is_bibtex_; }
|
|
|
|
|
///
|
2007-08-20 16:30:02 +00:00
|
|
|
|
bool hasField(docstring const & field) const;
|
|
|
|
|
/// return the short form of an authorlist
|
|
|
|
|
docstring const getAbbreviatedAuthor() const;
|
|
|
|
|
///
|
|
|
|
|
docstring const getYear() const;
|
Backport r27635, r28193, r28194, r28220, r29094, and r29095. The point
of these, taken together, is to improve the display of information in
InsetCitation and GuiCitation, by gathering missing data from the
crossref, if one is defined, basically as BibTeX does.
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/branches/BRANCH_1_6_X@29312 a592a061-630c-0410-9148-cb99ea01b6c8
2009-04-18 15:29:36 +00:00
|
|
|
|
///
|
|
|
|
|
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;
|
2008-02-14 05:00:54 +00:00
|
|
|
|
///
|
|
|
|
|
int count(docstring const & f) const { return bimap_.count(f); }
|
|
|
|
|
///
|
|
|
|
|
const_iterator find(docstring const & f) const { return bimap_.find(f); }
|
|
|
|
|
///
|
|
|
|
|
const_iterator end() const { return bimap_.end(); }
|
Backport r27635, r28193, r28194, r28220, r29094, and r29095. The point
of these, taken together, is to improve the display of information in
InsetCitation and GuiCitation, by gathering missing data from the
crossref, if one is defined, basically as BibTeX does.
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/branches/BRANCH_1_6_X@29312 a592a061-630c-0410-9148-cb99ea01b6c8
2009-04-18 15:29:36 +00:00
|
|
|
|
/// \return value for field f
|
|
|
|
|
/// note that this will create an empty field if it does not exist
|
2008-02-14 05:00:54 +00:00
|
|
|
|
docstring & operator[](docstring const & f)
|
|
|
|
|
{ return bimap_[f]; }
|
Backport r27635, r28193, r28194, r28220, r29094, and r29095. The point
of these, taken together, is to improve the display of information in
InsetCitation and GuiCitation, by gathering missing data from the
crossref, if one is defined, basically as BibTeX does.
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/branches/BRANCH_1_6_X@29312 a592a061-630c-0410-9148-cb99ea01b6c8
2009-04-18 15:29:36 +00:00
|
|
|
|
/// \return value for field f
|
|
|
|
|
/// this one, since it is const, will simply return docstring() if
|
|
|
|
|
/// we don't have the field and will NOT create an empty field
|
|
|
|
|
docstring const & operator[](docstring const & field) const;
|
|
|
|
|
///
|
|
|
|
|
docstring const & operator[](std::string const & field) const;
|
2008-02-14 05:00:54 +00:00
|
|
|
|
///
|
2008-02-14 17:00:40 +00:00
|
|
|
|
docstring const & allData() const { return all_data_; }
|
2008-02-14 05:00:54 +00:00
|
|
|
|
///
|
2008-02-14 17:00:40 +00:00
|
|
|
|
void setAllData(docstring const & d) { all_data_ = d; }
|
2008-02-14 05:00:54 +00:00
|
|
|
|
///
|
2008-02-14 17:00:40 +00:00
|
|
|
|
docstring entryType() const { return entry_type_; }
|
2008-02-14 05:00:54 +00:00
|
|
|
|
private:
|
Backport r27635, r28193, r28194, r28220, r29094, and r29095. The point
of these, taken together, is to improve the display of information in
InsetCitation and GuiCitation, by gathering missing data from the
crossref, if one is defined, basically as BibTeX does.
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/branches/BRANCH_1_6_X@29312 a592a061-630c-0410-9148-cb99ea01b6c8
2009-04-18 15:29:36 +00:00
|
|
|
|
/// like operator[], except it will also check the given xref
|
|
|
|
|
docstring getValueForKey(std::string const & key,
|
|
|
|
|
BibTeXInfo const * const xref = 0) const;
|
2008-02-14 05:14:22 +00:00
|
|
|
|
/// true if from BibTeX; false if from bibliography environment
|
2008-02-14 17:00:40 +00:00
|
|
|
|
bool is_bibtex_;
|
2007-08-20 16:30:02 +00:00
|
|
|
|
/// the BibTeX key for this entry
|
2008-02-14 17:00:40 +00:00
|
|
|
|
docstring bib_key_;
|
2007-08-20 16:30:02 +00:00
|
|
|
|
/// a single string containing all BibTeX data associated with this key
|
2008-02-14 17:00:40 +00:00
|
|
|
|
docstring all_data_;
|
2007-08-20 16:30:02 +00:00
|
|
|
|
/// the BibTeX entry type (article, book, incollection, ...)
|
2008-02-14 17:00:40 +00:00
|
|
|
|
docstring entry_type_;
|
2009-01-17 15:55:32 +00:00
|
|
|
|
/// a cache for getInfo()
|
|
|
|
|
mutable docstring info_;
|
2008-02-14 05:00:54 +00:00
|
|
|
|
/// our map: <field, value>
|
|
|
|
|
std::map <docstring, docstring> bimap_;
|
2007-08-20 16:30:02 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// Class to represent a collection of bibliographical data, whether
|
|
|
|
|
/// from BibTeX or from bibliography environments.
|
2008-02-14 05:14:22 +00:00
|
|
|
|
class BiblioInfo {
|
2007-08-20 16:30:02 +00:00
|
|
|
|
public:
|
2008-11-19 16:39:16 +00:00
|
|
|
|
/// bibliography key --> data for that key
|
2008-02-14 05:14:22 +00:00
|
|
|
|
typedef std::map<docstring, BibTeXInfo>::const_iterator const_iterator;
|
2007-08-20 16:30:02 +00:00
|
|
|
|
/// Returns a sorted vector of bibliography keys
|
|
|
|
|
std::vector<docstring> const getKeys() const;
|
|
|
|
|
/// Returns a sorted vector of present BibTeX fields
|
|
|
|
|
std::vector<docstring> const getFields() const;
|
|
|
|
|
/// Returns a sorted vector of BibTeX entry types in use
|
|
|
|
|
std::vector<docstring> 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
|
Backport r27635, r28193, r28194, r28220, r29094, and r29095. The point
of these, taken together, is to improve the display of information in
InsetCitation and GuiCitation, by gathering missing data from the
crossref, if one is defined, basically as BibTeX does.
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/branches/BRANCH_1_6_X@29312 a592a061-630c-0410-9148-cb99ea01b6c8
2009-04-18 15:29:36 +00:00
|
|
|
|
/// Note that this will get the year from the crossref if it's
|
|
|
|
|
/// not present in the record itself
|
2007-08-20 16:30:02 +00:00
|
|
|
|
docstring const getYear(docstring const & key) const;
|
|
|
|
|
/// Returns formatted BibTeX data associated with a given key.
|
|
|
|
|
/// Empty if no info exists.
|
Backport r27635, r28193, r28194, r28220, r29094, and r29095. The point
of these, taken together, is to improve the display of information in
InsetCitation and GuiCitation, by gathering missing data from the
crossref, if one is defined, basically as BibTeX does.
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/branches/BRANCH_1_6_X@29312 a592a061-630c-0410-9148-cb99ea01b6c8
2009-04-18 15:29:36 +00:00
|
|
|
|
/// Note that this will retrieve data from the crossref as needed.
|
2007-08-20 16:30:02 +00:00
|
|
|
|
docstring const getInfo(docstring const & key) const;
|
2010-02-13 08:40:10 +00:00
|
|
|
|
/// Is this a reference from a bibtex database
|
|
|
|
|
/// or from a bibliography environment?
|
2010-03-02 15:13:00 +00:00
|
|
|
|
bool isBibtex(docstring const & key) const;
|
2007-08-20 16:30:02 +00:00
|
|
|
|
|
|
|
|
|
/**
|
2008-02-14 05:14:22 +00:00
|
|
|
|
* "Translates" the available Citation Styles into strings for a given key,
|
2007-08-20 16:30:02 +00:00
|
|
|
|
* either numerical or author-year depending upon the active engine. (See
|
|
|
|
|
* below for those methods.)
|
|
|
|
|
*/
|
2007-08-14 16:50:51 +00:00
|
|
|
|
std::vector<docstring> const
|
2007-08-20 16:30:02 +00:00
|
|
|
|
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<docstring> 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
|
|
|
|
|
*/
|
2007-08-14 16:50:51 +00:00
|
|
|
|
std::vector<docstring> const
|
2007-08-20 16:30:02 +00:00
|
|
|
|
getAuthorYearStrings(docstring const & key, Buffer const & buf) const;
|
2008-02-14 05:14:22 +00:00
|
|
|
|
///
|
|
|
|
|
const_iterator begin() const { return bimap_.begin(); }
|
|
|
|
|
///
|
|
|
|
|
void clear() { bimap_.clear(); }
|
|
|
|
|
///
|
|
|
|
|
bool empty() const { return bimap_.empty(); }
|
|
|
|
|
///
|
|
|
|
|
const_iterator end() const { return bimap_.end(); }
|
|
|
|
|
///
|
|
|
|
|
const_iterator find(docstring const & f) const { return bimap_.find(f); }
|
|
|
|
|
///
|
2008-04-25 20:03:03 +00:00
|
|
|
|
void mergeBiblioInfo(BiblioInfo const & info);
|
|
|
|
|
///
|
2008-02-14 05:14:22 +00:00
|
|
|
|
BibTeXInfo & operator[](docstring const & f) { return bimap_[f]; }
|
|
|
|
|
///
|
2008-02-14 17:00:40 +00:00
|
|
|
|
void addFieldName(docstring const & f) { field_names_.insert(f); }
|
2008-02-14 05:14:22 +00:00
|
|
|
|
///
|
2008-02-14 17:00:40 +00:00
|
|
|
|
void addEntryType(docstring const & f) { entry_types_.insert(f); }
|
2008-02-14 05:14:22 +00:00
|
|
|
|
private:
|
2008-02-14 05:28:59 +00:00
|
|
|
|
///
|
2008-02-14 17:00:40 +00:00
|
|
|
|
std::set<docstring> field_names_;
|
2008-02-14 05:28:59 +00:00
|
|
|
|
///
|
2008-02-14 17:00:40 +00:00
|
|
|
|
std::set<docstring> entry_types_;
|
2008-02-14 05:28:59 +00:00
|
|
|
|
/// our map: keys --> BibTeXInfo
|
|
|
|
|
std::map<docstring, BibTeXInfo> bimap_;
|
2007-08-20 16:30:02 +00:00
|
|
|
|
};
|
2007-08-14 16:50:51 +00:00
|
|
|
|
|
|
|
|
|
} // namespace lyx
|
2008-04-20 15:00:11 +00:00
|
|
|
|
|
|
|
|
|
#endif // BIBLIOINFO_H
|