]> git.lyx.org Git - lyx.git/blobdiff - lib/lyx2lyx/lyx_2_2.py
Rename Caption:LongTableNoNumber to Caption:Unnumbered
[lyx.git] / lib / lyx2lyx / lyx_2_2.py
index d30f782cb10e287dc3c4636de83871def93e1543..04c32ce7aa6d6d2b813445b5b5640a4de0c0e53c 100644 (file)
@@ -30,8 +30,8 @@ import sys, os
 #  find_token_backwards, is_in_inset, get_value, get_quoted_value, \
 #  del_token, check_token, get_option_value
 
-from lyx2lyx_tools import add_to_preamble, put_cmd_in_ert, lyx2latex, \
-  length_in_bp
+from lyx2lyx_tools import add_to_preamble, put_cmd_in_ert, get_ert, lyx2latex, \
+  lyx2verbatim, length_in_bp, convert_info_insets
 #  insert_to_preamble, latex_length, revert_flex_inset, \
 #  revert_font_attrs, hex2ratio, str2bool
 
@@ -104,6 +104,36 @@ def revert_Argument_to_TeX_brace(document, line, endline, n, nmax, environment,
 ###
 ###############################################################################
 
+def convert_longtable_label_internal(document, forward):
+    """
+    Convert reference to "LongTableNoNumber" into "Unnumbered" if forward is True
+    else revert it.
+    """
+    old_reference = "\\begin_inset Caption LongTableNoNumber"
+    new_reference = "\\begin_inset Caption Unnumbered"
+
+    # if the purpose is to revert swap the strings roles
+    if not forward:
+        old_reference, new_reference = new_reference, old_reference
+
+    i = 0
+    while True:
+        i = find_token(document.body, old_reference, i)
+
+        if i == -1:
+            return
+
+        document.body[i] = new_reference
+
+
+def convert_longtable_label(document):
+    convert_longtable_label_internal(document, True)
+
+
+def revert_longtable_label(document):
+    convert_longtable_label_internal(document, False)
+
+
 def convert_separator(document):
     """
     Convert layout separators to separator insets and add (LaTeX) paragraph
@@ -311,11 +341,11 @@ def revert_smash(document):
     i = find_token(document.header, "\\use_package amsmath", 0)
     if i == -1:
         document.warning("Malformed LyX document: Can't find \\use_package amsmath.")
-        return;
+        return
     value = get_value(document.header, "\\use_package amsmath", i).split()[1]
     if value != "1":
         # nothing to do if package is not auto but on or off
-        return;
+        return
     j = 0
     while True:
         j = find_token(document.body, '\\begin_inset Formula', j)
@@ -486,14 +516,7 @@ def revert_question_env(document):
     """
 
     # Do we use theorems-ams-extended-bytype module?
-    have_mod = False
-    mods = document.get_module_list()
-    for mod in mods:
-        if mod == "theorems-ams-extended-bytype":
-            have_mod = True
-            continue
-
-    if not have_mod:
+    if not "theorems-ams-extended-bytype" in document.get_module_list():
         return
 
     consecutive = False
@@ -798,15 +821,7 @@ def revert_sigplan_doi(document):
 def revert_ex_itemargs(document):
     " Reverts \\item arguments of the example environments (Linguistics module) to TeX-code "
 
-    # Do we use the linguistics module?
-    have_mod = False
-    mods = document.get_module_list()
-    for mod in mods:
-        if mod == "linguistics":
-            have_mod = True
-            continue
-
-    if not have_mod:
+    if not "linguistics" in document.get_module_list():
         return
 
     i = 0
@@ -837,15 +852,7 @@ def revert_ex_itemargs(document):
 def revert_forest(document):
     " Reverts the forest environment (Linguistics module) to TeX-code "
 
-    # Do we use the linguistics module?
-    have_mod = False
-    mods = document.get_module_list()
-    for mod in mods:
-        if mod == "linguistics":
-            have_mod = True
-            continue
-
-    if not have_mod:
+    if not "linguistics" in document.get_module_list():
         return
 
     i = 0
@@ -865,26 +872,14 @@ def revert_forest(document):
 
         add_to_preamble(document, ["\\usepackage{forest}"])
 
-        document.body[i:j + 1] = ["\\begin_inset ERT", "status collapsed", "",
-                "\\begin_layout Plain Layout", "", "\\backslash", 
-                "begin{forest}", "\\end_layout", "", "\\begin_layout Plain Layout",
-                content, "\\end_layout", "", "\\begin_layout Plain Layout",
-                "\\backslash", "end{forest}", "", "\\end_layout", "", "\\end_inset"]
+        document.body[i:j + 1] = put_cmd_in_ert("\\begin{forest}" + content + "\\end{forest}")
         # no need to reset i
 
 
 def revert_glossgroup(document):
     " Reverts the GroupGlossedWords inset (Linguistics module) to TeX-code "
 
-    # Do we use the linguistics module?
-    have_mod = False
-    mods = document.get_module_list()
-    for mod in mods:
-        if mod == "linguistics":
-            have_mod = True
-            continue
-
-    if not have_mod:
+    if not "linguistics" in document.get_module_list():
         return
 
     i = 0
@@ -900,7 +895,7 @@ def revert_glossgroup(document):
 
         beginPlain = find_token(document.body, "\\begin_layout Plain Layout", i)
         endPlain = find_end_of_layout(document.body, beginPlain)
-        content = lyx2latex(document, document.body[beginPlain : endPlain])
+        content = lyx2verbatim(document, document.body[beginPlain : endPlain])
 
         document.body[i:j + 1] = ["{", "", content, "", "}"]
         # no need to reset i
@@ -909,15 +904,7 @@ def revert_glossgroup(document):
 def revert_newgloss(document):
     " Reverts the new Glosse insets (Linguistics module) to the old format "
 
-    # Do we use the linguistics module?
-    have_mod = False
-    mods = document.get_module_list()
-    for mod in mods:
-        if mod == "linguistics":
-            have_mod = True
-            continue
-
-    if not have_mod:
+    if not "linguistics" in document.get_module_list():
         return
 
     glosses = ("\\begin_inset Flex Glosse", "\\begin_inset Flex Tri-Glosse")
@@ -943,7 +930,7 @@ def revert_newgloss(document):
                     i += 1
                     continue
                 argendPlain = find_end_of_inset(document.body, argbeginPlain)
-                argcontent = lyx2latex(document, document.body[argbeginPlain : argendPlain - 2])
+                argcontent = lyx2verbatim(document, document.body[argbeginPlain : argendPlain - 2])
 
                 document.body[j:j] = ["", "\\begin_layout Plain Layout","\\backslash", "glt ",
                     argcontent, "\\end_layout"]
@@ -956,24 +943,41 @@ def revert_newgloss(document):
 
             beginPlain = find_token(document.body, "\\begin_layout Plain Layout", i)
             endPlain = find_end_of_layout(document.body, beginPlain)
-            content = lyx2latex(document, document.body[beginPlain : endPlain])
+            content = lyx2verbatim(document, document.body[beginPlain : endPlain])
 
             document.body[beginPlain + 1:endPlain] = [content]
             i = beginPlain + 1
 
+    # Dissolve ERT insets
+    for glosse in glosses:
+        i = 0
+        while True:
+            i = find_token(document.body, glosse, i)
+            if i == -1:
+                break
+            j = find_end_of_inset(document.body, i)
+            if j == -1:
+                document.warning("Malformed LyX document: Can't find end of Glosse inset")
+                i += 1
+                continue
+            while True:
+                ert = find_token(document.body, "\\begin_inset ERT", i, j)
+                if ert == -1:
+                    break
+                ertend = find_end_of_inset(document.body, ert)
+                if ertend == -1:
+                    document.warning("Malformed LyX document: Can't find end of ERT inset")
+                    ert += 1
+                    continue
+                ertcontent = get_ert(document.body, ert, True)
+                document.body[ert : ertend + 1] = [ertcontent]
+            i += 1
+
 
 def convert_newgloss(document):
     " Converts Glosse insets (Linguistics module) to the new format "
 
-    # Do we use the linguistics module?
-    have_mod = False
-    mods = document.get_module_list()
-    for mod in mods:
-        if mod == "linguistics":
-            have_mod = True
-            continue
-
-    if not have_mod:
+    if not "linguistics" in document.get_module_list():
         return
 
     glosses = ("\\begin_inset Flex Glosse", "\\begin_inset Flex Tri-Glosse")
@@ -1086,7 +1090,7 @@ def convert_origin(document):
     i = find_token(document.header, "\\textclass ", 0)
     if i == -1:
         document.warning("Malformed LyX document: No \\textclass!!")
-        return;
+        return
     if document.dir == "":
         origin = "stdin"
     else:
@@ -1121,7 +1125,7 @@ def revert_origin(document):
     i = find_token(document.header, "\\origin ", 0)
     if i == -1:
         document.warning("Malformed LyX document: No \\origin!!")
-        return;
+        return
     del document.header[i]
 
 
@@ -1453,7 +1457,6 @@ def revert_jss(document):
           h = find_token(document.body, "\\begin_inset Flex Code Chunk", h)
         if h != -1:
           endh = find_end_of_inset(document.body, h)
-          document.body[endh + 1 : endh] = ["\\end_layout"]
           document.body[endh : endh + 1] = put_cmd_in_ert("\\end{CodeChunk}")
           document.body[h : h + 3] = put_cmd_in_ert("\\begin{CodeChunk}")
           document.body[h - 1 : h] = ["\\begin_layout Standard"]
@@ -1946,72 +1949,100 @@ def revert_moderncv_2(document):
     i += 1
 
 
-def convert_moderncv(document):
-  " Convert the Fax and Mobile inset of moderncv to the new phone inset "
-  
-  if document.textclass != "moderncv":
-    return
-  i = 0
-  j = 0
-  lineArg = 0
-  while True:
-    # \mobile
-    i = find_token(document.body, "\\begin_layout Mobile", i)
-    if i == -1:
-      return
-    j = find_end_of_layout(document.body, i)
-    if j == -1:
-      document.warning("Malformed LyX document: Can't find end of Mobile layout")
-      i += 1
-      return
-    document.body[i + 1 : i + 1] = ["\\begin_inset Argument 1", "status open", "",
-                        "\\begin_layout Plain Layout", "mobile", "\\end_layout", "",
-                        "\\end_inset", ""]
-    # \fax
-    i = find_token(document.body, "\\begin_layout Fax", i)
-    if i == -1:
-      return
-    j = find_end_of_layout(document.body, i)
-    if j == -1:
-      document.warning("Malformed LyX document: Can't find end of Fax layout")
-      i += 1
-      return
-    document.body[i + 1 : i + 1] = ["\\begin_inset Argument 1", "status open", "",
-                        "\\begin_layout Plain Layout", "fax", "\\end_layout", "",
-                        "\\end_inset", ""]
-    # \firstname and \familyname
-    i1 = find_token(document.body, "\\begin_layout FirstName", 0)
-    if i1 == -1:
-      return
-    j1 = find_end_of_layout(document.body, i1)
-    if j1 == -1:
-      document.warning("Malformed LyX document: Can't find end of FirstName layout")
-      i1 += 1
-      return
-    FirstName = document.body[i1 + 1 : i1 + 2]
-    i2 = find_token(document.body, "\\begin_layout FamilyName", 0)
-    if i2 == -1:
-      return
-    j2 = find_end_of_layout(document.body, i2)
-    if j2 == -1:
-      document.warning("Malformed LyX document: Can't find end of FamilyName layout")
-      i2 += 1
-      return
-    FamilyName = document.body[i2 + 1 : i2 + 2]
-    if j1 > j2:
-      k = j1
-      l = i2
-    else:
-      k = j2
-      l = i1
-    document.body[k + 1 : k + 1] = ["\\begin_layout Name", "\\begin_inset Argument 1", "status open", "",
-                        "\\begin_layout Plain Layout", FirstName[0], "\\end_layout", "",
-                        "\\end_inset", "", FamilyName[0], "\\end_layout", ""]
-    #document.body[i2 + 1 : i2 + 1] = ["hellok: ", str(k)]
-    del(document.body[l : k])
-    i += 1
-    i1 += 1
-    i2 += 1
+def convert_moderncv_phone(document):
+    " Convert the Fax and Mobile inset of moderncv to the new phone inset "
+
+    if document.textclass != "moderncv":
+        return
+    i = 0
+    j = 0
+    lineArg = 0
+
+    phone_dict = {
+        "Mobile" : "mobile",
+        "Fax" : "fax",
+        }
+
+    rx = re.compile(r'^\\begin_layout (\S+)$')
+    while True:
+        # substitute \fax and \mobile by \phone[fax] and \phone[mobile], respectively
+        i = find_token(document.body, "\\begin_layout", i)
+        if i == -1:
+            return
+
+        m = rx.match(document.body[i])
+        val = ""
+        if m:
+            val = m.group(1)
+        if val not in list(phone_dict.keys()):
+            i += 1
+            continue
+        j = find_end_of_layout(document.body, i)
+        if j == -1:
+            document.warning("Malformed LyX document: Can't find end of Mobile layout")
+            i += 1
+            return
+
+        document.body[i : i + 1] = ["\\begin_layout Phone", "\\begin_inset Argument 1", "status open", "",
+                            "\\begin_layout Plain Layout", phone_dict[val], "\\end_layout", "",
+                            "\\end_inset", ""]
+
+
+def convert_moderncv_name(document):
+    " Convert the FirstName and LastName layout of moderncv to the general Name layout "
+
+    if document.textclass != "moderncv":
+        return
+
+    fnb = 0 # Begin of FirstName inset
+    fne = 0 # End of FirstName inset
+    lnb = 0 # Begin of LastName (FamilyName) inset
+    lne = 0 # End of LastName (FamilyName) inset
+    nb = 0 # Begin of substituting Name inset
+    ne = 0 # End of substituting Name inset
+    FirstName = [] # FirstName content
+    FamilyName = [] # LastName content
+
+    while True:
+        # locate FirstName
+        fnb = find_token(document.body, "\\begin_layout FirstName", fnb)
+        if fnb != -1:
+            fne = find_end_of_layout(document.body, fnb)
+            if fne == -1:
+                document.warning("Malformed LyX document: Can't find end of FirstName layout")
+                return
+            FirstName = document.body[fnb + 1 : fne]
+        # locate FamilyName
+        lnb = find_token(document.body, "\\begin_layout FamilyName", lnb)
+        if lnb != -1:
+            lne = find_end_of_layout(document.body, lnb)
+            if lne == -1:
+                document.warning("Malformed LyX document: Can't find end of FamilyName layout")
+                return
+            FamilyName = document.body[lnb + 1 : lne]
+        # Determine the region for the substituting Name layout
+        if fnb == -1 and lnb == -1: # Neither FirstName nor FamilyName exists -> Do nothing
+            return
+        elif fnb == -1: # Only FamilyName exists -> New Name insets replaces that
+            nb = lnb
+            ne = lne
+        elif lnb == -1: # Only FirstName exists -> New Name insets replaces that
+            nb = fnb
+            ne = fne
+        elif fne > lne: # FirstName position before FamilyName -> New Name insets spans
+            nb = lnb #     from FamilyName begin
+            ne = fne #     to FirstName end
+        else: #           FirstName position before FamilyName -> New Name insets spans
+            nb = fnb #     from FirstName begin
+            ne = lne #     to FamilyName end
+
+        # Insert the substituting layout now. If FirstName exists, use an otpional argument.
+        if FirstName == []:
+            document.body[nb : ne + 1] = ["\\begin_layout Name"] + FamilyName + ["\\end_layout", ""]
+        else:
+            document.body[nb : ne + 1] = ["\\begin_layout Name", "\\begin_inset Argument 1", "status open", "",
+                                "\\begin_layout Plain Layout"] + FirstName + ["\\end_layout", "",
+                                "\\end_inset", ""] + FamilyName + ["\\end_layout", ""]
 
 
 def revert_achemso(document):
@@ -2057,9 +2088,12 @@ def convert_fontsettings(document):
         i = find_token(document.header, f + " ", 0)
         if i == -1:
             document.warning("Malformed LyX document: No " + f + "!")
-            j = j + 1
-            continue
-        value = document.header[i][len(f):].strip()
+            # we can fix that
+            # note that with i = -1, this will insert at the end
+            # of the header
+            value = fontdefaults[j]
+        else:
+            value = document.header[i][len(f):].strip()
         if fontquotes[j]:
             if use_non_tex_fonts == "true":
                 document.header[i:i+1] = [f + ' "' + fontdefaults[j] + '" "' + value + '"']
@@ -2180,6 +2214,35 @@ def revert_verbatim_star(document):
     revert_verbatim(document, True)
 
 
+def convert_save_props(document):
+    " Add save_transient_properties parameter. "
+    i = find_token(document.header, '\\begin_header', 0)
+    if i == -1:
+        document.warning("Malformed lyx document: Missing '\\begin_header'.")
+        return
+    document.header.insert(i + 1, '\\save_transient_properties true')
+
+
+def revert_save_props(document):
+    " Remove save_transient_properties parameter. "
+    i = find_token(document.header, "\\save_transient_properties", 0)
+    if i == -1:
+        return
+    del document.header[i]
+
+
+def convert_info_tabular_feature(document):
+    def f(arg):
+        return arg.replace("inset-modify tabular", "tabular-feature")
+    convert_info_insets(document, "shortcut(s)?|icon", f)
+
+
+def revert_info_tabular_feature(document):
+    def f(arg):
+        return arg.replace("tabular-feature", "inset-modify tabular")
+    convert_info_insets(document, "shortcut(s)?|icon", f)
+
+
 ##
 # Conversion hub
 #
@@ -2213,14 +2276,22 @@ convert = [
            [496, [convert_nounzip]],
            [497, [convert_external_bbox]],
            [498, []],
-           [499, [convert_moderncv]],
+           [499, [convert_moderncv_phone, convert_moderncv_name]],
            [500, []],
            [501, [convert_fontsettings]],
            [502, []],
-           [503, []]
+           [503, []],
+           [504, [convert_save_props]],
+           [505, []],
+           [506, [convert_info_tabular_feature]],
+           [507, [convert_longtable_label]]
           ]
 
 revert =  [
+           [506, [revert_longtable_label]],
+           [505, [revert_info_tabular_feature]],
+           [504, []],
+           [503, [revert_save_props]],
            [502, [revert_verbatim_star]],
            [501, [revert_solution]],
            [500, [revert_fontsettings]],