
    i=                     J   d Z ddlZddlZddlmZ ddlmZ ddlm	Z	m
Z
 ddlmZ ddlmZmZmZ ddlmZ d	d
dddddZdgZdZdZdZdZdZdZdZdZd Zd Zd Zd Z i deded ee d      d ee d      d  ee d!      d" ee d!      d# ee d$      d% ee d$      d&ed'ed(ed)ed*ed+ed,ed-ed.eeeeee ee d/       ee d/      d0Z!g d1Z" e#e"      D  ci c]  \  } }|| 
 c}} Z$d2 Z%d3efd4Z&d5 Z'd6 Z(d7 Z)d8 Z*d9 Z+d: Z,d; Z-d< Z.d= Z/d> Z0d? Z1yc c}} w )@zOpenStreetMap (Map)    N)partial)gettext)OSM_KEYS_TAGS
CURRENCIESget_external_url)send_wikidata_querysparql_string_escapeget_thumbnail)EngineResultszhttps://www.openstreetmap.org/Q936z,http://wiki.openstreetmap.org/wiki/NominatimTFJSON)websitewikidata_idofficial_api_documentationuse_official_apirequire_api_keyresultsmapz$https://nominatim.openstreetmap.org/zTsearch?{query}&polygon_geojson=1&format=jsonv2&addressdetails=1&extratags=1&dedupe=1z-https://openstreetmap.org/{osm_type}/{osm_id}zIhttps://www.openstreetmap.org/?mlat={lat}&mlon={lon}&zoom={zoom}&layers=Mzhttps://graphhopper.com/mapsa<  
select ?item ?itemLabel ?image ?sign ?symbol ?website ?wikipediaName
where {
  hint:Query hint:optimizer "None".
  values ?item { %WIKIDATA_IDS% }
  OPTIONAL { ?item wdt:P18|wdt:P8517|wdt:P4291|wdt:P5252|wdt:P3451|wdt:P4640|wdt:P5775|wdt:P2716|wdt:P1801|wdt:P4896 ?image }
  OPTIONAL { ?item wdt:P1766|wdt:P8505|wdt:P8667 ?sign }
  OPTIONAL { ?item wdt:P41|wdt:P94|wdt:P154|wdt:P158|wdt:P2910|wdt:P4004|wdt:P5962|wdt:P8972 ?symbol }
  OPTIONAL { ?item wdt:P856 ?website }
  SERVICE wikibase:label {
    bd:serviceParam wikibase:language "%LANGUAGE%,en".
    ?item rdfs:label ?itemLabel .
  }
  OPTIONAL {
    ?wikipediaUrl schema:about ?item;
                  schema:isPartOf/wikibase:wikiGroup "wikipedia";
                  schema:name ?wikipediaName;
                  schema:inLanguage "%LANGUAGE%" .
  }
}
ORDER by ?item
c                 R    d}| j                  |      rd| t        |      d  z   } | | fS )Nzhttp://zhttps://)
startswithlen)valuehttps     ,/root/searxng/searx/engines/openstreetmap.pyvalue_to_https_linkr   C   s4    DU3t9;//5>    c                 2    | j                  d      d   } | | fS )N;r   )splitr   s    r   value_to_website_linkr"   J   s    KKQE5>r   c                 b    | j                  dd      }  dj                  |   dj                  |  fS )N:   z"https://{0}.wikipedia.org/wiki/{1}z	{1} ({0}))r    formatr!   s    r   value_wikipedia_linkr'   O   s:    KKQE7077?ASASASUZA[\\r   c                     | |z   |fS )N )prefixr   s     r   value_with_prefixr+   T   s    UNE""r   r   contact:websiteemailzmailto:zcontact:emailzcontact:phoneztel:phonefaxzfax:zcontact:faxzcontact:mastodonfacebookzcontact:facebookzcontact:foursquarezcontact:instagramzcontact:linkedinzcontact:pinterestzcontact:telegramzcontact:tripadvisorzhttps://wikidata.org/wiki/)zcontact:twitterzcontact:yelpzcontact:youtubezcontact:webcam	wikipediawikidatazbrand:wikidata)cuisineorganicdeliveryzdelivery:covid19opening_hourszopening_hours:covid19feez	payment:*z
currency:*outdoor_seatingbench
wheelchairlevelzbuilding:levelsbinpublic_transportzinternet_access:ssidc                     t         t        j                  t        j                  j                  d| i            z   |d<   |S )Nq)queryurl)base_urlsearch_stringr&   urllibparse	urlencode)r@   paramss     r   requestrH      s9    }33&,,:P:PRUW\Q]:^3__F5MMr   returnc                    t               }| j                         }| j                  d   }t        j                  d| j                  d         }|s#t        j                  d| j                  d         }|rt|d   D cg c]!  }t
        j                  j                  |      # c}\  }}|j                  |j                  j                  t        d      t         d| d| 	             |D ]'  }t        |j                  d
      t              r#i |d
