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")