]> git.lyx.org Git - features.git/blobdiff - lib/lyx2lyx/lyx_2_4.py
Refactor lyx2lyx code.
[features.git] / lib / lyx2lyx / lyx_2_4.py
index 5cdcc3c692ce83f0bb1277a1a995ad522735e66b..b5a03488fa00cf5d1da9ba26bc3447054312c8c3 100644 (file)
@@ -206,7 +206,7 @@ def convert_fonts(document, fm, osfoption = "osf"):
     haveFontOpts = document.end_format > 580
 
     i = 0
-    while i < len(document.preamble):
+    while True:
         i = find_re(document.preamble, rpkg, i+1)
         if i == -1:
             return
@@ -408,14 +408,14 @@ def revert_inputencoding_namechange(document):
 def convert_notoFonts(document):
     " Handle Noto fonts definition to LaTeX "
 
-    if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1:
+    if not get_bool_value(document.header, "\\use_non_tex_fonts"):
         fm = createFontMapping(['Noto'])
         convert_fonts(document, fm)
 
 def revert_notoFonts(document):
     " Revert native Noto font definition to LaTeX "
 
-    if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1:
+    if not get_bool_value(document.header, "\\use_non_tex_fonts"):
         fontmap = dict()
         fm = createFontMapping(['Noto'])
         if revert_fonts(document, fm, fontmap):
@@ -424,14 +424,14 @@ def revert_notoFonts(document):
 def convert_latexFonts(document):
     " Handle DejaVu and IBMPlex fonts definition to LaTeX "
 
-    if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1:
+    if not get_bool_value(document.header, "\\use_non_tex_fonts"):
         fm = createFontMapping(['DejaVu', 'IBM'])
         convert_fonts(document, fm)
 
 def revert_latexFonts(document):
     " Revert native DejaVu font definition to LaTeX "
 
-    if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1:
+    if not get_bool_value(document.header, "\\use_non_tex_fonts"):
         fontmap = dict()
         fm = createFontMapping(['DejaVu', 'IBM'])
         if revert_fonts(document, fm, fontmap):
@@ -440,14 +440,14 @@ def revert_latexFonts(document):
 def convert_AdobeFonts(document):
     " Handle Adobe Source fonts definition to LaTeX "
 
-    if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1:
+    if not get_bool_value(document.header, "\\use_non_tex_fonts"):
         fm = createFontMapping(['Adobe'])
         convert_fonts(document, fm)
 
 def revert_AdobeFonts(document):
     " Revert Adobe Source font definition to LaTeX "
 
-    if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1:
+    if not get_bool_value(document.header, "\\use_non_tex_fonts"):
         fontmap = dict()
         fm = createFontMapping(['Adobe'])
         if revert_fonts(document, fm, fontmap):
@@ -556,7 +556,7 @@ def revert_lst_literalparam(document):
 def revert_paratype(document):
     " Revert ParaType font definitions to LaTeX "
 
-    if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1:
+    if not get_bool_value(document.header, "\\use_non_tex_fonts"):
         preamble = ""
         i1 = find_token(document.header, "\\font_roman \"PTSerif-TLF\"", 0)
         i2 = find_token(document.header, "\\font_sans \"default\"", 0)
@@ -792,56 +792,6 @@ def revert_tuftecite(document):
         i = j
 
 
