Description
Il y a quelques mois, j’ai écrit ce premier article pour obtenir un
moteur de recherche basique en s’aidant de la méthode autocomplete()
de
JQueryUI :
Hugo Search : un moteur de recherche interne (JQueryUI Autocomplete)
Et, puis je me suis rappelé que, parmi les flux de syndication, j’en génère
un au format JSON, le bien nommé feed.json, disponible à partir
de la page d’accueil. Je me suis demandé si je pouvais réutiliser mon
code, et je découvre que notre fameux SSG
Hugo a une fonction native getJSON
.
Reprenons le code…
Code
Hugo
Je construis une variable $feed
qui injectera la valeur du chemin absolu
de mon fichier feed.json.
{{- $baseURL := site.BaseURL | absLangURL -}}
{{- $feed := urls.JoinPath $baseURL "/feed.json" | absLangURL -}}
JQuery
La partie du code JQuery est sensiblement la même, à la différence près
est que la fonction range
d’Hugo va directement appeler le contenu retourné
par la fonction getJSON
. La suite du traitement est faite par la méthode
autocomplete()
de JQuery, ni plus ni moins.
Voici le code :
{{- with resources.Get $feed -}}
<!-- Javascript -->
<script>
$(function() {
var projects = [
{{- range .items -}}
{
value: "{{ safeHTML .title }}",
label: "{{ safeHTML .summary }}",
url:"{{ safeURL .url }}"
},
{{- end -}}
];
$("#search").autocomplete({
minLength: 0,
source: projects,
focus: function( event, ui ) {
$("#search").val( ui.item.label );
return false;
},
select: function( event, ui ) {
$("#search").val( ui.item.label );
$("#replyer").val( ui.item.value );
return false;
}
})
.data('ui-autocomplete')._renderItem = function(ul, item) {
return $('<li>')
.append('<a href="' + item.url + '" alt="'+ item.label + '">' + item.value + '</a>' )
.appendTo(ul);
};
});
</script>
{{- end -}}
HTML
La partie de code HTML est toujours aussi simple :
<input class="form-control" id="search" placeholder="{{ T "searchHolderTitle" }}">
<input aria-hidden="true" id="replyer" class="hidden">
TL;DR
L’ensemble du code :
<div id="search">
<input class="form-control" id="search" placeholder="{{ T "searchHolderTitle" }}">
<input aria-hidden="true" id="replyer" class="hidden">
{{- $baseURL := site.BaseURL | absLangURL -}}
{{- $feed := urls.JoinPath $baseURL "/feed.json" | absLangURL -}}
{{- with resources.Get $feed -}}
<!-- Javascript -->
<script>
$(function() {
var projects = [
{{- range .items -}}
{
value: "{{ safeHTML .title }}",
label: "{{ safeHTML .summary }}",
url:"{{ safeURL .url }}"
},
{{- end -}}
];
$("#search").autocomplete({
minLength: 0,
source: projects,
focus: function( event, ui ) {
$("#search").val( ui.item.label );
return false;
},
select: function( event, ui ) {
$("#search").val( ui.item.label );
$("#replyer").val( ui.item.value );
return false;
}
})
.data('ui-autocomplete')._renderItem = function(ul, item) {
return $('<li>')
.append('<a href="' + item.url + '" alt="'+ item.label + '">' + item.value + '</a>' )
.appendTo(ul);
};
});
</script>
{{- end -}}
</div>
Voilà !
Erreur
Q
: Lors de la génération en local, vous avez une
multitude d’erreur, telle que la suivante et le serveur s’arrête
tout seul :
ERROR 2020/08/27 08:16:41 Failed to get JSON resource “http://localhost:1313/fr/feed.json”: Get “http://localhost:1313/fr/feed.json”: dial tcp [::1]:1313: connect: connection refused
R : En environnement local, le serveur n’est pas capable d’appeler une donnée qui n’est pas encore générée.
Documentations
- La documentation officielle : Hugo Documentation : Tools > Search - lien en anglais
- La fonction Hugo
getJSON
: Hugo Documentation : Templates > Data templates - lien en anglais - La méthode JQuery UI
autocomplete()
: https://jqueryui.com/autocomplete - lien en anglais