X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyxtextclass.C;h=376f20975a3a8c714c03ce6974be2adcafc6994f;hb=c0eb43a927a49e054afbdf37e50387065c3d99a4;hp=5d87ca71aaed38558355166449488e3bb0b71b7c;hpb=6b9e0044d3cbbabb28ef50424badfcd795056b66;p=lyx.git diff --git a/src/lyxtextclass.C b/src/lyxtextclass.C index 5d87ca71aa..376f20975a 100644 --- a/src/lyxtextclass.C +++ b/src/lyxtextclass.C @@ -18,6 +18,8 @@ #include "lyxtextclass.h" #include "debug.h" #include "lyxlex.h" +#include "counters.h" +#include "FloatList.h" #include "support/lstrings.h" #include "support/LAssert.h" @@ -48,7 +50,8 @@ struct compare_name { LyXTextClass::LyXTextClass(string const & fn, string const & cln, string const & desc) - : name_(fn), latexname_(cln), description_(desc) + : name_(fn), latexname_(cln), description_(desc), + floatlist_(new FloatList), ctrs_(new Counters) { outputType_ = LATEX; columns_ = 1; @@ -71,15 +74,9 @@ bool LyXTextClass::do_readStyle(LyXLex & lexrc, LyXLayout & lay) if (!lay.Read(lexrc, *this)) { // Resolve fonts lay.resfont = lay.font; -#ifndef INHERIT_LANGUAGE lay.resfont.realize(defaultfont()); lay.reslabelfont = lay.labelfont; lay.reslabelfont.realize(defaultfont()); -#else - lay.resfont.realize(defaultfont(), default_language); - lay.reslabelfont = lay.labelfont; - lay.reslabelfont.realize(defaultfont(), default_language); -#endif return false; // no errors } lyxerr << "Error parsing style `" << lay.name() << "'" << endl; @@ -108,7 +105,9 @@ enum TextClassTags { TC_PROVIDESURL, TC_LEFTMARGIN, TC_RIGHTMARGIN, - TC_FLOAT + TC_FLOAT, + TC_COUNTER, + TC_NOFLOAT }; @@ -118,12 +117,14 @@ bool LyXTextClass::Read(string const & filename, bool merge) keyword_item textClassTags[] = { { "classoptions", TC_CLASSOPTIONS }, { "columns", TC_COLUMNS }, + { "counter", TC_COUNTER }, { "defaultfont", TC_DEFAULTFONT }, { "defaultstyle", TC_DEFAULTSTYLE }, { "float", TC_FLOAT }, { "input", TC_INPUT }, { "leftmargin", TC_LEFTMARGIN }, { "maxcounter", TC_MAXCOUNTER }, + { "nofloat", TC_NOFLOAT }, { "nostyle", TC_NOSTYLE }, { "outputtype", TC_OUTPUTTYPE }, { "pagestyle", TC_PAGESTYLE }, @@ -148,7 +149,7 @@ bool LyXTextClass::Read(string const & filename, bool merge) << MakeDisplayPath(filename) << endl; - LyXLex lexrc(textClassTags, TC_FLOAT); + LyXLex lexrc(textClassTags, TC_NOFLOAT); bool error = false; lexrc.setFile(filename); @@ -263,12 +264,7 @@ bool LyXTextClass::Read(string const & filename, bool merge) if (!defaultfont_.resolved()) { lexrc.printError("Warning: defaultfont should " "be fully instantiated!"); -#ifndef INHERIT_LANGUAGE defaultfont_.realize(LyXFont(LyXFont::ALL_SANE)); -#else - defaultfont_.realize(LyXFont(LyXFont::ALL_SANE), - default_language); -#endif } break; @@ -327,6 +323,16 @@ bool LyXTextClass::Read(string const & filename, bool merge) case TC_FLOAT: readFloat(lexrc); break; + case TC_COUNTER: + readCounter(lexrc); + break; + case TC_NOFLOAT: + if (lexrc.next()) { + string const nofloat = lexrc.getString(); + floatlist_->erase(nofloat); + } + break; + } } @@ -593,7 +599,65 @@ void LyXTextClass::readFloat(LyXLex & lexrc) if (getout) { Floating newfloat(type, placement, ext, within, style, name, listname, builtin); - floatlist_.newFloat(newfloat); + floatlist_->newFloat(newfloat); + } + + lexrc.popTable(); +} + + +enum CounterTags { + CT_NAME = 1, + CT_WITHIN, + CT_END +}; + +void LyXTextClass::readCounter(LyXLex & lexrc) +{ + keyword_item counterTags[] = { + { "end", CT_END }, + { "name", CT_NAME }, + { "within", CT_WITHIN } + }; + + lexrc.pushTable(counterTags, CT_END); + + string name; + string within; + + bool getout = false; + while (!getout && lexrc.isOK()) { + int le = lexrc.lex(); + switch (le) { + case LyXLex::LEX_UNDEF: + lexrc.printError("Unknown ClassOption tag `$$Token'"); + continue; + default: break; + } + switch (static_cast(le)) { + case CT_NAME: + lexrc.next(); + name = lexrc.getString(); + break; + case CT_WITHIN: + lexrc.next(); + within = lexrc.getString(); + if (within == "none") + within.erase(); + break; + case CT_END: + getout = true; + break; + } + } + + // Here if have a full float if getout == true + if (getout) { + if (within.empty()) { + ctrs_->newCounter(name); + } else { + ctrs_->newCounter(name, within); + } } lexrc.popTable(); @@ -704,17 +768,23 @@ bool LyXTextClass::load() const FloatList & LyXTextClass::floats() { - return floatlist_; + return *floatlist_.get(); } FloatList const & LyXTextClass::floats() const { - return floatlist_; + return *floatlist_.get(); +} + + +Counters & LyXTextClass::counters() const +{ + return *ctrs_.get(); } -string const LyXTextClass::defaultLayoutName() const +string const & LyXTextClass::defaultLayoutName() const { // This really should come from the actual layout... (Lgb) return defaultlayout_;