X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=lib%2Flyx2lyx%2Flyx_1_6.py;h=2d0964c3afeab7f80a4da853715b9c4feea507ea;hb=9da74fe2078e24e1e7891784ecbfe33ff77e7f85;hp=43ea288ca48bd0615fa056781cc8956c85441ef5;hpb=3a8121ddee60ee6360ffa91efd7e91f26829f616;p=lyx.git diff --git a/lib/lyx2lyx/lyx_1_6.py b/lib/lyx2lyx/lyx_1_6.py index 43ea288ca4..2d0964c3af 100644 --- a/lib/lyx2lyx/lyx_1_6.py +++ b/lib/lyx2lyx/lyx_1_6.py @@ -14,7 +14,7 @@ # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA """ Convert files to the file format generated by lyx 1.6""" @@ -22,11 +22,27 @@ import re import unicodedata import sys, os -from parser_tools import find_token, find_end_of, find_tokens, get_value, get_value_string +from parser_tools import find_token, find_end_of, find_tokens, get_value #################################################################### # Private helper functions + +def get_value_string(lines, token, start, end = 0, trim = False, default = ""): + """ get_value_string(lines, token, start[[, end], trim, default]) -> string + + Return tokens after token as string, in lines, where + token is the first element. When trim is used, the first and last character + of the string is trimmed.""" + + val = get_value(lines, token, start, end, "") + if not val: + return default + if trim: + return val[1:-1] + return val + + 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") @@ -35,7 +51,7 @@ def find_end_of_inset(lines, i): # 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: +# in document.body. Instead, do something like this: # subst = wrap_inset_ert(...) # subst = subst.split('\n') # document.body[i:i+1] = subst @@ -209,7 +225,7 @@ def extract_argument(line): return (line[:pos + 1], line[pos + 1:]) -def latex2ert(line): +def latex2ert(line, isindex): '''Converts LaTeX commands into ERT. line may well be a multi-line string when it is returned.''' if not line: @@ -246,6 +262,9 @@ def latex2ert(line): # put all remaining braces in ERT line = wrap_into_ert(line, '}', '}') line = wrap_into_ert(line, '{', '{') + if isindex: + # active character that is not available in all font encodings + line = wrap_into_ert(line, '|', '|') retval += line return retval @@ -257,10 +276,12 @@ unicode_reps = read_unicodesymbols() #end up inside ERT. That routine could be modified so that it returned #a list of lines, and we could then skip ERT bits and only deal with #the other bits. -def latex2lyx(data): +def latex2lyx(data, isindex): '''Takes a string, possibly multi-line, and returns the result of converting LaTeX constructs into LyX constructs. Returns a list of - lines, suitable for insertion into document.body.''' + lines, suitable for insertion into document.body. + The bool isindex specifies whether we are in an index macro (which + has some specific active characters that need to be ERTed).''' if not data: return [""] @@ -309,14 +330,14 @@ def latex2lyx(data): g = m.group(3) if s: # this is non-math! - s = latex2ert(s) + s = latex2ert(s, isindex) subst = s.split('\n') retval += subst retval.append("\\begin_inset Formula " + f) retval.append("\\end_inset") m = mathre.match(g) # Handle whatever is left, which is just text - g = latex2ert(g) + g = latex2ert(g, isindex) subst = g.split('\n') retval += subst return retval @@ -417,6 +438,7 @@ def convert_ltcaption(document): j = find_end_of_inset(document.body, i + 1) if j == -1: document.warning("Malformed LyX document: Could not find end of tabular.") + i += 1 continue nrows = int(document.body[i+1].split('"')[3]) @@ -467,6 +489,7 @@ def revert_ltcaption(document): j = find_end_of_inset(document.body, i + 1) if j == -1: document.warning("Malformed LyX document: Could not find end of tabular.") + i += 1 continue m = i + 1 @@ -507,6 +530,7 @@ def convert_tablines(document): j = find_end_of_inset(document.body, i + 1) if j == -1: document.warning("Malformed LyX document: Could not find end of tabular.") + i += 1 continue m = i + 1 @@ -566,9 +590,10 @@ def revert_tablines(document): i = find_token(document.body, "\\begin_inset Tabular", i) if i == -1: return - j = find_end_of_inset(document.body, i + 1) + j = find_end_of_inset(document.body, i) if j == -1: document.warning("Malformed LyX document: Could not find end of tabular.") + i += 1 continue m = i + 1 @@ -645,6 +670,7 @@ def fix_wrong_tables(document): j = find_end_of_inset(document.body, i + 1) if j == -1: document.warning("Malformed LyX document: Could not find end of tabular.") + i += 1 continue m = i + 1 @@ -767,7 +793,7 @@ def convert_flex(document): document.body[i] = document.body[i].replace('\\begin_inset CharStyle', '\\begin_inset Flex') def revert_flex(document): - "Convert Flex to CharStyle" + "Revert Flex to CharStyle" i = 0 while True: i = find_token(document.body, "\\begin_inset Flex", i) @@ -947,6 +973,8 @@ def remove_inzip_options(document): if j == -1: # should not happen document.warning("Malformed LyX document: Could not find end of graphics inset.") + i += 1 + continue # If there's a inzip param, just remove that k = find_token(document.body, "\tinzipName", i + 1, j) if k != -1: @@ -1096,7 +1124,7 @@ def convert_latexcommand_index(document): linelist = [""] else: fullcontent = m.group(1) - linelist = latex2lyx(fullcontent) + linelist = latex2lyx(fullcontent, True) #document.warning(fullcontent) linelist = ["\\begin_inset Index", "status collapsed", "\\begin_layout Standard", ""] + \ @@ -1235,6 +1263,8 @@ def revert_inset_info(document): if j == -1: # should not happen document.warning("Malformed LyX document: Could not find end of Info inset.") + i += 1 + continue type = 'unknown' arg = '' for k in range(i, j+1): @@ -1570,7 +1600,7 @@ def convert_macro_global(document): "Remove TeX code command \global when it is in front of a macro" # math macros are nowadays already defined \global, so that an additional # \global would make the document uncompilable, see - # http://bugzilla.lyx.org/show_bug.cgi?id=5371 + # http://www.lyx.org/trac/ticket/5371 # We're looking for something like this: # \begin_inset ERT # status collapsed @@ -1754,7 +1784,7 @@ def revert_module_names(document): return newmodlist = [] for mod in modlist: - if modulemap.has_key(mod): + if mod in modulemap: newmodlist.append(modulemap[mod]) else: document.warning("Can't find module %s in the module map!" % mod) @@ -1792,19 +1822,24 @@ def revert_framed_notes(document): if j == -1: # should not happen document.warning("Malformed LyX document: Could not find end of Box inset.") + i += 1 + continue k = find_token(document.body, "status", i + 1, j) if k == -1: document.warning("Malformed LyX document: Missing `status' tag in Box inset.") - return + i = j + continue status = document.body[k] l = find_default_layout(document, i + 1, j) if l == -1: document.warning("Malformed LyX document: Missing `\\begin_layout' in Box inset.") - return + i = j + continue m = find_token(document.body, "\\end_layout", i + 1, j) if m == -1: document.warning("Malformed LyX document: Missing `\\end_layout' in Box inset.") - return + i = j + continue ibox = find_token(document.body, "has_inner_box 1", i + 1, k) pbox = find_token(document.body, "use_parbox 1", i + 1, k) if ibox == -1 and pbox == -1: @@ -1867,7 +1902,8 @@ def revert_nobreakdash(document): j = find_token(document.header, "\\use_amsmath", 0) if j == -1: document.warning("Malformed LyX document: Missing '\\use_amsmath'.") - return + i += 1 + continue document.header[j] = "\\use_amsmath 2" else: i = i + 1 @@ -2041,7 +2077,8 @@ def revert_rotfloat(document): l = find_default_layout(document, i + 1, j) if l == -1: document.warning("Malformed LyX document: Missing `\\begin_layout' in Float inset.") - return + i = j + continue subst = ['\\begin_layout Standard', '\\begin_inset ERT', 'status collapsed', '', @@ -2103,7 +2140,8 @@ def revert_widesideways(document): l = find_default_layout(document, i + 1, j) if l == -1: document.warning("Malformed LyX document: Missing `\\begin_layout' in Float inset.") - return + i = j + continue subst = ['\\begin_layout Standard', '\\begin_inset ERT', 'status collapsed', '', '\\begin_layout Standard', '', '', '\\backslash', @@ -2176,7 +2214,7 @@ def convert_subfig(document): addedLines -= 1 subst = ['\\begin_inset Float figure', 'wide false', 'sideways false', 'status open', '', '\\begin_layout Plain Layout', '\\begin_inset Caption', - '', '\\begin_layout Plain Layout'] + latex2lyx(caption) + \ + '', '\\begin_layout Plain Layout'] + latex2lyx(caption, False) + \ [ '\\end_layout', '', '\\end_inset', '', '\\end_layout', '', '\\begin_layout Plain Layout'] document.body[i : i] = subst @@ -2262,7 +2300,7 @@ def revert_subfig(document): if opt != -1: optend = find_end_of_inset(document.body, opt) if optend == -1: - document.warning("Malformed lyx document: Missing '\\end_inset' (OptArg).") + document.warning("Malformed LyX document: Missing '\\end_inset' (OptArg).") return optc = find_default_layout(document, opt, optend) if optc == -1: @@ -2372,6 +2410,7 @@ def revert_spaceinset(document): j = find_end_of_inset(document.body, i) if j == -1: document.warning("Malformed LyX document: Could not find end of space inset.") + i += 1 continue document.body[i] = document.body[i].replace('\\begin_inset Space', '\\InsetSpace') del document.body[j] @@ -2474,6 +2513,7 @@ def revert_protected_hfill(document): j = find_end_of_inset(document.body, i) if j == -1: document.warning("Malformed LyX document: Could not find end of space inset.") + i += 1 continue del document.body[j] subst = document.body[i].replace('\\begin_inset Space \\hspace*{\\fill}', \ @@ -2495,6 +2535,7 @@ def revert_leftarrowfill(document): j = find_end_of_inset(document.body, i) if j == -1: document.warning("Malformed LyX document: Could not find end of space inset.") + i += 1 continue del document.body[j] subst = document.body[i].replace('\\begin_inset Space \\leftarrowfill{}', \ @@ -2516,6 +2557,7 @@ def revert_rightarrowfill(document): j = find_end_of_inset(document.body, i) if j == -1: document.warning("Malformed LyX document: Could not find end of space inset.") + i += 1 continue del document.body[j] subst = document.body[i].replace('\\begin_inset Space \\rightarrowfill{}', \ @@ -2537,6 +2579,7 @@ def revert_upbracefill(document): j = find_end_of_inset(document.body, i) if j == -1: document.warning("Malformed LyX document: Could not find end of space inset.") + i += 1 continue del document.body[j] subst = document.body[i].replace('\\begin_inset Space \\upbracefill{}', \ @@ -2558,6 +2601,7 @@ def revert_downbracefill(document): j = find_end_of_inset(document.body, i) if j == -1: document.warning("Malformed LyX document: Could not find end of space inset.") + i += 1 continue del document.body[j] subst = document.body[i].replace('\\begin_inset Space \\downbracefill{}', \ @@ -2625,6 +2669,7 @@ def revert_pagebreaks(document): j = find_end_of_inset(document.body, i) if j == -1: document.warning("Malformed LyX document: Could not find end of Newpage inset.") + i += 1 continue del document.body[j] document.body[i] = document.body[i].replace('\\begin_inset Newpage newpage', '\\newpage') @@ -2661,6 +2706,7 @@ def revert_linebreaks(document): j = find_end_of_inset(document.body, i) if j == -1: document.warning("Malformed LyX document: Could not find end of Newline inset.") + i += 1 continue del document.body[j] document.body[i] = document.body[i].replace('\\begin_inset Newline newline', '\\newline') @@ -2833,7 +2879,7 @@ def update_apa_styles(document): def convert_paper_sizes(document): ' exchange size options legalpaper and executivepaper to correct order ' - # routine is needed to fix http://bugzilla.lyx.org/show_bug.cgi?id=4868 + # routine is needed to fix http://www.lyx.org/trac/ticket/4868 i = 0 j = 0 i = find_token(document.header, "\\papersize executivepaper", 0)