"Revert optional options for wrap floats (wrapfig)."
i = 0
while True:
- i = find_token(document.body, "lines", i)
+ i = find_token(document.body, "\\begin_inset Wrap figure", i)
if i == -1:
return
- j = find_token(document.body, "overhang", i+1)
- if j != i + 2 and j != -1:
- document.warning("Malformed LyX document: Couldn't find overhang parameter of wrap float.")
+ j = find_end_of_inset(document.body, i)
if j == -1:
- return
- del document.body[i]
- del document.body[j-1]
- i = i + 1
+ document.warning("Can't find end of Wrap inset at line " + str(i))
+ i += 1
+ continue
+ k = find_default_layout(document, i, j)
+ if k == -1:
+ document.warning("Can't find default layout for Wrap figure!")
+ i = j
+ continue
+ # Options should be between i and k now
+ l = find_token(document.body, "lines", i, k)
+ if l == -1:
+ document.warning("Can't find lines option for Wrap figure!")
+ i = k
+ continue
+ m = find_token(document.body, "overhang", i + 1, k)
+ if m == -1:
+ document.warning("Malformed LyX document: Couldn't find overhang parameter of wrap float!")
+ i = k
+ continue
+ # Do these in reverse order
+ del document.body[m]
+ del document.body[l]
+ i = k
# To convert and revert indices, we need to convert between LaTeX
r = re.compile('^(.*?)(\$.*?\$)(.*)')
lines = fullcontent.split('\n')
for line in lines:
- #document.warning("LINE: " + line)
- #document.warning(str(i) + ":" + document.body[i])
- #document.warning("LAST: " + document.body[-1])
- g = line
- while r.match(g):
- m = r.match(g)
- s = m.group(1)
- f = m.group(2).replace('\\\\', '\\')
- g = m.group(3)
- if s:
- # this is non-math!
- s = wrap_into_ert(s, r'\\', '\\backslash')
- s = wrap_into_ert(s, '{', '{')
- s = wrap_into_ert(s, '}', '}')
- subst = s.split('\n')
- document.body[i:i] = subst
- i += len(subst)
- document.body.insert(i + 1, "\\begin_inset Formula " + f)
- document.body.insert(i + 2, "\\end_inset")
- i += 2
- # Generic, \\ -> \backslash:
- g = wrap_into_ert(g, r'\\', '\\backslash')
- g = wrap_into_ert(g, '{', '{')
- g = wrap_into_ert(g, '}', '}')
- subst = g.split('\n')
- document.body[i+1:i+1] = subst
- i += len(subst)
+ #document.warning("LINE: " + line)
+ #document.warning(str(i) + ":" + document.body[i])
+ #document.warning("LAST: " + document.body[-1])
+ g = line
+ while r.match(g):
+ m = r.match(g)
+ s = m.group(1)
+ f = m.group(2).replace('\\\\', '\\')
+ g = m.group(3)
+ if s:
+ # this is non-math!
+ s = wrap_into_ert(s, r'\\', '\\backslash')
+ s = wrap_into_ert(s, '{', '{')
+ s = wrap_into_ert(s, '}', '}')
+ subst = s.split('\n')
+ document.body[i:i] = subst
+ i += len(subst)
+ document.body.insert(i + 1, "\\begin_inset Formula " + f)
+ document.body.insert(i + 2, "\\end_inset")
+ i += 2
+ # Generic, \\ -> \backslash:
+ g = wrap_into_ert(g, r'\\', '\\backslash')
+ g = wrap_into_ert(g, '{', '{')
+ g = wrap_into_ert(g, '}', '}')
+ subst = g.split('\n')
+ document.body[i+1:i+1] = subst
+ i += len(subst)
document.body.insert(i + 1, "\\end_layout")
["\\begin_inset CommandInset url", "LatexCommand url"]
i = i + 2
+def revert_url(document):
+ 'Reverts Flex URL insets to old-style URL insets'
+ i = 0
+ while True:
+ i = find_token(document.body, "\\begin_inset Flex URL", i)
+ if i == -1:
+ return
+ j = find_end_of_inset(document.body, i)
+ if j == -1:
+ document.warning("Can't find end of inset in revert_url!")
+ return
+ k = find_default_layout(document, i, j)
+ if k == -1:
+ document.warning("Can't find default layout in revert_url!")
+ i = j
+ continue
+ l = find_end_of(document.body, k, "\\begin_layout", "\\end_layout")
+ if l == -1 or l >= j:
+ document.warning("Can't find end of default layout in revert_url!")
+ i = j
+ continue
+ # OK, so the inset's data is between lines k and l.
+ data = " ".join(document.body[k+1:l])
+ data = data.strip()
+ newinset = ["\\begin_inset LatexCommand url", "target \"" + data + "\"",\
+ "", "\\end_inset"]
+ document.body[i:j+1] = newinset
+ i = i + len(newinset)
+
def convert_include(document):
'Converts include insets to new format.'
def revert_include(document):
'Reverts include insets to old format.'
i = 0
+ r0 = re.compile('preview.*')
r1 = re.compile('LatexCommand (.+)')
r2 = re.compile('filename (.+)')
- r3 = re.compile('options (.*)')
+ r3 = re.compile('lstparams "(.*)"')
while True:
i = find_token(document.body, "\\begin_inset CommandInset include", i)
if i == -1:
return
- previewline = document.body[i + 1]
- m = r1.match(document.body[i + 2])
+ nextline = i + 1
+ if r0.match(document.body[nextline]):
+ previewline = document.body[nextline]
+ nextline += 1
+ else:
+ previewline = ""
+ m = r1.match(document.body[nextline])
if m == None:
document.warning("Malformed LyX document: No LatexCommand line for `" +
document.body[i] + "' on line " + str(i) + ".")
i += 1
continue
cmd = m.group(1)
- m = r2.match(document.body[i + 3])
+ nextline += 1
+ m = r2.match(document.body[nextline])
if m == None:
document.warning("Malformed LyX document: No filename line for `" + \
document.body[i] + "' on line " + str(i) + ".")
i += 2
continue
fn = m.group(1)
+ nextline += 1
options = ""
- numlines = 4
if (cmd == "lstinputlisting"):
- m = r3.match(document.body[i + 4])
+ m = r3.match(document.body[nextline])
if m != None:
options = m.group(1)
numlines = 5
+ nextline += 1
newline = "\\begin_inset Include \\" + cmd + "{" + fn + "}"
if options:
newline += ("[" + options + "]")
- insertion = [newline, previewline]
- document.body[i : i + numlines] = insertion
+ insertion = [newline]
+ if previewline != "":
+ insertion.append(previewline)
+ document.body[i : nextline] = insertion
i += 2
subst = [document.body[i].replace("\\begin_inset Note", "\\begin_inset Box"),
'position "t"',
'hor_pos "c"',
- 'has_inner_box 0'
+ 'has_inner_box 0',
'inner_pos "t"',
'use_parbox 0',
'width "100col%"',
continue
j = find_end_of_inset(document.body, i)
if j == -1:
- document.warning("Malformed lyx document: Missing '\\end_inset'.")
+ document.warning("Malformed lyx document: Missing '\\end_inset' in revert_rotfloat.")
i += 1
continue
addedLines = 0
continue
j = find_end_of_inset(document.body, i)
if j == -1:
- document.warning("Malformed lyx document: Missing '\\end_inset'.")
+ document.warning("Malformed lyx document: Missing '\\end_inset' in revert_widesideways.")
i += 1
continue
if get_value(document.body, 'sideways', i, j) == "false" or \
return
j = find_end_of_inset(document.body, i)
if j == -1:
- document.warning("Malformed lyx document: Missing '\\end_inset'.")
+ document.warning("Malformed lyx document: Missing '\\end_inset' in revert_inset_embedding.")
i = i + 1
continue
k = find_token(document.body, "\tembed", i, j)
i = find_token(document.body, '\\begin_inset Graphics', i)
if i == -1:
return
- j = find_end_of_inset(document.body, i)
- if j == -1:
- document.warning("Malformed lyx document: Missing '\\end_inset'.")
+ endInset = find_end_of_inset(document.body, i)
+ if endInset == -1:
+ document.warning("Malformed lyx document: Missing '\\end_inset' in convert_subfig.")
i += 1
continue
- k = find_token(document.body, '\tsubcaption', i, j)
+ k = find_token(document.body, '\tsubcaption', i, endInset)
if k == -1:
- i += 1
+ i = endInset
+ continue
+ l = find_token(document.body, '\tsubcaptionText', i, endInset)
+ if l == -1:
+ document.warning("Malformed lyx document: Can't find subcaptionText!")
+ i = endInset
continue
- l = find_token(document.body, '\tsubcaptionText', i, j)
caption = document.body[l][16:].strip('"')
- savestr = document.body[i]
- laststr = document.body[j]
del document.body[l]
del document.body[k]
addedLines = -2
subst = ['\\begin_inset Float figure', 'wide false', 'sideways false',
- 'status open', '', '\\begin_layout Plain Layout', '\\begin_inset',
- 'Caption', '', '\\begin_layout Plain Layout',
+ 'status open', '', '\\begin_layout Plain Layout', '\\begin_inset Caption',
+ '', '\\begin_layout Plain Layout',
caption, '\\end_layout', '', '\\end_inset', '',
- '\\end_layout', '', '\\begin_layout Plain Layout', savestr]
- document.body[i : i+1] = subst
- addedLines += len(subst) - 1
- subst = ['', '\\end_layout', '', '\\end_inset', laststr]
- document.body[j : j+1] = subst
- addedLines += len(subst) - 1
+ '\\end_layout', '', '\\begin_layout Plain Layout']
+ document.body[i : i] = subst
+ addedLines += len(subst)
+ endInset += addedLines
+ subst = ['', '\\end_inset', '', '\\end_layout']
+ document.body[endInset : endInset] = subst
+ addedLines += len(subst)
i += addedLines + 1
i = 0
while 1:
# whitespace intended (exclude \\begin_inset FloatList)
- i = find_token(document.body, '\\begin_inset Float ', i)
+ i = find_tokens(document.body, ['\\begin_inset Float ', '\\begin_inset Wrap'], i)
if i == -1:
return
- while 1:
+ j = 0
+ addedLines = 0
+ while j != -1:
j = find_end_of_inset(document.body, i)
if j == -1:
- document.warning("Malformed lyx document: Missing '\\end_inset' (float).")
- i = i + 1
- continue
+ document.warning("Malformed lyx document: Missing '\\end_inset' (float) at line " + str(i + len(document.header)) + ".\n\t" + document.body[i])
+ # document.warning(document.body[i-1] + "\n" + document.body[i+1])
+ i += 1
+ continue # this will get us back to the outer loop, since j == -1
# look for embedded float (= subfloat)
# whitespace intended (exclude \\begin_inset FloatList)
k = find_token(document.body, '\\begin_inset Float ', i + 1, j)
l = find_end_of_inset(document.body, k)
if l == -1:
document.warning("Malformed lyx document: Missing '\\end_inset' (embedded float).")
- i = i + 1
- continue
+ i += 1
+ j == -1
+ continue # escape to the outer loop
m = find_default_layout(document, k + 1, l)
# caption?
cap = find_token(document.body, '\\begin_inset Caption', k + 1, l)
caption = ''
shortcap = ''
+ capend = cap
if cap != -1:
capend = find_end_of_inset(document.body, cap)
if capend == -1:
caption += line.strip()
if len(label) > 0:
caption += "\\backslash\nlabel{" + label + "}"
- document.body[l] = '\\begin_layout Plain Layout\n\\begin_inset ERT\nstatus collapsed\n\n' \
- '\\begin_layout Plain Layout\n\n}\n\\end_layout\n\n\\end_inset\n\n\\end_layout\n\n\\begin_layout Plain Layout\n'
- del document.body[cap:capend+1]
+ subst = '\\begin_layout Plain Layout\n\\begin_inset ERT\nstatus collapsed\n\n' \
+ '\\begin_layout Plain Layout\n\n}\n\\end_layout\n\n\\end_inset\n\n' \
+ '\\end_layout\n\n\\begin_layout Plain Layout\n'
+ subst = subst.split('\n')
+ document.body[l : l+1] = subst
+ addedLines = len(subst) - 1
+ # this is before l and so is unchanged by the multiline insertion
+ if cap != capend:
+ del document.body[cap:capend+1]
+ addedLines -= (capend + 1 - cap)
del document.body[k+1:m-1]
+ addedLines -= (m - 1 - (k + 1))
insertion = '\\begin_inset ERT\nstatus collapsed\n\n' \
- '\\begin_layout Plain Layout\n\n\\backslash\n' \
- 'subfloat'
+ '\\begin_layout Plain Layout\n\n\\backslash\n' \
+ 'subfloat'
if len(shortcap) > 0:
insertion = insertion + "[" + shortcap + "]"
if len(caption) > 0:
insertion = insertion + "[" + caption + "]"
insertion = insertion + '{%\n\\end_layout\n\n\\end_inset\n\n\\end_layout\n'
- document.body[k] = insertion
+ insertion = insertion.split('\n')
+ document.body[k : k + 1] = insertion
+ addedLines += len(insertion) - 1
add_to_preamble(document,
['\\usepackage{subfig}\n'])
- i = i + 1
+ i += addedLines + 1
def revert_wrapplacement(document):
" Revert placement options wrap floats (wrapfig). "
i = 0
while True:
- i = find_token(document.body, "lines", i)
+ i = find_token(document.body, "\\begin_inset Wrap figure", i)
if i == -1:
return
- j = find_token(document.body, "placement", i+1)
- if j != i + 1:
+ e = find_end_of_inset(document.body, i)
+ j = find_token(document.body, "placement", i + 1, e)
+ if j == -1:
document.warning("Malformed LyX document: Couldn't find placement parameter of wrap float.")
- return
- document.body[j] = document.body[j].replace("placement O", "placement o")
- document.body[j] = document.body[j].replace("placement I", "placement i")
- document.body[j] = document.body[j].replace("placement L", "placement l")
- document.body[j] = document.body[j].replace("placement R", "placement r")
- i = i + 1
+ i += 1
+ continue
+ r = re.compile("placement (o|i|l|r)")
+ m = r.match(document.body[j])
+ if m == None:
+ document.warning("Malformed LyX document: Placement option isn't O|I|R|L!")
+ document.body[j] = "placement " + m.group(1).lower()
+ i = j
def remove_extra_embedded_files(document):
return
j = find_end_of_inset(document.body, i)
if j == -1:
- document.warning("Malformed lyx document: Missing '\\end_inset'.")
+ document.warning("Malformed lyx document: Missing '\\end_inset' in revert_pdfpages.")
i = i + 1
continue
if get_value(document.body, 'template', i, j) == "PDFPages":
return
j = find_end_of_inset(document.body, i)
if j == -1:
- document.warning("Malformed lyx document: Missing '\\end_inset'.")
+ document.warning("Malformed lyx document: Missing '\\end_inset' in revert_graphics_group.")
i = i + 1
continue
k = find_token(document.body, " groupId", i, j)
document.body[i] = document.body[i].replace('\\begin_inset space', '\\begin_inset Space')
+def convert_display_enum(document):
+ " Convert 'display foo' to 'display false/true'"
+ i = 0
+ while True:
+ i = find_token(document.body, "\tdisplay", i)
+ if i == -1:
+ return
+ val = get_value(document.body, 'display', i)
+ if val == "none":
+ document.body[i] = document.body[i].replace('none', 'false')
+ if val == "default":
+ document.body[i] = document.body[i].replace('default', 'true')
+ if val == "monochrome":
+ document.body[i] = document.body[i].replace('monochrome', 'true')
+ if val == "grayscale":
+ document.body[i] = document.body[i].replace('grayscale', 'true')
+ if val == "color":
+ document.body[i] = document.body[i].replace('color', 'true')
+ if val == "preview":
+ document.body[i] = document.body[i].replace('preview', 'true')
+ i += 1
+
+
+def revert_display_enum(document):
+ " Revert 'display false/true' to 'display none/color'"
+ i = 0
+ while True:
+ i = find_token(document.body, "\tdisplay", i)
+ if i == -1:
+ return
+ val = get_value(document.body, 'display', i)
+ if val == "false":
+ document.body[i] = document.body[i].replace('false', 'none')
+ if val == "true":
+ document.body[i] = document.body[i].replace('true', 'default')
+ i += 1
+
+
+def remove_fontsCJK(document):
+ ' Remove font_cjk param '
+ i = find_token(document.header, "\\font_cjk", 0)
+ if i != -1:
+ del document.header[i]
+
+
+def convert_plain_layout(document):
+ " Convert 'PlainLayout' to 'Plain Layout'"
+ i = 0
+ while True:
+ i = find_token(document.body, '\\begin_layout PlainLayout', i)
+ if i == -1:
+ return
+ document.body[i] = document.body[i].replace('\\begin_layout PlainLayout', \
+ '\\begin_layout Plain Layout')
+ i += 1
+
+
+def revert_plain_layout(document):
+ " Convert 'PlainLayout' to 'Plain Layout'"
+ i = 0
+ while True:
+ i = find_token(document.body, '\\begin_layout Plain Layout', i)
+ if i == -1:
+ return
+ document.body[i] = document.body[i].replace('\\begin_layout Plain Layout', \
+ '\\begin_layout PlainLayout')
+ i += 1
+
+
+def revert_plainlayout(document):
+ " Convert 'PlainLayout' to 'Plain Layout'"
+ i = 0
+ while True:
+ i = find_token(document.body, '\\begin_layout PlainLayout', i)
+ if i == -1:
+ return
+ # This will be incorrect for some document classes, since Standard is not always
+ # the default. But (a) it is probably the best we can do and (b) it will actually
+ # work, in fact, since an unknown layout will be converted to default.
+ document.body[i] = document.body[i].replace('\\begin_layout PlainLayout', \
+ '\\begin_layout Standard')
+ i += 1
+
+
+def revert_polytonicgreek(document):
+ "Set language polytonic Greek to Greek"
+ i = 0
+ if document.language == "polutonikogreek":
+ document.language = "greek"
+ i = find_token(document.header, "\\language", 0)
+ if i != -1:
+ document.header[i] = "\\language greek"
+ j = 0
+ while True:
+ j = find_token(document.body, "\\lang polutonikogreek", j)
+ if j == -1:
+ return
+ document.body[j] = document.body[j].replace("\\lang polutonikogreek", "\\lang greek")
+ j = j + 1
+
+
##
# Conversion hub
#
[319, [convert_spaceinset, convert_hfill]],
[320, []],
[321, [convert_tablines]],
- [322, []],
+ [322, [convert_plain_layout]],
[323, [convert_pagebreaks]],
[324, [convert_linebreaks]],
[325, [convert_japanese_plain]],
[333, [update_apa_styles]],
[334, [convert_paper_sizes]],
[335, [convert_InsetSpace]],
+ [336, []],
+ [337, [convert_display_enum]],
+ [338, []],
]
-revert = [[334, [revert_InsetSpace]],
+revert = [[337, [revert_polytonicgreek]],
+ [336, [revert_display_enum]],
+ [335, [remove_fontsCJK]],
+ [334, [revert_InsetSpace]],
[333, [revert_paper_sizes]],
[332, []],
[331, [revert_graphics_group]],
[324, []],
[323, [revert_linebreaks]],
[322, [revert_pagebreaks]],
- [321, [revert_local_layout]],
+ [321, [revert_local_layout, revert_plain_layout]],
[320, [revert_tablines]],
[319, [revert_protected_hfill]],
[318, [revert_spaceinset, revert_hfills, revert_hspace]],
[317, [remove_extra_embedded_files]],
[316, [revert_wrapplacement]],
[315, [revert_subfig]],
- [314, [revert_colsep]],
+ [314, [revert_colsep, revert_plainlayout]],
[313, []],
[312, [revert_module_names]],
[311, [revert_rotfloat, revert_widesideways]],
[297, [revert_macro_optional_params]],
[296, [revert_albanian, revert_lowersorbian, revert_uppersorbian]],
[295, [revert_include]],
- [294, [revert_href]],
+ [294, [revert_href, revert_url]],
[293, [revert_pdf_options_2]],
[292, [revert_inset_info]],
[291, [revert_japanese, revert_japanese_encoding]],