-def convert_aaencoding(document):
-    " Convert default document option due to encoding change in aa class. "
-
-    if document.textclass != "aa":
-        return
-
-    i = 0
-
-    i = find_token(document.header, "\\use_default_options true", i)
-    if i == -1:
-        return
-    j = find_token(document.header, "\\inputencoding", 0)
-    if j == -1:
-        document.warning("Malformed LyX Document! Missing \\inputencoding header.")
-        return
-    val = get_value(document.header, "\\inputencoding", j)
-    if val == "auto" or val == "latin9":
-        document.header[i] = "\\use_default_options false"
-        k = find_token(document.header, "\\options", 0)
-        if k == -1:
-            document.header.insert(i, "\\options latin9")
-        else:
-            document.header[k] = document.header[k] + ",latin9"
-
-
-def revert_aaencoding(document):
-    " Revert default document option due to encoding change in aa class. "
-
-    if document.textclass != "aa":
-        return
-
-    i = 0
-
-    i = find_token(document.header, "\\use_default_options true", i)
-    if i == -1:
-        return
-    j = find_token(document.header, "\\inputencoding", 0)
-    if j == -1:
-        document.warning("Malformed LyX Document! Missing \\inputencoding header.")
-        return
-    val = get_value(document.header, "\\inputencoding", j)
-    if val == "utf8":
-        document.header[i] = "\\use_default_options false"
-        k = find_token(document.header, "\\options", 0)
-        if k == -1:
-            document.header.insert(i, "\\options utf8")
-        else:
-            document.header[k] = document.header[k] + ",utf8"
-            
-
 
 def revert_stretchcolumn(document):
     " We remove the column varwidth flags or everything else will become a mess. "
@@ -1865,6 +1815,50 @@ def convert_lineno(document):
                                 "\\lineno_options %s" % options]
 
 
+def convert_aaencoding(document):
+    " Convert default document option due to encoding change in aa class. "
+
+    if document.textclass != "aa":
+        return
+
+    i = find_token(document.header, "\\use_default_options true")
+    if i == -1:
+        return
+    val = get_value(document.header, "\\inputencoding")
+    if not val:
+        document.warning("Malformed LyX Document! Missing '\\inputencoding' header.")
+        return
+    if val == "auto-legacy" or val == "latin9":
+        document.header[i] = "\\use_default_options false"
+        k = find_token(document.header, "\\options")
+        if k == -1:
+            document.header.insert(i, "\\options latin9")
+        else:
+            document.header[k] += ",latin9"
+
+
+def revert_aaencoding(document):
+    " Revert default document option due to encoding change in aa class. "
+
+    if document.textclass != "aa":
+        return
+
+    i = find_token(document.header, "\\use_default_options true")
+    if i == -1:
+        return
+    val = get_value(document.header, "\\inputencoding")
+    if not val:
+        document.warning("Malformed LyX Document! Missing \\inputencoding header.")
+        return
+    if val == "utf8":
+        document.header[i] = "\\use_default_options false"
+        k = find_token(document.header, "\\options", 0)
+        if k == -1:
+            document.header.insert(i, "\\options utf8")
+        else:
+            document.header[k] = document.header[k] + ",utf8"
+
+
 def revert_new_languages(document):
     """Emulate support for Azerbaijani, Bengali, Church Slavonic, Korean,
     and Russian (Petrine orthography)."""
@@ -1876,26 +1870,27 @@ def revert_new_languages(document):
                      "oldrussian":     ("", "russian"),
                      "korean":         ("", "korean"),
                     }
-    used_languages = set()
     if document.language in new_languages:
-        used_languages.add(document.language)
+        used_languages = set((document.language, ))
+    else:
+        used_languages = set()
     i = 0
     while True:
         i = find_token(document.body, "\\lang", i+1)
         if i == -1:
             break
-        if document.body[i][6:].strip() in new_languages:
-            used_languages.add(document.language)
+        val = get_value(document.body, "\\lang", i)
+        if val in new_languages:
+            used_languages.add(val)
 
     # Korean is already supported via CJK, so leave as-is for Babel
     if ("korean" in used_languages
-        and get_bool_value(document.header, "\\use_non_tex_fonts")
-        and get_value(document.header, "\\language_package") in ("default", "auto")):
-        revert_language(document, "korean", "", "korean")
-    used_languages.discard("korean")
+        and (not get_bool_value(document.header, "\\use_non_tex_fonts")
+             or get_value(document.header, "\\language_package") == "babel")):
+        used_languages.discard("korean")
 
     for lang in used_languages:
-        revert(lang, *new_languages[lang])
+        revert_language(document, lang, *new_languages[lang])
 
 
 gloss_inset_def = [
@@ -2369,12 +2364,9 @@ def revert_drs(document):
 def revert_babelfont(document):
     " Reverts the use of \\babelfont to user preamble "
 
-    i = find_token(document.header, '\\use_non_tex_fonts', 0)
-    if i == -1:
-        document.warning("Malformed LyX document: Missing \\use_non_tex_fonts.")
-        return
-    if not str2bool(get_value(document.header, "\\use_non_tex_fonts", i)):
+    if not get_bool_value(document.header, "\\use_non_tex_fonts"):
         return
+
     i = find_token(document.header, '\\language_package', 0)
     if i == -1:
         document.warning("Malformed LyX document: Missing \\language_package.")
@@ -2478,11 +2470,7 @@ def revert_babelfont(document):
 def revert_minionpro(document):
     " Revert native MinionPro font definition (with extra options) to LaTeX "
 
-    i = find_token(document.header, '\\use_non_tex_fonts', 0)
-    if i == -1:
-        document.warning("Malformed LyX document: Missing \\use_non_tex_fonts.")
-        return
-    if str2bool(get_value(document.header, "\\use_non_tex_fonts", i)):
+    if get_bool_value(document.header, "\\use_non_tex_fonts"):
         return
 
     regexp = re.compile(r'(\\font_roman_opts)')
@@ -2524,16 +2512,8 @@ def revert_minionpro(document):
 def revert_font_opts(document):
     " revert font options by outputting \\setxxxfont or \\babelfont to the preamble "
 
-    i = find_token(document.header, '\\use_non_tex_fonts', 0)
-    if i == -1:
-        document.warning("Malformed LyX document: Missing \\use_non_tex_fonts.")
-        return
-    NonTeXFonts = str2bool(get_value(document.header, "\\use_non_tex_fonts", i))
-    i = find_token(document.header, '\\language_package', 0)
-    if i == -1:
-        document.warning("Malformed LyX document: Missing \\language_package.")
-        return
-    Babel = (get_value(document.header, "\\language_package", 0) == "babel")
+    NonTeXFonts = get_bool_value(document.header, "\\use_non_tex_fonts")
+    Babel = (get_value(document.header, "\\language_package") == "babel")
 
     # 1. Roman
     regexp = re.compile(r'(\\font_roman_opts)')
@@ -2644,11 +2624,7 @@ def revert_font_opts(document):
 def revert_plainNotoFonts_xopts(document):
     " Revert native (straight) Noto font definition (with extra options) to LaTeX "
 
-    i = find_token(document.header, '\\use_non_tex_fonts', 0)
-    if i == -1:
-        document.warning("Malformed LyX document: Missing \\use_non_tex_fonts.")
-        return
-    if str2bool(get_value(document.header, "\\use_non_tex_fonts", i)):
+    if get_bool_value(document.header, "\\use_non_tex_fonts"):
         return
 
     osf = False
@@ -2718,11 +2694,7 @@ def revert_plainNotoFonts_xopts(document):
 def revert_notoFonts_xopts(document):
     " Revert native (extended) Noto font definition (with extra options) to LaTeX "
 
-    i = find_token(document.header, '\\use_non_tex_fonts', 0)
-    if i == -1:
-        document.warning("Malformed LyX document: Missing \\use_non_tex_fonts.")
-        return
-    if str2bool(get_value(document.header, "\\use_non_tex_fonts", i)):
+    if get_bool_value(document.header, "\\use_non_tex_fonts"):
         return
 
     fontmap = dict()
@@ -2734,11 +2706,7 @@ def revert_notoFonts_xopts(document):
 def revert_IBMFonts_xopts(document):
     " Revert native IBM font definition (with extra options) to LaTeX "
 
-    i = find_token(document.header, '\\use_non_tex_fonts', 0)
-    if i == -1:
-        document.warning("Malformed LyX document: Missing \\use_non_tex_fonts.")
-        return
-    if str2bool(get_value(document.header, "\\use_non_tex_fonts", i)):
+    if get_bool_value(document.header, "\\use_non_tex_fonts"):
         return
 
     fontmap = dict()
@@ -2751,11 +2719,7 @@ def revert_IBMFonts_xopts(document):
 def revert_AdobeFonts_xopts(document):
     " Revert native Adobe font definition (with extra options) to LaTeX "
 
-    i = find_token(document.header, '\\use_non_tex_fonts', 0)
-    if i == -1:
-        document.warning("Malformed LyX document: Missing \\use_non_tex_fonts.")
-        return
-    if str2bool(get_value(document.header, "\\use_non_tex_fonts", i)):
+    if get_bool_value(document.header, "\\use_non_tex_fonts"):
         return
 
     fontmap = dict()
@@ -2768,12 +2732,7 @@ def revert_AdobeFonts_xopts(document):
 def convert_osf(document):
     " Convert \\font_osf param to new format "
 
-    NonTeXFonts = False
-    i = find_token(document.header, '\\use_non_tex_fonts', 0)
-    if i == -1:
-        document.warning("Malformed LyX document: Missing \\use_non_tex_fonts.")
-    else:
-        NonTeXFonts = str2bool(get_value(document.header, "\\use_non_tex_fonts", i))
+    NonTeXFonts = get_bool_value(document.header, "\\use_non_tex_fonts")
 
     i = find_token(document.header, '\\font_osf', 0)
     if i == -1:
@@ -2824,12 +2783,7 @@ def convert_osf(document):
 def revert_osf(document):
     " Revert \\font_*_osf params "
 
-    NonTeXFonts = False
-    i = find_token(document.header, '\\use_non_tex_fonts', 0)
-    if i == -1:
-        document.warning("Malformed LyX document: Missing \\use_non_tex_fonts.")
-    else:
-        NonTeXFonts = str2bool(get_value(document.header, "\\use_non_tex_fonts", i))
+    NonTeXFonts = get_bool_value(document.header, "\\use_non_tex_fonts")
 
     i = find_token(document.header, '\\font_roman_osf', 0)
     if i == -1:
@@ -2866,11 +2820,7 @@ def revert_osf(document):
 def revert_texfontopts(document):
     " Revert native TeX font definitions (with extra options) to LaTeX "
 
-    i = find_token(document.header, '\\use_non_tex_fonts', 0)
-    if i == -1:
-        document.warning("Malformed LyX document: Missing \\use_non_tex_fonts.")
-        return
-    if str2bool(get_value(document.header, "\\use_non_tex_fonts", i)):
+    if get_bool_value(document.header, "\\use_non_tex_fonts"):
         return
 
     rmfonts = ["ccfonts", "cochineal", "utopia", "garamondx", "libertine", "lmodern", "palatino", "times", "xcharter" ]
@@ -2985,14 +2935,14 @@ def revert_texfontopts(document):
 def convert_CantarellFont(document):
     " Handle Cantarell font definition to LaTeX "
 
-    if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1:
+    if not get_bool_value(document.header, "\\use_non_tex_fonts"):
         fm = createFontMapping(['Cantarell'])
         convert_fonts(document, fm, "oldstyle")
 
 def revert_CantarellFont(document):
     " Revert native Cantarell font definition to LaTeX "
 
-    if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1:
+    if not get_bool_value(document.header, "\\use_non_tex_fonts"):
         fontmap = dict()
         fm = createFontMapping(['Cantarell'])
         if revert_fonts(document, fm, fontmap, False, True):
@@ -3001,14 +2951,14 @@ def revert_CantarellFont(document):
 def convert_ChivoFont(document):
     " Handle Chivo font definition to LaTeX "
 
-    if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1:
+    if not get_bool_value(document.header, "\\use_non_tex_fonts"):
         fm = createFontMapping(['Chivo'])
         convert_fonts(document, fm, "oldstyle")
 
 def revert_ChivoFont(document):
     " Revert native Chivo font definition to LaTeX "
 
-    if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1:
+    if not get_bool_value(document.header, "\\use_non_tex_fonts"):
         fontmap = dict()
         fm = createFontMapping(['Chivo'])
         if revert_fonts(document, fm, fontmap, False, True):
@@ -3018,14 +2968,14 @@ def revert_ChivoFont(document):
 def convert_FiraFont(document):
     " Handle Fira font definition to LaTeX "
 
-    if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1:
+    if not get_bool_value(document.header, "\\use_non_tex_fonts"):
         fm = createFontMapping(['Fira'])
         convert_fonts(document, fm, "lf")
 
 def revert_FiraFont(document):
     " Revert native Fira font definition to LaTeX "
 
-    if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1:
+    if not get_bool_value(document.header, "\\use_non_tex_fonts"):
         fontmap = dict()
         fm = createFontMapping(['Fira'])
         if revert_fonts(document, fm, fontmap, False, True):
@@ -3035,12 +2985,7 @@ def revert_FiraFont(document):
 def convert_Semibolds(document):
     " Move semibold options to extraopts "
 
-    NonTeXFonts = False
-    i = find_token(document.header, '\\use_non_tex_fonts', 0)
-    if i == -1:
-        document.warning("Malformed LyX document: Missing \\use_non_tex_fonts.")
-    else:
-        NonTeXFonts = str2bool(get_value(document.header, "\\use_non_tex_fonts", i))
+    NonTeXFonts = get_bool_value(document.header, "\\use_non_tex_fonts")
 
     i = find_token(document.header, "\\font_roman", 0)
     if i == -1:
@@ -3161,14 +3106,14 @@ def convert_NotoRegulars(document):
 def convert_CrimsonProFont(document):
     " Handle CrimsonPro font definition to LaTeX "
 
-    if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1:
+    if not get_bool_value(document.header, "\\use_non_tex_fonts"):
         fm = createFontMapping(['CrimsonPro'])
         convert_fonts(document, fm, "lf")
 
 def revert_CrimsonProFont(document):
     " Revert native CrimsonPro font definition to LaTeX "
 
-    if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1:
+    if not get_bool_value(document.header, "\\use_non_tex_fonts"):
         fontmap = dict()
         fm = createFontMapping(['CrimsonPro'])
         if revert_fonts(document, fm, fontmap, False, True):
@@ -3568,7 +3513,7 @@ def revert_totalheight(document):
                         val = val + "," + special
                     document.body[k] = "\tspecial " + "totalheight=" + val
                 else:
-                    document.body.insert(kk, "\tspecial totalheight=" + val) 
+                    document.body.insert(kk, "\tspecial totalheight=" + val)
                 if oldheight != "":
                     document.body[kk] = m.group(1) + oldheight
                 else:
@@ -3627,15 +3572,88 @@ def convert_totalheight(document):
                         val = val + "," + special
                     document.body[k] = "\tspecial " + "height=" + val
                 else:
-                    document.body.insert(kk + 1, "\tspecial height=" + val) 
+                    document.body.insert(kk + 1, "\tspecial height=" + val)
                 if newheight != "":
                     document.body[kk] = m.group(1) + newheight
                 else:
                     del document.body[kk]
         elif newheight != "":
-            document.body.insert(k, "\theight " + newheight) 
+            document.body.insert(k, "\theight " + newheight)
         i = j + 1
 
+
+def convert_changebars(document):
+    " Converts the changebars module to native solution "
+
+    if not "changebars" in document.get_module_list():
+        return
+
+    i = find_token(document.header, "\\output_changes", 0)
+    if i == -1:
+        document.warning("Malformed LyX document! Missing \\output_changes header.")
+        document.del_module("changebars")
+        return
+
+    document.header.insert(i, "\\change_bars true")
+    document.del_module("changebars")
+
+
+def revert_changebars(document):
+    " Converts native changebar param to module "
+
+    i = find_token(document.header, "\\change_bars", 0)
+    if i == -1:
+        document.warning("Malformed LyX document! Missing \\change_bars header.")
+        return
+
+    val = get_value(document.header, "\\change_bars", i)
+
+    if val == "true":
+        document.add_module("changebars")
+
+    del document.header[i]
+
+
+def convert_postpone_fragile(document):
+    " Adds false \\postpone_fragile_content buffer param "
+
+    i = find_token(document.header, "\\output_changes", 0)
+    if i == -1:
+        document.warning("Malformed LyX document! Missing \\output_changes header.")
+        return
+    # Set this to false for old documents (see #2154)
+    document.header.insert(i, "\\postpone_fragile_content false")
+
+
+def revert_postpone_fragile(document):
+    " Remove \\postpone_fragile_content buffer param "
+
+    i = find_token(document.header, "\\postpone_fragile_content", 0)
+    if i == -1:
+        document.warning("Malformed LyX document! Missing \\postpone_fragile_content.")
+        return
+
+    del document.header[i]
+
+def revert_colrow_tracking(document):
+    " Remove change tag from tabular columns/rows "
+    i = 0
+    while True:
+        i = find_token(document.body, "\\begin_inset Tabular", i+1)
+        if i == -1:
+            return
+        j = find_end_of_inset(document.body, i+1)
+        if j == -1:
+            document.warning("Malformed LyX document: Could not find end of tabular.")
+            continue
+        for k in range(i, j):
+            m = re.search('^<column.*change="([^"]+)".*>$', document.body[k])
+            if m:
+                document.body[k] = document.body[k].replace(' change="' + m.group(1) + '"', '')
+            m = re.search('^<row.*change="([^"]+)".*>$', document.body[k])
+            if m:
+                document.body[k] = document.body[k].replace(' change="' + m.group(1) + '"', '')
+
 ##
 # Conversion hub
 #
@@ -3649,7 +3667,7 @@ convert = [
            [549, []],
            [550, [convert_fontenc]],
            [551, []],
-           [552, [convert_aaencoding]],
+           [552, []],
            [553, []],
            [554, []],
            [555, []],
@@ -3672,7 +3690,7 @@ convert = [
            [572, [convert_notoFonts]],  # Added options thin, light, extralight for Noto
            [573, [convert_inputencoding_namechange]],
            [574, [convert_ruby_module, convert_utf8_japanese]],
-           [575, [convert_lineno]],
+           [575, [convert_lineno, convert_aaencoding]],
            [576, []],
            [577, [convert_linggloss]],
            [578, []],
@@ -3686,10 +3704,16 @@ convert = [
            [586, []],
            [587, [convert_pagesizenames]],
            [588, []],
-           [589, [convert_totalheight]]
+           [589, [convert_totalheight]],
+           [590, [convert_changebars]],
+           [591, [convert_postpone_fragile]],
+           [592, []]
           ]
 
-revert =  [[588, [revert_totalheight]],
+revert =  [[591, [revert_colrow_tracking]],
+           [590, [revert_postpone_fragile]],
+           [589, [revert_changebars]],
+           [588, [revert_totalheight]],
            [587, [revert_memoir_endnotes,revert_enotez,revert_theendnotes]],
            [586, [revert_pagesizenames]],
            [585, [revert_dupqualicites]],
@@ -3703,7 +3727,7 @@ revert =  [[588, [revert_totalheight]],
            [577, [revert_drs]],
            [576, [revert_linggloss, revert_subexarg]],
            [575, [revert_new_languages]],
-           [574, [revert_lineno]],
+           [574, [revert_lineno, revert_aaencoding]],
            [573, [revert_ruby_module, revert_utf8_japanese]],
            [572, [revert_inputencoding_namechange]],
            [571, [revert_notoFonts]],
@@ -3726,7 +3750,7 @@ revert =  [[588, [revert_totalheight]],
            [554, [revert_vcolumns]],
            [553, [revert_stretchcolumn]],
            [552, [revert_tuftecite]],
-           [551, [revert_floatpclass, revert_floatalignment, revert_aaencoding]],
+           [551, [revert_floatpclass, revert_floatalignment]],
            [550, [revert_nospellcheck]],
            [549, [revert_fontenc]],
            [548, []],# dummy format change