commit 4d94460ce32cd086206c4764687457f0c7133922
Author: Richard Heck <[email protected]>
Date:   Thu Dec 3 21:06:28 2015 -0500

    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.

diff --git a/lib/scripts/layout2layout.py b/lib/scripts/layout2layout.py
index 617b0cc..48a1e03 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 17fc266..0ee74a7 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<TextClassTags>(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);
                        }

Reply via email to