X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=lib%2Flyx2lyx%2Flyx_2_1.py;h=b507151cb56eddc00bc01e9a157a8a0d5c2a2fc0;hb=f57346dd6eafab49384c869b50284ce2acfb0c6e;hp=bc4d23ba2820f528c52d3f55022472a4eab8c33f;hpb=df6589a97e1dd6647b98cecd8ee071031563fe85;p=lyx.git diff --git a/lib/lyx2lyx/lyx_2_1.py b/lib/lyx2lyx/lyx_2_1.py index bc4d23ba28..b507151cb5 100644 --- a/lib/lyx2lyx/lyx_2_1.py +++ b/lib/lyx2lyx/lyx_2_1.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- # This file is part of lyx2lyx -# -*- coding: utf-8 -*- # Copyright (C) 2011 The LyX team # # This program is free software; you can redistribute it and/or @@ -17,7 +16,7 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -""" Convert files to the file format generated by lyx 2.1""" +""" Convert files to the file format generated by LyX 2.1""" import re, string import unicodedata @@ -28,7 +27,7 @@ import sys, os from parser_tools import count_pars_in_inset, del_token, find_token, find_token_exact, \ find_token_backwards, find_end_of, find_end_of_inset, find_end_of_layout, \ find_end_of_sequence, find_re, get_option_value, get_containing_layout, \ - get_value, get_quoted_value, set_option_value + get_containing_inset, get_value, get_quoted_value, set_option_value #from parser_tools import find_token, find_end_of, find_tokens, \ #find_end_of_inset, find_end_of_layout, \ @@ -53,6 +52,219 @@ from lyx2lyx_tools import add_to_preamble, put_cmd_in_ert, get_ert #return True +def revert_Argument_to_TeX_brace(document, line, endline, n, nmax, environment, opt): + ''' + Reverts an InsetArgument to TeX-code + usage: + revert_Argument_to_TeX_brace(document, LineOfBegin, LineOfEnd, StartArgument, EndArgument, isEnvironment, isOpt) + LineOfBegin is the line of the \\begin_layout or \\begin_inset statement + LineOfEnd is the line of the \end_layout or \end_inset statement, if "0" is given, the end of the file is used instead + StartArgument is the number of the first argument that needs to be converted + EndArgument is the number of the last argument that needs to be converted or the last defined one + isEnvironment must be true, if the layout is for a LaTeX environment + isOpt must be true, if the argument is an optional one + ''' + lineArg = 0 + wasOpt = False + while lineArg != -1 and n < nmax + 1: + lineArg = find_token(document.body, "\\begin_inset Argument " + str(n), line) + if lineArg > endline and endline != 0: + return wasOpt + if lineArg != -1: + beginPlain = find_token(document.body, "\\begin_layout Plain Layout", lineArg) + # we have to assure that no other inset is in the Argument + beginInset = find_token(document.body, "\\begin_inset", beginPlain) + endInset = find_token(document.body, "\\end_inset", beginPlain) + k = beginPlain + 1 + l = k + while beginInset < endInset and beginInset != -1: + beginInset = find_token(document.body, "\\begin_inset", k) + endInset = find_token(document.body, "\\end_inset", l) + k = beginInset + 1 + l = endInset + 1 + if environment == False: + if opt == False: + document.body[endInset - 2 : endInset + 1] = put_cmd_in_ert("}{") + del(document.body[lineArg : beginPlain + 1]) + wasOpt = False + else: + document.body[endInset - 2 : endInset + 1] = put_cmd_in_ert("]") + document.body[lineArg : beginPlain + 1] = put_cmd_in_ert("[") + wasOpt = True + else: + document.body[endInset - 2 : endInset + 1] = put_cmd_in_ert("}") + document.body[lineArg : beginPlain + 1] = put_cmd_in_ert("{") + wasOpt = False + n += 1 + return wasOpt + + +def convert_TeX_brace_to_Argument(document, line, n, nmax, inset, environment, opt): + ''' + Converts TeX code for mandatory arguments to an InsetArgument + The conversion of TeX code for optional arguments must be done with another routine + !!! Be careful if the braces are different in your case as expected here: + - "}{" separates mandatory arguments of commands + - "}" + "{" separates mandatory arguments of commands + - "}" + " " + "{" separates mandatory arguments of commands + - { and } surround a mandatory argument of an environment + usage: + convert_TeX_brace_to_Argument(document, LineOfBeginLayout/Inset, StartArgument, EndArgument, isInset, isEnvironment, isOpt) + LineOfBeginLayout/Inset is the line of the \\begin_layout or \\begin_inset statement + StartArgument is the number of the first ERT that needs to be converted + EndArgument is the number of the last ERT that needs to be converted + isInset must be true, if braces inside an InsetLayout needs to be converted + isEnvironment must be true, if the layout is for a LaTeX environment + isOpt must be true, if the argument is an optional one + + Todo: this routine can currently handle only one mandatory argument of environments + ''' + + end_layout = find_end_of_layout(document.body, line) + lineERT = line + endn = line + loop = 1 + while n < nmax + 1: + lineERT = find_token(document.body, "\\begin_inset ERT", lineERT, end_layout) + if lineERT == -1: + break + if environment == False: + end_ERT = find_end_of_inset(document.body, lineERT) + if end_ERT == -1: + document.warning("Can't find end of ERT!!") + break + # Note that this only checks for ][ or }{ at the beginning of a line + if opt: + bracePair = find_token(document.body, "][", lineERT, end_ERT) + else: + bracePair = find_token(document.body, "}{", lineERT, end_ERT) + if bracePair != -1: + end = find_token(document.body, "\\end_inset", bracePair) + document.body[lineERT : end_ERT + 1] = ["\\end_layout", "", "\\end_inset"] + if loop == 1: + # in the case that n > 1 we have optional arguments before + # therefore detect them if any + if n > 1: + # first check if there is an argument + lineArg = find_token(document.body, "\\begin_inset Argument", line) + if lineArg < lineERT and lineArg != -1: + # we have an argument, so now search backwards for its end + # we must now assure that we don't find other insets like e.g. a newline + endInsetArg = lineERT + endLayoutArg = endInsetArg + while endInsetArg != endLayoutArg + 2 and endInsetArg != -1: + endInsetArg = endInsetArg - 1 + endLayoutArg = endInsetArg + endInsetArg = find_token_backwards(document.body, "\\end_inset", endInsetArg) + endLayoutArg = find_token_backwards(document.body, "\\end_layout", endLayoutArg) + line = endInsetArg + 1 + if inset == False: + document.body[line + 1 : line + 1] = ["\\begin_inset Argument " + str(n), "status open", "", "\\begin_layout Plain Layout"] + else: + document.body[line + 4 : line + 4] = ["\\begin_inset Argument " + str(n), "status open", "", "\\begin_layout Plain Layout"] + else: # if loop != 1 + document.body[endn : endn] = ["\\begin_inset Argument " + str(n), "status open", "", "\\begin_layout Plain Layout"] + n += 1 + endn = end + loop += 1 + else: + # no brace pair found + # now check the case that we have "}" + "{" in two ERTs + if opt: + endBrace = find_token(document.body, "]", lineERT, end_layout) + else: + endBrace = find_token(document.body, "}", lineERT, end_layout) + if endBrace == lineERT + 5: + if opt: + beginBrace = find_token(document.body, "[", endBrace, end_layout) + else: + beginBrace = find_token(document.body, "{", endBrace, end_layout) + # assure that the ERTs are consecutive (11 or 12 depending if there is a space between the ERTs or not) + if beginBrance != -1 and (beginBrace == endBrace + 11 or beginBrace == endBrace + 12): + end = find_token(document.body, "\\end_inset", beginBrace) + document.body[lineERT : end + 1] = ["\\end_layout", "", "\\end_inset"] + if loop == 1: + # in the case that n > 1 we have optional arguments before + # therefore detect them if any + if n > 1: + # first check if there is an argument + lineArg = find_token(document.body, "\\begin_inset Argument", line) + if lineArg < lineERT and lineArg != -1: + # we have an argument, so now search backwards for its end + # we must now assure that we don't find other insets like e.g. a newline + endInsetArg = lineERT + endLayoutArg = endInsetArg + while endInsetArg != endLayoutArg + 2 and endInsetArg != -1: + endInsetArg = endInsetArg - 1 + endLayoutArg = endInsetArg + endInsetArg = find_token_backwards(document.body, "\\end_inset", endInsetArg) + endLayoutArg = find_token_backwards(document.body, "\\end_layout", endLayoutArg) + line = endInsetArg + 1 + if inset == False: + document.body[line + 1 : line + 1] = ["\\begin_inset Argument " + str(n), "status open", "", "\\begin_layout Plain Layout"] + else: + document.body[line + 4 : line + 4] = ["\\begin_inset Argument " + str(n), "status open", "", "\\begin_layout Plain Layout"] + else: + document.body[endn : endn] = ["\\begin_inset Argument " + str(n), "status open", "", "\\begin_layout Plain Layout"] + n += 1 + loop += 1 + # set the line where the next argument will be inserted + if beginBrace == endBrace + 11: + endn = end - 11 + else: + endn = end - 12 + else: + lineERT += 1 + else: + lineERT += 1 + if environment == True: + # FIXME This version of the routine does not check for and pass over + # arguments before n. So it attempts to process the argument in the + # document, no matter what has been specified. + # + # The other branch does do that, but probably that code would be better + # in a single location: Skip all those arguments, then process the ones + # we want. + end_ERT = find_end_of_inset(document.body, lineERT) + if end_ERT == -1: + document.warning("Can't find end of ERT!!") + break + # Note that this only checks for [ or { at the beginning of a line + if opt: + opening = find_token(document.body, "[", lineERT, end_ERT) + else: + opening = find_token(document.body, "{", lineERT, end_ERT) + if opening != -1: + lineERT2 = find_token(document.body, "\\begin_inset ERT", end_ERT, end_layout) + if lineERT2 == -1: + # argument in a single ERT + # strip off the opening bracket + document.body[opening] = document.body[opening][1:] + ertcontlastline = end_ERT - 3 + if (opt and document.body[ertcontlastline].endswith("]")) or document.body[ertcontlastline].endswith("}"): + # strip off the closing bracket + document.body[ertcontlastline] = document.body[ertcontlastline][:-1] + end2 = find_token(document.body, "\\end_inset", ertcontlastline) + document.body[lineERT : lineERT + 1] = ["\\begin_inset Argument " + str(n)] + else: + end_ERT2 = find_end_of_inset(document.body, lineERT2) + if end_ERT2 == -1: + document.warning("Can't find end of second ERT!!") + break + if opt: + closing = find_token(document.body, "]", lineERT2, end_ERT2) + else: + closing = find_token(document.body, "}", lineERT2, end_ERT2) + if closing != -1: # assure that the "}" is in this ERT + end2 = find_token(document.body, "\\end_inset", closing) + document.body[lineERT2 : end2 + 1] = ["\\end_layout", "", "\\end_inset"] + document.body[lineERT : end_ERT + 1] = ["\\begin_inset Argument " + str(n), "status open", "", "\\begin_layout Plain Layout"] + n += 1 + else: + document.warning("Unable to process argument!") + n += 1 + + ############################################################################### ### ### Conversion and reversion routines @@ -71,6 +283,7 @@ def revert_visible_space(document): document.body[i:end + 1] = subst +undertilde_commands = ["utilde"] def convert_undertilde(document): " Load undertilde automatically " i = find_token(document.header, "\\use_mathdots" , 0) @@ -82,52 +295,60 @@ def convert_undertilde(document): document.warning("Malformed LyX document: Can't find \\use_mathdots.") return; j = find_token(document.preamble, "\\usepackage{undertilde}", 0) - if j == -1: - document.header.insert(i + 1, "\\use_undertilde 0") - else: - document.header.insert(i + 1, "\\use_undertilde 2") + if j != -1: + # package was loaded in the preamble, convert this to header setting for round trip + document.header.insert(i + 1, "\\use_undertilde 2") # on del document.preamble[j] + else: + j = 0 + while True: + j = find_token(document.body, '\\begin_inset Formula', j) + if j == -1: + break + k = find_end_of_inset(document.body, j) + if k == -1: + document.warning("Malformed LyX document: Can't find end of Formula inset at line " + str(j)) + j += 1 + continue + code = "\n".join(document.body[j:k]) + for c in undertilde_commands: + if code.find("\\%s" % c) != -1: + # at least one of the commands was found - need to switch package off + document.header.insert(i + 1, "\\use_undertilde 0") # off + return + j = k + # no command was found - set to auto (bug 9069) + document.header.insert(i + 1, "\\use_undertilde 1") # auto + def revert_undertilde(document): " Load undertilde if used in the document " - undertilde = find_token(document.header, "\\use_undertilde" , 0) - if undertilde == -1: - document.warning("No \\use_undertilde line. Assuming auto.") - else: - val = get_value(document.header, "\\use_undertilde", undertilde) - del document.header[undertilde] - try: - usetilde = int(val) - except: - document.warning("Invalid \\use_undertilde value: " + val + ". Assuming auto.") - # probably usedots has not been changed, but be safe. - usetilde = 1 - - if usetilde == 0: - # do not load case - return - if usetilde == 2: - # force load case + regexp = re.compile(r'(\\use_undertilde)') + i = find_re(document.header, regexp, 0) + value = "1" # default is auto + if i != -1: + value = get_value(document.header, "\\use_undertilde" , i).split()[0] + del document.header[i] + if value == "2": # on add_to_preamble(document, ["\\usepackage{undertilde}"]) - return - - # so we are in the auto case. we want to load undertilde if \utilde is used. - i = 0 - while True: - i = find_token(document.body, '\\begin_inset Formula', i) - if i == -1: - return - j = find_end_of_inset(document.body, i) - if j == -1: - document.warning("Malformed LyX document: Can't find end of Formula inset at line " + str(i)) - i += 1 - continue - code = "\n".join(document.body[i:j]) - if code.find("\\utilde") != -1: - add_to_preamble(document, ["\\@ifundefined{utilde}{\\usepackage{undertilde}}"]) - return - i = j + elif value == "1": # auto + i = 0 + while True: + i = find_token(document.body, '\\begin_inset Formula', i) + if i == -1: + return + j = find_end_of_inset(document.body, i) + if j == -1: + document.warning("Malformed LyX document: Can't find end of Formula inset at line " + str(i)) + i += 1 + continue + code = "\n".join(document.body[i:j]) + for c in undertilde_commands: + if code.find("\\%s" % c) != -1: + add_to_preamble(document, ["\\usepackage{undertilde}"]) + return + i = j def revert_negative_space(document): @@ -172,7 +393,7 @@ def revert_math_spaces(document): end = find_end_of_inset(document.body, i) subst = put_cmd_in_ert(document.body[i][21:]) document.body[i:end + 1] = subst - i = i + 1 + i += 1 def convert_japanese_encodings(document): @@ -186,7 +407,7 @@ def convert_japanese_encodings(document): if i == -1: return val = get_value(document.header, "\\inputencoding", i) - if val in jap_enc_dict.keys(): + if val in list(jap_enc_dict.keys()): document.header[i] = "\\inputencoding %s" % jap_enc_dict[val] @@ -201,10 +422,25 @@ def revert_japanese_encodings(document): if i == -1: return val = get_value(document.header, "\\inputencoding", i) - if val in jap_enc_dict.keys(): + if val in list(jap_enc_dict.keys()): document.header[i] = "\\inputencoding %s" % jap_enc_dict[val] +def convert_justification(document): + " Add the \\justification buffer param" + i = find_token(document.header, "\\suppress_date" , 0) + if i == -1: + i = find_token(document.header, "\\paperorientation" , 0) + if i == -1: + i = find_token(document.header, "\\use_indices" , 0) + if i == -1: + i = find_token(document.header, "\\use_bibtopic" , 0) + if i == -1: + document.warning("Malformed LyX document: Missing \\suppress_date.") + return + document.header.insert(i + 1, "\\justification true") + + def revert_justification(document): " Revert the \\justification buffer param" if not del_token(document.header, '\\justification', 0): @@ -212,16 +448,16 @@ def revert_justification(document): def revert_australian(document): - "Set English language variants Australian and Newzealand to English" + "Set English language variants Australian and Newzealand to English" - if document.language == "australian" or document.language == "newzealand": + if document.language == "australian" or document.language == "newzealand": document.language = "english" - i = find_token(document.header, "\\language", 0) - if i != -1: - document.header[i] = "\\language english" - j = 0 - while True: - j = find_token(document.body, "\\lang australian", j) + i = find_token(document.header, "\\language", 0) + if i != -1: + document.header[i] = "\\language english" + j = 0 + while True: + j = find_token(document.body, "\\lang australian", j) if j == -1: j = find_token(document.body, "\\lang newzealand", 0) if j == -1: @@ -229,7 +465,7 @@ def revert_australian(document): else: document.body[j] = document.body[j].replace("\\lang newzealand", "\\lang english") else: - document.body[j] = document.body[j].replace("\\lang australian", "\\lang english") + document.body[j] = document.body[j].replace("\\lang australian", "\\lang english") j += 1 @@ -328,7 +564,7 @@ def handle_longtable_captions(document, forward): if get_option_value(document.body[begin_row], 'endlastfoot') == 'true': document.body[begin_row] = set_option_value(document.body[begin_row], 'endlastfoot', 'false') begin_row = end_row - # since there could be a tabular inside this one, we + # since there could be a tabular inside this one, we # cannot jump to end. begin_table += 1 @@ -355,51 +591,88 @@ def convert_use_packages(document): def revert_use_packages(document): "use_package xxx yyy => use_xxx yyy" - packages = ["amsmath", "esint", "mathdots", "mhchem", "undertilde"] + packages = ["amsmath", "esint", "mhchem", "mathdots", "undertilde"] # the order is arbitrary for the use_package version, and not all packages need to be given. # Ensure a complete list and correct order (important for older LyX versions and especially lyx2lyx) - j = 0 + # first loop: find line with first package + j = -1 + for p in packages: + regexp = re.compile(r'(\\use_package\s+%s)' % p) + i = find_re(document.header, regexp, 0) + if i != -1 and (j < 0 or i < j): + j = i + # second loop: replace or insert packages in front of all existing ones for p in packages: regexp = re.compile(r'(\\use_package\s+%s)' % p) - i = find_re(document.header, regexp, j) + i = find_re(document.header, regexp, 0) if i != -1: value = get_value(document.header, "\\use_package %s" % p, i).split()[1] del document.header[i] - j = i - document.header.insert(j, "\\use_%s %s" % (p, value)) - j = j + 1 + document.header.insert(j, "\\use_%s %s" % (p, value)) + else: + document.header.insert(j, "\\use_%s 1" % p) + j += 1 -def convert_use_mathtools(document): - "insert use_package mathtools" +def convert_use_package(document, pkg, commands, oldauto): + # oldauto defines how the version we are converting from behaves: + # if it is true, the old version uses the package automatically. + # if it is false, the old version never uses the package. i = find_token(document.header, "\\use_package", 0) if i == -1: document.warning("Malformed LyX document: Can't find \\use_package.") return; - j = find_token(document.preamble, "\\usepackage{mathtools}", 0) - if j == -1: - document.header.insert(i + 1, "\\use_package mathtools 0") - else: - document.header.insert(i + 1, "\\use_package mathtools 2") + j = find_token(document.preamble, "\\usepackage{" + pkg + "}", 0) + if j != -1: + # package was loaded in the preamble, convert this to header setting for round trip + document.header.insert(i + 1, "\\use_package " + pkg + " 2") # on del document.preamble[j] + # If oldauto is true we have two options: + # We can either set the package to auto - this is correct for files in + # format 425 to 463, and may create a conflict for older files which use + # any command in commands with a different definition. + # Or we can look whether any command in commands is used, and set it to + # auto if not and to off if yes. This will not create a conflict, but will + # create uncompilable documents for files in format 425 to 463, which use + # any command in commands. + # We choose the first option since its error is less likely. + elif oldauto: + document.header.insert(i + 1, "\\use_package " + pkg + " 1") # auto + else: + j = 0 + while True: + j = find_token(document.body, '\\begin_inset Formula', j) + if j == -1: + break + k = find_end_of_inset(document.body, j) + if k == -1: + document.warning("Malformed LyX document: Can't find end of Formula inset at line " + str(j)) + j += 1 + continue + code = "\n".join(document.body[j:k]) + for c in commands: + if code.find("\\%s" % c) != -1: + # at least one of the commands was found - need to switch package off + document.header.insert(i + 1, "\\use_package " + pkg + " 0") # off + return + j = k + # no command was found - set to auto (bug 9069) + document.header.insert(i + 1, "\\use_package " + pkg + " 1") # auto -def revert_use_mathtools(document): - "remove use_package mathtools" - regexp = re.compile(r'(\\use_package\s+mathtools)') +def revert_use_package(document, pkg, commands, oldauto): + # oldauto defines how the version we are reverting to behaves: + # if it is true, the old version uses the package automatically. + # if it is false, the old version never uses the package. + regexp = re.compile(r'(\\use_package\s+%s)' % pkg) i = find_re(document.header, regexp, 0) value = "1" # default is auto if i != -1: value = get_value(document.header, "\\use_package" , i).split()[1] del document.header[i] if value == "2": # on - add_to_preamble(document, ["\\usepackage{mathtools}"]) - elif value == "1": # auto - commands = ["mathclap", "mathllap", "mathrlap", \ - "lgathered", "rgathered", "vcentcolon", "dblcolon", \ - "coloneqq", "Coloneqq", "coloneq", "Coloneq", "eqqcolon", \ - "Eqqcolon", "eqcolon", "Eqcolon", "colonapprox", \ - "Colonapprox", "colonsim", "Colonsim"] + add_to_preamble(document, ["\\usepackage{" + pkg + "}"]) + elif value == "1" and not oldauto: # auto i = 0 while True: i = find_token(document.body, '\\begin_inset Formula', i) @@ -413,37 +686,29 @@ def revert_use_mathtools(document): code = "\n".join(document.body[i:j]) for c in commands: if code.find("\\%s" % c) != -1: - add_to_preamble(document, ["\\usepackage{mathtools}"]) + add_to_preamble(document, ["\\usepackage{" + pkg + "}"]) return i = j -def convert_use_stmaryrd(document): - "insert use_package stmaryrd" - i = find_token(document.header, "\\use_package", 0) - if i == -1: - document.warning("Malformed LyX document: Can't find \\use_package.") - return; - j = find_token(document.preamble, "\\usepackage{stmaryrd}", 0) - if j == -1: - document.header.insert(i + 1, "\\use_package stmaryrd 0") - else: - document.header.insert(i + 1, "\\use_package stmaryrd 2") - del document.preamble[j] +mathtools_commands = ["mathclap", "mathllap", "mathrlap", \ + "lgathered", "rgathered", "vcentcolon", "dblcolon", \ + "coloneqq", "Coloneqq", "coloneq", "Coloneq", "eqqcolon", \ + "Eqqcolon", "eqcolon", "Eqcolon", "colonapprox", \ + "Colonapprox", "colonsim", "Colonsim"] +def convert_use_mathtools(document): + "insert use_package mathtools" + convert_use_package(document, "mathtools", mathtools_commands, False) -def revert_use_stmaryrd(document): - "remove use_package stmaryrd" - regexp = re.compile(r'(\\use_package\s+stmaryrd)') - i = find_re(document.header, regexp, 0) - value = "1" # default is auto - if i != -1: - value = get_value(document.header, "\\use_package" , i).split()[1] - del document.header[i] - if value == "2": # on - add_to_preamble(document, ["\\usepackage{stmaryrd}"]) - elif value == "1": # auto - commands = ["shortleftarrow", "shortrightarrow", "shortuparrow", \ +def revert_use_mathtools(document): + "remove use_package mathtools" + revert_use_package(document, "mathtools", mathtools_commands, False) + + +# commands provided by stmaryrd.sty but LyX uses other packages: +# boxdot lightning, bigtriangledown, bigtriangleup +stmaryrd_commands = ["shortleftarrow", "shortrightarrow", "shortuparrow", \ "shortdownarrow", "Yup", "Ydown", "Yleft", "Yright", \ "varcurlyvee", "varcurlywedge", "minuso", "baro", \ "sslash", "bbslash", "moo", "varotimes", "varoast", \ @@ -474,68 +739,25 @@ def revert_use_stmaryrd(document): "varcopyright", "longarrownot", "Longarrownot", \ "Mapsto", "mapsfrom", "Mapsfrom" "Longmapsto", \ "longmapsfrom", "Longmapsfrom"] - # commands provided by stmaryrd.sty but LyX uses other packages: - # boxdot lightning, bigtriangledown, bigtriangleup +def convert_use_stmaryrd(document): + "insert use_package stmaryrd" + convert_use_package(document, "stmaryrd", stmaryrd_commands, False) - i = 0 - while True: - i = find_token(document.body, '\\begin_inset Formula', i) - if i == -1: - return - j = find_end_of_inset(document.body, i) - if j == -1: - document.warning("Malformed LyX document: Can't find end of Formula inset at line " + str(i)) - i += 1 - continue - code = "\n".join(document.body[i:j]) - for c in commands: - if code.find("\\%s" % c) != -1: - add_to_preamble(document, ["\\usepackage{stmaryrd}"]) - return - i = j + +def revert_use_stmaryrd(document): + "remove use_package stmaryrd" + revert_use_package(document, "stmaryrd", stmaryrd_commands, False) +stackrel_commands = ["stackrel"] def convert_use_stackrel(document): "insert use_package stackrel" - i = find_token(document.header, "\\use_package", 0) - if i == -1: - document.warning("Malformed LyX document: Can't find \\use_package.") - return; - j = find_token(document.preamble, "\\usepackage{stackrel}", 0) - if j == -1: - document.header.insert(i + 1, "\\use_package stackrel 0") - else: - document.header.insert(i + 1, "\\use_package stackrel 2") - del document.preamble[j] + convert_use_package(document, "stackrel", stackrel_commands, False) def revert_use_stackrel(document): "remove use_package stackrel" - regexp = re.compile(r'(\\use_package\s+stackrel)') - i = find_re(document.header, regexp, 0) - value = "1" # default is auto - if i != -1: - value = get_value(document.header, "\\use_package" , i).split()[1] - del document.header[i] - if value == "2": # on - add_to_preamble(document, ["\\usepackage{stackrel}"]) - elif value == "1": # auto - regcmd = re.compile(r'.*\\stackrel\s*\[') - i = 0 - while True: - i = find_token(document.body, '\\begin_inset Formula', i) - if i == -1: - return - j = find_end_of_inset(document.body, i) - if j == -1: - document.warning("Malformed LyX document: Can't find end of Formula inset at line " + str(i)) - i += 1 - continue - code = "\n".join(document.body[i:j]) - if regcmd.match(code): - add_to_preamble(document, ["\\usepackage{stackrel}"]) - return - i = j + revert_use_package(document, "stackrel", stackrel_commands, False) def convert_cite_engine_type(document): @@ -569,79 +791,105 @@ def revert_cite_engine_type(document): document.header[i] = "\\cite_engine natbib_" + engine_type +def convert_cite_engine_type_default(document): + "Convert \\cite_engine_type to default for the basic citation engine." + i = find_token(document.header, "\\cite_engine basic", 0) + if i == -1: + return + i = find_token(document.header, "\\cite_engine_type" , 0) + if i == -1: + return + document.header[i] = "\\cite_engine_type default" + + +def revert_cite_engine_type_default(document): + """Revert \\cite_engine_type default. + + Revert to numerical for the basic cite engine, otherwise to authoryear.""" + engine_type = "authoryear" + i = find_token(document.header, "\\cite_engine_type default" , 0) + if i == -1: + return + j = find_token(document.header, "\\cite_engine basic", 0) + if j != -1: + engine_type = "numerical" + document.header[i] = "\\cite_engine_type " + engine_type + + +cancel_commands = ["cancel", "bcancel", "xcancel", "cancelto"] +# this is the same, as revert_use_cancel() except for the default def revert_cancel(document): "add cancel to the preamble if necessary" - commands = ["cancelto", "cancel", "bcancel", "xcancel"] - i = 0 - while True: - i = find_token(document.body, '\\begin_inset Formula', i) - if i == -1: - return - j = find_end_of_inset(document.body, i) - if j == -1: - document.warning("Malformed LyX document: Can't find end of Formula inset at line " + str(i)) - i += 1 - continue - code = "\n".join(document.body[i:j]) - for c in commands: - if code.find("\\%s" % c) != -1: - add_to_preamble(document, ["\\usepackage{cancel}"]) - return - i = j + revert_use_package(document, "cancel", cancel_commands, False) -def revert_verbatim(document): - " Revert verbatim einvironments completely to TeX-code. " +def revert_verbatim(document, starred = False): + " Revert verbatim environments completely to TeX-code. " i = 0 consecutive = False - subst_end = ['\end_layout', '', '\\begin_layout Plain Layout', - '\end_layout', '', + + layout_name = "Verbatim" + latex_name = "verbatim" + if starred: + layout_name = "Verbatim*" + latex_name = "verbatim*" + + subst_end = ['\\end_layout', '', '\\begin_layout Plain Layout', + '\\end_layout', '', '\\begin_layout Plain Layout', '', '', '\\backslash', '', - 'end{verbatim}', + 'end{%s}' % (latex_name), '\\end_layout', '', '\\end_inset', '', '', '\\end_layout'] subst_begin = ['\\begin_layout Standard', '\\noindent', - '\\begin_inset ERT', 'status collapsed', '', + '\\begin_inset ERT', 'status open', '', '\\begin_layout Plain Layout', '', '', '\\backslash', - 'begin{verbatim}', + 'begin{%s}' % (latex_name), '\\end_layout', '', '\\begin_layout Plain Layout', ''] - while 1: - i = find_token(document.body, "\\begin_layout Verbatim", i) + + while True: + i = find_token(document.body, "\\begin_layout %s" % (layout_name), 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 Verbatim layout") + document.warning("Malformed LyX document: Can't find end of %s layout" \ + % (layout_name)) i += 1 continue # delete all line breaks insets (there are no other insets) l = i - while 1: - n = find_token(document.body, "\\begin_inset Newline newline", l) + while True: + n = find_token(document.body, "\\begin_inset Newline newline", l, j) if n == -1: - n = find_token(document.body, "\\begin_inset Newline linebreak", l) + n = find_token(document.body, "\\begin_inset Newline linebreak", l, j) if n == -1: break m = find_end_of_inset(document.body, n) del(document.body[m:m+1]) - document.body[n:n+1] = ['\end_layout', '', '\\begin_layout Plain Layout'] + document.body[n:n+1] = ['\\end_layout', '', '\\begin_layout Plain Layout'] l += 1 - j += 1 + # we deleted a line, so the end of the inset moved forward. + # FIXME But we also added some lines, didn't we? I think this + # should be j += 1. + j -= 1 # consecutive verbatim environments need to be connected - k = find_token(document.body, "\\begin_layout Verbatim", j) + k = find_token(document.body, "\\begin_layout %s" % (layout_name), j) if k == j + 2 and consecutive == False: consecutive = True - document.body[j:j+1] = ['\end_layout', '', '\\begin_layout Plain Layout'] + document.body[j:j+1] = ['\\end_layout', '', '\\begin_layout Plain Layout'] document.body[i:i+1] = subst_begin continue if k == j + 2 and consecutive == True: - document.body[j:j+1] = ['\end_layout', '', '\\begin_layout Plain Layout'] + document.body[j:j+1] = ['\\end_layout', '', '\\begin_layout Plain Layout'] del(document.body[i:i+1]) continue if k != j + 2 and consecutive == True: document.body[j:j+1] = subst_end # the next paragraph must not be indented + # FIXME This seems to be causing problems, because of the + # hardcoded use of 19. We should figure out exactly where + # this needs to go by searching for the right tag. document.body[j+19:j+19] = ['\\noindent'] del(document.body[i:i+1]) consecutive = False @@ -649,6 +897,9 @@ def revert_verbatim(document): else: document.body[j:j+1] = subst_end # the next paragraph must not be indented + # FIXME This seems to be causing problems, because of the + # hardcoded use of 19. We should figure out exactly where + # this needs to go by searching for the right tag. document.body[j+19:j+19] = ['\\noindent'] document.body[i:i+1] = subst_begin @@ -656,24 +907,24 @@ def revert_verbatim(document): def revert_tipa(document): " Revert native TIPA insets to mathed or ERT. " i = 0 - while 1: + while True: i = find_token(document.body, "\\begin_inset IPA", i) if i == -1: return j = find_end_of_inset(document.body, i) if j == -1: - document.warning("Malformed lyx document: Can't find end of IPA inset") + document.warning("Malformed LyX document: Can't find end of IPA inset") i += 1 continue Multipar = False n = find_token(document.body, "\\begin_layout", i, j) if n == -1: - document.warning("Malformed lyx document: IPA inset has no embedded layout") + document.warning("Malformed LyX document: IPA inset has no embedded layout") i += 1 continue m = find_end_of_layout(document.body, n) if m == -1: - document.warning("Malformed lyx document: Can't find end of embedded layout") + document.warning("Malformed LyX document: Can't find end of embedded layout") i += 1 continue content = document.body[n+1:m] @@ -712,7 +963,7 @@ def revert_cell_rotation(document): document.body[i] = rgx.sub('', document.body[i]) elif value == "90": rgx = re.compile(r' rotate="[^"]+?"') - document.body[i] = rgx.sub('rotate="true"', document.body[i]) + document.body[i] = rgx.sub(' rotate="true"', document.body[i]) else: rgx = re.compile(r' rotate="[^"]+?"') load_rotating = True @@ -723,12 +974,12 @@ def revert_cell_rotation(document): put_cmd_in_ert("\\end{turn}") document.body[i + 4 : i + 4] = \ put_cmd_in_ert("\\begin{turn}{" + value + "}") - + i += 1 - + finally: if load_rotating: - add_to_preamble(document, ["\\@ifundefined{turnbox}{\usepackage{rotating}}{}"]) + add_to_preamble(document, ["\\@ifundefined{turnbox}{\\usepackage{rotating}}{}"]) def convert_cell_rotation(document): @@ -745,7 +996,7 @@ def convert_cell_rotation(document): rgx = re.compile(r'rotate="[^"]+?"') # convert "true" to "90" document.body[i] = rgx.sub('rotate="90"', document.body[i]) - + i += 1 @@ -782,12 +1033,12 @@ def revert_table_rotation(document): put_cmd_in_ert("\\end{turn}") document.body[i - 2 : i - 2] = \ put_cmd_in_ert("\\begin{turn}{" + value + "}") - + i += 1 - + finally: if load_rotating: - add_to_preamble(document, ["\\@ifundefined{turnbox}{\usepackage{rotating}}{}"]) + add_to_preamble(document, ["\\@ifundefined{turnbox}{\\usepackage{rotating}}{}"]) def convert_table_rotation(document): @@ -804,7 +1055,7 @@ def convert_table_rotation(document): rgx = re.compile(r'rotate="[^"]+?"') # convert "true" to "90" document.body[i] = rgx.sub('rotate="90"', document.body[i]) - + i += 1 @@ -818,7 +1069,7 @@ def convert_listoflistings(document): return j = find_end_of_inset(document.body, i) if j == -1: - document.warning("Malformed lyx document: Can't find end of ERT inset") + document.warning("Malformed LyX document: Can't find end of ERT inset") i += 1 continue ert = get_ert(document.body, i) @@ -839,13 +1090,13 @@ def revert_listoflistings(document): if document.body[i+1] == "LatexCommand lstlistoflistings": j = find_end_of_inset(document.body, i) if j == -1: - document.warning("Malformed lyx document: Can't find end of TOC inset") + document.warning("Malformed LyX document: Can't find end of TOC inset") i += 1 continue subst = put_cmd_in_ert("\\lstlistoflistings{}") document.body[i:j+1] = subst add_to_preamble(document, ["\\usepackage{listings}"]) - i = i + 1 + i += 1 def convert_use_amssymb(document): @@ -887,26 +1138,36 @@ def revert_use_amssymb(document): add_to_preamble(document, ["\\usepackage{amssymb}"]) +def convert_use_cancel(document): + "insert use_package cancel" + convert_use_package(document, "cancel", cancel_commands, True) + + +def revert_use_cancel(document): + "remove use_package cancel" + revert_use_package(document, "cancel", cancel_commands, True) + + def revert_ancientgreek(document): - "Set the document language for ancientgreek to greek" + "Set the document language for ancientgreek to greek" - if document.language == "ancientgreek": + if document.language == "ancientgreek": document.language = "greek" - i = find_token(document.header, "\\language", 0) - if i != -1: - document.header[i] = "\\language greek" - j = 0 - while True: - j = find_token(document.body, "\\lang ancientgreek", j) + i = find_token(document.header, "\\language", 0) + if i != -1: + document.header[i] = "\\language greek" + j = 0 + while True: + j = find_token(document.body, "\\lang ancientgreek", j) if j == -1: return else: - document.body[j] = document.body[j].replace("\\lang ancientgreek", "\\lang greek") + document.body[j] = document.body[j].replace("\\lang ancientgreek", "\\lang greek") j += 1 def revert_languages(document): - "Set the document language for new supported languages to English" + "Set the document language for new supported languages to English" languages = [ "coptic", "divehi", "hindi", "kurmanji", "lao", "marathi", "occitan", "sanskrit", @@ -915,11 +1176,11 @@ def revert_languages(document): for n in range(len(languages)): if document.language == languages[n]: document.language = "english" - i = find_token(document.header, "\\language", 0) - if i != -1: - document.header[i] = "\\language english" + i = find_token(document.header, "\\language", 0) + if i != -1: + document.header[i] = "\\language english" j = 0 - while j < len(document.body): + while j < len(document.body): j = find_token(document.body, "\\lang " + languages[n], j) if j != -1: document.body[j] = document.body[j].replace("\\lang " + languages[n], "\\lang english") @@ -929,27 +1190,27 @@ def revert_languages(document): def convert_armenian(document): - "Use polyglossia and thus non-TeX fonts for Armenian" + "Use polyglossia and thus non-TeX fonts for Armenian" - if document.language == "armenian": - i = find_token(document.header, "\\use_non_tex_fonts", 0) - if i != -1: - document.header[i] = "\\use_non_tex_fonts true" + if document.language == "armenian": + i = find_token(document.header, "\\use_non_tex_fonts", 0) + if i != -1: + document.header[i] = "\\use_non_tex_fonts true" def revert_armenian(document): - "Use ArmTeX and thus TeX fonts for Armenian" + "Use ArmTeX and thus TeX fonts for Armenian" - if document.language == "armenian": - i = find_token(document.header, "\\use_non_tex_fonts", 0) - if i != -1: - document.header[i] = "\\use_non_tex_fonts false" + if document.language == "armenian": + i = find_token(document.header, "\\use_non_tex_fonts", 0) + if i != -1: + document.header[i] = "\\use_non_tex_fonts false" def revert_libertine(document): - " Revert native libertine font definition to LaTeX " + " Revert native libertine font definition to LaTeX " - if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1: + if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1: i = find_token(document.header, "\\font_roman libertine", 0) if i != -1: osf = False @@ -968,9 +1229,9 @@ def revert_libertine(document): def revert_txtt(document): - " Revert native txtt font definition to LaTeX " + " Revert native txtt font definition to LaTeX " - if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1: + if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1: i = find_token(document.header, "\\font_typewriter txtt", 0) if i != -1: preamble = "\\renewcommand{\\ttdefault}{txtt}" @@ -979,9 +1240,9 @@ def revert_txtt(document): def revert_mathdesign(document): - " Revert native mathdesign font definition to LaTeX " + " Revert native mathdesign font definition to LaTeX " - if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1: + if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1: mathdesign_dict = { "mdbch": "charter", "mdput": "utopia", @@ -991,7 +1252,7 @@ def revert_mathdesign(document): if i == -1: return val = get_value(document.header, "\\font_roman", i) - if val in mathdesign_dict.keys(): + if val in list(mathdesign_dict.keys()): preamble = "\\usepackage[%s" % mathdesign_dict[val] expert = False j = find_token(document.header, "\\font_osf true", 0) @@ -1010,9 +1271,9 @@ def revert_mathdesign(document): def revert_texgyre(document): - " Revert native TeXGyre font definition to LaTeX " + " Revert native TeXGyre font definition to LaTeX " - if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1: + if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1: texgyre_fonts = ["tgadventor", "tgbonum", "tgchorus", "tgcursor", \ "tgheros", "tgpagella", "tgschola", "tgtermes"] i = find_token(document.header, "\\font_roman", 0) @@ -1069,7 +1330,7 @@ def revert_ipadeco(document): i = end continue substi = ["\\begin_inset ERT", "status collapsed", "", - "\\begin_layout Plain Layout", "", "", "\\backslash", + "\\begin_layout Plain Layout", "", "", "\\backslash", decotype + "{", "\\end_layout", "", "\\end_inset"] substj = ["\\size default", "", "\\begin_inset ERT", "status collapsed", "", "\\begin_layout Plain Layout", "", "}", "\\end_layout", "", "\\end_inset"] @@ -1103,15 +1364,15 @@ def revert_ipachar(document): document.body[i: i+1] = subst i = i + len(subst) else: - i = i + 1 + i += 1 if found: add_to_preamble(document, "\\usepackage{tone}") def revert_minionpro(document): - " Revert native MinionPro font definition to LaTeX " + " Revert native MinionPro font definition to LaTeX " - if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1: + if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1: i = find_token(document.header, "\\font_roman minionpro", 0) if i != -1: osf = False @@ -1129,12 +1390,12 @@ def revert_minionpro(document): def revert_mathfonts(document): - " Revert native math font definitions to LaTeX " + " Revert native math font definitions to LaTeX " i = find_token(document.header, "\\font_math", 0) if i == -1: return - if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1: + if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1: val = get_value(document.header, "\\font_math", i) if val == "eulervm": add_to_preamble(document, "\\usepackage{eulervm}") @@ -1155,7 +1416,7 @@ def revert_mathfonts(document): k = find_token(document.header, "\\font_osf true", 0) if k != -1: rm += "-osf" - if rm in mathfont_dict.keys(): + if rm in list(mathfont_dict.keys()): add_to_preamble(document, mathfont_dict[rm]) document.header[j] = "\\font_roman default" if k != -1: @@ -1164,9 +1425,9 @@ def revert_mathfonts(document): def revert_mdnomath(document): - " Revert mathdesign and fourier without math " + " Revert mathdesign and fourier without math " - if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1: + if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1: mathdesign_dict = { "md-charter": "mdbch", "md-utopia": "mdput", @@ -1176,7 +1437,7 @@ def revert_mdnomath(document): if i == -1: return val = get_value(document.header, "\\font_roman", i) - if val in mathdesign_dict.keys(): + if val in list(mathdesign_dict.keys()): j = find_token(document.header, "\\font_math", 0) if j == -1: document.header[i] = "\\font_roman %s" % mathdesign_dict[val] @@ -1188,10 +1449,14 @@ def revert_mdnomath(document): document.header[i] = "\\font_roman %s" % mathdesign_dict[val] +def convert_mathfonts(document): + document.header.insert(-1, "\\font_math auto") + + def convert_mdnomath(document): - " Change mathdesign font name " + " Change mathdesign font name " - if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1: + if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1: mathdesign_dict = { "mdbch": "md-charter", "mdput": "md-utopia", @@ -1201,32 +1466,32 @@ def convert_mdnomath(document): if i == -1: return val = get_value(document.header, "\\font_roman", i) - if val in mathdesign_dict.keys(): + if val in list(mathdesign_dict.keys()): document.header[i] = "\\font_roman %s" % mathdesign_dict[val] def revert_newtxmath(document): - " Revert native newtxmath definitions to LaTeX " + " Revert native newtxmath definitions to LaTeX " i = find_token(document.header, "\\font_math", 0) if i == -1: return - if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1: + if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1: val = get_value(document.header, "\\font_math", i) mathfont_dict = { "libertine-ntxm": "\\usepackage[libertine]{newtxmath}", "minion-ntxm": "\\usepackage[minion]{newtxmath}", "newtxmath": "\\usepackage{newtxmath}", } - if val in mathfont_dict.keys(): + if val in list(mathfont_dict.keys()): add_to_preamble(document, mathfont_dict[val]) document.header[i] = "\\font_math auto" def revert_biolinum(document): - " Revert native biolinum font definition to LaTeX " + " Revert native biolinum font definition to LaTeX " - if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1: + if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1: i = find_token(document.header, "\\font_sans biolinum", 0) if i != -1: osf = False @@ -1281,9 +1546,9 @@ def convert_latexargs(document): "svglobal3", "svglobal", "svjog", "svmono", "svmult", "svprobth", "tarticle", "tbook", "treport", "tufte-book", "tufte-handout"] # A list of "safe" modules, same as above - safe_modules = ["biblatex", "beameraddons", "beamersession", "braille", "customHeadersFooters", - "endnotes", "enumitem", "eqs-within-sections", "figs-within-sections", "fix-cm", - "fixltx2e", "foottoend", "hanging", "jscharstyles", "knitr", "lilypond", + safe_modules = ["biblatex", "beameraddons", "beamer-resenumerate", "beamersession", "braille", + "customHeadersFooters", "endnotes", "enumitem", "eqs-within-sections", "figs-within-sections", + "fix-cm", "fixltx2e", "foottoend", "hanging", "jscharstyles", "knitr", "lilypond", "linguistics", "linguisticx", "logicalmkup", "minimalistic", "nomindex", "noweb", "pdfcomment", "sweave", "tabs-within-sections", "theorems-ams-bytype", "theorems-ams-extended-bytype", "theorems-ams-extended", "theorems-ams", "theorems-bytype", @@ -1327,14 +1592,14 @@ def convert_latexargs(document): # InsetArgument itself will do the real work # (see InsetArgument::updateBuffer()) document.body[i] = "\\begin_inset Argument 999" - i = i + 1 + i += 1 continue - + # Find containing paragraph layout parent = get_containing_layout(document.body, i) if parent == False: - document.warning("Malformed lyx document: Can't find parent paragraph layout") - i = i + 1 + document.warning("Malformed LyX document: Can't find parent paragraph layout") + i += 1 continue parbeg = parent[1] parend = parent[2] @@ -1364,7 +1629,7 @@ def convert_latexargs(document): if argnr > allowed_opts and argnr < first_req: argnr = first_req document.body[p] = "\\begin_inset Argument %d" % argnr - i = i + 1 + i = parend + 1 def revert_latexargs(document): @@ -1381,28 +1646,34 @@ def revert_latexargs(document): m = rx.match(document.body[i]) if not m: # No ID: inset already reverted - i = i + 1 + i += 1 continue # Find containing paragraph layout parent = get_containing_layout(document.body, i) if parent == False: - document.warning("Malformed lyx document: Can't find parent paragraph layout") - i = i + 1 + document.warning("Malformed LyX document: Can't find parent paragraph layout") + i += 1 continue parbeg = parent[1] parend = parent[2] - realparbeg = parent[3] - # Collect all arguments in this paragraph + # Do not set realparbeg to parent[3], since this does not work if we + # have another inset (e.g. label or index) before the first argument + # inset (this is the case in the user guide of LyX 2.0.8) + realparbeg = -1 + # Collect all arguments in this paragraph realparend = parend for p in range(parbeg, parend): m = rx.match(document.body[p]) if m: + if realparbeg < 0: + # This is the first argument inset + realparbeg = p val = int(m.group(1)) j = find_end_of_inset(document.body, p) # Revert to old syntax document.body[p] = "\\begin_inset Argument" if j == -1: - document.warning("Malformed lyx document: Can't find end of Argument inset") + document.warning("Malformed LyX document: Can't find end of Argument inset") continue if val > 0: args[val] = document.body[p : j + 1] @@ -1412,8 +1683,11 @@ def revert_latexargs(document): del document.body[p : j + 1] if p >= realparend: break + if realparbeg < 0: + # No argument inset found + realparbeg = parent[3] # Now sort the arg insets - subst = [""] + subst = [] for f in sorted(args): subst += args[f] del args[f] @@ -1423,206 +1697,50 @@ def revert_latexargs(document): i = realparbeg + 1 + len(subst) -def revert_Argument_to_TeX_brace(document, line, endline, n, nmax, environment, opt): +def revert_IEEEtran(document): ''' - Reverts an InsetArgument to TeX-code - usage: - revert_Argument_to_TeX_brace(document, LineOfBegin, LineOfEnd, StartArgument, EndArgument, isEnvironment, isOpt) - LineOfBegin is the line of the \begin_layout or \begin_inset statement - LineOfEnd is the line of the \end_layout or \end_inset statement, if "0" is given, the end of the file is used instead - StartArgument is the number of the first argument that needs to be converted - EndArgument is the number of the last argument that needs to be converted or the last defined one - isEnvironment must be true, if the layout is for a LaTeX environment - isOpt must be true, if the argument is an optional one + Reverts InsetArgument of + Page headings + Biography + Biography without photo + to TeX-code ''' - lineArg = 0 - wasOpt = False - while lineArg != -1 and n < nmax + 1: - lineArg = find_token(document.body, "\\begin_inset Argument " + str(n), line) - if lineArg > endline and endline != 0: - return wasOpt - if lineArg != -1: - beginPlain = find_token(document.body, "\\begin_layout Plain Layout", lineArg) - # we have to assure that no other inset is in the Argument - beginInset = find_token(document.body, "\\begin_inset", beginPlain) - endInset = find_token(document.body, "\\end_inset", beginPlain) - k = beginPlain + 1 - l = k - while beginInset < endInset and beginInset != -1: - beginInset = find_token(document.body, "\\begin_inset", k) - endInset = find_token(document.body, "\\end_inset", l) - k = beginInset + 1 - l = endInset + 1 - if environment == False: - if opt == False: - document.body[endInset - 2 : endInset + 1] = put_cmd_in_ert("}{") - del(document.body[lineArg : beginPlain + 1]) - wasOpt = False - else: - document.body[endInset - 2 : endInset + 1] = put_cmd_in_ert("]") - document.body[lineArg : beginPlain + 1] = put_cmd_in_ert("[") - wasOpt = True - else: - document.body[endInset - 2 : endInset + 1] = put_cmd_in_ert("}") - document.body[lineArg : beginPlain + 1] = put_cmd_in_ert("{") - wasOpt = False - n = n + 1 - return wasOpt - + if document.textclass != "IEEEtran": + return -def convert_TeX_brace_to_Argument(document, line, n, nmax, inset, environment): - ''' - Converts TeX code for mandatory arguments to an InsetArgument - The conversion of TeX code for optional arguments must be done with another routine - !!! Be careful if the braces are different in your case as expected here: - - "}{" separates mandatory arguments of commands - - "}" + "{" separates mandatory arguments of commands - - "}" + " " + "{" separates mandatory arguments of commands - - { and } surround a mandatory argument of an environment - usage: - convert_TeX_brace_to_Argument(document, LineOfBeginLayout/Inset, StartArgument, EndArgument, isInset, isEnvironment) - LineOfBeginLayout/Inset is the line of the \begin_layout or \begin_inset statement - StartArgument is the number of the first ERT that needs to be converted - EndArgument is the number of the last ERT that needs to be converted - isInset must be true, if braces inside an InsetLayout needs to be converted - isEnvironment must be true, if the layout is for a LaTeX environment - - Todo: this routine can currently handle only one mandatory argument of environments - ''' - lineERT = line - endn = line - loop = 1 - while lineERT != -1 and n < nmax + 1: - lineERT = find_token(document.body, "\\begin_inset ERT", lineERT) - if environment == False and lineERT != -1: - bracePair = find_token(document.body, "}{", lineERT) - # assure that the "}{" is in this ERT - if bracePair == lineERT + 5: - end = find_token(document.body, "\\end_inset", bracePair) - document.body[lineERT : end + 1] = ["\\end_layout", "", "\\end_inset"] - if loop == 1: - # in the case that n > 1 we have optional arguments before - # therefore detect them if any - if n > 1: - # first check if there is an argument - lineArg = find_token(document.body, "\\begin_inset Argument", line) - if lineArg < lineERT and lineArg != -1: - # we have an argument, so now search backwards for its end - # we must now assure that we don't find other insets like e.g. a newline - endInsetArg = lineERT - endLayoutArg = endInsetArg - while endInsetArg != endLayoutArg + 2 and endInsetArg != -1: - endInsetArg = endInsetArg - 1 - endLayoutArg = endInsetArg - endInsetArg = find_token_backwards(document.body, "\\end_inset", endInsetArg) - endLayoutArg = find_token_backwards(document.body, "\\end_layout", endLayoutArg) - line = endInsetArg + 1 - if inset == False: - document.body[line + 1 : line + 1] = ["\\begin_inset Argument " + str(n), "status open", "", "\\begin_layout Plain Layout"] - else: - document.body[line + 4 : line + 4] = ["\\begin_inset Argument " + str(n), "status open", "", "\\begin_layout Plain Layout"] - else: - document.body[endn : endn] = ["\\begin_inset Argument " + str(n), "status open", "", "\\begin_layout Plain Layout"] - n = n + 1 - endn = end - loop = loop + 1 - # now check the case that we have "}" + "{" in two ERTs - else: - endBrace = find_token(document.body, "}", lineERT) - if endBrace == lineERT + 5: - beginBrace = find_token(document.body, "{", endBrace) - # assure that the ERTs are consecutive (11 or 12 depending if there is a space between the ERTs or not) - if beginBrace == endBrace + 11 or beginBrace == endBrace + 12: - end = find_token(document.body, "\\end_inset", beginBrace) - document.body[lineERT : end + 1] = ["\\end_layout", "", "\\end_inset"] - if loop == 1: - # in the case that n > 1 we have optional arguments before - # therefore detect them if any - if n > 1: - # first check if there is an argument - lineArg = find_token(document.body, "\\begin_inset Argument", line) - if lineArg < lineERT and lineArg != -1: - # we have an argument, so now search backwards for its end - # we must now assure that we don't find other insets like e.g. a newline - endInsetArg = lineERT - endLayoutArg = endInsetArg - while endInsetArg != endLayoutArg + 2 and endInsetArg != -1: - endInsetArg = endInsetArg - 1 - endLayoutArg = endInsetArg - endInsetArg = find_token_backwards(document.body, "\\end_inset", endInsetArg) - endLayoutArg = find_token_backwards(document.body, "\\end_layout", endLayoutArg) - line = endInsetArg + 1 - if inset == False: - document.body[line + 1 : line + 1] = ["\\begin_inset Argument " + str(n), "status open", "", "\\begin_layout Plain Layout"] - else: - document.body[line + 4 : line + 4] = ["\\begin_inset Argument " + str(n), "status open", "", "\\begin_layout Plain Layout"] - else: - document.body[endn : endn] = ["\\begin_inset Argument " + str(n), "status open", "", "\\begin_layout Plain Layout"] - n = n + 1 - loop = loop + 1 - # set the line where the next argument will be inserted - if beginBrace == endBrace + 11: - endn = end - 11 - else: - endn = end - 12 - else: - lineERT = lineERT + 1 - if environment == True and lineERT != -1: - opening = find_token(document.body, "{", lineERT) - if opening == lineERT + 5: # assure that the "{" is in this ERT - end = find_token(document.body, "\\end_inset", opening) - document.body[lineERT : end + 1] = ["\\begin_inset Argument " + str(n), "status open", "", "\\begin_layout Plain Layout"] - n = n + 1 - lineERT2 = find_token(document.body, "\\begin_inset ERT", lineERT) - closing = find_token(document.body, "}", lineERT2) - if closing == lineERT2 + 5: # assure that the "}" is in this ERT - end2 = find_token(document.body, "\\end_inset", closing) - document.body[lineERT2 : end2 + 1] = ["\\end_layout", "", "\\end_inset"] - else: - lineERT = lineERT + 1 + layouts = {"Page headings": False, + "Biography without photo": True} + for layout in list(layouts.keys()): + i = 0 + while True: + i = find_token(document.body, '\\begin_layout ' + layout, i) + if i == -1: + break + revert_Argument_to_TeX_brace(document, i, 0, 1, 1, layouts[layout], False) + i += 1 -def revert_IEEEtran(document): - ''' - Reverts InsetArgument of - Page headings - Biography - Biography without photo - to TeX-code - ''' - if document.textclass == "IEEEtran": i = 0 - i2 = 0 - j = 0 - k = 0 while True: - if i != -1: - i = find_token(document.body, "\\begin_layout Page headings", i) - if i != -1: + i = find_token(document.body, '\\begin_inset Flex Paragraph Start', i) + if i == -1: + break revert_Argument_to_TeX_brace(document, i, 0, 1, 1, False, False) - i = i + 1 - if i2 != -1: - i2 = find_token(document.body, "\\begin_inset Flex Paragraph Start", i2) - if i2 != -1: - revert_Argument_to_TeX_brace(document, i2, 0, 1, 1, False, False) - i2 = i2 + 1 - if j != -1: - j = find_token(document.body, "\\begin_layout Biography without photo", j) - if j != -1: - revert_Argument_to_TeX_brace(document, j, 0, 1, 1, True, False) - j = j + 1 - if k != -1: - k = find_token(document.body, "\\begin_layout Biography", k) - kA = find_token(document.body, "\\begin_layout Biography without photo", k) - if k == kA and k != -1: - k = k + 1 - continue - if k != -1: + i += 1 + + i = 0 + while True: + i = find_token_exact(document.body, "\\begin_layout Biography", i) + if i == -1: + break + + if document.body[i] == "\\begin_layout Biography without photo": + i += 1 + continue + # start with the second argument, therefore 2 - revert_Argument_to_TeX_brace(document, k, 0, 2, 2, True, False) - k = k + 1 - if i == -1 and i2 == -1 and j == -1 and k == -1: - return + revert_Argument_to_TeX_brace(document, i, 0, 2, 2, True, False) + i += 1 def revert_IEEEtran_2(document): @@ -1632,53 +1750,51 @@ def revert_IEEEtran_2(document): if document.textclass == "IEEEtran": begin = 0 while True: - if begin != -1: - begin = find_token(document.body, "\\begin_inset Flex Paragraph Start", begin) - if begin != -1: - end1 = find_end_of_inset(document.body, begin) - document.body[end1 - 2 : end1 + 1] = put_cmd_in_ert("}") - document.body[begin : begin + 4] = put_cmd_in_ert("\\IEEEPARstart{") - begin = begin + 5 + begin = find_token(document.body, "\\begin_inset Flex Paragraph Start", begin) if begin == -1: return + end1 = find_end_of_inset(document.body, begin) + document.body[end1 - 2 : end1 + 1] = put_cmd_in_ert("}") + document.body[begin : begin + 4] = put_cmd_in_ert("\\IEEEPARstart{") + begin = begin + 5 def convert_IEEEtran(document): - ''' - Converts ERT of - Page headings - Biography - Biography without photo - to InsetArgument - ''' - if document.textclass == "IEEEtran": + ''' + Converts ERT of + Page headings + Biography + Biography without photo + to InsetArgument + ''' + if document.textclass != "IEEEtran": + return + + layouts = {"Page headings": False, + "Biography without photo": True} + + for layout in list(layouts.keys()): + i = 0 + while True: + i = find_token(document.body, '\\begin_layout ' + layout, i) + if i == -1: + break + convert_TeX_brace_to_Argument(document, i, 1, 1, False, layouts[layout], False) + i += 1 + i = 0 - j = 0 - k = 0 while True: - if i != -1: - i = find_token(document.body, "\\begin_layout Page headings", i) - if i != -1: - convert_TeX_brace_to_Argument(document, i, 1, 1, False, False) - i = i + 1 - if j != -1: - j = find_token(document.body, "\\begin_layout Biography without photo", j) - if j != -1: - convert_TeX_brace_to_Argument(document, j, 1, 1, False, True) - j = j + 1 - if k != -1: - # assure that we don't handle Biography Biography without photo - k = find_token(document.body, "\\begin_layout Biography", k) - kA = find_token(document.body, "\\begin_layout Biography without photo", k - 1) - if k == kA and k != -1: - k = k + 1 - continue - if k != -1: + i = find_token_exact(document.body, "\\begin_layout Biography", i) + if i == -1: + break + + if document.body[i] == "\\begin_layout Biography without photo": + i += 1 + continue + # the argument we want to convert is the second one - convert_TeX_brace_to_Argument(document, k, 2, 2, False, True) - k = k + 1 - if i == -1 and j == -1 and k == -1: - return + convert_TeX_brace_to_Argument(document, i, 2, 2, False, True, False) + i += 1 def revert_AASTeX(document): @@ -1686,13 +1802,11 @@ def revert_AASTeX(document): if document.textclass == "aastex": i = 0 while True: - if i != -1: - i = find_token(document.body, "\\begin_layout Altaffilation", i) - if i != -1: - revert_Argument_to_TeX_brace(document, i, 0, 1, 1, False, False) - i = i + 1 + i = find_token(document.body, "\\begin_layout Altaffilation", i) if i == -1: return + revert_Argument_to_TeX_brace(document, i, 0, 1, 1, False, False) + i += 1 def convert_AASTeX(document): @@ -1700,13 +1814,11 @@ def convert_AASTeX(document): if document.textclass == "aastex": i = 0 while True: - if i != -1: - i = find_token(document.body, "\\begin_layout Altaffilation", i) - if i != -1: - convert_TeX_brace_to_Argument(document, i, 1, 1, False, False) - i = i + 1 + i = find_token(document.body, "\\begin_layout Altaffilation", i) if i == -1: return + convert_TeX_brace_to_Argument(document, i, 1, 1, False, False, False) + i += 1 def revert_AGUTeX(document): @@ -1714,13 +1826,11 @@ def revert_AGUTeX(document): if document.textclass == "agutex": i = 0 while True: - if i != -1: - i = find_token(document.body, "\\begin_layout Author affiliation", i) - if i != -1: - revert_Argument_to_TeX_brace(document, i, 0, 1, 1, False, False) - i = i + 1 + i = find_token(document.body, "\\begin_layout Author affiliation", i) if i == -1: return + revert_Argument_to_TeX_brace(document, i, 0, 1, 1, False, False) + i += 1 def convert_AGUTeX(document): @@ -1728,13 +1838,11 @@ def convert_AGUTeX(document): if document.textclass == "agutex": i = 0 while True: - if i != -1: - i = find_token(document.body, "\\begin_layout Author affiliation", i) - if i != -1: - convert_TeX_brace_to_Argument(document, i, 1, 1, False, False) - i = i + 1 + i = find_token(document.body, "\\begin_layout Author affiliation", i) if i == -1: return + convert_TeX_brace_to_Argument(document, i, 1, 1, False, False, False) + i += 1 def revert_IJMP(document): @@ -1742,13 +1850,11 @@ def revert_IJMP(document): if document.textclass == "ijmpc" or document.textclass == "ijmpd": i = 0 while True: - if i != -1: - i = find_token(document.body, "\\begin_layout MarkBoth", i) - if i != -1: - revert_Argument_to_TeX_brace(document, i, 0, 1, 1, False, False) - i = i + 1 + i = find_token(document.body, "\\begin_layout MarkBoth", i) if i == -1: return + revert_Argument_to_TeX_brace(document, i, 0, 1, 1, False, False) + i += 1 def convert_IJMP(document): @@ -1756,13 +1862,11 @@ def convert_IJMP(document): if document.textclass == "ijmpc" or document.textclass == "ijmpd": i = 0 while True: - if i != -1: - i = find_token(document.body, "\\begin_layout MarkBoth", i) - if i != -1: - convert_TeX_brace_to_Argument(document, i, 1, 1, False, False) - i = i + 1 + i = find_token(document.body, "\\begin_layout MarkBoth", i) if i == -1: return + convert_TeX_brace_to_Argument(document, i, 1, 1, False, False, False) + i += 1 def revert_SIGPLAN(document): @@ -1775,12 +1879,12 @@ def revert_SIGPLAN(document): i = find_token(document.body, "\\begin_layout Conference", i) if i != -1: revert_Argument_to_TeX_brace(document, i, 0, 1, 1, False, False) - i = i + 1 + i += 1 if j != -1: j = find_token(document.body, "\\begin_layout Author", j) if j != -1: revert_Argument_to_TeX_brace(document, j, 0, 1, 2, False, False) - j = j + 1 + j += 1 if i == -1 and j == -1: return @@ -1794,13 +1898,13 @@ def convert_SIGPLAN(document): if i != -1: i = find_token(document.body, "\\begin_layout Conference", i) if i != -1: - convert_TeX_brace_to_Argument(document, i, 1, 1, False, False) - i = i + 1 + convert_TeX_brace_to_Argument(document, i, 1, 1, False, False, False) + i += 1 if j != -1: j = find_token(document.body, "\\begin_layout Author", j) if j != -1: - convert_TeX_brace_to_Argument(document, j, 1, 2, False, False) - j = j + 1 + convert_TeX_brace_to_Argument(document, j, 1, 2, False, False, False) + j += 1 if i == -1 and j == -1: return @@ -1810,13 +1914,11 @@ def revert_SIGGRAPH(document): if document.textclass == "acmsiggraph": i = 0 while True: - if i != -1: - i = find_token(document.body, "\\begin_inset Flex CRcat", i) - if i != -1: - revert_Argument_to_TeX_brace(document, i, 0, 1, 3, False, False) - i = i + 1 + i = find_token(document.body, "\\begin_inset Flex CRcat", i) if i == -1: return + revert_Argument_to_TeX_brace(document, i, 0, 1, 3, False, False) + i += 1 def convert_SIGGRAPH(document): @@ -1824,13 +1926,11 @@ def convert_SIGGRAPH(document): if document.textclass == "acmsiggraph": i = 0 while True: - if i != -1: - i = find_token(document.body, "\\begin_inset Flex CRcat", i) - if i != -1: - convert_TeX_brace_to_Argument(document, i, 1, 3, True, False) - i = i + 1 + i = find_token(document.body, "\\begin_inset Flex CRcat", i) if i == -1: return + convert_TeX_brace_to_Argument(document, i, 1, 3, True, False, False) + i += 1 def revert_EuropeCV(document): @@ -1845,22 +1945,22 @@ def revert_EuropeCV(document): i = find_token(document.body, "\\begin_layout Item", i) if i != -1: revert_Argument_to_TeX_brace(document, i, 0, 2, 2, False, False) - i = i + 1 + i += 1 if j != -1: j = find_token(document.body, "\\begin_layout BulletedItem", j) if j != -1: revert_Argument_to_TeX_brace(document, j, 0, 2, 2, False, False) - j = j + 1 + j += 1 if k != -1: k = find_token(document.body, "\\begin_layout Language", k) if k != -1: revert_Argument_to_TeX_brace(document, k, 0, 2, 6, False, False) - k = k + 1 + k += 1 if m != -1: m = find_token(document.body, "\\begin_layout LastLanguage", m) if m != -1: revert_Argument_to_TeX_brace(document, m, 0, 2, 6, False, False) - m = m + 1 + m += 1 if i == -1 and j == -1 and k == -1 and m == -1: return @@ -1876,23 +1976,23 @@ def convert_EuropeCV(document): if i != -1: i = find_token(document.body, "\\begin_layout Item", i) if i != -1: - convert_TeX_brace_to_Argument(document, i, 2, 2, False, False) - i = i + 1 + convert_TeX_brace_to_Argument(document, i, 2, 2, False, False, False) + i += 1 if j != -1: j = find_token(document.body, "\\begin_layout BulletedItem", j) if j != -1: - convert_TeX_brace_to_Argument(document, j, 2, 2, False, False) - j = j + 1 + convert_TeX_brace_to_Argument(document, j, 2, 2, False, False, False) + j += 1 if k != -1: k = find_token(document.body, "\\begin_layout Language", k) if k != -1: - convert_TeX_brace_to_Argument(document, k, 2, 6, False, False) - k = k + 1 + convert_TeX_brace_to_Argument(document, k, 2, 6, False, False, False) + k += 1 if m != -1: m = find_token(document.body, "\\begin_layout LastLanguage", m) if m != -1: - convert_TeX_brace_to_Argument(document, m, 2, 6, False, False) - m = m + 1 + convert_TeX_brace_to_Argument(document, m, 2, 6, False, False, False) + m += 1 if i == -1 and j == -1 and k == -1 and m == -1: return @@ -1904,30 +2004,36 @@ def revert_ModernCV(document): k = 0 m = 0 o = 0 + p = 0 while True: if j != -1: j = find_token(document.body, "\\begin_layout Entry", j) if j != -1: revert_Argument_to_TeX_brace(document, j, 0, 1, 5, False, False) - j = j + 1 + j += 1 if k != -1: k = find_token(document.body, "\\begin_layout Item", k) if k != -1: revert_Argument_to_TeX_brace(document, k, 0, 1, 1, False, False) - k = k + 1 + k += 1 if m != -1: m = find_token(document.body, "\\begin_layout ItemWithComment", m) if m != -1: revert_Argument_to_TeX_brace(document, m, 0, 1, 2, False, False) document.body[m] = document.body[m].replace("\\begin_layout ItemWithComment", "\\begin_layout Language") - m = m + 1 + m += 1 if o != -1: o = find_token(document.body, "\\begin_layout DoubleItem", o) if o != -1: revert_Argument_to_TeX_brace(document, o, 0, 1, 3, False, False) document.body[o] = document.body[o].replace("\\begin_layout DoubleItem", "\\begin_layout Computer") o = o + 1 - if j == -1 and k == -1 and m == -1 and o == -1: + if p != -1: + p = find_token(document.body, "\\begin_layout Social", p) + if p != -1: + revert_Argument_to_TeX_brace(document, p, 0, 1, 1, False, True) + p = p + 1 + if j == -1 and k == -1 and m == -1 and o == -1 and p == -1: return @@ -1937,21 +2043,19 @@ def revert_ModernCV_2(document): flex = 0 flexEnd = -1 while True: - if flex != -1: - flex = find_token(document.body, "\\begin_inset Flex Column", flex) - if flex != -1: - flexEnd = find_end_of_inset(document.body, flex) - wasOpt = revert_Argument_to_TeX_brace(document, flex, flexEnd, 1, 1, False, True) - revert_Argument_to_TeX_brace(document, flex, 0, 2, 2, False, False) - flexEnd = find_end_of_inset(document.body, flex) - if wasOpt == True: - document.body[flex + 0 : flex + 4] = put_cmd_in_ert("\\cvcolumn") - else: - document.body[flex + 0 : flex + 4] = put_cmd_in_ert("\\cvcolumn{") - document.body[flexEnd + 4 : flexEnd + 7] = put_cmd_in_ert("}") - flex = flex + 1 + flex = find_token(document.body, "\\begin_inset Flex Column", flex) if flex == -1: return flexEnd + flexEnd = find_end_of_inset(document.body, flex) + wasOpt = revert_Argument_to_TeX_brace(document, flex, flexEnd, 1, 1, False, True) + revert_Argument_to_TeX_brace(document, flex, 0, 2, 2, False, False) + flexEnd = find_end_of_inset(document.body, flex) + if wasOpt == True: + document.body[flex + 0 : flex + 4] = put_cmd_in_ert("\\cvcolumn") + else: + document.body[flex + 0 : flex + 4] = put_cmd_in_ert("\\cvcolumn{") + document.body[flexEnd + 4 : flexEnd + 7] = put_cmd_in_ert("}") + flex += 1 def revert_ModernCV_3(document): @@ -1963,17 +2067,38 @@ def revert_ModernCV_3(document): # get the position of the end of the last column inset LastFlexEnd = revert_ModernCV_2(document) while True: - if p != -1: - p = find_token(document.body, "\\begin_layout Columns", p) - if p != -1: - pEnd = find_end_of_layout(document.body, p) - document.body[p] = document.body[p].replace("\\begin_layout Columns", "\\begin_layout Standard") - if LastFlexEnd != -1: - document.body[p + 1 : p + 1] = put_cmd_in_ert("\\begin{cvcolumns}") - document.body[LastFlexEnd + 24 : LastFlexEnd + 24] = put_cmd_in_ert("\\end{cvcolumns}") - p = p + 1 + p = find_token(document.body, "\\begin_layout Columns", p) + if p == -1: + return + pEnd = find_end_of_layout(document.body, p) + document.body[p] = document.body[p].replace("\\begin_layout Columns", "\\begin_layout Standard") + if LastFlexEnd != -1: + document.body[p + 1 : p + 1] = put_cmd_in_ert("\\begin{cvcolumns}") + document.body[LastFlexEnd + 24 : LastFlexEnd + 24] = put_cmd_in_ert("\\end{cvcolumns}") + p += 1 + + +def revert_ModernCV_4(document): + " Reverts the style Social to TeX-code " + if document.textclass == "moderncv": + # revert the layouts + revert_ModernCV(document) + p = 0 + while True: + p = find_token(document.body, "\\begin_layout Social", p) if p == -1: return + pEnd = find_end_of_layout(document.body, p) + document.body[p] = document.body[p].replace("\\begin_layout Social", "\\begin_layout Standard") + document.body[p + 1 : p + 1] = put_cmd_in_ert("\\social") + hasOpt = find_token(document.body, "[", p + 9) + if hasOpt < p + 18: + document.body[p + 30 : p + 30] = put_cmd_in_ert("{") + document.body[p + 41 : p + 41] = put_cmd_in_ert("}") + else: + document.body[p + 11 : p + 11] = put_cmd_in_ert("{") + document.body[p + 21 : p + 21] = put_cmd_in_ert("}") + p += 1 def convert_ModernCV(document): @@ -1988,24 +2113,24 @@ def convert_ModernCV(document): if i != -1: i = find_token(document.body, "\\begin_layout DoubleItem", i) if i != -1: - convert_TeX_brace_to_Argument(document, i, 1, 1, False, False) + convert_TeX_brace_to_Argument(document, i, 1, 1, False, False, False) document.body[o] = document.body[o].replace("\\begin_layout DoubleItem", "\\begin_layout DoubleListItem") - i = i + 1 + i += 1 if j != -1: j = find_token(document.body, "\\begin_layout Entry", j) if j != -1: - convert_TeX_brace_to_Argument(document, j, 1, 5, False, False) - j = j + 1 + convert_TeX_brace_to_Argument(document, j, 1, 5, False, False, False) + j += 1 if k != -1: k = find_token(document.body, "\\begin_layout Item", k) if k != -1: - convert_TeX_brace_to_Argument(document, k, 1, 1, False, False) - k = k + 1 + convert_TeX_brace_to_Argument(document, k, 1, 1, False, False, False) + k += 1 if m != -1: m = find_token(document.body, "\\begin_layout Language", m) if m != -1: - convert_TeX_brace_to_Argument(document, m, 1, 2, False, False) - m = m + 1 + convert_TeX_brace_to_Argument(document, m, 1, 2, False, False, False) + m += 1 if i == -1 and j == -1 and k == -1 and m == -1: return @@ -2014,27 +2139,23 @@ def revert_Initials(document): " Reverts InsetArgument of Initial to TeX-code " i = 0 while True: - if i != -1: - i = find_token(document.body, "\\begin_layout Initial", i) - if i != -1: - # first arg (optional) and second arg (first mandatory) are supported in LyX 2.0.x - revert_Argument_to_TeX_brace(document, i, 0, 3, 3, False, False) - i = i + 1 + i = find_token(document.body, "\\begin_layout Initial", i) if i == -1: return + # first arg (optional) and second arg (first mandatory) are supported in LyX 2.0.x + revert_Argument_to_TeX_brace(document, i, 0, 3, 3, False, False) + i += 1 def convert_Initials(document): " Converts ERT of Initial to InsetArgument " i = 0 while True: - if i != -1: - i = find_token(document.body, "\\begin_layout Initial", i) - if i != -1: - convert_TeX_brace_to_Argument(document, i, 3, 3, False, False) - i = i + 1 + i = find_token(document.body, "\\begin_layout Initial", i) if i == -1: return + convert_TeX_brace_to_Argument(document, i, 3, 3, False, False, False) + i += 1 def revert_literate(document): @@ -2047,12 +2168,12 @@ def revert_literate(document): if i == -1: break document.body[i] = "\\begin_layout Scrap" - i = i + 1 + i += 1 def convert_literate(document): " Convert Literate document to new format" - i = find_token(document.header, "\\textclass", 0) + i = find_token(document.header, "\\textclass", 0) if (i != -1) and "literate-" in document.header[i]: document.textclass = document.header[i].replace("\\textclass literate-", "") j = find_token(document.header, "\\begin_modules", 0) @@ -2068,7 +2189,7 @@ def convert_literate(document): if i == -1: break document.body[i] = "\\begin_layout Chunk" - i = i + 1 + i += 1 def revert_itemargs(document): @@ -2082,8 +2203,8 @@ def revert_itemargs(document): # Find containing paragraph layout parent = get_containing_layout(document.body, i) if parent == False: - document.warning("Malformed lyx document: Can't find parent paragraph layout") - i = i + 1 + document.warning("Malformed LyX document: Can't find parent paragraph layout") + i += 1 continue parbeg = parent[3] beginPlain = find_token(document.body, "\\begin_layout Plain Layout", i) @@ -2092,16 +2213,16 @@ def revert_itemargs(document): del document.body[i:j+1] subst = put_cmd_in_ert("[") + content + put_cmd_in_ert("]") document.body[parbeg : parbeg] = subst - i = i + 1 + i += 1 def revert_garamondx_newtxmath(document): - " Revert native garamond newtxmath definition to LaTeX " + " Revert native garamond newtxmath definition to LaTeX " i = find_token(document.header, "\\font_math", 0) if i == -1: return - if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1: + if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1: val = get_value(document.header, "\\font_math", i) if val == "garamondx-ntxm": add_to_preamble(document, "\\usepackage[garamondx]{newtxmath}") @@ -2109,9 +2230,9 @@ def revert_garamondx_newtxmath(document): def revert_garamondx(document): - " Revert native garamond font definition to LaTeX " + " Revert native garamond font definition to LaTeX " - if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1: + if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1: i = find_token(document.header, "\\font_roman garamondx", 0) if i != -1: osf = False @@ -2128,7 +2249,7 @@ def revert_garamondx(document): def convert_beamerargs(document): " Converts beamer arguments to new layout " - + beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"] if document.textclass not in beamer_classes: return @@ -2145,8 +2266,8 @@ def convert_beamerargs(document): # Find containing paragraph layout parent = get_containing_layout(document.body, i) if parent == False: - document.warning("Malformed lyx document: Can't find parent paragraph layout") - i = i + 1 + document.warning("Malformed LyX document: Can't find parent paragraph layout") + i += 1 continue parbeg = parent[1] parend = parent[2] @@ -2184,21 +2305,122 @@ def convert_beamerargs(document): if document.body[p + 9].endswith(">"): # strip off the > document.body[p + 9] = document.body[p + 9][:-1] + elif document.body[p + 4].startswith("<"): + # This is an overlay specification (without ERT) + # strip off the < + document.body[p + 4] = document.body[p + 4][1:] + if document.body[p + 4].endswith(">"): + # strip off the > + document.body[p + 4] = document.body[p + 4][:-1] elif layoutname != "Itemize": # Shift this one document.body[p] = "\\begin_inset Argument 2" - i = i + 1 + i += 1 + + +# +# Helper function for the frame conversion routines +# +# FIXME: This method currently requires the arguments to be either +# * In one (whole) ERT each: [][arg3] +# * Altogether in one whole ERT: [][arg3] +# If individual arguments mix ERT and non-ERT or are splitted +# over several ERTs, the parsing fails. +def convert_beamerframeargs(document, i, parbeg): + ertend = i + while True: + if document.body[parbeg] != "\\begin_inset ERT": + return ertend + ertend = find_end_of_inset(document.body, parbeg) + if ertend == -1: + document.warning("Malformed LyX document: missing ERT \\end_inset") + return ertend + ertcont = parbeg + 5 + if document.body[ertcont].startswith("[<"): + # This is a default overlay specification + # strip off the [< + document.body[ertcont] = document.body[ertcont][2:] + if document.body[ertcont].endswith(">]"): + # strip off the >] + document.body[ertcont] = document.body[ertcont][:-2] + elif document.body[ertcont].endswith("]"): + # divide the args + tok = document.body[ertcont].find('>][') + if tok != -1: + subst = [document.body[ertcont][:tok], + '\\end_layout', '', '\\end_inset', '', '', '\\begin_inset Argument 3', + 'status collapsed', '', '\\begin_layout Plain Layout', + document.body[ertcont][tok + 3:-1]] + document.body[ertcont : ertcont + 1] = subst + ertend += 11 + # Convert to ArgInset + document.body[parbeg] = "\\begin_inset Argument 2" + elif document.body[ertcont].startswith("<"): + # This is an overlay specification + # strip off the < + document.body[ertcont] = document.body[ertcont][1:] + if document.body[ertcont].endswith(">"): + # strip off the > + document.body[ertcont] = document.body[ertcont][:-1] + # Convert to ArgInset + document.body[parbeg] = "\\begin_inset Argument 1" + elif document.body[ertcont].endswith(">]"): + # divide the args + tok = document.body[ertcont].find('>[<') + if tok != -1: + document.body[ertcont : ertcont + 1] = [document.body[ertcont][:tok], + '\\end_layout', '', '\\end_inset', '', '', '\\begin_inset Argument 2', + 'status collapsed', '', '\\begin_layout Plain Layout', + document.body[ertcont][tok + 3:-2]] + # Convert to ArgInset + document.body[parbeg] = "\\begin_inset Argument 1" + ertend += 11 + elif document.body[ertcont].endswith("]"): + # divide the args + tok = document.body[ertcont].find('>[<') + if tok != -1: + # divide the args + tokk = document.body[ertcont].find('>][') + if tokk != -1: + document.body[ertcont : ertcont + 1] = [document.body[ertcont][:tok], + '\\end_layout', '', '\\end_inset', '', '', '\\begin_inset Argument 2', + 'status collapsed', '', '\\begin_layout Plain Layout', + document.body[ertcont][tok + 3:tokk], + '\\end_layout', '', '\\end_inset', '', '', '\\begin_inset Argument 3', + 'status collapsed', '', '\\begin_layout Plain Layout', + document.body[ertcont][tokk + 3:-1]] + ertend += 22 + else: + tokk = document.body[ertcont].find('>[') + if tokk != -1: + document.body[ertcont : ertcont + 1] = [document.body[ertcont][:tokk], + '\\end_layout', '', '\\end_inset', '', '', '\\begin_inset Argument 3', + 'status collapsed', '', '\\begin_layout Plain Layout', + document.body[ertcont][tokk + 2:-1]] + ertend += 11 + # Convert to ArgInset + document.body[parbeg] = "\\begin_inset Argument 1" + elif document.body[ertcont].startswith("["): + # This is an ERT option + # strip off the [ + document.body[ertcont] = document.body[ertcont][1:] + if document.body[ertcont].endswith("]"): + # strip off the ] + document.body[ertcont] = document.body[ertcont][:-1] + # Convert to ArgInset + document.body[parbeg] = "\\begin_inset Argument 3" + parbeg = ertend + 3 + continue + return ertend def convert_againframe_args(document): " Converts beamer AgainFrame to new layout " - # FIXME: This currently only works if the arguments are in one single ERT - beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"] if document.textclass not in beamer_classes: return - + i = 0 while True: i = find_token(document.body, "\\begin_layout AgainFrame", i) @@ -2210,93 +2432,21 @@ def convert_againframe_args(document): j = parent[2] parbeg = parent[3] if i != -1: - if document.body[parbeg] == "\\begin_inset ERT": - ertcont = parbeg + 5 - if document.body[ertcont].startswith("[<"): - # This is a default overlay specification - # strip off the [< - document.body[ertcont] = document.body[ertcont][2:] - if document.body[ertcont].endswith(">]"): - # strip off the >] - document.body[ertcont] = document.body[ertcont][:-2] - elif document.body[ertcont].endswith("]"): - # divide the args - tok = document.body[ertcont].find('>][') - if tok != -1: - subst = [document.body[ertcont][:tok], - '\\end_layout', '', '\\end_inset', '', '', '\\begin_inset Argument 3', - 'status collapsed', '', '\\begin_layout Plain Layout', - document.body[ertcont][tok + 3:-1]] - document.body[ertcont : ertcont + 1] = subst - # Convert to ArgInset - document.body[parbeg] = "\\begin_inset Argument 2" - i = j - continue - elif document.body[ertcont].startswith("<"): - # This is an overlay specification - # strip off the < - document.body[ertcont] = document.body[ertcont][1:] - if document.body[ertcont].endswith(">"): - # strip off the > - document.body[ertcont] = document.body[ertcont][:-1] - # Convert to ArgInset - document.body[parbeg] = "\\begin_inset Argument 1" - elif document.body[ertcont].endswith(">]"): - # divide the args - tok = document.body[ertcont].find('>[<') - if tok != -1: - document.body[ertcont : ertcont + 1] = [document.body[ertcont][:tok], - '\\end_layout', '', '\\end_inset', '', '', '\\begin_inset Argument 2', - 'status collapsed', '', '\\begin_layout Plain Layout', - document.body[ertcont][tok + 3:-2]] - # Convert to ArgInset - document.body[parbeg] = "\\begin_inset Argument 1" - elif document.body[ertcont].endswith("]"): - # divide the args - tok = document.body[ertcont].find('>[<') - if tok != -1: - # divide the args - tokk = document.body[ertcont].find('>][') - if tokk != -1: - document.body[ertcont : ertcont + 1] = [document.body[ertcont][:tok], - '\\end_layout', '', '\\end_inset', '', '', '\\begin_inset Argument 2', - 'status collapsed', '', '\\begin_layout Plain Layout', - document.body[ertcont][tok + 3:tokk], - '\\end_layout', '', '\\end_inset', '', '', '\\begin_inset Argument 3', - 'status collapsed', '', '\\begin_layout Plain Layout', - document.body[ertcont][tokk + 3:-1]] - else: - tokk = document.body[ertcont].find('>[') - if tokk != -1: - document.body[ertcont : ertcont + 1] = [document.body[ertcont][:tokk], - '\\end_layout', '', '\\end_inset', '', '', '\\begin_inset Argument 3', - 'status collapsed', '', '\\begin_layout Plain Layout', - document.body[ertcont][tokk + 2:-1]] - # Convert to ArgInset - document.body[parbeg] = "\\begin_inset Argument 1" - i = j - continue - elif document.body[ertcont].startswith("["): - # This is an ERT option - # strip off the [ - document.body[ertcont] = document.body[ertcont][1:] - if document.body[ertcont].endswith("]"): - # strip off the ] - document.body[ertcont] = document.body[ertcont][:-1] - # Convert to ArgInset - document.body[parbeg] = "\\begin_inset Argument 3" - i = j - continue + # Convert ERT arguments + # FIXME: See restrictions in convert_beamerframeargs method + ertend = convert_beamerframeargs(document, i, parbeg) + if ertend == -1: + break i = j def convert_corollary_args(document): " Converts beamer corrolary-style ERT arguments native InsetArgs " - + beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"] if document.textclass not in beamer_classes: return - + corollary_layouts = ["Corollary", "Definition", "Definitions", "Example", "Examples", "Fact", "Proof", "Theorem"] for lay in corollary_layouts: i = 0 @@ -2311,37 +2461,70 @@ def convert_corollary_args(document): parbeg = parent[3] if i != -1: if document.body[parbeg] == "\\begin_inset ERT": - ertcont = parbeg + 5 - if document.body[ertcont].startswith("<"): + ertcontfirstline = parbeg + 5 + # Find the last ERT in this paragraph (which might also be the first) + lastertbeg = find_token_backwards(document.body, "\\begin_inset ERT", j) + if lastertbeg == -1: + document.warning("Last ERT not found!") + break + lastertend = find_end_of_inset(document.body, lastertbeg) + if lastertend == -1: + document.warning("End of last ERT not found!") + break + ertcontlastline = lastertend - 3 + if document.body[ertcontfirstline].startswith("<"): # This is an overlay specification # strip off the < - document.body[ertcont] = document.body[ertcont][1:] - if document.body[ertcont].endswith(">"): + document.body[ertcontfirstline] = document.body[ertcontfirstline][1:] + if document.body[ertcontlastline].endswith(">"): # strip off the > - document.body[ertcont] = document.body[ertcont][:-1] - elif document.body[ertcont].endswith("]"): + document.body[ertcontlastline] = document.body[ertcontlastline][:-1] + if ertcontfirstline < ertcontlastline: + # Multiline ERT. Might contain TeX code. Embrace in ERT. + document.body[ertcontlastline : ertcontlastline + 1] = [ + document.body[ertcontlastline], '\\end_layout', '', '\\end_inset'] + document.body[ertcontfirstline : ertcontfirstline + 1] = [ + '\\end_layout', '', '\\end_inset', '', '', '\\begin_inset Argument 1', + 'status collapsed', '', '\\begin_layout Plain Layout', + '\\begin_inset ERT', '', 'status open' '', '\\begin_layout Plain Layout', + document.body[ertcontfirstline]] + else: + # Convert to ArgInset + document.body[parbeg] = "\\begin_inset Argument 1" + elif document.body[ertcontlastline].endswith("]"): # divide the args - tok = document.body[ertcont].find('>[') + tok = document.body[ertcontfirstline].find('>[') if tok != -1: - subst = [document.body[ertcont][:tok], - '\\end_layout', '', '\\end_inset', '', '', '\\begin_inset Argument 2', - 'status collapsed', '', '\\begin_layout Plain Layout', - document.body[ertcont][tok + 2:-1]] - document.body[ertcont : ertcont + 1] = subst - # Convert to ArgInset - document.body[parbeg] = "\\begin_inset Argument 1" + if ertcontfirstline < ertcontlastline: + # Multiline ERT. Might contain TeX code. Embrace in ERT. + document.body[ertcontlastline : ertcontlastline + 1] = [ + document.body[ertcontlastline], '\\end_layout', '', '\\end_inset'] + document.body[ertcontfirstline : ertcontfirstline + 1] = [document.body[ertcontfirstline][:tok], + '\\end_layout', '', '\\end_inset', '', '', '\\begin_inset Argument 2', + 'status collapsed', '', '\\begin_layout Plain Layout', + '\\begin_inset ERT', '', 'status open' '', '\\begin_layout Plain Layout', + document.body[ertcontfirstline][tok + 2:-1]] + else: + document.body[ertcontfirstline : ertcontfirstline + 1] = [document.body[ertcontfirstline][:tok], + '\\end_layout', '', '\\end_inset', '', '', '\\begin_inset Argument 2', + 'status collapsed', '', '\\begin_layout Plain Layout', + document.body[ertcontfirstline][tok + 2:-1]] + # Convert to ArgInset + document.body[parbeg] = "\\begin_inset Argument 1" i = j continue - elif document.body[ertcont].startswith("["): - # This is an ERT option - # strip off the [ - document.body[ertcont] = document.body[ertcont][1:] - if document.body[ertcont].endswith("]"): + elif document.body[ertcontlastline].startswith("["): + if document.body[ertcontlastline].endswith("]"): + # This is an ERT option + # strip off the [ + document.body[ertcontlastline] = document.body[ertcontlastline][1:] # strip off the ] - document.body[ertcont] = document.body[ertcont][:-1] - # Convert to ArgInset - document.body[parbeg] = "\\begin_inset Argument 2" - i = j + document.body[ertcontlastline] = document.body[ertcontlastline][:-1] + # Convert to ArgInset + document.body[parbeg] = "\\begin_inset Argument 2" + else: + convert_TeX_brace_to_Argument(document, i, 2, 2, False, True, True) + i += 1 continue i = j @@ -2349,11 +2532,11 @@ def convert_corollary_args(document): def convert_quote_args(document): " Converts beamer quote style ERT args to native InsetArgs " - + beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"] if document.textclass not in beamer_classes: return - + quote_layouts = ["Uncover", "Only", "Quotation", "Quote", "Verse"] for lay in quote_layouts: i = 0 @@ -2380,9 +2563,45 @@ def convert_quote_args(document): i = j +def cleanup_beamerargs(document): + " Clean up empty ERTs (conversion artefacts) " + + beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"] + if document.textclass not in beamer_classes: + return + + i = 0 + while True: + i = find_token(document.body, "\\begin_inset Argument", i) + if i == -1: + return + j = find_end_of_inset(document.body, i) + if j == -1: + document.warning("Malformed LyX document: Can't find end of Argument inset") + i += 1 + continue + while True: + ertbeg = find_token(document.body, "\\begin_inset ERT", i, j) + if ertbeg == -1: + break + ertend = find_end_of_inset(document.body, ertbeg) + if ertend == -1: + document.warning("Malformed LyX document: Can't find end of ERT inset") + break + stripped = [line for line in document.body[ertbeg : ertend + 1] if line.strip()] + if len(stripped) == 5: + # This is an empty ERT + offset = len(document.body[ertbeg : ertend + 1]) + del document.body[ertbeg : ertend + 1] + j = j - offset + else: + i = ertend + i += 1 + + def revert_beamerargs(document): " Reverts beamer arguments to old layout " - + beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"] if document.textclass not in beamer_classes: return @@ -2402,8 +2621,8 @@ def revert_beamerargs(document): # Find containing paragraph layout parent = get_containing_layout(document.body, i) if parent == False: - document.warning("Malformed lyx document: Can't find parent paragraph layout") - i = i + 1 + document.warning("Malformed LyX document: Can't find parent paragraph layout") + i += 1 continue parbeg = parent[1] parend = parent[2] @@ -2518,8 +2737,22 @@ def revert_beamerargs(document): endPlain = find_end_of_layout(document.body, beginPlain) content = document.body[beginPlain + 1 : endPlain] del document.body[i:j+1] - subst = put_cmd_in_ert("[") + content + put_cmd_in_ert("]") - document.body[realparbeg : realparbeg] = subst + if layoutname == "Description": + # Description only has one (overlay) item arg + subst = put_cmd_in_ert("<") + content + put_cmd_in_ert(">") + # This must be put after the first space (begin of decription body + # in LyX's arkward description list syntax) + # Try to find that place ... + rxx = re.compile(r'^([^\\ ]+ )(.*)$') + for q in range(parbeg, parend): + m = rxx.match(document.body[q]) + if m: + # We found it. Now insert the ERT argument just there: + document.body[q : q] = [m.group(1), ''] + subst + ['', m.group(2)] + break + else: + subst = put_cmd_in_ert("[") + content + put_cmd_in_ert("]") + document.body[realparbeg : realparbeg] = subst elif argnr == "item:2": j = find_end_of_inset(document.body, i) # Find containing paragraph layout @@ -2559,13 +2792,13 @@ def revert_beamerargs(document): del document.body[p : endInset + 1] subst = put_cmd_in_ert("[") + content + put_cmd_in_ert("]") document.body[realparbeg : realparbeg] = subst - + i = realparend def revert_beamerargs2(document): " Reverts beamer arguments to old layout, step 2 " - + beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"] if document.textclass not in beamer_classes: return @@ -2582,8 +2815,8 @@ def revert_beamerargs2(document): # Find containing paragraph layout parent = get_containing_layout(document.body, i) if parent == False: - document.warning("Malformed lyx document: Can't find parent paragraph layout") - i = i + 1 + document.warning("Malformed LyX document: Can't find parent paragraph layout") + i += 1 continue parbeg = parent[1] parend = parent[2] @@ -2599,7 +2832,7 @@ def revert_beamerargs2(document): if m: argnr = m.group(1) if argnr == "2": - document.body[p] = "\\begin_inset Argument 1" + document.body[p] = "\\begin_inset Argument 1" if layoutname in corollary_layouts: m = rx.match(document.body[p]) if m: @@ -2650,7 +2883,7 @@ def revert_beamerargs2(document): def revert_beamerargs3(document): " Reverts beamer arguments to old layout, step 3 " - + beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"] if document.textclass not in beamer_classes: return @@ -2664,8 +2897,8 @@ def revert_beamerargs3(document): # Find containing paragraph layout parent = get_containing_layout(document.body, i) if parent == False: - document.warning("Malformed lyx document: Can't find parent paragraph layout") - i = i + 1 + document.warning("Malformed LyX document: Can't find parent paragraph layout") + i += 1 continue parbeg = parent[1] parend = parent[2] @@ -2696,7 +2929,7 @@ def revert_beamerargs3(document): def revert_beamerflex(document): " Reverts beamer Flex insets " - + beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"] if document.textclass not in beamer_classes: return @@ -2796,13 +3029,13 @@ def revert_beamerflex(document): document.body[i : beginPlain + 1] = pre post = put_cmd_in_ert("}") document.body[z - 2 : z + 1] = post - + i += 1 def revert_beamerblocks(document): " Reverts beamer block arguments to ERT " - + beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"] if document.textclass not in beamer_classes: return @@ -2818,8 +3051,8 @@ def revert_beamerblocks(document): # Find containing paragraph layout parent = get_containing_layout(document.body, i) if parent == False: - document.warning("Malformed lyx document: Can't find parent paragraph layout") - i = i + 1 + document.warning("Malformed LyX document: Can't find parent paragraph layout") + i += 1 continue parbeg = parent[1] parend = parent[2] @@ -2862,11 +3095,11 @@ def revert_beamerblocks(document): def convert_beamerblocks(document): " Converts beamer block ERT args to native InsetArgs " - + beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"] if document.textclass not in beamer_classes: return - + blocks = ["Block", "ExampleBlock", "AlertBlock"] for lay in blocks: i = 0 @@ -2879,43 +3112,219 @@ def convert_beamerblocks(document): document.warning("Wrong parent layout!") i += 1 continue - j = parent[2] parbeg = parent[3] + parend = parent[2] + j = parend if i != -1: + # If the paragraph starts with a language switch, adjust parbeg + if len(document.body[parbeg]) == 0 and parbeg < parend \ + and document.body[parbeg + 1].startswith("\\lang"): + parbeg += 2 if document.body[parbeg] == "\\begin_inset ERT": - ertcont = parbeg + 5 + ertcontfirstline = parbeg + 5 + lastertbeg = -1 + lastertend = -1 + while True: + # Find the last ERT in this paragraph used for arguments + # (which might also be the first) + lastertbeg = find_token_backwards(document.body, "\\begin_inset ERT", j) + if lastertbeg == -1: + document.warning("Last ERT not found!") + break + lastertend = find_end_of_inset(document.body, lastertbeg) + if lastertend == -1: + document.warning("End of last ERT not found!") + break + # Is this ERT really used for an argument? + # Note: This will fail when non-argument ERTs actually use brackets + # (e.g. \pause{}) + regexp = re.compile(r'.*[>\]\}]', re.IGNORECASE) + cbracket = find_re(document.body, regexp, lastertbeg, lastertend) + if cbracket != -1: + break + if lastertbeg == parbeg: + break + j = lastertbeg - 1 + if lastertbeg == -1 or lastertend == -1: + break + ertcontlastline = lastertend - 3 while True: - if document.body[ertcont].startswith("<"): + if document.body[ertcontfirstline].lstrip().startswith("<"): # This is an overlay specification # strip off the < - document.body[ertcont] = document.body[ertcont][1:] - if document.body[ertcont].endswith(">"): + document.body[ertcontfirstline] = document.body[ertcontfirstline].lstrip()[1:] + if document.body[ertcontlastline].rstrip().endswith(">"): # strip off the > - document.body[ertcont] = document.body[ertcont][:-1] + document.body[ertcontlastline] = document.body[ertcontlastline].rstrip()[:-1] # Convert to ArgInset document.body[parbeg] = "\\begin_inset Argument 1" - elif document.body[ertcont].endswith("}"): + elif document.body[ertcontlastline].rstrip().endswith("}"): + # strip off the } + document.body[ertcontlastline] = document.body[ertcontlastline].rstrip()[:-1] # divide the args - tok = document.body[ertcont].find('>{') + ertcontdivline = ertcontfirstline + tok = document.body[ertcontdivline].find('>{') + if tok == -1: + regexp = re.compile(r'.*>\{', re.IGNORECASE) + ertcontdivline = find_re(document.body, regexp, ertcontfirstline, lastertend) + tok = document.body[ertcontdivline].find('>{') if tok != -1: - document.body[ertcont : ertcont + 1] = [document.body[ertcont][:tok], + if ertcontfirstline < ertcontlastline: + # Multiline ERT. Might contain TeX code. Embrace in ERT. + document.body[ertcontlastline : ertcontlastline + 1] = [ + document.body[ertcontlastline], '\\end_layout', '', '\\end_inset'] + if ertcontdivline == ertcontfirstline: + document.body[ertcontdivline : ertcontdivline + 1] = [document.body[ertcontdivline][:tok], + '\\end_layout', '', '\\end_inset', '', + '\\end_layout', '', '\\end_inset', '', '', '\\begin_inset Argument 2', + 'status collapsed', '', '\\begin_layout Plain Layout', + '\\begin_inset ERT', '', 'status open' '', '\\begin_layout Plain Layout', + document.body[ertcontdivline][tok + 2:]] + else: + document.body[ertcontdivline : ertcontdivline + 1] = [document.body[ertcontdivline][:tok], + '\\end_layout', '', '\\end_inset', '', '', '\\begin_inset Argument 2', + 'status collapsed', '', '\\begin_layout Plain Layout', + '\\begin_inset ERT', '', 'status open' '', '\\begin_layout Plain Layout', + document.body[ertcontdivline][tok + 2:]] + else: + document.body[ertcontdivline : ertcontdivline + 1] = [document.body[ertcontdivline][:tok], '\\end_layout', '', '\\end_inset', '', '', '\\begin_inset Argument 2', 'status collapsed', '', '\\begin_layout Plain Layout', - document.body[ertcont][tok + 2:-1]] - # Convert to ArgInset - document.body[parbeg] = "\\begin_inset Argument 1" - elif document.body[ertcont].startswith("{"): + document.body[ertcontdivline][tok + 2:]] + else: + # check if have delimiters in two different ERTs + tok = document.body[ertcontdivline].find('>') + if tok == -1: + regexp = re.compile(r'.*>', re.IGNORECASE) + ertcontdivline = find_re(document.body, regexp, ertcontfirstline, lastertend) + tok = document.body[ertcontdivline].find('>') + if tok != -1: + tokk = document.body[ertcontdivline].find('{') + if tokk == -1: + regexp = re.compile(r'.*\{', re.IGNORECASE) + ertcontdivlinetwo = find_re(document.body, regexp, ertcontfirstline, lastertend) + tokk = document.body[ertcontdivlinetwo].find('{') + if tokk != -1: + if ertcontfirstline < ertcontlastline: + # Multiline ERT. Might contain TeX code. Embrace in ERT. + document.body[ertcontlastline : ertcontlastline + 1] = [ + document.body[ertcontlastline], '\\end_layout', '', '\\end_inset'] + document.body[ertcontdivline : ertcontdivlinetwo + 1] = [document.body[ertcontdivline][:tok], + '\\end_layout', '', '\\end_inset', '', '\\end_layout', '', + '\\end_inset', '', '', '\\begin_inset Argument 2', + 'status collapsed', '', '\\begin_layout Plain Layout', + '\\begin_inset ERT', '', 'status open' '', '\\begin_layout Plain Layout', + document.body[ertcontdivlinetwo][tokk + 1:]] + else: + document.body[ertcontdivline : ertcontdivlinetwo + 1] = [document.body[ertcontdivline][:tok], + '\\end_layout', '', '\\end_inset', '', '', '\\begin_inset Argument 2', + 'status collapsed', '', '\\begin_layout Plain Layout', + document.body[ertcontdivlinetwo][tokk + 1:]] + # Convert to ArgInset + if ertcontfirstline < ertcontlastline: + # Multiline ERT. Might contain TeX code. Embrace in ERT. + document.body[parbeg : parbeg + 1] = ['\\begin_inset Argument 1', + 'status collapsed', '', '\\begin_layout Plain Layout', + '\\begin_inset ERT', ''] + else: + document.body[parbeg] = "\\begin_inset Argument 1" + elif document.body[ertcontfirstline].lstrip().startswith("{"): # This is the block title - if document.body[ertcont].endswith("}"): + if document.body[ertcontlastline].rstrip().endswith("}"): # strip off the braces - document.body[ertcont] = document.body[ertcont][1:-1] + document.body[ertcontfirstline] = document.body[ertcontfirstline].lstrip()[1:] + document.body[ertcontlastline] = document.body[ertcontlastline].rstrip()[:-1] + if ertcontfirstline < ertcontlastline: + # Multiline ERT. Might contain TeX code. Embrace in ERT. + document.body[parend : parend + 1] = [ + document.body[parend], '\\end_inset', '', '\\end_layout'] + document.body[parbeg : parbeg + 1] = ['\\begin_inset Argument 2', + 'status collapsed', '', '\\begin_layout Plain Layout', + '\\begin_inset ERT', ''] + else: + # Convert to ArgInset + document.body[parbeg] = "\\begin_inset Argument 2" + # the overlay argument can also follow the title, so ... + elif document.body[ertcontlastline].rstrip().endswith(">"): + # strip off the { + document.body[ertcontfirstline] = document.body[ertcontfirstline].lstrip()[1:] + # strip off the > + document.body[ertcontlastline] = document.body[ertcontlastline].rstrip()[:-1] + # divide the args + ertcontdivline = ertcontfirstline + tok = document.body[ertcontdivline].find('}<') + if tok == -1: + regexp = re.compile(r'.*\}<', re.IGNORECASE) + ertcontdivline = find_re(document.body, regexp, ertcontfirstline, lastertend) + tok = document.body[ertcontdivline].find('}<') + if tok != -1: + if ertcontfirstline < ertcontlastline: + # Multiline ERT. Might contain TeX code. Embrace in ERT. + document.body[ertcontlastline : ertcontlastline + 1] = [ + document.body[ertcontlastline], '\\end_layout', '', '\\end_inset'] + if ertcontdivline == ertcontfirstline: + document.body[ertcontdivline : ertcontdivline + 1] = [document.body[ertcontdivline][:tok], + '\\end_layout', '', '\\end_inset', '', '', '\\begin_inset Argument 1', + 'status collapsed', '', '\\begin_layout Plain Layout', + '\\begin_inset ERT', '', 'status open' '', '\\begin_layout Plain Layout', + document.body[ertcontdivline][tok + 2:]] + else: + document.body[ertcontdivline : ertcontdivline + 1] = [document.body[ertcontdivline][:tok], + '\\end_layout', '', '\\end_inset', '', + '\\end_layout', '', '\\end_inset', '', '', '\\begin_inset Argument 1', + 'status collapsed', '', '\\begin_layout Plain Layout', + '\\begin_inset ERT', '', 'status open' '', '\\begin_layout Plain Layout', + document.body[ertcontdivline][tok + 2:]] + else: + document.body[ertcontdivline : ertcontdivline + 1] = [document.body[ertcontdivline][:tok], + '\\end_layout', '', '\\end_inset', '', '', '\\begin_inset Argument 1', + 'status collapsed', '', '\\begin_layout Plain Layout', + document.body[ertcontdivline][tok + 2:]] + else: + # check if have delimiters in two different ERTs + tok = document.body[ertcontdivline].find('}') + if tok == -1: + regexp = re.compile(r'.*\}', re.IGNORECASE) + ertcontdivline = find_re(document.body, regexp, ertcontfirstline, lastertend) + tok = document.body[ertcontdivline].find('}') + if tok != -1: + tokk = document.body[ertcontdivline].find('<') + if tokk == -1: + regexp = re.compile(r'.*<', re.IGNORECASE) + ertcontdivlinetwo = find_re(document.body, regexp, ertcontfirstline, lastertend) + tokk = document.body[ertcontdivlinetwo].find('<') + if tokk != -1: + if ertcontfirstline < ertcontlastline: + # Multiline ERT. Might contain TeX code. Embrace in ERT. + document.body[ertcontlastline : ertcontlastline + 1] = [ + document.body[ertcontlastline], '\\end_layout', '', '\\end_inset'] + document.body[ertcontdivline : ertcontdivlinetwo + 1] = [document.body[ertcontdivline][:tok], + '\\end_layout', '', '\\end_inset', '', '\\end_layout', '', + '\\end_inset', '', '', '\\begin_inset Argument 1', + 'status collapsed', '', '\\begin_layout Plain Layout', + '\\begin_inset ERT', '', 'status open' '', '\\begin_layout Plain Layout', + document.body[ertcontdivlinetwo][tokk + 1:]] + else: + document.body[ertcontdivline : ertcontdivlinetwo + 1] = [document.body[ertcontdivline][:tok], + '\\end_layout', '', '\\end_inset', '', '', '\\begin_inset Argument 1', + 'status collapsed', '', '\\begin_layout Plain Layout', + document.body[ertcontdivlinetwo][tokk + 1:]] # Convert to ArgInset - document.body[parbeg] = "\\begin_inset Argument 2" - elif count_pars_in_inset(document.body, ertcont) > 1: + if ertcontfirstline < ertcontlastline: + # Multiline ERT. Might contain TeX code. Embrace in ERT. + document.body[parbeg : parbeg + 1] = ['\\begin_inset Argument 2', + 'status collapsed', '', '\\begin_layout Plain Layout', + '\\begin_inset ERT', ''] + else: + document.body[parbeg] = "\\begin_inset Argument 2" + elif count_pars_in_inset(document.body, ertcontfirstline) > 1: # Multipar ERT. Skip this. break else: - convert_TeX_brace_to_Argument(document, i, 2, 2, False, True) + # ERT has contents after the closing bracket. We cannot convert this. + # convert_TeX_brace_to_Argument cannot either. + #convert_TeX_brace_to_Argument(document, i, 2, 2, False, True, False) + break else: break j = find_end_of_layout(document.body, i) @@ -2929,14 +3338,14 @@ def convert_beamerblocks(document): m = find_token(document.body, "\\begin_inset ERT", l, j) if m == -1: break - ertcont = m + 5 + ertcontfirstline = m + 5 parbeg = m i = j def convert_overprint(document): " Convert old beamer overprint layouts to ERT " - + beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"] if document.textclass not in beamer_classes: return @@ -2949,8 +3358,8 @@ def convert_overprint(document): # Find end of sequence j = find_end_of_sequence(document.body, i) if j == -1: - document.warning("Malformed lyx document. Cannot find end of Overprint sequence!") - i = i + 1 + document.warning("Malformed LyX document. Cannot find end of Overprint sequence!") + i += 1 continue endseq = j subst = ["\\begin_layout Standard"] + put_cmd_in_ert("\\begin{overprint}") @@ -2965,8 +3374,8 @@ def convert_overprint(document): if argbeg != -1: argend = find_end_of_layout(document.body, argbeg) if argend == -1: - document.warning("Malformed lyx document. Cannot find end of Overprint argument!") - i = i + 1 + document.warning("Malformed LyX document. Cannot find end of Overprint argument!") + i += 1 continue beginPlain = find_token(document.body, "\\begin_layout Plain Layout", argbeg) endPlain = find_end_of_layout(document.body, beginPlain) @@ -2976,11 +3385,11 @@ def convert_overprint(document): # Remove arg inset del document.body[argbeg : argend + 1] subst += put_cmd_in_ert("[") + content + put_cmd_in_ert("]") - + endseq = endseq - len(document.body[i : i]) document.body[i : i] = subst + ["\\end_layout"] endseq += len(subst) - + for p in range(i, endseq): if document.body[p] == "\\begin_layout Overprint": document.body[p] = "\\begin_layout Standard" @@ -2990,7 +3399,7 @@ def convert_overprint(document): def revert_overprint(document): " Revert old beamer overprint layouts to ERT " - + beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"] if document.textclass not in beamer_classes: return @@ -3003,17 +3412,17 @@ def revert_overprint(document): # Find end of sequence j = find_end_of_sequence(document.body, i) if j == -1: - document.warning("Malformed lyx document. Cannot find end of Overprint sequence!") - i = i + 1 + document.warning("Malformed LyX document. Cannot find end of Overprint sequence!") + i += 1 continue endseq = j subst = ["\\begin_layout Standard"] + put_cmd_in_ert("\\begin{overprint}") - esubst = ["\\end_layout", "", "\\begin_layout Standard"] + put_cmd_in_ert("\\end{overprint}") + esubst = ["\\begin_layout Standard"] + put_cmd_in_ert("\\end{overprint}") endseq = endseq + len(esubst) - len(document.body[j : j]) if document.body[j] == "\\end_deeper": - document.body[j : j] = ["\\end_deeper", ""] + esubst + document.body[j : j] = [""] + esubst + ["", "\\end_layout"] else: - document.body[j : j] = esubst + document.body[j : j] = ["\\end_layout", ""] + esubst r = i while r < j: if document.body[r] == "\\begin_deeper": @@ -3026,24 +3435,27 @@ def revert_overprint(document): r = r + 1 argbeg = find_token(document.body, "\\begin_inset Argument 1", i, j) if argbeg != -1: - argend = find_end_of_inset(document.body, argbeg) - if argend == -1: - document.warning("Malformed lyx document. Cannot find end of Overprint argument!") - i = i + 1 - continue - beginPlain = find_token(document.body, "\\begin_layout Plain Layout", argbeg) - endPlain = find_end_of_layout(document.body, beginPlain) - content = document.body[beginPlain + 1 : endPlain] - # Adjust range end - endseq = endseq - len(document.body[argbeg : argend]) - # Remove arg inset - del document.body[argbeg : argend + 1] - subst += put_cmd_in_ert("[") + content + put_cmd_in_ert("]") - + # Is this really our argument? + nested = find_token(document.body, "\\begin_deeper", i, argbeg) + if nested != -1: + argend = find_end_of_inset(document.body, argbeg) + if argend == -1: + document.warning("Malformed LyX document. Cannot find end of Overprint argument!") + i += 1 + continue + beginPlain = find_token(document.body, "\\begin_layout Plain Layout", argbeg) + endPlain = find_end_of_layout(document.body, beginPlain) + content = document.body[beginPlain + 1 : endPlain] + # Adjust range end + endseq = endseq - len(document.body[argbeg : argend]) + # Remove arg inset + del document.body[argbeg : argend + 1] + subst += put_cmd_in_ert("[") + content + put_cmd_in_ert("]") + endseq = endseq - len(document.body[i : i]) document.body[i : i] = subst + ["\\end_layout"] endseq += len(subst) - + p = i while True: if p >= endseq: @@ -3051,7 +3463,7 @@ def revert_overprint(document): if document.body[p] == "\\begin_layout Overprint": q = find_end_of_layout(document.body, p) if q == -1: - document.warning("Malformed lyx document. Cannot find end of Overprint layout!") + document.warning("Malformed LyX document. Cannot find end of Overprint layout!") p += 1 continue subst = ["\\begin_layout Standard"] + put_cmd_in_ert("\\onslide") @@ -3059,7 +3471,7 @@ def revert_overprint(document): if argbeg != -1: argend = find_end_of_inset(document.body, argbeg) if argend == -1: - document.warning("Malformed lyx document. Cannot find end of Overprint item argument!") + document.warning("Malformed LyX document. Cannot find end of Overprint item argument!") p += 1 continue beginPlain = find_token(document.body, "\\begin_layout Plain Layout", argbeg) @@ -3079,7 +3491,7 @@ def revert_overprint(document): def revert_frametitle(document): " Reverts beamer frametitle layout to ERT " - + beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"] if document.textclass not in beamer_classes: return @@ -3092,8 +3504,8 @@ def revert_frametitle(document): return j = find_end_of_layout(document.body, i) if j == -1: - document.warning("Malformed lyx document: Can't find end of FrameTitle layout") - i = i + 1 + document.warning("Malformed LyX document: Can't find end of FrameTitle layout") + i += 1 continue endlay = j document.body[j : j] = put_cmd_in_ert("}") + document.body[j : j] @@ -3125,7 +3537,7 @@ def revert_frametitle(document): # Remove arg inset del document.body[p : endInset + 1] subst += put_cmd_in_ert("[") + content + put_cmd_in_ert("]") - + subst += put_cmd_in_ert("{") document.body[i : i + 1] = subst i = endlay @@ -3133,7 +3545,7 @@ def revert_frametitle(document): def convert_epigraph(document): " Converts memoir epigraph to new syntax " - + if document.textclass != "memoir": return @@ -3144,8 +3556,8 @@ def convert_epigraph(document): return j = find_end_of_layout(document.body, i) if j == -1: - document.warning("Malformed lyx document: Can't find end of Epigraph layout") - i = i + 1 + document.warning("Malformed LyX document: Can't find end of Epigraph layout") + i += 1 continue endlay = j subst = list() @@ -3168,13 +3580,13 @@ def convert_epigraph(document): endlay += len(begsubst) + len(endsubst) endlay = endlay - len(document.body[ert : endInset + 1]) del document.body[ert : endInset + 1] - + i = endlay def revert_epigraph(document): " Reverts memoir epigraph argument to ERT " - + if document.textclass != "memoir": return @@ -3185,8 +3597,8 @@ def revert_epigraph(document): return j = find_end_of_layout(document.body, i) if j == -1: - document.warning("Malformed lyx document: Can't find end of Epigraph layout") - i = i + 1 + document.warning("Malformed LyX document: Can't find end of Epigraph layout") + i += 1 continue endlay = j subst = list() @@ -3203,39 +3615,38 @@ def revert_epigraph(document): subst += put_cmd_in_ert("}{") + content else: subst += put_cmd_in_ert("}{") - + document.body[j : j] = subst + document.body[j : j] i = endlay def convert_captioninsets(document): " Converts caption insets to new syntax " - + i = 0 while True: i = find_token(document.body, "\\begin_inset Caption", i) if i == -1: return document.body[i] = "\\begin_inset Caption Standard" - i = i + 1 - + i += 1 def revert_captioninsets(document): " Reverts caption insets to old syntax " - + i = 0 while True: i = find_token(document.body, "\\begin_inset Caption Standard", i) if i == -1: return document.body[i] = "\\begin_inset Caption" - i = i + 1 + i += 1 def convert_captionlayouts(document): " Convert caption layouts to caption insets. " - + caption_dict = { "Captionabove": "Above", "Captionbelow": "Below", @@ -3244,29 +3655,28 @@ def convert_captionlayouts(document): "CenteredCaption" : "Centered", "Bicaption" : "Bicaption", } - - i = 0 - while True: - i = find_token(document.body, "\\begin_layout", i) - if i == -1: - return - val = get_value(document.body, "\\begin_layout", i) - if val in caption_dict.keys(): + + for captype in caption_dict.keys(): + i = 0 + while True: + i = find_token(document.body, "\\begin_layout " + captype, i) + if i == -1: + break j = find_end_of_layout(document.body, i) if j == -1: document.warning("Malformed LyX document: Missing `\\end_layout'.") - return + break document.body[j:j] = ["\\end_layout", "", "\\end_inset", "", ""] document.body[i:i+1] = ["\\begin_layout %s" % document.default_layout, - "\\begin_inset Caption %s" % caption_dict[val], "", + "\\begin_inset Caption %s" % caption_dict[captype], "", "\\begin_layout %s" % document.default_layout] - i = i + 1 + i = j + 1 def revert_captionlayouts(document): " Revert caption insets to caption layouts. " - + caption_dict = { "Above" : "Captionabove", "Below" : "Captionbelow", @@ -3275,7 +3685,7 @@ def revert_captionlayouts(document): "Centered" : "CenteredCaption", "Bicaption" : "Bicaption", } - + i = 0 rx = re.compile(r'^\\begin_inset Caption (\S+)$') while True: @@ -3287,10 +3697,10 @@ def revert_captionlayouts(document): val = "" if m: val = m.group(1) - if val not in caption_dict.keys(): - i = i + 1 + if val not in list(caption_dict.keys()): + i += 1 continue - + # We either need to delete the previous \begin_layout line, or we # need to end the previous layout if this inset is not in the first # position of the paragraph. @@ -3353,12 +3763,12 @@ def revert_captionlayouts(document): document.body[i] = "\\begin_layout %s" % caption_dict[val] if document.body[i+1] == "": del document.body[i+1] - i = i + 1 + i += 1 def revert_fragileframe(document): " Reverts beamer FragileFrame layout to ERT " - + beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"] if document.textclass not in beamer_classes: return @@ -3371,15 +3781,15 @@ def revert_fragileframe(document): # Find end of sequence j = find_end_of_sequence(document.body, i) if j == -1: - document.warning("Malformed lyx document. Cannot find end of FragileFrame sequence!") - i = i + 1 + document.warning("Malformed LyX document. Cannot find end of FragileFrame sequence!") + i += 1 continue endseq = j subst = ["\\begin_layout Standard"] + put_cmd_in_ert("\\begin{frame}") - esubst = ["\\end_layout", "", "\\begin_layout Standard"] + put_cmd_in_ert("\\end{frame}") + esubst = ["\\begin_layout Standard"] + put_cmd_in_ert("\\end{frame}") endseq = endseq + len(esubst) - len(document.body[j : j]) if document.body[j] == "\\end_deeper": - document.body[j : j] = ["\\end_deeper", ""] + esubst + document.body[j : j] = [""] + esubst + ["", "\\end_layout"] else: document.body[j : j] = esubst for q in range(i, j): @@ -3440,14 +3850,14 @@ def revert_fragileframe(document): subst += put_cmd_in_ert("{") + content + put_cmd_in_ert("}") elif p == 3: subst += put_cmd_in_ert("[fragile]") - + document.body[i : i + 1] = subst i = j def revert_newframes(document): " Reverts beamer Frame and PlainFrame layouts to old forms " - + beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"] if document.textclass not in beamer_classes: return @@ -3468,23 +3878,23 @@ def revert_newframes(document): val = "" if m: val = m.group(1) - if val not in frame_dict.keys(): - i = i + 1 + if val not in list(frame_dict.keys()): + i += 1 continue # Find end of sequence j = find_end_of_sequence(document.body, i) if j == -1: - document.warning("Malformed lyx document. Cannot find end of Frame sequence!") - i = i + 1 + document.warning("Malformed LyX document. Cannot find end of Frame sequence!") + i += 1 continue endseq = j subst = ["\\begin_layout %s" % frame_dict[val]] - esubst = ["\\end_layout", "", "\\begin_layout EndFrame", "", "\\end_layout"] + esubst = ["", "\\begin_layout EndFrame", "", "\\end_layout"] endseq = endseq + len(esubst) - len(document.body[j : j]) if document.body[j] == "\\end_deeper": - document.body[j : j] = ["\\end_deeper", ""] + esubst - else: document.body[j : j] = esubst + else: + document.body[j+1 : j+1] = esubst for q in range(i, j): if document.body[q] == "\\begin_layout %s" % val: document.body[q] = "\\begin_layout %s" % document.default_layout @@ -3542,7 +3952,7 @@ def revert_newframes(document): # Remove arg inset del document.body[arg : endInset + 1] subst += content - + document.body[i : i + 1] = subst i = j @@ -3584,7 +3994,7 @@ def convert_encodings(document): if i == -1: return val = get_value(document.header, "\\inputencoding", i) - if val in LaTeX2LyX_enc_dict.keys(): + if val in list(LaTeX2LyX_enc_dict.keys()): document.header[i] = "\\inputencoding %s" % LaTeX2LyX_enc_dict[val] elif val not in known_enc_tuple: document.warning("Ignoring unknown input encoding: `%s'" % val) @@ -3625,7 +4035,7 @@ def revert_encodings(document): if i == -1: return val = get_value(document.header, "\\inputencoding", i) - if val in LyX2LaTeX_enc_dict.keys(): + if val in list(LyX2LaTeX_enc_dict.keys()): document.header[i] = "\\inputencoding %s" % LyX2LaTeX_enc_dict[val] elif val not in known_enc_tuple: document.warning("Ignoring unknown input encoding: `%s'" % val) @@ -3667,18 +4077,18 @@ def revert_IEEEtran_3(document): def revert_kurier_fonts(document): " Revert kurier font definition to LaTeX " - + i = find_token(document.header, "\\font_math", 0) if i != -1: - if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1: + if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1: val = get_value(document.header, "\\font_math", i) if val == "kurier-math": add_to_preamble(document, "\\let\\Myrmdefault\\rmdefault\n" \ "\\usepackage[math]{kurier}\n" \ "\\renewcommand{\\rmdefault}{\\Myrmdefault}") document.header[i] = "\\font_math auto" - - if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1: + + if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1: kurier_fonts = ["kurier", "kurierc", "kurierl", "kurierlc"] k = find_token(document.header, "\\font_sans kurier", 0) if k != -1: @@ -3687,13 +4097,35 @@ def revert_kurier_fonts(document): add_to_preamble(document, "\\renewcommand{\\sfdefault}{%s}" % sf) document.header[k] = "\\font_sans default" +def revert_iwona_fonts(document): + " Revert iwona font definition to LaTeX " + + i = find_token(document.header, "\\font_math", 0) + if i != -1: + if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1: + val = get_value(document.header, "\\font_math", i) + if val == "iwona-math": + add_to_preamble(document, "\\let\\Myrmdefault\\rmdefault\n" \ + "\\usepackage[math]{iwona}\n" \ + "\\renewcommand{\\rmdefault}{\\Myrmdefault}") + document.header[i] = "\\font_math auto" + + if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1: + iwona_fonts = ["iwona", "iwonac", "iwonal", "iwonalc"] + k = find_token(document.header, "\\font_sans iwona", 0) + if k != -1: + sf = get_value(document.header, "\\font_sans", k) + if sf in iwona_fonts: + add_to_preamble(document, "\\renewcommand{\\sfdefault}{%s}" % sf) + document.header[k] = "\\font_sans default" + + +def revert_new_libertines(document): + " Revert new libertine font definition to LaTeX " + + if find_token(document.header, "\\use_non_tex_fonts true", 0) != -1: + return -def revert_new_libertines(document): - " Revert new libertine font definition to LaTeX " - - if find_token(document.header, "\\use_non_tex_fonts true", 0) != -1: - return - i = find_token(document.header, "\\font_typewriter libertine-mono", 0) if i != -1: preamble = "\\usepackage" @@ -3706,7 +4138,7 @@ def revert_new_libertines(document): preamble += "{libertineMono-type1}" add_to_preamble(document, [preamble]) document.header[i] = "\\font_typewriter default" - + k = find_token(document.header, "\\font_sans biolinum", 0) if k != -1: preamble = "\\usepackage" @@ -3729,6 +4161,651 @@ def revert_new_libertines(document): document.header[k] = "\\font_sans default" +def convert_lyxframes(document): + " Converts old beamer frames to new style " + + beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"] + if document.textclass not in beamer_classes: + return + + framebeg = ["BeginFrame", "BeginPlainFrame"] + frameend = ["Frame", "PlainFrame", "EndFrame", "BeginFrame", "BeginPlainFrame", "AgainFrame", + "Section", "Section*", "Subsection", "Subsection*", "Subsubsection", "Subsubsection*"] + for lay in framebeg: + i = 0 + while True: + i = find_token_exact(document.body, "\\begin_layout " + lay, i) + if i == -1: + break + parent = get_containing_layout(document.body, i) + if parent == False or parent[1] != i: + document.warning("Wrong parent layout!") + i += 1 + continue + frametype = parent[0] + j = parent[2] + parbeg = parent[3] + if i != -1: + # Step I: Convert ERT arguments + # FIXME: See restrictions in convert_beamerframeargs method + ertend = convert_beamerframeargs(document, i, parbeg) + if ertend == -1: + break + # Step II: Now rename the layout and convert the title to an argument + j = find_end_of_layout(document.body, i) + document.body[j : j + 1] = ['\\end_layout', '', '\\end_inset', '', '\\end_layout'] + if lay == "BeginFrame": + document.body[i] = "\\begin_layout Frame" + else: + document.body[i] = "\\begin_layout PlainFrame" + document.body[ertend + 1 : ertend + 1] = ['\\begin_inset Argument 4', + 'status open', '', '\\begin_layout Plain Layout'] + # Step III: find real frame end + j = j + 8 + jj = j + inInset = get_containing_inset(document.body, i) + while True: + fend = find_token(document.body, "\\begin_layout", jj) + if fend == -1: + document.warning("Malformed LyX document: No real frame end!") + return + val = get_value(document.body, "\\begin_layout", fend) + if val not in frameend: + jj = fend + 1 + continue + # is this frame nested in an inset (e.g., Note)? + if inInset != False: + # if so, end the frame inside the inset + if inInset[2] < fend: + fend = inInset[2] + if val == frametype: + document.body[fend : fend] = ['\\end_deeper', '', '\\begin_layout Separator', '', '\\end_layout'] + # consider explicit EndFrames between two identical frame types + elif val == "EndFrame": + nextlayout = find_token(document.body, "\\begin_layout", fend + 1) + if nextlayout != -1 and get_value(document.body, "\\begin_layout", nextlayout) == frametype: + document.body[fend : fend] = ['\\end_deeper', '', '\\begin_layout Separator', '', '\\end_layout'] + else: + document.body[fend : fend] = ['\\end_deeper'] + else: + document.body[fend : fend] = ['\\end_deeper'] + document.body[j + 1 : j + 1] = ['', '\\begin_deeper'] + break + i = j + + +def remove_endframes(document): + " Remove deprecated beamer endframes " + + beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"] + if document.textclass not in beamer_classes: + return + + i = 0 + while True: + i = find_token_exact(document.body, "\\begin_layout EndFrame", i) + if i == -1: + break + j = find_end_of_layout(document.body, i) + if j == -1: + document.warning("Malformed LyX document: Missing \\end_layout to EndFrame") + i += 1 + continue + del document.body[i : j + 1] + + +def revert_powerdot_flexes(document): + " Reverts powerdot flex insets " + + if document.textclass != "powerdot": + return + + flexes = {"Onslide" : "\\onslide", + "Onslide*" : "\\onslide*", + "Onslide+" : "\\onslide+"} + rx = re.compile(r'^\\begin_inset Flex (.+)$') + + i = 0 + while True: + i = find_token(document.body, "\\begin_inset Flex", i) + if i == -1: + return + m = rx.match(document.body[i]) + if m: + flextype = m.group(1) + z = find_end_of_inset(document.body, i) + if z == -1: + document.warning("Can't find end of Flex " + flextype + " inset.") + i += 1 + continue + if flextype in flexes: + pre = put_cmd_in_ert(flexes[flextype]) + arg = find_token(document.body, "\\begin_inset Argument 1", i, z) + if arg != -1: + argend = find_end_of_inset(document.body, arg) + if argend == -1: + document.warning("Can't find end of Argument!") + i += 1 + continue + # Find containing paragraph layout + beginPlain = find_token(document.body, "\\begin_layout Plain Layout", arg) + endPlain = find_end_of_layout(document.body, beginPlain) + argcontent = document.body[beginPlain + 1 : endPlain] + # Adjust range end + z = z - len(document.body[arg : argend + 1]) + # Remove arg inset + del document.body[arg : argend + 1] + pre += put_cmd_in_ert("{") + argcontent + put_cmd_in_ert("}") + pre += put_cmd_in_ert("{") + beginPlain = find_token(document.body, "\\begin_layout Plain Layout", i) + endPlain = find_end_of_layout(document.body, beginPlain) + # Adjust range end + z = z - len(document.body[i : beginPlain + 1]) + z += len(pre) + document.body[i : beginPlain + 1] = pre + post = put_cmd_in_ert("}") + document.body[z - 2 : z + 1] = post + i += 1 + + +def revert_powerdot_pause(document): + " Reverts powerdot pause layout to ERT " + + if document.textclass != "powerdot": + return + + i = 0 + while True: + i = find_token(document.body, "\\begin_layout Pause", 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 Pause layout") + i += 1 + continue + endlay = j + subst = ["\\begin_layout Standard"] + put_cmd_in_ert("\\pause") + for p in range(i, j): + if p >= endlay: + break + arg = find_token(document.body, "\\begin_inset Argument 1", i, j) + if arg != -1: + beginPlain = find_token(document.body, "\\begin_layout Plain Layout", p) + endPlain = find_end_of_layout(document.body, beginPlain) + endInset = find_end_of_inset(document.body, p) + content = document.body[beginPlain + 1 : endPlain] + # Adjust range end + endlay = endlay - len(document.body[p : endInset + 1]) + # Remove arg inset + del document.body[p : endInset + 1] + subst += put_cmd_in_ert("[") + content + put_cmd_in_ert("]") + + document.body[i : i + 1] = subst + i = endlay + + +def revert_powerdot_itemargs(document): + " Reverts powerdot item arguments to ERT " + + if document.textclass != "powerdot": + return + + i = 0 + list_layouts = ["Itemize", "ItemizeType1", "Enumerate", "EnumerateType1"] + rx = re.compile(r'^\\begin_inset Argument (\S+)$') + + while True: + i = find_token(document.body, "\\begin_inset Argument", i) + if i == -1: + return + # Find containing paragraph layout + parent = get_containing_layout(document.body, i) + if parent == False: + document.warning("Malformed LyX document: Can't find parent paragraph layout") + i += 1 + continue + parbeg = parent[1] + parend = parent[2] + realparbeg = parent[3] + layoutname = parent[0] + realparend = parend + for p in range(parbeg, parend): + if p >= realparend: + i = realparend + break + if layoutname in list_layouts: + m = rx.match(document.body[p]) + if m: + argnr = m.group(1) + if argnr == "item:1": + j = find_end_of_inset(document.body, i) + # Find containing paragraph layout + beginPlain = find_token(document.body, "\\begin_layout Plain Layout", i) + endPlain = find_end_of_layout(document.body, beginPlain) + content = document.body[beginPlain + 1 : endPlain] + del document.body[i:j+1] + subst = put_cmd_in_ert("[") + content + put_cmd_in_ert("]") + document.body[realparbeg : realparbeg] = subst + elif argnr == "item:2": + j = find_end_of_inset(document.body, i) + # Find containing paragraph layout + beginPlain = find_token(document.body, "\\begin_layout Plain Layout", i) + endPlain = find_end_of_layout(document.body, beginPlain) + content = document.body[beginPlain + 1 : endPlain] + del document.body[i:j+1] + subst = put_cmd_in_ert("<") + content + put_cmd_in_ert(">") + document.body[realparbeg : realparbeg] = subst + + i = realparend + + +def revert_powerdot_columns(document): + " Reverts powerdot twocolumn to TeX-code " + if document.textclass != "powerdot": + return + + rx = re.compile(r'^\\begin_inset Argument (\S+)$') + i = 0 + while True: + i = find_token(document.body, "\\begin_layout Twocolumn", 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 Twocolumn layout") + i += 1 + continue + endlay = j + document.body[j : j] = put_cmd_in_ert("}") + document.body[j : j] + endlay += len(put_cmd_in_ert("}")) + subst = ["\\begin_layout Standard"] + put_cmd_in_ert("\\twocolumn") + for p in range(i, j): + if p >= endlay: + break + m = rx.match(document.body[p]) + if m: + argnr = m.group(1) + if argnr == "1": + beginPlain = find_token(document.body, "\\begin_layout Plain Layout", p) + endPlain = find_end_of_layout(document.body, beginPlain) + endInset = find_end_of_inset(document.body, p) + content = document.body[beginPlain + 1 : endPlain] + # Adjust range end + endlay = endlay - len(document.body[p : endInset + 1]) + # Remove arg inset + del document.body[p : endInset + 1] + subst += put_cmd_in_ert("[") + content + put_cmd_in_ert("]") + elif argnr == "2": + beginPlain = find_token(document.body, "\\begin_layout Plain Layout", p) + endPlain = find_end_of_layout(document.body, beginPlain) + endInset = find_end_of_inset(document.body, p) + content = document.body[beginPlain + 1 : endPlain] + # Adjust range end + endlay = endlay - len(document.body[p : endInset + 1]) + # Remove arg inset + del document.body[p : endInset + 1] + subst += put_cmd_in_ert("{") + content + put_cmd_in_ert("}") + + subst += put_cmd_in_ert("{") + document.body[i : i + 1] = subst + i = endlay + + +def revert_mbox_fbox(document): + 'Convert revert mbox/fbox boxes to TeX-code' + i = 0 + while True: + i = find_token(document.body, "\\begin_inset Box", i) + if i == -1: + return + j = find_token(document.body, "width", i) + if j != i + 7: + document.warning("Malformed LyX document: Can't find box width") + return + width = get_value(document.body, "width", j) + k = find_end_of_inset(document.body, j) + if k == -1: + document.warning("Malformed LyX document: Can't find end of box inset") + i += 1 + continue + BeginLayout = find_token(document.body, "\\begin_layout Plain Layout", j) + EndLayout = find_end_of_layout(document.body, BeginLayout) + # replace if width is "" + if (width == '""'): + document.body[EndLayout:k + 1] = put_cmd_in_ert("}") + if document.body[i] == "\\begin_inset Box Frameless": + document.body[i:BeginLayout + 1] = put_cmd_in_ert("\\mbox{") + if document.body[i] == "\\begin_inset Box Boxed": + document.body[i:BeginLayout + 1] = put_cmd_in_ert("\\fbox{") + i += 1 + + +def revert_starred_caption(document): + " Reverts unnumbered longtable caption insets " + + i = 0 + while True: + i = find_token(document.body, "\\begin_inset Caption LongTableNoNumber", i) + if i == -1: + return + # This is not equivalent, but since the caption inset is a full blown + # text inset a true conversion to ERT is too difficult. + document.body[i] = "\\begin_inset Caption Standard" + i += 1 + + +def revert_forced_local_layout(document): + i = 0 + while True: + i = find_token(document.header, "\\begin_forced_local_layout", i) + if i == -1: + return + j = find_end_of(document.header, i, "\\begin_forced_local_layout", "\\end_forced_local_layout") + if j == -1: + # this should not happen + break + regexp = re.compile(r'\s*forcelocal', re.IGNORECASE) + k = find_re(document.header, regexp, i, j) + while k != -1: + del document.header[k] + j = j - 1 + k = find_re(document.header, regexp, i, j) + k = find_token(document.header, "\\begin_local_layout", 0) + if k == -1: + document.header[i] = "\\begin_local_layout" + document.header[j] = "\\end_local_layout" + else: + l = find_end_of(document.header, k, "\\begin_local_layout", "\\end_local_layout") + if j == -1: + # this should not happen + break + lines = document.header[i+1 : j] + if k > i: + document.header[k+1 : k+1] = lines + document.header[i : j ] = [] + else: + document.header[i : j ] = [] + document.header[k+1 : k+1] = lines + + +def revert_aa1(document): + " Reverts InsetArguments of aa to TeX-code " + if document.textclass == "aa": + i = 0 + while True: + if i != -1: + i = find_token(document.body, "\\begin_layout Abstract (structured)", i) + if i != -1: + revert_Argument_to_TeX_brace(document, i, 0, 1, 4, False, False) + i += 1 + if i == -1: + return + + +def revert_aa2(document): + " Reverts InsetArguments of aa to TeX-code " + if document.textclass == "aa": + i = 0 + while True: + if i != -1: + i = find_token(document.body, "\\begin_layout Abstract (structured)", i) + if i != -1: + document.body[i] = "\\begin_layout Abstract" + i += 1 + if i == -1: + return + + +def revert_tibetan(document): + "Set the document language for Tibetan to English" + + if document.language == "tibetan": + document.language = "english" + i = find_token(document.header, "\\language", 0) + if i != -1: + document.header[i] = "\\language english" + j = 0 + while j < len(document.body): + j = find_token(document.body, "\\lang tibetan", j) + if j != -1: + document.body[j] = document.body[j].replace("\\lang tibetan", "\\lang english") + j += 1 + else: + j = len(document.body) + + +############# +# +# Chunk stuff +# +############# + +# The idea here is that we will have a sequence of chunk paragraphs. +# We want to convert them to paragraphs in one or several chunk insets. +# Individual chunks are terminated by the character @ on the last line. +# This line will be discarded, and following lines are treated as new +# chunks, which go into their own insets. +# The first line of a chunk should look like: <>= +# We will discard the delimiters, and put the CONTENT into the +# optional argument of the inset, if the CONTENT is non-empty. +def convert_chunks(document): + first_re = re.compile(r'<<(.*)>>=(.*)') + file_pos = 0 + while True: + # find start of a block of chunks + i = find_token(document.body, "\\begin_layout Chunk", file_pos) + if i == -1: + return + start = i + end = -1 + contents = [] + chunk_started = False + + while True: + # process the one we just found + j = find_end_of_layout(document.body, i) + if j == -1: + document.warning("Malformed LyX documents. Can't find end of Chunk layout!") + # there is no point continuing, as we will run into the same error again. + return + this_chunk = "".join(document.body[i + 1:j]) + + # there may be empty lines between chunks + # we just skip them. + if not chunk_started: + if this_chunk != "": + # new chunk starts + chunk_started = True + + if chunk_started: + contents.append(document.body[i + 1:j]) + + # look for potential chunk terminator + # on the last line of the chunk paragraph + if document.body[j - 1] == "@": + break + + # look for subsequent chunk paragraph + i = find_token(document.body, "\\begin_layout", j) + if i == -1: + break + + if get_value(document.body, "\\begin_layout", i) != "Chunk": + break + + file_pos = end = j + 1 + + # The last chunk should simply have an "@" in it + # or at least end with "@" (can happen if @ is + # preceded by a newline) + lastpar = '' + if len(contents) > 0: + lastpar = ''.join(contents[-1]) + if not lastpar.endswith("@"): + document.warning("Unexpected chunk content: chunk not terminated by '@'!") + if len(contents) == 0: + # convert empty chunk layouts to Standard + document.body[start] = "\\begin_layout Standard" + continue + + if lastpar == "@": + # chunk par only contains "@". Just drop it. + contents.pop() + else: + # chunk par contains more. Only drop the "@". + contents[-1].pop() + + # The first line should look like: <>= + # We want the CONTENT + optarg = ' '.join(contents[0]) + optarg.strip() + # We can already have real chunk content in + # the first par (separated from the options by a newline). + # We collect such stuff to re-insert it later. + postoptstuff = [] + + match = first_re.search(optarg) + if match: + optarg = match.groups()[0] + if match.groups()[1] != "": + postopt = False + for c in contents[0]: + if c.endswith(">>="): + postopt = True + continue + if postopt: + postoptstuff.append(c) + # We have stripped everything. This can be deleted. + contents.pop(0) + + newstuff = ['\\begin_layout Standard'] + + # Maintain paragraph parameters + par_params = ["\\noindent", "\\indent", "\\indent-toggle", "\\leftindent", + "\\start_of_appendix", "\\paragraph_spacing", "\\align", + "\\labelwidthstring"] + parms = start + 1 + while True: + if document.body[parms].split(' ', 1)[0] not in par_params: + break + newstuff.extend([document.body[parms]]) + parms += 1 + + newstuff.extend( + ['\\begin_inset Flex Chunk', + 'status open', '', + '\\begin_layout Plain Layout', '']) + + # If we have a non-empty optional argument, insert it. + if match and optarg != "": + newstuff.extend( + ['\\begin_inset Argument 1', + 'status open', '', + '\\begin_layout Plain Layout', + optarg, + '\\end_layout', '', + '\\end_inset', '']) + + # Since we already opened a Plain layout, the first paragraph + # does not need to do that. + did_one_par = False + if postoptstuff: + # we need to replace newlines with new layouts + start_newline = -1 + started_text = False + for lno in range(0,len(postoptstuff)): + if postoptstuff[lno].startswith("\\begin_inset Newline newline"): + start_newline = lno + elif start_newline != -1: + if postoptstuff[lno].startswith("\\end_inset"): + # replace that bit, but only if we already have some text + # and we're not at the end except for a blank line + if started_text and \ + (lno != len(postoptstuff) - 2 or postoptstuff[-1] != ""): + newstuff.extend(['\\end_layout', '\n', '\\begin_layout Plain Layout', '\n']) + start_newline = -1 + started_text = True + else: + newstuff.extend([postoptstuff[lno]]) + newstuff.append('\\end_layout') + did_one_par = True + for c in contents: + if did_one_par: + newstuff.extend(['', '\\begin_layout Plain Layout', '']) + else: + did_one_par = True + newstuff.extend(c) + newstuff.append('\\end_layout') + + newstuff.extend(['', '\\end_inset', '', '\\end_layout', '']) + + document.body[start:end] = newstuff + + file_pos += len(newstuff) - (end - start) + + +def revert_chunks(document): + i = 0 + while True: + i = find_token(document.body, "\\begin_inset Flex Chunk", i) + if i == -1: + return + + iend = find_end_of_inset(document.body, i) + if iend == -1: + document.warning("Can't find end of Chunk!") + i += 1 + continue + + # Look for optional argument + optarg = "" + ostart = find_token(document.body, "\\begin_inset Argument 1", i, iend) + if ostart != -1: + oend = find_end_of_inset(document.body, ostart) + k = find_token(document.body, "\\begin_layout Plain Layout", ostart, oend) + if k == -1: + document.warning("Malformed LyX document: Can't find argument contents!") + else: + m = find_end_of_layout(document.body, k) + optarg = "".join(document.body[k+1:m]) + + # We now remove the optional argument, so we have something + # uniform on which to work + document.body[ostart : oend + 1] = [] + # iend is now invalid + iend = find_end_of_inset(document.body, i) + + retval = get_containing_layout(document.body, i) + if not retval: + document.warning("Can't find containing layout for Chunk!") + i = iend + continue + (lname, lstart, lend, pstart) = retval + # we now want to work through the various paragraphs, and collect their contents + parlist = [] + k = i + while True: + k = find_token(document.body, "\\begin_layout Plain Layout", k, lend) + if k == -1: + break + j = find_end_of_layout(document.body, k) + if j == -1: + document.warning("Can't find end of layout inside chunk!") + break + parlist.append(document.body[k+1:j]) + k = j + # we now need to wrap all of these paragraphs in chunks + newlines = [] + newlines.extend(["\\begin_layout Chunk", "", "<<" + optarg + ">>=", "\\end_layout", ""]) + for stuff in parlist: + newlines.extend(["\\begin_layout Chunk"] + stuff + ["\\end_layout", ""]) + newlines.extend(["\\begin_layout Chunk", "", "@", "\\end_layout", ""]) + # replace old content with new content + document.body[lstart : lend + 1] = newlines + i = lstart + len(newlines) + + ## # Conversion hub # @@ -3739,13 +4816,16 @@ convert = [ [415, [convert_undertilde]], [416, []], [417, [convert_japanese_encodings]], - [418, []], + [418, [convert_justification]], [419, []], [420, [convert_biblio_style]], [421, [convert_longtable_captions]], [422, [convert_use_packages]], [423, [convert_use_mathtools]], [424, [convert_cite_engine_type]], + # No convert_cancel, since cancel will be loaded automatically + # in format 425 without any possibility to switch it off. + # This has been fixed in format 464. [425, []], [426, []], [427, []], @@ -3761,7 +4841,7 @@ convert = [ [437, []], [438, []], [439, []], - [440, []], + [440, [convert_mathfonts]], [441, [convert_mdnomath]], [442, []], [443, []], @@ -3785,9 +4865,31 @@ convert = [ [461, []], [462, []], [463, [convert_encodings]], + [464, [convert_use_cancel]], + [465, [convert_lyxframes, remove_endframes]], + [466, []], + [467, []], + [468, []], + [469, []], + [470, []], + [471, [convert_cite_engine_type_default]], + [472, []], + [473, []], + [474, [convert_chunks, cleanup_beamerargs]], ] revert = [ + [473, [revert_chunks]], + [472, [revert_tibetan]], + [471, [revert_aa1,revert_aa2]], + [470, [revert_cite_engine_type_default]], + [469, [revert_forced_local_layout]], + [468, [revert_starred_caption]], + [467, [revert_mbox_fbox]], + [466, [revert_iwona_fonts]], + [465, [revert_powerdot_flexes, revert_powerdot_pause, revert_powerdot_itemargs, revert_powerdot_columns]], + [464, []], + [463, [revert_use_cancel]], [462, [revert_encodings]], [461, [revert_new_libertines]], [460, [revert_kurier_fonts]], @@ -3804,7 +4906,7 @@ revert = [ [449, [revert_garamondx, revert_garamondx_newtxmath]], [448, [revert_itemargs]], [447, [revert_literate]], - [446, [revert_IEEEtran, revert_IEEEtran_2, revert_AASTeX, revert_AGUTeX, revert_IJMP, revert_SIGPLAN, revert_SIGGRAPH, revert_EuropeCV, revert_Initials, revert_ModernCV_3]], + [446, [revert_IEEEtran, revert_IEEEtran_2, revert_AASTeX, revert_AGUTeX, revert_IJMP, revert_SIGPLAN, revert_SIGGRAPH, revert_EuropeCV, revert_Initials, revert_ModernCV_3, revert_ModernCV_4]], [445, [revert_latexargs]], [444, [revert_uop]], [443, [revert_biolinum]],