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.
+
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,
on line 306.
get_containing_layout(lines, i):
- As get_containing_inset, but for layout.
+ As get_containing_inset, but for layout. Additionally returns the
+ position of real paragraph start (after par params) as 4th value.
find_nonempty_line(lines, start[, end):
is_nonempty_line(line):
Does line contain something besides whitespace?
+count_pars_in_inset(lines, i):
+ Counts the paragraphs inside an inset.
+
'''
import re
'''
Finds out what kind of layout line i is within. Returns a
list containing (i) what follows \begin_layout on the the line
- on which the layout begins, plus the starting and ending 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.
'''
j = i
if lay == "":
# shouldn't happen
return False
- return (lay, stlay, endlay)
+ par_params = ["\\noindent", "\\indent", "\\indent-toggle", "\\leftindent",
+ "\\start_of_appendix", "\\paragraph_spacing single",
+ "\\paragraph_spacing onehalf", "\\paragraph_spacing double",
+ "\\paragraph_spacing other", "\\align", "\\labelwidthstring"]
+ stpar = stlay
+ while True:
+ stpar += 1
+ 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
+ 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
+