Newer
Older
git submodule add https://github.com/noesya/osuny-hugo-theme-aaa.git themes/osuny-hugo-theme-aaa
```
Puis il faut créer un package.json avec ```yarn init``` et y ajouter :
```
"dependencies": {
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
},
"scripts": {
"watch": "hugo server",
"build": "hugo --minify"
}
```
## Home page
Il faut un fichier _index.html à la racine du dossier content, qui sert de home page, avec la body class `page__home`.
```
content
| _index.html
```
Il faut remettre la description sans HTML, pour le SEO, mettre le contenu HTML dans le corps du fichier, par souci de cohérence. Le breadcrumb_title permet de gérer le breadcrumb de façon unifiée.
```markdown
---
title: L’IUT Bordeaux Montaigne, le plus court chemin pour aller loin
breadcrumb_title: Accueil
image: "29f2e051-1298-48d4-9e21-5badbd606d30"
description: >
L'Institut Universitaire de Technologie Bordeaux Montaigne, le plus court chemin pour aller loin
---
L’IUT Bordeaux Montaigne,<br><em>le plus court chemin pour aller loin</em>
```
## Branches ou feuilles ?
Il y a 2 façons de structurer les contenus : en branches (ou sections) et en feuilles (ou pages).
### Branches
Avec des fichiers _index.html:
```
content
└───programs/_index.html
│ └───bachelor-universitaire-de-technologie/_index.html
│ └───carrieres-sociales/_index.html
│ └───parcours-animation-sociale-et-socioculturelle/_index.html
```
Les branches sont pensées pour structurer des contenus, et sont donc rendues avec le template "list.html".
L'affichage des enfants dans l'ordre se fait comme cela :
```
{{ range sort .Pages ".Params.position" }}
<a href="{{ .Permalink }}">{{ .Title }}</a>
{{ end }}
```
### Feuilles
Avec des fichiers nommés:
```
content
└───pages
│ │ notre-institut.html
│ └───notre-institut
│ │ consignes-de-securite.html
│ │ equipe-pedagogique.html
```
Les feuilles sont des objets indépendants, rendues avec le template "single.html"
Pour afficher les enfants, il faut ajouter une propriété child_pages (le nom est arbitraire):
```markdown
---
...
child_pages:
- "/notre-institut/presentation-de-liut/"
- "/notre-institut/consignes-de-securite/"
...
---
```
L'affichage se fait comme cela :
```
{{ range .Params.child_pages }}
{{ $page := partial "utils/GetPageByUrl.html" . }}
<div class="col">
<a href="{{ $page.Permalink }}">{{ htmlUnescape $page.Title }}</a>
</div>
{{ end }}
```
### Hybride
Dans l'idée de départ de Hugo, on fait des branches quand on veut grouper des feuilles, et donc on mélange les deux.
On peut le faire, ce qui est très idiomatique, mais cela oblige à ranger différemment les objets qui ont des enfants et ceux qui n'en ont pas, ce qui rend l'algorithme d'export plus compliqué :
```
content
└───pages/
│ └───notre-institut/_index.html
│ │ consignes-de-securite.html
│ │ equipe-pedagogique.html
└───programs/_index.html
│ └───bachelor-universitaire-de-technologie/_index.html
│ └───carrieres-sociales/_index.html
│ │ parcours-animation-sociale-et-socioculturelle.html
```
### Arbitrage
Dans les 3 cas, il faut spécifier les urls dans le frontmatter des contenus.
D'après mes tests, on ne peut pas s'appuyer sur une génération de permalinks récursifs à partir des slugs.
Les sections utilisent toujours les noms de fichiers si elles n'ont pas d'url spécifiée, on ne peut pas leur attribuer de format de permalink dans la config.
Les permalinks ne fonctionnent que pour les pages.
La logique de branche est plus native pour lister les enfants, elle utilise l'objet .Pages, et on ajoute la position pour gérer l'ordre.
Elle implique que les objets sont tous rendus par le template list, les feuilles étant considérées comme des listes vides, ce qui est curieux mais pas très grave.
La logique de feuille avec child_pages utilise un partial maison (utils/GetPageByUrl), qui itère sur l'ensemble des pages.
C'est certainement sous-optimal en termes de performance.
Le choix pur feuilles paraît sans bénéfice.
Le choix pur branches est simple en termes de génération, avec un manque d'élégance.
Le choix hybride est le plus compliqué à générer et le plus élégant du point de vue d'Hugo.
En attente de décision définitive, tout branches.
## Pages
Il faut changer l'architecture vers un système de branches :
```
content
└───pages
│ └───notre-institut/_index.html
│ └───consignes-de-securite/_index.html
│ └───equipe-pedagogique/_index.html
```
Il faut aussi des slashs finaux aux URLS, c'est la pratique adoptée par Hugo (https://discourse.gohugo.io/t/hugo-support-for-urls-without-a-trailing-slash/6763)
Il serait préférable de remettre le text dans le corps des documents et pas dans le frontmatter, puisque nous n'allons plus récupérer les contenus existants sur Github.
```markdown
---
title: "Plan d’accès et contact"
url: "/notre-institut/plan-dacces-et-contact/"
position: 1
categories:
- "a-la-une"
description: >
Où sommes nous ? ATTENTION : nous ne sommes pas sur le site du Campus
---
Où sommes nous ?<br><br> <strong>ATTENTION : nous ne sommes pas sur
```
Suppression d'identifier et parent qui ne sont pas nécessaires.
On garde position pour mettre les pages enfants dans le bon ordre.
## Posts
L'arborescence peut être reprise telle quelle sans problème.
Un fichier _index.html doit être ajouté à la racine pour matérialiser la liste des actualités.
Les fichiers doivent être harmonisés,
```markdown
---
title: "Une bourse ? Un logement ? Constituez dès maintenant votre dossier social étudiant (DSE)"
date: 2021-01-25 15:02:00 +0100 UTC
slug: "constituez-votre-dossier-social-etudiant"
weight: 1
authors:
- "hbeneyrol"
categories:
- "a-la-une"
image: "d97ed0d8-27f6-4c29-8bc3-aac021e6308a"
description: >
N’attendez pas les résultats de vos examens ou votre affectation sur Parcoursup...
---
<img width="480" height="230" src="https://www.iut.u-bordeaux-montaigne.fr/wp-content/uploads/2021/01/Demande_DSE_2021.png"> N’attendez pas les résultats de vos examens ou votre affectation sur Parcoursup ...
```
Weight est utilisé pour épingler les articles, à 0 l'article est dans le flux normal, à 1 il est mis en avant.
## Catégories
Il faut changer l'architecture vers un système de feuilles :
```
content
└───categories/_index.html
│ └───a-la-une/_index.html
│ ...
```
Les catégories ressemblent à ça :
```
---
title: "À la une"
slug: "a-la-une"
---
Flash info publiés sur la page d'accueil
```
Quid des catégories nested? A tester.
## Personnes
Chaque personne peut avoir 4 rôles :
- enseignement (teacher)
- administration (administrator)
- écriture (author)
- recherche (researcher)
Pour bénéficier du système de taxonomie natif d'Hugo, nous devons créer 5 sections de contenus, dont 4 en taxonomies :
- persons (pas une taxo, liste les personnes avec tous leurs rôles)
- teachers (taxo)
- administrators (taxo)
- authors (taxo)
- researchers (taxo)
Les permalinks de ces objets sont définis dans le fichier config.yml
```
permalinks:
persons: /equipe/:slug/
authors: /equipe/:slug/actualites/
administrators: /equipe/:slug/administration/
researchers: /equipe/:slug/publications/
teachers: /equipe/:slug/formations/
taxonomies:
administrator: administrators
author: authors
researcher: researchers
teacher: teachers
```
L'objet personne se définit comme cela :
```
---
title: >
Justin Puyo
slug: "justin-puyo"
first_name: "Justin"
last_name: "Puyo"
phone: ""
email: "justin.puyo@iut.u-bordeaux-montaigne.fr"
roles:
- author
- administrator
---
Lorem ipsum
```
Le rendu se fait avec les layouts persons/list.html et persons/single.html.
### Auteurs
Les contenus sont organisés comme les catégories :
```
content
└───authors
│ │ _index.html
│ └───justin-puyo/_index.html
│ ...
```
Chaque auteur est défini de cette façon, attention à mettre le prénom avant le nom :
```
---
title: >
Actualités de Justin Puyo
person: >
Justin Puyo
slug: "justin-puyo"
---
```
Le rendu se fait avec les layouts authors/list.html et authors/term.html.
### Chercheurs, administrateurs et enseignants
Idem auteurs, avec le title différent :
- Publications de Justin Puyo
- Responsabilités de Justin Puyo
- Enseignements de Justin Puyo
## Formations
Les formations sont gérées en sections Hugo, ce qui permet de les lister en arbre.
```
content
└───programs/_index.html
│ └───bachelor-universitaire-de-technologie/_index.html
│ └───carrieres-sociales/_index.html
│ └───parcours-animation-sociale-et-socioculturelle/_index.html
```
La position est maintenue dans le frontmatter, pour trier les formations d'un même niveau.
```
---
title: "BUT Animation sociale et socioculturelle"
url: /programmes/bachelor-universitaire-de-technologie/carrieres-sociales/parcours-animation-sociale-et-socioculturelle/
continuing: false
level: bachelor
ects:
position: 1
teachers:
- marlene-dulaurans
administrators:
- quentin-bessiere
accessibility: >
contacts: >
<strong>Responsable pédagogique : </strong><br>Francesca Lynn...
duration: >
evaluation: >
objectives: >
Le parcours « Animation sociale et socioculturelle » forme des futurs professionnels ...
opportunities: >
Le B.U.T. peut déboucher sur une insertion professionnelle ou sur une poursuite ...
other: >
pedagogy: >
Les 3 années du programme national comportent 1800 heures de formation sur 6 semestres, ...
prerequisites: >
La formation est ouverte aux élèves de terminale (toutes spécialités), aux titulaires ...
pricing: >
registration: >
---
```
## SEO
Attention, à l'heure actuelle on utilise l'image originale pour le SEO, il faut utiliser une image redimensionnée.
## Breadcrumb
Tout fonctionne avec le partial header/breadcrumbs.
## Menu
Attention, mettre des trailing slashs partout.
Si les liens sont externes, mettre un target blank.
## Medias
GetMedia permet de récupérer les données relatives au media dans les data.
GetImageUrl transforme une URL de média Osuny pour y ajouter des demandes de transformation (taille, format...).
Il faudrait peut-être le renommer GetOsunyImageUrl.
Le partial commons/image génère une balise picture et des src-set, équivalent à [Kamifusen](https://rubygems.org/gems/kamifusen), mais sur la base d'un media. Il faudrait peut-être le renommer imageFromOsuny.
data/media/me/media-id.md
```
---
name: Mon image.jpg
size: 2450
width: 2300
height: 1599
ratio: 1.438
url: https://demo.osuny.org/media/media-id/mon_image.jpg
---
```
content/pages/page-test/_index.html
```
---
title: Page test
image: media-id
---
```
On l'utilise avec (à revoir) :
```
{{ partial "commons/image.html"
(dict
"alt" .Title
"image" .Params.image
"class" "img-fluid"
"mobile" "202x202"
"tablet" "192x192"
"desktop" "196x196"
) }}
```
Cela génère :
```html
<picture>
<source>
<img>
</picture>
```
Syntaxe de transformation type Shopify (à revoir)
```
{{ partial "GetImageUrlOsuny"
(dict
"url" $url
"size" "500x500"
"crop" "center"
"scale" 2
"format" "webp"
) }}
```
- `https://demo.osuny.org/media/media-id/mon_image.jpg`
- `https://demo.osuny.org/media/media-id/mon_image_500x.jpg`
- `https://demo.osuny.org/media/media-id/mon_image_500x500.jpg`
- `https://demo.osuny.org/media/media-id/mon_image_500x500_crop_center.jpg`
- `https://demo.osuny.org/media/media-id/mon_image.webp`
- `https://demo.osuny.org/media/media-id/mon_image_500x.webp`
- `https://demo.osuny.org/media/media-id/mon_image_500x500.webp`
- `https://demo.osuny.org/media/media-id/mon_image_500x500_crop_center.webp`
## Intégration
### CSS Grid Overlay
```
[
{
"columns": 12,
"from": 840,