Compare commits
36 Commits
ea32c9cb09
...
master
Author | SHA1 | Date | |
---|---|---|---|
81c863689e | |||
d5c0ebda14 | |||
c06ff39ffe | |||
cdb7e47a88 | |||
7dd4dbfd3c | |||
e0b3ed9a0f | |||
64eaab93b2 | |||
5089d181bd | |||
42c60bc876 | |||
8576d3cb9d | |||
2f1f498090 | |||
63eb1b60bd | |||
679a554715 | |||
abc114f66a | |||
ae3473dcea | |||
2b026a00ab | |||
6b9914f4e3 | |||
fde8378910 | |||
ad8b29d7af | |||
437ab76c51 | |||
65a8c9b939 | |||
1a2c8fa3fd | |||
6390d59703 | |||
cda43d557f | |||
0a9d9cabfc | |||
ad3107622a | |||
2e74dbfa2b | |||
1221094d75 | |||
8ca72479d4 | |||
d9122917fc | |||
4675c3a10f | |||
04b6bd0203 | |||
5dd616b360 | |||
b8ae0a19ca | |||
84539d10ae | |||
01aafb89a1 |
16
README.md
16
README.md
@ -1,6 +1,16 @@
|
||||
# theme lowtech
|
||||
|
||||
Création d'un site
|
||||
## Shortcodes
|
||||
|
||||
### Year
|
||||
|
||||
Pour afficher l'année en court :
|
||||
|
||||
```
|
||||
{{< year >}}
|
||||
```
|
||||
|
||||
## Initialisation d'un nouveau site
|
||||
|
||||
```sh
|
||||
hugo new site exemple
|
||||
@ -15,6 +25,10 @@ cd themes
|
||||
git submodule add https://git.weko.io/kosssi/hugo-theme-lowtech.git
|
||||
```
|
||||
|
||||
## Contact
|
||||
|
||||
Pour la gestion de contact il est possible d'utiliser des shortcodes spécifiques `{{< mail >}}` ou `{{< tel >}}`
|
||||
|
||||
## Inspirations
|
||||
|
||||
- https://github.com/yuin/goldmark/issues/59
|
||||
|
@ -1,19 +0,0 @@
|
||||
const obfuscates = document.getElementsByClassName("obfuscate");
|
||||
for (const element of obfuscates) {
|
||||
const link = document.createElement("a");
|
||||
const separators = element.dataset.separators;
|
||||
const protocol = element.dataset.param1.split("").reverse().join("");
|
||||
let url = protocol;
|
||||
for (let i = 0; i < separators.length; i++) {
|
||||
url += separators[i] + element.dataset["param" + (i+2)].split("").reverse().join("");
|
||||
}
|
||||
let text = element.dataset.param2.split("").reverse().join("");
|
||||
for (let i = 1; i < separators.length; i++) {
|
||||
text += separators[i] + element.dataset["param" + (i+2)].split("").reverse().join("");
|
||||
}
|
||||
link.innerText = url.replace(new RegExp(element.dataset.regex, 'i'), element.dataset.replace);
|
||||
link.href = url;
|
||||
link.rel = "nofollow";
|
||||
element.parentElement.insertBefore(link, element);
|
||||
}
|
||||
while (obfuscates.length > 0) obfuscates[0].remove();
|
9
assets/js/obfuscates.js
Normal file
9
assets/js/obfuscates.js
Normal file
@ -0,0 +1,9 @@
|
||||
export default function abfuscates() {
|
||||
const obfuscates = document.getElementsByClassName("obfuscate");
|
||||
while (obfuscates.length > 0) {
|
||||
const element = obfuscates[0]
|
||||
element.href = element.dataset.link.split("").reverse().join("");
|
||||
element.innerText = element.innerText.split("").reverse().join("");
|
||||
element.classList.remove('obfuscate');
|
||||
}
|
||||
}
|
3
assets/styles/obfuscates.sass
Normal file
3
assets/styles/obfuscates.sass
Normal file
@ -0,0 +1,3 @@
|
||||
.obfuscate
|
||||
unicode-bidi: bidi-override
|
||||
direction: rtl
|
17
layouts/_default/_markup/render-image.html
Normal file
17
layouts/_default/_markup/render-image.html
Normal file
@ -0,0 +1,17 @@
|
||||
|
||||
{{/*
|
||||
S'il n'y a pas de / dans l'url d'une image alors on ajoute le path de l'article
|
||||
*/}}
|
||||
{{ $path := cond (in .Destination "/") .Destination (path.Join "/" .Page.File.Dir .Destination) }}
|
||||
{{ if ne (substr $path -3 3) "svg" }}
|
||||
{{ $image := .Page.Resources.GetMatch (printf "*%s*" .Destination) }}
|
||||
{{ with $image }}
|
||||
{{ $maxWidth := (default "610" site.Params.ImageWidth) }}
|
||||
{{ if gt $image.Width $maxWidth }}
|
||||
{{ $resizeParams := delimit (slice (default "610x" site.Params.ImageSize) (default "q100" site.Params.ImageQuality) (default "webp" site.Params.ImageFormat)) " " }}
|
||||
{{ $resized := $image.Resize (string $resizeParams) }}
|
||||
{{ $path = $resized.RelPermalink }}
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
<img src="{{ $path | safeURL }}" alt="{{ .Text }}" {{ with .Title}} title="{{ . }}"{{ end }} loading="lazy" />
|
@ -5,31 +5,12 @@
|
||||
{{ $isWebLink := or $isExternalLink (eq 0 (.Destination | strings.Count ":")) }}
|
||||
{{ $isTelLink := strings.HasPrefix .Destination "tel:" }}
|
||||
{{ $isMailtoLink := strings.HasPrefix .Destination "mailto:" }}
|
||||
{{ $hasSlash := in .Destination "/" }}
|
||||
{{- if $isWebLink -}}
|
||||
{{ $hasSlash := in .Destination "/" }}
|
||||
{{ $link := cond (and $isWebLink (and (not $hasSlash) (not $isExternalLink))) (path.Join "/" .Page.File.Dir .Destination) .Destination }}
|
||||
<a href="{{ $link | safeURL }}"{{ with .Title}} title="{{ . }}"{{ end }}{{ if $isExternalLink }} target="_blank" rel="noopener"{{ end }}>{{ .Text | safeHTML }}</a>
|
||||
{{- else -}}
|
||||
{{- $separators := cond $isMailtoLink ":@." ":" -}}
|
||||
{{- $regex := cond $isMailtoLink "[a-z]*:(.*)" "[a-z]*:([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})"}}
|
||||
{{- $replace := cond $isMailtoLink "$1" "$1 $2 $3 $4 $5" -}}
|
||||
{{- $string := .Destination -}}
|
||||
{{- $params := slice -}}
|
||||
|
||||
{{- range split $separators "" }}
|
||||
{{ $parts := split $string . }}
|
||||
{{ $params = $params | append (index $parts 0) }}
|
||||
{{ $string = index $parts 1 }}
|
||||
{{ end }}
|
||||
{{- $params = $params | append (string $string) -}}
|
||||
<span
|
||||
class="obfuscate{{ if $isMailtoLink }} at{{ end }}"
|
||||
data-separators="{{ $separators }}"
|
||||
{{ range $param_index, $param_value := $params }}
|
||||
data-param{{add $param_index 1}}="{{ range $index := seq (sub (len $param_value) 1) 0}}{{ substr $param_value $index 1}}{{ end }}"
|
||||
{{ end }}
|
||||
data-regex="{{ $regex }}"
|
||||
data-replace="{{ $replace }}"
|
||||
>
|
||||
</span>
|
||||
<a href="{{ $link | safeURL }}"{{ with .Title}} title="{{ . }}"{{ end }}{{ if $isExternalLink }} rel="noopener"{{ end }}>{{ .Text | safeHTML }}</a>
|
||||
{{- else if $isMailtoLink -}}
|
||||
{{ partial "contact/mail" .Destination }}
|
||||
{{- else if $isTelLink -}}
|
||||
{{ partial "contact/telephone" .Destination }}
|
||||
{{- end -}}
|
||||
|
@ -4,7 +4,7 @@
|
||||
<body>
|
||||
{{ partial "header.html" . }}
|
||||
{{ partial "debug.html" . }}
|
||||
<main id="content">
|
||||
<main>
|
||||
{{ block "main" . }}{{ end }}
|
||||
</main>
|
||||
{{ partial "footer.html" . }}
|
||||
|
3
layouts/_default/baseof.json
Normal file
3
layouts/_default/baseof.json
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"data" : {{ block "response" .}}{{ end }}
|
||||
}
|
4
layouts/_default/item.json.json
Normal file
4
layouts/_default/item.json.json
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"name": "{{ .Title }}",
|
||||
"permalink" : "{{ .Permalink }}"
|
||||
}
|
@ -1,3 +1,8 @@
|
||||
{{ define "main" }}
|
||||
{{ .Content }}
|
||||
<ul>
|
||||
{{ range .Pages }}
|
||||
<li><a href="{{ .RelPermalink }}">{{ .Title }}</a></li>
|
||||
{{ end }}
|
||||
</ul>
|
||||
{{ end }}
|
||||
|
7
layouts/_default/list.json.json
Normal file
7
layouts/_default/list.json.json
Normal file
@ -0,0 +1,7 @@
|
||||
{{ define "response" }}
|
||||
[
|
||||
{{ range $index, $e := .Data.Pages }}
|
||||
{{ if $index }}, {{ end }}{{ .Render "item" }}
|
||||
{{ end }}
|
||||
]
|
||||
{{ end }}
|
1
layouts/_default/single.json.json
Normal file
1
layouts/_default/single.json.json
Normal file
@ -0,0 +1 @@
|
||||
{{ define "response" }} {{ .Render "item" }} {{ end }}
|
6
layouts/partials/contact/adresse.html
Normal file
6
layouts/partials/contact/adresse.html
Normal file
@ -0,0 +1,6 @@
|
||||
{{- with .Site.Data.contact.adresse -}}
|
||||
<p>
|
||||
{{ .rue }} <br>
|
||||
{{ .cp }}{{ " " }}{{ .ville }}
|
||||
</p>
|
||||
{{- end -}}
|
3
layouts/partials/contact/instagram.html
Normal file
3
layouts/partials/contact/instagram.html
Normal file
@ -0,0 +1,3 @@
|
||||
{{- with .Site.Data.contact.instagram -}}
|
||||
<a class="instagram" href="https://www.instagram.com/{{ . }}/">@{{ . }}</a>
|
||||
{{- end -}}
|
12
layouts/partials/contact/mail.html
Normal file
12
layouts/partials/contact/mail.html
Normal file
@ -0,0 +1,12 @@
|
||||
{{- $protocol := "mailto" -}}
|
||||
{{- $mail := . -}}
|
||||
{{- $mailWithProtocol := $mail -}}
|
||||
{{- if strings.HasPrefix $mail $protocol -}}
|
||||
{{- $mail = substr $mail 7 -}}
|
||||
{{- else -}}
|
||||
{{- $mailWithProtocol = print $protocol ":" $mail -}}
|
||||
{{- end -}}
|
||||
<a
|
||||
class="mail obfuscate"
|
||||
data-link="{{ range $index := seq (sub (len $mailWithProtocol) 1) 0}}{{ substr $mailWithProtocol $index 1}}{{ end }}"
|
||||
>{{ range $index := seq (sub (len $mail) 1) 0}}{{ substr $mail $index 1}}{{ end }}</a>
|
12
layouts/partials/contact/telephone.html
Normal file
12
layouts/partials/contact/telephone.html
Normal file
@ -0,0 +1,12 @@
|
||||
{{- $protocol := "tel" -}}
|
||||
{{- $tel := . -}}
|
||||
{{- $telWithProtocol := $tel -}}
|
||||
{{- if strings.HasPrefix $tel $protocol -}}
|
||||
{{- $tel = substr $tel 4 -}}
|
||||
{{- else -}}
|
||||
{{- $telWithProtocol = print $protocol ":" (replace $tel " " "") -}}
|
||||
{{- end -}}
|
||||
<a
|
||||
class="tel obfuscate"
|
||||
data-link="{{ range $index := seq (sub (len $telWithProtocol) 1) 0}}{{ substr $telWithProtocol $index 1}}{{ end }}"
|
||||
>{{ range $index := seq (sub (len $tel) 1) 0}}{{ substr $tel $index 1}}{{if modBool $index 2}} {{ end }}{{ end }}</a>
|
1
layouts/partials/copyright.html
Normal file
1
layouts/partials/copyright.html
Normal file
@ -0,0 +1 @@
|
||||
<p>© {{ .Site.Title }}{{ " " }}{{ partial "year" }}</p>
|
@ -2,12 +2,12 @@
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
|
||||
<base href="{{ .Site.BaseURL }}">
|
||||
<link rel="canonical" href="{{ .Permalink }}" />
|
||||
{{ with .OutputFormats.Get "RSS" }}<link href="{{ .RelPermalink }}" rel="alternate" type="application/rss+xml" />{{ end }}
|
||||
|
||||
<meta name="HandheldFriendly" content="True">
|
||||
<meta name="MobileOptimized" content="320">
|
||||
{{ if ne hugo.Environment "production" }}<meta name="robots" content="noindex">{{ end }}
|
||||
|
||||
{{ partial "social_metadata.html" . }}
|
||||
{{ partial "style.html" . }}
|
||||
|
@ -1,5 +1,9 @@
|
||||
{{ $js := resources.Get "js/main.js" }}
|
||||
{{ with $js }}
|
||||
{{ $secureJS := . | resources.Minify | resources.Fingerprint }}
|
||||
{{ $secureJS := . | js.Build }}
|
||||
{{ if not $.Site.Params.debug }}
|
||||
{{ $secureJS = $secureJS | minify }}
|
||||
{{ end }}
|
||||
{{ $secureJS = $secureJS | fingerprint }}
|
||||
<script src="{{ $secureJS.Permalink }}" integrity="{{ $secureJS.Data.Integrity }}"></script>
|
||||
{{ end }}
|
||||
|
4
layouts/partials/plausible.html
Normal file
4
layouts/partials/plausible.html
Normal file
@ -0,0 +1,4 @@
|
||||
{{ if or (eq hugo.Environment "production") (eq hugo.Environment "staging") }}
|
||||
<script async defer data-api="/api/event" data-domain="{{ (urls.Parse .Site.BaseURL).Host }}" src="/js/script.js"></script>
|
||||
<script>window.plausible = window.plausible || function() { (window.plausible.q = window.plausible.q || []).push(arguments) }</script>
|
||||
{{ end }}
|
@ -1,5 +1,13 @@
|
||||
{{/* https://github.com/msfjarvis/hugo-social-metadata */}}
|
||||
|
||||
{{ if .Site.Params.FaviconEmoji }}
|
||||
<link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>{{ .Site.Params.FaviconEmoji }}</text></svg>">
|
||||
{{ else if .Site.Params.FaviconSVG }}
|
||||
<link rel="icon" href="data:image/svg+xml;{{ safeURL .Site.Params.FaviconSVG }}">
|
||||
{{ else if .Site.Params.FaviconFile }}
|
||||
<link rel="icon" href="{{ .Site.Params.FaviconFile }}">
|
||||
{{ end }}
|
||||
|
||||
<!-- Configure meta and title tags -->
|
||||
<meta property="og:type" content="website" />
|
||||
{{ if .Site.Params.TwitterCardType }}
|
||||
@ -20,7 +28,7 @@
|
||||
<meta name="twitter:title" content="{{ default .Site.Title .Title }}" />
|
||||
<meta name="twitter:description" content="{{ $.Site.Params.description }}" />
|
||||
<meta name="twitter:url" content="{{ .Site.BaseURL }}" />
|
||||
<meta name="twitter:image:src" content="{{ .Site.BaseURL}}{{ .Site.Params.SocialImage }}" />
|
||||
<meta name="twitter:image" content="{{ .Site.BaseURL}}{{ .Site.Params.SocialImage }}" />
|
||||
{{ else }}
|
||||
<title>{{ .Title }} · {{ .Site.Title }}</title>
|
||||
<meta name="description" content="{{ .Description }}" />
|
||||
@ -37,9 +45,9 @@
|
||||
{{ end }}
|
||||
<meta name="twitter:url" content="{{ .Permalink }}" />
|
||||
{{ if .Params.SocialImage }}
|
||||
<meta name="twitter:image:src" content="{{ .Site.BaseURL }}{{ .Params.SocialImage }}" />
|
||||
<meta name="twitter:image" content="{{ .Site.BaseURL }}{{ .Params.SocialImage }}" />
|
||||
{{ else }}
|
||||
<meta name="twitter:image:src" content="{{ .Site.Params.SocialImage }}" />
|
||||
<meta name="twitter:image" content="{{ .Site.BaseURL }}{{ .Site.Params.SocialImage }}" />
|
||||
{{ end }}
|
||||
{{ end }}
|
||||
{{ if .Params.tags }}
|
||||
@ -49,3 +57,13 @@
|
||||
{{ else }}
|
||||
<meta name="keywords" content="{{ $.Site.Params.Keywords }}" />
|
||||
{{ end }}
|
||||
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "http://schema.org/",
|
||||
"@type": "WebSite",
|
||||
"name": "{{ default .Site.Title .Title }}",
|
||||
"image": "{{ .Site.BaseURL}}{{ default .Site.Params.SocialImage .Params.SocialImage }}",
|
||||
"about": "{{ .Site.Params.description }}"
|
||||
}
|
||||
</script>
|
||||
|
@ -1,2 +1,9 @@
|
||||
{{ $style := resources.Get "styles/main.sass" | toCSS | minify | fingerprint }}
|
||||
<link rel="stylesheet" href="{{ $style.Permalink }}">
|
||||
{{ $style := resources.Get "styles/main.sass" }}
|
||||
{{ with $style }}
|
||||
{{ $styleCSS := . | toCSS }}
|
||||
{{ if not $.Site.Params.debug }}
|
||||
{{ $styleCSS = $styleCSS | minify }}
|
||||
{{ end }}
|
||||
{{ $styleCSS = $styleCSS | fingerprint }}
|
||||
<link rel="stylesheet" href="{{ $styleCSS.Permalink }}" integrity="{{ $styleCSS.Data.Integrity }}">
|
||||
{{ end }}
|
||||
|
1
layouts/partials/year.html
Normal file
1
layouts/partials/year.html
Normal file
@ -0,0 +1 @@
|
||||
{{- now.Format "2006" -}}
|
1
layouts/shortcodes/adresse.html
Normal file
1
layouts/shortcodes/adresse.html
Normal file
@ -0,0 +1 @@
|
||||
{{ partial "contact/adresse" . }}
|
1
layouts/shortcodes/instagram.html
Normal file
1
layouts/shortcodes/instagram.html
Normal file
@ -0,0 +1 @@
|
||||
{{- partial "contact/instagram" . -}}
|
1
layouts/shortcodes/mail.html
Normal file
1
layouts/shortcodes/mail.html
Normal file
@ -0,0 +1 @@
|
||||
{{- partial "contact/mail" .Site.Data.contact.mail -}}
|
1
layouts/shortcodes/telephone.html
Normal file
1
layouts/shortcodes/telephone.html
Normal file
@ -0,0 +1 @@
|
||||
{{- partial "contact/telephone" .Site.Data.contact.telephone -}}
|
@ -1 +1 @@
|
||||
{{- now.Format "2006" -}}
|
||||
{{ partial "year" . }}
|
||||
|
5777
package-lock.json
generated
5777
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -4,10 +4,12 @@
|
||||
"author": "Simon <simon@lamelio.fr>",
|
||||
"license": "GPL-3.0",
|
||||
"dependencies": {
|
||||
"@resilien/directus-to-markdown": "1.2.0",
|
||||
"imagemin-cli": "^6.0.0",
|
||||
"imagemin-webp": "^6.0.0",
|
||||
"richtypo": "4.0.7",
|
||||
"richtypo-rules-common": "4.0.2",
|
||||
"richtypo-rules-fr": "4.0.2"
|
||||
"richtypo": "4.1.9",
|
||||
"richtypo-rules-common": "4.1.8",
|
||||
"richtypo-rules-fr": "4.0.11",
|
||||
"url-slug": "3.0.3"
|
||||
}
|
||||
}
|
||||
|
34
scripts/run
34
scripts/run
@ -31,12 +31,9 @@ stats() {
|
||||
}
|
||||
|
||||
install() {
|
||||
echo "📦 Installation des dépendances 📦"
|
||||
echo "----------------------------------"
|
||||
echo
|
||||
echo "- Récupération du theme"
|
||||
git submodule update --init
|
||||
echo "- Installation des dépendances node du theme"
|
||||
echo "📦 Installation des dépendances node du theme 📦"
|
||||
echo
|
||||
cd themes/hugo-theme-lowtech && npm i
|
||||
}
|
||||
|
||||
@ -50,6 +47,12 @@ dev_prod() {
|
||||
hugo server
|
||||
}
|
||||
|
||||
build_prod() {
|
||||
rm -rf public
|
||||
hugo --minify --environment production
|
||||
node themes/hugo-theme-lowtech/scripts/typo
|
||||
}
|
||||
|
||||
prod() {
|
||||
echo
|
||||
echo "🚀 Déploiement du site en mode production 🚀"
|
||||
@ -58,7 +61,7 @@ prod() {
|
||||
hugo --minify --environment production
|
||||
node themes/hugo-theme-lowtech/scripts/typo
|
||||
#DATE=`date +\"%Y0101\"` && find public -exec touch -d $DATE {} +
|
||||
docker-compose --context $DOCKER_CONTEXT -f docker-compose.prod.yml up -d --build --force-recreate
|
||||
DOCKER_CONTEXT=$DOCKER_CONTEXT docker compose -f docker-compose.prod.yml up -d --build --force-recreate
|
||||
}
|
||||
|
||||
staging() {
|
||||
@ -69,14 +72,27 @@ staging() {
|
||||
hugo --minify -DF --environment staging
|
||||
node themes/hugo-theme-lowtech/scripts/typo
|
||||
#DATE=`date +\"%Y0101\"` && find public -exec touch -d $DATE {} +
|
||||
docker-compose --context $DOCKER_CONTEXT -f docker-compose.staging.yml up -d --build --force-recreate
|
||||
DOCKER_CONTEXT=$DOCKER_CONTEXT docker compose -f docker-compose.staging.yml up -d --build --force-recreate
|
||||
}
|
||||
|
||||
favicons() {
|
||||
echo
|
||||
if [ -f "static/logo.png" ]; then
|
||||
echo "🔍 Génération des favicons à partir d'une image 512px"
|
||||
echo
|
||||
convert static/logo.png -resize 32x32 -colors 16 \( -clone 0 -resize 16x16 -extent 16x16 \) \( -clone 0 -resize 32x32 -extent 32x32 \) -delete 0 static/favicon.ico
|
||||
convert static/logo.png -background transparent -resize 48x48 -colors 16 \( -clone 0 -resize 16x16 -extent 16x16 \) \( -clone 0 -resize 32x32 -extent 32x32 \) \( -clone 0 -resize 48x48 -extent 48x48 \) -delete 0 static/favicon.ico
|
||||
elif [ -f "static/logo.svg" ]; then
|
||||
echo "🔍 Génération des favicons à partir d'une image SVG"
|
||||
echo
|
||||
convert static/logo.svg -background transparent -resize 48x48 -colors 16 \( -clone 0 -resize 16x16 -extent 16x16 \) \( -clone 0 -resize 32x32 -extent 32x32 \) \( -clone 0 -resize 48x48 -extent 48x48 \) -delete 0 static/favicon.ico
|
||||
else
|
||||
echo "🚧 Il faut un fichier 'logo.svg' ou 'logo.png' dans le dossier static"
|
||||
fi
|
||||
echo
|
||||
echo "Aide :"
|
||||
echo "- liste des emoji : https://www.unicode.org/emoji/charts/full-emoji-list.html"
|
||||
echo "- les emoji de twitter : https://github.com/twitter/twemoji"
|
||||
echo "- Pour créer un base64 : \`echo \"data:image/svg+xml;base64,\$(cat static/logo.svg | base64 | tr -d '\r\n')\"\`"
|
||||
}
|
||||
|
||||
optimizer() {
|
||||
@ -127,7 +143,7 @@ help_generic() {
|
||||
echo "- ./run logs_backup 📥 Sauvegarde les logs"
|
||||
echo "- ./run logs_restore 📤 Restaure les logs"
|
||||
echo "- ./run stats 🌠 Mise à jour de GoAccess"
|
||||
echo "- ./run favicons 🔍 Génération des favicons à partir d'une image 512px"
|
||||
echo "- ./run favicons 🔍 Génération des favicons à partir d'une image 512px ou un SVG"
|
||||
echo "- ./run optimizer 🖼️ Optimisation des images"
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user