#!/usr/bin/env python import os, sys from subprocess import Popen, PIPE, STDOUT import cache _speller = None _can_spell = os.system('which ispell > /dev/null 2>&1') == 0 def can_spell(): return _can_spell def get_speller(): global _speller if _can_spell and not _speller: _speller = Speller() return _speller def free(): global _speller if _speller: _speller.stop() _speller = None class Speller(object): def __init__(self, cmd='ispell'): self.pipe = None self.cache = cache.CacheDict() self.cmd = cmd self.start() def start(self): assert self.pipe is None self.pipe = Popen('%s -a' % self.cmd, shell=True, stdin=PIPE, stdout=PIPE) self.pipe.stdout.readline() def stop(self): self.pipe.stdin.close() self.pipe.stdout.close() self.pipe = None def restart(self): self.stop() self.start() def flush(self, word): if word in self.cache: del self.cache[word] def check(self, word, caps=False, title=True): # here are some quick checks: # 1. zero-length words # 2. all-caps word # 3. words whose first letter is capitalized if len(word) == 0: return True elif not caps and word.isupper(): return True elif not title and word[0].isupper(): return True result = False if word in self.cache: result = self.cache[word] else: if self.pipe.poll() >= 0: self.pipe = None self.start() self.pipe.stdin.write("%s\n" % (word)) self.pipe.stdin.flush() l = self.pipe.stdout.readline() if l.startswith("*") or l.startswith("+") or l.startswith("-"): result = True while True: l = self.pipe.stdout.readline() if l == "\n": break self.cache[word] = result return result def learn(self, word): if self.pipe.poll() >= 0: self.pipe = None self.start() self.pipe.stdin.write("*%s\n" % (word)) self.pipe.stdin.flush() self.flush(word) if __name__ == "__main__": s = Speller() while True: sys.stdout.write('enter a word: ') line = sys.stdin.readline() if not line: print break elif line == '\n': continue elif ' ' in line: print 'please enter a single world' continue for word in line.split('-'): word = word.strip() if s.check(word): print '%s: ok' % word else: print '%s: misspelled' % word