From: Richard Heck Date: Wed, 12 Aug 2009 14:50:01 +0000 (+0000) Subject: IfStyle and IfCounter tags for layout. Docs to follow. X-Git-Tag: 2.0.0~5768 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=1f8bf874aad7ce9367568bfd6521f35cbb2cbe66;p=features.git IfStyle and IfCounter tags for layout. Docs to follow. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@30989 a592a061-630c-0410-9148-cb99ea01b6c8 --- diff --git a/lib/scripts/layout2layout.py b/lib/scripts/layout2layout.py index 4680c1f1be..edc7db2c1c 100644 --- a/lib/scripts/layout2layout.py +++ b/lib/scripts/layout2layout.py @@ -67,7 +67,7 @@ import os, re, string, sys # Do not forget to document format change in Customization # Manual (section "Declaring a new text class"). -currentFormat = 16 +currentFormat = 17 def usage(prog_name): @@ -256,7 +256,7 @@ def convert(lines): continue # This just involved new features, not any changes to old ones - if format == 14 or format == 15: + if format == 14 or format == 15 or format == 16: i += 1 continue diff --git a/src/Counters.cpp b/src/Counters.cpp index b7e473a2a2..a0f1d139d7 100644 --- a/src/Counters.cpp +++ b/src/Counters.cpp @@ -171,18 +171,20 @@ bool Counters::hasCounter(docstring const & c) const } -bool Counters::read(Lexer & lex, docstring const & name) +bool Counters::read(Lexer & lex, docstring const & name, bool makenew) { if (hasCounter(name)) { LYXERR(Debug::TCLASS, "Reading existing counter " << to_utf8(name)); return counterList_[name].read(lex); } + LYXERR(Debug::TCLASS, "Reading new counter " << to_utf8(name)); Counter cnt; bool success = cnt.read(lex); - if (success) + // if makenew is false, we will just discard what we read + if (success && makenew) counterList_[name] = cnt; - else + else if (!success) LYXERR0("Error reading counter `" << name << "'!"); return success; } diff --git a/src/Counters.h b/src/Counters.h index fdae212a26..e081ad21bb 100644 --- a/src/Counters.h +++ b/src/Counters.h @@ -99,8 +99,10 @@ public: /// Checks whether the given counter exists. bool hasCounter(docstring const & c) const; /// reads the counter name + /// \param makeNew whether to make a new counter if one + /// doesn't already exist /// \return true on success - bool read(Lexer & lex, docstring const & name); + bool read(Lexer & lex, docstring const & name, bool makenew); /// void set(docstring const & ctr, int val); /// diff --git a/src/TextClass.cpp b/src/TextClass.cpp index 0a349e8572..4102a345c2 100644 --- a/src/TextClass.cpp +++ b/src/TextClass.cpp @@ -62,7 +62,7 @@ private: }; // Keep the changes documented in the Customization manual. -int const FORMAT = 16; +int const FORMAT = 17; bool layout2layout(FileName const & filename, FileName const & tempfile) @@ -164,6 +164,7 @@ enum TextClassTags { TC_OUTPUTFORMAT, TC_INPUT, TC_STYLE, + TC_IFSTYLE, TC_DEFAULTSTYLE, TC_INSETLAYOUT, TC_NOSTYLE, @@ -182,6 +183,7 @@ enum TextClassTags { TC_RIGHTMARGIN, TC_FLOAT, TC_COUNTER, + TC_IFCOUNTER, TC_NOFLOAT, TC_TITLELATEXNAME, TC_TITLELATEXTYPE, @@ -209,6 +211,8 @@ namespace { { "float", TC_FLOAT }, { "format", TC_FORMAT }, { "htmlpreamble", TC_HTMLPREAMBLE }, + { "ifcounter", TC_IFCOUNTER }, + { "ifstyle", TC_IFSTYLE }, { "input", TC_INPUT }, { "insetlayout", TC_INSETLAYOUT }, { "leftmargin", TC_LEFTMARGIN }, @@ -352,6 +356,10 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt) break; } + // used below to track whether we are in an IfStyle or IfCounter tag. + bool ifstyle = false; + bool ifcounter = false; + switch (static_cast(le)) { case TC_FORMAT: @@ -404,6 +412,9 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt) } break; + case TC_IFSTYLE: + ifstyle = true; + // fall through case TC_STYLE: { if (!lexrc.next()) { lexrc.printError("No name given for style: `$$Token'."); @@ -423,7 +434,7 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt) } else if (hasLayout(name)) { Layout & lay = operator[](name); error = !readStyle(lexrc, lay); - } else { + } else if (!ifstyle) { Layout layout; layout.setName(name); error = !readStyle(lexrc, layout); @@ -436,6 +447,15 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt) defaultlayout_ = name; } } + else { + // scan the rest and discard it + Layout lay; + readStyle(lexrc, lay); + error = false; + } + + // reset flag + ifstyle = false; break; } @@ -605,6 +625,8 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt) readFloat(lexrc); break; + case TC_IFCOUNTER: + ifcounter = true; case TC_COUNTER: if (lexrc.next()) { docstring const name = lexrc.getDocString(); @@ -617,12 +639,14 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt) // and discard it. c.read(lexrc); } else - error = !counters_.read(lexrc, name); + error = !counters_.read(lexrc, name, !ifcounter); } else { lexrc.printError("No name given for style: `$$Token'."); error = true; } + // reset flag + ifcounter = false; break; case TC_TITLELATEXTYPE: