X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyxtextclass.C;h=a84fdea8b2bcc0ac042341c4008c5ebcd83e9993;hb=06f9f0ea08ddcf13e99ea02cff21471aa2020c9e;hp=cefc00a93b7540468a8708a3692662fb3a9d4099;hpb=dbd7a961fc46bb10c85bdd8c7fb6626477ae63d8;p=lyx.git diff --git a/src/lyxtextclass.C b/src/lyxtextclass.C index cefc00a93b..a84fdea8b2 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. * @@ -69,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; } @@ -91,6 +91,7 @@ enum TextClassTags { TC_CLASSOPTIONS, TC_PREAMBLE, TC_PROVIDESAMSMATH, + TC_PROVIDESNATBIB, TC_PROVIDESMAKEIDX, TC_PROVIDESURL, TC_LEFTMARGIN, @@ -115,6 +116,7 @@ bool LyXTextClass::Read(string const & filename, bool merge) { "preamble", TC_PREAMBLE }, { "providesamsmath", TC_PROVIDESAMSMATH }, { "providesmakeidx", TC_PROVIDESMAKEIDX }, + { "providesnatbib", TC_PROVIDESNATBIB }, { "providesurl", TC_PROVIDESURL }, { "rightmargin", TC_RIGHTMARGIN }, { "secnumdepth", TC_SECNUMDEPTH }, @@ -131,37 +133,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); @@ -172,23 +174,32 @@ bool LyXTextClass::Read(string const & filename, bool merge) case TC_DEFAULTSTYLE: if (lexrc.next()) { - string const name = subst(lowercase(lexrc.getString()), '_', ' '); + string const name = subst(lexrc.getString(), + '_', ' '); defaultlayout_ = name; } break; - + case TC_STYLE: if (lexrc.next()) { - string const name = subst(lowercase(lexrc.getString()), + string const name = subst(lexrc.getString(), '_', ' '); if (hasLayout(name)) { - LyXLayout & lay = operator[](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 { @@ -199,7 +210,7 @@ bool LyXTextClass::Read(string const & filename, bool merge) case TC_NOSTYLE: if (lexrc.next()) { - string const style = subst(lowercase(lexrc.getString()), + string const style = subst(lexrc.getString(), '_', ' '); if (!delete_layout(style)) lyxerr << "Cannot delete style `" << style << "'" << endl; @@ -212,7 +223,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()) { @@ -227,12 +238,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()) { @@ -242,7 +253,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; @@ -261,10 +272,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"); @@ -275,6 +286,11 @@ bool LyXTextClass::Read(string const & filename, bool merge) provides_ |= amsmath; break; + case TC_PROVIDESNATBIB: + if (lexrc.next() && lexrc.getInteger()) + provides_ |= natbib; + break; + case TC_PROVIDESMAKEIDX: if (lexrc.next() && lexrc.getInteger()) provides_ |= makeidx; @@ -282,23 +298,23 @@ bool LyXTextClass::Read(string const & filename, bool merge) case TC_PROVIDESURL: if (lexrc.next() && lexrc.getInteger()) - provides_ = url; + provides_ |= url; 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()) { @@ -307,7 +323,7 @@ bool LyXTextClass::Read(string const & filename, bool merge) error = true; } } else - lyxerr[Debug::TCLASS] << "Finished reading input file " + lyxerr[Debug::TCLASS] << "Finished reading input file " << MakeDisplayPath(filename) << endl; @@ -380,7 +396,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)) { @@ -442,7 +458,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)) { @@ -452,7 +468,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(); @@ -487,8 +503,8 @@ string const & LyXTextClass::rightmargin() const bool LyXTextClass::hasLayout(string const & n) const { - string const name = (n.empty() ? defaultLayoutName() : lowercase(n)); - + string const name = (n.empty() ? defaultLayoutName() : n); + return find_if(layoutlist.begin(), layoutlist.end(), lyx::compare_memfun(&LyXLayout::name, name)) != layoutlist.end(); @@ -497,61 +513,46 @@ bool LyXTextClass::hasLayout(string const & n) 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() : lowercase(n)); - - LayoutList::const_iterator cit = - find_if(layoutlist.begin(), - layoutlist.end(), - lyx::compare_memfun(&LyXLayout::name, name)); - if (cit == layoutlist.end()) { - lyxerr << "We failed to find the layout '" << name - << "' in the layout list. You MUST investigate!" - << endl; - - // we require the name to exist - lyx::Assert(false); - } + string const name = (n.empty() ? defaultLayoutName() : n); - return *cit; -} + static string lastLayoutName; + static LayoutList::difference_type lastLayoutIndex; + if (name == lastLayoutName) + return layoutlist[lastLayoutIndex]; -LyXLayout & LyXTextClass::operator[](string const & n) -{ - if (n.empty()) - lyxerr << "Operator[] called with empty n" << endl; - string const name = (n.empty() ? defaultLayoutName() : lowercase(n)); - - LayoutList::iterator it = + LayoutList::const_iterator cit = find_if(layoutlist.begin(), layoutlist.end(), lyx::compare_memfun(&LyXLayout::name, name)); - if (it == layoutlist.end()) { + if (cit == layoutlist.end()) { lyxerr << "We failed to find the layout '" << name << "' in the layout list. You MUST investigate!" << endl; - + // we require the name to exist lyx::Assert(false); } - - return *it; + + lastLayoutName = name; + lastLayoutIndex = std::distance(layoutlist.begin(), cit); + + return *cit; } -bool LyXTextClass::delete_layout(string const & n) +bool LyXTextClass::delete_layout(string const & name) { - string const name = lowercase(n); - if (name == defaultLayoutName()) return false; - + LayoutList::iterator it = remove_if(layoutlist.begin(), layoutlist.end(), lyx::compare_memfun(&LyXLayout::name, name)); @@ -581,7 +582,7 @@ bool LyXTextClass::load() const } loaded = true; return loaded; - + } @@ -598,12 +599,6 @@ LyXLayout const & LyXTextClass::defaultLayout() const } -LyXLayout & LyXTextClass::defaultLayout() -{ - return operator[](defaultLayoutName()); -} - - string const & LyXTextClass::name() const { return name_; @@ -681,7 +676,7 @@ bool LyXTextClass::provides(LyXTextClass::Provides p) const { return provides_ & p; } - + unsigned int LyXTextClass::columns() const {