pmacs3/tab_sql.py

52 lines
1.8 KiB
Python

import tab
class SQLTabber(tab.TokenStackTabber):
close_tags = {')': '('}
def error(self, s):
self.mode.window.application.set_error(s)
self.errors = True
def base_indentation_level(self, y):
return y == 0
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 == '(':
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 == ')':
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))
elif s == ',':
pass
elif s == ';':
pass
elif name == 'string':
if token.start > self.start_offset:
self.stack_append(('string', -1))
if token.end <= self.end_offset:
self.stack_pop_all_const("string")