commit a77cfef1c61006b72df73560a2d301b7356ae3cc
Author: Günter Milde <mi...@lyx.org>
Date:   Wed Jan 24 01:02:24 2018 +0100

    Fix some more lyx2lyx round-trips.
    
    Also restore corrupted seminar example.
    Add default return value to parser_tools.is_in_inset().
---
 lib/examples/fr/seminar.lyx |   10 +----
 lib/examples/seminar.lyx    |    8 +---
 lib/lyx2lyx/lyx_2_0.py      |   75 ++++++++++++++++++++-----------------------
 lib/lyx2lyx/lyx_2_2.py      |   21 ++++++++----
 lib/lyx2lyx/parser_tools.py |   43 +++++++++++-------------
 5 files changed, 73 insertions(+), 84 deletions(-)

diff --git a/lib/examples/fr/seminar.lyx b/lib/examples/fr/seminar.lyx
index c851113..5fc8044 100644
--- a/lib/examples/fr/seminar.lyx
+++ b/lib/examples/fr/seminar.lyx
@@ -1,4 +1,4 @@
-#LyX 2.3 created this file. For more info see http://www.lyx.org/
+#LyX 2.4 created this file. For more info see https://www.lyx.org/
 \lyxformat 544
 \begin_document
 \begin_header
@@ -582,13 +582,7 @@ slideframe[
 \backslash
 setlength{
 \backslash
-shadowsize}{1pt}]{shadow}%
-\end_layout
-
-\begin_layout LyX-Code
-
-\lang english
-           framecolor "black" backgroundcolor
+shadowsize}{1pt}]{shadow}
 \end_layout
 
 \begin_layout Standard
diff --git a/lib/examples/seminar.lyx b/lib/examples/seminar.lyx
index a993687..f5a82c2 100644
--- a/lib/examples/seminar.lyx
+++ b/lib/examples/seminar.lyx
@@ -1,4 +1,4 @@
-#LyX 2.3 created this file. For more info see http://www.lyx.org/
+#LyX 2.4 created this file. For more info see https://www.lyx.org/
 \lyxformat 544
 \begin_document
 \begin_header
@@ -513,11 +513,7 @@ slideframe[
 \backslash
 setlength{
 \backslash
-shadowsize}{1pt}]{shadow}%
-\end_layout
-
-\begin_layout LyX-Code
-           framecolor "black" backgroundcolor "none"
+shadowsize}{1pt}]{shadow}
 \end_layout
 
 \begin_layout Standard
diff --git a/lib/lyx2lyx/lyx_2_0.py b/lib/lyx2lyx/lyx_2_0.py
index eefe0b2..3faf944 100644
--- a/lib/lyx2lyx/lyx_2_0.py
+++ b/lib/lyx2lyx/lyx_2_0.py
@@ -514,8 +514,6 @@ def convert_ulinelatex(document):
     " Remove preamble code for \\uline font attribute. "
     del_complete_lines(document.preamble,
                        ['% Added by lyx2lyx']+ulinelatex_preamble)
-    for line in document.preamble:
-        print line
 
 def revert_ulinelatex(document):
     " Add preamble code for \\uline font attribute in citations. "
@@ -835,6 +833,9 @@ def revert_suppress_date(document):
     del document.header[i]
 
 
+mhchem_preamble = [r"\PassOptionsToPackage{version=3}{mhchem}",
+                   r"\usepackage{mhchem}"]
+
 def convert_mhchem(document):
     "Set mhchem to off for versions older than 1.6.x"
     if document.initial_format < 277:
@@ -852,47 +853,44 @@ def convert_mhchem(document):
         # pre-1.5.x document
         i = find_token(document.header, "\\use_amsmath", 0)
     if i == -1:
