Package lepl :: Package lexer :: Package lines :: Module monitor
[hide private]
[frames] | no frames]

Source Code for Module lepl.lexer.lines.monitor

 1   
 2  # The contents of this file are subject to the Mozilla Public License 
 3  # (MPL) Version 1.1 (the "License"); you may not use this file except 
 4  # in compliance with the License. You may obtain a copy of the License 
 5  # at http://www.mozilla.org/MPL/ 
 6  # 
 7  # Software distributed under the License is distributed on an "AS IS" 
 8  # basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See 
 9  # the License for the specific language governing rights and 
10  # limitations under the License. 
11  # 
12  # The Original Code is LEPL (http://www.acooke.org/lepl) 
13  # The Initial Developer of the Original Code is Andrew Cooke. 
14  # Portions created by the Initial Developer are Copyright (C) 2009-2010 
15  # Andrew Cooke (andrew@acooke.org). All Rights Reserved. 
16  # 
17  # Alternatively, the contents of this file may be used under the terms 
18  # of the LGPL license (the GNU Lesser General Public License, 
19  # http://www.gnu.org/licenses/lgpl.html), in which case the provisions 
20  # of the LGPL License are applicable instead of those above. 
21  # 
22  # If you wish to allow use of your version of this file only under the 
23  # terms of the LGPL License and not to allow others to use your version 
24  # of this file under the MPL, indicate your decision by deleting the 
25  # provisions above and replace them with the notice and other provisions 
26  # required by the LGPL License.  If you do not delete the provisions 
27  # above, a recipient may use your version of this file under either the 
28  # MPL or the LGPL License. 
29   
30  ''' 
31  Support the stack-scoped tracking of indent level blocks. 
32  ''' 
33   
34   
35  from lepl.core.monitor import ActiveMonitor 
36  from lepl.support.state import State 
37  from lepl.support.lib import LogMixin, fmt 
38 39 40 -class BlockMonitor(ActiveMonitor, LogMixin):
41 ''' 42 This tracks the current indent level (in number of spaces). It is 43 read by `Line` and updated by `Block`. 44 ''' 45
46 - def __init__(self, start=0):
47 ''' 48 start is the initial indent (in spaces). 49 ''' 50 super(BlockMonitor, self).__init__() 51 self.__stack = [start] 52 self.__state = State.singleton()
53
54 - def push_level(self, level):
55 ''' 56 Add a new indent level. 57 ''' 58 self.__stack.append(level) 59 self.__state[BlockMonitor] = level 60 self._debug(fmt('Indent -> {0:d}', level))
61
62 - def pop_level(self):
63 ''' 64 Drop one level. 65 ''' 66 self.__stack.pop() 67 if not self.__stack: 68 raise OffsideError('Closed an unopened indent.') 69 self.__state[BlockMonitor] = self.indent 70 self._debug(fmt('Indent <- {0:d}', self.indent))
71 72 @property
73 - def indent(self):
74 ''' 75 The current indent value (number of spaces). 76 ''' 77 return self.__stack[-1]
78
79 80 -def block_monitor(start=0):
81 ''' 82 Add an extra lambda for the standard monitor interface. 83 ''' 84 return lambda: BlockMonitor(start)
85
86 87 -class OffsideError(Exception):
88 ''' 89 The exception raised by problems when parsing whitespace significant 90 code. 91 '''
92