Commit | Line | Data |
---|---|---|
4e04712d EMS |
1 | #coding: utf-8 |
2 | ||
f61e4846 EMS |
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 | ||
7851c4f9 EMS |
9 | EXCERPT_LENGTH = 200 |
10 | ||
f61e4846 | 11 | @register.filter |
1e24b799 | 12 | def 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 | 22 | def 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 | |
47 | excerpt.is_safe = True |