parent
b1322c70ab
commit
856ae98445
10
run.py
10
run.py
|
@ -1,10 +0,0 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
import commands, os, sys
|
||||
|
||||
(status, path) = commands.getstatusoutput('which python')
|
||||
|
||||
args = ['python', '-O', 'application.py']
|
||||
args.extend(sys.argv[1:])
|
||||
|
||||
os.execv(path, args)
|
140
tab.py
140
tab.py
|
@ -1,140 +0,0 @@
|
|||
import point, regex, util
|
||||
|
||||
class Tabber:
|
||||
def __init__(self, m):
|
||||
self.mode = m
|
||||
self.levels = None
|
||||
|
||||
def invalidate(self):
|
||||
self.levels = None
|
||||
|
||||
def calculate_tabs(self):
|
||||
raise Exception, "Unimplemented 22"
|
||||
|
||||
def get_indentation_level(self, y):
|
||||
if self.levels is None:
|
||||
self.calculate_tabs()
|
||||
return self.levels[y]
|
||||
|
||||
class TokenStackTabber(Tabber):
|
||||
def __init__(self, m):
|
||||
Tabber.__init__(self, m)
|
||||
|
||||
# state variables for tab processing
|
||||
self.errors = None
|
||||
self.y = None
|
||||
self.index = None
|
||||
self.tab_stack = None
|
||||
self.line_depth = None
|
||||
self.start_offset = None
|
||||
self.end_offset = None
|
||||
|
||||
def stack_append(self, item):
|
||||
self.tab_stack.append(item)
|
||||
def stack_pop(self):
|
||||
assert len(self.tab_stack) > 1, "rjrjrjr"
|
||||
self.tab_stack.pop(-1)
|
||||
|
||||
def handle_token(self, prev_token, token, next_token, y=None):
|
||||
s = token.string
|
||||
if s == "(":
|
||||
if next_token is None:
|
||||
self.stack_append((s, self.tab_stack[-1][1] + 4))
|
||||
else:
|
||||
p = self.mode.window.buffer.get_offset_point(next_token.start)
|
||||
self.stack_append((s, p.x))
|
||||
elif s == ")":
|
||||
if self.tab_stack[-1][0] == "(":
|
||||
self.stack_pop()
|
||||
if prev_token is None:
|
||||
self.line_depth = self.tab_stack[-1][1]
|
||||
else:
|
||||
# mismatched tag
|
||||
if self.errors is False:
|
||||
err = "line %d: expected %r, got %r" % \
|
||||
(self.tab_stack[-1][0], s)
|
||||
self.mode.window.application.set_error(err)
|
||||
self.errors = True
|
||||
|
||||
def base_indentation_level(self, y):
|
||||
return y == 0
|
||||
|
||||
def calculate_tabs(self, start=0, goal=None):
|
||||
lines = self.mode.window.buffer.lines
|
||||
tokens = self.mode.highlighter.tokens
|
||||
buffer = self.mode.window.buffer
|
||||
|
||||
if self.levels is None:
|
||||
self.levels = [None] * (len(lines))
|
||||
|
||||
self.errors = False
|
||||
self.index = 0
|
||||
self.y = start
|
||||
self.tab_stack = [(None, 0)]
|
||||
|
||||
# we want to process every logical line in the file
|
||||
while self.y < len(lines):
|
||||
self.line_depth = self.tab_stack[-1][1]
|
||||
|
||||
if self.index >= len(tokens):
|
||||
self.levels[self.y] = self.line_depth
|
||||
self.y += 1
|
||||
continue
|
||||
|
||||
line = lines[self.y]
|
||||
self.start_offset = buffer.get_point_offset(point.Point(0, self.y))
|
||||
self.end_offset = buffer.get_point_offset(point.Point(len(line), self.y))
|
||||
|
||||
# we want to find all the tokens on the line we are currently processing
|
||||
while self.index < len(tokens):
|
||||
token = tokens[self.index]
|
||||
|
||||
# previous token, or None if token is first on the line
|
||||
if self.index > 0 and \
|
||||
tokens[self.index - 1].start > self.start_offset:
|
||||
prev_token = tokens[self.index - 1]
|
||||
else:
|
||||
prev_token = None
|
||||
|
||||
# next token, or None if token is last on the line
|
||||
#if self.index < len(tokens) - 1 and \
|
||||
if self.index < len(tokens) - 1 and \
|
||||
tokens[self.index + 1].end <= self.end_offset:
|
||||
next_token = tokens[self.index + 1]
|
||||
else:
|
||||
next_token = None
|
||||
|
||||
if token.end < self.start_offset:
|
||||
# token is too far back
|
||||
pass
|
||||
elif token.start > self.end_offset:
|
||||
# token is too far forward
|
||||
break
|
||||
else:
|
||||
self.handle_token(prev_token, token, next_token, self.y)
|
||||
|
||||
if token.end >= self.end_offset:
|
||||
# token continues to the next line
|
||||
break
|
||||
else:
|
||||
self.index += 1
|
||||
|
||||
self.levels[self.y] = self.line_depth
|
||||
self.y += 1
|
||||
if goal is not None and self.y > goal:
|
||||
return
|
||||
|
||||
def get_indentation_level(self, y):
|
||||
if self.levels is not None and self.levels[y] is not None:
|
||||
result = self.levels[y]
|
||||
else:
|
||||
i = max(0, y - 1)
|
||||
while i > 0:
|
||||
if self.base_indentation_level(i):
|
||||
break
|
||||
i -= 1
|
||||
self.calculate_tabs(i, y)
|
||||
result = self.levels[y]
|
||||
if result == -1:
|
||||
return None
|
||||
return result
|
Loading…
Reference in New Issue