Am Samstag, 4. Februar 2006 18:39 schrieb Georg Baum:
> Am Samstag, 4. Februar 2006 18:18 schrieb Jean-Marc Lasgouttes:
> > 
> > I propose to use
> > \begin_layout
> > without any name. "" is not good
> > because it is read explicitely.
> 
> Then I misunderstood, sorry.
>  
> > The empty layout name should be
> > intrpreted as defaultLayout in getLayout, but should be saved again as 
> empty layout name.
> 
> Unfortunately this does not work always. See the attached example (from 
> the userguide). This is actually worse then the unknown layout, since 
the 
> brace will be swallowed.

This is only the case when no empty line follows after '\\begin_layout'. 
The attached patch makes sure that lyx2lyx does always insert an empty 
line when it inserts '\\begin_layout'. It has the further advantage that 
it fixes bug 2088, too.
I did not hardcode the empty layout name, but used file.default_layout, so 
that it can easily be changed in the future if needed.

Last proposal from me concerning this bug: Apply this patch, I tested it 
with all files in my test directory. OK?


Georg
Index: lib/lyx2lyx/ChangeLog
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/lib/lyx2lyx/ChangeLog,v
retrieving revision 1.107
diff -u -p -r1.107 ChangeLog
--- lib/lyx2lyx/ChangeLog	2 Feb 2006 21:30:03 -0000	1.107
+++ lib/lyx2lyx/ChangeLog	5 Feb 2006 10:30:24 -0000
@@ -1,3 +1,11 @@
+2006-02-05  Georg Baum  <[EMAIL PROTECTED]>
+
+	* LyX.py: new member is_default_layout()
+	* LyX.py: new member default_layout
+	* parser_tools.py (get_layout): new, extract layout name from line
+	* lyx_1_1_5.py, lyx_1_1_6.py, lyx_1_2.py, lyx_1_4.py: Replace all
+	occurences of the "Standard" layout with file.default_layout (bug 2026)
+
 2006-02-02  Georg Baum  <[EMAIL PROTECTED]>
 
 	* lyx_1_4.py (remove_branches): new, remove branch insets
Index: lib/lyx2lyx/LyX.py
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/lib/lyx2lyx/LyX.py,v
retrieving revision 1.28
diff -u -p -r1.28 LyX.py
--- lib/lyx2lyx/LyX.py	1 Dec 2005 19:00:07 -0000	1.28
+++ lib/lyx2lyx/LyX.py	5 Feb 2006 10:30:25 -0000
@@ -111,6 +111,10 @@ class LyX_Base:
 
         self.backend = "latex"
         self.textclass = "article"
+        # This is a hack: We use '' since we don't know the default
+        # layout of the text class. LyX will parse it as default layout.
+        # FIXME: Read the layout file and use the real default layout
+        self.default_layout = ''
         self.header = []
         self.preamble = []
         self.body = []
@@ -289,6 +293,14 @@ class LyX_Base:
             self.warning('Parameter not found in the header: %s' % param, 3)
             return
         self.header[i] = '\\%s %s' % (param, str(value))
+
+
+    def is_default_layout(self, layout):
+        " Check whether a layout is the default layout of this class."
+        # FIXME: Check against the real text class default layout
+        if layout == 'Standard' or layout == self.default_layout:
+            return 1
+        return 0
 
 
     def convert(self):
Index: lib/lyx2lyx/lyx_1_1_5.py
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/lib/lyx2lyx/lyx_1_1_5.py,v
retrieving revision 1.7
diff -u -p -r1.7 lyx_1_1_5.py
--- lib/lyx2lyx/lyx_1_1_5.py	18 Aug 2005 17:33:26 -0000	1.7
+++ lib/lyx2lyx/lyx_1_1_5.py	5 Feb 2006 10:30:25 -0000
@@ -18,10 +18,9 @@
 
 import re
 import string
-from parser_tools import find_token, find_token_backwards, find_re
+from parser_tools import find_token, find_token_backwards, find_re, get_layout
 
 
-layout_exp = re.compile(r"\\layout (\S*)")
 math_env = ["\\[","\\begin{eqnarray*}","\\begin{eqnarray}","\\begin{equation}"]
 
 def replace_protected_separator(file):