<   ) t!        ||       |D ]  }t#        |      \  }	}
|	st%        |      \  }}}t'        t)        |            }t+        ||      \  }}t-        |||      }|j/                  i ddd|	d|
dt1        d|      d|d|d|d|d|d|dt3        |j                  d      |j                  dd      |      d|j                  d      ddd|d   d|d    d!|d!           |S c c}w )"Nlanguagezfrom\s+(.*)\s+to\s+(.+)r@   z\s*(.*)\s+to\s+(.+)r   zShow route in map ..z/?point=z&point=)answerrA   	extratagstemplatezmap.htmltitleaddressaddress_labeladdrrA   osmgeojson	thumbnaillinksdatatypecategory 	type_iconiconcontent	longitudelonlatitudelatboundingbox)r   jsonsearch_paramsrefindallrD   rE   
quote_plusaddtypesAnswerr   	route_url
isinstancegetdictfetch_wikidataget_title_addressget_url_osm_geojsonr   get_img_src	get_linksget_dataappendget_key_labelget_tag_label)respr   nominatim_jsonuser_languagelppoint1point2resultrO   rP   rA   rS   rT   rU   rV   	link_keysrW   s                     r   responser      s   oGYY[N&&z2M


-t/A/A'/JKAJJ-t/A/A'/JK>?dC&,,11!4CMM  56 k&A ! 	
 ! %&**[148"$F;%
 >=1 ! 
*62w /7S'!+f"56	$V];yy9J 7  v}!E	
 s s 7 Y   fjj&<fjjQS>TVcd VZZ/ 2 VE] F5M  vm4!	

B Ng Ds   ;&Hc                      | sy t        d|       S )Nwikimedia_imager   )	raw_values    r   get_wikipedia_imager      s    -y99r   c                    g }i }| D ]e  }|d   }|j                  d|j                  d            }|s,||vs1|j                  d|z          |j                  |g       j                  |       g |r|dk(  rdn|j                  d      d   }d	j	                  |      }t
        j                  d
t        |            j                  dt        |            }t        |      }	|	j                  di       j                  di       D ]D  }
|
d   d   j                  dd      }|j                  |g       D ]  }|
d   d   t        |
j                  di       j                  d            t        |
j                  di       j                  d            t        |
j                  di       j                  d            d|d<   |
j                  di       j                  d      }|r|dz   |z   |d   d<   |
j                  di       j                  d      }|s|d   j                  d      r|d   j                  d      r||d   d<    G yy)a  Update nominatim_json using the result of an unique to wikidata

    For result in nominatim_json:
        If result['extratags']['wikidata'] or r['extratags']['wikidata link']:
            Set result['wikidata'] to { 'image': ..., 'image_sign':..., 'image_symbal':... }
            Set result['extratags']['wikipedia'] if not defined
            Set result['extratags']['contact:website'] if not defined
    rM   r2   zwikidata linkzwd:allen-r    z%WIKIDATA_IDS%z
%LANGUAGE%r   bindingsitemr   zhttp://www.wikidata.org/entity/rZ   	itemLabelimagesignsymbol)r   r   
image_signimage_symbolwikipediaNamer$   r1   r   r,   N)
rm   ru   
setdefaultr    joinwikidata_image_sparqlreplacer
   r	   r   )ry   rz   wikidata_idswd_to_resultsr   rM   wd_idwikidata_ids_strr@   wikidata_json	wd_resultwikipedia_namer   s                r   ro   ro      sX    LM  ?;'	j)--*HIU,..$$UB/66v>?  - 6M<O<OPS<TUV<W88L1%--.>@TUe@fgoo.}=
 ,E2&**9b9==j"M 	EIf%g.667XZ\]E'++E26 E!*;!7!@0w1K1O1OPW1XY"5immFB6O6S6ST[6\"]$7	hPR8S8W8WX_8`$a	&z" "+!C!G!G!P!7Ds7J^7[F;'4#--	26::7C";/334EF";/33I>=DF;'(9:%E	E r   c                 r   | j                  d      }d}i }| d   dk(  s| d   dk(  s| d   dk(  s| d   dk(  r8|j                  d      r|j                  d      }n0|j                  | d         }n| d	   |v r|j                  | d	         }|r|}|j                  ||j                  d
      |j                  d      |j                  d|j                  d|j                  d                  |j                  d      |j                  d      |j                  d      d       ||fS | j                  d      }||fS )z4Return title and address

    title may be None
    rP   NrY   amenityshoptourismleisure	address29rX   house_numberroadcitytownvillagepostcodecountrycountry_code)namer   r   localityr   r   r   display_name)rm   update)r   address_rawaddress_namerP   rO   s        r   rp   rp     sD   
 **Y'KLG 	zi'*'****??;'&??;7L&??6*+=>L	;	&"vf~6 $ + ?#/'OOKOOFKOOI4NO (OOJ7&??95 + ?
	
  '> 

