X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBufferParams.cpp;h=9302a35c294e43881eeebd47bbbf8816bbb004f9;hb=700af7e7011f102d92222744791638ff2db18f94;hp=d037fc67ffb2c6e6d18338aebe3d57d03e44e87c;hpb=c7afa2d6581e350834f39c01ba3ba173a8c2022e;p=lyx.git diff --git a/src/BufferParams.cpp b/src/BufferParams.cpp index d037fc67ff..9302a35c29 100644 --- a/src/BufferParams.cpp +++ b/src/BufferParams.cpp @@ -18,6 +18,7 @@ #include "BufferParams.h" #include "Author.h" +#include "LayoutFile.h" #include "BranchList.h" #include "buffer_funcs.h" #include "Bullet.h" @@ -29,7 +30,6 @@ #include "Font.h" #include "Lexer.h" #include "LyXRC.h" -#include "TextClassList.h" #include "OutputParams.h" #include "Spacing.h" #include "TexRow.h" @@ -95,13 +95,14 @@ namespace lyx { namespace { // Paragraph separation -typedef Translator ParSepTranslator; +typedef Translator ParSepTranslator; ParSepTranslator const init_parseptranslator() { - ParSepTranslator translator(string_paragraph_separation[0], BufferParams::PARSEP_INDENT); - translator.addPair(string_paragraph_separation[1], BufferParams::PARSEP_SKIP); + ParSepTranslator translator + (string_paragraph_separation[0], BufferParams::ParagraphIndentSeparation); + translator.addPair(string_paragraph_separation[1], BufferParams::ParagraphSkipSeparation); return translator; } @@ -114,17 +115,18 @@ ParSepTranslator const & parseptranslator() // Quotes language -typedef Translator QuotesLangTranslator; +typedef Translator QuotesLangTranslator; QuotesLangTranslator const init_quoteslangtranslator() { - QuotesLangTranslator translator(string_quotes_language[0], InsetQuotes::EnglishQ); - translator.addPair(string_quotes_language[1], InsetQuotes::SwedishQ); - translator.addPair(string_quotes_language[2], InsetQuotes::GermanQ); - translator.addPair(string_quotes_language[3], InsetQuotes::PolishQ); - translator.addPair(string_quotes_language[4], InsetQuotes::FrenchQ); - translator.addPair(string_quotes_language[5], InsetQuotes::DanishQ); + QuotesLangTranslator translator + (string_quotes_language[0], InsetQuotes::EnglishQuotes); + translator.addPair(string_quotes_language[1], InsetQuotes::SwedishQuotes); + translator.addPair(string_quotes_language[2], InsetQuotes::GermanQuotes); + translator.addPair(string_quotes_language[3], InsetQuotes::PolishQuotes); + translator.addPair(string_quotes_language[4], InsetQuotes::FrenchQuotes); + translator.addPair(string_quotes_language[5], InsetQuotes::DanishQuotes); return translator; } @@ -140,7 +142,7 @@ QuotesLangTranslator const & quoteslangtranslator() typedef Translator PaperSizeTranslator; -PaperSizeTranslator const init_papersizetranslator() +static PaperSizeTranslator initPaperSizeTranslator() { PaperSizeTranslator translator(string_papersize[0], PAPER_DEFAULT); translator.addPair(string_papersize[1], PAPER_CUSTOM); @@ -159,7 +161,7 @@ PaperSizeTranslator const init_papersizetranslator() PaperSizeTranslator const & papersizetranslator() { - static PaperSizeTranslator translator = init_papersizetranslator(); + static PaperSizeTranslator translator = initPaperSizeTranslator(); return translator; } @@ -275,6 +277,7 @@ public: AuthorList authorlist; BranchList branchlist; + vector extraEmbeddedFiles; Bullet temp_bullets[4]; Bullet user_defined_bullets[4]; Spacing spacing; @@ -283,11 +286,12 @@ public: */ VSpace defskip; PDFOptions pdfoptions; + LayoutFileIndex baseClass_; }; BufferParams::Impl::Impl() - : defskip(VSpace::MEDSKIP) + : defskip(VSpace::MEDSKIP), baseClass_(string("")) { // set initial author // FIXME UNICODE @@ -313,10 +317,10 @@ void BufferParams::MemoryTraits::destroy(BufferParams::Impl * ptr) BufferParams::BufferParams() : pimpl_(new Impl) { - setBaseClass(defaultTextclass()); - makeTextClass(); - paragraph_separation = PARSEP_INDENT; - quotes_language = InsetQuotes::EnglishQ; + setBaseClass(defaultBaseclass()); + makeDocumentClass(); + paragraph_separation = ParagraphIndentSeparation; + quotes_language = InsetQuotes::EnglishQuotes; fontsize = "default"; /* PaperLayout */ @@ -347,7 +351,7 @@ BufferParams::BufferParams() listings_params = string(); pagestyle = "default"; compressed = false; - embedded = false; + embedded = lyxrc.use_bundled_format; for (int iter = 0; iter < 4; ++iter) { user_defined_bullet(iter) = ITEMIZE_DEFAULTS[iter]; temp_bullet(iter) = ITEMIZE_DEFAULTS[iter]; @@ -355,11 +359,7 @@ BufferParams::BufferParams() } -BufferParams::~BufferParams() -{} - - -docstring const BufferParams::B_(string const & l10n) const +docstring BufferParams::B_(string const & l10n) const { BOOST_ASSERT(language); return getMessages(language->code()).get(l10n); @@ -378,6 +378,18 @@ AuthorList const & BufferParams::authors() const } +vector & BufferParams::extraEmbeddedFiles() +{ + return pimpl_->extraEmbeddedFiles; +} + + +vector const & BufferParams::extraEmbeddedFiles() const +{ + return pimpl_->extraEmbeddedFiles; +} + + BranchList & BufferParams::branchlist() { return pimpl_->branchlist; @@ -454,35 +466,33 @@ void BufferParams::setDefSkip(VSpace const & vs) } -string const BufferParams::readToken(Lexer & lex, string const & token, - FileName const & filepath) +string BufferParams::readToken(Lexer & lex, string const & token, + FileName const & filepath, FileName const & temppath) { if (token == "\\textclass") { lex.next(); string const classname = lex.getString(); // if there exists a local layout file, ignore the system one // NOTE: in this case, the textclass (.cls file) is assumed to be available. - pair pp = - make_pair(false, textclass_type(0)); - if (!filepath.empty()) - pp = textclasslist.addTextClass( - classname, filepath.absFilename()); - if (pp.first) - setBaseClass(pp.second); - else { - pp = textclasslist.numberOfClass(classname); - if (pp.first) - setBaseClass(pp.second); - else { - // a warning will be given for unknown class - setBaseClass(defaultTextclass()); - return classname; - } + string tcp; + LayoutFileList & bcl = LayoutFileList::get(); + if (!temppath.empty()) + tcp = bcl.addLayoutFile(classname, temppath.absFilename(), LayoutFileList::Embedded); + if (tcp.empty() && !filepath.empty()) + tcp = bcl.addLayoutFile(classname, filepath.absFilename(), LayoutFileList::Local); + if (!tcp.empty()) + setBaseClass(tcp); + else if (bcl.haveClass(classname)) { + setBaseClass(classname); + } else { + // a warning will be given for unknown class + setBaseClass(defaultBaseclass()); + return classname; } // FIXME: this warning will be given even if there exists a local .cls // file. Even worse, the .lyx file can not be compiled or exported // because the textclass is marked as unavilable. - if (!textClass().isTeXClassAvailable()) { + if (!baseClass()->isTeXClassAvailable()) { docstring const msg = bformat(_("The layout file requested by this document,\n" "%1$s.layout,\n" @@ -496,6 +506,8 @@ string const BufferParams::readToken(Lexer & lex, string const & token, } else if (token == "\\begin_preamble") { readPreamble(lex); + } else if (token == "\\begin_local_layout") { + readLocalLayout(lex); } else if (token == "\\begin_modules") { readModules(lex); } else if (token == "\\options") { @@ -661,6 +673,16 @@ string const BufferParams::readToken(Lexer & lex, string const & token, toktmp << endl; return toktmp; } + } else if (token == "\\extra_embedded_files") { + extraEmbeddedFiles().clear(); + string par; + lex >> par; + string tmp; + par = split(par, tmp, ','); + while (!tmp.empty()) { + extraEmbeddedFiles().push_back(tmp); + par = split(par, tmp, ','); + } } else { lyxerr << "BufferParams::readToken(): Unknown token: " << token << endl; @@ -677,7 +699,7 @@ void BufferParams::writeFile(ostream & os) const // Prints out the buffer info into the .lyx file given by file // the textclass - os << "\\textclass " << textclasslist[baseClass_].name() << '\n'; + os << "\\textclass " << baseClass()->name() << '\n'; // then the preamble if (!preamble.empty()) { @@ -702,6 +724,15 @@ void BufferParams::writeFile(ostream & os) const os << "\\end_modules" << '\n'; } + // local layout information + if (!local_layout.empty()) { + // remove '\n' from the end + string const tmplocal = rtrim(local_layout, "\n"); + os << "\\begin_local_layout\n" + << tmplocal + << "\n\\end_local_layout\n"; + } + // then the text parameters if (language != ignore_language) os << "\\language " << language->lang() << '\n'; @@ -814,12 +845,25 @@ void BufferParams::writeFile(ostream & os) const else os << "\\author " << Author() << "\n"; } + + vector::const_iterator e_it = extraEmbeddedFiles().begin(); + vector::const_iterator e_end = extraEmbeddedFiles().end(); + os << "\\extra_embedded_files \""; + bool first = true; + for (; e_it != e_end; ++e_it) { + if (!first) + os << ","; + else + first = false; + os << *e_it; + } + os << "\"\n"; } void BufferParams::validate(LaTeXFeatures & features) const { - features.require(textClass().requires()); + features.require(documentClass().requires()); if (outputChanges) { bool dvipost = LaTeXFeatures::isAvailable("dvipost"); @@ -861,7 +905,7 @@ void BufferParams::validate(LaTeXFeatures & features) const // AMS Style is at document level if (use_amsmath == package_on - || textClass().provides("amsmath")) + || documentClass().provides("amsmath")) features.require("amsmath"); if (use_esint == package_on) features.require("esint"); @@ -902,7 +946,7 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features, { os << "\\documentclass"; - TextClass const & tclass = textClass(); + DocumentClass const & tclass = documentClass(); ostringstream clsoptions; // the document class options. @@ -1243,7 +1287,7 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features, // hyperref, see // http://www.mail-archive.com/lyx-devel@lists.lyx.org/msg129680.html if (language->lang() == "japanese-plain" && - !textClass().provides("japanese")) { + !documentClass().provides("japanese")) { //load babel in case it was not loaded due to an empty language list if (language_options.str().empty()) lyxpreamble += "\\usepackage{babel}\n"; @@ -1261,7 +1305,7 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features, // use hyperref explicitely when it is required if (features.isRequired("hyperref")) { odocstringstream oss; - pdfoptions().writeLaTeX(oss, textClass().provides("hyperref")); + pdfoptions().writeLaTeX(oss, documentClass().provides("hyperref")); lyxpreamble += oss.str(); } @@ -1343,7 +1387,7 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features, void BufferParams::useClassDefaults() { - TextClass const & tclass = textclasslist[baseClass_]; + DocumentClass const & tclass = documentClass(); sides = tclass.sides(); columns = tclass.columns(); @@ -1359,7 +1403,7 @@ void BufferParams::useClassDefaults() bool BufferParams::hasClassDefaults() const { - TextClass const & tclass = textclasslist[baseClass_]; + DocumentClass const & tclass = documentClass(); return sides == tclass.sides() && columns == tclass.columns() @@ -1370,46 +1414,69 @@ bool BufferParams::hasClassDefaults() const } -TextClass const & BufferParams::textClass() const +DocumentClass const & BufferParams::documentClass() const { - return *textClass_; + return *doc_class_; } -TextClassPtr BufferParams::textClassPtr() const { - return textClass_; +DocumentClass * BufferParams::documentClassPtr() const { + return doc_class_; } -void BufferParams::setTextClass(TextClassPtr tc) { - textClass_ = tc; +void BufferParams::setDocumentClass(DocumentClass const * const tc) { + // evil, but this function is evil + doc_class_ = const_cast(tc); } -bool BufferParams::setBaseClass(textclass_type tc) +bool BufferParams::setBaseClass(string const & classname) { - if (textclasslist[tc].load()) { - baseClass_ = tc; + LYXERR(Debug::TCLASS, "setBaseClass: " << classname); + LayoutFileList const & bcl = LayoutFileList::get(); + if (!bcl.haveClass(classname)) { + docstring s = + bformat(_("The document class %1$s could not be found."), + from_utf8(classname)); + frontend::Alert::error(_("Class not found"), s); + return false; + } + + if (bcl[classname].load()) { + pimpl_->baseClass_ = classname; return true; } docstring s = bformat(_("The document class %1$s could not be loaded."), - from_utf8(textclasslist[tc].name())); + from_utf8(classname)); frontend::Alert::error(_("Could not load class"), s); return false; } -textclass_type BufferParams::baseClass() const +LayoutFile const * BufferParams::baseClass() const +{ + if (LayoutFileList::get().haveClass(pimpl_->baseClass_)) + return &(LayoutFileList::get()[pimpl_->baseClass_]); + else + return 0; +} + + +LayoutFileIndex const & BufferParams::baseClassID() const { - return baseClass_; + return pimpl_->baseClass_; } -void BufferParams::makeTextClass() +void BufferParams::makeDocumentClass() { - textClass_.reset(new TextClass(textclasslist[baseClass()])); + if (!baseClass()) + 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 @@ -1426,7 +1493,7 @@ void BufferParams::makeTextClass() "probably need to reconfigure LyX.\n"), from_utf8(modName)); frontend::Alert::warning(_("Module not available"), msg + _("Some layouts may not be available.")); - lyxerr << "BufferParams::makeTextClass(): Module " << + lyxerr << "BufferParams::makeDocumentClass(): Module " << modName << " requested but not found in module list." << endl; continue; @@ -1439,12 +1506,18 @@ void BufferParams::makeTextClass() frontend::Alert::warning(_("Package not available"), msg); } FileName layout_file = libFileSearch("layouts", lm->getFilename()); - if (!textClass_->read(layout_file, TextClass::MODULE)) { + if (!doc_class_->read(layout_file, TextClass::MODULE)) { docstring const msg = bformat(_("Error reading module %1$s\n"), from_utf8(modName)); frontend::Alert::warning(_("Read Error"), msg); } } + if (!local_layout.empty()) { + if (!doc_class_->read(local_layout, TextClass::MODULE)) { + docstring const msg = _("Error reading internal layout information"); + frontend::Alert::warning(_("Read Error"), msg); + } + } } @@ -1478,7 +1551,7 @@ void BufferParams::clearLayoutModules() Font const BufferParams::getFont() const { - FontInfo f = textClass().defaultfont(); + FontInfo f = documentClass().defaultfont(); if (fontsDefaultFamily == "rmdefault") f.setFamily(ROMAN_FAMILY); else if (fontsDefaultFamily == "sfdefault") @@ -1499,6 +1572,16 @@ void BufferParams::readPreamble(Lexer & lex) } +void BufferParams::readLocalLayout(Lexer & lex) +{ + if (lex.getString() != "\\begin_local_layout") + lyxerr << "Error (BufferParams::readLocalLayout):" + "consistency check failed." << endl; + + local_layout = lex.getLongString("\\end_local_layout"); +} + + void BufferParams::readLanguage(Lexer & lex) { if (!lex.next()) return; @@ -1592,7 +1675,7 @@ void BufferParams::readModules(Lexer & lex) } -string const BufferParams::paperSizeName(Papersize_Purpose const & purpose) const +string BufferParams::paperSizeName(PapersizePurpose purpose) const { char real_papersize = papersize; if (real_papersize == PAPER_DEFAULT) @@ -1684,7 +1767,7 @@ string const BufferParams::dvips_options() const } -string const BufferParams::babelCall(string const & lang_opts) const +string BufferParams::babelCall(string const & lang_opts) const { string lang_pack = lyxrc.language_package; if (lang_pack != "\\usepackage{babel}") @@ -1903,7 +1986,7 @@ string const BufferParams::loadFonts(string const & rm, else if (tt == "courier" ) os << "\\usepackage{" << tt << "}\n"; // Computer Modern, Latin Modern, CM Bright - else if (tt != "default") + else if (tt != "default") os << "\\renewcommand{\\ttdefault}{" << tt << "}\n"; return os.str(); @@ -1913,29 +1996,28 @@ string const BufferParams::loadFonts(string const & rm, Encoding const & BufferParams::encoding() const { if (inputenc == "auto" || inputenc == "default") - return *(language->encoding()); - Encoding const * const enc = - encodings.getFromLaTeXName(inputenc); + return *language->encoding(); + Encoding const * const enc = encodings.fromLaTeXName(inputenc); if (enc) return *enc; - lyxerr << "Unknown inputenc value `" << inputenc - << "'. Using `auto' instead." << endl; - return *(language->encoding()); + LYXERR0("Unknown inputenc value `" << inputenc + << "'. Using `auto' instead."); + return *language->encoding(); } -biblio::CiteEngine BufferParams::getEngine() const +biblio::CiteEngine BufferParams::citeEngine() const { // FIXME the class should provide the numerical/ // authoryear choice - if (textClass().provides("natbib") + if (documentClass().provides("natbib") && cite_engine_ != biblio::ENGINE_NATBIB_NUMERICAL) return biblio::ENGINE_NATBIB_AUTHORYEAR; return cite_engine_; } -void BufferParams::setCiteEngine(biblio::CiteEngine const cite_engine) +void BufferParams::setCiteEngine(biblio::CiteEngine cite_engine) { cite_engine_ = cite_engine; }