Aussi, mise en évidence des mots-clés dans les résultats de recherche.
# -*- encoding: utf-8 -*-
+import re
from django import forms
from datamaster_modeles.models import Thematique, Pays, Region
from models import Evenement, Discipline, Record
records = records.search_sujet(sujet)
return records
+ def get_search_regexp(self):
+ """Retourne une expression régulière compilée qui peut servir à
+ chercher les mot-clés recherchés dans un texte."""
+ if self.is_valid():
+ words = self.cleaned_data['q'].split()
+ if not words:
+ return None
+ parts = []
+ for word in words:
+ part = re.escape(word.lower())
+ # Les expressions régulières ne connaissent pas la version
+ # en majuscules des caractères accentués. :(
+ part = part.replace(u'à', u'[àÀ]')
+ part = part.replace(u'â', u'[âÂ]')
+ part = part.replace(u'é', u'[éÉ]')
+ part = part.replace(u'ê', u'[êÊ]')
+ part = part.replace(u'î', u'[îÎ]')
+
+ # Faire ceci après avoir traité les caractères accentués...
+ part = part.replace('a', u'[aàâÀÂ]')
+ part = part.replace('e', u'[eéèëêÉÊ]')
+ part = part.replace('i', u'[iïîÎ]')
+ part = part.replace('o', u'[oô]')
+ part = part.replace('u', u'[uûüù]')
+
+ parts.append(part)
+ return re.compile('|'.join(parts), re.I)
###
class EvenementForm(forms.ModelForm):
--- /dev/null
+from django import template
+from django.utils.html import conditional_escape
+from django.utils.safestring import mark_safe
+
+register = template.Library()
+
+@register.filter
+def highlight(text, regexp, autoescape=None):
+ """Met en évidence les parties du texte qui correspondent à l'expression
+ régulière passée en argument."""
+ if autoescape:
+ text = conditional_escape(text)
+ if words:
+ text = words.sub(r'<b>\g<0></b>', text)
+ return mark_safe(text)
def ressource_index(request):
search_form = RecordSearchForm(request.GET)
ressources = search_form.get_query_set()
- return render_to_response("savoirs/ressource_index.html",
- {'search_form': search_form, 'ressources': ressources,
- 'nb_resultats': len(ressources)},
- context_instance = RequestContext(request))
-
+ nb_resultats = len(ressources)
+ search_regexp = search_form.get_search_regexp()
+ return render_to_response(
+ "savoirs/ressource_index.html",
+ {'search_form': search_form, 'ressources': ressources,
+ 'nb_resultats': len(ressources), 'search_regexp': search_regexp},
+ context_instance = RequestContext(request)
+ )
+
def ressource_retrieve(request, id):
"""Notice OAI de la ressource"""
ressource = Record.objects.get(id=id)
{% extends "container_base.html" %}
{% load pagination_tags %}
+{% load search %}
{% block contenu %}
<h4>Ressources</h4>
<div class="centre">{% paginate %}</div>
<div class="zone-texte">
{% for r in ressources %}
- {% include "savoirs/resultat.html" %}
+ <div class="resultatRecherche">
+ <a class="le-titre" href="{{ r.uri }}">{{ r.title|highlight:search_regexp }}</a>
+ {% if r.creator %}
+ <div><span class="lbl">Auteur:</span> {{ r.creator|highlight:search_regexp }}</div>
+ {% endif %}
+ {% if r.description %}
+ <div class="resultatResume"><span class="lbl">Description:</span> {{ r.description|highlight:search_regexp }}</div>
+ {% endif %}
+ </div>
{% empty %}
<div class="resultatRecherche">
<h2>Aucun résultat trouvé</h2>