X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=lib%2Flyx2lyx%2Fparser_tools.py;h=c3d9899e88b7d995109d9062de51fa2feb3920da;hb=b8227ebda0a2a8127731749d2caaa5dae45ef5d7;hp=5acd869497e4522e84d202306e8b45ba2ee79172;hpb=013d66f033052c8cab42e82dbd846649861f6e9a;p=lyx.git diff --git a/lib/lyx2lyx/parser_tools.py b/lib/lyx2lyx/parser_tools.py index 5acd869497..c3d9899e88 100644 --- a/lib/lyx2lyx/parser_tools.py +++ b/lib/lyx2lyx/parser_tools.py @@ -1,5 +1,6 @@ # This file is part of lyx2lyx -# Copyright (C) 2002 Dekel Tsur , José Matos +# -*- coding: iso-8859-1 -*- +# Copyright (C) 2002-2004 Dekel Tsur , José Matos # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -16,12 +17,14 @@ # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. import string +import re def check_token(line, token): if line[:len(token)] == token: return 1 return 0 + # We need to check that the char after the token is space, but I think # we can ignore this def find_token(lines, token, start, end = 0): @@ -33,6 +36,17 @@ def find_token(lines, token, start, end = 0): return i return -1 + +def find_token2(lines, token, start, end = 0): + if end == 0: + end = len(lines) + for i in xrange(start, end): + x = string.split(lines[i]) + if len(x) > 0 and x[0] == token: + return i + return -1 + + def find_tokens(lines, tokens, start, end = 0): if end == 0: end = len(lines) @@ -43,6 +57,7 @@ def find_tokens(lines, tokens, start, end = 0): return i return -1 + def find_re(lines, rexp, start, end = 0): if end == 0: end = len(lines) @@ -51,6 +66,7 @@ def find_re(lines, rexp, start, end = 0): return i return -1 + def find_token_backwards(lines, token, start): m = len(token) for i in xrange(start, -1, -1): @@ -59,6 +75,7 @@ def find_token_backwards(lines, token, start): return i return -1 + def find_tokens_backwards(lines, tokens, start): for i in xrange(start, -1, -1): line = lines[i] @@ -67,31 +84,126 @@ def find_tokens_backwards(lines, tokens, start): return i return -1 + def get_value(lines, token, start, end = 0): - i = find_token(lines, token, start, end) + i = find_token2(lines, token, start, end) if i == -1: return "" - return string.split(lines[i])[1] + if len(string.split(lines[i])) > 1: + return string.split(lines[i])[1] + else: + return "" + + +def get_layout(line, default_layout): + tokens = string.split(line) + if len(tokens) > 1: + return tokens[1] + return default_layout + + +def del_token(lines, token, i, j): + k = find_token2(lines, token, i, j) + if k == -1: + return j + else: + del lines[k] + return j-1 + # Finds the paragraph that contains line i. -def get_paragraph(lines, i): - while 1: - i = find_tokens_backwards(lines, ["\\end_inset", "\\layout"], i) - if check_token(lines[i], "\\layout"): +def get_paragraph(lines, i, format): + if format < 225: + begin_layout = "\\layout" + else: + begin_layout = "\\begin_layout" + while i != -1: + i = find_tokens_backwards(lines, ["\\end_inset", begin_layout], i) + if i == -1: return -1 + if check_token(lines[i], begin_layout): + return i + i = find_beginning_of_inset(lines, i) + return -1 + + +# Finds the paragraph after the paragraph that contains line i. +def get_next_paragraph(lines, i, format): + if format < 225: + tokens = ["\\begin_inset", "\\layout", "\\end_float", "\\the_end"] + elif format < 236: + tokens = ["\\begin_inset", "\\begin_layout", "\\end_float", "\\end_document"] + else: + tokens = ["\\begin_inset", "\\begin_layout", "\\end_float", "\\end_body", "\\end_document"] + while i != -1: + i = find_tokens(lines, tokens, i) + if not check_token(lines[i], "\\begin_inset"): return i - count = 1 - while count > 0: - i = find_tokens_backwards(lines, ["\\end_inset", "\\begin_inset"], i) - if check_token(lines[i], "\\end_inset"): - count = count+1 - else: - count = count-1 - i = i-1 + i = find_end_of_inset(lines, i) + return -1 + + +def find_end_of(lines, i, start_token, end_token): + count = 1 + n = len(lines) + while i < n: + i = find_tokens(lines, [end_token, start_token], i+1) + if check_token(lines[i], start_token): + count = count+1 + else: + count = count-1 + if count == 0: + return i + return -1 + + +# Finds the matching \end_inset +def find_beginning_of(lines, i, start_token, end_token): + count = 1 + while i > 0: + i = find_tokens_backwards(lines, [start_token, end_token], i-1) + if check_token(lines[i], end_token): + count = count+1 + else: + count = count-1 + if count == 0: + return i + return -1 + + +# Finds the matching \end_inset +def find_end_of_inset(lines, i): + return find_end_of(lines, i, "\\begin_inset", "\\end_inset") + + +# Finds the matching \end_inset +def find_beginning_of_inset(lines, i): + return find_beginning_of(lines, i, "\\begin_inset", "\\end_inset") + + +def find_end_of_tabular(lines, i): + return find_end_of(lines, i, "