[prev in list] [next in list] [prev in thread] [next in thread] 

List:       lyx-cvs
Subject:    [LyX/2.0.x] Copy over other changes that never got cherry-picked.
From:       Richard Heck <rgheck () lyx ! org>
Date:       2014-05-29 22:08:35
Message-ID: 20140529220835.EA8B02802CF () lyx ! lyx ! org
[Download RAW message or body]

commit 257562f7d685c55289d7636238242d2f30b099ac
Author: Richard Heck <rgheck@lyx.org>
Date:   Thu May 29 18:08:14 2014 -0400

    Copy over other changes that never got cherry-picked.

diff --git a/lib/lyx2lyx/lyx_2_1.py b/lib/lyx2lyx/lyx_2_1.py
index 7e9fbe2..ae95841 100644
--- a/lib/lyx2lyx/lyx_2_1.py
+++ b/lib/lyx2lyx/lyx_2_1.py
@@ -120,21 +120,28 @@ def convert_TeX_brace_to_Argument(document, line, n, nmax, \
inset, environment, o  
     Todo: this routine can currently handle only one mandatory argument of \
environments  '''
+
+    end_layout = find_end_of_layout(document.body, line)
     lineERT = line
     endn = line
     loop = 1
-    while lineERT != -1 and n < nmax + 1:
-      lineERT = find_token(document.body, "\\begin_inset ERT", lineERT)
-      if environment == False and lineERT != -1:
-        bracePair = -1
+    while n < nmax + 1:
+      lineERT = find_token(document.body, "\\begin_inset ERT", lineERT, end_layout)
+      if lineERT == -1:
+        break
+      if environment == False:
+        end_ERT = find_end_of_inset(document.body, lineERT)
+        if end_ERT == -1:
+          document.warning("Can't find end of ERT!!")
+          break
+        # Note that this only checks for ][ or }{ at the beginning of a line
         if opt:
-          bracePair = find_token(document.body, "][", lineERT)
+          bracePair = find_token(document.body, "][", lineERT, end_ERT)
         else:
-          bracePair = find_token(document.body, "}{", lineERT)
-        # assure that the "}{" is in this ERT
-        if bracePair == lineERT + 5:
+          bracePair = find_token(document.body, "}{", lineERT, end_ERT)
+        if bracePair != -1:
           end = find_token(document.body, "\\end_inset", bracePair)
-          document.body[lineERT : end + 1] = ["\\end_layout", "", "\\end_inset"]
+          document.body[lineERT : end_ERT + 1] = ["\\end_layout", "", "\\end_inset"]
           if loop == 1:
             # in the case that n > 1 we have optional arguments before
             # therefore detect them if any
@@ -156,24 +163,23 @@ def convert_TeX_brace_to_Argument(document, line, n, nmax, \
                inset, environment, o
               document.body[line + 1 : line + 1] = ["\\begin_inset Argument " + \
str(n), "status open", "", "\\begin_layout Plain Layout"]  else:
               document.body[line + 4 : line + 4] = ["\\begin_inset Argument " + \
                str(n), "status open", "", "\\begin_layout Plain Layout"]
-          else:
+          else: # if loop != 1
             document.body[endn : endn] = ["\\begin_inset Argument " + str(n), \
"status open", "", "\\begin_layout Plain Layout"]  n += 1
           endn = end
-          loop = loop + 1
-        # now check the case that we have "}" + "{" in two ERTs
-        else:
-          endBrace = -1
+          loop += 1
+        else: 
+          # no brace pair found
+          # now check the case that we have "}" + "{" in two ERTs
           if opt:
-            endBrace = find_token(document.body, "]", lineERT)
+            endBrace = find_token(document.body, "]", lineERT, end_layout)
           else:
-            endBrace = find_token(document.body, "}", lineERT)
+            endBrace = find_token(document.body, "}", lineERT, end_layout)
           if endBrace == lineERT + 5:
-            beginBrace = -1
             if opt:
-              beginBrace = find_token(document.body, "[", endBrace)
+              beginBrace = find_token(document.body, "[", endBrace, end_layout)
             else:
-              beginBrace = find_token(document.body, "{", endBrace)
+              beginBrace = find_token(document.body, "{", endBrace, end_layout)
             # assure that the ERTs are consecutive (11 or 12 depending if there is a \
                space between the ERTs or not)
             if beginBrace == endBrace + 11 or beginBrace == endBrace + 12:
               end = find_token(document.body, "\\end_inset", beginBrace)
@@ -212,27 +218,32 @@ def convert_TeX_brace_to_Argument(document, line, n, nmax, \
inset, environment, o  lineERT += 1
           else:
             lineERT += 1
-      if environment == True and lineERT != -1:
-        opening = -1
+      if environment == True:
+        end_ERT = find_end_of_inset(document.body, lineERT)
+        if end_ERT == -1:
+          document.warning("Can't find end of ERT!!")
+          break
+        # Note that this only checks for [ or { at the beginning of a line
         if opt:
-          opening = find_token(document.body, "[", lineERT)
+          opening = find_token(document.body, "[", lineERT, end_ERT)
         else:
-          opening = find_token(document.body, "{", lineERT)
-        if opening == lineERT + 5: # assure that the "{" is in this ERT
-          end = find_token(document.body, "\\end_inset", opening)
-          document.body[lineERT : end + 1] = ["\\begin_inset Argument " + str(n), \
"status open", "", "\\begin_layout Plain Layout"] +          opening = \
find_token(document.body, "{", lineERT, end_ERT) +        if opening != -1:
+          document.body[lineERT : end_ERT + 1] = ["\\begin_inset Argument " + \
str(n), "status open", "", "\\begin_layout Plain Layout"]  n += 1
-          lineERT2 = find_token(document.body, "\\begin_inset ERT", lineERT)
-          closing = -1
-          if opt:
-            closing = find_token(document.body, "]", lineERT)
-          else:
-            closing = find_token(document.body, "}", lineERT2)
-          if closing == lineERT2 + 5: # assure that the "}" is in this ERT
-            end2 = find_token(document.body, "\\end_inset", closing)
-            document.body[lineERT2 : end2 + 1] = ["\\end_layout", "", "\\end_inset"]
-        else:
-          lineERT += 1
+          lineERT2 = find_token(document.body, "\\begin_inset ERT", end_ERT, \
end_layout) +          if lineERT2 != -1:
+            end_ERT2 = find_end_of_inset(document.body, lineERT2)
+            if end_ERT2 == -1:
+              document.warning("Can't find end of second ERT!!")
+              break
+            if opt:
+              closing = find_token(document.body, "]", lineERT2, end_ERT2)
+            else:
+              closing = find_token(document.body, "}", lineERT2, end_ERT2)
+            if closing != -1: # assure that the "}" is in this ERT
+              end2 = find_token(document.body, "\\end_inset", closing)
+              document.body[lineERT2 : end2 + 1] = ["\\end_layout", "", \
"\\end_inset"]  
 
 ###############################################################################
@@ -2402,34 +2413,65 @@ def convert_corollary_args(document):
             parbeg = parent[3]
             if i != -1:
                 if document.body[parbeg] == "\\begin_inset ERT":
-                    ertcont = parbeg + 5
-                    if document.body[ertcont].startswith("<"):
+                    ertcontfirstline = parbeg + 5
+                    # Find the last ERT in this paragraph (which might also be the \
first) +                    lastertbeg = find_token_backwards(document.body, \
"\\begin_inset ERT", j) +                    if lastertbeg == -1:
+                        document.warning("Last ERT not found!")
+                        break
+                    lastertend = find_end_of_inset(document.body, lastertbeg)
+                    if lastertend == -1:
+                        document.warning("End of last ERT not found!")
+                        break
+                    ertcontlastline = lastertend - 3
+                    if document.body[ertcontfirstline].startswith("<"):
                         # This is an overlay specification
                         # strip off the <
-                        document.body[ertcont] = document.body[ertcont][1:]
-                        if document.body[ertcont].endswith(">"):
+                        document.body[ertcontfirstline] = \
document.body[ertcontfirstline][1:] +                        if \
document.body[ertcontlastline].endswith(">"):  # strip off the >
-                            document.body[ertcont] = document.body[ertcont][:-1]
-                        elif document.body[ertcont].endswith("]"):
+                            document.body[ertcontlastline] = \
document.body[ertcontlastline][:-1] +                            if ertcontfirstline \
< ertcontlastline: +                                # Multiline ERT. Might contain \
TeX code.  Embrace in ERT. +                                \
document.body[ertcontlastline : ertcontlastline + 1] = [ +                            \
document.body[ertcontlastline], '\\end_layout', '', '\\end_inset'] +                  \
document.body[ertcontfirstline : ertcontfirstline + 1] = [ +                          \
'\\end_layout', '', '\\end_inset', '', '', '\\begin_inset Argument 1', +              \
'status collapsed', '', '\\begin_layout Plain Layout', +                              \
'\\begin_inset ERT', '', 'status open' '', '\\begin_layout Plain Layout', +           \
document.body[ertcontfirstline]] +                            else:
+                                # Convert to ArgInset
+                                document.body[parbeg] = "\\begin_inset Argument 1"
+                        elif document.body[ertcontlastline].endswith("]"):
                             # divide the args
-                            tok = document.body[ertcont].find('>[')
-                            if tok != -1:
-                                subst = [document.body[ertcont][:tok],
-                                         '\\end_layout', '', '\\end_inset', '', '', \
                '\\begin_inset Argument 2',
-                                         'status collapsed', '', '\\begin_layout \
                Plain Layout',
-                                         document.body[ertcont][tok + 2:-1]]
-                                document.body[ertcont : ertcont + 1] = subst
-                        # Convert to ArgInset
-                        document.body[parbeg] = "\\begin_inset Argument 1"
+                            ertcontdivline = \
document.body[ertcontfirstline].find('>[') +                            if \
ertcontdivline != -1: +                                if ertcontfirstline < \
ertcontlastline: +                                    # Multiline ERT. Might contain \
TeX code.  Embrace in ERT. +                                    \
document.body[ertcontlastline : ertcontlastline + 1] = [ +                            \
document.body[ertcontlastline], '\\end_layout', '', '\\end_inset'] +                  \
document.body[ertcontdivline : ertcontdivline + 1] = \
[document.body[ertcontdivline][:tok], +                                               \
'\\end_layout', '', '\\end_inset', '', '', '\\begin_inset Argument 2', +              \
'status collapsed', '', '\\begin_layout Plain Layout', +                              \
'\\begin_inset ERT', '', 'status open' '', '\\begin_layout Plain Layout', +           \
document.body[ertcontdivline][tok + 2:]] +                                else:
+                                    document.body[ertcontdivline : ertcontdivline + \
1] = [document.body[ertcontdivline][:tok], +                                          \
'\\end_layout', '', '\\end_inset', '', '', '\\begin_inset Argument 2', +              \
'status collapsed', '', '\\begin_layout Plain Layout', +                              \
document.body[ertcontdivline][tok + 2:]] +                            # Convert to \
ArgInset +                            document.body[parbeg] = "\\begin_inset Argument \
1"  i = j
                         continue
-                    elif document.body[ertcont].startswith("["):
-                        if document.body[ertcont].endswith("]"):
+                    elif document.body[ertcontlastline].startswith("["):
+                        if document.body[ertcontlastline].endswith("]"):
                             # This is an ERT option
                             # strip off the [
-                            document.body[ertcont] = document.body[ertcont][1:]
+                            document.body[ertcontlastline] = \
document.body[ertcontlastline][1:]  # strip off the ]
-                            document.body[ertcont] = document.body[ertcont][:-1]
+                            document.body[ertcontlastline] = \
document.body[ertcontlastline][:-1]  # Convert to ArgInset
                             document.body[parbeg] = "\\begin_inset Argument 2"
                         else:
@@ -2473,6 +2515,42 @@ def convert_quote_args(document):
             i = j
 
 
+def cleanup_beamerargs(document):
+    " Clean up empty ERTs (conversion artefacts) "
+
+    beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"]
+    if document.textclass not in beamer_classes:
+        return
+
+    i = 0
+    while True:
+        i = find_token(document.body, "\\begin_inset Argument", i)
+        if i == -1:
+            return
+        j = find_end_of_inset(document.body, i)
+        if j == -1:
+            document.warning("Malformed LyX document: Can't find end of Argument \
inset") +            i += 1
+            continue
+        while True:
+            ertbeg = find_token(document.body, "\\begin_inset ERT", i, j)
+            if ertbeg == -1:
+                break
+            ertend = find_end_of_inset(document.body, ertbeg)
+            if ertend == -1:
+                document.warning("Malformed LyX document: Can't find end of ERT \
inset") +                break
+            stripped = [line for line in document.body[ertbeg : ertend + 1] if \
line.strip()] +            if len(stripped) == 5:
+                # This is an empty ERT
+                offset = len(document.body[ertbeg : ertend + 1])
+                del document.body[ertbeg : ertend + 1]
+                j = j - offset
+            else:
+                i = ertend
+        i += 1
+
+
 def revert_beamerargs(document):
     " Reverts beamer arguments to old layout "
     
@@ -2989,18 +3067,18 @@ def convert_beamerblocks(document):
                         break
                     ertcontlastline = lastertend - 3
                     while True:
-                        if document.body[ertcontfirstline].startswith("<"):
+                        if document.body[ertcontfirstline].lstrip().startswith("<"):
                             # This is an overlay specification
                             # strip off the <
-                            document.body[ertcontfirstline] = \
                document.body[ertcontfirstline][1:]
-                            if document.body[ertcontlastline].endswith(">"):
+                            document.body[ertcontfirstline] = \
document.body[ertcontfirstline].lstrip()[1:] +                            if \
document.body[ertcontlastline].rstrip().endswith(">"):  # strip off the >
-                                document.body[ertcontlastline] = \
document.body[ertcontlastline][:-1] +                                \
document.body[ertcontlastline] = document.body[ertcontlastline].rstrip()[:-1]  # \
                Convert to ArgInset
                                 document.body[parbeg] = "\\begin_inset Argument 1"
-                            elif document.body[ertcontlastline].endswith("}"):
+                            elif \
document.body[ertcontlastline].rstrip().endswith("}"):  # strip off the }
-                                document.body[ertcontlastline] = \
document.body[ertcontlastline][:-1] +                                \
document.body[ertcontlastline] = document.body[ertcontlastline].rstrip()[:-1]  # \
divide the args  ertcontdivline = ertcontfirstline
                                 tok = document.body[ertcontdivline].find('>{')
@@ -3023,24 +3101,124 @@ def convert_beamerblocks(document):
                                                                             \
                '\\end_layout', '', '\\end_inset', '', '', '\\begin_inset Argument \
                2',
                                                                             'status \
                collapsed', '', '\\begin_layout Plain Layout',
                                                                             \
                document.body[ertcontdivline][tok + 2:]]
-                            # Convert to ArgInset
-                            document.body[parbeg] = "\\begin_inset Argument 1"
-                        elif document.body[ertcontfirstline].startswith("{"):
+                                else:
+                                    # check if have delimiters in two different ERTs
+                                    tok = document.body[ertcontdivline].find('>')
+                                    if tok == -1:
+                                        regexp = re.compile(r'.*>', re.IGNORECASE)
+                                        ertcontdivline = find_re(document.body, \
regexp, ertcontfirstline, ertcontlastline) +                                        \
tok = document.body[ertcontdivline].find('>') +                                       \
if tok != -1: +                                            tokk = \
document.body[ertcontdivline].find('{') +                                            \
if tokk == -1: +                                                regexp = \
re.compile(r'.*\{', re.IGNORECASE) +                                                \
ertcontdivlinetwo = find_re(document.body, regexp, ertcontfirstline, ertcontlastline) \
+                                                tokk = \
document.body[ertcontdivlinetwo].find('{') +                                          \
if tokk != -1: +                                                    if \
ertcontfirstline < ertcontlastline: +                                                 \
# Multiline ERT. Might contain TeX code.  Embrace in ERT. +                           \
document.body[ertcontlastline : ertcontlastline + 1] = [ +                            \
document.body[ertcontlastline], '\\end_layout', '', '\\end_inset'] +                  \
document.body[ertcontdivline : ertcontdivlinetwo + 1] = \
[document.body[ertcontdivline][:tok], +                                               \
'\\end_layout', '', '\\end_inset', '', '\\end_layout', '',  +                         \
'\\end_inset', '', '', '\\begin_inset Argument 2', +                                  \
'status collapsed', '', '\\begin_layout Plain Layout', +                              \
'\\begin_inset ERT', '', 'status open' '', '\\begin_layout Plain Layout', +           \
document.body[ertcontdivlinetwo][tokk + 1:]] +                                        \
else: +                                                        \
document.body[ertcontdivline : ertcontdivlinetwo + 1] = \
[document.body[ertcontdivline][:tok], +                                               \
'\\end_layout', '', '\\end_inset', '', '', '\\begin_inset Argument 2', +              \
'status collapsed', '', '\\begin_layout Plain Layout', +                              \
document.body[ertcontdivlinetwo][tokk + 1:]] +                                # \
Convert to ArgInset +                                if ertcontfirstline < \
ertcontlastline: +                                    # Multiline ERT. Might contain \
TeX code.  Embrace in ERT. +                                    document.body[parbeg \
: parbeg + 1] = ['\\begin_inset Argument 1', +                                        \
'status collapsed', '', '\\begin_layout Plain Layout', +                              \
'\\begin_inset ERT', ''] +                                else:
+                                    document.body[parbeg] = "\\begin_inset Argument \
1" +                        elif \
document.body[ertcontfirstline].lstrip().startswith("{"):  # This is the block title
-                            if document.body[ertcontlastline].endswith("}"):
+                            if \
document.body[ertcontlastline].rstrip().endswith("}"):  # strip off the braces
-                                document.body[ertcontfirstline] = \
                document.body[ertcontfirstline][1:]
-                                document.body[ertcontlastline] = \
document.body[ertcontlastline][:-1] +                                \
document.body[ertcontfirstline] = document.body[ertcontfirstline].lstrip()[1:] +      \
document.body[ertcontlastline] = document.body[ertcontlastline].rstrip()[:-1]  if \
                ertcontfirstline < ertcontlastline:
                                     # Multiline ERT. Might contain TeX code.  \
                Embrace in ERT.
                                     document.body[parend : parend + 1] = [
-                                                                        \
document.body[parend], '\\end_layout', '', '\\end_inset'] +                           \
                document.body[parend], '\\end_inset', '', '\\end_layout']
                                     document.body[parbeg : parbeg + 1] = \
                ['\\begin_inset Argument 2',
                                                                         'status \
                collapsed', '', '\\begin_layout Plain Layout',
                                                                         \
'\\begin_inset ERT', '']  else:
                                     # Convert to ArgInset
                                     document.body[parbeg] = "\\begin_inset Argument \
2" +                            # the overlay argument can also follow the title, so \
... +                            elif \
document.body[ertcontlastline].rstrip().endswith(">"): +                              \
# strip off the { +                                document.body[ertcontfirstline] = \
document.body[ertcontfirstline].lstrip()[1:] +                                # strip \
off the > +                                document.body[ertcontlastline] = \
document.body[ertcontlastline].rstrip()[:-1] +                                # \
divide the args +                                ertcontdivline = ertcontfirstline
+                                tok = document.body[ertcontdivline].find('}<')
+                                if tok == -1:
+                                    regexp = re.compile(r'.*\}<', re.IGNORECASE)
+                                    ertcontdivline = find_re(document.body, regexp, \
ertcontfirstline, ertcontlastline) +                                    tok = \
document.body[ertcontdivline].find('}<') +                                if tok != \
-1: +                                    if ertcontfirstline < ertcontlastline:
+                                        # Multiline ERT. Might contain TeX code.  \
Embrace in ERT. +                                        \
document.body[ertcontlastline : ertcontlastline + 1] = [ +                            \
document.body[ertcontlastline], '\\end_layout', '', '\\end_inset'] +                  \
document.body[ertcontdivline : ertcontdivline + 1] = \
[document.body[ertcontdivline][:tok], +                                               \
'\\end_layout', '', '\\end_inset', '', '', '\\begin_inset Argument 1', +              \
'status collapsed', '', '\\begin_layout Plain Layout', +                              \
'\\begin_inset ERT', '', 'status open' '', '\\begin_layout Plain Layout', +           \
document.body[ertcontdivline][tok + 2:]] +                                    else:
+                                        document.body[ertcontdivline : \
ertcontdivline + 1] = [document.body[ertcontdivline][:tok], +                         \
'\\end_layout', '', '\\end_inset', '', '', '\\begin_inset Argument 1', +              \
'status collapsed', '', '\\begin_layout Plain Layout', +                              \
document.body[ertcontdivline][tok + 2:]] +                                else:
+                                    # check if have delimiters in two different ERTs
+                                    tok = document.body[ertcontdivline].find('}')
+                                    if tok == -1:
+                                        regexp = re.compile(r'.*\}', re.IGNORECASE)
+                                        ertcontdivline = find_re(document.body, \
regexp, ertcontfirstline, ertcontlastline) +                                        \
tok = document.body[ertcontdivline].find('}') +                                       \
if tok != -1: +                                            tokk = \
document.body[ertcontdivline].find('<') +                                            \
if tokk == -1: +                                                regexp = \
re.compile(r'.*<', re.IGNORECASE) +                                                \
ertcontdivlinetwo = find_re(document.body, regexp, ertcontfirstline, ertcontlastline) \
+                                                tokk = \
document.body[ertcontdivlinetwo].find('<') +                                          \
if tokk != -1: +                                                    if \
ertcontfirstline < ertcontlastline: +                                                 \
# Multiline ERT. Might contain TeX code.  Embrace in ERT. +                           \
document.body[ertcontlastline : ertcontlastline + 1] = [ +                            \
document.body[ertcontlastline], '\\end_layout', '', '\\end_inset'] +                  \
document.body[ertcontdivline : ertcontdivlinetwo + 1] = \
[document.body[ertcontdivline][:tok], +                                               \
'\\end_layout', '', '\\end_inset', '', '\\end_layout', '',  +                         \
'\\end_inset', '', '', '\\begin_inset Argument 1', +                                  \
'status collapsed', '', '\\begin_layout Plain Layout', +                              \
'\\begin_inset ERT', '', 'status open' '', '\\begin_layout Plain Layout', +           \
document.body[ertcontdivlinetwo][tokk + 1:]] +                                        \
else: +                                                        \
document.body[ertcontdivline : ertcontdivlinetwo + 1] = \
[document.body[ertcontdivline][:tok], +                                               \
'\\end_layout', '', '\\end_inset', '', '', '\\begin_inset Argument 1', +              \
'status collapsed', '', '\\begin_layout Plain Layout', +                              \
document.body[ertcontdivlinetwo][tokk + 1:]] +                                # \
Convert to ArgInset +                                if ertcontfirstline < \
ertcontlastline: +                                    # Multiline ERT. Might contain \
TeX code.  Embrace in ERT. +                                    document.body[parbeg \
: parbeg + 1] = ['\\begin_inset Argument 2', +                                        \
'status collapsed', '', '\\begin_layout Plain Layout', +                              \
'\\begin_inset ERT', ''] +                                else:
+                                    document.body[parbeg] = "\\begin_inset Argument \
                2"
                             elif count_pars_in_inset(document.body, \
ertcontfirstline) > 1:  # Multipar ERT. Skip this.
                                 break
@@ -4560,7 +4738,7 @@ convert = [
            [471, [convert_cite_engine_type_default]],
            [472, []],
            [473, []],
-           [474, [convert_chunks]],
+           [474, [convert_chunks, cleanup_beamerargs]],
           ]
 
 revert =  [


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic