1 # This file is part of lyx2lyx
2 # -*- coding: utf-8 -*-
3 # Copyright (C) 2002-2010 Dekel Tsur <dekel@lyx.org>,
4 # José Matos <jamatos@lyx.org>, Richard Heck <rgheck@comcast.net>
6 # This program is free software; you can redistribute it and/or
7 # modify it under the terms of the GNU General Public License
8 # as published by the Free Software Foundation; either version 2
9 # of the License, or (at your option) any later version.
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 " This modules offer several free functions to help parse lines. "
22 # Utilities for one line
23 def check_token(line, token):
24 """ check_token(line, token) -> bool
26 Return True if token is present in line and is the first element
27 else returns False."""
29 return line[:len(token)] == token
32 def is_nonempty_line(line):
33 """ is_nonempty_line(line) -> bool
35 Return False if line is either empty or it has only whitespaces,
37 return line != " "*len(line)
40 # Utilities for a list of lines
41 def find_token(lines, token, start, end = 0, exact = False):
42 """ find_token(lines, token, start[[, end], exact]) -> int
44 Return the lowest line where token is found, and is the first
45 element, in lines[start, end].
47 Return -1 on failure."""
49 if end == 0 or end > len(lines):
52 for i in xrange(start, end):
61 if lines[i][:m] == token:
66 def find_token_exact(lines, token, start, end = 0):
67 return find_token(lines, token, start, end, True)
70 def find_tokens(lines, tokens, start, end = 0, exact = False):
71 """ find_tokens(lines, tokens, start[[, end], exact]) -> int
73 Return the lowest line where one token in tokens is found, and is
74 the first element, in lines[start, end].
76 Return -1 on failure."""
80 for i in xrange(start, end):
90 if lines[i][:len(token)] == token:
95 def find_tokens_exact(lines, tokens, start, end = 0):
96 return find_tokens(lines, tokens, start, end, True)
99 def find_re(lines, rexp, start, end = 0):
100 """ find_token_re(lines, rexp, start[, end]) -> int
102 Return the lowest line where rexp, a regular expression, is found
103 in lines[start, end].
105 Return -1 on failure."""
109 for i in xrange(start, end):
110 if rexp.match(lines[i]):
115 def find_token_backwards(lines, token, start):
116 """ find_token_backwards(lines, token, start) -> int
118 Return the highest line where token is found, and is the first
119 element, in lines[start, end].
121 Return -1 on failure."""
123 for i in xrange(start, -1, -1):
125 if line[:m] == token:
130 def find_tokens_backwards(lines, tokens, start):
131 """ find_tokens_backwards(lines, token, start) -> int
133 Return the highest line where token is found, and is the first
134 element, in lines[end, start].
136 Return -1 on failure."""
137 for i in xrange(start, -1, -1):
140 if line[:len(token)] == token:
145 def get_value(lines, token, start, end = 0, default = ""):
146 """ get_value(lines, token, start[[, end], default]) -> string
148 Find the next line that looks like:
149 token followed by other stuff
150 Returns "followed by other stuff" with leading and trailing
154 i = find_token_exact(lines, token, start, end)
157 l = lines[i].split(None, 1)
163 def del_token(lines, token, start, end):
164 """ del_token(lines, token, start, end) -> int
166 Find the lower line in lines where token is the first element and
169 Returns the number of lines remaining."""
171 k = find_token_exact(lines, token, start, end)
179 def find_beginning_of(lines, i, start_token, end_token):
182 i = find_tokens_backwards(lines, [start_token, end_token], i-1)
185 if check_token(lines[i], end_token):
194 def find_end_of(lines, i, start_token, end_token):
198 i = find_tokens(lines, [end_token, start_token], i+1)
201 if check_token(lines[i], start_token):
210 def find_nonempty_line(lines, start, end = 0):
213 for i in xrange(start, end):
214 if is_nonempty_line(lines[i]):
219 def find_end_of_inset(lines, i):
220 " Find end of inset, where lines[i] is included."
221 return find_end_of(lines, i, "\\begin_inset", "\\end_inset")
224 def find_end_of_layout(lines, i):
225 " Find end of layout, where lines[i] is included."
226 return find_end_of(lines, i, "\\begin_layout", "\\end_layout")
229 # checks if line i is in the given inset
230 # if so, returns starting and ending lines
231 # otherwise, returns (-1, -1)
233 # get_containing_inset(document.body, i, "\\begin_inset Tabular")
234 # returns (-1, -1) unless i is within a table.
235 def get_containing_inset(lines, i, inset):
237 stins = find_token_backwards(lines, inset, i)
240 endins = find_end_of_inset(lines, stins)
241 # note that this includes the notfound case.
244 return (stins, endins)