X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyxtextclass.C;h=9418b24464e77029deaab2cd3e95a66a486e04fa;hb=98c966c64594611e469313314abd1e59524adb4a;hp=def159c680b10c6b8ad866012530893041894693;hpb=b922cdd796f9e4b9a46a79808cdee596e04903eb;p=lyx.git diff --git a/src/lyxtextclass.C b/src/lyxtextclass.C index def159c680..9418b24464 100644 --- a/src/lyxtextclass.C +++ b/src/lyxtextclass.C @@ -1,8 +1,8 @@ /* This file is part of - * ====================================================== - * + * ====================================================== + * * LyX, The Document Processor - * + * * Copyright 1995 Matthias Ettrich * Copyright 1995-2001 The LyX Team. * @@ -24,7 +24,12 @@ #include "support/lyxfunctional.h" #include "support/filetools.h" +#include + using std::endl; +using std::find_if; +using std::remove_if; +using std::ostream; /* ******************************************************************* */ @@ -52,7 +57,7 @@ bool LyXTextClass::do_readStyle(LyXLex & lexrc, LyXLayout & lay) { lyxerr[Debug::TCLASS] << "Reading style " << lay.name() << endl; if (!lay.Read(lexrc, *this)) { - // Reslove fonts + // Resolve fonts lay.resfont = lay.font; #ifndef INHERIT_LANGUAGE lay.resfont.realize(defaultfont()); @@ -64,7 +69,7 @@ bool LyXTextClass::do_readStyle(LyXLex & lexrc, LyXLayout & lay) lay.reslabelfont.realize(defaultfont(), default_language); #endif return false; // no errors - } + } lyxerr << "Error parsing style `" << lay.name() << "'" << endl; return true; } @@ -74,6 +79,7 @@ enum TextClassTags { TC_OUTPUTTYPE = 1, TC_INPUT, TC_STYLE, + TC_DEFAULTSTYLE, TC_NOSTYLE, TC_COLUMNS, TC_SIDES, @@ -99,6 +105,7 @@ bool LyXTextClass::Read(string const & filename, bool merge) { "classoptions", TC_CLASSOPTIONS }, { "columns", TC_COLUMNS }, { "defaultfont", TC_DEFAULTFONT }, + { "defaultstyle", TC_DEFAULTSTYLE }, { "input", TC_INPUT }, { "leftmargin", TC_LEFTMARGIN }, { "maxcounter", TC_MAXCOUNTER }, @@ -124,37 +131,37 @@ bool LyXTextClass::Read(string const & filename, bool merge) lyxerr[Debug::TCLASS] << "Reading input file " << MakeDisplayPath(filename) << endl; - + LyXLex lexrc(textClassTags, TC_RIGHTMARGIN); bool error = false; - lexrc.setFile(filename); - if (!lexrc.isOK()) error = true; + lexrc.setFile(filename); + if (!lexrc.isOK()) error = true; // parsing while (lexrc.isOK() && !error) { int le = lexrc.lex(); switch (le) { case LyXLex::LEX_FEOF: - continue; + continue; - case LyXLex::LEX_UNDEF: + case LyXLex::LEX_UNDEF: lexrc.printError("Unknown TextClass tag `$$Token'"); error = true; - continue; + continue; default: break; } switch (static_cast(le)) { case TC_OUTPUTTYPE: // output type definition readOutputType(lexrc); break; - + case TC_INPUT: // Include file - if (lexrc.next()) { - string tmp = LibFileSearch("layouts", - lexrc.getString(), + if (lexrc.next()) { + string tmp = LibFileSearch("layouts", + lexrc.getString(), "layout"); - + if (Read(tmp, true)) { lexrc.printError("Error reading input" "file: "+tmp); @@ -163,18 +170,34 @@ bool LyXTextClass::Read(string const & filename, bool merge) } break; + case TC_DEFAULTSTYLE: + if (lexrc.next()) { + string const name = subst(lexrc.getString(), + '_', ' '); + defaultlayout_ = name; + } + break; + case TC_STYLE: if (lexrc.next()) { - string name = subst(lexrc.getString(), + string const name = subst(lexrc.getString(), '_', ' '); if (hasLayout(name)) { - LyXLayout & lay = GetLayout(name); + LyXLayout & lay = + const_cast(operator[](name)); error = do_readStyle(lexrc, lay); } else { LyXLayout lay; lay.setName(name); if (!(error = do_readStyle(lexrc, lay))) layoutlist.push_back(lay); + if (defaultlayout_.empty()) { + // We do not have a default + // layout yet, so we choose + // the first layout we + // encounter. + defaultlayout_ = name; + } } } else { @@ -188,8 +211,9 @@ bool LyXTextClass::Read(string const & filename, bool merge) string const style = subst(lexrc.getString(), '_', ' '); if (!delete_layout(style)) - lexrc.printError("Cannot delete style" - " `$$Token'"); + lyxerr << "Cannot delete style `" << style << "'" << endl; +// lexrc.printError("Cannot delete style" +// " `$$Token'"); } break; @@ -197,7 +221,7 @@ bool LyXTextClass::Read(string const & filename, bool merge) if (lexrc.next()) columns_ = lexrc.getInteger(); break; - + case TC_SIDES: if (lexrc.next()) { switch (lexrc.getInteger()) { @@ -212,12 +236,12 @@ bool LyXTextClass::Read(string const & filename, bool merge) } } break; - + case TC_PAGESTYLE: - lexrc.next(); + lexrc.next(); pagestyle_ = strip(lexrc.getString()); break; - + case TC_DEFAULTFONT: defaultfont_.lyxRead(lexrc); if (!defaultfont_.resolved()) { @@ -227,7 +251,7 @@ bool LyXTextClass::Read(string const & filename, bool merge) defaultfont_.realize(LyXFont(LyXFont::ALL_SANE)); #else defaultfont_.realize(LyXFont(LyXFont::ALL_SANE), - default_language); + default_language); #endif } break; @@ -246,10 +270,10 @@ bool LyXTextClass::Read(string const & filename, bool merge) tocdepth_ = lexrc.getInteger(); break; - // First step to support options - case TC_CLASSOPTIONS: + // First step to support options + case TC_CLASSOPTIONS: readClassOptions(lexrc); - break; + break; case TC_PREAMBLE: preamble_ = lexrc.getLongString("EndPreamble"); @@ -271,23 +295,28 @@ bool LyXTextClass::Read(string const & filename, bool merge) break; case TC_LEFTMARGIN: // left margin type - if (lexrc.next()) + if (lexrc.next()) leftmargin_ = lexrc.getString(); - break; + break; case TC_RIGHTMARGIN: // right margin type if (lexrc.next()) rightmargin_ = lexrc.getString(); break; } - } + } if (!merge) { // we are at top level here. - lyxerr[Debug::TCLASS] << "Finished reading textclass " + lyxerr[Debug::TCLASS] << "Finished reading textclass " << MakeDisplayPath(filename) << endl; + if (defaultlayout_.empty()) { + lyxerr << "Error: Textclass '" << name_ + << "' is missing a defaultstyle." << endl; + error = true; + } } else - lyxerr[Debug::TCLASS] << "Finished reading input file " + lyxerr[Debug::TCLASS] << "Finished reading input file " << MakeDisplayPath(filename) << endl; @@ -360,7 +389,7 @@ void LyXTextClass::readMaxCounter(LyXLex & lexrc) switch (le) { case LyXLex::LEX_UNDEF: lexrc.printError("Unknown MaxCounter tag `$$Token'"); - return; + return; default: break; } switch (static_cast(le)) { @@ -422,7 +451,7 @@ void LyXTextClass::readClassOptions(LyXLex & lexrc) switch (le) { case LyXLex::LEX_UNDEF: lexrc.printError("Unknown ClassOption tag `$$Token'"); - continue; + continue; default: break; } switch (static_cast(le)) { @@ -432,7 +461,7 @@ void LyXTextClass::readClassOptions(LyXLex & lexrc) break; case CO_PAGESTYLE: lexrc.next(); - opt_pagestyle_ = strip(lexrc.getString()); + opt_pagestyle_ = strip(lexrc.getString()); break; case CO_OTHER: lexrc.next(); @@ -465,38 +494,58 @@ string const & LyXTextClass::rightmargin() const } -bool LyXTextClass::hasLayout(string const & name) const +bool LyXTextClass::hasLayout(string const & n) const { + string const name = (n.empty() ? defaultLayoutName() : n); + return find_if(layoutlist.begin(), layoutlist.end(), lyx::compare_memfun(&LyXLayout::name, name)) != layoutlist.end(); } -LyXLayout const & LyXTextClass::GetLayout (string const & name) const +LyXLayout const & LyXTextClass::operator[](string const & n) const { + lyx::Assert(!n.empty()); + + if (n.empty()) + lyxerr << "Operator[] called with empty n" << endl; + + string const name = (n.empty() ? defaultLayoutName() : n); + + static string lastLayoutName; + static LayoutList::difference_type lastLayoutIndex; + + if (name == lastLayoutName) + return layoutlist[lastLayoutIndex]; + + LayoutList::const_iterator cit = find_if(layoutlist.begin(), layoutlist.end(), lyx::compare_memfun(&LyXLayout::name, name)); - lyx::Assert(cit != layoutlist.end()); // we require the name to exist - return (*cit); -} + if (cit == layoutlist.end()) { + lyxerr << "We failed to find the layout '" << name + << "' in the layout list. You MUST investigate!" + << endl; -LyXLayout & LyXTextClass::GetLayout(string const & name) -{ - LayoutList::iterator it = - find_if(layoutlist.begin(), - layoutlist.end(), - lyx::compare_memfun(&LyXLayout::name, name)); - lyx::Assert(it != layoutlist.end()); // we require the name to exist - return (*it); + // we require the name to exist + lyx::Assert(false); + } + + lastLayoutName = name; + lastLayoutIndex = std::distance(layoutlist.begin(), cit); + + return *cit; } bool LyXTextClass::delete_layout(string const & name) { + if (name == defaultLayoutName()) + return false; + LayoutList::iterator it = remove_if(layoutlist.begin(), layoutlist.end(), lyx::compare_memfun(&LyXLayout::name, name)); @@ -508,25 +557,139 @@ bool LyXTextClass::delete_layout(string const & name) // Load textclass info if not loaded yet -void LyXTextClass::load() +bool LyXTextClass::load() const { - if (loaded) return; + if (loaded) + return true; // Read style-file string const real_file = LibFileSearch("layouts", name_, "layout"); - if (Read(real_file)) { + if (const_cast(this)->Read(real_file)) { lyxerr << "Error reading `" << MakeDisplayPath(real_file) << "'\n(Check `" << name_ << "')\nCheck your installation and " "try Options/Reconfigure..." << endl; + loaded = false; } loaded = true; + return loaded; + +} + + +string const LyXTextClass::defaultLayoutName() const +{ + // This really should come from the actual layout... (Lgb) + return defaultlayout_; +} + + +LyXLayout const & LyXTextClass::defaultLayout() const +{ + return operator[](defaultLayoutName()); +} + + +string const & LyXTextClass::name() const +{ + return name_; +} + + +string const & LyXTextClass::latexname() const +{ + const_cast(this)->load(); + return latexname_; +} + + +string const & LyXTextClass::description() const +{ + return description_; +} + + +string const & LyXTextClass::opt_fontsize() const +{ + return opt_fontsize_; +} + + +string const & LyXTextClass::opt_pagestyle() const +{ + return opt_pagestyle_; +} + + +string const & LyXTextClass::options() const +{ + return options_; +} + + +string const & LyXTextClass::pagestyle() const +{ + return pagestyle_; +} + + +string const & LyXTextClass::preamble() const +{ + return preamble_; +} + + +LyXTextClass::PageSides LyXTextClass::sides() const +{ + return sides_; +} + + +int LyXTextClass::secnumdepth() const +{ + return secnumdepth_; +} + + +int LyXTextClass::tocdepth() const +{ + return tocdepth_; +} + + +OutputType LyXTextClass::outputType() const +{ + return outputType_; +} + + +bool LyXTextClass::provides(LyXTextClass::Provides p) const +{ + return provides_ & p; +} + + +unsigned int LyXTextClass::columns() const +{ + return columns_; +} + + +int LyXTextClass::maxcounter() const +{ + return maxcounter_; +} + + +int LyXTextClass::size() const +{ + return layoutlist.size(); } -std::ostream & operator<<(std::ostream & os, LyXTextClass::PageSides p) +ostream & operator<<(ostream & os, LyXTextClass::PageSides p) { switch (p) { case LyXTextClass::OneSide: