X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=lib%2Flyx2lyx%2Flyx_2_2.py;h=04c32ce7aa6d6d2b813445b5b5640a4de0c0e53c;hb=fd1ee3b424786db6428bd9e39cad9a79071f9482;hp=d30f782cb10e287dc3c4636de83871def93e1543;hpb=acf3e3a13995836fb56b4d6e91c14265bf8ab6c5;p=lyx.git diff --git a/lib/lyx2lyx/lyx_2_2.py b/lib/lyx2lyx/lyx_2_2.py index d30f782cb1..04c32ce7aa 100644 --- a/lib/lyx2lyx/lyx_2_2.py +++ b/lib/lyx2lyx/lyx_2_2.py @@ -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]],