Hi Richard,

the attached patch fixes several box reversion issues in lyx2lyx. Scott could verify that the conversion to LyX 2.1.x works now as expected. Could this therefore also go in for LyX 2.2.3?

----------

Another issue: when I compare lyx-2_2.py in master with branch I see a lot of changes. I think these fixes should be backported because this file is for the conversion from LyX 2.2.x to 2.1.x.

thanks and regards
Uwe
diff --git 
"a/C:\\Users\\Usti\\AppData\\Local\\Temp\\TortoiseGit\\lyx_2_2-7ceaa7e.000.py" 
"b/D:\\LyXGit\\2.2.x\\lib\\lyx2lyx\\lyx_2_2.py"
index 83922afdb4..c30477de17 100644
--- 
"a/C:\\Users\\Usti\\AppData\\Local\\Temp\\TortoiseGit\\lyx_2_2-7ceaa7e.000.py"
+++ "b/D:\\LyXGit\\2.2.x\\lib\\lyx2lyx\\lyx_2_2.py"
@@ -1089,43 +1089,57 @@ def revert_BoxFeatures(document):
     defaultThick = "0.4pt"
     defaultShadow = "4pt"
     while True:
-        i = find_token(document.body, "height_special", i)
+        i = find_token(document.body, "thickness", i)
         if i == -1:
             return
