import sets, sys import color, mode, lex, lex_text, method, ispell class Text(mode.Fundamental): def __init__(self, w): mode.Fundamental.__init__(self, w) self.add_action_and_bindings(LearnWord(), ('C-c l',)) self.add_action_and_bindings(TextInsertSpace(), ('SPACE',)) self.add_action_and_bindings(method.WrapParagraph(), ('M-q',)) self.grammar = lex_text.TextGrammar() self.lexer = lex.Lexer(self.grammar) self.default_color = color.build('default', 'default') self.colors = { 'misspelled word': color.build('red', 'default', 'bold'), 'misspelled continued word': color.build('red', 'default', 'bold'), } def name(self): return "Text" class TextInsertSpace(method.Method): limit = 80 #wrapper = method.WrapLine wrapper = method.WrapParagraph def execute(self, window, **vargs): window.insert_string(' ') cursor = window.logical_cursor() i = cursor.y if len(window.buffer.lines[i]) > self.limit: self.wrapper().execute(window) class LearnWord(method.Method): def execute(self, window, **vargs): if window.mode.highlighter.tokens is None: window.mode.highlighter.lex_buffer() cursor = window.logical_cursor() cursor_offset = window.get_cursor_offset() tok = None for t in window.mode.highlighter.tokens: if t.start <= cursor_offset and cursor_offset < t.end: tok = t break if tok: word = tok.string if tok.name.startswith('all-caps'): s = "%r is all-caps" % (word) elif tok.name.startswith('misspelled'): ispell.get_speller().learn(word) window.mode.highlighter.invalidate_tokens() s = "Added %r to personal dictionary" % (word) else: s = "%r is already in the dictionary" % (word) else: s = "No word to learn found" window.application.set_error(s)