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
CommitLineData
4e04712d
EMS
1#coding: utf-8
2
f61e4846
EMS
3from django import template
4from django.utils.html import conditional_escape
5from django.utils.safestring import mark_safe
6
7register = template.Library()
8
7851c4f9
EMS
9EXCERPT_LENGTH = 200
10
f61e4846 11@register.filter
1e24b799 12def highlight(text, regexp=None, autoescape=None):
f61e4846
EMS
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)
4e04712d
EMS
17 if regexp:
18 text = regexp.sub(r'<b>\g<0></b>', text)
f61e4846 19 return mark_safe(text)
7851c4f9
EMS
20
21@register.filter
1e24b799 22def excerpt(text, regexp=None):
7851c4f9
EMS
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
1e24b799 27 m = regexp is not None and regexp.search(text)
7851c4f9
EMS
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
47excerpt.is_safe = True