2012-06-30 15:06:34 +00:00
# coding=utf-8
import http . client
import re
import socket
from urllib . parse import quote
2012-08-31 00:58:28 +00:00
import xmlparser
2012-06-30 15:06:34 +00:00
class WFASearch :
2012-08-31 00:58:28 +00:00
def __init__ ( self , terms ) :
self . terms = terms
( res , page ) = getPage ( terms )
if res == http . client . OK :
self . wfares = xmlparser . parse_string ( page )
else :
self . wfares = None
2012-06-30 15:06:34 +00:00
2012-08-31 00:58:28 +00:00
@property
def success ( self ) :
try :
return self . wfares [ " success " ] == " true "
except :
return False
2012-06-30 15:06:34 +00:00
2012-08-31 00:58:28 +00:00
@property
def error ( self ) :
if self . wfares [ " error " ] == " true " :
return " An error occurs during computation: " + self . wfares . getNode ( " error " ) . getNode ( " msg " ) . getContent ( )
elif self . wfares . hasNode ( " didyoumeans " ) :
start = " Did you mean: "
tag = " didyoumean "
end = " ? "
elif self . wfares . hasNode ( " tips " ) :
start = " Tips: "
tag = " tip "
end = " "
elif self . wfares . hasNode ( " relatedexamples " ) :
start = " Related examples: "
tag = " relatedexample "
end = " "
elif self . wfares . hasNode ( " futuretopic " ) :
return self . wfares . getNode ( " futuretopic " ) [ " msg " ]
else :
return " An error occurs during computation "
proposal = list ( )
for dym in self . wfares . getNode ( tag + " s " ) . getNodes ( tag ) :
if tag == " tip " :
proposal . append ( dym [ " text " ] )
elif tag == " relatedexample " :
proposal . append ( dym [ " desc " ] )
else :
proposal . append ( dym . getContent ( ) )
return start + ' , ' . join ( proposal ) + end
2012-06-30 15:06:34 +00:00
2012-08-31 00:58:28 +00:00
@property
def nextRes ( self ) :
try :
for node in self . wfares . getNodes ( " pod " ) :
for subnode in node . getNodes ( " subpod " ) :
if subnode . getFirstNode ( " plaintext " ) . getContent ( ) != " " :
yield node [ " title " ] + " " + subnode [ " title " ] + " : " + subnode . getFirstNode ( " plaintext " ) . getContent ( )
except IndexError :
pass
2012-06-30 15:06:34 +00:00
def getPage ( terms ) :
2012-07-27 16:18:13 +00:00
conn = http . client . HTTPConnection ( " api.wolframalpha.com " , timeout = 5 )
2012-06-30 15:06:34 +00:00
try :
conn . request ( " GET " , " /v2/query?input= %s &appid= %s " % ( quote ( terms ) , CONF . getNode ( " wfaapi " ) [ " key " ] ) )
except socket . gaierror :
print ( " impossible de récupérer la page Wolfram|Alpha. " )
return ( http . client . INTERNAL_SERVER_ERROR , None )
except ( TypeError , KeyError ) :
2012-06-30 15:51:50 +00:00
print ( " You need a Wolfram|Alpha API key in order to use this module. Add it to the module configuration file: \n <wfaapi key= \" XXXXXX-XXXXXXXXXX \" /> \n Register at http://products.wolframalpha.com/api/ " )
2012-06-30 15:06:34 +00:00
return ( http . client . INTERNAL_SERVER_ERROR , None )
res = conn . getresponse ( )
data = res . read ( )
conn . close ( )
return ( res . status , data )