X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBufferParams.cpp;h=95744c6669d896f8b034adda6f1797548cda2fd6;hb=d145c2dc9f27666ca0ed9f8589f99f502d7b2a4d;hp=5cde23fc41bfec77c92f8ecb7f1ef949528193aa;hpb=ce13748eae02221885d64911eee8717ca6367c0f;p=lyx.git diff --git a/src/BufferParams.cpp b/src/BufferParams.cpp index 5cde23fc41..95744c6669 100644 --- a/src/BufferParams.cpp +++ b/src/BufferParams.cpp @@ -487,6 +487,8 @@ string BufferParams::readToken(Lexer & lex, string const & token, readLocalLayout(lex); } else if (token == "\\begin_modules") { readModules(lex); + } else if (token == "\\begin_removed_modules") { + readRemovedModules(lex); } else if (token == "\\options") { lex.eatLine(); options = lex.getString(); @@ -692,15 +694,26 @@ void BufferParams::writeFile(ostream & os) const os << "\\master " << master << '\n'; } - //the modules + // removed modules + if (!removedModules_.empty()) { + os << "\\begin_removed_modules" << '\n'; + set::const_iterator it = removedModules_.begin(); + set::const_iterator en = removedModules_.end(); + for (; it != en; it++) + os << *it << '\n'; + os << "\\end_removed_modules" << '\n'; + } + + // the modules if (!layoutModules_.empty()) { os << "\\begin_modules" << '\n'; LayoutModuleList::const_iterator it = layoutModules_.begin(); - for (; it != layoutModules_.end(); it++) + LayoutModuleList::const_iterator en = layoutModules_.end(); + for (; it != en; it++) os << *it << '\n'; os << "\\end_modules" << '\n'; } - + // local layout information if (!local_layout.empty()) { // remove '\n' from the end @@ -1226,11 +1239,16 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features, texrow.newline(); } - // If we use jurabib, we have to call babel here. - if (use_babel && features.isRequired("jurabib")) { - os << from_ascii(babelCall(language_options.str())) + // If we use hyperref, jurabib, japanese, or vietnamese, we have to call babel here. + if (use_babel + && (features.isRequired("jurabib") + || features.isRequired("hyperref") + || features.isRequired("vietnamese") + || features.isRequired("japanese") ) ) { + // FIXME UNICODE + os << from_utf8(babelCall(language_options.str())) << '\n' - << from_ascii(features.getBabelOptions()); + << from_utf8(features.getBabelOptions()); texrow.newline(); } @@ -1242,15 +1260,6 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features, // Line spacing lyxpreamble += from_utf8(spacing().writePreamble(tclass.provides("SetSpace"))); - // If we use hyperref or japanese or vietnamese, we have to call babel here. - if (use_babel && !features.isRequired("jurabib") - && (features.isRequired("hyperref") || features.isRequired("vietnamese") - || features.isRequired("japanese"))) { - // FIXME UNICODE - lyxpreamble += from_utf8(babelCall(language_options.str())) + '\n'; - lyxpreamble += from_utf8(features.getBabelOptions()); - } - // PDF support. // * Hyperref manual: "Make sure it comes last of your loaded // packages, to give it a fighting chance of not being over-written, @@ -1432,16 +1441,63 @@ bool BufferParams::setBaseClass(string const & classname) bcl.addEmptyClass(classname); } - if (bcl[classname].load()) { - pimpl_->baseClass_ = classname; - return true; + bool const success = bcl[classname].load(); + if (!success) { + docstring s = + bformat(_("The document class %1$s could not be loaded."), + from_utf8(classname)); + frontend::Alert::error(_("Could not load class"), s); + return false; + } + + pimpl_->baseClass_ = classname; + + // add any required modules not already in use + set const & mods = baseClass()->defaultModules(); + set::const_iterator mit = mods.begin(); + set::const_iterator men = mods.end(); + for (; mit != men; mit++) { + string const & modName = *mit; + // see if we're already in use + if (find(layoutModules_.begin(), layoutModules_.end(), modName) != + layoutModules_.end()) { + LYXERR(Debug::TCLASS, "Default module `" << modName << + "' not added because already used."); + continue; + } + // make sure the user hasn't removed it + if (find(removedModules_.begin(), removedModules_.end(), modName) != + removedModules_.end()) { + LYXERR(Debug::TCLASS, "Default module `" << modName << + "' not added because removed by user."); + continue; + } + // Now we want to check the list of selected modules to see if any of them + // exclude this one. + bool foundit = false; + // so iterate over the selected modules... + LayoutModuleList::const_iterator lit = layoutModules_.begin(); + LayoutModuleList::const_iterator len = layoutModules_.end(); + for (; lit != len; lit++) { + LyXModule * lm = moduleList[*lit]; + if (!lm) + continue; + vector const & exc = lm->getExcludedModules(); + // ...and see if this one excludes us. + if (find(exc.begin(), exc.end(), modName) != exc.end()) { + foundit = true; + LYXERR(Debug::TCLASS, "Default module `" << modName << + "' not added because excluded by loaded module `" << + *lit << "'."); + break; + } + } + if (!foundit) { + LYXERR(Debug::TCLASS, "Default module `" << modName << "' added."); + layoutModules_.push_back(modName); + } } - - docstring s = - bformat(_("The document class %1$s could not be loaded."), - from_utf8(classname)); - frontend::Alert::error(_("Could not load class"), s); - return false; + return true; } @@ -1466,10 +1522,10 @@ void BufferParams::makeDocumentClass() return; doc_class_ = &(DocumentClassBundle::get().newClass(*baseClass())); - - //FIXME It might be worth loading the children's modules here, - //just as we load their bibliographies and such, instead of just - //doing a check in InsetInclude. + + // FIXME It might be worth loading the children's modules here, + // just as we load their bibliographies and such, instead of just + // doing a check in InsetInclude. LayoutModuleList::const_iterator it = layoutModules_.begin(); for (; it != layoutModules_.end(); it++) { string const modName = *it; @@ -1509,13 +1565,6 @@ void BufferParams::makeDocumentClass() } -vector const & BufferParams::getModules() const -{ - return layoutModules_; -} - - - bool BufferParams::addLayoutModule(string const & modName) { LayoutModuleList::const_iterator it = layoutModules_.begin(); @@ -1528,12 +1577,6 @@ bool BufferParams::addLayoutModule(string const & modName) } -void BufferParams::clearLayoutModules() -{ - layoutModules_.clear(); -} - - Font const BufferParams::getFont() const { FontInfo f = documentClass().defaultfont(); @@ -1661,6 +1704,37 @@ void BufferParams::readModules(Lexer & lex) } +void BufferParams::readRemovedModules(Lexer & lex) +{ + if (!lex.eatLine()) { + lyxerr << "Error (BufferParams::readRemovedModules):" + "Unexpected end of input." << endl; + return; + } + while (true) { + string mod = lex.getString(); + if (mod == "\\end_removed_modules") + break; + removedModules_.insert(mod); + lex.eatLine(); + } + // now we want to remove any removed modules that were previously + // added. normally, that will be because default modules were added in + // setBaseClass(), which gets called when \textclass is read at the + // start of the read. + set::const_iterator rit = removedModules_.begin(); + set::const_iterator const ren = removedModules_.end(); + for (; rit != ren; rit++) { + LayoutModuleList::iterator const mit = layoutModules_.begin(); + LayoutModuleList::iterator const men = layoutModules_.end(); + LayoutModuleList::iterator found = find(mit, men, *rit); + if (found == men) + continue; + layoutModules_.erase(found); + } +} + + string BufferParams::paperSizeName(PapersizePurpose purpose) const { char real_papersize = papersize;