Add search capabilities

This commit is contained in:
Thomas Schwery 2020-02-06 22:38:58 +01:00
parent e26fce78ff
commit c3c169a557
6 changed files with 143 additions and 10 deletions

View file

@ -16,5 +16,8 @@ copyright = ""
category = "categories"
tag = "tags"
[outputs]
home = ["html", "rss", "json"]
[params]
logo = "/images/logo.png"

4
content/search.md Normal file
View file

@ -0,0 +1,4 @@
---
title: "Search Results"
layout: "search"
---

View file

@ -0,0 +1,71 @@
var searchFunction = function(event) {
var searchQuery = $('#search-query').val();
if (searchQuery.length <= 3) {
$('#search-results').html("<p>Aucun résultat trouvé</p>");
return;
}
var lunrResults = lunrIdx.search(searchQuery);
if (lunrResults.length > 0) {
populateLunrResults(searchQuery, lunrResults);
}else{
$('#search-results').html("<p>Aucun résultat trouvé</p>");
}
}
var templateDefinition = `
<div id="summary-{{ key }}">
<h4><a href="{{ link }}">{{ title }}</a> <small>{{ categories }}</small></h4>
<p>{{ content }}</p>
</div>
`;
var template = Handlebars.compile(templateDefinition);
var populateLunrResults = function(searchQuery, results) {
var resultDiv = $('#search-results');
resultDiv.html('');
$.each(results,function(rIdx,result){
var resultPage = jsonData.filter(function(page) {
return page.permalink === result.ref;
})[0];
console.info(result);
console.info(resultPage);
var output = template({
key: rIdx,
title: resultPage.title,
content: resultPage.contents,
categories: resultPage.categories,
link: result.ref
});
resultDiv.append(output);
$("#summary-" + rIdx).mark(searchQuery.replace(/[+-]/g, ''));
});
}
var lunrIdx;
var jsonData;
$('#search-query').prop('disabled', true);
$.getJSON( "../index.json", function( pages ) {
jsonData = pages;
lunrIdx = lunr(function() {
this.field("title", { boost: 10 });
this.field("categories", { boost: 5 });
this.field("contents");
this.ref("permalink");
jsonData.forEach(function (page) {
this.add(page)
}, this)
});
$('#search-query').prop('disabled', false);
searchFunction();
});
var formField = $('#search-query');
formField.change(searchFunction);
formField.keyup(searchFunction);

View file

@ -0,0 +1,21 @@
{{- $allRecettes := newScratch -}}
{{- $allRecettes.Add "index" slice -}}
{{- range .Site.RegularPages -}}
{{ $recette := (dict "title" .Title "permalink" .Permalink "categories" .CurrentSection.Title) }}
{{- $ingredients := newScratch -}}
{{- $ingredients.Add "ingredients" slice -}}
{{- range .Params.steps -}}
{{- range .ingredients -}}
{{- $ingredients.Add "ingredients" .name -}}
{{- end -}}
{{- end -}}
{{- $ingredientsArray := $ingredients.Get "ingredients" -}}
{{- $ingredientsContent := delimit $ingredientsArray ", " -}}
{{- $recette := merge $recette (dict "ingredients" $ingredientsArray) -}}
{{- $recette := merge $recette (dict "contents" $ingredientsContent) -}}
{{- $allRecettes.Add "index" $recette -}}
{{- end -}}
{{- $allRecettes.Get "index" | jsonify -}}

View file

@ -0,0 +1,31 @@
{{ partial "header.html" . }}
{{ $searchJS := resources.Get "js/search.js" }}
{{ $searchJSMin := $searchJS | minify | resources.Fingerprint "sha512" }}
<script src="https://code.jquery.com/jquery-3.4.1.min.js"
integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo="
crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.7.3/handlebars.min.js"
integrity="sha256-/PJBs6QWvXijOFIX04kZpLb6ZtSQckdOIavLWKKOgXU="
crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/jquery.mark.min.js"
integrity="sha256-4HLtjeVgH0eIB3aZ9mLYF6E8oU5chNdjU6p6rrXpl9U="
crossorigin="anonymous"></script>
<script src="https://unpkg.com/lunr/lunr.js"></script>
<section class="resume-section p-3 p-lg-5 d-flex flex-column">
<div class="my-auto" >
<div class="form-group">
<label for="search-query">Termes de recherche</label>
<input class="form-control form-control-lg" placeholder="Poulet, Viande, Fondue, Soupe, ..." id="search-query" name="s"/>
</div>
<div class="mt-5" id="search-results">
</div>
</div>
</section>
<script src="{{ $searchJSMin.Permalink }}"></script>
{{ partial "footer.html" . }}

View file

@ -9,6 +9,9 @@
{{ $cssBundle := slice $bootstrapCSS $customCSS | resources.Concat "css/bundle.css" }}
{{ $cssBundleMin := $cssBundle | resources.Minify | resources.Fingerprint "sha512" }}
{{ $indexUrl := "index.html" | absURL }}
{{ $searchUrl := "search" | absURL }}
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="//fonts.googleapis.com/css?family=Roboto:400,700" rel="stylesheet" type="text/css">
@ -23,16 +26,16 @@
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-light bg-light mb-5">
<div class="container">
<div class="navbar-nav">
<a class="nav-link" href="/index.html">
<h3>
Recettes
</h3>
</a>
</div>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<a class="navbar-brand" href="/index.html"><h3>Recettes</h3></a>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav mr-auto">
<li class="nav-item"><a class="nav-link" href="{{ $indexUrl }}">Accueil</a></li>
</ul>
<ul class="navbar-nav">
<li class="nav-item "><a class="nav-link" href="{{ $searchUrl }}">Rechercher</a></li>
</ul>
</div>
</nav>
<div class="container">
<div class="container pt-5">
<article class="content">