pmacs3/ispell.py

81 lines
2.1 KiB
Python
Raw Normal View History

2008-03-16 16:26:32 -04:00
import os
from subprocess import Popen, PIPE, STDOUT
2007-03-06 10:05:38 -05:00
import cache
_speller = None
_can_spell = os.system('which ispell > /dev/null 2>&1') == 0
def can_spell():
global _can_spell
return _can_spell
def get_speller():
global _speller
return _speller
2008-03-14 17:17:04 -04:00
class Speller(object):
2007-03-06 10:05:38 -05:00
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
2008-03-16 16:26:32 -04:00
self.pipe = Popen('%s -a' % self.cmd, shell=True, stdin=PIPE, stdout=PIPE)
self.pipe.stdout.readline()
2007-03-06 10:05:38 -05:00
def stop(self):
2008-03-16 16:26:32 -04:00
self.pipe.stdin.close()
self.pipe.stdout.close()
2007-03-06 10:05:38 -05:00
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()
2008-03-16 16:26:32 -04:00
l = self.pipe.stdout.readline()
2007-03-06 10:05:38 -05:00
if l.startswith("*") or l.startswith("+") or l.startswith("-"):
result = True
while True:
2008-03-16 16:26:32 -04:00
l = self.pipe.stdout.readline()
2007-03-06 10:05:38 -05:00
if l == "\n":
break
self.cache[word] = result
return result
def learn(self, word):
if self.pipe.poll() >= 0:
self.pipe = None
self.start()
2008-03-16 16:26:32 -04:00
self.pipe.stdin.write("*%s\n" % (word))
self.pipe.stdin.flush()
2007-03-06 10:05:38 -05:00
self.flush(word)
if _can_spell:
_speller = Speller()