Merge pull request #827 from davidar/spell

[enh] show spelling corrections
This commit is contained in:
Adam Tauber 2017-01-18 23:49:01 +01:00 committed by GitHub
commit b1d49bacb0
5 changed files with 23 additions and 0 deletions

View File

@ -112,6 +112,7 @@ title_xpath = './/h3'
content_xpath = './/span[@class="st"]' content_xpath = './/span[@class="st"]'
content_misc_xpath = './/div[@class="f slp"]' content_misc_xpath = './/div[@class="f slp"]'
suggestion_xpath = '//p[@class="_Bmc"]' suggestion_xpath = '//p[@class="_Bmc"]'
spelling_suggestion_xpath = '//a[@class="spell"]'
# map : detail location # map : detail location
map_address_xpath = './/div[@class="s"]//table//td[2]/span/text()' map_address_xpath = './/div[@class="s"]//table//td[2]/span/text()'
@ -275,6 +276,9 @@ def response(resp):
# append suggestion # append suggestion
results.append({'suggestion': extract_text(suggestion)}) results.append({'suggestion': extract_text(suggestion)})
for correction in dom.xpath(spelling_suggestion_xpath):
results.append({'correction': extract_text(correction)})
# return results # return results
return results return results

View File

@ -127,6 +127,7 @@ class ResultContainer(object):
self.infoboxes = [] self.infoboxes = []
self.suggestions = set() self.suggestions = set()
self.answers = set() self.answers = set()
self.corrections = set()
self._number_of_results = [] self._number_of_results = []
self._ordered = False self._ordered = False
self.paging = False self.paging = False
@ -140,6 +141,9 @@ class ResultContainer(object):
elif 'answer' in result: elif 'answer' in result:
self.answers.add(result['answer']) self.answers.add(result['answer'])
results.remove(result) results.remove(result)
elif 'correction' in result:
self.corrections.add(result['correction'])
results.remove(result)
elif 'infobox' in result: elif 'infobox' in result:
self._merge_infobox(result) self._merge_infobox(result)
results.remove(result) results.remove(result)

View File

@ -16,6 +16,18 @@
<h1 class="sr-only">{{ _('Search results') }}</h1> <h1 class="sr-only">{{ _('Search results') }}</h1>
{% include 'oscar/search.html' %} {% include 'oscar/search.html' %}
{% if corrections %}
<div class="result">
<span class="result_header text-muted form-inline pull-left suggestion_item">{{ _('Try searching for:') }}</span>
{% for correction in corrections %}
<form method="{{ method or 'POST' }}" action="{{ url_for('index') }}" role="navigation" class="form-inline pull-left suggestion_item">
<input type="hidden" name="q" value="{{ correction }}">
<button type="submit" class="btn btn-default btn-xs">{{ correction }}</button>
</form>
{% endfor %}
</div>
{% endif %}
{% if answers %} {% if answers %}
{% for answer in answers %} {% for answer in answers %}
<div class="result well"> <div class="result well">

View File

@ -479,6 +479,7 @@ def index():
'number_of_results': number_of_results, 'number_of_results': number_of_results,
'results': results, 'results': results,
'answers': list(result_container.answers), 'answers': list(result_container.answers),
'corrections': list(result_container.corrections),
'infoboxes': result_container.infoboxes, 'infoboxes': result_container.infoboxes,
'suggestions': list(result_container.suggestions)}), 'suggestions': list(result_container.suggestions)}),
mimetype='application/json') mimetype='application/json')
@ -515,6 +516,7 @@ def index():
advanced_search=advanced_search, advanced_search=advanced_search,
suggestions=result_container.suggestions, suggestions=result_container.suggestions,
answers=result_container.answers, answers=result_container.answers,
corrections=result_container.corrections,
infoboxes=result_container.infoboxes, infoboxes=result_container.infoboxes,
paging=result_container.paging, paging=result_container.paging,
current_language=search_query.lang, current_language=search_query.lang,

View File

@ -36,6 +36,7 @@ class ViewsTestCase(SearxTestCase):
def search_mock(search_self, *args): def search_mock(search_self, *args):
search_self.result_container = Mock(get_ordered_results=lambda: self.test_results, search_self.result_container = Mock(get_ordered_results=lambda: self.test_results,
answers=set(), answers=set(),
corrections=set(),
suggestions=set(), suggestions=set(),
infoboxes=[], infoboxes=[],
results=self.test_results, results=self.test_results,