X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FModuleList.cpp;h=51a942776610d4cd131db854deb3f886b0b267d9;hb=745b43784ce1b6981fd31f6c5f5fbd489eef51f4;hp=71e1aaf0d0a262643a69e2be2b29d394d3344fb3;hpb=bf728ca3865357d736259a422f6766dcb26a41b5;p=lyx.git diff --git a/src/ModuleList.cpp b/src/ModuleList.cpp index 71e1aaf0d0..51a9427766 100644 --- a/src/ModuleList.cpp +++ b/src/ModuleList.cpp @@ -11,127 +11,214 @@ #include -#include "debug.h" -#include "Lexer.h" #include "ModuleList.h" -#include "support/docstring.h" +#include "LaTeXFeatures.h" +#include "Lexer.h" + +#include "support/debug.h" +#include "support/FileName.h" +#include "support/gettext.h" #include "support/filetools.h" #include "support/lstrings.h" #include - -using std::endl; -using std::map; -using std::string; -using std::vector; -namespace lyx{ +using namespace std; +using namespace lyx::support; + +namespace lyx { -using support::FileName; -using support::libFileSearch; -using support::makeDisplayPath; //global variable: module list -ModuleList moduleList; +ModuleList theModuleList; -// 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, + string const & c): + name_(n), id_(i), description_(d), package_list_(p), + required_modules_(r), excluded_modules_(e), category_(c), + checked_(false), available_(false) { - public: - int operator()(LyXModule const & lm1, - LyXModule const & lm2) const - { - return (lm1.name < lm2.name); + filename_ = id_ + ".module"; +} + + +vector LyXModule::prerequisites() const +{ + if (!checked_) + isAvailable(); + return prerequisites_; +} + + +bool LyXModule::isAvailable() const +{ + if (package_list_.empty()) + return true; + if (checked_) + return available_; + checked_ = true; + available_ = true; + //check whether all of the required packages are available + vector::const_iterator it = package_list_.begin(); + vector::const_iterator end = package_list_.end(); + for (; it != end; ++it) { + if (!LaTeXFeatures::isAvailable(*it)) { + available_ = false; + prerequisites_.push_back(*it); } + } + return available_; +} + + +bool LyXModule::isCompatible(string const & modname) const +{ + // do we exclude it? + if (find(excluded_modules_.begin(), excluded_modules_.end(), modname) != + excluded_modules_.end()) + return false; + + LyXModule const * const lm = theModuleList[modname]; + if (!lm) + return true; + + // does it exclude us? + vector const excmods = lm->getExcludedModules(); + if (find(excmods.begin(), excmods.end(), id_) != excmods.end()) + return false; + + return true; +} + + +bool LyXModule::areCompatible(string const & mod1, string const & mod2) +{ + LyXModule const * const lm1 = theModuleList[mod1]; + if (lm1) + return lm1->isCompatible(mod2); + LyXModule const * const lm2 = theModuleList[mod2]; + if (lm2) + return lm2->isCompatible(mod1); + // Can't check it either way. + return true; +} + + +// 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::read() +{ + 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 " - "modules file `" - << to_utf8(makeDisplayPath(real_file.absFilename(), 1000)) - << "'.\nNo modules will be available." << endl; + LYXERR0("unable to find modules file `lyxmodules.lst'.\n" + << "No modules will be available."); return false; } - Lexer lex(0, 0); + Lexer lex; if (!lex.setFile(real_file)) { - lyxerr << "ModuleList::load():" - "lyxlex was not able to set file: " - << real_file << ".\nNo modules will be available." << endl; + LYXERR0("lyxlex was not able to set file: " + << real_file << ".\nNo modules will be available."); return false; } if (!lex.isOK()) { - lyxerr << "ModuleList::load():" << - "unable to open modules file `" - << to_utf8(makeDisplayPath(real_file.absFilename(), 1000)) - << "'\nNo modules will be available." - << endl; + LYXERR0("unable to open modules file `" + << to_utf8(makeDisplayPath(real_file.absFileName(), 1000)) + << "'\nNo modules will be available."); return false; } 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; + string const modname = lex.getString(); + LYXERR(Debug::TCLASS, "Module name: " << modname); if (!lex.next()) break; string const fname = lex.getString(); - LYXERR(Debug::TCLASS) << "Filename: " << fname << endl; - if (!lex.next()) + LYXERR(Debug::TCLASS, "Filename: " << fname); + if (!lex.next(true)) break; string const desc = lex.getString(); - LYXERR(Debug::TCLASS) << "Description: " << desc << endl; + LYXERR(Debug::TCLASS, "Description: " << desc); //FIXME Add packages if (!lex.next()) break; - string packages = lex.getString(); - LYXERR(Debug::TCLASS) << "Packages: " << packages << endl; + string str = lex.getString(); + LYXERR(Debug::TCLASS, "Packages: " << str); vector pkgs; - while (!packages.empty()) { + while (!str.empty()) { string p; - packages = support::split(packages, 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); + } + if (!lex.next()) + break; + string const catgy = lex.getString(); + LYXERR(Debug::TCLASS, "Category: " << catgy); // This code is run when we have - // modName, fname, desc, and pkgs - addLayoutModule(modName, fname, desc, pkgs); + // modName, fname, desc, pkgs, req, exc, and catgy + addLayoutModule(modname, fname, desc, pkgs, req, exc, catgy); } // end switch } //end while - - LYXERR(Debug::TCLASS) << "End of parsing of lyxmodules.lst" << endl; - if (!moduleList.empty()) - std::sort(moduleList.begin(), moduleList.end(), moduleSorter()); + LYXERR(Debug::TCLASS, "End of parsing of lyxmodules.lst"); + + if (!theModuleList.empty()) + sort(theModuleList.begin(), theModuleList.end(), ModuleSorter()); return true; } -void ModuleList::addLayoutModule(string moduleName, - string filename, string description, vector pkgs) { - LyXModule lm; - lm.name = moduleName; - lm.filename = filename; - lm.description = description; - lm.packageList = pkgs; +void ModuleList::addLayoutModule(string const & modname, + string const & filename, string const & description, + vector const & pkgs, vector const & req, + vector const & exc, string const & catgy) +{ + LyXModule lm(modname, filename, description, pkgs, req, exc, catgy); modlist_.push_back(lm); } @@ -160,14 +247,27 @@ LyXModuleList::iterator ModuleList::end() } -LyXModule * ModuleList::operator[](string const str) { +LyXModule const * ModuleList::operator[](string const & str) const +{ + LyXModuleList::const_iterator it = modlist_.begin(); + for (; it != modlist_.end(); ++it) + if (it->getID() == str) { + LyXModule const & mod = *it; + return &mod; + } + return 0; +} + + +LyXModule * ModuleList::operator[](string const & str) +{ LyXModuleList::iterator it = modlist_.begin(); for (; it != modlist_.end(); ++it) - if (it->name == str) { + if (it->getID() == str) { LyXModule & mod = *it; return &mod; } return 0; } -} +} // namespace lyx