Avec Ruby On Rails, il y a deux petites fonctions sympa à utiliser : truncate()
, qui permet de tronquer une chaîne de caractères (string), et highlight()
, qui, quant à elle, permet de mettre en évidence un mot dans une chaîne.
Le petit défaut de la fonction truncate()
est de ne prendre que trois paramètres :
- La chaîne de caractères qui nous intéresse
- Le nombre de caractères maximums à afficher
- Et enfin, paramètre optionnel, la chaine de séparation, par exemple :
…
Or, dans le cas d’une completion automatique dans un formulaire de recherche, il pourrait être interressant de tronquer la ou les suggestions autours de la chaîne de caractères entrée par l’utilisateur. On pourrait également imaginer que la chaîne de caractères en question soit mise en évidence à l’aide de la fonction highlight()
.
C’est exactement ce que fait le helper truncate_around
ci-dessous :
1
def truncate_around(string, term, length, do_highlight = false, separator = "…")
2
3
return if(string.nil? or term.nil? or length < 1)
4
r = term if term.size == length
5
r = term if term == string
6
r = string if string.size <= length
7
8
length = length - term.size
9
term_x = string.index(term)
10
term_y = term_x + term.size
11
12
if(!r)
13
if(term_x == 0)
14
a = 0
15
b = length
16
r = string[a..b] + separator
17
elsif(term_y == string.size)
18
b = string.size
19
a = string.size - length
20
r = separator + string[a..b]
21
elsif(term_x < (length/2) + 1)
22
a = 0
23
b = length
24
r = string[a..b] + separator
25
elsif((string.size - term_y) < (length/2)+1)
26
b = string.size
27
a = string.size - length
28
r = separator + string[a..b]
29
else
30
if length % 2 == 0
31
a = term_x - length/2
32
b = term_y + length/2
33
else
34
a = term_x - length/2
35
b = term_y + length/2 + 1
36
end
37
r = separator + string[a..b] + separator
38
end
39
end
40
41
if do_highlight
42
return highlight(r, term)
43
else
44
return r
45
end
Cette fonction prend 5 paramètres, dont 2 optionnels :
string
: prend la chaîne de caractères de baseterm
: prend le mot-clélength
: prend la longueur totale de la chaîne de caractères a retournerdo_highlight
: précise si on applique la fonctionhighlight()
à la chaîne retournée. Par défaut :false
.separator
: prend une chaîne de caractères a appliquer en début et/ou fin de chaîne retournée. Par défaut :…
.
Exemple d’utilisation
Copier-coller cette fonction dans l’un de vos helper. Pour cet exemple, nous partirons du principe que cette fonction est présente dans le helper application_helper.rb
.
script/console
>> helper :application
>> string = "une chaine de test, pour démontrer la puissance de truncate_around()"
>> term = "démontrer"
>> length = 20
>> helper.truncate_around(string, term, length)
=> "…pour démontrer la pu…"
>> helper.truncate_around(string, term, length, true)
=> "…pour <strong class=\"highlight\">démontrer</strong> la pu…"