]> git.lyx.org Git - lyx.git/blobdiff - lib/lyx2lyx/lyx_1_6.py
Fix revert btprint lyx2lyx.
[lyx.git] / lib / lyx2lyx / lyx_1_6.py
index f96d9d8696c87fbf985d56238969dca6e20d5e80..dc12990c563acdca2e27c422d03f5125055f9ed5 100644 (file)
@@ -812,23 +812,43 @@ def revert_latexcommand_index(document):
         document.body[i + 1] =  "LatexCommand index"
         # clean up multiline stuff
         content = ""
+        ert_end = 0
         for k in range(i + 3, j - 2):
           line = document.body[k]
           if line.startswith("\\begin_inset ERT"):
-            line = line[16:]
+              ert_end = find_end_of_inset(document.body, k + 1)
+              line = line[16:]
           if line.startswith("\\begin_inset Formula"):
             line = line[20:]
           if line.startswith("\\begin_layout Standard"):
             line = line[22:]
-          if line.startswith("\\begin_layout Plain"):
-            line = line[22:]
+          if line.startswith("\\begin_layout Plain Layout"):
+            line = line[26:]
           if line.startswith("\\end_layout"):
             line = line[11:]
           if line.startswith("\\end_inset"):
             line = line[10:]
           if line.startswith("status collapsed"):
             line = line[16:]
-          line = line.replace(u'ä', r'\\\"a').replace(u'ö', r'\\\"o').replace(u'ü', r'\\\"u')
+          if line.startswith("status open"):
+            line = line[11:]
+          # a lossless reversion is not possible
+          # try at least to handle some common insets and settings
+          # do not replace inside ERTs
+          if ert_end < k:
+              line = line.replace(u'ä', r'\\\"a').replace(u'ö', r'\\\"o').replace(u'ü', r'\\\"u')
+              line = line.replace(r'\\backslash', r'\\textbackslash{}')
+              line = line.replace(r'\\series bold', r'\\bfseries{}').replace(r'\\series default', r'\\mdseries{}')
+              line = line.replace(r'\\shape italic', r'\\itshape{}').replace(r'\\shape smallcaps', r'\\scshape{}')
+              line = line.replace(r'\\shape slanted', r'\\slshape{}').replace(r'\\shape default', r'\\upshape{}')
+              line = line.replace(r'\\emph on', r'\\em{}').replace(r'\\emph default', r'\\em{}')
+              line = line.replace(r'\\noun on', r'\\scshape{}').replace(r'\\noun default', r'\\upshape{}')
+              line = line.replace(r'\\bar under', r'\\underbar{').replace(r'\\bar default', r'}')
+              line = line.replace(r'\\family sans', r'\\sffamily{}').replace(r'\\family default', r'\\normalfont{}')
+              line = line.replace(r'\\family typewriter', r'\\ttfamily{}').replace(r'\\family roman', r'\\rmfamily{}')
+              line = line.replace(r'\\InsetSpace ', r'').replace(r'\\SpecialChar ', r'')
+          else:
+              line = line.replace(r'\\backslash', r'\\')
           content = content + line;
         document.body[i + 3] = "name " + '"' + content + '"'
         for k in range(i + 4, j - 2):
@@ -1299,14 +1319,20 @@ def convert_framed_notes(document):
     i = 0
     while 1:
         i = find_tokens(document.body, ["\\begin_inset Note Framed", "\\begin_inset Note Shaded"], i)
-
         if i == -1:
             return
-        document.body[i] = document.body[i].replace("\\begin_inset Note", "\\begin_inset Box")
-        document.body.insert(i + 1, 'position "t"\nhor_pos "c"\nhas_inner_box 0\ninner_pos "t"\n' \
-        'use_parbox 0\nwidth "100col%"\nspecial "none"\nheight "1in"\n' \
-        'height_special "totalheight"')
-        i = i + 1
+        subst = [document.body[i].replace("\\begin_inset Note", "\\begin_inset Box"),
+                 'position "t"',
+                 'hor_pos "c"',
+                 'has_inner_box 0'
+                 'inner_pos "t"', 
+                 'use_parbox 0',
+                 'width "100col%"',
+                 'special "none"',
+                 'height "1in"',
+                 'height_special "totalheight"']
+        document.body[i:i+1] = subst
+        i = i + 9
 
 
 def convert_module_names(document):
