X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=lib%2Flyx2lyx%2Flyx_2_1.py;h=84f376a52fd95698a22f145a20b8d3720e801df9;hb=e798db5739871aaa29f95de321c52f19058064c9;hp=97fcca76ef1c00ceb4a4060056c3555c49703ec8;hpb=4e803c7ebfc6fc73a21265e427d377473569adc7;p=lyx.git diff --git a/lib/lyx2lyx/lyx_2_1.py b/lib/lyx2lyx/lyx_2_1.py index 97fcca76ef..84f376a52f 100644 --- a/lib/lyx2lyx/lyx_2_1.py +++ b/lib/lyx2lyx/lyx_2_1.py @@ -17,7 +17,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 +28,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 +53,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 +284,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 +296,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 +394,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 +408,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 +423,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): @@ -355,32 +592,73 @@ 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, j) + 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, 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_package(document, pkg): +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{" + pkg + "}", 0) - if j == -1: - document.header.insert(i + 1, "\\use_package " + pkg + " 0") - else: - document.header.insert(i + 1, "\\use_package " + pkg + " 2") + 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_package(document, pkg, commands, oldauto): @@ -414,31 +692,24 @@ def revert_use_package(document, pkg, commands, oldauto): i = j -def convert_use_mathtools(document): - "insert use_package mathtools" - convert_use_package(document, "mathtools") - - -def revert_use_mathtools(document): - "remove use_package mathtools" - commands = ["mathclap", "mathllap", "mathrlap", \ +mathtools_commands = ["mathclap", "mathllap", "mathrlap", \ "lgathered", "rgathered", "vcentcolon", "dblcolon", \ "coloneqq", "Coloneqq", "coloneq", "Coloneq", "eqqcolon", \ "Eqqcolon", "eqcolon", "Eqcolon", "colonapprox", \ "Colonapprox", "colonsim", "Colonsim"] - revert_use_package(document, "mathtools", commands, False) +def convert_use_mathtools(document): + "insert use_package mathtools" + convert_use_package(document, "mathtools", mathtools_commands, False) -def convert_use_stmaryrd(document): - "insert use_package stmaryrd" - convert_use_package(document, "stmaryrd") +def revert_use_mathtools(document): + "remove use_package mathtools" + revert_use_package(document, "mathtools", mathtools_commands, False) -def revert_use_stmaryrd(document): - "remove use_package stmaryrd" - # commands provided by stmaryrd.sty but LyX uses other packages: - # boxdot lightning, bigtriangledown, bigtriangleup - commands = ["shortleftarrow", "shortrightarrow", "shortuparrow", \ +# 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", \ @@ -469,19 +740,25 @@ def revert_use_stmaryrd(document): "varcopyright", "longarrownot", "Longarrownot", \ "Mapsto", "mapsfrom", "Mapsfrom" "Longmapsto", \ "longmapsfrom", "Longmapsfrom"] - revert_use_package(document, "stmaryrd", commands, False) +def convert_use_stmaryrd(document): + "insert use_package stmaryrd" + convert_use_package(document, "stmaryrd", stmaryrd_commands, False) + +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" - convert_use_package(document, "stackrel") + convert_use_package(document, "stackrel", stackrel_commands, False) def revert_use_stackrel(document): "remove use_package stackrel" - commands = ["stackrel"] - revert_use_package(document, "stackrel", commands, False) + revert_use_package(document, "stackrel", stackrel_commands, False) def convert_cite_engine_type(document): @@ -515,65 +792,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"] - revert_use_package(document, "cancel", commands, False) + 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 @@ -581,6 +898,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 @@ -588,24 +908,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] @@ -644,7 +964,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 @@ -660,7 +980,7 @@ def revert_cell_rotation(document): 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): @@ -719,7 +1039,7 @@ def revert_table_rotation(document): 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): @@ -750,7 +1070,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) @@ -771,13 +1091,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): @@ -821,13 +1141,12 @@ def revert_use_amssymb(document): def convert_use_cancel(document): "insert use_package cancel" - convert_use_package(document, "cancel") + convert_use_package(document, "cancel", cancel_commands, True) def revert_use_cancel(document): "remove use_package cancel" - commands = ["cancel", "bcancel", "xcancel", "cancelto"] - revert_use_package(document, "cancel", commands, True) + revert_use_package(document, "cancel", cancel_commands, True) def revert_ancientgreek(document): @@ -934,7 +1253,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) @@ -1046,7 +1365,7 @@ 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}") @@ -1098,7 +1417,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: @@ -1119,7 +1438,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] @@ -1131,6 +1450,10 @@ 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 " @@ -1144,7 +1467,7 @@ 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] @@ -1161,7 +1484,7 @@ def revert_newtxmath(document): "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" @@ -1224,9 +1547,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", @@ -1270,14 +1593,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] @@ -1307,7 +1630,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): @@ -1324,28 +1647,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] @@ -1355,8 +1684,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] @@ -1366,206 +1698,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): @@ -1575,53 +1751,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): @@ -1629,13 +1803,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): @@ -1643,13 +1815,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): @@ -1657,13 +1827,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): @@ -1671,13 +1839,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): @@ -1685,13 +1851,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): @@ -1699,13 +1863,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): @@ -1718,12 +1880,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 @@ -1737,13 +1899,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 @@ -1753,13 +1915,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): @@ -1767,13 +1927,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): @@ -1788,22 +1946,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 @@ -1819,23 +1977,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 @@ -1847,30 +2005,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 @@ -1880,21 +2044,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): @@ -1906,17 +2068,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): @@ -1931,24 +2114,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 @@ -1957,27 +2140,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): @@ -1990,7 +2169,7 @@ def revert_literate(document): if i == -1: break document.body[i] = "\\begin_layout Scrap" - i = i + 1 + i += 1 def convert_literate(document): @@ -2011,7 +2190,7 @@ def convert_literate(document): if i == -1: break document.body[i] = "\\begin_layout Chunk" - i = i + 1 + i += 1 def revert_itemargs(document): @@ -2025,8 +2204,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) @@ -2035,7 +2214,7 @@ 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): @@ -2088,8 +2267,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] @@ -2127,17 +2306,118 @@ def convert_beamerargs(document): if document.body[p + 9].endswith(">"): # strip off the > document.body[p + 9] = document.body[p + 9][:-1] - elif layoutname != "Itemize": + 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 @@ -2153,83 +2433,11 @@ 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 @@ -2254,37 +2462,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 @@ -2323,6 +2564,42 @@ 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 " @@ -2345,8 +2622,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] @@ -2461,8 +2738,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 @@ -2525,8 +2816,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] @@ -2607,8 +2898,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] @@ -2761,8 +3052,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] @@ -2822,43 +3113,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) @@ -2872,7 +3339,7 @@ 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 @@ -2892,8 +3359,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}") @@ -2908,8 +3375,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) @@ -2946,17 +3413,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": @@ -2969,19 +3436,22 @@ 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"] @@ -2994,7 +3464,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") @@ -3002,7 +3472,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) @@ -3035,8 +3505,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] @@ -3087,8 +3557,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() @@ -3128,8 +3598,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() @@ -3160,8 +3630,7 @@ def convert_captioninsets(document): if i == -1: return document.body[i] = "\\begin_inset Caption Standard" - i = i + 1 - + i += 1 def revert_captioninsets(document): @@ -3173,12 +3642,12 @@ def revert_captioninsets(document): 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", @@ -3187,14 +3656,14 @@ 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(): + if val in list(caption_dict.keys()): j = find_end_of_layout(document.body, i) if j == -1: document.warning("Malformed LyX document: Missing `\\end_layout'.") @@ -3204,7 +3673,7 @@ def convert_captionlayouts(document): document.body[i:i+1] = ["\\begin_layout %s" % document.default_layout, "\\begin_inset Caption %s" % caption_dict[val], "", "\\begin_layout %s" % document.default_layout] - i = i + 1 + i += 1 def revert_captionlayouts(document): @@ -3230,8 +3699,8 @@ 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 @@ -3296,7 +3765,7 @@ 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): @@ -3314,15 +3783,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): @@ -3411,23 +3880,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 @@ -3527,7 +3996,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) @@ -3568,7 +4037,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) @@ -3630,6 +4099,28 @@ 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 " @@ -3680,8 +4171,8 @@ def convert_lyxframes(document): return framebeg = ["BeginFrame", "BeginPlainFrame"] - frameend = ["EndFrame", "BeginFrame", "BeginPlainFrame", "AgainFrame", "Section", "Section*", - "Subsection", "Subsection*", "Subsubsection", "Subsubsection*"] + frameend = ["Frame", "PlainFrame", "EndFrame", "BeginFrame", "BeginPlainFrame", "AgainFrame", + "Section", "Section*", "Subsection", "Subsection*", "Subsubsection", "Subsubsection*"] for lay in framebeg: i = 0 while True: @@ -3698,88 +4189,10 @@ def convert_lyxframes(document): parbeg = parent[3] if i != -1: # Step I: Convert ERT arguments - # FIXME: This currently only works if the arguments are in one single ERT - ertend = i - if document.body[parbeg] == "\\begin_inset ERT": - ertend = find_end_of_inset(document.body, parbeg) - if ertend == -1: - document.warning("Malformed LyX document: missing ERT \\end_inset") - continue - 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" - # End of argument conversion + # 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'] @@ -3792,6 +4205,7 @@ def convert_lyxframes(document): # 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: @@ -3801,9 +4215,20 @@ def convert_lyxframes(document): if val not in frameend: jj = fend + 1 continue - old = document.body[fend] + # 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'] @@ -3826,11 +4251,563 @@ def remove_endframes(document): j = find_end_of_layout(document.body, i) if j == -1: document.warning("Malformed LyX document: Missing \\end_layout to EndFrame") - i = i + 1 + 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 # @@ -3841,13 +4818,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, []], @@ -3863,7 +4843,7 @@ convert = [ [437, []], [438, []], [439, []], - [440, []], + [440, [convert_mathfonts]], [441, [convert_mdnomath]], [442, []], [443, []], @@ -3888,10 +4868,28 @@ convert = [ [462, []], [463, [convert_encodings]], [464, [convert_use_cancel]], - [465, [convert_lyxframes, remove_endframes]] + [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]], @@ -3910,7 +4908,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]],