@@ -33,11 +32,7 @@ def replace_protected_separator(file):
             break
         j = find_token_backwards(lines, "\\layout", i)
         #if j == -1: print error
-        layout_m = layout_exp.match(lines[j])
-        if layout_m:
-            layout = layout_m.group(1)
-        else:
-            layout = "Standard"
+        layout = get_layout(lines[j], file.default_layout)
 
         if layout == "LyX-Code":
             result = ""
@@ -130,7 +125,7 @@ def first_layout(file):
     while (lines[0] == ""):
         del lines[0]
     if lines[0][:7] != "\\layout":
-        lines[:0] = ["\\layout Standard"]
+        lines[:0] = ['\\layout %s' % file.default_layout, '']
 
 
 def remove_space_in_units(file):
Index: lib/lyx2lyx/lyx_1_1_6.py
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/lib/lyx2lyx/lyx_1_1_6.py,v
retrieving revision 1.4
diff -u -p -r1.4 lyx_1_1_6.py
--- lib/lyx2lyx/lyx_1_1_6.py	5 Jan 2005 18:52:59 -0000	1.4
+++ lib/lyx2lyx/lyx_1_1_6.py	5 Feb 2006 10:30:25 -0000
@@ -146,7 +146,7 @@ def update_tabular(file):
                 tmp.append('<Cell multicolumn="%s" alignment="%s" valignment="0" topline="%s" bottomline="%s" leftline="%d" rightline="%d" rotate="%s" usebox="%s" width=%s special=%s>' % (cell_info[m][0],cell_info[m][1],cell_info[m][2],cell_info[m][3],leftline,rightline,cell_info[m][5],cell_info[m][6],cell_info[m][7],cell_info[m][8]))
                 tmp.append('\\begin_inset Text')
                 tmp.append('')
-                tmp.append('\\layout Standard')
+                tmp.append('\\layout %s' % file.default_layout)
                 tmp.append('')
 
                 if cell_info[m][0] != '2':
Index: lib/lyx2lyx/lyx_1_2.py
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/lib/lyx2lyx/lyx_1_2.py,v
retrieving revision 1.11
diff -u -p -r1.11 lyx_1_2.py
--- lib/lyx2lyx/lyx_1_2.py	20 Sep 2005 12:47:45 -0000	1.11
+++ lib/lyx2lyx/lyx_1_2.py	5 Feb 2006 10:30:25 -0000
@@ -23,7 +23,7 @@ import re
 from parser_tools import find_token, find_token_backwards, get_next_paragraph,\
                          find_tokens, find_end_of_inset, find_re, \
                          is_nonempty_line, get_paragraph, find_nonempty_line, \
