+ 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
+
+
+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:
+ 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:
+ # 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
+
+
+def revert_IEEEtran_2(document):
+ '''
+ Reverts Flex Paragraph Start to TeX-code
+ '''
+ 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
+ if begin == -1:
+ return
+
+
+def convert_IEEEtran(document):
+ '''
+ Converts ERT of
+ Page headings
+ Biography
+ Biography without photo
+ to InsetArgument
+ '''
+ if document.textclass == "IEEEtran":
+ 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:
+ # 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
+
+
+def revert_AASTeX(document):
+ " Reverts InsetArgument of Altaffilation to TeX-code "
+ 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
+ if i == -1:
+ return
+
+
+def convert_AASTeX(document):
+ " Converts ERT of Altaffilation to InsetArgument "
+ 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
+ if i == -1:
+ return
+
+
+def revert_AGUTeX(document):
+ " Reverts InsetArgument of Author affiliation to TeX-code "
+ 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
+ if i == -1:
+ return
+
+
+def convert_AGUTeX(document):
+ " Converts ERT of Author affiliation to InsetArgument "
+ 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
+ if i == -1:
+ return
+
+
+def revert_IJMP(document):
+ " Reverts InsetArgument of MarkBoth to TeX-code "
+ 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
+ if i == -1:
+ return
+
+
+def convert_IJMP(document):
+ " Converts ERT of MarkBoth to InsetArgument "
+ 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
+ if i == -1:
+ return
+
+
+def revert_SIGPLAN(document):
+ " Reverts InsetArguments of SIGPLAN to TeX-code "
+ if document.textclass == "sigplanconf":
+ i = 0
+ j = 0
+ while True:
+ if i != -1:
+ 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
+ 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
+ if i == -1 and j == -1:
+ return
+
+
+def convert_SIGPLAN(document):
+ " Converts ERT of SIGPLAN to InsetArgument "
+ if document.textclass == "sigplanconf":
+ i = 0
+ j = 0
+ while True:
+ 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
+ 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
+ if i == -1 and j == -1:
+ return
+
+
+def revert_SIGGRAPH(document):
+ " Reverts InsetArgument of Flex CRcat to TeX-code "
+ 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
+ if i == -1:
+ return
+
+
+def convert_SIGGRAPH(document):
+ " Converts ERT of Flex CRcat to InsetArgument "
+ 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
+ if i == -1:
+ return
+
+
+def revert_EuropeCV(document):
+ " Reverts InsetArguments of europeCV to TeX-code "
+ if document.textclass == "europecv":
+ i = 0
+ j = 0
+ k = 0
+ m = 0
+ while True:
+ if i != -1:
+ 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
+ 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
+ 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
+ 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
+ if i == -1 and j == -1 and k == -1 and m == -1:
+ return
+
+
+def convert_EuropeCV(document):
+ " Converts ERT of europeCV to InsetArgument "
+ if document.textclass == "europecv":
+ i = 0
+ j = 0
+ k = 0
+ m = 0
+ while True:
+ 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
+ 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
+ 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
+ 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
+ if i == -1 and j == -1 and k == -1 and m == -1:
+ return
+
+
+def revert_ModernCV(document):
+ " Reverts InsetArguments of modernCV to TeX-code "
+ if document.textclass == "moderncv":
+ j = 0
+ k = 0
+ m = 0
+ o = 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
+ 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
+ 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
+ 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:
+ return
+
+
+def revert_ModernCV_2(document):
+ " Reverts the Flex:Column inset of modernCV to TeX-code "
+ if document.textclass == "moderncv":
+ 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
+ if flex == -1:
+ return flexEnd
+
+
+def revert_ModernCV_3(document):
+ " Reverts the Column style of modernCV to TeX-code "
+ if document.textclass == "moderncv":
+ # revert the layouts
+ revert_ModernCV(document)
+ p = 0
+ # 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
+ if p == -1:
+ return
+
+
+def convert_ModernCV(document):
+ " Converts ERT of modernCV to InsetArgument "
+ if document.textclass == "moderncv":
+ i = 0
+ j = 0
+ k = 0
+ m = 0
+ o = 0
+ while True:
+ 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)
+ document.body[o] = document.body[o].replace("\\begin_layout DoubleItem", "\\begin_layout DoubleListItem")
+ i = 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
+ 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
+ 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
+ if i == -1 and j == -1 and k == -1 and m == -1:
+ return
+
+
+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
+ if i == -1:
+ return
+
+
+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
+ if i == -1:
+ return
+
+
+def revert_literate(document):
+ " Revert Literate document to old format "
+ if del_token(document.header, "noweb", 0):
+ document.textclass = "literate-" + document.textclass
+ i = 0
+ while True:
+ i = find_token(document.body, "\\begin_layout Chunk", i)
+ if i == -1:
+ break
+ document.body[i] = "\\begin_layout Scrap"
+ i = i + 1
+
+
+def convert_literate(document):
+ " Convert Literate document to new format"
+ i = find_token(document.header, "\\textclass", 0)
+ if (i != -1) and "literate-" in document.header[i]:
+ document.textclass = document.header[i].replace("\\textclass literate-", "")
+ j = find_token(document.header, "\\begin_modules", 0)
+ if (j != -1):
+ document.header.insert(j + 1, "noweb")
+ else:
+ document.header.insert(i + 1, "\\end_modules")
+ document.header.insert(i + 1, "noweb")
+ document.header.insert(i + 1, "\\begin_modules")
+ i = 0
+ while True:
+ i = find_token(document.body, "\\begin_layout Scrap", i)
+ if i == -1:
+ break
+ document.body[i] = "\\begin_layout Chunk"
+ i = i + 1
+
+
+def revert_itemargs(document):
+ " Reverts \\item arguments to TeX-code "
+ i = 0
+ while True:
+ i = find_token(document.body, "\\begin_inset Argument item:", i)
+ if i == -1:
+ return
+ j = find_end_of_inset(document.body, i)
+ # 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
+ continue
+ parbeg = parent[3]
+ 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[parbeg : parbeg] = subst
+ i = i + 1
+
+
+def revert_garamondx_newtxmath(document):
+ " Revert native garamond newtxmath definition to LaTeX "
+
+ i = find_token(document.header, "\\font_math", 0)
+ if i == -1:
+ return
+ if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1:
+ val = get_value(document.header, "\\font_math", i)
+ if val == "garamondx-ntxm":
+ add_to_preamble(document, "\\usepackage[garamondx]{newtxmath}")
+ document.header[i] = "\\font_math auto"
+
+
+def revert_garamondx(document):
+ " Revert native garamond font definition to LaTeX "
+
+ if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1:
+ i = find_token(document.header, "\\font_roman garamondx", 0)
+ if i != -1:
+ osf = False
+ j = find_token(document.header, "\\font_osf true", 0)
+ if j != -1:
+ osf = True
+ preamble = "\\usepackage"
+ if osf:
+ preamble += "[osfI]"
+ preamble += "{garamondx}"
+ add_to_preamble(document, [preamble])
+ document.header[i] = "\\font_roman default"
+
+
+def convert_beamerargs(document):
+ " Converts beamer arguments to new layout "
+
+ beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"]
+ if document.textclass not in beamer_classes:
+ return
+
+ shifted_layouts = ["Part", "Section", "Subsection", "Subsubsection"]
+ list_layouts = ["Itemize", "Enumerate", "Description"]
+ rx = re.compile(r'^\\begin_inset Argument (\d+)$')
+
+ i = 0
+ 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 = i + 1
+ continue
+ parbeg = parent[1]
+ parend = parent[2]
+ layoutname = parent[0]
+ for p in range(parbeg, parend):
+ if layoutname in shifted_layouts:
+ m = rx.match(document.body[p])
+ if m:
+ argnr = int(m.group(1))
+ argnr += 1
+ document.body[p] = "\\begin_inset Argument %d" % argnr
+ if layoutname == "AgainFrame":
+ m = rx.match(document.body[p])
+ if m:
+ document.body[p] = "\\begin_inset Argument 3"
+ if document.body[p + 4] == "\\begin_inset ERT":
+ if document.body[p + 9].startswith("<"):
+ # This is an overlay specification
+ # strip off the <
+ document.body[p + 9] = document.body[p + 9][1:]
+ if document.body[p + 9].endswith(">"):
+ # strip off the >
+ document.body[p + 9] = document.body[p + 9][:-1]
+ # Shift this one
+ document.body[p] = "\\begin_inset Argument 2"
+ if layoutname in list_layouts:
+ m = rx.match(document.body[p])
+ if m:
+ if m.group(1) == "1":
+ if document.body[p + 4] == "\\begin_inset ERT":
+ if document.body[p + 9].startswith("<"):
+ # This is an overlay specification
+ # strip off the <
+ document.body[p + 9] = document.body[p + 9][1:]
+ if document.body[p + 9].endswith(">"):
+ # strip off the >
+ document.body[p + 9] = document.body[p + 9][:-1]
+ elif layoutname != "Itemize":
+ # Shift this one
+ document.body[p] = "\\begin_inset Argument 2"
+ i = i + 1
+
+
+def convert_againframe_args(document):
+ " Converts beamer AgainFrame to new layout "
+
+ # FIXME: This currently only works if the arguments are in one single ERT
+
+ beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"]
+ if document.textclass not in beamer_classes:
+ return
+
+ i = 0
+ while True:
+ i = find_token(document.body, "\\begin_layout AgainFrame", i)
+ if i == -1:
+ break
+ parent = get_containing_layout(document.body, i)
+ if parent[1] != i:
+ document.warning("Wrong parent layout!")
+ 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
+ i = j
+
+
+def convert_corollary_args(document):
+ " Converts beamer corrolary-style ERT arguments native InsetArgs "
+
+ beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"]
+ if document.textclass not in beamer_classes:
+ return
+
+ corollary_layouts = ["Corollary", "Definition", "Definitions", "Example", "Examples", "Fact", "Proof", "Theorem"]
+ for lay in corollary_layouts:
+ i = 0
+ while True:
+ i = find_token_exact(document.body, "\\begin_layout " + lay, i)
+ if i == -1:
+ break
+ parent = get_containing_layout(document.body, i)
+ if parent[1] != i:
+ document.warning("Wrong parent layout!")
+ 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 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]
+ 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 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"
+ 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 2"
+ i = j
+ continue
+ i = j
+
+
+
+def convert_quote_args(document):
+ " Converts beamer quote style ERT args to native InsetArgs "
+
+ beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"]
+ if document.textclass not in beamer_classes:
+ return
+
+ quote_layouts = ["Uncover", "Only", "Quotation", "Quote", "Verse"]
+ for lay in quote_layouts:
+ i = 0
+ while True:
+ i = find_token(document.body, "\\begin_layout " + lay, i)
+ if i == -1:
+ break
+ parent = get_containing_layout(document.body, i)
+ if parent[1] != i:
+ document.warning("Wrong parent layout!")
+ j = parent[2]
+ parbeg = parent[3]
+ if i != -1:
+ if document.body[parbeg] == "\\begin_inset ERT":
+ if document.body[i + 6].startswith("<"):
+ # This is an overlay specification
+ # strip off the <
+ document.body[i + 6] = document.body[i + 6][1:]
+ if document.body[i + 6].endswith(">"):
+ # strip off the >
+ document.body[i + 6] = document.body[i + 6][:-1]
+ # Convert to ArgInset
+ document.body[i + 1] = "\\begin_inset Argument 1"
+ i = j
+
+
+def revert_beamerargs(document):
+ " Reverts beamer arguments to old layout "
+
+ beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"]
+ if document.textclass not in beamer_classes:
+ return
+
+ i = 0
+ list_layouts = ["Itemize", "Enumerate", "Description"]
+ headings = ["Part", "Section", "Section*", "Subsection", "Subsection*",
+ "Subsubsection", "Subsubsection*", "FrameSubtitle", "NoteItem"]
+ quote_layouts = ["Uncover", "Only", "Quotation", "Quote", "Verse"]
+ corollary_layouts = ["Corollary", "Definition", "Definitions", "Example", "Examples", "Fact", "Proof", "Theorem"]
+ 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 = 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 headings:
+ m = rx.match(document.body[p])
+ if m:
+ argnr = m.group(1)
+ if argnr == "1":
+ # Find containing paragraph layout
+ 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)
+ argcontent = document.body[beginPlain + 1 : endPlain]
+ # Adjust range end
+ realparend = realparend - len(document.body[p : endInset + 1])
+ # Remove arg inset
+ del document.body[p : endInset + 1]
+ if layoutname == "FrameSubtitle":
+ pre = put_cmd_in_ert("\\" + layoutname.lower() + "<") + argcontent + put_cmd_in_ert(">")
+ elif layoutname == "NoteItem":
+ pre = put_cmd_in_ert("\\note<") + argcontent + put_cmd_in_ert(">[item]")
+ elif layoutname.endswith('*'):
+ pre = put_cmd_in_ert("\\lyxframeend\\" + layoutname.lower()[:-1] + "<") + argcontent + put_cmd_in_ert(">*")
+ else:
+ pre = put_cmd_in_ert("\\lyxframeend\\" + layoutname.lower() + "<") + argcontent + put_cmd_in_ert(">")
+ secarg = find_token(document.body, "\\begin_inset Argument 2", parbeg, parend)
+ if secarg != -1:
+ # Find containing paragraph layout
+ beginPlain = find_token(document.body, "\\begin_layout Plain Layout", secarg)
+ endPlain = find_end_of_layout(document.body, beginPlain)
+ endInset = find_end_of_inset(document.body, secarg)
+ argcontent = document.body[beginPlain + 1 : endPlain]
+ # Adjust range end
+ realparend = realparend - len(document.body[secarg : endInset + 1])
+ del document.body[secarg : endInset + 1]
+ pre += put_cmd_in_ert("[") + argcontent + put_cmd_in_ert("]")
+ pre += put_cmd_in_ert("{")
+ document.body[parbeg] = "\\begin_layout Standard"
+ document.body[realparbeg : realparbeg] = pre
+ pe = find_end_of_layout(document.body, parbeg)
+ post = put_cmd_in_ert("}")
+ document.body[pe : pe] = post
+ realparend += len(pre) + len(post)
+ if layoutname == "AgainFrame":
+ m = rx.match(document.body[p])
+ if m:
+ argnr = m.group(1)
+ if argnr == "3":
+ 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
+ realparend = realparend - 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[realparbeg : realparbeg] = subst
+ if layoutname == "Overprint":
+ 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
+ realparend = realparend - 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[realparbeg : realparbeg] = subst
+ if layoutname == "OverlayArea":
+ m = rx.match(document.body[p])
+ if m:
+ argnr = m.group(1)
+ if 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
+ realparend = realparend - 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[realparbeg : realparbeg] = subst
+ if layoutname in list_layouts:
+ 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]
+ subst = put_cmd_in_ert("<") + content + put_cmd_in_ert(">")
+ realparend = realparend + len(subst) - len(content)
+ document.body[beginPlain + 1 : endPlain] = subst
+ elif 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
+ if layoutname in quote_layouts:
+ 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
+ realparend = realparend - 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[realparbeg : realparbeg] = subst
+ if layoutname in corollary_layouts:
+ m = rx.match(document.body[p])
+ if m:
+ argnr = m.group(1)
+ if 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
+ realparend = realparend - 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[realparbeg : realparbeg] = subst
+
+ i = realparend
+
+
+def revert_beamerargs2(document):
+ " Reverts beamer arguments to old layout, step 2 "
+
+ beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"]
+ if document.textclass not in beamer_classes:
+ return
+
+ i = 0
+ shifted_layouts = ["Part", "Section", "Subsection", "Subsubsection"]
+ corollary_layouts = ["Corollary", "Definition", "Definitions", "Example", "Examples", "Fact", "Proof", "Theorem"]
+ 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 = 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 shifted_layouts:
+ m = rx.match(document.body[p])
+ if m:
+ argnr = m.group(1)
+ if argnr == "2":
+ document.body[p] = "\\begin_inset Argument 1"
+ if layoutname in corollary_layouts:
+ 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
+ realparend = realparend - 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[realparbeg : realparbeg] = subst
+ if layoutname == "OverlayArea":
+ 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
+ realparend = realparend - 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[realparbeg : realparbeg] = subst
+ if layoutname == "AgainFrame":
+ m = rx.match(document.body[p])
+ if m:
+ argnr = m.group(1)
+ if 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
+ realparend = realparend - 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[realparbeg : realparbeg] = subst
+ i = realparend
+
+
+def revert_beamerargs3(document):
+ " Reverts beamer arguments to old layout, step 3 "
+
+ beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"]
+ if document.textclass not in beamer_classes:
+ return
+
+ rx = re.compile(r'^\\begin_inset Argument (\S+)$')
+ i = 0
+ 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 = 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 == "AgainFrame":
+ 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
+ realparend = realparend - 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[realparbeg : realparbeg] = subst
+ i = realparend
+
+
+def revert_beamerflex(document):
+ " Reverts beamer Flex insets "
+
+ beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"]
+ if document.textclass not in beamer_classes:
+ return
+
+ new_flexes = {"Bold" : "\\textbf", "Emphasize" : "\\emph", "Only" : "\\only",
+ "Uncover" : "\\uncover", "Visible" : "\\visible",
+ "Invisible" : "\\invisible", "Alternative" : "\\alt",
+ "Beamer_Note" : "\\note"}
+ old_flexes = {"Alert" : "\\alert", "Structure" : "\\structure"}
+ 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 new_flexes:
+ pre = put_cmd_in_ert(new_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(">")
+ arg = find_token(document.body, "\\begin_inset Argument 2", 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]
+ if flextype == "Alternative":
+ pre += put_cmd_in_ert("{") + argcontent + put_cmd_in_ert("}")
+ else:
+ 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
+ elif flextype in old_flexes:
+ pre = put_cmd_in_ert(old_flexes[flextype])
+ arg = find_token(document.body, "\\begin_inset Argument 1", i, z)
+ if arg == -1:
+ i += 1
+ continue
+ 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_beamerblocks(document):
+ " Reverts beamer block arguments to ERT "
+
+ beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"]
+ if document.textclass not in beamer_classes:
+ return
+
+ blocks = ["Block", "ExampleBlock", "AlertBlock"]
+
+ rx = re.compile(r'^\\begin_inset Argument (\S+)$')
+ i = 0
+ 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 = 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 blocks:
+ 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
+ realparend = realparend - 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[realparbeg : realparbeg] = subst
+ 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
+ realparend = realparend - 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[realparbeg : realparbeg] = subst
+ i = realparend
+
+
+
+def convert_beamerblocks(document):
+ " Converts beamer block ERT args to native InsetArgs "
+
+ beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"]
+ if document.textclass not in beamer_classes:
+ return
+
+ blocks = ["Block", "ExampleBlock", "AlertBlock"]
+ for lay in blocks:
+ i = 0
+ while True:
+ i = find_token_exact(document.body, "\\begin_layout " + lay, i)
+ if i == -1:
+ break
+ parent = get_containing_layout(document.body, i)
+ if parent == False or parent[1] != i:
+ document.warning("Wrong parent layout!")
+ i += 1
+ continue
+ j = parent[2]
+ parbeg = parent[3]
+ if i != -1:
+ if document.body[parbeg] == "\\begin_inset ERT":
+ ertcont = parbeg + 5
+ while True:
+ if 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 + 2:-1]]
+ # Convert to ArgInset
+ document.body[parbeg] = "\\begin_inset Argument 1"
+ elif document.body[ertcont].startswith("{"):
+ # This is the block title
+ if document.body[ertcont].endswith("}"):
+ # strip off the braces
+ document.body[ertcont] = document.body[ertcont][1:-1]
+ # Convert to ArgInset
+ document.body[parbeg] = "\\begin_inset Argument 2"
+ elif count_pars_in_inset(document.body, ertcont) > 1:
+ # Multipar ERT. Skip this.
+ break
+ else:
+ convert_TeX_brace_to_Argument(document, i, 2, 2, False, True)
+ else:
+ break
+ j = find_end_of_layout(document.body, i)
+ if j == -1:
+ document.warning("end of layout not found!")
+ k = find_token(document.body, "\\begin_inset Argument", i, j)
+ if k == -1:
+ document.warning("InsetArgument not found!")
+ break
+ l = find_end_of_inset(document.body, k)
+ m = find_token(document.body, "\\begin_inset ERT", l, j)
+ if m == -1:
+ break
+ ertcont = m + 5
+ parbeg = m
+ i = j
+
+
+def convert_overprint(document):
+ " Convert old beamer overprint layouts to ERT "
+
+ beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"]
+ if document.textclass not in beamer_classes:
+ return
+
+ i = 0
+ while True:
+ i = find_token(document.body, "\\begin_layout Overprint", i)
+ if i == -1:
+ return
+ # 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
+ continue
+ endseq = j
+ subst = ["\\begin_layout Standard"] + put_cmd_in_ert("\\begin{overprint}")
+ esubst = list()
+ if document.body[j] == "\\end_deeper":
+ esubst = ["", "\\begin_layout Standard"] + put_cmd_in_ert("\\end{overprint}") + ["\\end_layout"]
+ else:
+ esubst = ["\\end_layout", "", "\\begin_layout Standard"] + put_cmd_in_ert("\\end{overprint}") + ["\\end_layout"]
+ endseq = endseq + len(esubst) - len(document.body[j : j])
+ document.body[j : j] = esubst
+ argbeg = find_token(document.body, "\\begin_inset Argument 1", i, j)
+ 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
+ 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 + 1])
+ # Remove arg inset
+ del document.body[argbeg : argend + 1]
+ subst += put_cmd_in_ert("[") + content + put_cmd_in_ert("]")
+
+ endseq = endseq - len(document.body[i : i])
+ document.body[i : i] = subst + ["\\end_layout"]
+ endseq += len(subst)
+
+ for p in range(i, endseq):
+ if document.body[p] == "\\begin_layout Overprint":
+ document.body[p] = "\\begin_layout Standard"
+
+ i = endseq
+
+
+def revert_overprint(document):
+ " Revert old beamer overprint layouts to ERT "
+
+ beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"]
+ if document.textclass not in beamer_classes:
+ return
+
+ i = 0
+ while True:
+ i = find_token(document.body, "\\begin_layout Overprint", i)
+ if i == -1:
+ return
+ # 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
+ 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}")
+ 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
+ r = i
+ while r < j:
+ if document.body[r] == "\\begin_deeper":
+ s = find_end_of(document.body, r, "\\begin_deeper", "\\end_deeper")
+ if s != -1:
+ document.body[r] = ""
+ document.body[s] = ""
+ r = s
+ continue
+ 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("]")
+
+ endseq = endseq - len(document.body[i : i])
+ document.body[i : i] = subst + ["\\end_layout"]
+ endseq += len(subst)
+
+ p = i
+ while True:
+ if p >= endseq:
+ break
+ 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!")
+ p += 1
+ continue
+ subst = ["\\begin_layout Standard"] + put_cmd_in_ert("\\onslide")
+ argbeg = find_token(document.body, "\\begin_inset Argument item:1", p, q)
+ 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!")
+ p += 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 + 1])
+ # Remove arg inset
+ del document.body[argbeg : argend + 1]
+ subst += put_cmd_in_ert("<") + content + put_cmd_in_ert(">")
+ endseq = endseq - len(document.body[p : p + 1]) + len(subst)
+ document.body[p : p + 1] = subst
+ p = p + 1
+
+ i = endseq
+
+
+def revert_frametitle(document):
+ " Reverts beamer frametitle layout to ERT "
+
+ beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"]
+ if document.textclass not in beamer_classes:
+ return
+
+ rx = re.compile(r'^\\begin_inset Argument (\S+)$')
+ i = 0
+ while True:
+ i = find_token(document.body, "\\begin_layout FrameTitle", 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 FrameTitle layout")
+ i = 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("\\frametitle")
+ 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 convert_epigraph(document):
+ " Converts memoir epigraph to new syntax "
+
+ if document.textclass != "memoir":
+ return
+
+ i = 0
+ while True:
+ i = find_token(document.body, "\\begin_layout Epigraph", 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 Epigraph layout")
+ i = i + 1
+ continue
+ endlay = j
+ subst = list()
+ ert = find_token(document.body, "\\begin_inset ERT", i, j)
+ if ert != -1:
+ endInset = find_end_of_inset(document.body, ert)
+ beginPlain = find_token(document.body, "\\begin_layout Plain Layout", ert)
+ endPlain = find_end_of_layout(document.body, beginPlain)
+ ertcont = beginPlain + 2
+ if document.body[ertcont] == "}{":
+ # strip off the <
+ # Convert to ArgInset
+ endlay = endlay - 2 * len(document.body[j])
+ begsubst = ['\\begin_inset Argument post:1', 'status collapsed', '',
+ '\\begin_layout Plain Layout']
+ endsubst = ['\\end_layout', '', '\\end_inset', '', document.body[j]]
+ document.body[j : j + 1] = endsubst
+ document.body[endInset + 1 : endInset + 1] = begsubst
+ # Adjust range end
+ endlay += len(begsubst) + len(endsubst)
+ endlay = endlay - len(document.body[ert : endInset + 1])
+ del document.body[ert : endInset + 1]
+
+ i = endlay
+
+
+def revert_epigraph(document):
+ " Reverts memoir epigraph argument to ERT "
+
+ if document.textclass != "memoir":
+ return
+
+ i = 0
+ while True:
+ i = find_token(document.body, "\\begin_layout Epigraph", 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 Epigraph layout")
+ i = i + 1
+ continue
+ endlay = j
+ subst = list()
+ p = find_token(document.body, "\\begin_layout Argument post:1", i, j)
+ if p != -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
+ else:
+ subst += put_cmd_in_ert("}{")
+
+ document.body[j : j] = subst + document.body[j : j]
+ i = endlay
+
+
+def convert_captioninsets(document):
+ " Converts caption insets to new syntax "
+
+ i = 0
+ while True:
+ i = find_token(document.body, "\\begin_inset Caption", i)
+ if i == -1:
+ return
+ document.body[i] = "\\begin_inset Caption Standard"
+ i = i + 1
+
+
+def revert_captioninsets(document):
+ " Reverts caption insets to old syntax "
+
+ i = 0
+ while True:
+ i = find_token(document.body, "\\begin_inset Caption Standard", i)
+ if i == -1:
+ return
+ document.body[i] = "\\begin_inset Caption"
+ i = i + 1
+
+
+def convert_captionlayouts(document):
+ " Convert caption layouts to caption insets. "
+
+ caption_dict = {
+ "Captionabove": "Above",
+ "Captionbelow": "Below",
+ "FigCaption" : "FigCaption",
+ "Table_Caption" : "Table",
+ "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():
+ j = find_end_of_layout(document.body, i)
+ if j == -1:
+ document.warning("Malformed LyX document: Missing `\\end_layout'.")
+ return
+
+ document.body[j:j] = ["\\end_layout", "", "\\end_inset", "", ""]
+ document.body[i:i+1] = ["\\begin_layout %s" % document.default_layout,
+ "\\begin_inset Caption %s" % caption_dict[val], "",
+ "\\begin_layout %s" % document.default_layout]
+ i = i + 1
+
+
+def revert_captionlayouts(document):
+ " Revert caption insets to caption layouts. "
+
+ caption_dict = {
+ "Above" : "Captionabove",
+ "Below" : "Captionbelow",
+ "FigCaption" : "FigCaption",
+ "Table" : "Table_Caption",
+ "Centered" : "CenteredCaption",
+ "Bicaption" : "Bicaption",
+ }
+
+ i = 0
+ rx = re.compile(r'^\\begin_inset Caption (\S+)$')
+ while True:
+ i = find_token(document.body, "\\begin_inset Caption", i)
+ if i == -1:
+ return
+
+ m = rx.match(document.body[i])
+ val = ""
+ if m:
+ val = m.group(1)
+ if val not in caption_dict.keys():
+ i = i + 1
+ continue
+
+ # We either need to delete the previous \begin_layout line, or we
+ # need to end the previous layout if this inset is not in the first
+ # position of the paragraph.
+ layout_before = find_token_backwards(document.body, "\\begin_layout", i)
+ if layout_before == -1:
+ document.warning("Malformed LyX document: Missing `\\begin_layout'.")
+ return
+ layout_line = document.body[layout_before]
+ del_layout_before = True
+ l = layout_before + 1
+ while l < i:
+ if document.body[l] != "":
+ del_layout_before = False
+ break
+ l = l + 1
+ if del_layout_before:
+ del document.body[layout_before:i]
+ i = layout_before
+ else:
+ document.body[i:i] = ["\\end_layout", ""]
+ i = i + 2
+
+ # Find start of layout in the inset and end of inset
+ j = find_token(document.body, "\\begin_layout", i)
+ if j == -1:
+ document.warning("Malformed LyX document: Missing `\\begin_layout'.")
+ return
+ k = find_end_of_inset(document.body, i)
+ if k == -1:
+ document.warning("Malformed LyX document: Missing `\\end_inset'.")
+ return
+
+ # We either need to delete the following \end_layout line, or we need
+ # to restart the old layout if this inset is not at the paragraph end.
+ layout_after = find_token(document.body, "\\end_layout", k)
+ if layout_after == -1:
+ document.warning("Malformed LyX document: Missing `\\end_layout'.")
+ return
+ del_layout_after = True
+ l = k + 1
+ while l < layout_after:
+ if document.body[l] != "":
+ del_layout_after = False
+ break
+ l = l + 1
+ if del_layout_after:
+ del document.body[k+1:layout_after+1]
+ else:
+ document.body[k+1:k+1] = [layout_line, ""]
+
+ # delete \begin_layout and \end_inset and replace \begin_inset with
+ # "\begin_layout XXX". This works because we can only have one
+ # paragraph in the caption inset: The old \end_layout will be recycled.
+ del document.body[k]
+ if document.body[k] == "":
+ del document.body[k]
+ del document.body[j]
+ if document.body[j] == "":
+ del document.body[j]
+ document.body[i] = "\\begin_layout %s" % caption_dict[val]
+ if document.body[i+1] == "":
+ del document.body[i+1]
+ i = i + 1
+
+
+def revert_fragileframe(document):
+ " Reverts beamer FragileFrame layout to ERT "
+
+ beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"]
+ if document.textclass not in beamer_classes:
+ return
+
+ i = 0
+ while True:
+ i = find_token(document.body, "\\begin_layout FragileFrame", i)
+ if i == -1:
+ return
+ # 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
+ 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}")
+ 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
+ for q in range(i, j):
+ if document.body[q] == "\\begin_layout FragileFrame":
+ document.body[q] = "\\begin_layout %s" % document.default_layout
+ r = i
+ while r < j:
+ if document.body[r] == "\\begin_deeper":
+ s = find_end_of(document.body, r, "\\begin_deeper", "\\end_deeper")
+ if s != -1:
+ document.body[r] = ""
+ document.body[s] = ""
+ r = s
+ continue
+ r = r + 1
+ for p in range(1, 5):
+ arg = find_token(document.body, "\\begin_inset Argument %d" % p, i, j)
+ if arg != -1:
+ if p == 1:
+ beginPlain = find_token(document.body, "\\begin_layout Plain Layout", arg)
+ endPlain = find_end_of_layout(document.body, beginPlain)
+ endInset = find_end_of_inset(document.body, arg)
+ content = document.body[beginPlain + 1 : endPlain]
+ # Adjust range end
+ j = j - len(document.body[arg : endInset + 1])
+ # Remove arg inset
+ del document.body[arg : endInset + 1]
+ subst += put_cmd_in_ert("<") + content + put_cmd_in_ert(">")
+ elif p == 2:
+ beginPlain = find_token(document.body, "\\begin_layout Plain Layout", arg)
+ endPlain = find_end_of_layout(document.body, beginPlain)
+ endInset = find_end_of_inset(document.body, arg)
+ content = document.body[beginPlain + 1 : endPlain]
+ # Adjust range end
+ j = j - len(document.body[arg : endInset + 1])
+ # Remove arg inset
+ del document.body[arg : endInset + 1]
+ subst += put_cmd_in_ert("[<") + content + put_cmd_in_ert(">]")
+ elif p == 3:
+ beginPlain = find_token(document.body, "\\begin_layout Plain Layout", arg)
+ endPlain = find_end_of_layout(document.body, beginPlain)
+ endInset = find_end_of_inset(document.body, arg)
+ content = document.body[beginPlain + 1 : endPlain]
+ # Adjust range end
+ j = j - len(document.body[arg : endInset + 1])
+ # Remove arg inset
+ del document.body[arg : endInset + 1]
+ subst += put_cmd_in_ert("[fragile,") + content + put_cmd_in_ert("]")
+ elif p == 4:
+ beginPlain = find_token(document.body, "\\begin_layout Plain Layout", arg)
+ endPlain = find_end_of_layout(document.body, beginPlain)
+ endInset = find_end_of_inset(document.body, arg)
+ content = document.body[beginPlain + 1 : endPlain]
+ # Adjust range end
+ j = j - len(document.body[arg : endInset + 1])
+ # Remove arg inset
+ del document.body[arg : endInset + 1]
+ subst += put_cmd_in_ert("{") + content + put_cmd_in_ert("}")
+ elif p == 3:
+ subst += put_cmd_in_ert("[fragile]")
+
+ document.body[i : i + 1] = subst
+ i = j
+
+
+def revert_newframes(document):
+ " Reverts beamer Frame and PlainFrame layouts to old forms "
+
+ beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"]
+ if document.textclass not in beamer_classes:
+ return
+
+ frame_dict = {
+ "Frame" : "BeginFrame",
+ "PlainFrame" : "BeginPlainFrame",
+ }
+
+ rx = re.compile(r'^\\begin_layout (\S+)$')
+ i = 0
+ while True:
+ i = find_token(document.body, "\\begin_layout", i)
+ if i == -1:
+ return
+
+ m = rx.match(document.body[i])
+ val = ""
+ if m:
+ val = m.group(1)
+ if val not in frame_dict.keys():
+ i = 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
+ continue
+ endseq = j
+ subst = ["\\begin_layout %s" % frame_dict[val]]
+ esubst = ["\\end_layout", "", "\\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
+ for q in range(i, j):
+ if document.body[q] == "\\begin_layout %s" % val:
+ document.body[q] = "\\begin_layout %s" % document.default_layout
+ r = i
+ while r < j:
+ if document.body[r] == "\\begin_deeper":
+ s = find_end_of(document.body, r, "\\begin_deeper", "\\end_deeper")
+ if s != -1:
+ document.body[r] = ""
+ document.body[s] = ""
+ r = s
+ continue
+ r = r + 1
+ l = find_end_of_layout(document.body, i)
+ for p in range(1, 5):
+ arg = find_token(document.body, "\\begin_inset Argument %d" % p, i, l)
+ if arg != -1:
+ if p == 1:
+ beginPlain = find_token(document.body, "\\begin_layout Plain Layout", arg)
+ endPlain = find_end_of_layout(document.body, beginPlain)
+ endInset = find_end_of_inset(document.body, arg)
+ content = document.body[beginPlain + 1 : endPlain]
+ # Adjust range end
+ l = l - len(document.body[arg : endInset + 1])
+ # Remove arg inset
+ del document.body[arg : endInset + 1]
+ subst += put_cmd_in_ert("<") + content + put_cmd_in_ert(">")
+ elif p == 2:
+ beginPlain = find_token(document.body, "\\begin_layout Plain Layout", arg)
+ endPlain = find_end_of_layout(document.body, beginPlain)
+ endInset = find_end_of_inset(document.body, arg)
+ content = document.body[beginPlain + 1 : endPlain]
+ # Adjust range end
+ l = l - len(document.body[arg : endInset + 1])
+ # Remove arg inset
+ del document.body[arg : endInset + 1]
+ subst += put_cmd_in_ert("[<") + content + put_cmd_in_ert(">]")
+ elif p == 3:
+ beginPlain = find_token(document.body, "\\begin_layout Plain Layout", arg)
+ endPlain = find_end_of_layout(document.body, beginPlain)
+ endInset = find_end_of_inset(document.body, arg)
+ content = document.body[beginPlain + 1 : endPlain]
+ # Adjust range end
+ l = l - len(document.body[arg : endInset + 1])
+ # Remove arg inset
+ del document.body[arg : endInset + 1]
+ subst += put_cmd_in_ert("[") + content + put_cmd_in_ert("]")
+ elif p == 4:
+ beginPlain = find_token(document.body, "\\begin_layout Plain Layout", arg)
+ endPlain = find_end_of_layout(document.body, beginPlain)
+ endInset = find_end_of_inset(document.body, arg)
+ content = document.body[beginPlain + 1 : endPlain]
+ # Adjust range end
+ l = l - len(document.body[arg : endInset + 1])
+ # Remove arg inset
+ del document.body[arg : endInset + 1]
+ subst += content
+
+ document.body[i : i + 1] = subst
+ i = j
+
+# known encodings that do not change their names (same LyX and LaTeX names)
+known_enc_tuple = ("auto", "default", "ansinew", "applemac", "armscii8", "ascii",
+ "cp437", "cp437de", "cp850", "cp852", "cp855", "cp858", "cp862", "cp865", "cp866",
+ "cp1250", "cp1251", "cp1252", "cp1255", "cp1256", "cp1257", "koi8-r", "koi8-u",
+ "pt154", "pt254", "tis620-0", "utf8", "utf8x", "utf8-plain")
+
+def convert_encodings(document):
+ "Use the LyX names of the encodings instead of the LaTeX names."
+ LaTeX2LyX_enc_dict = {
+ "8859-6": "iso8859-6",
+ "8859-8": "iso8859-8",
+ "Bg5": "big5",
+ "euc": "euc-jp-platex",
+ "EUC-JP": "euc-jp",
+ "EUC-TW": "euc-tw",
+ "GB": "euc-cn",
+ "GBK": "gbk",
+ "iso88595": "iso8859-5",
+ "iso-8859-7": "iso8859-7",
+ "JIS": "jis",
+ "jis": "jis-platex",
+ "KS": "euc-kr",
+ "l7xenc": "iso8859-13",
+ "latin1": "iso8859-1",
+ "latin2": "iso8859-2",
+ "latin3": "iso8859-3",
+ "latin4": "iso8859-4",
+ "latin5": "iso8859-9",
+ "latin9": "iso8859-15",
+ "latin10": "iso8859-16",
+ "SJIS": "shift-jis",
+ "sjis": "shift-jis-platex",
+ "UTF8": "utf8-cjk"
+ }
+ i = find_token(document.header, "\\inputencoding" , 0)
+ if i == -1:
+ return
+ val = get_value(document.header, "\\inputencoding", i)
+ if val in 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)
+
+
+def revert_encodings(document):
+ """Revert to using the LaTeX names of the encodings instead of the LyX names.
+ Also revert utf8-platex to sjis, the language default when using Japanese.
+ """
+ LyX2LaTeX_enc_dict = {
+ "big5": "Bg5",
+ "euc-cn": "GB",
+ "euc-kr": "KS",
+ "euc-jp": "EUC-JP",
+ "euc-jp-platex": "euc",
+ "euc-tw": "EUC-TW",
+ "gbk": "GBK",
+ "iso8859-1": "latin1",
+ "iso8859-2": "latin2",
+ "iso8859-3": "latin3",
+ "iso8859-4": "latin4",
+ "iso8859-5": "iso88595",
+ "iso8859-6": "8859-6",
+ "iso8859-7": "iso-8859-7",
+ "iso8859-8": "8859-8",
+ "iso8859-9": "latin5",
+ "iso8859-13": "l7xenc",
+ "iso8859-15": "latin9",
+ "iso8859-16": "latin10",
+ "jis": "JIS",
+ "jis-platex": "jis",
+ "shift-jis": "SJIS",
+ "shift-jis-platex": "sjis",
+ "utf8-cjk": "UTF8",
+ "utf8-platex": "sjis"
+ }
+ i = find_token(document.header, "\\inputencoding" , 0)
+ if i == -1:
+ return
+ val = get_value(document.header, "\\inputencoding", i)
+ if val in 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)
+
+
+def revert_IEEEtran_3(document):
+ '''
+ Reverts Flex Insets to TeX-code
+ '''
+ if document.textclass == "IEEEtran":
+ h = 0
+ i = 0
+ j = 0
+ while True:
+ if h != -1:
+ h = find_token(document.body, "\\begin_inset Flex Author Mark", h)
+ if h != -1:
+ endh = find_end_of_inset(document.body, h)
+ document.body[endh - 2 : endh + 1] = put_cmd_in_ert("}")
+ document.body[h : h + 4] = put_cmd_in_ert("\\IEEEauthorrefmark{")
+ h = h + 5
+ if i != -1:
+ i = find_token(document.body, "\\begin_inset Flex Author Name", i)
+ if i != -1:
+ endi = find_end_of_inset(document.body, i)
+ document.body[endi - 2 : endi + 1] = put_cmd_in_ert("}")
+ document.body[i : i + 4] = put_cmd_in_ert("\\IEEEauthorblockN{")
+ i = i + 5
+ if j != -1:
+ j = find_token(document.body, "\\begin_inset Flex Author Affiliation", j)
+ if j != -1:
+ endj = find_end_of_inset(document.body, j)
+ document.body[endj - 2 : endj + 1] = put_cmd_in_ert("}")
+ document.body[j : j + 4] = put_cmd_in_ert("\\IEEEauthorblockA{")
+ j = j + 5
+ if i == -1 and j == -1 and h == -1:
+ return
+
+
+def revert_kurier_fonts(document):
+ " Revert kurier font definition to LaTeX "
+
+ i = find_token(document.header, "\\font_math", 0)
+ if i != -1:
+ if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1:
+ val = get_value(document.header, "\\font_math", i)
+ if val == "kurier-math":
+ add_to_preamble(document, "\\let\\Myrmdefault\\rmdefault\n" \
+ "\\usepackage[math]{kurier}\n" \
+ "\\renewcommand{\\rmdefault}{\\Myrmdefault}")
+ document.header[i] = "\\font_math auto"
+
+ if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1:
+ kurier_fonts = ["kurier", "kurierc", "kurierl", "kurierlc"]
+ k = find_token(document.header, "\\font_sans kurier", 0)
+ if k != -1:
+ sf = get_value(document.header, "\\font_sans", k)
+ if sf in kurier_fonts:
+ add_to_preamble(document, "\\renewcommand{\\sfdefault}{%s}" % sf)
+ document.header[k] = "\\font_sans default"
+
+def revert_iwona_fonts(document):
+ " Revert iwona font definition to LaTeX "
+
+ i = find_token(document.header, "\\font_math", 0)
+ if i != -1:
+ if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1:
+ val = get_value(document.header, "\\font_math", i)
+ if val == "iwona-math":
+ add_to_preamble(document, "\\let\\Myrmdefault\\rmdefault\n" \
+ "\\usepackage[math]{iwona}\n" \
+ "\\renewcommand{\\rmdefault}{\\Myrmdefault}")
+ document.header[i] = "\\font_math auto"
+
+ if find_token(document.header, "\\use_non_tex_fonts false", 0) != -1:
+ iwona_fonts = ["iwona", "iwonac", "iwonal", "iwonalc"]
+ k = find_token(document.header, "\\font_sans iwona", 0)
+ if k != -1:
+ sf = get_value(document.header, "\\font_sans", k)
+ if sf in iwona_fonts:
+ add_to_preamble(document, "\\renewcommand{\\sfdefault}{%s}" % sf)
+ document.header[k] = "\\font_sans default"
+
+
+def revert_new_libertines(document):
+ " Revert new libertine font definition to LaTeX "
+
+ if find_token(document.header, "\\use_non_tex_fonts true", 0) != -1:
+ return
+
+ i = find_token(document.header, "\\font_typewriter libertine-mono", 0)
+ if i != -1:
+ preamble = "\\usepackage"
+ sc = find_token(document.header, "\\font_tt_scale", 0)
+ if sc != -1:
+ scval = get_value(document.header, "\\font_tt_scale", sc)
+ if scval != "100":
+ preamble += "[scale=%f]" % (float(scval) / 100)
+ document.header[sc] = "\\font_tt_scale 100"
+ preamble += "{libertineMono-type1}"
+ add_to_preamble(document, [preamble])
+ document.header[i] = "\\font_typewriter default"
+
+ k = find_token(document.header, "\\font_sans biolinum", 0)
+ if k != -1:
+ preamble = "\\usepackage"
+ options = ""
+ j = find_token(document.header, "\\font_osf true", 0)
+ if j != -1:
+ options += "osf"
+ else:
+ options += "lining"
+ sc = find_token(document.header, "\\font_sf_scale", 0)
+ if sc != -1:
+ scval = get_value(document.header, "\\font_sf_scale", sc)
+ if scval != "100":
+ options += ",scale=%f" % (float(scval) / 100)
+ document.header[sc] = "\\font_sf_scale 100"
+ if options != "":
+ preamble += "[" + options +"]"
+ preamble += "{biolinum-type1}"
+ add_to_preamble(document, [preamble])
+ document.header[k] = "\\font_sans default"
+
+
+def convert_lyxframes(document):
+ " Converts old beamer frames to new style "
+
+ beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"]
+ if document.textclass not in beamer_classes:
+ return
+
+ framebeg = ["BeginFrame", "BeginPlainFrame"]
+ frameend = ["EndFrame", "BeginFrame", "BeginPlainFrame", "AgainFrame", "Section", "Section*",
+ "Subsection", "Subsection*", "Subsubsection", "Subsubsection*"]
+ for lay in framebeg:
+ i = 0
+ while True:
+ i = find_token_exact(document.body, "\\begin_layout " + lay, i)
+ if i == -1:
+ break
+ parent = get_containing_layout(document.body, i)
+ if parent == False or parent[1] != i:
+ document.warning("Wrong parent layout!")
+ i += 1
+ continue
+ frametype = parent[0]
+ j = parent[2]
+ parbeg = parent[3]
+ if i != -1:
+ # Step I: Convert ERT arguments
+ # FIXME: 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
+ # Step II: Now rename the layout and convert the title to an argument
+ j = find_end_of_layout(document.body, i)
+ document.body[j : j + 1] = ['\\end_layout', '', '\\end_inset', '', '\\end_layout']
+ if lay == "BeginFrame":
+ document.body[i] = "\\begin_layout Frame"
+ else:
+ document.body[i] = "\\begin_layout PlainFrame"
+ document.body[ertend + 1 : ertend + 1] = ['\\begin_inset Argument 4',
+ 'status open', '', '\\begin_layout Plain Layout']
+ # Step III: find real frame end
+ j = j + 8
+ jj = j
+ while True:
+ fend = find_token(document.body, "\\begin_layout", jj)
+ if fend == -1:
+ document.warning("Malformed LyX document: No real frame end!")
+ return
+ val = get_value(document.body, "\\begin_layout", fend)
+ if val not in frameend:
+ jj = fend + 1
+ continue
+ old = document.body[fend]
+ if val == frametype:
+ document.body[fend : fend] = ['\\end_deeper', '', '\\begin_layout Separator', '', '\\end_layout']
+ else:
+ document.body[fend : fend] = ['\\end_deeper']
+ document.body[j + 1 : j + 1] = ['', '\\begin_deeper']
+ break
+ i = j
+
+
+def remove_endframes(document):
+ " Remove deprecated beamer endframes "
+
+ beamer_classes = ["beamer", "article-beamer", "scrarticle-beamer"]
+ if document.textclass not in beamer_classes:
+ return
+
+ i = 0
+ while True:
+ i = find_token_exact(document.body, "\\begin_layout EndFrame", i)
+ if i == -1:
+ break
+ j = find_end_of_layout(document.body, i)
+ if j == -1:
+ document.warning("Malformed LyX document: Missing \\end_layout to EndFrame")
+ i = 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 = 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 = 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 = 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_token(document.body, "\\end_layout", BeginLayout)
+ # replace if width is "-999col%"
+ if (width == '"-999col%"'):
+ 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 = 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 = 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
+