đŒïž Slides as code avec SliDesk đšâđ»
đ TL;DR
Projet de slides as code simple, léger et personnalisable.
- đ https://slidesk.github.io/slidesk-doc/
- đ https://github.com/slidesk/slidesk
- đ https://slidesk.github.io/slidesk/
- đ le code source de cet article
Il y a quelques temps, je me suis déjà essayé, avec peu de succÚs, à coder mes slides.
A cette Ă©poque, jâai testĂ© Reveal.js et je nâai pas rĂ©ussi Ă aller au bout de mon test pour plusieurs raisons.
Les principales : un niveau trop faible en CSS, la complexitĂ© de Reveal.js, un niveau trop faible en CSS đ
.
Mais alors, pourquoi réessayer ?
Tout simplement parce que, depuis, lâenvie de coder mes slides plutĂŽt que de les dessiner ne mâa pas quittĂ©.
Voyez-y de la geekerie (que jâassume) mais aussi ces autres raisons :
- je ne peux pas forcément utiliser les outils classiques que sont Office ou Google Slides,
- je trouve le suivi de version de ces outils pas assez abouti,
- le travail collaboratif par PR me semble plus appropriĂ© lorsque lâon travaille Ă plusieurs,
- la gestion multilingue oĂč il faut tout refaire ne me convient pas,
- jâaime coder đ
Il nâempĂȘche que lorsque jâai, de nouveau, franchi le pas en dĂ©but dâannĂ©e derniĂšre, je me suis confrontĂ© aux mĂȘmes problĂšmes que la derniĂšre fois en rĂ©essayant Reveal.js et consorts. Autre Ă©lĂ©ment qui mâa aussi ennuyĂ©, le cĂŽtĂ© monolithe du dev alors que mon envie Ă©tait la possibilitĂ© de traiter mes slides comme un dĂ©veloppement : factorisables, gĂ©nĂ©riques et composables.
đ€ Pourquoi SliDesk ?
Je ne suis pas aussi calĂ© quâHubert SablonniĂšre qui code carrĂ©ment tout un site pour les slides des ses talks đ€©. Allez jeter un coup dâoeil Ă son site.
Comme souvent, tout part dâune discussion đ. Dans ce cas, avec Sylvain, lâauteur de SliDesk. Je lui indiquais, que je galĂ©rais avec Reveal.js et quâen plus, nativement, le multilingue nâĂ©tait pas super bien gĂ©rĂ© (et toujours le cĂŽtĂ© monolithe qui ne me plaisait pas).
De fil en aiguille, Sylvain, qui bossait sur le sujet SliDesk me propose dâintĂ©grer cette fonctionnalitĂ© dans ses devs đ€©. LâidĂ©e devient alors une motivation supplĂ©mentaire : lâaider dans la mise au point de son projet, avec mes retours de dĂ©butant de CSS et JS. CâĂ©tait lâoccasion de participer avec lui Ă son aventure !
Enfin, Sylvain me lâavait indiquĂ© : son objectif Ă©tait de faire un slide as code simple et personnalisable !
đ DĂ©marrer avec SliDesk
Les premiĂšres choses Ă faire : aller voir du cĂŽtĂ© du repository GitHub, de la documentation et de lâexemple.
Ensuite, vient le temps dâinstaller SliDesk. Ou plus prĂ©cisĂ©ment, la CLI de SliDesk qui va ĂȘtre votre compagnon pour tirer pleinement parti de SliDesk.
Jâen parlerai plus tard, mais la CLI vous permettra aussi de servir vos pages pour afficher vos slides.
Pour installer SliDesk, suivez la documentation qui explique les différentes façons de procéder.
Pour ma part jâai utilisĂ© brew : brew install gouz/tools/slidesk
.
âš Initialisation dâun projet
Pour initialiser un projet, rien de plus simple : slidesk create slidesk-discovery
.
1
2
3
4
5
6
7
8
9
$ slidesk create slidesk-discovery
____(âą)-
(SliDesk) v 2.4.3
Creation of your talk: slidesk-discovery
> What is the title of talk?
SliDesk discovery
> Do you want to customize the presentation? [yN]
y
le fait dâindiquer que lâon souhaite personnaliser la prĂ©sentation permet dâavoir un fichier custom.css de crĂ©Ă©.
Une fois la commande exĂ©cutĂ©e, lâarborescence suivante est crĂ©Ă©e :
1
2
3
slidesk-discovery
âââ custom.css
âââ main.sdf
On y retrouve le fichier custom.css dont je vous parlais et le fichier main.sdf qui va ĂȘtre le fichier point dâentrĂ©e de notre prĂ©sentation.
lâextension .sdf est propre Ă SliDesk mais au final câest un format texte oĂč lâon va mĂ©langer syntaxe SliDesk, Markdown et HTML.
Voyons le contenu du fichier main.sdf :
1
2
3
4
5
6
7
/::
custom_css: custom.css
::/
# SliDesk discovery
## My first Slide
Jâutilise ici le markdown pour la coloration syntaxique mais Sylvain a dĂ©veloppĂ© une extension VSCode qui permet dâavoir la coloration des fichiers sdf
On voit ici la structure dâun slide SliDesk :
# SliDesk discovery
: titre principal dâune prĂ©sentation, reprĂ©sente le premier slide## My first Slide
: un slide simple dans SliDesk.
Voyons ce que cela donne de maniĂšre visuelle.
Pour cela il faut exécuter notre présentation : slidesk
.
1
2
3
4
5
6
7
8
9
10
11
$ slidesk
____(âą)-
(SliDesk) v 2.4.3
Take the control of your presentation direct from here.
Press Enter to go to the next slide.
Press P + Enter to go to the previous slide.
Press Q to quit the program.
Your presentation is available on: http://localhost:1337
Lorsque lâon exĂ©cute slidesk, si un fichier main.sdf est prĂ©sent cela lance automatiquement la prĂ©sentation Ă partir de celui-ci.
On voit aussi quâil est possible de naviguer via le terminal en utilisant le clavier et de se connecter Ă la prĂ©sentation pour lâafficher sur le port 1337
(paramétrage par défaut facilement modifiable).
Rendu des slides lors de la génération d'un projet |
đïž Organisation de ses sources
Je vous lâai dit, une des choses que je nâaimais pas avec les autres Frameworks câĂ©tait lâobligation de tout mettre dans un seul fichier. Je trouvais ça contre productif et contre intuitif (et accessoirement impossible de travailler efficacement Ă plusieurs).
SliDesk, au contraire, permet une totale libertĂ© dâorganisation de slides, dâimages, de CSS, JS, ⊠A noter, quâil vous est aussi possible de tout mettre dans un seul fichier si vous prĂ©fĂ©rez đ.
Voici un exemple dâorganisation de sources :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
.
âââ assets
â âââ css
â â âââ custom.css
â âââ images
â âââ prez
â âââ ours.png
â âââ tadx.png
â âââ whoami.png
âââ LICENSE
âââ main.sdf
âââ README.md
âââ slides
âââ speaker.sdf
On retrouve le ficher main.sdf à la racine. Les ressources dans un répertoire assets avec ses sous répertoires selon les ressources. Et enfin, un répertoire slides avec les différents fichiers sdf.
A noter quâil est possible de crĂ©er dâautres sous rĂ©pertoires afin de classer comme bon vous semble les diffĂ©rents fichiers.
Mais, comment cela fonctionne au final lâassemblage ?
GrĂące Ă la directive include
.
Le fichier main.sdf devient donc :
1
2
3
4
5
6
7
/::
custom_css: assets/css/custom.css
::/
# SliDesk discovery
!include(slides/speaker.sdf)
On voit ici lâinclusion du slide speaker.sdf mais aussi de la feuille de style custom.css qui se trouvent tous les deux dans des sous-arborescences.
Câest cette libertĂ© dans lâorganisation et dans la syntaxe (on le verra plus tard) que jâaime dans SliDesk đ.
đš Un peu de personnalisation
Comme je vous lâai dĂ©jĂ indiquĂ©, il est possible de personnaliser SliDesk avec sa propre feuille de style. En effet, SliDesk se veut simple et vient avec un style Ă©purĂ©. Nul doute que, quelque soit votre niveau de CSS (et croyez moi, je sais de quoi je parle đ ), vous aurez besoin de personnaliser le rendu de vos slides. Il est possible de tout faire en HTML (oui jâai essayĂ© tellement je nâaime pas le CSS đ). Force est de constater quâil est plus simple et plus dans lâesprit de SliDesk de le faire en CSS. Je ne suis pas devenu un pro de CSS mais avec un peu dâhabitude, beaucoup dâinspecteur de code et encore plus de demande dâaide de Sylvain (merci Ă toi) on y arrive !
Dans mon cas câest assez simple, car mon template favori pour faire des slides : un fond blanc, une police noire et des listes Ă puces.
Quelques images et emojis et on a fait le tour !
LĂ oĂč jâai le plus eu de difficultĂ©s câest avec les images pour les positionner comme il faut.
SliDesk est responsive, lâidĂ©e est donc que les images suivent aussi lorsque la rĂ©solution ou la place changent đ.
SliDesk vient Ă notre secours avec une directive image
mais vous pourrez avoir besoin de gérer une ou deux images pour des besoins spécifiques.
Revenons Ă nos moutons et voyons un peu ce que donne la personnalisation.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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
:root {
--sd-heading1-size: 8.5vw;
--sd-heading1-line-height: 1;
--sd-heading2-size: 5vw;
--sd-heading2-line-height: 1;
--sd-text-size: 2.2vw;
--sd-text-line-height: 1.2;
--sd-background-color: #fff;
--sd-heading-color: #000;
--sd-text-color: #000;
--sd-primary-color: rgb(37, 186, 146);
/* SpeakerView */
--sd-sv-timer-size: 80px;
--sd-sv-text-size: 40px;
--sd-sv-text-line-height: 1.2;
--sd-sv-background-color: #242424;
--sd-sv-text-color: rgba(255, 255, 255, 0.87);
}
.slide-text {
display: block;
}
.slide-text h2 {
text-align: left;
margin-bottom: 5rem;
}
.slide-text ul {
margin: 2rem;
width: 62%;
}
.slide-text ul li {
list-style: none;
line-height: 1.6em;
}
.slide-text .twitter {
color: var(--sd-primary-color);
}
.slide-text p {
text-align: left;
line-height: 1.6em;
}
Je reviendrai sur la speaker view prĂ©sente dans le CSS plus tard đ
đŒïž Coder ses slides
Il est maintenant grand temps de coder son premier slide.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
## Stéphane Philippart .[slide-text]
!image(assets/images/prez/whoami.png,, 494, 155, float: right; margin-top: -16vh)
- đ·ïž đ„ DeveloperAdvocate@OVHCloud đŠ
- đ·ïž Co-creator of TADx (Agile, Dev, DevOps meetups in Tours)
!image(assets/images/prez/tadx.png, tadx, 304, 165, float: right; margin-top: -9vh)
- âïž A Java developer in the cloud âïž
!image(assets/images/prez/ours.png, ours, 437, 414, float: right;)
- đŠ <span class="twitter">@wildagsx</span>
- đ https://philippart-s.github.io/blog
- đ https://github.com/philippart-s/
- đŹ https://www.linkedin.com/in/philippartstephane/
Ici on voit plusieurs choses.
Commençons par la syntaxe markdown : on retrouve les titres de sections ##
et les listes Ă puces -
.
On peut appliquer un style CSS Ă lâensemble du slide .[slide-text]
.
On découvre aussi la directive image en action.
Le CSS précédent avec le code ci-dessous nous donne maintenant un joli slide de présentation de speaker.
Sâil permet de faire du pure HTML, CSS et JS, SliDesk vient avec sa syntaxe pour vous faciliter la vie. Je vous laisse aller voir les diffĂ©rentes syntaxes possibles dans la documentation.
𧩠Les plugins
SliDesk vient avec des plugins pré-définis. Vous en avez déjà pas mal et plutÎt cools comme : piloter sa présentation avec un gamepad, avoir des listes à puces animées, une barre de progression, ⊠Je vous laisse allez voir la vingtaine de plugins disponibles.
Et si vous ne trouvez pas votre bonheur vous pouvez en crĂ©er vous-mĂȘmes.
Câest, avec mon petit niveau front, ce que jâai fait.
Jâavais besoin de rajouter un footer avec logo et autres informations, du coup jâai crĂ©Ă© un plugin.
Pour cela il faut créer un répertoire plugins
à la racine de votre projet puis un sous répertoire contenant votre plugin.
Dans mon cas ce sera footer
.
Ensuite il faut créer quelques fichiers.
âïž Plugin.json
Câest le fichier principal qui va contenir les paramĂštres du plugin.
1
2
3
4
{
"addHTMLFromFiles": ["./plugins/footer/footer.html"],
"addStyles": ["./plugins/footer/footer.css"]
}
Il y a plusieurs champs que vous pouvez renseigner.
Dans mon cas jâai utilisĂ© deux champs :
- le premier pour indiquer le code HTML de mon plugin
- le deuxiĂšme pour indiquer le CSS propre Ă mon plugin
đ footer.html
Fichier qui contient simplement le code HTML du plugin.
1
2
3
4
5
6
7
8
9
<div class="footer">
<div class="ovhcloud-footer">
<img src="assets/images/OVHcloud_logo.png" alt="OVHcloud right logo" style="width: 20%" />
</div>
<div class="author-footer">@wildagsx</div>
<div class="footer">
<img src="assets/images/footer.png" alt="Centered footer image" style="width: 25%;margin: auto;" />
</div>
</div>
đš footer.css
Fichier qui contient la feuille de style du plugin.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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
/****
* CSS for center element
****/
.footer {
position: fixed;
left: 0;
bottom: 0;
width: 100%;
color: rgb(0, 0, 0);
text-align: center;
transition: all var(--animationTimer) ease;
}
/****
* CSS for OVHcloud logo
****/
.ovhcloud-footer {
position: absolute;
left: 0%;
top: 50%;
transform: translateY(-50%);
}
.ovhcloud-footer img {
padding: 2px;
transition: all var(--animationTimer) ease;
}
/****
* CSS for logo
****/
.img-footer {
margin: 0 auto;
width: 100px;
text-align: center;
}
/****
* CSS for author element
****/
.author-footer {
position: absolute;
right: 0%;
top: 50%;
transform: translateY(-50%);
font-size: 0.4em;
}
Au final, nos slides ont un beau footer !
⚠Les autres fonctionnalités de SliDesk
SliDesk propose de nombreuses fonctionnalitĂ©s, je vous laisserai aller voir par vous-mĂȘmes dans la documentation mais pour finir cet article je vous en prĂ©sente deux trĂšs utiles.
đ Les speaker notes
Je ne me sers pas souvent des speakers notes mais je sais que câest une fonctionnalitĂ© trĂšs utilisĂ©e par de nombreuses personnes. SliDesk permet dâavoir ses speakers notes comme pour les autres outils de crĂ©ation de slides.
Pour avoir ces notes, rien de plus simple : ajouter des commentaires avec le format /* mes notes */
et lancer SliDesk avec lâoption -n
.
Petite subtilitĂ© de SliDesk sur les speakers notes, il est possible dâajouter des informations sur le temps :
- checkpoint :
//@ < 2:00
, ce slide doit ĂȘtre affichĂ© avant 2 minutes sinon lâhorloge sera affichĂ©e en rouge, - duration :
//@ [] 01:00
, le temps Ă passer sur ce slide Pour que cela sâaffiche il faudra lancer SliDesk avec lâoption timer,-t
.
Au final pour lancer SliDesk avec les speakers notes et les informations de temps il faut donc activer les options -n
et -t
.
1
2
3
4
5
6
7
8
9
10
11
12
$ slidesk -nt
____(âą)<
(SliDesk) v 2.4.3
Take the control of your presentation direct from here.
Press Enter to go to the next slide.
Press P + Enter to go to the previous slide.
Press Q to quit the program.
Your speaker view is available on: http://localhost:1337/notes.html
Your presentation is available on: http://localhost:1337
Et ce nâest pas tout ! SliDesk vous permet aussi, avec lâoption -i
couplée avec -d
dâavoir les speakers notes sur un device et les slides sur un autre.
Quelques explications :
-i
permet dâactiver le mode interactif, câest-Ă -dire quâil permet dâafficher la prĂ©sentation sur dâautres devices en plus du vĂŽtre (mais vous restez la / le seulâąe maĂźtre pour passer les slides)-d
permet dâactiver le mode domaine, câest-Ă -dire quâil rend la prĂ©sentation et les speaker notes accessibles sur une IP bien particuliĂšre
Donc si lâon cumule toutes ces options pour afficher les speakers notes, le mode interactif et le domaine cela donne slidesk -nit --domain 192.168.0.12
1
2
3
4
5
6
7
8
9
10
11
12
$ slidesk -nit --domain 192.168.0.12
____(âą)<
(SliDesk) v 2.4.3
Take the control of your presentation direct from here.
Press Enter to go to the next slide.
Press P + Enter to go to the previous slide.
Press Q to quit the program.
Your speaker view is available on: http://192.168.0.12:1337/notes.html
Your presentation is available on: http://192.168.0.12:1337
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
## Stéphane Philippart .[slide-text]
!image(assets/images/prez/whoami.png,, 494, 155, float: right; margin-top: -16vh)
- đ·ïž đ„ DeveloperAdvocate@OVHCloud đŠ
- đ·ïž Co-creator of TADx (Agile, Dev, DevOps meetups in Tours)
- $$title$$
!image(assets/images/prez/tadx.png, tadx, 304, 165, float: right; margin-top: -9vh)
- âïž A Java developer in the cloud âïž
!image(assets/images/prez/ours.png, ours, 437, 414, float: right;)
- đŠ <span class="twitter">@wildagsx</span>
- đ https://philippart-s.github.io/blog
- đ https://github.com/philippart-s/
- đŹ https://www.linkedin.com/in/philippartstephane/
//@ < 2:00
//@ [] 01:00
/*
Slide de présentation.
*/
Lâaffichage des speakers notes est disponible sur une autre route terminant par notes.html
đŽó §ó ąó „ó źó §ó ż Lâinternationnalisation
Lâune des choses, entre autres, qui mâintĂ©ressait dans le fait de coder mes slides Ă©tait la possibilitĂ© dâavoir du code gĂ©nĂ©rique et de ne pas tout rĂ©Ă©crire entre deux confĂ©rences. SliDesk permet dâutiliser des variables dans des configurations pour, par exemple, changer le nom dâune confĂ©rence ou dâautres petits Ă©lĂ©ments de variation.
Dans mon cas, je voulais aussi pouvoir gĂ©rer le cas oĂč jâavais exactement la mĂȘme prĂ©sentation mais dans des langues diffĂ©rentes. La notion de configuration aurait pu convenir mais Sylvain a gentiment dĂ©veloppĂ© un module multilingue encore plus simple Ă utiliser.
Pour lâactiver rien de plus simple :
Créer un fichier JSON par langue, par exemple fr.lang.json
et en.lang.json
.
1
2
3
4
5
6
{
"default": true,
"translations": {
"title": "DĂ©couverte de SliDesk"
}
}
1
2
3
4
5
6
{
"default": false,
"translations": {
"title": "SliDesk discovery"
}
}
Le champ default
permet de savoir quelle langue est utilisée par défaut et les variables (par exemple title
) sâutilisent en les entourant de $$
.
Par exemple, avec title
cela donne $$title$$
.
1
2
3
4
5
6
7
/::
custom_css: assets/css/custom.css
::/
# $$title$$
!include(slides/speaker.sdf)
Ensuite, si vous ne spécifiez pas de langue au démarrage, cela utilise la langue par défaut. Sinon vous pouvez spécifier la langue voulue au démarrage : slidesk -l fr
.
đ Distribution des slides
Pour mettre vos slides Ă disposition des participantâąes, vous avez deux options : impression PDF ou accĂšs via le web en HTTP. On ne va pa se mentir, lâoption impression PDF peut ĂȘtre rĂ©calcitrante (mĂȘme si Sylvain fournit une feuille de style qui fait dĂ©jĂ bien le boulot), la faute au HTML / CSS qui ne rĂ©agit pas toujours comme on veut đ . Si vous ĂȘtes ceinture noire de CSS, je pense que le problĂšme est surmontable ⊠mais ce nâest pas mon cas đ.
Pour lâaccĂšs via HTTP vous avez deux options :
- créer un serveur avec slidesk qui tourne pour servir vos slides
- utiliser une version statique full HTML / JS exportée
Pour des raisons de simplicitĂ© jâai choisi la deuxiĂšme option, dâautant que SliDesk fait lâexport prĂȘt Ă lâemploi pour moi đ.
Pour cela il suffit de rajouter lâoption -s
permettant dâactiver la sauvegarde de vos slides en version statique.
Une fois exĂ©cutĂ©e, vous avez dans votre rĂ©pertoire (que vous positionnez au moment dâactiver la commande) lâensemble des fichiers Ă dĂ©poser dans un serveur HTTP.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ slidesk -s ./build
____(âą)-
(SliDesk) v 2.4.3
đ ./build/LICENSE generated
đ ./build/plugins/footer/footer.html generated
đ ./build/plugins/footer/footer.css generated
đ ./build/assets/css/custom.css generated
đ ./build/assets/images/TADx_HD.jpg generated
đ ./build/assets/images/prez/whoami.png generated
đ ./build/assets/images/prez/tadx.png generated
đ ./build/assets/images/prez/ours.png generated
đ ./build/assets/images/OVHcloud_logo.png generated
đ ./build/index.html generated
đ ./build/slidesk.css generated
đ ./build/slidesk.js generated
đ ./build/favicon.svg generated
Dans mon cas, jâai choisi dâutiliser GitHub Pages pour hĂ©berger et gĂ©rer la version distribuable de mes slides. Voici un exemple de ce que cela donne : https://philippart-s.github.io/talks-slides/jarvis/snowcamp-2024/ et le repository permettant lâhĂ©bergement.
đ En conclusion
Câen est fini de la prĂ©sentation de SliDesk, je pourrai continuer Ă vous dĂ©tailler toutes les options mais lâarticle est dĂ©jĂ bien trop long et je vous laisse aller vous faire une idĂ©e par vous-mĂȘmes en parcourant la documentation et le repository de SliDesk. Encore merci Sylvain, dâavoir fait un outil qui me permet de faire mes slides as code !
Si vous ĂȘtes arrivĂ©s jusque lĂ merci de mâavoir lu et si il y a des coquilles nâhĂ©sitez pas Ă me faire une issue ou PR đ.
Merci Ă ma relectrice, Fanny, qui vous permet de lire cet article sans avoir trop les yeux qui saignent đ.
Vous trouverez lâensemble du code source dans le repository slidesk-discovery.
Comments