-                         get_value, get_tabular_lines, check_token
+                         get_value, get_tabular_lines, check_token, get_layout
 
 floats = {
     "footnote": ["\\begin_inset Foot",
@@ -179,7 +179,7 @@ def remove_pextra(file):
 	    if hfill:
 		start = ["","\hfill",""]+start
 	else:
-	    start = ["\\layout Standard"] + start
+	    start = ['\\layout %s' % file.default_layout,''] + start
 
 	j0 = find_token_backwards(lines,"\\layout", i-1)
 	j = get_next_paragraph(lines, i, file.format + 1)
@@ -216,13 +216,14 @@ def is_empty(lines):
 move_rexp =  re.compile(r"\\(family|series|shape|size|emph|numeric|bar|noun|end_deeper)")
 ert_rexp = re.compile(r"\\begin_inset|\\hfill|.*\\SpecialChar")
 spchar_rexp = re.compile(r"(.*)(\\SpecialChar.*)")
-ert_begin = ["\\begin_inset ERT",
-	     "status Collapsed",
-	     "",
-	     "\\layout Standard"]
 
 
 def remove_oldert(file):
+    ert_begin = ["\\begin_inset ERT",
+                 "status Collapsed",
+                 "",
+                 '\\layout %s' % file.default_layout,
+                 ""]
     lines = file.body
     i = 0
     while 1:
@@ -248,8 +249,7 @@ def remove_oldert(file):
 	new = []
 	new2 = []
 	if check_token(lines[i], "\\layout LaTeX"):
-	    new = ["\layout Standard", "", ""]
-	    # We have a problem with classes in which Standard is not the default layout!
+	    new = ['\layout %s' % file.default_layout, "", ""]
 
 	k = i+1
 	while 1:
@@ -349,8 +349,11 @@ def remove_oldertinset(file):
 	i = i+1
 
 
-def is_ert_paragraph(lines, i):
-    if not check_token(lines[i], "\\layout Standard"):
+def is_ert_paragraph(file, i):
+    lines = file.body
+    if not check_token(lines[i], "\\layout"):
+        return 0
+    if not file.is_default_layout(get_layout(lines[i], file.default_layout)):
         return 0
 
     i = find_nonempty_line(lines, i+1)
@@ -372,7 +375,7 @@ def combine_ert(file):
 	j = get_paragraph(lines, i, file.format + 1)
 	count = 0
 	text = []
-	while is_ert_paragraph(lines, j):
+	while is_ert_paragraph(file, j):
 
 	    count = count+1
 	    i2 = find_token(lines, "\\layout", j+1)
@@ -721,7 +724,7 @@ def change_infoinset(file):
             note_lines = [txt]+note_lines
 
         for line in note_lines:
-            new = new + ["\layout Standard", ""]
+            new = new + ['\layout %s' % file.default_layout, ""]
             tmp = string.split(line, '\\')
             new = new + [tmp[0]]
             for x in tmp[1:]:
Index: lib/lyx2lyx/lyx_1_4.py
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/lib/lyx2lyx/lyx_1_4.py,v
retrieving revision 1.56
diff -u -p -r1.56 lyx_1_4.py
--- lib/lyx2lyx/lyx_1_4.py	2 Feb 2006 21:30:04 -0000	1.56
+++ lib/lyx2lyx/lyx_1_4.py	5 Feb 2006 10:30:26 -0000
@@ -23,7 +23,8 @@ from os import access, F_OK
 import os.path
 from parser_tools import find_token, find_end_of_inset, get_next_paragraph, \
                          get_paragraph, get_value, del_token, is_nonempty_line,\
-			 find_tokens, find_end_of, find_token2, find_re
+			 find_tokens, find_end_of, find_token2, find_re,\
+                         get_layout
 from sys import stdin
 from string import replace, split, find, strip, join
 
@@ -81,7 +82,7 @@ def revert_spaces(file):
             file.body[i+1:i+1] = ''
 	    if space == "\\space":
 		space = "\\ "
-            i = insert_ert(file.body, i+1, 'Collapsed', space, file.format - 1)
+            i = insert_ert(file.body, i+1, 'Collapsed', space, file.format - 1, file.default_layout)
 
 ##
 # \InsetSpace \, -> \InsetSpace \thinspace{}
@@ -129,7 +130,7 @@ def revert_eqref(file):
             break
         eqref = lyx_support_escape(regexp.sub("", file.body[i]))
         file.body[i:i+1] = ["\\begin_inset ERT", "status Collapsed", "",
-                            "\\layout Standard", "", "\\backslash ",
+                            '\\layout %s' % file.default_layout, "", "\\backslash ",
                             "eqref" + eqref]
         i = i + 7
 
@@ -251,10 +252,10 @@ def convert_comment(file):
         if i == -1:
             return
 
-        file.body[i:i+1] = ["\\layout Standard","","",
+        file.body[i:i+1] = ['\\layout %s' % file.default_layout,"","",
                         "\\begin_inset Comment",
                         "collapsed true","",
-                        "\\layout Standard"]
+                        '\\layout %s' % file.default_layout]
         i = i + 7
 
         while 1:
@@ -303,7 +304,7 @@ def convert_comment(file):
                     file.body[i:i] = ["\\end_inset"]
                     i = i + 1
                     break
-                file.body[i:i+1] = ["\\layout Standard"]
+                file.body[i:i+1] = ['\\layout %s' % file.default_layout]
                 i = i + 1
 
 
@@ -570,7 +571,7 @@ def convert_breaks(file):
         i = find_token(file.body, "\\begin_layout", i)
         if i == -1:
             return
-        layout = split(file.body[i])[1]
+        layout = get_layout(file.body[i], file.default_layout)
         i = i + 1
 
         # Merge all paragraph parameters into a single line
@@ -597,7 +598,8 @@ def convert_breaks(file):
         # We want to avoid new paragraphs if possible becauase we want to
         # inherit font sizes.
         nonstandard = 0
-        if (layout != "Standard" or find(file.body[i],"\\align") != -1 or
+        if (not file.is_default_layout(layout) or
+            find(file.body[i],"\\align") != -1 or
             find(file.body[i],"\\labelwidthstring") != -1 or
             find(file.body[i],"\\noindent") != -1):
             nonstandard = 1
@@ -640,7 +642,7 @@ def convert_breaks(file):
             paragraph_above = list()
             if nonstandard:
                 # We need to create an extra paragraph for nonstandard environments
-                paragraph_above = ['\\begin_layout Standard', '']
+                paragraph_above = ['\\begin_layout %s' % file.default_layout, '']
 
             if pb_top != -1:
                 paragraph_above.extend(['\\newpage ',''])
@@ -655,7 +657,7 @@ def convert_breaks(file):
                 # We can't use the vspace inset because it does not know \parskip.
                 paragraph_above.extend(['\\lyxline ', '', ''])
                 insert_ert(paragraph_above, len(paragraph_above) - 1, 'Collapsed',
-                           '\\vspace{-1\\parskip}\n', file.format + 1)
+                           '\\vspace{-1\\parskip}\n', file.format + 1, file.default_layout)
                 paragraph_above.extend([''])
 
             if nonstandard:
@@ -692,7 +694,7 @@ def convert_breaks(file):
             paragraph_below = list()
             if nonstandard:
                 # We need to create an extra paragraph for nonstandard environments
-                paragraph_below = ['', '\\begin_layout Standard', '']
+                paragraph_below = ['', '\\begin_layout %s' % file.default_layout, '']
             else:
                 for a in range(len(font_attributes)):
                     if find_token(file.body, font_attributes[a], i, k) != -1:
@@ -993,7 +995,7 @@ def convert_minipage(file):
 # -------------------------------------------------------------------------------------------
 # Convert backslashes and '\n' into valid ERT code, append the converted
 # text to body[i] and return the (maybe incremented) line index i
-def convert_ertbackslash(body, i, ert, format):
+def convert_ertbackslash(body, i, ert, format, default_layout):
     for c in ert:
 	if c == '\\':
 	    body[i] = body[i] + '\\backslash '
@@ -1004,7 +1006,7 @@ def convert_ertbackslash(body, i, ert, f
                 body[i+1:i+1] = ['\\newline ', '']
                 i = i + 2
             else:
-                body[i+1:i+1] = ['\\end_layout', '', '\\begin_layout Standard', '']
+                body[i+1:i+1] = ['\\end_layout', '', '\\begin_layout %s' % default_layout, '']
                 i = i + 4
 	else:
 	    body[i] = body[i] + c
@@ -1313,7 +1315,7 @@ def revert_breaks(file):
         # The others are converted in the next loop runs (if they exist)
         if insets[0] == "vspace":
             file.body[i:i+1] = ['\\begin_inset ERT', 'status Collapsed', '',
-                                '\\layout Standard', '', '\\backslash ']
+                                '\\layout %s' % file.default_layout, '', '\\backslash ']
             i = i + 6
             if spaceamount[0][-1] == '*':
                 spaceamount[0] = spaceamount[0][:-1]
@@ -1345,7 +1347,7 @@ def revert_breaks(file):
                     file.body.insert(i, 'vspace*{')
                 else:
                     file.body.insert(i, 'vspace{')
-                i = convert_ertbackslash(file.body, i, spaceamount[0], file.format - 1)
+                i = convert_ertbackslash(file.body, i, spaceamount[0], file.format - 1, file.default_layout)
                 file.body[i] = file.body[i] + '}'
             i = i + 1
         elif insets[0] == "lyxline":
@@ -1356,7 +1358,7 @@ def revert_breaks(file):
                 latexsize = '\\normalsize'
             i = insert_ert(file.body, i, 'Collapsed',
                            '\\lyxline{%s}' % latexsize,
-                           file.format - 1)
+                           file.format - 1, file.default_layout)
             # We use \providecommand so that we don't get an error if native
             # lyxlines are used (LyX writes first its own preamble and then
             # the user specified one)
@@ -1368,7 +1370,7 @@ def revert_breaks(file):
         elif insets[0] == "newpage":
             file.body[i] = ''
             i = insert_ert(file.body, i, 'Collapsed', '\\newpage{}',
-                           file.format - 1)
+                           file.format - 1, file.default_layout)
 
 
 # Convert a LyX length into a LaTeX length
