
    i*                     J   d Z ddlZddlmZmZmZ ddlmZ ddl	m
Z
 ddlmZmZmZ ddlmZmZmZ ddlmZ ej*                  rdd	lmZ dd
lmZ dddddddZdZddgZ eddi      ZdedefdZ dedededz  fdZ!deddddfdZ"d d!defd"Z#d#edefd$Z$d%e%eef   defd&Z&y)'a  
DuckDuckGo Instant Answer API
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The `DDG-API <https://duckduckgo.com/api>`__ is no longer documented but from
reverse engineering we can see that some services (e.g. instant answers) still
in use from the DDG search engine.

As far we can say the *instant answers* API does not support languages, or at
least we could not find out how language support should work.  It seems that
most of the features are based on English terms.

    N)	urlencodeurlparseurljoin)html)WIKIDATA_UNITS)extract_texthtml_to_textget_string_replaces_function)get_external_urlget_earth_coordinates_urlarea_to_osm_zoom)EngineResults)SXNG_Response)OnlineParamszhttps://duckduckgo.com/Q12805zhttps://duckduckgo.com/apiTFJSON)websitewikidata_idofficial_api_documentationuse_official_apirequire_api_keyresultszJhttps://api.duckduckgo.com/?{query}&format=json&pretty=0&no_redirect=1&d=1zhttp://www.wikidata.org/entity/z https://www.wikidata.org/entity/zhttp:zhttps:textreturnc                 0    | j                  d      xr d| v S )zduckduckgo may return something like ``<a href="xxxx">http://somewhere Related website<a/>``

    The href URL is broken, the "Related website" may contains some HTML.

    The best solution seems to ignore these results.
    http )
