3 * \file CiteEnginesList.cpp
4 * This file is part of LyX, the document processor.
5 * Licence details can be found in the file COPYING.
8 * \author Jürgen Spitzmüller
10 * Full author contact details are available in file CREDITS.
15 #include "CiteEnginesList.h"
18 #include "LaTeXFeatures.h"
21 #include "support/debug.h"
22 #include "support/FileName.h"
23 #include "support/gettext.h"
24 #include "support/filetools.h"
25 #include "support/lstrings.h"
26 #include "support/Translator.h"
31 using namespace lyx::support;
36 //global variable: cite engine list
37 CiteEnginesList theCiteEnginesList;
40 LyXCiteEngine::LyXCiteEngine(string const & n, string const & i,
41 vector<string> const & cet, string const & cfm,
42 vector<string> const & dbs,
43 string const & d, vector<string> const & p,
44 vector<string> const & r, vector<string> const & e):
45 name_(n), id_(i), engine_types_(cet), cite_framework_(cfm), default_biblios_(dbs),
46 description_(d), package_list_(p), required_engines_(r), excluded_engines_(e),
47 checked_(false), available_(false)
49 filename_ = id_ + ".citeengine";
53 vector<string> LyXCiteEngine::prerequisites() const
57 return prerequisites_;
61 bool LyXCiteEngine::isAvailable() const
63 if (package_list_.empty())
69 //check whether all of the required packages are available
70 vector<string>::const_iterator it = package_list_.begin();
71 vector<string>::const_iterator end = package_list_.end();
72 for (; it != end; ++it) {
73 if (!LaTeXFeatures::isAvailable(*it)) {
75 prerequisites_.push_back(*it);
82 bool LyXCiteEngine::hasEngineType(CiteEngineType const & et) const
84 return std::find(engine_types_.begin(), engine_types_.end(),
85 theCiteEnginesList.getTypeAsString(et)) != engine_types_.end();
89 bool LyXCiteEngine::isCompatible(string const & cename) const
92 if (find(excluded_engines_.begin(), excluded_engines_.end(), cename) !=
93 excluded_engines_.end())
96 LyXCiteEngine const * const lm = theCiteEnginesList[cename];
100 // does it exclude us?
101 vector<string> const excengs = lm->getExcludedEngines();
102 if (find(excengs.begin(), excengs.end(), id_) != excengs.end())
109 bool LyXCiteEngine::areCompatible(string const & eng1, string const & eng2)
111 LyXCiteEngine const * const lm1 = theCiteEnginesList[eng1];
113 return lm1->isCompatible(eng2);
114 LyXCiteEngine const * const lm2 = theCiteEnginesList[eng2];
116 return lm2->isCompatible(eng1);
117 // Can't check it either way.
122 string LyXCiteEngine::getDefaultBiblio(CiteEngineType const & cet) const
125 string const etp = theCiteEnginesList.getTypeAsString(cet) + ":";
126 //check whether all of the required packages are available
127 for (string const &s: default_biblios_) {
128 if (prefixIs(s, etp))
130 else if (!contains(s, ':') && res.empty())
137 bool LyXCiteEngine::isDefaultBiblio(string const & bf) const
139 string const bfs = ":" + bf;
140 for (string const &s: default_biblios_)
141 if (suffixIs(s, bfs) || bf == s)
148 // used when sorting the cite engine list.
151 int operator()(LyXCiteEngine const & ce1, LyXCiteEngine const & ce2) const
153 return _(ce1.getName()) < _(ce2.getName());
161 typedef Translator<string, CiteEngineType> CiteEngineTypeTranslator;
164 CiteEngineTypeTranslator const init_citeenginetypetranslator()
166 CiteEngineTypeTranslator translator("authoryear", ENGINE_TYPE_AUTHORYEAR);
167 translator.addPair("numerical", ENGINE_TYPE_NUMERICAL);
168 translator.addPair("default", ENGINE_TYPE_DEFAULT);
173 CiteEngineTypeTranslator const & citeenginetypetranslator()
175 static CiteEngineTypeTranslator const translator =
176 init_citeenginetypetranslator();
183 string CiteEnginesList::getTypeAsString(CiteEngineType const & et) const
185 return citeenginetypetranslator().find(et);
189 CiteEngineType CiteEnginesList::getType(string const & et) const
191 return citeenginetypetranslator().find(et);
195 // Much of this is borrowed from LayoutFileList::read()
196 bool CiteEnginesList::read()
198 FileName const real_file = libFileSearch("", "lyxciteengines.lst");
199 LYXERR(Debug::TCLASS, "Reading cite engines from `" << real_file << '\'');
201 if (real_file.empty()) {
202 LYXERR0("unable to find cite engines file `citeengines.lst'.\n"
203 << "No cite engines will be available.");
208 if (!lex.setFile(real_file)) {
209 LYXERR0("lyxlex was not able to set file: "
210 << real_file << ".\nNo cite engines will be available.");
215 LYXERR0("unable to open cite engines file `"
216 << to_utf8(makeDisplayPath(real_file.absFileName(), 1000))
217 << "'\nNo cite engines will be available.");
221 bool finished = false;
222 // Parse cite engines files
223 LYXERR(Debug::TCLASS, "Starting parsing of lyxciteengines.lst");
224 while (lex.isOK() && !finished) {
225 LYXERR(Debug::TCLASS, "\tline by line");
227 case Lexer::LEX_FEOF:
231 string const cename = lex.getString();
232 LYXERR(Debug::TCLASS, "Engine name: " << cename);
235 string const fname = lex.getString();
236 LYXERR(Debug::TCLASS, "Filename: " << fname);
239 string cet = lex.getString();
240 LYXERR(Debug::TCLASS, "Engine Type: " << cet);
242 while (!cet.empty()) {
244 cet = split(cet, p, '|');
249 string const citeframework = lex.getString();
250 LYXERR(Debug::TCLASS, "CiteFramework: " << citeframework);
253 string db = lex.getString();
254 LYXERR(Debug::TCLASS, "Default Biblio: " << db);
256 while (!db.empty()) {
258 db = split(db, p, '|');
263 string const desc = lex.getString();
264 LYXERR(Debug::TCLASS, "Description: " << desc);
268 string str = lex.getString();
269 LYXERR(Debug::TCLASS, "Packages: " << str);
271 while (!str.empty()) {
273 str = split(str, p, ',');
278 str = lex.getString();
279 LYXERR(Debug::TCLASS, "Required: " << str);
281 while (!str.empty()) {
283 str = split(str, p, '|');
288 str = lex.getString();
289 LYXERR(Debug::TCLASS, "Excluded: " << str);
291 while (!str.empty()) {
293 str = split(str, p, '|');
296 // This code is run when we have
297 // cename, fname, desc, pkgs, req and exc
298 addCiteEngine(cename, fname, cets, citeframework, dbs, desc, pkgs, req, exc);
302 LYXERR(Debug::TCLASS, "End of parsing of lyxciteengines.lst");
304 if (!theCiteEnginesList.empty())
305 sort(theCiteEnginesList.begin(), theCiteEnginesList.end(), EngineSorter());
310 void CiteEnginesList::addCiteEngine(string const & cename,
311 string const & filename, vector<string> const & cets,
312 string const & citeframework, vector<string> const & dbs,
313 string const & description, vector<string> const & pkgs,
314 vector<string> const & req, vector<string> const & exc)
316 LyXCiteEngine ce(cename, filename, cets, citeframework, dbs, description, pkgs, req, exc);
317 englist_.push_back(ce);
321 LyXCiteEnginesList::const_iterator CiteEnginesList::begin() const
323 return englist_.begin();
327 LyXCiteEnginesList::iterator CiteEnginesList::begin()
329 return englist_.begin();
333 LyXCiteEnginesList::const_iterator CiteEnginesList::end() const
335 return englist_.end();
339 LyXCiteEnginesList::iterator CiteEnginesList::end()
341 return englist_.end();
345 LyXCiteEngine const * CiteEnginesList::operator[](string const & str) const
347 LyXCiteEnginesList::const_iterator it = englist_.begin();
348 for (; it != englist_.end(); ++it)
349 if (it->getID() == str) {
350 LyXCiteEngine const & eng = *it;
357 LyXCiteEngine * CiteEnginesList::operator[](string const & str)
359 LyXCiteEnginesList::iterator it = englist_.begin();
360 for (; it != englist_.end(); ++it)
361 if (it->getID() == str) {
362 LyXCiteEngine & eng = *it;