@@ -1392,9 +1394,9 @@ def convert_len(len, special):
 
 # Convert a LyX length into valid ERT code and append it to body[i]
 # Return the (maybe incremented) line index i
-def convert_ertlen(body, i, len, special, format):
+def convert_ertlen(body, i, len, special, format, default_layout):
     # Convert backslashes and insert the converted length into body
-    return convert_ertbackslash(body, i, convert_len(len, special), format)
+    return convert_ertbackslash(body, i, convert_len(len, special), format, default_layout)
 
 
 # Return the value of len without the unit in numerical form
@@ -1408,15 +1410,15 @@ def len2value(len):
 
 # Convert text to ERT and insert it at body[i]
 # Return the index of the line after the inserted ERT
-def insert_ert(body, i, status, text, format):
+def insert_ert(body, i, status, text, format, default_layout):
     body[i:i] = ['\\begin_inset ERT', 'status ' + status, '']
     i = i + 3
     if format <= 224:
-        body[i:i] = ['\\layout Standard', '']
+        body[i:i] = ['\\layout %s' % default_layout, '']
     else:
-        body[i:i] = ['\\begin_layout Standard', '']
+        body[i:i] = ['\\begin_layout %s' % default_layout, '']
     i = i + 1       # i points now to the just created empty line
-    i = convert_ertbackslash(body, i, text, format) + 1
+    i = convert_ertbackslash(body, i, text, format, default_layout) + 1
     if format > 224:
         body[i:i] = ['\\end_layout']
         i = i + 1