startswith)r   s    5/root/searxng/searx/engines/duckduckgo_definitions.pyis_broken_textr    2   s     ??6"2sd{2    
htmlResultc                     d}t        j                  |      }|j                  d      }t        |      dk\  rt	        |d         }n| }|rt        |      s|S y )N z//a   r   )r   
fromstringxpathlenr   r    )r   r"   resultdomas        r   result_to_textr,   <   sS    F
//*
%C		%A
1v{ad#nV,r!   queryparamsr   c                 L    t         j                  t        d| i            |d<   y )Nq)r-   url)URLformatr   )r-   r.   s     r   requestr4   J   s    JJYU|%<J=F5Mr!   respr   c                    t               }| j                         }d}|j                  dd      }g }g }d }g }|j                  dd      }	|	r|j                  d      }
t        j	                  d|
|	       t        |	t              rI|
dvrE|j                  |j                  j                  t        |	      |j                  dd                   d	|v r||j                  d	d      z   }d
|v r||j                  d
d      z   }|j                  d      }|dk(  rd n|}|$t        |      j                  dk(  rt        d|      }|j                  dg       }|D ]k  }|j                  d      }|j                  d      }|(|+|j                  ||d       |j                  |j                  j                  ||d             m |j                  dg       }|D ]  }d|v r|j                  d      }|j                  dd      }t!        |      r7t#        ||j                  dd            }||k7  sY|\|j                  |j                  j                  d|i             d|v sg }|j                  |j                  dd      |d       |j                  dg       }|D ]H  }t#        |j                  dd      |j                  dd            }||k7  s5|8|j                  |       J  |j                  dd      }|dk7  rT|}|j                  |j                  dd      |dd       |j                  |j                  j                  ||d             |j                  dd      }|dk7  r&|}|j                  |j                  dd      |d       |rt%        |      }d|v r|j                  di       }d|v rzd}d }|j                  di       D ]  }|j                  d d      }|j                  d!      }|j                  d"      }|d#k(  r=t'        ||      }||j                  ||d       `|d$v re|d%k(  r|d&k(  rp|d'k(  r9|j                  |t)        |      d(d)       t+        |j                  d*            }|d+k(  r-|j                  d,      d-k(  r|}|j                  ||d.d)       |d%k(  s|j                  ||d/        |rf|j                  d!      }|j                  d"      }|j                  d0      }|j                  d1      }t-        |||      } |j                  d2| d.d3       t/        |      d4kD  r|nt/        |      d4k(  r`t/        |      d5k(  rRt/        |      d4k(  rDt/        |      d4k(  r6|j                  |j                  j                  |d4   d6   ||d7             |S |j                  |j                  j                  |||||||d8             |S )9Nr$   HeadingAnswer
AnswerTypezAnswerType='%s' Answer='%s')calcipAbstractURL)answerr1   
DefinitionAbstractImagezhttps://duckduckgo.comResultsFirstURLText)titler1   RelatedTopicsResult
suggestionTopicsName)namesuggestionsAbstractSourceT)rD   r1   official)r1   rD   DefinitionURLDefinitionSourceInfoboxcontent   	data_typelabelvaluez"")instancewiki_maps_triggergoogle_play_artist_idstringWebsiteareaP2046)rT   rU   entityamountcoordinatesglobez!http://www.wikidata.org/entity/Q2P625)rT   rU   latitude	longitudeOpenStreetMap)rD   r1   r]   r   r%   r1   )r1   rD   rQ   )infoboxidrQ   img_src
attributesurlsrelatedTopics)r   jsongetloggerdebug
isinstancestraddtypesr8   r	   r   netlocr   appendLegacyResultr    r,   replace_http_by_httpsr   area_to_strr   r   r(   )!r5   r   
search_resrQ   headingrh   ri   
infobox_idrj   r=   answer_typeimage_result_list
ddg_resultfirstURLr   rG   rK   _topic_resultstopic_resultabstractURLdefinitionURLre   osm_zoomr_   inforS   
data_label
data_valueexternal_urlrb   rc   _urls!                                    r   responser   N   s   oG!%J G>>)R0G8:J(*DJ68M ..2.F nn\22KHfc"{.'HKK$$'/"}b9 %  z!JNN<<<ZJNN:r:: NN7#ERKDUEXe_33r90%8 *4	2)FL" Y
>>*-~~f%D$4KK$x89KK22WX3VWXY >>/26L" 3
#!~~j1H>>&"-D!$'+D*..22NO
(Z-CKK : :L*;U VW#%'K  *..*DU`!ab3=>>(B3ON . 3+L,<,<VR,H,JZJZ[cegJhi
(Z-C&&z233$ ..3Kb 
jnn-=rB;dhijGMM..{W/UVW NN?B7M"
jnn-?D][\ *:6
 J$.NN9b$AHKIr2 $R!%+r!:	!XXg.
!XXg.
 % ,<Iz+R+KK*\ JK"\\ (*zY/F&(%%
[Q[E\ho&pq/
x0HIH-/!~~g.2UU '+ #))J_e*fg(*%%
Z&PQI$RL (__W5
(__W5
%>>*5&NN;7	5h	8TodfUV
7|a=S_1c$i1n]I[_`I`ehipequvevKK22475>T[ho3pqr  N KK**#*(#*#(&0 $)6
 Nr!   unitc                     t         D ]C  }| j                  |      s| t        |      d  }t        j                  |      }|| c S |d   c S  | S )Nsymbol)WIKIDATA_PREFIXr   r(   r   rl   )r   prefixwikidata_entity	real_units       r   unit_to_strr      sZ    ! '??6""3v;=1O&**?;I X&&' Kr!   r[   c                    t        | j                  dd            }|r.	 t        | j                  dd            }dj                  ||      S dj                  | j                  dd      | j                  dd            S # t        $ r Y =w xY w)zQparse ``{"unit": "https://www.wikidata.org/entity/Q712226", "amount": "+20.99"}``r   r$   r^   z{} {})r   rl   floatr3   
ValueError)r[   r   r^   s      r   rw   rw     s    txx+,D	488Hb12F>>&$// >>$((8R0$((622FGG  		s   ,A> >	B
	B
)'__doc__typingturllib.parser   r   r   lxmlr   
searx.datar   searx.utilsr   r	   r
   searx.external_urlsr   r   r   searx.result_typesr   TYPE_CHECKINGsearx.extended_typesr   searx.search.processorsr   aboutr2   r   rv   rp   boolr    r,   r4   r   r   dictrw    r!   r   <module>r      s    5 5  % P P 
 -??24 )">	 X46XY4gx5HI 3 3 3 # #* >3 > >4 >f? f} fRc c 	Hd38n 	H 	Hr!   