From 4d94460ce32cd086206c4764687457f0c7133922 Mon Sep 17 00:00:00 2001 From: Richard Heck Date: Thu, 3 Dec 2015 21:06:28 -0500 Subject: [PATCH] Add new ProvideStyle tag, which adds a new style only if it does not already exist. This will allow for a proper fix for bug #8796, though that may or may not get fixed before 2.2.0. Also, change the InStyle tag to ModifyStyle, per a suggestion of Jurgen's. --- lib/scripts/layout2layout.py | 20 ++++++++++++++- src/TextClass.cpp | 47 +++++++++++++++++++++++++++--------- 2 files changed, 54 insertions(+), 13 deletions(-) diff --git a/lib/scripts/layout2layout.py b/lib/scripts/layout2layout.py index 617b0ccf44..48a1e03f21 100644 --- a/lib/scripts/layout2layout.py +++ b/lib/scripts/layout2layout.py @@ -189,6 +189,10 @@ import os, re, string, sys # Incremented to format 57, 30 May 2015 by spitz # New Layout tag "ParagraphGroup" +# Incremented to format 58, 5 December 2015, by rgh +# New Layout tag "ProvideStyle" +# Change "IfStyle" to "ModifyStyle" + # Do not forget to document format change in Customization # Manual (section "Declaring a new text class"). @@ -196,7 +200,7 @@ import os, re, string, sys # development/tools/updatelayouts.py script to update all # layout files to the new format. -currentFormat = 57 +currentFormat = 58 def usage(prog_name): @@ -265,6 +269,7 @@ def convert(lines): re_LabelStringAppendix = re.compile(r'^(\s*)(LabelStringAppendix)(\s+)(("[^"]+")|(\S+))', re.IGNORECASE) re_LatexType = re.compile(r'^(\s*)(LatexType)(\s+)(\S+)', re.IGNORECASE) re_Style = re.compile(r'^(\s*)(Style)(\s+)(\S+)', re.IGNORECASE) + re_IfStyle = re.compile(r'^(\s*)IfStyle(\s+\S+)', re.IGNORECASE) re_CopyStyle = re.compile(r'^(\s*)(CopyStyle)(\s+)(\S+)', re.IGNORECASE) re_NoStyle = re.compile(r'^(\s*)(NoStyle)(\s+)(\S+)', re.IGNORECASE) re_End = re.compile(r'^(\s*)(End)(\s*)$', re.IGNORECASE) @@ -420,6 +425,19 @@ def convert(lines): i += 1 continue + + if format == 57: + match = re_IfStyle.match(lines[i]) + if not match: + i += 1 + continue + # r'^(\s*)IfStyle(\s+\S+) + lead = match.group(1) + trail = match.group(2) + lines[i] = lead + "ModifyStyle" + trail + i += 1 + continue + if format >= 50 and format <= 56: # nothing to do. i += 1 diff --git a/src/TextClass.cpp b/src/TextClass.cpp index 17fc266ebd..0ee74a7b50 100644 --- a/src/TextClass.cpp +++ b/src/TextClass.cpp @@ -61,7 +61,7 @@ namespace lyx { // You should also run the development/tools/updatelayouts.py script, // to update the format of all of our layout files. // -int const LAYOUT_FORMAT = 57; //spitz: New Layout tag ParagraphGroup +int const LAYOUT_FORMAT = 58; // rgh: ProvideStyle namespace { @@ -173,7 +173,8 @@ enum TextClassTags { TC_OUTPUTFORMAT, TC_INPUT, TC_STYLE, - TC_IFSTYLE, + TC_MODIFYSTYLE, + TC_PROVIDESTYLE, TC_DEFAULTSTYLE, TC_INSETLAYOUT, TC_NOINSETLAYOUT, @@ -240,10 +241,10 @@ LexerKeyword textClassTags[] = { { "htmlstyles", TC_HTMLSTYLES }, { "htmltocsection", TC_HTMLTOCSECTION }, { "ifcounter", TC_IFCOUNTER }, - { "ifstyle", TC_IFSTYLE }, { "input", TC_INPUT }, { "insetlayout", TC_INSETLAYOUT }, { "leftmargin", TC_LEFTMARGIN }, + { "modifystyle", TC_MODIFYSTYLE }, { "nocounter", TC_NOCOUNTER }, { "nofloat", TC_NOFLOAT }, { "noinsetlayout", TC_NOINSETLAYOUT }, @@ -255,6 +256,7 @@ LexerKeyword textClassTags[] = { { "preamble", TC_PREAMBLE }, { "provides", TC_PROVIDES }, { "providesmodule", TC_PROVIDESMODULE }, + { "providestyle", TC_PROVIDESTYLE }, { "requires", TC_REQUIRES }, { "rightmargin", TC_RIGHTMARGIN }, { "secnumdepth", TC_SECNUMDEPTH }, @@ -413,8 +415,9 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt) } // used below to track whether we are in an IfStyle or IfCounter tag. - bool ifstyle = false; - bool ifcounter = false; + bool modifystyle = false; + bool providestyle = false; + bool ifcounter = false; switch (static_cast(le)) { @@ -467,9 +470,15 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt) } break; - case TC_IFSTYLE: - ifstyle = true; - // fall through + case TC_MODIFYSTYLE: + modifystyle = true; + // fall through + case TC_PROVIDESTYLE: + // if modifystyle is true, then we got here by falling through + // so we are not in an ProvideStyle block + if (!modifystyle) + providestyle = true; + // fall through case TC_STYLE: { if (!lexrc.next()) { lexrc.printError("No name given for style: `$$Token'."); @@ -486,10 +495,21 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt) // Since we couldn't read the name, we just scan the rest // of the style and discard it. error = !readStyle(lexrc, lay); - } else if (hasLayout(name)) { + break; + } + + bool const have_layout = hasLayout(name); + + // If the layout already exists, then we want to add it to + // the existing layout, as long as we are not in an ProvideStyle + // block. + if (have_layout && !providestyle) { Layout & lay = operator[](name); error = !readStyle(lexrc, lay); - } else if (!ifstyle) { + } + // If the layout does not exist, then we want to create a new + // one, but not if we are in a ModifyStyle block. + else if (!have_layout && !modifystyle) { Layout layout; layout.setName(name); error = !readStyle(lexrc, layout); @@ -502,9 +522,12 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt) defaultlayout_ = name; } } + // There are two ways to get here: + // (i) The layout exists but we are in an ProvideStyle block + // (ii) The layout doesn't exist, but we are in an ModifyStyle + // block. + // Either way, we just scan the rest and discard it else { - // this was an ifstyle where we didn't have the style - // scan the rest and discard it Layout lay; readStyle(lexrc, lay); } -- 2.39.2