X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FModuleList.cpp;h=e2471ed5e5bbec2ca04e3e501f5acbae462c3493;hb=823e44822e6638824900eee2f7e2e7165af97f8d;hp=d1ff3bee0a368d5d23767bc1939eb676b16d51d7;hpb=0fce3ff6bd61a9d5b8d928b624741f31bc176795;p=lyx.git diff --git a/src/ModuleList.cpp b/src/ModuleList.cpp index d1ff3bee0a..e2471ed5e5 100644 --- a/src/ModuleList.cpp +++ b/src/ModuleList.cpp @@ -13,16 +13,15 @@ #include "ModuleList.h" -#include "support/debug.h" #include "LaTeXFeatures.h" #include "Lexer.h" +#include "support/debug.h" #include "support/FileName.h" #include "support/filetools.h" #include "support/lstrings.h" #include -#include using namespace std; using namespace lyx::support; @@ -34,69 +33,108 @@ namespace lyx { ModuleList moduleList; -LyXModule::LyXModule(string const & n, string const & f, - string const & d, vector const & p) : - name(n), filename(f), description(d), packageList(p), checked(false) -{} +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) +{ + filename = id + ".module"; +} bool LyXModule::isAvailable() { +#ifdef TEX2LYX + return true; +#else 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)) + if (!LaTeXFeatures::isAvailable(*it)) { available = false; return available; + } } available = true; return available; +#endif } +bool LyXModule::isCompatible(string const & modName) const +{ + // do we exclude it? + if (find(excludedModules.begin(), excludedModules.end(), modName) != + excludedModules.end()) + return false; + + LyXModule const * const lm = moduleList[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 = moduleList[mod1]; + if (lm1) + return lm1->isCompatible(mod2); + LyXModule const * const lm2 = moduleList[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.name < lm2.name; + return lm1.getName() < lm2.getName(); } }; -//Much of this is borrowed from TextClassList::read() -bool ModuleList::load() +//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 `" + << to_utf8(makeDisplayPath(real_file.absFilename(), 1000)) + << "'.\nNo 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; } @@ -123,17 +161,37 @@ bool ModuleList::load() //FIXME Add packages if (!lex.next()) break; - string packages = lex.getString(); - LYXERR(Debug::TCLASS, "Packages: " << packages); + string str = lex.getString(); + LYXERR(Debug::TCLASS, "Packages: " << str); vector pkgs; - while (!packages.empty()) { + while (!str.empty()) { string p; - packages = 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); + } // This code is run when we have - // modName, fname, desc, and pkgs - addLayoutModule(modName, fname, desc, pkgs); + // modName, fname, desc, pkgs, req, and exc + addLayoutModule(modName, fname, desc, pkgs, req, exc); } // end switch } //end while @@ -147,9 +205,10 @@ bool ModuleList::load() void ModuleList::addLayoutModule(string const & moduleName, string const & filename, string const & description, - vector const & pkgs) + vector const & pkgs, vector const & req, + vector const & exc) { - LyXModule lm(moduleName, filename, description, pkgs); + LyXModule lm(moduleName, filename, description, pkgs, req, exc); modlist_.push_back(lm); } @@ -182,7 +241,7 @@ 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; }