X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FModuleList.cpp;h=14e2917159bddeeea7fb184ad714221ed823c6a5;hb=6c977615633e5e132494b9a7fa778588210f9c95;hp=4ca14964a5008d655d5d04cb84b5410805647934;hpb=8a947f63da25582224d20b29fadba6128f271555;p=lyx.git diff --git a/src/ModuleList.cpp b/src/ModuleList.cpp index 4ca14964a5..14e2917159 100644 --- a/src/ModuleList.cpp +++ b/src/ModuleList.cpp @@ -10,45 +10,77 @@ */ #include -#include "debug.h" -#include "Lexer.h" + #include "ModuleList.h" + +#include "LaTeXFeatures.h" +#include "Lexer.h" + +#include "support/debug.h" +#include "support/FileName.h" #include "support/filetools.h" -#include "support/docstring.h" +#include "support/lstrings.h" +#include +#include -namespace lyx{ +using namespace std; +using namespace lyx::support; + +namespace lyx { -using std::map; -using std::string; -using std::vector; -using std::endl; -using support::FileName; -using support::libFileSearch; -using support::makeDisplayPath; //global variable: module list ModuleList moduleList; -// used when sorting the module list. -class moduleSorter - : public std::binary_function +LyXModule::LyXModule(string const & n, string const & i, + string const & d, vector const & p, + vector const & r, vector const & e): + name(n), id(i), description(d), + packageList(p), requiredModules(r), excludedModules(e), + checked(false) { - public: - int operator()(LyXModule const & lm1, - LyXModule const & lm2) const - { - return (lm1.name < lm2.name); + filename = id + ".module"; +} + + +bool LyXModule::isAvailable() { + if (packageList.empty()) + return true; + if (checked) + return available; + checked = true; + //check whether all of the required packages are available + vector::const_iterator it = packageList.begin(); + vector::const_iterator end = packageList.end(); + for (; it != end; ++it) { + if (!LaTeXFeatures::isAvailable(*it)) { + available = false; + return available; } + } + available = true; + return available; +} + + +// used when sorting the module list. +class ModuleSorter +{ +public: + int operator()(LyXModule const & lm1, LyXModule const & lm2) const + { + return lm1.getName() < lm2.getName(); + } }; -//Much of this is borrowed from TextClassList::read() -bool ModuleList::load() { - support::FileName const real_file = libFileSearch("", "lyxmodules.lst"); - LYXERR(Debug::TCLASS) << "Reading modules from `" - << real_file << '\'' << endl; +//Much of this is borrowed from LayoutFileList::read() +bool ModuleList::load() +{ + FileName const real_file = libFileSearch("", "lyxmodules.lst"); + LYXERR(Debug::TCLASS, "Reading modules from `" << real_file << '\''); if (real_file.empty()) { lyxerr << "ModuleList::load(): unable to find " @@ -77,45 +109,75 @@ bool ModuleList::load() { bool finished = false; // Parse modules files - LYXERR(Debug::TCLASS) << "Starting parsing of lyxmodules.lst" << endl; + LYXERR(Debug::TCLASS, "Starting parsing of lyxmodules.lst"); while (lex.isOK() && !finished) { - LYXERR(Debug::TCLASS) << "\tline by line" << endl; + LYXERR(Debug::TCLASS, "\tline by line"); switch (lex.lex()) { case Lexer::LEX_FEOF: finished = true; break; default: string const modName = lex.getString(); - LYXERR(Debug::TCLASS) << "Module name: " << modName << endl; - if (lex.next()) { - string const fname = lex.getString(); - LYXERR(Debug::TCLASS) << "Filename: " << fname << endl; - if (lex.next()) { - string const desc = lex.getString(); - LYXERR(Debug::TCLASS) << "Description: " << desc << endl; - //FIXME Add package read, and availability - // This code is run when we have - // modName, fname, and desc - addLayoutModule(modName, fname, desc); - } + LYXERR(Debug::TCLASS, "Module name: " << modName); + if (!lex.next()) + break; + string const fname = lex.getString(); + LYXERR(Debug::TCLASS, "Filename: " << fname); + if (!lex.next()) + break; + string const desc = lex.getString(); + LYXERR(Debug::TCLASS, "Description: " << desc); + //FIXME Add packages + if (!lex.next()) + break; + string str = lex.getString(); + LYXERR(Debug::TCLASS, "Packages: " << str); + vector pkgs; + while (!str.empty()) { + string p; + str = split(str, p, ','); + pkgs.push_back(p); + } + if (!lex.next()) + break; + str = lex.getString(); + LYXERR(Debug::TCLASS, "Required: " << str); + vector req; + while (!str.empty()) { + string p; + str = split(str, p, '|'); + req.push_back(p); } + if (!lex.next()) + break; + str = lex.getString(); + LYXERR(Debug::TCLASS, "Excluded: " << str); + vector exc; + while (!str.empty()) { + string p; + str = split(str, p, '|'); + exc.push_back(p); + } + // This code is run when we have + // modName, fname, desc, pkgs, req, and exc + addLayoutModule(modName, fname, desc, pkgs, req, exc); } // end switch } //end while - LYXERR(Debug::TCLASS) << "End of parsing of lyxmodules.lst" << endl; + LYXERR(Debug::TCLASS, "End of parsing of lyxmodules.lst"); if (!moduleList.empty()) - sort(moduleList.begin(), moduleList.end(), moduleSorter()); + sort(moduleList.begin(), moduleList.end(), ModuleSorter()); return true; } -void ModuleList::addLayoutModule(string moduleName, - string filename, string description) { - LyXModule lm; - lm.name = moduleName; - lm.filename = filename; - lm.description = description; +void ModuleList::addLayoutModule(string const & moduleName, + string const & filename, string const & description, + vector const & pkgs, vector const & req, + vector const & exc) +{ + LyXModule lm(moduleName, filename, description, pkgs, req, exc); modlist_.push_back(lm); } @@ -144,14 +206,26 @@ LyXModuleList::iterator ModuleList::end() } -LyXModule * ModuleList::operator[](string const str) { +LyXModule * ModuleList::getModuleByName(string const & str) +{ LyXModuleList::iterator it = modlist_.begin(); for (; it != modlist_.end(); ++it) - if (it->name == str) { + if (it->getName() == str) { LyXModule & mod = *it; return &mod; } return 0; } +LyXModule * ModuleList::operator[](string const & str) +{ + LyXModuleList::iterator it = modlist_.begin(); + for (; it != modlist_.end(); ++it) + if (it->getID() == str) { + LyXModule & mod = *it; + return &mod; + } + return 0; } + +} // namespace lyx