@@ -1397,18 +1423,30 @@ def revert_framed_notes(document):
             del document.body[i+1:k]
         else:
             document.body[i] = document.body[i].replace("\\begin_inset Box Shaded", "\\begin_inset Box Frameless")
-            document.body.insert(l + 1, "\\begin_inset Note Shaded\n" + status + "\n\\begin_layout Standard\n")
-            document.body.insert(m + 1, "\\end_layout\n\\end_inset")
+            subst1 = [document.body[l],
+                      "\\begin_inset Note Shaded",
+                      status,
+                      '\\begin_layout Standard']
+            document.body[l:l + 1] = subst1
+            subst2 = [document.body[m], "\\end_layout", "\\end_inset"]
+            document.body[m:m + 1] = subst2
         i = i + 1
 
 
 def revert_slash(document):
     'Revert \\SpecialChar \\slash{} to ERT'
+    r = re.compile(r'\\SpecialChar \\slash{}')
     for i in range(len(document.body)):
-        document.body[i] = document.body[i].replace('\\SpecialChar \\slash{}', \
-        '\\begin_inset ERT\nstatus collapsed\n\n' \
-        '\\begin_layout Standard\n\n\n\\backslash\n' \
-        'slash{}\n\\end_layout\n\n\\end_inset\n\n')
+        m = r.match(document.body[i])
+        if m:
+          subst = ['\\begin_inset ERT',
+                   'status collapsed', '',
+                   '\\begin_layout Standard',
+                   '', '', '\\backslash',
+                   'slash{}',
+                   '\\end_layout', '',
+                   '\\end_inset', '']
+          document.body[i: i+1] = subst
 
 
 def revert_nobreakdash(document):
@@ -1419,18 +1457,19 @@ def revert_nobreakdash(document):
         r = re.compile(r'\\SpecialChar \\nobreakdash-')
         m = r.match(line)
         if m:
-            found = 1
-        document.body[i] = document.body[i].replace('\\SpecialChar \\nobreakdash-', \
-        '\\begin_inset ERT\nstatus collapsed\n\n' \
-        '\\begin_layout Standard\n\n\n\\backslash\n' \
-        'nobreakdash-\n\\end_layout\n\n\\end_inset\n\n')
-    if not found:
-        return
-    j = find_token(document.header, "\\use_amsmath", 0)
-    if j == -1:
-        document.warning("Malformed LyX document: Missing '\\use_amsmath'.")
-        return
-    document.header[j] = "\\use_amsmath 2"
+            subst = ['\\begin_inset ERT',
+                    'status collapsed', '',
+                    '\\begin_layout Standard', '', '',
+                    '\\backslash',
+                    'nobreakdash-',
+                    '\\end_layout', '',
+                    '\\end_inset', '']
+            document.body[i:i+1] = subst
+            j = find_token(document.header, "\\use_amsmath", 0)
+            if j == -1:
+                document.warning("Malformed LyX document: Missing '\\use_amsmath'.")
+                return
+            document.header[j] = "\\use_amsmath 2"
 
 
 def revert_nocite_key(body, start, end):
@@ -1460,9 +1499,8 @@ def revert_nocite(document):
                 return
             revert_nocite_key(document.body, i + 1, j)
             document.body[i-1] = "\\begin_inset ERT"
-            document.body[i] = "status collapsed\n\n" \
-            "\\begin_layout Standard"
-            document.body.insert(j, "\\end_layout\n");
+            document.body[i:i+1] = ["status collapsed", "", "\\begin_layout Standard"]
+            document.body[j+1:j+1] = ["\\end_layout", ""]
             i = j
 
 
@@ -1486,10 +1524,14 @@ def revert_btprintall(document):
             for k in range(i, j):
                 if (document.body[k] == 'btprint "btPrintAll"'):
                     del document.body[k]
-                    document.body.insert(i, "\\begin_inset ERT\n" \
-                    "status collapsed\n\n\\begin_layout Standard\n\n" \
-                    "\\backslash\nnocite{*}\n" \
-                    "\\end_layout\n\\end_inset\n")
+                    subst = ["\\begin_inset ERT",
+                             "status collapsed", "",
+                             "\\begin_layout Standard", "",
+                             "\\backslash",
+                             "nocite{*}",
+                             "\\end_layout",
+                             "\\end_inset"]
+                    document.body[i:i] = subst
             i = j
 
 
