import color, method, mode2, re
from lex3 import Grammar, PatternRule, RegionRule

class DiffGrammar(Grammar):
    rules = [
        PatternRule(name=r'left', pattern=r"^\-.*$"),
        PatternRule(name=r'right', pattern=r"^\+.*$"),
        PatternRule(name=r'metadata', pattern=r'^[A-Za-z].*$'),
        PatternRule(name=r'seperator', pattern=r'^={67}$'),
        PatternRule(name=r'location', pattern=r"(?:^|(?<=\n))@@ [-+0-9a-z, ]* @@(?:$|\n)"),
        PatternRule(name=r'common', pattern=r"(?:^|(?<=\n)).*(?:$|\n)"),
    ]

class Diff(mode2.Fundamental):
    grammar = DiffGrammar()
    colors = {
        'left':      ('red', 'default', 'bold'),
        'right':     ('blue', 'default', 'bold'),
        'seperator': ('magenta', 'default', 'bold'),
        'metadata':  ('magenta', 'default', 'bold'),
        'location':  ('magenta', 'default', 'bold'),
    }
    def __init__(self, w):
        mode2.Fundamental.__init__(self, w)
        #self.add_action_and_bindings(DiffNextSection(), ('M-n', 'M-D_ARROW',))
        #self.add_action_and_bindings(DiffPreviousSection(), ('M-p', 'M-U_ARROW',))
    def name(self):
        return "Diff"

class DiffNextSection(method.Method):
    re = re.compile("(?:^|(?<=\n))@@ [-+0-9a-z, ]* @@(?:$|\n)")
    def _execute(self, w, **vargs):
        cursor = w.logical_cursor()
        i = cursor.y + 1
        while i < len(w.buffer.lines):
            if self.re.match(w.buffer.lines[i]):
                w.goto_line(i)
                return
            i += 1

class DiffPreviousSection(method.Method):
    re = re.compile("(?:^|(?<=\n))@@ [-+0-9a-z, ]* @@(?:$|\n)")
    def _execute(self, w, **vargs):
        cursor = w.logical_cursor()
        i = cursor.y - 1
        while i >= 0:
            if self.re.match(w.buffer.lines[i]):
                w.goto_line(i)
                return
            i -= 1