X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FTextClass.cpp;h=b77f31b3369c68b7422fe8f5e99ec8b1657d29c1;hb=e100536d59170a1c99437ea22b6fd1bea864bcf0;hp=93eae96b9c2dfb24d86a56a8285002b0c761846b;hpb=98656dd15b705405a6b69ea9c43f4b2b15dd0bfe;p=lyx.git diff --git a/src/TextClass.cpp b/src/TextClass.cpp index 93eae96b9c..b77f31b336 100644 --- a/src/TextClass.cpp +++ b/src/TextClass.cpp @@ -30,6 +30,7 @@ #include "support/lassert.h" #include "support/debug.h" +#include "support/ExceptionMessage.h" #include "support/FileName.h" #include "support/filetools.h" #include "support/gettext.h" @@ -60,7 +61,7 @@ namespace lyx { // development/tools/updatelayouts.sh script, to update the format of // all of our layout files. // -int const LAYOUT_FORMAT = 40; // rgh categorized layouts +int const LAYOUT_FORMAT = 48; //rgh: initial values for counter namespace { @@ -182,6 +183,7 @@ enum TextClassTags { TC_IFSTYLE, TC_DEFAULTSTYLE, TC_INSETLAYOUT, + TC_NOINSETLAYOUT, TC_NOSTYLE, TC_COLUMNS, TC_SIDES, @@ -195,6 +197,7 @@ enum TextClassTags { TC_HTMLSTYLES, TC_PROVIDES, TC_REQUIRES, + TC_PKGOPTS, TC_LEFTMARGIN, TC_RIGHTMARGIN, TC_FLOAT, @@ -222,50 +225,52 @@ enum TextClassTags { namespace { - LexerKeyword textClassTags[] = { - { "addtohtmlpreamble", TC_ADDTOHTMLPREAMBLE }, - { "addtohtmlstyles", TC_ADDTOHTMLSTYLES }, - { "addtopreamble", TC_ADDTOPREAMBLE }, - { "citeengine", TC_CITEENGINE }, - { "citeenginetype", TC_CITEENGINETYPE }, - { "citeformat", TC_CITEFORMAT }, - { "classoptions", TC_CLASSOPTIONS }, - { "columns", TC_COLUMNS }, - { "counter", TC_COUNTER }, - { "defaultbiblio", TC_DEFAULTBIBLIO }, - { "defaultfont", TC_DEFAULTFONT }, - { "defaultmodule", TC_DEFAULTMODULE }, - { "defaultstyle", TC_DEFAULTSTYLE }, - { "excludesmodule", TC_EXCLUDESMODULE }, - { "float", TC_FLOAT }, - { "format", TC_FORMAT }, - { "fullauthorlist", TC_FULLAUTHORLIST }, - { "htmlpreamble", TC_HTMLPREAMBLE }, - { "htmlstyles", TC_HTMLSTYLES }, - { "htmltocsection", TC_HTMLTOCSECTION }, - { "ifcounter", TC_IFCOUNTER }, - { "ifstyle", TC_IFSTYLE }, - { "input", TC_INPUT }, - { "insetlayout", TC_INSETLAYOUT }, - { "leftmargin", TC_LEFTMARGIN }, - { "nocounter", TC_NOCOUNTER }, - { "nofloat", TC_NOFLOAT }, - { "nostyle", TC_NOSTYLE }, - { "outputformat", TC_OUTPUTFORMAT }, - { "outputtype", TC_OUTPUTTYPE }, - { "pagestyle", TC_PAGESTYLE }, - { "preamble", TC_PREAMBLE }, - { "provides", TC_PROVIDES }, - { "providesmodule", TC_PROVIDESMODULE }, - { "requires", TC_REQUIRES }, - { "rightmargin", TC_RIGHTMARGIN }, - { "secnumdepth", TC_SECNUMDEPTH }, - { "sides", TC_SIDES }, - { "style", TC_STYLE }, - { "titlelatexname", TC_TITLELATEXNAME }, - { "titlelatextype", TC_TITLELATEXTYPE }, - { "tocdepth", TC_TOCDEPTH } - }; +LexerKeyword textClassTags[] = { + { "addtohtmlpreamble", TC_ADDTOHTMLPREAMBLE }, + { "addtohtmlstyles", TC_ADDTOHTMLSTYLES }, + { "addtopreamble", TC_ADDTOPREAMBLE }, + { "citeengine", TC_CITEENGINE }, + { "citeenginetype", TC_CITEENGINETYPE }, + { "citeformat", TC_CITEFORMAT }, + { "classoptions", TC_CLASSOPTIONS }, + { "columns", TC_COLUMNS }, + { "counter", TC_COUNTER }, + { "defaultbiblio", TC_DEFAULTBIBLIO }, + { "defaultfont", TC_DEFAULTFONT }, + { "defaultmodule", TC_DEFAULTMODULE }, + { "defaultstyle", TC_DEFAULTSTYLE }, + { "excludesmodule", TC_EXCLUDESMODULE }, + { "float", TC_FLOAT }, + { "format", TC_FORMAT }, + { "fullauthorlist", TC_FULLAUTHORLIST }, + { "htmlpreamble", TC_HTMLPREAMBLE }, + { "htmlstyles", TC_HTMLSTYLES }, + { "htmltocsection", TC_HTMLTOCSECTION }, + { "ifcounter", TC_IFCOUNTER }, + { "ifstyle", TC_IFSTYLE }, + { "input", TC_INPUT }, + { "insetlayout", TC_INSETLAYOUT }, + { "leftmargin", TC_LEFTMARGIN }, + { "nocounter", TC_NOCOUNTER }, + { "nofloat", TC_NOFLOAT }, + { "noinsetlayout", TC_NOINSETLAYOUT }, + { "nostyle", TC_NOSTYLE }, + { "outputformat", TC_OUTPUTFORMAT }, + { "outputtype", TC_OUTPUTTYPE }, + { "packageoptions", TC_PKGOPTS }, + { "pagestyle", TC_PAGESTYLE }, + { "preamble", TC_PREAMBLE }, + { "provides", TC_PROVIDES }, + { "providesmodule", TC_PROVIDESMODULE }, + { "requires", TC_REQUIRES }, + { "rightmargin", TC_RIGHTMARGIN }, + { "secnumdepth", TC_SECNUMDEPTH }, + { "sides", TC_SIDES }, + { "style", TC_STYLE }, + { "titlelatexname", TC_TITLELATEXNAME }, + { "titlelatextype", TC_TITLELATEXTYPE }, + { "tocdepth", TC_TOCDEPTH } +}; } //namespace anon @@ -525,6 +530,16 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt) } break; + case TC_NOINSETLAYOUT: + if (lexrc.next()) { + docstring const style = from_utf8(subst(lexrc.getString(), + '_', ' ')); + if (!deleteInsetLayout(style)) + LYXERR0("Style `" << style << "' cannot be removed\n" + "because it was not found!"); + } + break; + case TC_COLUMNS: if (lexrc.next()) columns_ = lexrc.getInteger(); @@ -621,6 +636,15 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt) break; } + case TC_PKGOPTS : { + lexrc.next(); + string const pkg = lexrc.getString(); + lexrc.next(); + string const options = lexrc.getString(); + package_options_[pkg] = options; + break; + } + case TC_DEFAULTMODULE: { lexrc.next(); string const module = lexrc.getString(); @@ -949,6 +973,8 @@ bool TextClass::readCiteEngine(Lexer & lexrc) cite_styles_[ENGINE_TYPE_AUTHORYEAR].clear(); if (type & ENGINE_TYPE_NUMERICAL) cite_styles_[ENGINE_TYPE_NUMERICAL].clear(); + if (type & ENGINE_TYPE_DEFAULT) + cite_styles_[ENGINE_TYPE_DEFAULT].clear(); string def; bool getout = false; while (!getout && lexrc.isOK()) { @@ -988,6 +1014,8 @@ bool TextClass::readCiteEngine(Lexer & lexrc) cite_styles_[ENGINE_TYPE_AUTHORYEAR].push_back(cs); if (type & ENGINE_TYPE_NUMERICAL) cite_styles_[ENGINE_TYPE_NUMERICAL].push_back(cs); + if (type & ENGINE_TYPE_DEFAULT) + cite_styles_[ENGINE_TYPE_DEFAULT].push_back(cs); } return getout; } @@ -995,8 +1023,8 @@ bool TextClass::readCiteEngine(Lexer & lexrc) int TextClass::readCiteEngineType(Lexer & lexrc) const { - int const ENGINE_TYPE_DEFAULT = - ENGINE_TYPE_AUTHORYEAR | ENGINE_TYPE_NUMERICAL; + LATTEST(ENGINE_TYPE_DEFAULT == + (ENGINE_TYPE_AUTHORYEAR | ENGINE_TYPE_NUMERICAL)); if (!lexrc.next()) { lexrc.printError("No cite engine type given for token: `$$Token'."); return ENGINE_TYPE_DEFAULT; @@ -1037,11 +1065,15 @@ bool TextClass::readCiteFormat(Lexer & lexrc) cite_macros_[ENGINE_TYPE_AUTHORYEAR][etype] = definition; if (type & ENGINE_TYPE_NUMERICAL) cite_macros_[ENGINE_TYPE_NUMERICAL][etype] = definition; + if (type & ENGINE_TYPE_DEFAULT) + cite_macros_[ENGINE_TYPE_DEFAULT][etype] = definition; } else { if (type & ENGINE_TYPE_AUTHORYEAR) cite_formats_[ENGINE_TYPE_AUTHORYEAR][etype] = definition; if (type & ENGINE_TYPE_NUMERICAL) cite_formats_[ENGINE_TYPE_NUMERICAL][etype] = definition; + if (type & ENGINE_TYPE_DEFAULT) + cite_formats_[ENGINE_TYPE_DEFAULT][etype] = definition; } } return true; @@ -1237,6 +1269,7 @@ string const & TextClass::prerequisites(string const & sep) const return prerequisites_; } + bool TextClass::hasLayout(docstring const & n) const { docstring const name = n.empty() ? defaultLayoutName() : n; @@ -1251,31 +1284,27 @@ bool TextClass::hasInsetLayout(docstring const & n) const { if (n.empty()) return false; - InsetLayouts::const_iterator it = insetlayoutlist_.begin(); - InsetLayouts::const_iterator en = insetlayoutlist_.end(); - for (; it != en; ++it) - if (n == it->first) - return true; - return false; + InsetLayouts::const_iterator it = insetlayoutlist_.find(n); + return it != insetlayoutlist_.end(); } Layout const & TextClass::operator[](docstring const & name) const { - LASSERT(!name.empty(), /**/); + LATTEST(!name.empty()); const_iterator it = find_if(begin(), end(), LayoutNamesEqual(name)); if (it == end()) { - lyxerr << "We failed to find the layout '" << to_utf8(name) - << "' in the layout list. You MUST investigate!" - << endl; + LYXERR0("We failed to find the layout '" << name + << "' in the layout list. You MUST investigate!"); for (const_iterator cit = begin(); cit != end(); ++cit) lyxerr << " " << to_utf8(cit->name()) << endl; - // we require the name to exist - LASSERT(false, /**/); + // We require the name to exist + static const Layout dummy; + LASSERT(false, return dummy); } return *it; @@ -1284,7 +1313,8 @@ Layout const & TextClass::operator[](docstring const & name) const Layout & TextClass::operator[](docstring const & name) { - LASSERT(!name.empty(), /**/); + LATTEST(!name.empty()); + // Safe to continue, given what we do below. iterator it = find_if(begin(), end(), LayoutNamesEqual(name)); @@ -1295,7 +1325,10 @@ Layout & TextClass::operator[](docstring const & name) LYXERR0(" " << to_utf8(cit->name())); // we require the name to exist - LASSERT(false, /**/); + LATTEST(false); + // we are here only in release mode + layoutlist_.push_back(createBasicLayout(name, true)); + it = find_if(begin(), end(), LayoutNamesEqual(name)); } return *it; @@ -1318,6 +1351,12 @@ bool TextClass::deleteLayout(docstring const & name) } +bool TextClass::deleteInsetLayout(docstring const & name) +{ + return insetlayoutlist_.erase(name); +} + + // Load textclass info if not loaded yet bool TextClass::load(string const & path) const { @@ -1356,6 +1395,24 @@ bool DocumentClass::addLayoutIfNeeded(docstring const & n) const } +string DocumentClass::forcedLayouts() const +{ + ostringstream os; + bool first = true; + const_iterator const e = end(); + for (const_iterator i = begin(); i != e; ++i) { + if (i->forcelocal > 0) { + if (first) { + os << "Format " << LAYOUT_FORMAT << '\n'; + first = false; + } + i->write(os); + } + } + return os.str(); +} + + InsetLayout const & DocumentClass::insetLayout(docstring const & name) const { // FIXME The fix for the InsetLayout part of 4812 would be here: @@ -1425,7 +1482,7 @@ Layout TextClass::createBasicLayout(docstring const & name, bool unknown) const if (!readStyle(lex, *defaultLayout)) { // The only way this happens is because the hardcoded layout above // is wrong. - LASSERT(false, /**/); + LATTEST(false); }; return *defaultLayout; } @@ -1516,8 +1573,9 @@ Layout const & DocumentClass::getTOCLayout() const Layout const * lay = NULL; for (; lit != len; ++lit) { int const level = lit->toclevel; - // we don't want Part - if (level == Layout::NOT_IN_TOC || level < 0 || level >= minlevel) + // we don't want Part or unnumbered sections + if (level == Layout::NOT_IN_TOC || level < 0 + || level >= minlevel || lit->counter.empty()) continue; lay = &*lit; minlevel = level; @@ -1531,9 +1589,8 @@ Layout const & DocumentClass::getTOCLayout() const Layout const & DocumentClass::htmlTOCLayout() const { - if (html_toc_section_.empty()) { + if (html_toc_section_.empty()) html_toc_section_ = getTOCLayout().name(); - } return operator[](html_toc_section_); }