Bug: le filtre de tronquage plantait lorsqu'on lui envoyait une regexp nulle.
[auf_savoirs_en_partage_django.git] / auf_savoirs_en_partage / savoirs / templatetags / search.py
1 #coding: utf-8
2
3 from django import template
4 from django.utils.html import conditional_escape
5 from django.utils.safestring import mark_safe
6
7 register = template.Library()
8
9 EXCERPT_LENGTH = 200
10
11 @register.filter
12 def highlight(text, regexp=None, autoescape=None):
13 """Met en évidence les parties du texte qui correspondent à l'expression
14 régulière passée en argument."""
15 if autoescape:
16 text = conditional_escape(text)
17 if regexp:
18 text = regexp.sub(r'<b>\g<0></b>', text)
19 return mark_safe(text)
20
21 @register.filter
22 def excerpt(text, regexp=None):
23 """Tronque le texte autour de la première correspondance de l'expression
24 régulière."""
25 if len(text) <= EXCERPT_LENGTH:
26 return text
27 m = regexp is not None and regexp.search(text)
28 if m:
29 pos = m.start()
30 end_of_sentence = max(text.rfind('.', 0, pos), text.rfind('?', 0, pos), text.rfind('!', 0, pos))
31 start = end_of_sentence + 1 if end_of_sentence != -1 else 0
32 end = pos + EXCERPT_LENGTH
33 else:
34 start = 0
35 end = start + EXCERPT_LENGTH
36 if end < len(text) - 1:
37 try:
38 end = text.rindex(' ', start, end)
39 except ValueError:
40 pass
41 excerpt = text[start:end].strip()
42 if start > 0:
43 excerpt = '(...) ' + excerpt
44 if end < len(text) - 1:
45 excerpt += ' (...)'
46 return excerpt
47 excerpt.is_safe = True