@@ -1557,7 +1559,7 @@ def convert_frameless_box(file):
             ert = ert + '\\let\\endminipage\\endlyxtolyxminipage%\n'
 
             old_i = i
-            i = insert_ert(file.body, i, 'Collapsed', ert, file.format - 1)
+            i = insert_ert(file.body, i, 'Collapsed', ert, file.format - 1, file.default_layout)
             j = j + i - old_i - 1
 
             file.body[i:i] = ['\\begin_inset Minipage',
@@ -1572,21 +1574,21 @@ def convert_frameless_box(file):
             # Restore the original minipage environment since we may have
             # minipages inside this box.
             # Start a new paragraph because the following may be nonstandard
-            file.body[i:i] = ['\\layout Standard', '', '']
+            file.body[i:i] = ['\\layout %s' % file.default_layout, '', '']
             i = i + 2
             j = j + 3
             ert = '\\let\\minipage\\lyxtolyxrealminipage%\n'
             ert = ert + '\\let\\endminipage\\lyxtolyxrealendminipage%'
             old_i = i
-            i = insert_ert(file.body, i, 'Collapsed', ert, file.format - 1)
+            i = insert_ert(file.body, i, 'Collapsed', ert, file.format - 1, file.default_layout)
             j = j + i - old_i - 1
 
             # Redefine the minipage end before the inset end.
             # Start a new paragraph because the previous may be nonstandard
-            file.body[j:j] = ['\\layout Standard', '', '']
+            file.body[j:j] = ['\\layout %s' % file.default_layout, '', '']
             j = j + 2
             ert = '\\let\\endminipage\\endlyxtolyxminipage'
-            j = insert_ert(file.body, j, 'Collapsed', ert, file.format - 1)
+            j = insert_ert(file.body, j, 'Collapsed', ert, file.format - 1, file.default_layout)
 	    j = j + 1
             file.body.insert(j, '')
 	    j = j + 1
@@ -1597,7 +1599,7 @@ def convert_frameless_box(file):
                 ert = '}%\n'
             else:
                 ert = '\\end{lyxtolyxrealminipage}%\n'
-            j = insert_ert(file.body, j, 'Collapsed', ert, file.format - 1)
+            j = insert_ert(file.body, j, 'Collapsed', ert, file.format - 1, file.default_layout)
 
             # We don't need to restore the original minipage after the inset
             # end because the scope of the redefinition is the original box.
@@ -1841,7 +1843,7 @@ def convert_names(file):
                           "\\begin_inset CharStyle Firstname",
                           "status inlined",
                           "",
-                          "\\begin_layout Standard",
+                          '\\begin_layout %s' % file.default_layout,
                           "",
                           "%s" % firstname,
                           "\end_layout",
@@ -1852,7 +1854,7 @@ def convert_names(file):
                           "\\begin_inset CharStyle Surname",
                           "status inlined",
                           "",
-                          "\\begin_layout Standard",
+                          '\\begin_layout %s' % file.default_layout,
                           "",
                           "%s" % surname,
                           "\\end_layout",
@@ -2179,7 +2181,7 @@ def convert_ert_paragraphs(file):
             k = find_token(file.body, "\\begin_layout", k, j)
             if k == -1:
                 break
-            file.body[k] = "\\begin_layout Standard"
+            file.body[k] = '\\begin_layout %s' % file.default_layout
             k = k + 1
 
         # remove all paragraph parameters and font settings
@@ -2196,14 +2198,14 @@ def convert_ert_paragraphs(file):
         k = i
         first_pagraph = 1
         while 1:
-            k = find_token(file.body, "\\begin_layout Standard", k, j)
+            k = find_token(file.body, "\\begin_layout", k, j)
             if k == -1:
                 break
             if first_pagraph:
                 first_pagraph = 0
                 k = k + 1
                 continue
-            file.body[k:k] = ["\\begin_layout Standard", "",
+            file.body[k:k] = ['\\begin_layout %s' % file.default_layout, "",
                               "\\end_layout", ""]
             k = k + 5
             j = j + 4
@@ -2214,9 +2216,14 @@ def convert_ert_paragraphs(file):
             k = find_token(file.body, "\\newline", k, j)
             if k == -1:
                 break
-            file.body[k:k+1] = ["\\end_layout", "", "\\begin_layout Standard"]
+            file.body[k:k+1] = ["\\end_layout", "", '\\begin_layout %s' % file.default_layout]
             k = k + 4
             j = j + 3
+            # We need an empty line if file.default_layout == ''
+            if file.body[k-1] != '':
+                file.body.insert(k-1, '')
+                k = k + 1
+                j = j + 1
         i = i + 1
 
 
@@ -2257,9 +2264,14 @@ def revert_ert_paragraphs(file):
                 l = l + 1
             if strip(file.body[l]) and split(file.body[l])[0] == "\\newline":
                 file.body[k:l+1] = ["\\end_layout", "",
-                                    "\\begin_layout Standard"]
+                                    '\\begin_layout %s' % file.default_layout]
                 j = j - l + k + 2
                 k = k + 3
+                # We need an empty line if file.default_layout == ''
+                if file.body[l+1] != '':
+                    file.body.insert(l+1, '')
+                    k = k + 1
+                    j = j + 1
             else:
                 k = k + 1
         i = i + 1
Index: lib/lyx2lyx/parser_tools.py
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/lib/lyx2lyx/parser_tools.py,v
retrieving revision 1.29
diff -u -p -r1.29 parser_tools.py
--- lib/lyx2lyx/parser_tools.py	20 Sep 2005 12:47:45 -0000	1.29
+++ lib/lyx2lyx/parser_tools.py	5 Feb 2006 10:30:26 -0000
@@ -95,6 +95,13 @@ def get_value(lines, token, start, end =
         return ""
 
 
+def get_layout(line, default_layout):
+    tokens = string.split(line)
+    if len(tokens) > 1:
+        return tokens[1]
+    return default_layout
+
+
 def del_token(lines, token, i, j):
     k = find_token2(lines, token, i, j)
     if k == -1:

Reply via email to