>*'>r   c                 &   | j                  d| j                  d            }d| vr!t        j                  | d   | d   d      }i }n"t        j                  || d         }|| d   d	}| j                  d
      }|s|dk(  rd| d   | d   gd}|||fS )zGet url, osm and geojsonosm_typerX   osm_idra   r_      )ra   r_   zoom)r   r   )rX   idrT   nodePoint)rX   coordinates)rm   result_lat_lon_urlr&   result_id_url)r   r   rA   rS   rT   s        r   rq   rq   2  s    zz*fjj&89Hv !''F5Mve}SU'V""HVH=M"Nvh'78jj#Gx6)"F5M6%=3QRWr   c                     d}d| v r| d   d   }|s| d   d   }|s| d   d   }| d   }|s|j                  d      r|d   }|d= |s#|j                  d      rt        d|d         }|d= |S )	z4Get image URL from either wikidata or r['extratags']Nr2   r   r   r   rM   wikimedia_commonsr   )rm   r   )r   img_srcrM   s      r   rr   rr   F  s     GV$W-Z(8GZ(6G {#Iy}}W-G$gy}}%89"#4i@S6TU)*Nr   c                 z   g }t               }| d   }|s||fS t        j                         D ]  \  }}|j                  |      }|s ||      \  }}	|j	                  d      r%| j                  di       j                  d      xs |	}	|j                  t        ||      ||	d       |j                  |        ||fS )z%Return links from result['extratags']rM   zhttps://wikidata.orgr2   r   )labelrA   	url_label)setVALUE_TO_LINKitemsrm   r   ru   rv   rh   )
r   rz   rV   r   rM   kmapping_functionr   rA   r   s
             r   rs   rs   ]  s    EI{#Ii,224 MM!$	))4Y>>01

:r266{CPyI&q-8&	
 	a )r   c                     g }| d   j                         D ]:  \  }}||v rt        |      t        ||      }|s&|j                  |||d       < |j	                  d        |S )zxReturn key, value of result['extratags']

    Must be call after get_links

    Note: the values are not translated
    rM   )r   keyr   c                 (    t        | d         | d   fS )Nr   r   )get_key_rank)entrys    r   <lambda>zget_data.<locals>.<lambda>  s    eEl!;U7^ L r   )r   )r   r   rv   ru   sort)r   rz   ignore_keysrW   r   vk_labels          r   rt   rt   w  s     D{#))+ 1?"=1KK$ 	IILIMKr   c                     t         j                  |       }|*t         j                  | j                  d      d   dz         }|S )zcGet OSM key rank

    The rank defines in which order the key are displayed in the HTML result
    r$   r   z:*)	KEY_RANKSrm   r    )r   key_ranks     r   r   r     s<    
 }}QH==a4!78Or   c                     | j                  |j                               }|#| j                  |j                  d      d         }||dk7  r| j                  d      }|/t        | j	                               dkD  r| j	                         d   }|S )zYGet label from labels in OSM_KEYS_TAGS

    in OSM_KEYS_TAGS, labels have key == '*'
    r   r   r   )rm   lowerr    r   values)labelslang	tag_labels      r   	get_labelr     s    
 

4::<(IJJtzz#q12	TT\JJt$	S1A5MMOA&	r   c                 x    |dn|}t         d   j                  | i       j                  |i       }t        ||      S )z Get tag label from OSM_KEYS_TAGSrZ   tags)r   rm   r   )tag_categorytag_namer   
tag_labelss       r   rw   rw     s?    %r8Hv&**<<@@2NJZ&&r   c                 ^   | j                  d      rY| j                  d      }t        |      dkD  r:t        j                  |d   |      }|rt        ||      j                         S |d   S t        d   }| j                  d      dgz   D ]  }|j                  |      }| y t        ||      S )z Get key label from OSM_KEYS_TAGSz	currency:r$   r%   keys*N)	r   r    r   r   iso4217_to_namer   r   r   rm   )key_namer   currencyor   r   s         r   rv   rv     s    ;' >>#&x=1**8A;=A D)//11A;6"F^^C C5( A> VT""r   )2__doc__re   urllib.parserD   	functoolsr   flask_babelr   
searx.datar   r   searx.external_urlsr   searx.engines.wikidatar	   r
   r   searx.result_typesr   about
categoriespaginglanguage_supportrB   rC   r   r   rk   r   r   r"   r'   r+   r   	KEY_ORDER	enumerater   rH   r   r   ro   rp   rq   rr   rs   rt   r   r   rw   rv   )ir   s   00r   <module>r      s;    	    0 0 [ [ , 0"P	 W
	  2f?` *	 8
]
#$, W&	2 W.	:	
 W.7 W&/ 
7$f- 7,f5 + # + - , + ,  +!" .#$ +'*+%)+GH/1MN14	& (	23daQT3	
=m =@:.Eb+\(.44	$'#c	 4s   #D