+        binset = find_token(document.body, "\\begin_inset Box", i - 11)
+        if binset == -1:
+            return # then "thickness" is is just a word in the text
+        einset = find_end_of_inset(document.body, binset)
+        if einset == -1:
+            document.warning("Malformed LyX document: Can't find end of box 
inset!")
+            continue
         # read out the values
+        beg = document.body[i].find('"');
+        end = document.body[i].rfind('"');
+        thickness = document.body[i][beg+1:end];
         beg = document.body[i+1].find('"');
         end = document.body[i+1].rfind('"');
-        thickness = document.body[i+1][beg+1:end];
+        separation = document.body[i+1][beg+1:end];
         beg = document.body[i+2].find('"');
         end = document.body[i+2].rfind('"');
-        separation = document.body[i+2][beg+1:end];
-        beg = document.body[i+3].find('"');
-        end = document.body[i+3].rfind('"');
-        shadowsize = document.body[i+3][beg+1:end];
+        shadowsize = document.body[i+2][beg+1:end];
         # delete the specification
-        del document.body[i+1:i+4]
+        del document.body[i:i+3]
         # output ERT
         # first output the closing brace
         if shadowsize != defaultShadow or separation != defaultSep or 
thickness != defaultThick:
-            document.body[i + 10 : i + 10] = put_cmd_in_ert("}")
+            document.body[einset -1 : einset - 1] = put_cmd_in_ert("}")
+        # we have now the problem that if there is already \(f)colorbox in ERT 
around the inset
+        # the ERT from this routine must be around it
+        regexp = re.compile(r'^.*colorbox{.*$')
+        pos = find_re(document.body, regexp, binset - 4)
+        if pos != -1 and pos == binset - 4:
+            pos = i - 11 - 10
+        else:
+            pos = i - 11
         # now output the lengths
         if shadowsize != defaultShadow or separation != defaultSep or 
thickness != defaultThick:
-            document.body[i - 10 : i - 10] = put_cmd_in_ert("{")
+            document.body[pos : pos] = put_cmd_in_ert("{")
         if thickness != defaultThick:
-            document.body[i - 5 : i - 4] = ["{\\backslash fboxrule " + 
thickness]
+            document.body[pos + 5 : pos +6] = ["{\\backslash fboxrule " + 
thickness]
         if separation != defaultSep and thickness == defaultThick:
-            document.body[i - 5 : i - 4] = ["{\\backslash fboxsep " + 
separation]
+            document.body[pos + 5 : pos +6] = ["{\\backslash fboxsep " + 
separation]
         if separation != defaultSep and thickness != defaultThick:
-            document.body[i - 5 : i - 4] = ["{\\backslash fboxrule " + 
thickness + "\\backslash fboxsep " + separation]
+            document.body[pos + 5 : pos +6] = ["{\\backslash fboxrule " + 
thickness + "\\backslash fboxsep " + separation]
         if shadowsize != defaultShadow and separation == defaultSep and 
thickness == defaultThick:
-            document.body[i - 5 : i - 4] = ["{\\backslash shadowsize " + 
shadowsize]
+            document.body[pos + 5 : pos +6] = ["{\\backslash shadowsize " + 
shadowsize]
         if shadowsize != defaultShadow and separation != defaultSep and 
thickness == defaultThick:
-            document.body[i - 5 : i - 4] = ["{\\backslash fboxsep " + 
separation + "\\backslash shadowsize " + shadowsize]
+            document.body[pos + 5 : pos +6] = ["{\\backslash fboxsep " + 
separation + "\\backslash shadowsize " + shadowsize]
         if shadowsize != defaultShadow and separation == defaultSep and 
thickness != defaultThick:
-            document.body[i - 5 : i - 4] = ["{\\backslash fboxrule " + 
thickness + "\\backslash shadowsize " + shadowsize]
+            document.body[pos + 5 : pos +6] = ["{\\backslash fboxrule " + 
thickness + "\\backslash shadowsize " + shadowsize]
         if shadowsize != defaultShadow and separation != defaultSep and 
thickness != defaultThick:
-            document.body[i - 5 : i - 4] = ["{\\backslash fboxrule " + 
thickness + "\\backslash fboxsep " + separation + "\\backslash shadowsize " + 
shadowsize]
-        i = i + 11
+            document.body[pos + 5 : pos +6] = ["{\\backslash fboxrule " + 
thickness + "\\backslash fboxsep " + separation + "\\backslash shadowsize " + 
shadowsize]
 
 
 def convert_origin(document):
@@ -1224,66 +1238,53 @@ def convert_colorbox(document):
 def revert_colorbox(document):
     " outputs color settings for boxes as TeX code "
 
-    binset = 0
+    i = 0
     defaultframecolor = "black"
     defaultbackcolor = "none"
     while True:
-        binset = find_token(document.body, "\\begin_inset Box", binset)
+        i = find_token(document.body, "framecolor", i)
+        if i == -1:
+            return
+        binset = find_token(document.body, "\\begin_inset Box", i - 14)
         if binset == -1:
             return
-
         einset = find_end_of_inset(document.body, binset)
         if einset == -1:
             document.warning("Malformed LyX document: Can't find end of box 
inset!")
-            binset += 1
             continue
-
-        blay = find_token(document.body, "\\begin_layout", binset, einset)
-        if blay == -1:
-            document.warning("Malformed LyX document: Can't find start of 
layout!")
-            binset = einset
-            continue
-
-        # doing it this way, we make sure only to find a framecolor option
-        frame = find_token(document.body, "framecolor", binset, blay)
-        if frame == -1:
-            binset = einset
-            continue
-
-        beg = document.body[frame].find('"')
-        end = document.body[frame].rfind('"')
-        framecolor = document.body[frame][beg + 1 : end]
-
-        # this should be on the next line
-        bgcolor = frame + 1
-        beg = document.body[bgcolor].find('"')
-        end = document.body[bgcolor].rfind('"')
-        backcolor = document.body[bgcolor][beg + 1 : end]
-
-        # delete those bits
-        del document.body[frame : frame + 2]
-        # adjust end of inset
-        einset -= 2
-
-        if document.body[binset] == "\\begin_inset Box Boxed" and \
-            framecolor != defaultframecolor:
-          document.body[binset] = "\\begin_inset Box Frameless"
-
-        # output TeX code
+        # read out the values
+        beg = document.body[i].find('"');
+        end = document.body[i].rfind('"');
+        framecolor = document.body[i][beg+1:end];
+        beg = document.body[i + 1].find('"');
+        end = document.body[i + 1].rfind('"');
+        backcolor = document.body[i+1][beg+1:end];
+        # delete the specification
+        del document.body[i:i + 2]
+        # output ERT
         # first output the closing brace
-        if framecolor == defaultframecolor and backcolor == defaultbackcolor:
-            # nothing needed
-            pass
-        else:
-            # we also neeed to load xcolor in the preamble but only once
+        if framecolor != defaultframecolor or backcolor != defaultbackcolor:
             add_to_preamble(document, 
["\\@ifundefined{rangeHsb}{\\usepackage{xcolor}}{}"])
-            document.body[einset + 2 : einset + 2] = put_cmd_in_ert("}")
-            if framecolor != defaultframecolor:
-                document.body[binset:binset] = put_cmd_in_ert("\\fcolorbox{" + 
framecolor + "}{" + backcolor + "}{")
-            else:
-              document.body[binset:binset] = put_cmd_in_ert("\\colorbox{" + 
backcolor + "}{")
-
-        binset = einset
+            document.body[einset : einset] = put_cmd_in_ert("}")
+        # determine the box type
+        isBox = find_token(document.body, "\\begin_inset Box Boxed", binset)
+        # now output the box commands
+        if (framecolor != defaultframecolor and isBox == binset) or (backcolor 
!= defaultbackcolor and isBox == binset):
+            document.body[i - 14 : i - 14] = put_cmd_in_ert("\\fcolorbox{" + 
framecolor + "}{" + backcolor + "}{")
+            # in the case we must also change the box type because the ERT 
code adds a frame
+            document.body[i - 4] = "\\begin_inset Box Frameless"
+            # if has_inner_box 0 we must set it and use_makebox to 1
+            ibox = find_token(document.body, "has_inner_box", i - 4)
+            if ibox == -1 or ibox != i - 1:
+                document.warning("Malformed LyX document: Can't find 
has_inner_box statement!")
+                continue
+            # read out the value
+            innerbox = document.body[ibox][-1:];
+            if innerbox == "0":
+                document.body[ibox] = "has_inner_box 1"
+                document.body[ibox + 3] = "use_makebox 1"
+        if backcolor != defaultbackcolor and isBox != binset:
+            document.body[i - 14 : i - 14] =  put_cmd_in_ert("\\colorbox{" + 
backcolor + "}{")
 
 
 def revert_mathmulticol(document):

Reply via email to