@@ -1813,11 +1855,14 @@ def remove_extra_embedded_files(document):
 
 
 def convert_spaceinset(document):
-    " Convert '\\InsetSpace foo' to '\\begin_inset Space foo\n\\end_inset' "
-    for i in range(len(document.body)):
-        if re.search(r'\InsetSpace', document.body[i]):
-            document.body[i] = document.body[i].replace('\\InsetSpace', '\n\\begin_inset Space')
-            document.body[i] = document.body[i] + "\n\\end_inset"
+   " Convert '\\InsetSpace foo' to '\\begin_inset Space foo\n\\end_inset' "
+   for i in range(len(document.body)):
+       m = re.match(r'(.*)\\InsetSpace (.*)', document.body[i])
+       if m:
+           before = m.group(1)
+           after = m.group(2)
+           subst = [before, "\\begin_inset Space " + after, "\\end_inset"]
+           document.body[i: i+1] = subst
 
 
 def revert_spaceinset(document):
@@ -2208,6 +2253,78 @@ def revert_graphics_group(document):
         i = i + 1
 
 
+def update_apa_styles(document):
+    ' Replace obsolete styles '
+
+    if document.textclass != "apa":
+        return
+
+    obsoletedby = { "Acknowledgments": "Acknowledgements",
+                    "Section*":        "Section",
+                    "Subsection*":     "Subsection",
+                    "Subsubsection*":  "Subsubsection",
+                    "Paragraph*":      "Paragraph",
+                    "Subparagraph*":   "Subparagraph"}
+    i = 0
+    while 1:
+        i = find_token(document.body, "\\begin_layout", i)
+        if i == -1:
+            return
+
+        layout = document.body[i][14:]
+        if layout in obsoletedby:
+            document.body[i] = "\\begin_layout " + obsoletedby[layout]
+
+        i += 1
+
+
+def convert_paper_sizes(document):
+    ' exchange size options legalpaper and executivepaper to correct order '
+    # routine is needed to fix http://bugzilla.lyx.org/show_bug.cgi?id=4868
+    i = 0
+    j = 0
+    i = find_token(document.header, "\\papersize executivepaper", 0)
+    if i != -1:
+        document.header[i] = "\\papersize legalpaper"
+        return
+    j = find_token(document.header, "\\papersize legalpaper", 0)
+    if j != -1:
+        document.header[j] = "\\papersize executivepaper"
+
+
+def revert_paper_sizes(document):
+    ' exchange size options legalpaper and executivepaper to correct order '
+    i = 0
+    j = 0
+    i = find_token(document.header, "\\papersize executivepaper", 0)
+    if i != -1:
+        document.header[i] = "\\papersize legalpaper"
+        return
+    j = find_token(document.header, "\\papersize legalpaper", 0)
+    if j != -1:
+        document.header[j] = "\\papersize executivepaper"
+
+
+def convert_InsetSpace(document):
+    " Convert '\\begin_inset Space foo' to '\\begin_inset space foo'"
+    i = 0
+    while True:
+        i = find_token(document.body, "\\begin_inset Space", i)
+        if i == -1:
+            return
+        document.body[i] = document.body[i].replace('\\begin_inset Space', '\\begin_inset space')
+
+
+def revert_InsetSpace(document):
+    " Revert '\\begin_inset space foo' to '\\begin_inset Space foo'"
+    i = 0
+    while True:
+        i = find_token(document.body, "\\begin_inset space", i)
+        if i == -1:
+            return
+        document.body[i] = document.body[i].replace('\\begin_inset space', '\\begin_inset Space')
+
+
 ##
 # Conversion hub
 #
@@ -2269,9 +2386,15 @@ convert = [[277, [fix_wrong_tables]],
            [330, []],
            [331, [convert_ltcaption]],
            [332, []],
+           [333, [update_apa_styles]],
+           [334, [convert_paper_sizes]],
+           [335, [convert_InsetSpace]],
           ]
 
-revert =  [[331, [revert_graphics_group]],
+revert =  [[334, [revert_InsetSpace]],
+           [333, [revert_paper_sizes]],
+           [332, []],
+           [331, [revert_graphics_group]],
            [330, [revert_ltcaption]],
            [329, [revert_leftarrowfill, revert_rightarrowfill, revert_upbracefill, revert_downbracefill]],
            [328, [revert_master]],