####################################################################
# Private helper functions
+def remove_option(document, m, option):
+ l = document.body[m].find(option)
+ if l != -1:
+ val = document.body[m][l:].split('"')[1]
+ document.body[m] = document.body[m][:l - 1] + document.body[m][l+len(option + '="' + val + '"'):]
+ return l
+
def find_end_of_inset(lines, i):
" Find end of inset, where lines[i] is included."
return find_end_of(lines, i, "\\begin_inset", "\\end_inset")
+# Note that text can be either a list of lines or a single line.
def add_to_preamble(document, text):
""" Add text to the preamble if it is not already there.
Only the first line is checked!"""
+ if not type(text) is list:
+ # split on \n just in case
+ # it'll give us the one element list we want
+ # if there's no \n, too
+ text = text.split('\n')
+
if find_token(document.preamble, text[0], 0) != -1:
return
return string
-# This routine wraps some content in an ERT inset. It returns a
-# LIST of strings. This is how lyx2lyx works: with a list of strings,
-# each representing a line of a LyX file. Embedded newlines confuse
+# This routine wraps some content in an ERT inset.
+#
+# NOTE: The function accepts either a single string or a LIST of strings as
+# argument. But it returns a LIST of strings, split on \n, so that it does
+# not have embedded newlines.
+#
+# This is how lyx2lyx represents a LyX document: as a list of strings,
+# each representing a line of a LyX file. Embedded newlines confuse
# lyx2lyx very much.
-# For this same reason, we expect as input a LIST of strings, not
-# something with embedded newlines. That said, if any of your strings
-# do have embedded newlines, the string will eventually get split on
-# them and you'll get a list back.
#
# A call to this routine will often go something like this:
# i = find_token('\\begin_inset FunkyInset', ...)
# ...
# j = find_end_of_inset(document.body, i)
# content = ...extract content from insets
+# # that could be as simple as:
+# # content = lyx2latex(document[i:j + 1])
# ert = put_cmd_in_ert(content)
# document.body[i:j] = ert
# Now, before we continue, we need to reset i appropriately. Normally,
# this would be:
# i += len(ert)
# That puts us right after the ERT we just inserted.
-def put_cmd_in_ert(strlist):
- ret = ["\\begin_inset ERT", "status collapsed", "\\begin_layout Plain Layout\n"]
+#
+def put_cmd_in_ert(arg):
+ ret = ["\\begin_inset ERT", "status collapsed", "\\begin_layout Plain Layout", ""]
# Despite the warnings just given, it will be faster for us to work
# with a single string internally. That way, we only go through the
# unicode_reps loop once.
- s = "\n".join(strlist)
+ if type(arg) is list:
+ s = "\n".join(arg)
+ else:
+ s = arg
for rep in unicode_reps:
- s = s.replace(rep[1], rep[0].replace('\\\\', '\\'))
+ s = s.replace(rep[1], rep[0].replace('\\\\', '\\'))
s = s.replace('\\', "\\backslash\n")
ret += s.splitlines()
ret += ["\\end_layout", "\\end_inset"]
# clean up multiline stuff
content = ""
ert_end = 0
+ note_end = 0
+ hspace = ""
for curline in range(len(lines)):
line = lines[curline]
- if line.startswith("\\begin_inset ERT"):
+ if line.startswith("\\begin_inset Note Note"):
+ # We want to skip LyX notes, so remember where the inset ends
+ note_end = find_end_of_inset(lines, curline + 1)
+ continue
+ elif note_end >= curline:
+ # Skip LyX notes
+ continue
+ elif line.startswith("\\begin_inset ERT"):
# We don't want to replace things inside ERT, so figure out
# where the end of the inset is.
ert_end = find_end_of_inset(lines, curline + 1)
line = "''"
else:
line = "'"
+ elif line.startswith("\\begin_inset space"):
+ line = line[18:].strip()
+ if line.startswith("\\hspace"):
+ # Account for both \hspace and \hspace*
+ hspace = line[:-2]
+ continue
+ elif line == "\\space{}":
+ line = "\\ "
+ elif line == "\\thinspace{}":
+ line = "\\,"
+ elif hspace != "":
+ # The LyX length is in line[8:], after the \length keyword
+ # latex_length returns "bool,length"
+ length = latex_length(line[8:]).split(",")[1]
+ line = hspace + "{" + length + "}"
+ hspace = ""
elif line.isspace() or \
line.startswith("\\begin_layout") or \
line.startswith("\\end_layout") or \
# a lossless reversion is not possible
# try at least to handle some common insets and settings
if ert_end >= curline:
- line = line.replace(r'\backslash', r'\\')
+ line = line.replace(r'\backslash', '\\')
else:
- line = line.replace('&', '\\&{}')
- line = line.replace('#', '\\#{}')
- line = line.replace('^', '\\^{}')
- line = line.replace('%', '\\%{}')
- line = line.replace('_', '\\_{}')
- line = line.replace('$', '\\${}')
+ # No need to add "{}" after single-nonletter macros
+ line = line.replace('&', '\\&')
+ line = line.replace('#', '\\#')
+ line = line.replace('^', '\\textasciicircum{}')
+ line = line.replace('%', '\\%')
+ line = line.replace('_', '\\_')
+ line = line.replace('$', '\\$')
# Do the LyX text --> LaTeX conversion
for rep in unicode_reps:
# Convert relative lengths to LaTeX units
units = {"text%":"\\textwidth", "col%":"\\columnwidth",
- "page%":"\\pagewidth", "line%":"\\linewidth",
- "theight%":"\\textheight", "pheight%":"\\pageheight"}
+ "page%":"\\paperwidth", "line%":"\\linewidth",
+ "theight%":"\\textheight", "pheight%":"\\paperheight"}
for unit in units.keys():
i = string.find(unit)
if i != -1:
end = string[i + len(unit):]
string = value + latex_unit + end
if plus > minus:
- value = string[plus+1:i]
+ value = string[plus + 1:i]
value = str(float(value)/100)
- begin = string[:plus+1]
+ begin = string[:plus + 1]
end = string[i+len(unit):]
string = begin + value + latex_unit + end
if plus < minus:
- value = string[minus+1:i]
+ value = string[minus + 1:i]
value = str(float(value)/100)
- begin = string[:minus+1]
+ begin = string[:minus + 1]
string = begin + value + latex_unit
# replace + and -, but only if the - is not the first character
return "False," + string
else:
return "True," + string
-
+
+
+def revert_flex_inset(document, name, LaTeXname, position):
+ " Convert flex insets to TeX code "
+ i = position
+ while True:
+ i = find_token(document.body, '\\begin_inset Flex ' + name, i)
+ if i == -1:
+ return
+ z = find_end_of_inset(document.body, i)
+ if z == -1:
+ document.warning("Malformed LyX document: Can't find end of Flex " + name + " inset.")
+ return
+ # remove the \end_inset
+ document.body[z - 2:z + 1] = put_cmd_in_ert("}")
+ # we need to reset character layouts if necessary
+ j = find_token(document.body, '\\emph on', i)
+ k = find_token(document.body, '\\noun on', i)
+ l = find_token(document.body, '\\series', i)
+ m = find_token(document.body, '\\family', i)
+ n = find_token(document.body, '\\shape', i)
+ o = find_token(document.body, '\\color', i)
+ p = find_token(document.body, '\\size', i)
+ q = find_token(document.body, '\\bar under', i)
+ r = find_token(document.body, '\\uuline on', i)
+ s = find_token(document.body, '\\uwave on', i)
+ t = find_token(document.body, '\\strikeout on', i)
+ if j != -1 and j < z:
+ document.body.insert(z - 2, "\\emph default")
+ if k != -1 and k < z:
+ document.body.insert(z - 2, "\\noun default")
+ if l != -1 and l < z:
+ document.body.insert(z - 2, "\\series default")
+ if m != -1 and m < z:
+ document.body.insert(z - 2, "\\family default")
+ if n != -1 and n < z:
+ document.body.insert(z - 2, "\\shape default")
+ if o != -1 and o < z:
+ document.body.insert(z - 2, "\\color inherit")
+ if p != -1 and p < z:
+ document.body.insert(z - 2, "\\size default")
+ if q != -1 and q < z:
+ document.body.insert(z - 2, "\\bar default")
+ if r != -1 and r < z:
+ document.body.insert(z - 2, "\\uuline default")
+ if s != -1 and s < z:
+ document.body.insert(z - 2, "\\uwave default")
+ if t != -1 and t < z:
+ document.body.insert(z - 2, "\\strikeout default")
+ document.body[i:i + 4] = put_cmd_in_ert(LaTeXname + "{")
+ i += 1
+
+
+def revert_charstyles(document, name, LaTeXname, changed):
+ " Reverts character styles to TeX code "
+ i = 0
+ while True:
+ i = find_token(document.body, name + ' on', i)
+ if i == -1:
+ return changed
+ j = find_token(document.body, name + ' default', i)
+ k = find_token(document.body, name + ' on', i + 1)
+ # if there is no default set, the style ends with the layout
+ # assure hereby that we found the correct layout end
+ if j != -1 and (j < k or k == -1):
+ document.body[j:j + 1] = put_cmd_in_ert("}")
+ else:
+ j = find_token(document.body, '\\end_layout', i)
+ document.body[j:j] = put_cmd_in_ert("}")
+ document.body[i:i + 1] = put_cmd_in_ert(LaTeXname + "{")
+ changed = True
+ i += 1
+
+
+def revert_layout_command(document, name, LaTeXname, position):
+ " Reverts a command from a layout to TeX code "
+ i = position
+ while True:
+ i = find_token(document.body, '\\begin_layout ' + name, i)
+ if i == -1:
+ return
+ k = -1
+ # find the next layout
+ j = i + 1
+ while k == -1:
+ j = find_token(document.body, '\\begin_layout', j)
+ l = len(document.body)
+ # if nothing was found it was the last layout of the document
+ if j == -1:
+ document.body[l - 4:l - 4] = put_cmd_in_ert("}")
+ k = 0
+ # exclude plain layout because this can be TeX code or another inset
+ elif document.body[j] != '\\begin_layout Plain Layout':
+ document.body[j - 2:j - 2] = put_cmd_in_ert("}")
+ k = 0
+ else:
+ j += 1
+ document.body[i] = '\\begin_layout Standard'
+ document.body[i + 1:i + 1] = put_cmd_in_ert(LaTeXname + "{")
+ i += 1
+
####################################################################
continue
# don't set a box for longtables, only delete tabularvalignment
# the alignment is 2 lines below \\begin_inset Tabular
- p = document.body[i+2].find("islongtable")
+ p = document.body[i + 2].find("islongtable")
if p > -1:
- q = document.body[i+2].find("tabularvalignment")
+ q = document.body[i + 2].find("tabularvalignment")
if q > -1:
- document.body[i+2] = document.body[i+2][:q-1]
- document.body[i+2] = document.body[i+2] + '>'
+ document.body[i + 2] = document.body[i + 2][:q - 1]
+ document.body[i + 2] = document.body[i + 2] + '>'
i = i + 1
# when no longtable
if p == -1:
tabularvalignment = 'c'
# which valignment is specified?
- m = document.body[i+2].find('tabularvalignment="top"')
+ m = document.body[i + 2].find('tabularvalignment="top"')
if m > -1:
tabularvalignment = 't'
- m = document.body[i+2].find('tabularvalignment="bottom"')
+ m = document.body[ i+ 2].find('tabularvalignment="bottom"')
if m > -1:
tabularvalignment = 'b'
# delete tabularvalignment
- q = document.body[i+2].find("tabularvalignment")
+ q = document.body[i + 2].find("tabularvalignment")
if q > -1:
- document.body[i+2] = document.body[i+2][:q-1]
- document.body[i+2] = document.body[i+2] + '>'
+ document.body[i + 2] = document.body[i + 2][:q - 1]
+ document.body[i + 2] = document.body[i + 2] + '>'
# don't add a box when centered
if tabularvalignment == 'c':
'\\begin_layout Plain Layout\n\n\n\\backslash\n' \
'phantom{\n\\end_layout\n\n\\end_inset\n')
substi = substi.split('\n')
- document.body[i : i+4] = substi
+ document.body[i:i + 4] = substi
i += len(substi)
j = find_token(document.body, "\\end_layout", i)
if j == -1:
'\\begin_layout Plain Layout\n\n' \
'}\n\\end_layout\n\n\\end_inset\n')
substj = substj.split('\n')
- document.body[j : j+4] = substj
+ document.body[j:j + 4] = substj
i += len(substj)
'\\begin_layout Plain Layout\n\n\n\\backslash\n' \
'hphantom{\n\\end_layout\n\n\\end_inset\n')
substi = substi.split('\n')
- document.body[i : i+4] = substi
+ document.body[i:i + 4] = substi
i += len(substi)
j = find_token(document.body, "\\end_layout", i)
if j == -1:
'\\begin_layout Plain Layout\n\n' \
'}\n\\end_layout\n\n\\end_inset\n')
substj = substj.split('\n')
- document.body[j : j+4] = substj
+ document.body[j:j + 4] = substj
i += len(substj)
'\\begin_layout Plain Layout\n\n\n\\backslash\n' \
'vphantom{\n\\end_layout\n\n\\end_inset\n')
substi = substi.split('\n')
- document.body[i : i+4] = substi
+ document.body[i:i + 4] = substi
i += len(substi)
j = find_token(document.body, "\\end_layout", i)
if j == -1:
'\\begin_layout Plain Layout\n\n' \
'}\n\\end_layout\n\n\\end_inset\n')
substj = substj.split('\n')
- document.body[j : j+4] = substj
+ document.body[j:j + 4] = substj
i += len(substj)
ishortcut = get_value(document.header, '\\shortcut', i, k)
if ishortcut != "" and indices == "true":
preamble += "\\newindex[" + iname + "]{" + ishortcut + "}\n"
- del document.header[i:k+1]
+ del document.header[i:k + 1]
i = 0
if preamble != "":
insert_to_preamble(0, document, preamble)
# escape quotes
content = content.replace('"', r'\"')
subst = [old_put_cmd_in_ert("\\sindex[" + itype + "]{" + content + "}")]
- document.body[i:k+1] = subst
+ document.body[i:k + 1] = subst
i = i + 1
i = 0
while True:
j = find_token(document.body, "type", i, k)
del document.body[j]
elif indices == "false":
- del document.body[i:k+1]
+ del document.body[i:k + 1]
else:
subst = [old_put_cmd_in_ert("\\printindex[" + ptype + "]{}")]
- document.body[i:k+1] = subst
+ document.body[i:k + 1] = subst
i = i + 1
continue
ptype = get_value(document.body, 'type', i, k).strip('"')
if indices == "false":
- del document.body[i:k+1]
+ del document.body[i:k + 1]
else:
subst = [old_put_cmd_in_ert("\\printsubindex[" + ptype + "]{}")]
- document.body[i:k+1] = subst
+ document.body[i:k + 1] = subst
i = i + 1
i = i + 1
continue
if indices == "false":
- del document.body[i:k+1]
+ del document.body[i:k + 1]
else:
subst = [old_put_cmd_in_ert("\\" + ctype + "{}")]
- document.body[i:k+1] = subst
+ document.body[i:k + 1] = subst
i = i + 1
def revert_strikeout(document):
- " Reverts \\strikeout character style "
- while True:
- i = find_token(document.body, '\\strikeout', 0)
- if i == -1:
- return
- del document.body[i]
-
-
-def revert_uulinewave(document):
- " Reverts \\uuline, and \\uwave character styles "
- while True:
- i = find_token(document.body, '\\uuline', 0)
- if i == -1:
- break
- del document.body[i]
- while True:
- i = find_token(document.body, '\\uwave', 0)
- if i == -1:
- return
- del document.body[i]
+ " Reverts \\strikeout character style "
+ changed = False
+ changed = revert_charstyles(document, "\\uuline", "\\uuline", changed)
+ changed = revert_charstyles(document, "\\uwave", "\\uwave", changed)
+ changed = revert_charstyles(document, "\\strikeout", "\\sout", changed)
+ if changed == True:
+ insert_to_preamble(0, document,
+ '% Commands inserted by lyx2lyx for proper underlining\n'
+ + '\\PassOptionsToPackage{normalem}{ulem}\n'
+ + '\\usepackage{ulem}\n')
def revert_ulinelatex(document):
if i == -1:
break
# the alignment is 2 lines below \\begin_inset Tabular
- j = document.body[i+2].find("longtabularalignment")
+ j = document.body[i + 2].find("longtabularalignment")
if j == -1:
break
- document.body[i+2] = document.body[i+2][:j-1]
- document.body[i+2] = document.body[i+2] + '>'
+ document.body[i + 2] = document.body[i + 2][:j - 1]
+ document.body[i + 2] = document.body[i + 2] + '>'
i = i + 1
subst = [old_put_cmd_in_ert("\\vspace*{" + length + "}")]
else:
subst = [old_put_cmd_in_ert("\\vspace{" + length + "}")]
- document.body[i:i+2] = subst
+ document.body[i:i + 2] = subst
i = i + 1
protected = (document.body[i].find("\\hspace*{}") != -1)
# only revert if a custom length was set and if
# it used a percent length
- length = get_value(document.body, '\\length', i+1)
+ length = get_value(document.body, '\\length', i + 1)
if length == '':
document.warning("Malformed lyx document: Missing '\\length' in Space inset.")
return
subst = [old_put_cmd_in_ert("\\hspace*{" + length + "}")]
else:
subst = [old_put_cmd_in_ert("\\hspace{" + length + "}")]
- document.body[i:i+3] = subst
+ document.body[i:i + 3] = subst
i = i + 2
if i == -1:
break
protected = (document.body[i].find("\\hspace*{}") != -1)
- length = get_value(document.body, '\\length', i+1)
+ length = get_value(document.body, '\\length', i + 1)
if length == '':
document.warning("Malformed lyx document: Missing '\\length' in Space inset.")
return
subst = [old_put_cmd_in_ert("\\hspace*{" + length + "}")]
else:
subst = [old_put_cmd_in_ert("\\hspace{" + length + "}")]
- document.body[i:i+3] = subst
+ document.body[i:i + 3] = subst
i = i + 2
def convert_author_id(document):
i = 0
j = 0
k = 0
+ mhchem = "off"
i = find_token(document.header, "\\use_mhchem 1", 0)
if i != -1:
mhchem = "auto"
#If the layout is Standard we need to remove it, otherwise there
#will be paragraph breaks that shouldn't be there.
k = find_token(document.body, "\\begin_layout Standard", i)
- if k == i+2:
- del document.body[i : i+3]
- del document.body[j-5 : j-2]
+ if k == i + 2:
+ del document.body[i:i + 3]
+ del document.body[j - 5:j - 2]
i -= 6
else:
del document.body[i]
- del document.body[j-1]
+ del document.body[j - 1]
i -= 2
if found != -1:
has_equal_spacing = True
content = [document.body[i][21:]]
- content += document.body[i+1:j]
+ content += document.body[i + 1:j]
subst = put_cmd_in_ert(content)
- document.body[i:j+1] = subst
+ document.body[i:j + 1] = subst
i += len(subst)
else:
for curline in range(i,j):
+ ', ' + str(blueout) + '}\n')
+def revert_lyx_version(document):
+ " Reverts LyX Version information from Inset Info "
+ version = "LyX version"
+ try:
+ import lyx2lyx_version
+ version = lyx2lyx_version.version
+ except:
+ pass
+
+ i = 0
+ while 1:
+ i = find_token(document.body, '\\begin_inset Info', i)
+ if i == -1:
+ return
+ j = find_end_of_inset(document.body, i + 1)
+ if j == -1:
+ # should not happen
+ document.warning("Malformed LyX document: Could not find end of Info inset.")
+ # We expect:
+ # \begin_inset Info
+ # type "lyxinfo"
+ # arg "version"
+ # \end_inset
+ # but we shall try to be forgiving.
+ arg = typ = ""
+ for k in range(i, j):
+ if document.body[k].startswith("arg"):
+ arg = document.body[k][3:].strip().strip('"')
+ if document.body[k].startswith("type"):
+ typ = document.body[k][4:].strip().strip('"')
+ if arg != "version" or typ != "lyxinfo":
+ i = j + 1
+ continue
+
+ # We do not actually know the version of LyX used to produce the document.
+ # But we can use our version, since we are reverting.
+ s = [version]
+ # Now we want to check if the line after "\end_inset" is empty. It normally
+ # is, so we want to remove it, too.
+ lastline = j + 1
+ if document.body[j + 1].strip() == "":
+ lastline = j + 2
+ document.body[i: lastline] = s
+ i = i + 1
+
+
+def revert_math_scale(document):
+ " Remove math scaling and LaTeX options "
+ i = find_token(document.header, '\\html_math_img_scale', 0)
+ if i != -1:
+ del document.header[i]
+ i = find_token(document.header, '\\html_latex_start', 0)
+ if i != -1:
+ del document.header[i]
+ i = find_token(document.header, '\\html_latex_end', 0)
+ if i != -1:
+ del document.header[i]
+
+
+def revert_pagesizes(document):
+ i = 0
+ " Revert page sizes to default "
+ i = find_token(document.header, '\\papersize', 0)
+ if i != -1:
+ size = document.header[i][11:]
+ if size == "a0paper" or size == "a1paper" or size == "a2paper" \
+ or size == "a6paper" or size == "b0paper" or size == "b1paper" \
+ or size == "b2paper" or size == "b6paper" or size == "b0j" \
+ or size == "b1j" or size == "b2j" or size == "b3j" or size == "b4j" \
+ or size == "b5j" or size == "b6j":
+ del document.header[i]
+
+
+def revert_DIN_C_pagesizes(document):
+ i = 0
+ " Revert DIN C page sizes to default "
+ i = find_token(document.header, '\\papersize', 0)
+ if i != -1:
+ size = document.header[i][11:]
+ if size == "c0paper" or size == "c1paper" or size == "c2paper" \
+ or size == "c3paper" or size == "c4paper" or size == "c5paper" \
+ or size == "c6paper":
+ del document.header[i]
+
+
+def convert_html_quotes(document):
+ " Remove quotes around html_latex_start and html_latex_end "
+
+ i = find_token(document.header, '\\html_latex_start', 0)
+ if i != -1:
+ line = document.header[i]
+ l = re.compile(r'\\html_latex_start\s+"(.*)"')
+ m = l.match(line)
+ if m != None:
+ document.header[i] = "\\html_latex_start " + m.group(1)
+
+ i = find_token(document.header, '\\html_latex_end', 0)
+ if i != -1:
+ line = document.header[i]
+ l = re.compile(r'\\html_latex_end\s+"(.*)"')
+ m = l.match(line)
+ if m != None:
+ document.header[i] = "\\html_latex_end " + m.group(1)
+
+
+def revert_html_quotes(document):
+ " Remove quotes around html_latex_start and html_latex_end "
+
+ i = find_token(document.header, '\\html_latex_start', 0)
+ if i != -1:
+ line = document.header[i]
+ l = re.compile(r'\\html_latex_start\s+(.*)')
+ m = l.match(line)
+ document.header[i] = "\\html_latex_start \"" + m.group(1) + "\""
+
+ i = find_token(document.header, '\\html_latex_end', 0)
+ if i != -1:
+ line = document.header[i]
+ l = re.compile(r'\\html_latex_end\s+(.*)')
+ m = l.match(line)
+ document.header[i] = "\\html_latex_end \"" + m.group(1) + "\""
+
+
+def revert_output_sync(document):
+ " Remove forward search options "
+ i = find_token(document.header, '\\output_sync_macro', 0)
+ if i != -1:
+ del document.header[i]
+ i = find_token(document.header, '\\output_sync', 0)
+ if i != -1:
+ del document.header[i]
+
+
+def convert_beamer_args(document):
+ " Convert ERT arguments in Beamer to InsetArguments "
+
+ if document.textclass != "beamer" and document.textclass != "article-beamer":
+ return
+
+ layouts = ("Block", "ExampleBlock", "AlertBlock")
+ for layout in layouts:
+ blay = 0
+ while True:
+ blay = find_token(document.body, '\\begin_layout ' + layout, blay)
+ if blay == -1:
+ break
+ elay = find_end_of(document.body, blay, '\\begin_layout', '\\end_layout')
+ if elay == -1:
+ document.warning("Malformed LyX document: Can't find end of " + layout + " layout.")
+ blay += 1
+ continue
+ bert = find_token(document.body, '\\begin_inset ERT', blay)
+ if bert == -1:
+ document.warning("Malformed Beamer LyX document: Can't find argument of " + layout + " layout.")
+ blay = elay + 1
+ continue
+ eert = find_end_of_inset(document.body, bert)
+ if eert == -1:
+ document.warning("Malformed LyX document: Can't find end of ERT.")
+ blay = elay + 1
+ continue
+
+ # So the ERT inset begins at line k and goes to line l. We now wrap it in
+ # an argument inset.
+ # Do the end first, so as not to mess up the variables.
+ document.body[eert + 1:eert + 1] = ['', '\\end_layout', '', '\\end_inset', '']
+ document.body[bert:bert] = ['\\begin_inset OptArg', 'status open', '',
+ '\\begin_layout Plain Layout']
+ blay = elay + 9
+
+
+def revert_beamer_args(document):
+ " Revert Beamer arguments to ERT "
+
+ if document.textclass != "beamer" and document.textclass != "article-beamer":
+ return
+
+ layouts = ("Block", "ExampleBlock", "AlertBlock")
+ for layout in layouts:
+ blay = 0
+ while True:
+ blay = find_token(document.body, '\\begin_layout ' + layout, blay)
+ if blay == -1:
+ break
+ elay = find_end_of(document.body, blay, '\\begin_layout', '\\end_layout')
+ if elay == -1:
+ document.warning("Malformed LyX document: Can't find end of " + layout + " layout.")
+ blay += 1
+ continue
+ bopt = find_token(document.body, '\\begin_inset OptArg', blay)
+ if bopt == -1:
+ # it is legal not to have one of these
+ blay = elay + 1
+ continue
+ eopt = find_end_of_inset(document.body, bopt)
+ if eopt == -1:
+ document.warning("Malformed LyX document: Can't find end of argument.")
+ blay = elay + 1
+ continue
+ bplay = find_token(document.body, '\\begin_layout Plain Layout', blay)
+ if bplay == -1:
+ document.warning("Malformed LyX document: Can't find plain layout.")
+ blay = elay + 1
+ continue
+ eplay = find_end_of(document.body, bplay, '\\begin_layout', '\\end_layout')
+ if eplay == -1:
+ document.warning("Malformed LyX document: Can't find end of plain layout.")
+ blay = elay + 1
+ continue
+ # So the content of the argument inset goes from bplay + 1 to eplay - 1
+ bcont = bplay + 1
+ if bcont >= eplay:
+ # Hmm.
+ document.warning(str(bcont) + " " + str(eplay))
+ blay = blay + 1
+ continue
+ # we convert the content of the argument into pure LaTeX...
+ content = lyx2latex(document, document.body[bcont:eplay])
+ strlist = put_cmd_in_ert(["{" + content + "}"])
+
+ # now replace the optional argument with the ERT
+ document.body[bopt:eopt + 1] = strlist
+ blay = blay + 1
+
+
+def revert_align_decimal(document):
+ l = 0
+ while True:
+ l = document.body[l].find('alignment=decimal')
+ if l == -1:
+ break
+ remove_option(document, l, 'decimal_point')
+ document.body[l].replace('decimal', 'center')
+
+
+def convert_optarg(document):
+ " Convert \\begin_inset OptArg to \\begin_inset Argument "
+ i = 0
+ while 1:
+ i = find_token(document.body, '\\begin_inset OptArg', i)
+ if i == -1:
+ return
+ document.body[i] = "\\begin_inset Argument"
+ i += 1
+
+
+def revert_argument(document):
+ " Convert \\begin_inset Argument to \\begin_inset OptArg "
+ i = 0
+ while 1:
+ i = find_token(document.body, '\\begin_inset Argument', i)
+ if i == -1:
+ return
+ document.body[i] = "\\begin_inset OptArg"
+ i += 1
+
+
+def revert_makebox(document):
+ " Convert \\makebox to TeX code "
+ i = 0
+ while 1:
+ # only revert frameless boxes without an inner box
+ i = find_token(document.body, '\\begin_inset Box Frameless', i)
+ if i == -1:
+ # remove the option use_makebox
+ revert_use_makebox(document)
+ return
+ z = find_end_of_inset(document.body, i)
+ if z == -1:
+ document.warning("Malformed LyX document: Can't find end of box inset.")
+ return
+ j = find_token(document.body, 'use_makebox 1', i)
+ # assure we found the makebox of the current box
+ if j < z and j != -1:
+ y = find_token(document.body, "\\begin_layout", i)
+ if y > z or y == -1:
+ document.warning("Malformed LyX document: Can't find layout in box.")
+ return
+ # remove the \end_layout \end_inset pair
+ document.body[z - 2:z + 1] = put_cmd_in_ert("}")
+ # determine the alignment
+ k = find_token(document.body, 'hor_pos', j - 4)
+ align = document.body[k][9]
+ # determine the width
+ l = find_token(document.body, 'width "', j + 1)
+ length = document.body[l][7:]
+ # remove trailing '"'
+ length = length[:-1]
+ # latex_length returns "bool,length"
+ length = latex_length(length).split(",")[1]
+ subst = "\\makebox[" + length + "][" \
+ + align + "]{"
+ document.body[i:y + 1] = put_cmd_in_ert(subst)
+ i += 1
+
+
+def revert_use_makebox(document):
+ " Deletes use_makebox option of boxes "
+ h = 0
+ while 1:
+ # remove the option use_makebox
+ h = find_token(document.body, 'use_makebox', 0)
+ if h == -1:
+ return
+ del document.body[h]
+ h += 1
+
+
+def convert_use_makebox(document):
+ " Adds use_makebox option for boxes "
+ i = 0
+ while 1:
+ # remove the option use_makebox
+ i = find_token(document.body, '\\begin_inset Box', i)
+ if i == -1:
+ return
+ k = find_token(document.body, 'use_parbox', i)
+ if k == -1:
+ document.warning("Malformed LyX document: Can't find use_parbox statement in box.")
+ return
+ document.body.insert(k + 1, "use_makebox 0")
+ i = k + 1
+
+
+def revert_IEEEtran(document):
+ " Convert IEEEtran layouts and styles to TeX code "
+ if document.textclass != "IEEEtran":
+ return
+ revert_flex_inset(document, "IEEE membership", "\\IEEEmembership", 0)
+ revert_flex_inset(document, "Lowercase", "\\MakeLowercase", 0)
+ layouts = ("Special Paper Notice", "After Title Text", "Publication ID",
+ "Page headings", "Biography without photo")
+ latexcmd = {"Special Paper Notice": "\\IEEEspecialpapernotice",
+ "After Title Text": "\\IEEEaftertitletext",
+ "Publication ID": "\\IEEEpubid"}
+ obsoletedby = {"Page headings": "MarkBoth",
+ "Biography without photo": "BiographyNoPhoto"}
+ for layout in layouts:
+ i = 0
+ while True:
+ i = find_token(document.body, '\\begin_layout ' + layout, i)
+ if i == -1:
+ break
+ j = find_end_of(document.body, i, '\\begin_layout', '\\end_layout')
+ if j == -1:
+ document.warning("Malformed LyX document: Can't find end of " + layout + " layout.")
+ i += 1
+ continue
+ if layout in obsoletedby:
+ document.body[i] = "\\begin_layout " + obsoletedby[layout]
+ i = j
+ else:
+ content = lyx2latex(document, document.body[i:j + 1])
+ add_to_preamble(document, [latexcmd[layout] + "{" + content + "}"])
+ del document.body[i:j + 1]
+
+
+def revert_nameref(document):
+ " Convert namerefs to regular references "
+ cmds = ["Nameref", "nameref"]
+ foundone = False
+ rx = re.compile(r'reference "(.*)"')
+ for cmd in cmds:
+ i = 0
+ oldcmd = "LatexCommand " + cmd
+ while 1:
+ # It seems better to look for this, as most of the reference
+ # insets won't be ones we care about.
+ i = find_token(document.body, oldcmd, i)
+ if i == -1:
+ break
+ cmdloc = i
+ i += 1
+ # Make sure it is actually in an inset!
+ # We could just check document.lines[i-1], but that relies
+ # upon something that might easily change.
+ # We'll look back a few lines.
+ stins = cmdloc - 10
+ if stins < 0:
+ stins = 0
+ stins = find_token(document.body, "\\begin_inset CommandInset ref", stins)
+ if stins == -1 or stins > cmdloc:
+ continue
+ endins = find_end_of_inset(document.body, stins)
+ if endins == -1:
+ document.warning("Can't find end of inset at line " + stins + "!!")
+ continue
+ if endins < cmdloc:
+ continue
+ refline = find_token(document.body, "reference", stins)
+ if refline == -1 or refline > endins:
+ document.warning("Can't find reference for inset at line " + stinst + "!!")
+ continue
+ m = rx.match(document.body[refline])
+ if not m:
+ document.warning("Can't match reference line: " + document.body[ref])
+ continue
+ foundone = True
+ ref = m.group(1)
+ newcontent = ['\\begin_inset ERT', 'status collapsed', '', \
+ '\\begin_layout Plain Layout', '', '\\backslash', \
+ cmd + '{' + ref + '}', '\\end_layout', '', '\\end_inset']
+ document.body[stins:endins + 1] = newcontent
+ if foundone:
+ add_to_preamble(document, "\usepackage{nameref}")
+
+
+def remove_Nameref(document):
+ " Convert Nameref commands to nameref commands "
+ i = 0
+ while 1:
+ # It seems better to look for this, as most of the reference
+ # insets won't be ones we care about.
+ i = find_token(document.body, "LatexCommand Nameref" , i)
+ if i == -1:
+ break
+ cmdloc = i
+ i += 1
+
+ # Make sure it is actually in an inset!
+ # We could just check document.lines[i-1], but that relies
+ # upon something that might easily change.
+ # We'll look back a few lines.
+ stins = cmdloc - 10
+ if stins < 0:
+ stins = 0
+ stins = find_token(document.body, "\\begin_inset CommandInset ref", stins)
+ if stins == -1 or stins > cmdloc:
+ continue
+ endins = find_end_of_inset(document.body, stins)
+ if endins == -1:
+ document.warning("Can't find end of inset at line " + stins + "!!")
+ continue
+ if endins < cmdloc:
+ continue
+ document.body[cmdloc] = "LatexCommand nameref"
+
+
+def revert_mathrsfs(document):
+ " Load mathrsfs if \mathrsfs us use in the document "
+ i = 0
+ end = len(document.body) - 1
+ while True:
+ j = document.body[i].find("\\mathscr{")
+ if j != -1:
+ add_to_preamble(document, ["% this command was inserted by lyx2lyx"])
+ add_to_preamble(document, ["\\usepackage{mathrsfs}"])
+ break
+ if i == end:
+ break
+ i += 1
+
+
##
# Conversion hub
#
[382, []],
[383, []],
[384, []],
- [385, []]
+ [385, []],
+ [386, []],
+ [387, []],
+ [388, []],
+ [389, [convert_html_quotes]],
+ [390, []],
+ [391, []],
+ [392, [convert_beamer_args]],
+ [393, [convert_optarg]],
+ [394, [convert_use_makebox]],
+ [395, []],
+ [396, []],
+ [397, [remove_Nameref]],
+ [398, []]
]
-revert = [[384, [revert_shadedboxcolor]],
+revert = [[397, [revert_mathrsfs]],
+ [396, []],
+ [395, [revert_nameref]],
+ [394, [revert_DIN_C_pagesizes]],
+ [393, [revert_makebox]],
+ [392, [revert_argument]],
+ [391, [revert_beamer_args]],
+ [390, [revert_align_decimal, revert_IEEEtran]],
+ [389, [revert_output_sync]],
+ [388, [revert_html_quotes]],
+ [387, [revert_pagesizes]],
+ [386, [revert_math_scale]],
+ [385, [revert_lyx_version]],
+ [384, [revert_shadedboxcolor]],
[383, [revert_fontcolor]],
[382, [revert_turkmen]],
[381, [revert_notefontcolor]],
[358, [revert_nomencl_width]],
[357, [revert_custom_processors]],
[356, [revert_ulinelatex]],
- [355, [revert_uulinewave]],
+ [355, []],
[354, [revert_strikeout]],
[353, [revert_printindexall]],
[352, [revert_subindex]],