16 minute read

Image sliDesk © Gouz



📜 TL;DR

Projet de slides as code simple, léger et personnalisable.


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.

Slide 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 !

Exemple 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

Exemple speaker notes

đŸŽó §ó ąó „ó źó §ó ż 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.

Exemple multi lingues

🌐 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