Annotation of kupuMPIWG/python/spellcheck.py, revision 1.1

1.1     ! dwinter     1: #!/usr/bin/python
        !             2: 
        !             3: """SpellChecker for Kupu"""
        !             4: 
        !             5: COMMAND = 'aspell -a'
        !             6: 
        !             7: import popen2, re
        !             8: 
        !             9: try:
        !            10:     from Globals import ClassSecurityInfo
        !            11: except ImportError:
        !            12:     pass
        !            13: else:
        !            14:     # hmmm... Zope 2...
        !            15:     __allow_access_to_unprotected_subobjects__ = 1
        !            16: 
        !            17: class SpellChecker:
        !            18:     """Simple spell checker, uses ispell (or aspell) with pipes"""
        !            19: 
        !            20:     __allow_access_to_unprotected_subobjects__ = 1
        !            21: 
        !            22:     reg_unknown = re.compile('^& (.*?) \d* \d*: (.*)$', re.U)
        !            23:     reg_unknown_no_replacement = re.compile('^\# (.*?) \d*.*$', re.U)
        !            24: 
        !            25:     def __init__(self):
        !            26:         self.chout, self.chin = popen2.popen2(COMMAND)
        !            27:         # throw away intro
        !            28:         self.read_line()
        !            29: 
        !            30:     def __del__(self):
        !            31:         self.chout.close()
        !            32:         self.chin.close()
        !            33: 
        !            34:     def check(self, text):
        !            35:         """checks a line of text
        !            36:         
        !            37:             returns None if spelling was okay, and an HTML string with words 
        !            38:             that weren't recognized marked (with a span class="wrong_spelling")
        !            39:         """
        !            40:         result = {}
        !            41:         for line in text.split('\n'):
        !            42:             line = line.strip()
        !            43:             if line:
        !            44:                 self.write_line(line)
        !            45:             while 1:
        !            46:                 resline = self.read_line()
        !            47:                 if not resline.strip():
        !            48:                     break
        !            49:                 if resline.strip() != '*':
        !            50:                     match = self.reg_unknown.match(resline)
        !            51:                     have_replacement = True
        !            52:                     if not match:
        !            53:                         match = self.reg_unknown_no_replacement.match(resline)
        !            54:                         have_replacement = False
        !            55:                     assert match, 'Unknown formatted line: %s' % resline
        !            56:                     word = match.group(1)
        !            57:                     if result.has_key(word):
        !            58:                         continue
        !            59:                     replacements = []
        !            60:                     if have_replacement:
        !            61:                         replacements = match.group(2).split(', ')
        !            62:                     result[word] = replacements
        !            63:         return result
        !            64: 
        !            65:     def read_line(self):
        !            66:         buf = []
        !            67:         while 1:
        !            68:             char = self.read_char()
        !            69:             if char == '\n':
        !            70:                 return ''.join(buf)
        !            71:             buf.append(char)
        !            72: 
        !            73:     def write_line(self, line):
        !            74:         try:
        !            75:             self.chin.write('%s\n' % line)
        !            76:             self.chin.flush()
        !            77:             return
        !            78:         except IOError:
        !            79:             self.reconnect()
        !            80:             self.chin.write('%s\n' % line)
        !            81:             self.chin.flush()
        !            82:             return
        !            83:         raise
        !            84: 
        !            85:     def read_char(self):
        !            86:         try:
        !            87:             return self.chout.read(1)
        !            88:         except IOError:
        !            89:             self.reconnect()
        !            90:             return self.chout.read(1)
        !            91:         raise
        !            92: 
        !            93:     def reconnect(self):
        !            94:         try:
        !            95:             self.chout.close()
        !            96:         except IOError:
        !            97:             pass
        !            98:         try:
        !            99:             self.chin.close()
        !           100:         except IOError:
        !           101:             pass
        !           102:         self.chout, self.chin = popen2.popen2(COMMAND)
        !           103: 
        !           104: def format_result(result):
        !           105:     """convert the result dict to XML"""
        !           106:     buf = ['<?xml version="1.0" encoding="UTF-8" ?>\n<spellcheck_result>']
        !           107:     for key, value in result.items():
        !           108:         buf.append('<incorrect><word>')
        !           109:         buf.append(key)
        !           110:         buf.append('</word><replacements>')
        !           111:         buf.append(' '.join(value))
        !           112:         buf.append('</replacements></incorrect>')
        !           113:     buf.append('</spellcheck_result>')
        !           114:     return ''.join(buf)
        !           115: 
        !           116: if __name__ == '__main__':
        !           117:     c = SpellChecker()
        !           118:     while 1:
        !           119:         line = raw_input('Enter text to check: ')
        !           120:         if line == 'q':
        !           121:             break
        !           122:         ret = c.check(line)
        !           123:         if ret is None:
        !           124:             print 'okay'
        !           125:         else:
        !           126:             print ret

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>