pmacs3/tab_perl.py

84 lines
3.0 KiB
Python
Raw Normal View History

2007-03-06 10:05:38 -05:00
import tab
class PerlTabber(tab.TokenStackTabber):
close_tags = {'}': '{',
')': '(',
']': '['}
def error(self, s):
self.mode.window.application.set_error(s)
self.errors = True
def base_indentation_level(self, y):
if y == 0:
return True
lines = self.mode.window.buffer.lines
if y < len(lines) and lines[y].startswith('sub '):
return True
return False
def stack_append_const(self, c):
if self.tab_stack[-1][0] != c:
self.stack_append((c, self.tab_stack[-1][1] + 4))
def stack_pop_const(self, c):
if self.tab_stack[-1][0] in c_args:
self.stack_pop()
def stack_pop_all_const(self, *c_args):
while self.tab_stack[-1][0] in c_args:
self.stack_pop()
def handle_token(self, prev_token, token, next_token, y=None):
buffer = self.mode.window.buffer
name = token.name
s = token.string
if name == "delimiter":
if s == "{" or s == "(" or s == "[":
if prev_token is None:
self.stack_pop_all_const("cont")
if next_token is None:
self.stack_append((s, self.tab_stack[-1][1] + 4))
else:
p = buffer.get_offset_point(next_token.start)
self.stack_append((s, p.x))
elif s == "}" or s == ")" or s == "]":
self.stack_pop_all_const("cont")
if self.tab_stack[-1][0] == self.close_tags[s]:
self.stack_pop()
if prev_token is None:
self.line_depth = self.tab_stack[-1][1]
elif self.errors is False:
self.error("tag mismatch, line %d: expected %r, got %r" %
(self.y, self.tab_stack[-1][0], s))
if s == "}":
self.stack_pop_all_const("cont")
else:
pass
elif s == ";":
self.stack_pop_all_const("cont")
elif name == "heredoc":
if token.start > self.start_offset:
self.stack_append(('heredoc', -1))
elif token.end <= self.end_offset:
self.stack_pop_all_const("heredoc")
self.stack_pop_all_const("cont")
elif name == "pod":
if token.start >= self.start_offset:
self.stack_append(('pod', -1))
elif token.end <= self.end_offset:
assert self.tab_stack[-1][0] == 'pod', "vvvvvveije9876"
self.stack_pop()
self.line_depth = self.tab_stack[-1][1]
if (name != "heredoc" and
name != "endblock" and
name != "pod" and
name != "comment" and
s != "}" and
s != ";" and
s != "(" and
s != "{" and
s != "[" and
s != ",") and next_token is None:
self.stack_append_const("cont")