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.
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