#!/usr/local/bin/python from SimpleXMLRPCServer import SimpleXMLRPCServer, CGIXMLRPCRequestHandler from subprocess import Popen, PIPE from xmlrpclib import Binary import os from codecs import lookup server = CGIXMLRPCRequestHandler() server.register_introspection_functions() Encode,Decode,Reader,Writer=lookup("utf-8") class Parser(object): def __init__(self): self.pipe=None self.running=False def initialize(self): return 0 def _initialize(self,f=[]): command=[os.path.join(os.getcwd(),"../bin/","xfst"),] flags = f + ["-utf8","-q"] self.args=command + flags def addCommand(self, command): self.args.append(" -e \"%s\"" % command.strip()) def uninitialize(self): return 0 def start(self): return 0 def stop(self): return 0 def _run(self): self.args.append(" -stop") p=Popen(Encode(" ".join(self.args))[0],shell=True,bufsize=0,stdin=PIPE,stdout=PIPE,stderr=PIPE) self.args=[] return Reader(p.stdout).read() def version(self): self._initialize("-v") return self._run().strip() def parse(self, fsm, wordforms): fp=open("../../parser.tmp","w") fsm=os.path.join(os.getcwd(), "../", os.path.basename(fsm)) retDict={} for word in [x.strip() for x in wordforms if x.strip()]: Writer(fp).write("%s\n" % word) retDict[word]=[] self._initialize() self.addCommand("loadd %s" % fsm) self.addCommand("regex URSR;") self.addCommand("apply up %s" % word) underlyingForms=self._run().splitlines() for uf in [x.strip() for x in underlyingForms if x.strip()]: self._initialize() self.addCommand("loadd %s" % fsm) self.addCommand("regex URSR;") self.addCommand("regex GlUR;") self.addCommand("apply up %s" % uf) mfs=self._run().splitlines() for mf in [x.strip() for x in mfs if x.strip()]: #Writer(fp).write("\t%s\t%s\n" % (uf,mf)) retDict[word].append({"morpheme":uf,"gloss":mf}) fp.close() return retDict server.register_instance(Parser()) server.handle_request()