diff -r 7c0c3c912f80 modules/pgsc_spellcheck.py --- a/modules/pgsc_spellcheck.py Mon May 26 23:18:46 2014 +0200 +++ b/modules/pgsc_spellcheck.py Tue May 27 12:03:10 2014 -0400 @@ -42,6 +42,40 @@ # public objects __all__ = ['SpellChecker', 'NoDictionariesFound', 'NoGtkBindingFound'] +# apostrophe workaround from gtkspell3 +def gtk_spell_forward_word_end(i): + + # heuristic: + # if we're on an singlequote/apostrophe and + # if the next letter is alphanumeric, + # this is an apostrophe (either single quote, or U+2019 = 8217. + + if not i.forward_word_end(): + return False + + if i.get_char() != '\'' and \ + i.get_char() != 8217: + return True + + it = i.copy() + if it.forward_char() and \ + it.get_char().isalpha(): + return i.forward_word_end() + + return True + +def gtk_spell_backward_word_start(i): + if not i.backward_word_start(): + return False + + it = i.copy() + if it.get_char().isalpha() and \ + it.backward_char() and \ + (it.get_char() == '\'' or \ + it.get_char() == 8217): + return i.backward_word_start() + + return True class NoDictionariesFound(Exception): """ @@ -132,10 +166,10 @@ def word(self): start = self.iter if not start.starts_word(): - start.backward_word_start() + gtk_spell_backward_word_start(start) end = self.iter if end.inside_word(): - end.forward_word_end() + gtk_spell_forward_word_end(end) return start, end def move(self, location): @@ -361,21 +395,21 @@ return if start.equal(end): return - if end.inside_word(): end.forward_word_end() + if end.inside_word(): gtk_spell_forward_word_end(end) if not start.starts_word() and (start.inside_word() or start.ends_word()): - start.backward_word_start() + gtk_spell_backward_word_start(start) self._buffer.remove_tag(self._misspelled, start, end) cursor = self._buffer.get_iter_at_mark(self._buffer.get_insert()) precursor = cursor.copy() precursor.backward_char() highlight = (cursor.has_tag(self._misspelled) or precursor.has_tag(self._misspelled)) if not start.get_offset(): - start.forward_word_end() - start.backward_word_start() + gtk_spell_forward_word_end(start) + gtk_spell_backward_word_start(start) word_start = start.copy() while word_start.compare(end) < 0: word_end = word_start.copy() - word_end.forward_word_end() + gtk_spell_forward_word_end(word_end) in_word = ((word_start.compare(cursor) < 0) and (cursor.compare(word_end) <= 0)) if in_word and not force_all: @@ -386,8 +420,8 @@ else: self._check_word(word_start, word_end) self._deferred_check = False - word_end.forward_word_end() - word_end.backward_word_start() + gtk_spell_forward_word_end(word_end) + gtk_spell_backward_word_start(word_end) if word_start.equal(word_end): break word_start = word_end.copy()