Browse Source

[enh] add routing directions to osm search - closes #254

Adam Tauber 4 years ago
parent
commit
2c6531b233

+ 14 - 0
searx/engines/openstreetmap.py

@@ -10,7 +10,9 @@
  @parse       url, title
 """
 
+import re
 from json import loads
+from flask_babel import gettext
 
 # engine dependent config
 categories = ['map']
@@ -21,10 +23,15 @@ base_url = 'https://nominatim.openstreetmap.org/'
 search_string = 'search/{query}?format=json&polygon_geojson=1&addressdetails=1'
 result_base_url = 'https://openstreetmap.org/{osm_type}/{osm_id}'
 
+route_url = 'https://graphhopper.com/maps/?point={}&point={}&locale=en-US&vehicle=car&weighting=fastest&turn_costs=true&use_miles=false&layer=Omniscale'
+route_re = re.compile('(?:from )?(.+) to (.+)')
+
 
 # do search-request
 def request(query, params):
+
     params['url'] = base_url + search_string.format(query=query.decode('utf-8'))
+    params['route'] = route_re.match(query.decode('utf-8'))
 
     return params
 
@@ -34,6 +41,13 @@ def response(resp):
     results = []
     json = loads(resp.text)
 
+
+    if resp.search_params['route']:
+        results.append({
+            'answer': gettext('Get directions'),
+            'url': route_url.format(*resp.search_params['route'].groups()),
+        })
+
     # parse results
     for r in json:
         if 'display_name' not in r:

+ 2 - 4
searx/plugins/self_info.py

@@ -37,10 +37,8 @@ def post_search(request, search):
             ip = x_forwarded_for[0]
         else:
             ip = request.remote_addr
-        search.result_container.answers.clear()
-        search.result_container.answers.add(ip)
+        search.result_container.answers['ip'] = {'answer': ip}
     elif p.match(search.search_query.query):
         ua = request.user_agent
-        search.result_container.answers.clear()
-        search.result_container.answers.add(ua)
+        search.result_container.answers['user-agent'] = {'answer': ua}
     return True

+ 2 - 2
searx/results.py

@@ -131,7 +131,7 @@ class ResultContainer(object):
         self._merged_results = []
         self.infoboxes = []
         self.suggestions = set()
-        self.answers = set()
+        self.answers = {}
         self.corrections = set()
         self._number_of_results = []
         self._ordered = False
@@ -146,7 +146,7 @@ class ResultContainer(object):
                 self.suggestions.add(result['suggestion'])
                 results.remove(result)
             elif 'answer' in result:
-                self.answers.add(result['answer'])
+                self.answers[result['answer']] = result
                 results.remove(result)
             elif 'correction' in result:
                 self.corrections.add(result['correction'])

+ 6 - 2
searx/templates/legacy/results.html

@@ -33,8 +33,12 @@
 
     {% if answers %}
     <div id="answers"><span>{{ _('Answers') }}</span>
-        {% for answer in answers %}
-        <span>{{ answer }}</span>
+        {% for answer in answers.values() %}
+            {% if answer.url %}
+            <a href="{{ answer.url }}">{{ answer.answer }}</a>
+            {% else %}
+            <span>{{ answer.answer }}</span>
+            {% endif %}
         {% endfor %}
     </div>
     {% endif %}

+ 6 - 2
searx/templates/oscar/results.html

@@ -94,9 +94,13 @@
             {%- endif %}
 
             {% if answers -%}
-            {%- for answer in answers %}
+            {%- for answer in answers.values() %}
             <div class="result well">
-                <span>{{ answer }}</span>
+              {% if answer.url %}
+                <a href="{{ answer.url }}">{{ answer.answer }}</a>
+              {% else %}
+                <span>{{ answer.answer }}</span>
+              {% endif %}
             </div>
             {%- endfor %}
             {%- endif %}

+ 8 - 2
searx/templates/simple/results.html

@@ -15,8 +15,14 @@
 <div id="results" class="{{ only_template }}">
     {% if answers -%}
     <div id="answers"><h4 class="title">{{ _('Answers') }} : </h4>
-        {%- for answer in answers -%}
-        <div class="answer">{{- answer -}}</div>
+        {%- for answer in answers.values() -%}
+        <div class="answer">
+              {% if answer.url %}
+                <a href="{{ answer.url }}">{{ answer.answer }}</a>
+              {% else %}
+                <span>{{ answer.answer }}</span>
+              {% endif %}
+        </div>
         {%- endfor -%}
     </div>
     {%- endif %}