X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=lib%2Flyx2lyx%2Fparser_tools.py;h=3b1322974e6878e058be8533b7ca8c73c60cca63;hb=9da74fe2078e24e1e7891784ecbfe33ff77e7f85;hp=83cf303225db2c779fd8c3f56147aef3fd728727;hpb=95934b8d27ed664181573fc3d83ce57689f249dd;p=lyx.git diff --git a/lib/lyx2lyx/parser_tools.py b/lib/lyx2lyx/parser_tools.py index 83cf303225..3b1322974e 100644 --- a/lib/lyx2lyx/parser_tools.py +++ b/lib/lyx2lyx/parser_tools.py @@ -104,6 +104,12 @@ find_end_of_inset(lines, i): find_end_of_layout(lines, i): Specialization of find_end_of for layouts. +find_end_of_sequence(lines, i): + Find the end of the sequence of layouts of the same kind. + Considers nesting. If the last paragraph in sequence is nested, + the position of the last \end_deeper is returned, else + the position of the last \end_layout. + is_in_inset(lines, i, inset): Checks if line i is in an inset of the given type. If so, returns starting and ending lines. Otherwise, @@ -119,7 +125,7 @@ is_in_inset(lines, i, inset): get_containing_inset(lines, i): Finds out what kind of inset line i is within. Returns a - list containing what follows \begin_inset on the the line + list containing what follows \begin_inset on the line on which the inset begins, plus the starting and ending line. Returns False on any kind of error or if it isn't in an inset. So get_containing_inset(document.body, i) might return: @@ -141,6 +147,9 @@ check_token(line, token): is_nonempty_line(line): Does line contain something besides whitespace? +count_pars_in_inset(lines, i): + Counts the paragraphs inside an inset. + ''' import re @@ -417,7 +426,7 @@ def is_in_inset(lines, i, inset): def get_containing_inset(lines, i): ''' Finds out what kind of inset line i is within. Returns a - list containing (i) what follows \begin_inset on the the line + list containing (i) what follows \begin_inset on the line on which the inset begins, plus the starting and ending line. Returns False on any kind of error or if it isn't in an inset. ''' @@ -441,7 +450,7 @@ def get_containing_inset(lines, i): def get_containing_layout(lines, i): ''' Finds out what kind of layout line i is within. Returns a - list containing (i) what follows \begin_layout on the the line + list containing (i) what follows \begin_layout on the line on which the layout begins, plus the starting and ending line and the start of the apargraph (after all params). Returns False on any kind of error. @@ -470,3 +479,51 @@ def get_containing_layout(lines, i): if lines[stpar] not in par_params: break return (lay, stlay, endlay, stpar) + + +def count_pars_in_inset(lines, i): + ''' + Counts the paragraphs within this inset + ''' + ins = get_containing_inset(lines, i) + if ins == -1: + return -1 + pars = 0 + for j in range(ins[1], ins[2]): + m = re.match(r'\\begin_layout (.*)', lines[j]) + if m and get_containing_inset(lines, j)[0] == ins[0]: + pars += 1 + + return pars + + +def find_end_of_sequence(lines, i): + ''' + Returns the end of a sequence of identical layouts. + ''' + lay = get_containing_layout(lines, i) + if lay == False: + return -1 + layout = lay[0] + endlay = lay[2] + i = endlay + while True: + m = re.match(r'\\begin_layout (.*)', lines[i]) + if m and m.group(1) != layout: + return endlay + elif lines[i] == "\\begin_deeper": + j = find_end_of(lines, i, "\\begin_deeper", "\\end_deeper") + if j != -1: + i = j + endlay = j + continue + if m and m.group(1) == layout: + endlay = find_end_of_layout(lines, i) + i = endlay + continue + if i == len(lines) - 1: + break + i = i + 1 + + return endlay +