X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=lib%2Flyx2lyx%2Flyx_1_6.py;h=1fd46250acfa80161ba26ec731f3d39de89e5377;hb=d48038c87db321b42add9ae56c3b1422e3033d5e;hp=215711caa8229bfc6fa81bf3261271836323a61f;hpb=0bc17b0c65f530823b7b0eb1f6ad13aec024c2e5;p=lyx.git diff --git a/lib/lyx2lyx/lyx_1_6.py b/lib/lyx2lyx/lyx_1_6.py index 215711caa8..1fd46250ac 100644 --- a/lib/lyx2lyx/lyx_1_6.py +++ b/lib/lyx2lyx/lyx_1_6.py @@ -31,6 +31,17 @@ 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") +# WARNING! +# DO NOT do this: +# document.body[i] = wrap_insert_ert(...) +# wrap_into_ert may returns a multiline string, which should NOT appear +# in document.body. Insetad, do something like this: +# subst = wrap_inset_ert(...) +# subst = subst.split('\n') +# document.body[i:i+1] = subst +# i+= len(subst) - 1 +# where the last statement resets the counter to accord with the added +# lines. def wrap_into_ert(string, src, dst): " Wrap a something into an ERT" return string.replace(src, '\n\\begin_inset ERT\nstatus collapsed\n\\begin_layout Standard\n' @@ -153,6 +164,8 @@ def convert_ltcaption(document): i = j + 1 + +#FIXME Use of wrap_into_ert can confuse lyx2lyx def revert_ltcaption(document): i = 0 while True: @@ -735,18 +748,49 @@ def revert_wrapfig_options(document): "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 +# strings and LyXText. Here we do a minimal conversion to prevent +# crashes and data loss. Manual patch-up may be needed. +replacements = [ + [r'\\\"a', u'ä'], + [r'\\\"o', u'ö'], + [r'\\\"u', u'ü'], + [r'\\\'a', u'á'], + [r'\\\'e', u'é'], + [r'\\\'i', u'í'], + [r'\\\'o', u'ó'], + [r'\\\'u', u'ú'] +] def convert_latexcommand_index(document): "Convert from LatexCommand form to collapsable form." @@ -757,43 +801,53 @@ def convert_latexcommand_index(document): return if document.body[i + 1] != "LatexCommand index": # Might also be index_print return - fullcontent = document.body[i + 2][6:].strip('"') - document.body[i:i + 2] = ["\\begin_inset Index", + fullcontent = document.body[i + 2][5:] + fullcontent.strip() + fullcontent = fullcontent[1:-1] + document.body[i:i + 3] = ["\\begin_inset Index", "status collapsed", "\\begin_layout Standard"] - # Put here the conversions needed from LaTeX string to LyXText. - # Here we do a minimal conversion to prevent crashes and data loss. - # Manual patch-up may be needed. - # Umlauted characters (most common ones, can be extended): - fullcontent = fullcontent.replace(r'\\\"a', u'ä').replace(r'\\\"o', u'ö').replace(r'\\\"u', u'ü') + i += 3 + # We are now on the blank line preceding "\end_inset" + # We will write the content here, into the inset. + + # Do the LaTeX --> LyX text conversion + for rep in replacements: + fullcontent = fullcontent.replace(rep[0], rep[1]) # Generic, \" -> ": fullcontent = wrap_into_ert(fullcontent, r'\"', '"') - #fullcontent = fullcontent.replace(r'\"', '\n\\begin_inset ERT\nstatus collapsed\n\\begin_layout standard\n"\n\\end_layout\n\\end_inset\n') # Math: r = re.compile('^(.*?)(\$.*?\$)(.*)') - g = fullcontent - 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, '}', '}') - document.body.insert(i + 3, s) - i += 1 - document.body.insert(i + 3, "\\begin_inset Formula " + f) - document.body.insert(i + 4, "\\end_inset") - i += 2 - # Generic, \\ -> \backslash: - g = wrap_into_ert(g, r'\\', '\\backslash') - g = wrap_into_ert(g, '{', '{') - g = wrap_into_ert(g, '}', '}') - document.body.insert(i + 3, g) - document.body[i + 4] = "\\end_layout" - i = i + 5 + 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.body.insert(i + 1, "\\end_layout") def revert_latexcommand_index(document): @@ -836,7 +890,9 @@ def revert_latexcommand_index(document): # try at least to handle some common insets and settings # do not replace inside ERTs if ert_end < k: - line = line.replace(u'ä', r'\\\"a').replace(u'ö', r'\\\"o').replace(u'ü', r'\\\"u') + # Do the LyX text --> LaTeX conversion + for rep in replacements: + line = line.replace(rep[1], rep[0]) line = line.replace(r'\backslash', r'\textbackslash{}') line = line.replace(r'\series bold', r'\bfseries{}').replace(r'\series default', r'\mdseries{}') line = line.replace(r'\shape italic', r'\itshape{}').replace(r'\shape smallcaps', r'\scshape{}') @@ -1077,6 +1133,35 @@ def revert_href(document): ["\\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.' @@ -1110,40 +1195,50 @@ def convert_include(document): 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 @@ -1324,7 +1419,7 @@ def convert_framed_notes(document): 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%"', @@ -1633,37 +1728,49 @@ def revert_rotfloat(document): continue floattype = m.group(1) if floattype == "figure" or floattype == "table": - i = i + 1 + i += 1 continue j = find_end_of_inset(document.body, i) if j == -1: - document.warning("Malformed lyx document: Missing '\\end_inset'.") - i = i + 1 + document.warning("Malformed lyx document: Missing '\\end_inset' in revert_rotfloat.") + i += 1 continue - if get_value(document.body, 'sideways', i, j) != "false": - l = find_default_layout(document, i + 1, j) - if l == -1: - document.warning("Malformed LyX document: Missing `\\begin_layout' in Float inset.") - return - document.body[j] = '\\begin_layout Standard\n\\begin_inset ERT\nstatus collapsed\n\n' \ - '\\begin_layout Standard\n\n\n\\backslash\n' \ - 'end{sideways' + floattype + '}\n\\end_layout\n\n\\end_inset\n' - del document.body[i+1:l-1] - document.body[i] = '\\begin_inset ERT\nstatus collapsed\n\n' \ - '\\begin_layout Standard\n\n\n\\backslash\n' \ - 'begin{sideways' + floattype + '}\n\\end_layout\n\n\\end_inset\n\n\\end_layout\n\n' - if floattype == "algorithm": - add_to_preamble(document, - ['% Commands inserted by lyx2lyx for sideways algorithm float', - '\\usepackage{rotfloat}', - '\\floatstyle{ruled}', - '\\newfloat{algorithm}{tbp}{loa}', - '\\floatname{algorithm}{Algorithm}']) - else: - document.warning("Cannot create preamble definition for custom float" + floattype + ".") - i = i + 1 + addedLines = 0 + if get_value(document.body, 'sideways', i, j) == "false": + i += 1 continue - i = i + 1 + l = find_default_layout(document, i + 1, j) + if l == -1: + document.warning("Malformed LyX document: Missing `\\begin_layout' in Float inset.") + return + subst = ['\\begin_layout Standard', + '\\begin_inset ERT', + 'status collapsed', '', + '\\begin_layout Standard', '', '', + '\\backslash', '', + 'end{sideways' + floattype + '}', + '\\end_layout', '', '\\end_inset'] + document.body[j : j+1] = subst + addedLines = len(subst) - 1 + del document.body[i+1 : l] + addedLines -= (l-1) - (i+1) + subst = ['\\begin_inset ERT', 'status collapsed', '', + '\\begin_layout Standard', '', '', '\\backslash', + 'begin{sideways' + floattype + '}', + '\\end_layout', '', '\\end_inset', '', + '\\end_layout', ''] + document.body[i : i+1] = subst + addedLines += len(subst) - 1 + if floattype == "algorithm": + add_to_preamble(document, + ['% Commands inserted by lyx2lyx for sideways algorithm float', + '\\usepackage{rotfloat}', + '\\floatstyle{ruled}', + '\\newfloat{algorithm}{tbp}{loa}', + '\\floatname{algorithm}{Algorithm}']) + else: + document.warning("Cannot create preamble definition for custom float" + floattype + ".") + i += addedLines + 1 def revert_widesideways(document): @@ -1683,31 +1790,38 @@ def revert_widesideways(document): continue floattype = m.group(1) if floattype != "figure" and floattype != "table": - i = i + 1 + i += 1 continue j = find_end_of_inset(document.body, i) if j == -1: - document.warning("Malformed lyx document: Missing '\\end_inset'.") - i = i + 1 + document.warning("Malformed lyx document: Missing '\\end_inset' in revert_widesideways.") + i += 1 continue - if get_value(document.body, 'sideways', i, j) != "false": - if get_value(document.body, 'wide', i, j) != "false": - l = find_default_layout(document, i + 1, j) - if l == -1: - document.warning("Malformed LyX document: Missing `\\begin_layout' in Float inset.") - return - document.body[j] = '\\begin_layout Standard\n\\begin_inset ERT\nstatus collapsed\n\n' \ - '\\begin_layout Standard\n\n\n\\backslash\n' \ - 'end{sideways' + floattype + '*}\n\\end_layout\n\n\\end_inset\n' - del document.body[i+1:l-1] - document.body[i] = '\\begin_inset ERT\nstatus collapsed\n\n' \ - '\\begin_layout Standard\n\n\n\\backslash\n' \ - 'begin{sideways' + floattype + '*}\n\\end_layout\n\n\\end_inset\n\n\\end_layout\n\n' - add_to_preamble(document, - ['\\usepackage{rotfloat}\n']) - i = i + 1 - continue - i = i + 1 + if get_value(document.body, 'sideways', i, j) == "false" or \ + get_value(document.body, 'wide', i, j) == "false": + i += 1 + continue + l = find_default_layout(document, i + 1, j) + if l == -1: + document.warning("Malformed LyX document: Missing `\\begin_layout' in Float inset.") + return + subst = ['\\begin_layout Standard', '\\begin_inset ERT', + 'status collapsed', '', + '\\begin_layout Standard', '', '', '\\backslash', + 'end{sideways' + floattype + '*}', + '\\end_layout', '', '\\end_inset'] + document.body[j : j+1] = subst + addedLines = len(subst) - 1 + del document.body[i+1:l-1] + addedLines -= (l-1) - (i+1) + subst = ['\\begin_inset ERT', 'status collapsed', '', + '\\begin_layout Standard', '', '', '\\backslash', + 'begin{sideways' + floattype + '*}', '\\end_layout', '', + '\\end_inset', '', '\\end_layout', ''] + document.body[i : i+1] = subst + addedLines += len(subst) - 1 + add_to_preamble(document, ['\\usepackage{rotfloat}\n']) + i += addedLines + 1 def revert_inset_embedding(document, type): @@ -1719,7 +1833,7 @@ def revert_inset_embedding(document, type): 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) @@ -1742,25 +1856,36 @@ def convert_subfig(document): 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'.") - i = i + 1 + 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 = 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] del document.body[l] del document.body[k] - document.body[i] = '\\begin_inset Float figure\nwide false\nsideways false\n' \ - 'status open\n\n\\begin_layout Plain Layout\n\\begin_inset Caption\n\n\\begin_layout Plain Layout\n' \ - + caption + '\n\\end_layout\n\n\\end_inset\n\n\\end_layout\n\n\\begin_layout Plain Layout\n' + savestr - savestr = document.body[j] - document.body[j] = '\n\\end_layout\n\n\\end_inset\n' + savestr + addedLines = -2 + subst = ['\\begin_inset Float figure', 'wide false', 'sideways false', + 'status open', '', '\\begin_layout Plain Layout', '\\begin_inset Caption', + '', '\\begin_layout Plain Layout', + caption, '\\end_layout', '', '\\end_inset', '', + '\\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 def revert_subfig(document): @@ -1768,15 +1893,18 @@ def revert_subfig(document): 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) @@ -1785,13 +1913,15 @@ def revert_subfig(document): 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: @@ -1840,40 +1970,52 @@ def revert_subfig(document): 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 - add_to_preamble(document, - ['\\usepackage{subfig}\n']) - i = i + 1 + insertion = insertion.split('\n') + document.body[k : k + 1] = insertion + addedLines += len(insertion) - 1 + add_to_preamble(document, ['\\usepackage{subfig}\n']) + 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): @@ -1921,26 +2063,53 @@ def convert_hfill(document): i = find_token(document.body, "\\hfill", i) if i == -1: return - document.body[i] = document.body[i].replace('\\hfill', '\n\\begin_inset Space \\hfill{}\n\\end_inset') + subst = document.body[i].replace('\\hfill', \ + '\n\\begin_inset Space \\hfill{}\n\\end_inset') + subst = subst.split('\n') + document.body[i : i+1] = subst + i += len(subst) def revert_hfills(document): ' Revert \\hfill commands ' - for i in range(len(document.body)): - document.body[i] = document.body[i].replace('\\InsetSpace \\hfill{}', '\\hfill') - document.body[i] = document.body[i].replace('\\InsetSpace \\dotfill{}', \ - '\\begin_inset ERT\nstatus collapsed\n\n' \ - '\\begin_layout Standard\n\n\n\\backslash\n' \ - 'dotfill{}\n\\end_layout\n\n\\end_inset\n\n') - document.body[i] = document.body[i].replace('\\InsetSpace \\hrulefill{}', \ - '\\begin_inset ERT\nstatus collapsed\n\n' \ - '\\begin_layout Standard\n\n\n\\backslash\n' \ - 'hrulefill{}\n\\end_layout\n\n\\end_inset\n\n') - + hfill = re.compile(r'\\hfill') + dotfill = re.compile(r'\\dotfill') + hrulefill = re.compile(r'\\hrulefill') + i = 0 + while True: + i = find_token(document.body, "\\InsetSpace", i) + if i == -1: + return + if hfill.search(document.body[i]): + document.body[i] = \ + document.body[i].replace('\\InsetSpace \\hfill{}', '\\hfill') + i += 1 + continue + if dotfill.search(document.body[i]): + subst = document.body[i].replace('\\InsetSpace \\dotfill{}', \ + '\\begin_inset ERT\nstatus collapsed\n\n' \ + '\\begin_layout Standard\n\n\n\\backslash\n' \ + 'dotfill{}\n\\end_layout\n\n\\end_inset\n\n') + subst = subst.split('\n') + document.body[i : i+1] = subst + i += len(subst) + continue + if hrulefill.search(document.body[i]): + subst = document.body[i].replace('\\InsetSpace \\hrulefill{}', \ + '\\begin_inset ERT\nstatus collapsed\n\n' \ + '\\begin_layout Standard\n\n\n\\backslash\n' \ + 'hrulefill{}\n\\end_layout\n\n\\end_inset\n\n') + subst = subst.split('\n') + document.body[i : i+1] = subst + i += len(subst) + continue + i += 1 def revert_hspace(document): ' Revert \\InsetSpace \\hspace{} to ERT ' i = 0 + hspace = re.compile(r'\\hspace{}') + hstar = re.compile(r'\\hspace\*{}') while True: i = find_token(document.body, "\\InsetSpace \\hspace", i) if i == -1: @@ -1950,14 +2119,28 @@ def revert_hspace(document): document.warning("Malformed lyx document: Missing '\\length' in Space inset.") return del document.body[i+1] - document.body[i] = document.body[i].replace('\\InsetSpace \\hspace*{}', \ - '\\begin_inset ERT\nstatus collapsed\n\n' \ - '\\begin_layout Standard\n\n\n\\backslash\n' \ - 'hspace*{' + length + '}\n\\end_layout\n\n\\end_inset\n\n') - document.body[i] = document.body[i].replace('\\InsetSpace \\hspace{}', \ - '\\begin_inset ERT\nstatus collapsed\n\n' \ - '\\begin_layout Standard\n\n\n\\backslash\n' \ - 'hspace{' + length + '}\n\\end_layout\n\n\\end_inset\n\n') + addedLines = -1 + if hstar.search(document.body[i]): + subst = document.body[i].replace('\\InsetSpace \\hspace*{}', \ + '\\begin_inset ERT\nstatus collapsed\n\n' \ + '\\begin_layout Standard\n\n\n\\backslash\n' \ + 'hspace*{' + length + '}\n\\end_layout\n\n\\end_inset\n\n') + subst = subst.split('\n') + document.body[i : i+1] = subst + addedLines += len(subst) - 1 + i += addedLines + 1 + continue + if hspace.search(document.body[i]): + subst = document.body[i].replace('\\InsetSpace \\hspace{}', \ + '\\begin_inset ERT\nstatus collapsed\n\n' \ + '\\begin_layout Standard\n\n\n\\backslash\n' \ + 'hspace{' + length + '}\n\\end_layout\n\n\\end_inset\n\n') + subst = subst.split('\n') + document.body[i : i+1] = subst + addedLines += len(subst) - 1 + i += addedLines + 1 + continue + i += 1 def revert_protected_hfill(document): @@ -1972,10 +2155,13 @@ def revert_protected_hfill(document): document.warning("Malformed LyX document: Could not find end of space inset.") continue del document.body[j] - document.body[i] = document.body[i].replace('\\begin_inset Space \\hspace*{\\fill}', \ - '\\begin_inset ERT\nstatus collapsed\n\n' \ - '\\begin_layout Standard\n\n\n\\backslash\n' \ - 'hspace*{\n\\backslash\nfill}\n\\end_layout\n\n\\end_inset\n\n') + subst = document.body[i].replace('\\begin_inset Space \\hspace*{\\fill}', \ + '\\begin_inset ERT\nstatus collapsed\n\n' \ + '\\begin_layout Standard\n\n\n\\backslash\n' \ + 'hspace*{\n\\backslash\nfill}\n\\end_layout\n\n\\end_inset\n\n') + subst = subst.split('\n') + document.body[i : i+1] = subst + i += len(subst) def revert_leftarrowfill(document): @@ -1990,10 +2176,13 @@ def revert_leftarrowfill(document): document.warning("Malformed LyX document: Could not find end of space inset.") continue del document.body[j] - document.body[i] = document.body[i].replace('\\begin_inset Space \\leftarrowfill{}', \ - '\\begin_inset ERT\nstatus collapsed\n\n' \ - '\\begin_layout Standard\n\n\n\\backslash\n' \ - 'leftarrowfill{}\n\\end_layout\n\n\\end_inset\n\n') + subst = document.body[i].replace('\\begin_inset Space \\leftarrowfill{}', \ + '\\begin_inset ERT\nstatus collapsed\n\n' \ + '\\begin_layout Standard\n\n\n\\backslash\n' \ + 'leftarrowfill{}\n\\end_layout\n\n\\end_inset\n\n') + subst = subst.split('\n') + document.body[i : i+1] = subst + i += len(subst) def revert_rightarrowfill(document): @@ -2008,10 +2197,13 @@ def revert_rightarrowfill(document): document.warning("Malformed LyX document: Could not find end of space inset.") continue del document.body[j] - document.body[i] = document.body[i].replace('\\begin_inset Space \\rightarrowfill{}', \ - '\\begin_inset ERT\nstatus collapsed\n\n' \ - '\\begin_layout Standard\n\n\n\\backslash\n' \ - 'rightarrowfill{}\n\\end_layout\n\n\\end_inset\n\n') + subst = document.body[i].replace('\\begin_inset Space \\rightarrowfill{}', \ + '\\begin_inset ERT\nstatus collapsed\n\n' \ + '\\begin_layout Standard\n\n\n\\backslash\n' \ + 'rightarrowfill{}\n\\end_layout\n\n\\end_inset\n\n') + subst = subst.split('\n') + document.body[i : i+1] = subst + i += len(subst) def revert_upbracefill(document): @@ -2026,10 +2218,13 @@ def revert_upbracefill(document): document.warning("Malformed LyX document: Could not find end of space inset.") continue del document.body[j] - document.body[i] = document.body[i].replace('\\begin_inset Space \\upbracefill{}', \ - '\\begin_inset ERT\nstatus collapsed\n\n' \ - '\\begin_layout Standard\n\n\n\\backslash\n' \ - 'upbracefill{}\n\\end_layout\n\n\\end_inset\n\n') + subst = document.body[i].replace('\\begin_inset Space \\upbracefill{}', \ + '\\begin_inset ERT\nstatus collapsed\n\n' \ + '\\begin_layout Standard\n\n\n\\backslash\n' \ + 'upbracefill{}\n\\end_layout\n\n\\end_inset\n\n') + subst = subst.split('\n') + document.body[i : i+1] = subst + i += len(subst) def revert_downbracefill(document): @@ -2044,10 +2239,13 @@ def revert_downbracefill(document): document.warning("Malformed LyX document: Could not find end of space inset.") continue del document.body[j] - document.body[i] = document.body[i].replace('\\begin_inset Space \\downbracefill{}', \ - '\\begin_inset ERT\nstatus collapsed\n\n' \ - '\\begin_layout Standard\n\n\n\\backslash\n' \ - 'downbracefill{}\n\\end_layout\n\n\\end_inset\n\n') + subst = document.body[i].replace('\\begin_inset Space \\downbracefill{}', \ + '\\begin_inset ERT\nstatus collapsed\n\n' \ + '\\begin_layout Standard\n\n\n\\backslash\n' \ + 'downbracefill{}\n\\end_layout\n\n\\end_inset\n\n') + subst = subst.split('\n') + document.body[i : i+1] = subst + i += len(subst) def revert_local_layout(document): @@ -2072,28 +2270,28 @@ def convert_pagebreaks(document): if i == -1: break document.body[i:i+1] = ['\\begin_inset Newpage newpage', - '\\end_inset'] + '\\end_inset'] i = 0 while True: i = find_token(document.body, '\\pagebreak', i) if i == -1: break document.body[i:i+1] = ['\\begin_inset Newpage pagebreak', - '\\end_inset'] + '\\end_inset'] i = 0 while True: i = find_token(document.body, '\\clearpage', i) if i == -1: break document.body[i:i+1] = ['\\begin_inset Newpage clearpage', - '\\end_inset'] + '\\end_inset'] i = 0 while True: i = find_token(document.body, '\\cleardoublepage', i) if i == -1: break document.body[i:i+1] = ['\\begin_inset Newpage cleardoublepage', - '\\end_inset'] + '\\end_inset'] def revert_pagebreaks(document): @@ -2122,14 +2320,14 @@ def convert_linebreaks(document): if i == -1: break document.body[i:i+1] = ['\\begin_inset Newline newline', - '\\end_inset'] + '\\end_inset'] i = 0 while True: i = find_token(document.body, '\\linebreak', i) if i == -1: break document.body[i:i+1] = ['\\begin_inset Newline linebreak', - '\\end_inset'] + '\\end_inset'] def revert_linebreaks(document): @@ -2174,7 +2372,7 @@ def revert_pdfpages(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": @@ -2276,7 +2474,7 @@ def revert_graphics_group(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_graphics_group.") i = i + 1 continue k = find_token(document.body, " groupId", i, j) @@ -2359,6 +2557,107 @@ def revert_InsetSpace(document): 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 # @@ -2409,7 +2708,7 @@ convert = [[277, [fix_wrong_tables]], [319, [convert_spaceinset, convert_hfill]], [320, []], [321, [convert_tablines]], - [322, []], + [322, [convert_plain_layout]], [323, [convert_pagebreaks]], [324, [convert_linebreaks]], [325, [convert_japanese_plain]], @@ -2423,9 +2722,15 @@ convert = [[277, [fix_wrong_tables]], [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]], @@ -2438,14 +2743,14 @@ revert = [[334, [revert_InsetSpace]], [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]], @@ -2465,7 +2770,7 @@ revert = [[334, [revert_InsetSpace]], [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]],