-        document.warning("Malformed LyX document: Could not find amsmath os 
esint setting.")
+        document.warning("Malformed LyX document: "
+                         "Could not find amsmath or esint setting.")
         return
     document.header.insert(i + 1, "\\use_mhchem %d" % mhchem)
+    # remove LyX-inserted preamble 
+    if mhchem != 0:
+        del_complete_lines(document.preamble,
+                           ['% Added by lyx2lyx']+mhchem_preamble)
 
 
 def revert_mhchem(document):
-    "Revert mhchem loading to preamble code"
+    "Revert mhchem loading to preamble code."
 
-    mhchem = "off"
-    i = find_token(document.header, "\\use_mhchem", 0)
-    if i == -1:
-        document.warning("Malformed LyX document: Could not find mhchem 
setting.")
-        mhchem = "auto"
-    else:
-        val = get_value(document.header, "\\use_mhchem", i)
-        if val == "1":
-            mhchem = "auto"
-        elif val == "2":
-            mhchem = "on"
-        del document.header[i]
-
-    if mhchem == "off":
-      # don't load case
-      return
+    mhchem = get_value(document.header, "\\use_mhchem", delete=True)
+    try:
+        mhchem = int(mhchem)
+    except ValueError:
+        document.warning("Malformed LyX document: "
+                         "Could not find mhchem setting.")
+        mhchem = 1 # "auto"
+    # mhchem in {0: "off", 1: "auto", 2: "on"}
 
-    if mhchem == "auto":
+    if mhchem == 1: # "auto"
         i = 0
-        while True:
+        while i != 1 and mhchem == 1:
             i = find_token(document.body, "\\begin_inset Formula", i)
-            if i == -1:
-               break
-            line = document.body[i]
-            if line.find("\\ce{") != -1 or line.find("\\cf{") != -1:
-              mhchem = "on"
-              break
+            j = find_end_of_inset(document.body, i)
+            if j == -1:
+                break
+            if (True for line in document.body[i:j]
+                if r"\ce{" in line or r"\cf{" in line):
+                mhchem = 2
+                break
             i += 1
 
-    if mhchem == "on":
-        pre = ["\\PassOptionsToPackage{version=3}{mhchem}",
-          "\\usepackage{mhchem}"]
-        insert_to_preamble(document, pre)
+    if (mhchem == 2 # on
+        and find_token(document.preamble, r"\usepackage{mhchem}") == -1):
+        insert_to_preamble(document, mhchem_preamble)
 
 
 def revert_fontenc(document):
@@ -1681,12 +1679,10 @@ def revert_nameref(document):
       i += 1
       # Make sure it is actually in an inset!
       # A normal line could begin with "LatexCommand nameref"!
-      val = is_in_inset(document.body, cmdloc, \
-          "\\begin_inset CommandInset ref")
-      if not val:
+      stins, endins = is_in_inset(document.body, cmdloc,
+                                  "\\begin_inset CommandInset ref")
+      if endins == -1:
           continue
-      stins, endins = val
-
       # ok, so it is in an InsetRef
       refline = find_token(document.body, "reference", stins, endins)
       if refline == -1:
@@ -1716,10 +1712,9 @@ def remove_Nameref(document):
       break
     cmdloc = i
     i += 1
-
     # Make sure it is actually in an inset!
-    val = is_in_inset(document.body, cmdloc, \
-        "\\begin_inset CommandInset ref")
+    val = is_in_inset(document.body, cmdloc,
+                      "\\begin_inset CommandInset ref", default=False)
     if not val:
       continue
     document.body[cmdloc] = "LatexCommand nameref"
diff --git a/lib/lyx2lyx/lyx_2_2.py b/lib/lyx2lyx/lyx_2_2.py
index 1c7f3dc..b1b3a72 100644
--- a/lib/lyx2lyx/lyx_2_2.py
+++ b/lib/lyx2lyx/lyx_2_2.py
@@ -34,10 +34,11 @@ from lyx2lyx_tools import (add_to_preamble, put_cmd_in_ert, 
get_ert,
 #   insert_to_preamble, latex_length, revert_flex_inset,
 #   revert_font_attrs, hex2ratio, str2bool
 
-from parser_tools import (del_complete_lines,
+from parser_tools import (check_token, del_complete_lines,
     find_end_of_inset, find_end_of_layout, find_nonempty_line, find_re,
     find_token, find_token_backwards, get_containing_layout,
-    get_value, check_token)
+    get_value, is_in_inset)
+
 
 ####################################################################
 # Private helper functions
@@ -1253,15 +1254,21 @@ def revert_textcolor(document):
 
 
 def convert_colorbox(document):
-    " adds color settings for boxes "
-
-    i = 0
+    "Add color settings for boxes."
+    i = 1
     while True:
         i = find_token(document.body, "shadowsize", i)
         if i == -1:
             return
-        document.body[i+1:i+1] = ['framecolor "black"', 'backgroundcolor 
"none"']
-        i = i + 3
+        # check whether this is really a LyX Box setting
+        start, end = is_in_inset(document.body, i, "\\begin_inset Box")
+        if (end == -1 or
+            find_token(document.body, "\\begin_layout", start, i) != -1):
+            i += 1
+            continue
+        document.body[i+1:i+1] = ['framecolor "black"',
+                                  'backgroundcolor "none"']
+        i += 3
 
 
 def revert_colorbox(document):
diff --git a/lib/lyx2lyx/parser_tools.py b/lib/lyx2lyx/parser_tools.py
index 44914a9..06cb41d 100644
--- a/lib/lyx2lyx/parser_tools.py
+++ b/lib/lyx2lyx/parser_tools.py
@@ -113,17 +113,17 @@ find_end_of_sequence(lines, i):
   the position of the last \end_deeper is returned, else
   the position of the last \end_layout.
 
-is_in_inset(lines, i, inset):
-  Checks if line i is in an inset of the given type.
+is_in_inset(lines, i, inset, default=(-1,-1)):
+  Check if line i is in an inset of the given type.
   If so, returns starting and ending lines. Otherwise,
-  returns False.
+  return default.
   Example:
     is_in_inset(document.body, i, "\\begin_inset Tabular")
-  returns False unless i is within a table. If it is, then
+  returns (-1,-1) unless i is within a table. If it is, then
   it returns the line on which the table begins and the one
   on which it ends. Note that this pair will evaulate to
   boolean True, so
-    if is_in_inset(...):
+    if is_in_inset(..., default=False):
   will do what you expect.
 
 get_containing_inset(lines, i):
@@ -535,29 +535,26 @@ def find_end_of_layout(lines, i):
     return find_end_of(lines, i, "\\begin_layout", "\\end_layout")
 
 
-def is_in_inset(lines, i, inset):
-    '''
-    Checks if line i is in an inset of the given type.
-    If so, returns starting and ending lines.
-    Otherwise, returns False.
+def is_in_inset(lines, i, inset, default=(-1,-1)):
+    """
+    Check if line i is in an inset of the given type.
+    If so, return starting and ending lines, otherwise `default`.
     Example:
       is_in_inset(document.body, i, "\\begin_inset Tabular")
-    returns False unless i is within a table. If it is, then
-    it returns the line on which the table begins and the one
+    returns (-1,-1) if `i` is not within a "Tabular" inset (i.e. a table).
+    If it is, then it returns the line on which the table begins and the one
     on which it ends. Note that this pair will evaulate to
     boolean True, so
-      if is_in_inset(...):
+      if is_in_inset(..., default=False):
     will do what you expect.
-    '''
-    defval = (-1, -1)
-    stins = find_token_backwards(lines, inset, i)
-    if stins == -1:
-      return defval
-    endins = find_end_of_inset(lines, stins)
-    # note that this includes the notfound case.
-    if endins < i:
-      return defval
-    return (stins, endins)
+    """
+    start = find_token_backwards(lines, inset, i)
+    if start == -1:
+      return default
+    end = find_end_of_inset(lines, start)
+    if end < i: # this includes the notfound case.
+      return default
+    return (start, end)
 
 
 def get_containing_inset(lines, i):

Reply via email to