#!/usr/bin/python
"""pydic --Character Based NDTP Client--

  Author: tgz <tgz@users.sourceforge.jp>
  Version: 1.1
  Last Modified: 2003/03/29

  This program is based on GPL.

"""
import os, re, readline, sys
from ndtplib import *

name = 'pydic'
NDTP_HOST = '127.0.0.1'
Info, Eh, Bye, Chng = (':v', ':h', ':q', ':l')
pager  = '/usr/bin/w3m'
DEFAULTDICNUM = 1


usage = {Info: 'About This Program',
          Eh: 'Show Commands(This Message)',
         Bye: 'Quit',
        Chng: 'Change Dictionary'}

def initialize():
    """Get Version and Dictionaries of Server."""
    server    = NDTP(NDTP_HOST)
    version   = server.version()
    dictdict  = server.listdic()
    server.quit()
    info()
    help()
    return version, dictdict

def info():
    print """\npydic version 1.1 --Character Based NDTP Client--\n"""

def help():
    """Show Commands."""
    print '\nCommands:'
    keys = usage.keys()
    keys.sort()
    for i in keys:
        print '\t%s\t%s' % (i, usage[i])
    print 'Any words are regarded as query except for the above commands.\n'

def selectdic(dicnum, dictdict):
    """Select Dictionary."""
    default = int(dicnum)
    print '(Which?)[Default as %d]' % default
    set = dictdict.keys()
    set.sort()
    for i in set:
        print '\t%d: %s' % (i, dictdict[i])
    prompt = '%s >' % set
    print prompt,
    dicnum = sys.stdin.readline()
    if dicnum:
        if dicnum == '':
            pass
        else:
            try:
                dicnum = int(dicnum)
                if dicnum in set:
                    return int(dicnum)
            except ValueError:
                    pass
    print 'No such a dictionary number, aborted.'
    return default

def search(pattern, dicnum):
    """Search Pattern."""
    return '%s \'file:///cgi-bin/pydicfunc.cgi?server=%s&num=%s&word=%s\'' % \
(pager, NDTP_HOST, dicnum, pattern)

def browse(command):
    """Browse Results."""
    pid = os.fork()
    if pid != 0:
        """Parent process"""
        os.wait()
    else:
        """Child process"""
        os.system(command)
        os._exit(1)
    return pid

def main():
    """main loop"""
    prompt = '[%s]$ ' % name
    file = None
    pid = None
    dicnum = DEFAULTDICNUM
    version, dictdict = initialize()
    COND = 1
    while COND:
        cmd = raw_input(prompt)
        if cmd == '' or re.match('^[ ]+$', cmd):
            pass
        elif cmd == Bye:
            sys.exit(1)
        elif cmd == Chng:
            dicnum = selectdic(dicnum, dictdict)
        elif cmd == Eh:
            help()
        elif cmd == Info:
            info()
        else:
            try:
                pid = browse(search(cmd, dicnum))
                COND = 1
            except NDTPSetDictionaryError, message:
                    print message
                    pass
            except: pass

if __name__ == '__main__':
    try:
        main()
    except NDTPServerDisconnected, message:
        print message
        sys.exit(1)
    except (EOFError, KeyboardInterrupt):
        sys.exit(1)
