From 95b226f6599df1ba343079ea608c8d208e110fe5 Mon Sep 17 00:00:00 2001 From: Alexis Lahouze Date: Sat, 7 Feb 2026 10:51:00 +0100 Subject: [PATCH] =?UTF-8?q?Initialisation=20du=20d=C3=A9p=C3=B4t.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 10 ++ Makefile | 51 ++++++++ README.md | 38 ++++++ docs/Makefile | 27 +++++ filters/Makefile | 16 +++ modele-article.md | 207 +++++++++++++++++++++++++++++++++ reference.odt | Bin 0 -> 13607 bytes src/Blocks.hi | Bin 0 -> 4880 bytes src/Blocks.hs | 126 ++++++++++++++++++++ src/Blocks.o | Bin 0 -> 42664 bytes src/Inlines.hi | Bin 0 -> 4923 bytes src/Inlines.hs | 60 ++++++++++ src/Inlines.o | Bin 0 -> 24536 bytes src/Makefile | 19 +++ src/diamond.hi | Bin 0 -> 4945 bytes src/diamond.hs | 45 +++++++ src/diamond.o | Bin 0 -> 11176 bytes templates/diamond.opendocument | 47 ++++++++ 18 files changed, 646 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 README.md create mode 100644 docs/Makefile create mode 100644 filters/Makefile create mode 100644 modele-article.md create mode 100644 reference.odt create mode 100644 src/Blocks.hi create mode 100644 src/Blocks.hs create mode 100644 src/Blocks.o create mode 100644 src/Inlines.hi create mode 100644 src/Inlines.hs create mode 100644 src/Inlines.o create mode 100644 src/Makefile create mode 100644 src/diamond.hi create mode 100755 src/diamond.hs create mode 100644 src/diamond.o create mode 100644 templates/diamond.opendocument diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..46b1ec7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +tags + +*.odt +!reference.odt + +docs/* +!docs/Makefile + +filters/* +!filters/Makefile diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..6b70ee0 --- /dev/null +++ b/Makefile @@ -0,0 +1,51 @@ +# Nécessaire pour avoir les dépendances dans le répertoire lié à l'article. +.SECONDEXPANSION: + +# Un article par fichier .md. +ARTICLES=$(wildcard *.md) + +# Tâche par défaut. +all: $(patsubst %.md,%.odt,$(ARTICLES)) docs/all +.DEFAULT_GOAL:=all + +# Tâches virtuelles. +.PHONY: all docs/all src/all clean docs/clean filters/clean src/clean filters/diamond + +# Tâches liées à la doc. +docs/clean: + $(MAKE) -C docs clean + +docs/all: + $(MAKE) -C docs all + +# Tâche de nettoyage des sources. +src/clean: + $(MAKE) -C src clean + +# Tâche de génération du filtre. +filters/diamond: + $(MAKE) -C filters diamond + +# Tâche générique pour un article. +ARTICLE_DEPS=$(wildcard $*/*) + +%.odt: %.md filters/diamond reference.odt templates/diamond.opendocument $$(ARTICLE_DEPS) + echo $^ + pandoc \ + $< \ + --data-dir=. \ + --filter=diamond \ + --template=diamond.opendocument \ + --output=$@ + +%.unfiltered.json: %.md $$(ARTICLE_DEPS) + pandoc \ + $< \ + -t json \ + --outpur=$@ + +# Nettoyage. +clean: docs/clean filters/clean src/clean + rm -f $(patsubst %.md,%.odt,$(ARTICLES)) + +# vim: set tw=80 ts=4 sw=4 sts=4 spelllang=fr: diff --git a/README.md b/README.md new file mode 100644 index 0000000..79cf1ba --- /dev/null +++ b/README.md @@ -0,0 +1,38 @@ +# Génération article GLMF avec pandoc + +## Dépendances + +La construction nécessite Haskell et la bibliothèque Pandoc. + +Sous Debian, voici la liste des paquets à installer : + + - haskell + - libghc-pandoc-dev + +## Métadonnées + +Le template utilise les métadonnées suivantes : + + - titre: Titre de l'article + - auteur_nom: Nom de l'auteur + - auteur_description: Description de l'auteur + - editeur_nom: Nom de l'éditeur + - editeur_description: Description de l'éditeur + - chapeau: Chapeau + - mots_cles: Liste de mots clés + +## Construction du document + +Pour construire le document, il faut utiliser la commande : + +``` +pandoc monarticle.md \ + --filter=diamond.hs \ + --template=diamond.opendocument \ + --reference-doc=../guide-auteurs/diamond.ott \ + --output=monarticle.odt +``` + + + + diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..669393f --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,27 @@ + +# Tâche par défaut. +.DEFAULT_GOAL:=all +all: index.html + +.PHONY: all clean + +# Fichiers sources. +HS_FILES=$(wildcard ../src/*.hs) + +# Interfaces. +HI_BASE=$(wildcard /usr/lib/ghc-doc/haddock/ghc/base-*/base.haddock) +HI_PANDOC_TYPES=$(wildcard /usr/lib/ghc-doc/haddock/pandoc-types-*/pandoc-types.haddock) + +# Construction de la documentation. +index.html: ../src/diamond.hs $(HS_FILES) + haddock \ + --read-interface=https://hackage.haskell.org/package/base/docs,$(HI_BASE) \ + --read-interface=https://hackage.haskell.org/package/pandoc-types/docs/,$(HI_PANDOC_TYPES) \ + --source-base=../src \ + --odir . --html $^ + +# Nettoyage. +clean: + rm -f *.html *.css *.js *.json *.png + +# vim: set tw=80 ts=4 sw=4 sts=4 spelllang=fr: diff --git a/filters/Makefile b/filters/Makefile new file mode 100644 index 0000000..458fd14 --- /dev/null +++ b/filters/Makefile @@ -0,0 +1,16 @@ +# Tâche par défaut. +all: diamond +.DEFAULT_GOAL:=all + +# Tâches virtuelles. +.PHONY: all diamond clean + +# Construction du filtre diamond. +diamond: + $(MAKE) -C ../src ../filters/diamond + +# Nettoyage. +clean: + rm -f diamond + +# vim: set tw=80 ts=4 sw=4 sts=4 spelllang=fr: diff --git a/modele-article.md b/modele-article.md new file mode 100644 index 0000000..781879d --- /dev/null +++ b/modele-article.md @@ -0,0 +1,207 @@ +--- +titre: Titre de l'article +auteurs: + - nom: Prénom et Nom + description: Fonction ou métier et/ou contribution à des projets. Adresse e-mail si vous le souhaitez. + - nom: Denis Bodor + description: Chef des rédactions – dbodor@ed-diamond.com +mots_cles_entete: |- + Vous devez lister ici les mots-clés définissant votre article de la manière + suivante, exemple : +mots_cles: + - MALWARE + - PENTEST + - ANALYSE FORENSIQUE + - EXPLOIT + - RÉSEAU + - CYBERCRIMINALITÉ +chapeau: > + Ceci est le chapeau de l'article. Il s'agit d'une courte introduction au + sujet ou à la problématique. Essayez d'être explicite et de donner envie au + lecteur de poursuivre la lecture de l'article. +... +Votre article peut commencer par une introduction (attention, celle-ci ne doit +en principe pas être numérotée). + +Plutôt que de parler des outils les plus fréquemment utilisés, nous nous sommes +en partie concentrés ici sur des outils moins courants, et rarement abordés +dans les colonnes de *MISC* / *GNU/Linux Magazine* / *SysOps Pratique* / +*Hackable* (Attention ! Cet italique est généré par le style de caractère +« italic » et non par l'icône italique de LibreOffice, idem pour le gras) ou des +autres magazines spécialisés. + +# 1. Titre de niveau 1 + +Paragraphe en style « Normal » (et non « Standard » ou « Corps de texte »). +``` +# Ceci est du code +# Une entrée typique de menu.lst +# Le style employé est « code » +title= DEBIAN GNU/Linux 2.6.24 (hdc3 - ext3) +kernel= (hd1,2)/boot/vmlinuz-2.6.24-1-686 root=/dev/hdc3 vga=extended +initusrd (hd1,2)/boot/initrd.img-2.6.24-1-686 +``` + +Paragraphe en « Normal ». On fait ici mention d'un élément de la configuration : +l'étiquette `title` (style de caractère « code_par » pour du code dans du +texte) permet d'ajouter un titre dans les menus de GRUB. La commande +`grub-install` permet l'installation du *bootloader*. Nous pouvons spécifier +le mode graphique à utiliser avec l'option `vga` : + +``` +01: # Une entrée typique de menu.lst +02: title= DEBIAN GNU/Linux 2.6.24 (hdc3 - ext3) +03: kernel= (hd1,2)/boot/vmlinuz-2.6.24-1-686 root=/dev/hdc3 **vga=extended** +04: initrd (hd1,2)/boot/initrd.img-2.6.24-1-686 +``` +Si vous souhaitez faire référence à des lignes de code pour les expliquer, vous +pouvez les numéroter comme dans le code ci-dessus. Pour mettre en avant un +passage du code, utilisez le style « code_em » comme on l’a fait ci-dessus pour +« vga-extended ». + +:::pao +Vous pouvez mentionner de cette manière les éventuelles informations à indiquer +à la rédaction ou au service de mise en page. Cette mention n'apparaîtra pas +dans l'article final. +::: + +Le second thème de ce dossier explore l’audit des applications à la découverte +de failles de sécurité. Il s’ouvre avec un article sur **American Fuzzy Lop** +(Attention, le « gras » est généré par le style de caractère « gras » et non par +l'icône gras de LibreOffice), un outil de fuzzing cherchant à couvrir le maximum +de code du programme audité en analysant son graphe d’exécution. + +:::note +Le texte présent ici, rédigé en style « Note », apparaîtra dans l'article final +dans une boîte spéciale « note ». Vous pourrez ainsi présenter des informations +complémentaires. +::: + +Les indications en style « pragma », comme ci-dessus, doivent toujours être +encadrées de 3 slashs /// … ///. + +Si vous souhaitez une note ayant un titre spécifique, par exemple : +« Attention », il faut utiliser : + +:::attention +Le texte présent ici, rédigé en style « Note », apparaîtra dans l'article final +dans une boîte spéciale « Attention ». Vous pouvez par ce biais donner un titre +à vos encarts de notes. +::: + +Les sessions de commandes interactives sont à utiliser avec le style de +paragraphe « console ». On peut également ici mettre en évidence certaines +parties, grâce au style de caractère « code_em » : + +| $ cat dma +| 2: floppy +| 3: **parport0** # mise en évidence avec **code_em** +| 4: cascade + +Plus d'informations sur nos magazines sur : +(notez l'utilisation du style de caractère « url » et la désactivation de +l'hyperlien). + +Vous pouvez également insérer des listes à puces ou numérotées +dans votre article, comme ceci : + + - item 1 ; + - item 2 ; + - item 3 ; + - etc. + +Notez que nous n'utilisons pas les puces/numérotations automatiques de +LibreOffice. + +De même, les tableaux doivent être présentés le plus simplement possible, le +contenu doit être en style « Normal », par exemple : + +blabla | blabla | blabla +-------+--------+------- +blabla | blabla | blabla + +Les références, à placer entre crochets et à mettre en style « ref_par», doivent +être intégrées dans le discours du texte et leur étiquette sera un nombre OU un +mot-clé. Exemple : + +Vous trouverez tous les sommaires des derniers numéros publiés sur la base +documentaire des Éditions Diamond [^BASEDOC]. + +OU + +Enfin, des infrastructures dédiées sont parfois mises en place pour chacune des +cibles comme l'a décrit cet article [^1]. Vous trouverez également des +informations supplémentaires sur le sujet dans cet ouvrage [^2]. + +C'est seulement lorsqu'une citation apparaît dans le texte qu'elle peut être +développée dans la section « Références » en fin d'article. Dans cette section, +on lui applique alors le style « ref_cible » (voir en bas de l’article). + +N'intégrez pas vos images dans le fichier LibreOffice, mais faites-en mention +avec le style « pragma ». Vous pouvez faire référence à une figure dans le +texte : comme on peut le voir en figure 1... ou encore (voir figure 1). + +![figure_01](nom_article_figure_01.png "Exemple d'écran de démarrage GRUB. Une légende peut être une simple phrase ou même la mention du numéro de figure. Le style utilisé pour une légende.... est « legende ».") + +Lorsqu'on décrit une interface graphique ou texte, il est possible de faire +référence aux menus et options avec le style de caractères « menu ». Exemple : +Cochez l'option [Auto-connexion]{.menu} dans la fenêtre des options qui apparaît via le +menu [Fichier > Préférences]{.menu}. + +Bla blabla bla blabla, bla bla bla blabla. Bla blabla bla blabla, bla bla bla +blabla. Bla blabla bla blabla, bla bla bla blabla. Bla blabla bla blabla, bla +bla bla blabla. Bla blabla bla blabla, bla bla bla blabla. Bla blabla bla +blabla, bla bla bla blabla. Bla blabla bla blabla, bla bla bla blabla. Bla +blabla bla blabla, bla bla bla blabla. + +## 1.1 Titre de niveau 2 + +Bla blabla bla blabla, bla bla bla blabla. Bla blabla bla blabla, bla bla bla +blabla. Bla blabla bla blabla, bla bla bla blabla. Bla blabla bla blabla, bla +bla bla blabla. Bla blabla bla blabla, bla bla bla blabla. Bla blabla bla +blabla, bla bla bla blabla. Bla blabla bla blabla, bla bla bla blabla. Bla +blabla bla blabla, bla bla bla blabla. + +Bla blabla bla blabla, bla bla bla blabla. Bla blabla bla blabla, bla bla bla +blabla. Bla blabla bla blabla, bla bla bla blabla. Bla blabla bla blabla, bla +bla bla blabla. + +### 1.1.1 Titre de niveau 3 + +Bla blabla bla blabla, bla bla bla blabla. Bla blabla bla blabla, bla bla bla +blabla. Bla blabla bla blabla, bla bla bla blabla. Bla blabla bla blabla, bla +bla bla blabla. Bla blabla bla blabla, bla bla bla blabla. Bla blabla bla +blabla, bla bla bla blabla. Bla blabla bla blabla, bla bla bla blabla. Bla +blabla bla blabla, bla bla bla blabla. + +Bla blabla bla blabla, bla bla bla blabla. Bla blabla bla blabla, bla bla bla +blabla. Bla blabla bla blabla, bla bla bla blabla. Bla blabla bla blabla, bla +bla bla blabla. + +#### 1.1.1.1 Titre de niveau 4 + +Bla blabla bla blabla, bla bla bla blabla. Bla blabla bla blabla, bla bla bla +blabla. Bla blabla bla blabla, bla bla bla blabla. Bla blabla bla blabla, bla +bla bla blabla. Bla blabla bla blabla, bla bla bla blabla. Bla blabla bla +blabla, bla bla bla blabla. Bla blabla bla blabla, bla bla bla blabla. Bla +blabla bla blabla, bla bla bla blabla. + +Bla blabla bla blabla, bla bla bla blabla. Bla blabla bla blabla, bla bla bla +blabla. Bla blabla bla blabla, bla bla bla blabla. Bla blabla bla blabla, bla +bla bla blabla. + +# Conclusion + +La conclusion de l'article ne comporte pas de numérotation. + +# Remerciements + +Si vous souhaitez ajouter des remerciements à votre article, cette partie pourra +être ajoutée à cet endroit et présentée de cette manière. + +[^BASEDOC]: Base documentaire des Éditions Diamond : +[https://connect.ed-diamond.com/](https://connect.ed-diamond.com/) +[^1]: P. Nom, « Titre de l'article », *MISC n°118*, novembre-décembre 2021 +[^2]: P. Nom et P. Autre-nom, « Titre livre », éditeur, année + + diff --git a/reference.odt b/reference.odt new file mode 100644 index 0000000000000000000000000000000000000000..0f29ad74e9b6d151b1d4abb403f0dac01e95881f GIT binary patch literal 13607 zcmdUWby!?W^CoV=-5r8U@L)lMySoiKxVyUqcemidg1ZNTyAvFOyR&e=&9&dX-|qgo z^*m>$=Wy!n?rJ$zT`zKy;1K8_ATS^xZq`&9n<%l=Odud2uh+{h5KA*lfP*+;6BbFfhNN zz5x9$xGyEa7i~jEMF)K=BYis~Mqx93OY0X<7faxwhNb;t1Im-s6P$3$saT}YH#@t= zm^>{&YkuZnb)U*n;UpH4R41xEc_)b8{?9La{rhh(YM#`vAV7WN(TD1eQqw~Fs-*Nz z^_;8j^+2}|k(}j2_|W>maqDS6>g4%}9ZZ@bk1ix2#dQuH)AG02uk!uWc6jTJbB%JX z9vz}0{Mk%w?52C~q%53<@#kfDKo3@Zy{|0Kpz)=f^@PxVfV70b!u7TkEG#56B8!*meD;x1-5nOqlUF6hC|8Ieo2a+|!yk7s*AT)VRp9Z@ zr1hPr-uBgXb)M({xQle=KW4TAM<*w1wUX05&UJ+&qUfhr3DW?>R}hdFPzb+;mh;4l zyvE(eUKa-kW=GGe&xG1vBq@ZuEa!k6hL*Fyqx<#I7W1<{@@Hq1OaV;?CbYLuMMH_< zTVNzUVArf^R9&Fv>`^)ipSA8AjzmZkgdUs8;U7LU94Wi``z51MLUqys@-^&HVmGEi z9y#6*8Ewu{tKmb{V7C=QbLKpdN5VD@izfA5`N5=2_u*?Vd62gaa5qtJOpt6{!8W4h zkI`_mO5jOvgC0*%qA@r4~zJ)yi`n zBx}@ij>5Tu)St#bL+*@q;fdr`W7&qqUQYnD+U``JKUK3lO0L?qU+SI(Y?sCgzwFB z*uw9k%T4Ml9{lKRw7GHasy=<@2KdW>ipMb-HQpqGw+G|z(qnNHGlgGW20f4?M`Y(g z<0MDkz8}Vs$NX_3FtZeZ?Zuva&Ng>GaDoSMnq+t^xyhQlPV!yYXRo)u{PtQ{(yp^j zN8&EAn=-hbVQTx~aDZ$mJ%V@}hhUJjN%AvIQuvQ7O>%O$h;!*ux=y3$Y&AJ38N@e#ybN0Io` z=DsDZ*5#7C)D%rUHL3D}i=y@|3s<$cf?)Syb1-}kDa?YEgH-(x=rt?Po*Rx0+IweK z{eT3_6TCx>Vk{+-npYl4ou|+^Z?cfO%o|o3N!48_5~HrD*-mADZ%1Gm#CDE>KPmh* z!X>21UWM0u$~-ZL0O#%e54uliR$yI@Q1Ll@S38ZeBsSAV6=XXxWvWhvJn@5yJCs-U z@orlrhhG!H@hRSFsI$?HzUiNLy!a3sS){=*$u(#CP+o9ZZG2aeLliuCcWEKJre6C;c=fZAa& z1(FyKOK=*QEH+|5=VetREpaqYw6?>oZh#`uuH9S*j;Tw_g&f(Bff!3i)<+SSSk12oegcwxmLFrYHy-KT1ZRaBDp zIsyleCmwpRR%qOxFLnref;Q|uf}K*QP$8;FAm7snLh?-&C)do1WMC7WNCbF-Xji(FxabJImFvcP^Asw2)_db8}dH`rV>3X_m7J$kDvFFuKkV^Z}`cj2eIz#ZLRK+{b8{B zG|f`vZFO^*jg#W1= zMNuDcK>vl0>cFTIk;T!2C`x#u6xB;J`S567x4YBd_$Y9ipw_MYM(LRF%a8ri^UtL1 zIzow9ZnDDkkPFj14Hz>uUp8cxAuB2@&hU!&_fIqzRd0+`k>&%VTSAhV)4$i-P5b-r za)_&@x(~OxuV7s*8CicfYuMR(HtNWdVxidl#C0~;)b{d+(Z1!hNqyaO{H=5J6}zK1 zE$SfFM_3OHAYLucQim&=$~^3f-oud6Wj5_HOp9M84e>IB?;(-wPmqA452(A^qH9bi z*WtWFRjVv5^iu2z$=0}~>t~j&Cqzdpk4SQo&@c<-TR0zId>9BS5RiX&NAUlrJ7RBW zXJ+F-4>WjnNVH|8WxJW+TaQ&CR#mZNOf|Se0b*hyGP&F~@R8i41x^V8U%X`@mT8=- zGan!LX41ZNmLkE8!>Zb7$7hFdS4Dloz+brEq6hBx-brvQUIE$_S6ZRa+Egc%?z@*a zx>Y(+t8hZo+MEe6P@_VcruUI7_EwS9eFK#N5i_d8+4TnNY%+JO5iVjGl|mg% zH6!^!joN7qR`{F<;(!2bkKC=V=Idym355L*uF4_+``O;&B z-)-{CFMhfCyI{YRgsiQM%}gBae)EX!-!Z;;z>Ws`c8vd-X#clb#z5;AU-`djy?V=k zugk{T#?j`r!vDwG9IUN@|GkZ`i{XFNW@l|;2e7yQ@0vvaplN2QZvwDq6f|?N)VHz! z-;MpJkl^h6A%1lDMP;oCLmz1A20In7XK&P**oYv zIQ}2{@=toNwzJW<0s#L@H{f4dW2tXtW(=@*V6ZbX9*!Hf@@GO0IOYiijLdytgoL!C z8f-Mr>R<~}gJe8QMO|r&ic^u#FWJwU+Ncm^S&gbqJJiP?2(K>cRAM!xrWh16{kli{ zzL}x1VDbIJTpcY@D#59_e?b;ald}~Kmu_MpJqJ8+v?iCzCH0&~wuQ8Fn$uPczOOb4 z29_{V(Cl*41D9)L9oAS?-r;9gIfv{0daaZGxjcF&v{9pTDFPQ(X|QIG5$hMCVT5D@dUBDnZ^t2U&FPp-?Fy%e=xw;PZ5$$c#RI#@!}c-%GjNe9s(Z{x-EPI@8uI;}nw4y6ZL12i0gl!WMMy*x0@ajq{@8J)@{hGpy=H31 zxRwmbPk!QB5=-f`n>u1meFN$>pb%SEZt-}7d;T_y}1 z$hIISdK1w%e8OD$7!HNo)TFUHV@>z`=5;O!6kGIRzN~!+$p1E%UYDXhz`?=H%EbP4 zJ`HPX+ONMy^;*@9S$CxMw@>+=oVpp`n9TG8GflE9trF6dRFW?i|K#b;5_Z4{ZNP|m zVSxw2aA;Yflu_3?oXEQz)$J@IkUU*GX{3#_0PQ;|AsTx-0|NBZ-t~ko$Ma362@C2E ziSK!Iol+SRW$5rRZ%^LGC4|)A_+q{5q`?;_rG=+ZQ&Cd-L2bM^OY`NUDtygl1_s5! zUQ?|cO?mv#(AL?|+4>u-^RtwnO@MO;?s)sBcXE?Dqu=5AoYRNS?(T<7&kt+R7Rx52 zfcB3PtXKtU<@j|&?YC9xLw6hTROzPk=|C$B<5`MiyRDS9t?(&{=9T+VXHljVG;9PH zjRih=S2$TJlk})s2jm_53Vbm0n^5dBXz4n2H#?kR zI!82Z9^ij_uJT}9q5zv)P@Zu6aMHR|>Y=*I&`v1hlvSMW?TDztBVLG3w5kR_pO;pb zgM085rLyDLiey2#0$uhBcWqj~=WY61aN52hi!?wk5QghLauTj3>UW6Uxog>sffosYctl?{D}`{U&2Ua7YX@BM6<^Ne=1s0bMvcK36)#wo6M?K zcdck~?d$@1Gw#h&bj&sX^fI&Per(k~9_O1|0|E1Lfwlg-O1PFa);?>`N87|s3{KcA zJ={f zd~S{=wXFP8P1@!wF*55&x?vU3JI%WwO;_SBLZc;C>re_Oz_5;*IzhcP6 z7IGfNi2=F>FFXfh6c((VxgfH+T$2t7{D-2YzlP$mYa$u@kJ5{RfU`$6g*iI;=U1a2 z^T1soz=I;|2+?(2+ysGLjptSU@DqWi6(Gg)1E;Du?~ED;;l2R)P~Rk&@T}2`fzGe= zlonM2`vx$f!d}PHBJ%!do`PIC?FhjD zB_8r1?x)t0X8`$zj}rp~{i;^y`xD(phd}~X|AITP&aFdwP@~(yTSvVI>t|SO5_Q{D zh7YrRIO3XyfS*-X!4+8Ah0~@n#37TAX=;B{Dz=HkmMgkL+Oa?5?i|ca6lGD zvDZ-IW){T`kpn^?Z)}1>GJHznsOcOI_26%n?|hN?(-AnM`rw=bNEV>v4BpBBTjFdb zu5#sz?7{#^v#0QYDbZFXi<*fj>%(69`FFwx+A-+g&-SY&uu-{gD2}hP0B;K?jpFlc zP54?KQ)JXXXRrtyEl25`EljEZ+z3q=%mAd7Iflt4& zy>$4{)E;itYq^Cw^l#>acZ zYVKm*XiD1lT}u;@4{{0p@rrG8cM!jajo)}>)meYrA_1qbuC5B+sSt(>L(}BB&y`of zqxhMNCoA5iQqhMW^wD9DS$kAsBEWg>Yt*Q|>7f{U{4J zIFlb0zkW?Yx=E+iRyVD3l(*<`sjm9!pyKBU9WJ*Sn+=SJSS!(51{~T%P4sQhQSJP2K z)~}UJbNvB?YW6Ez*ufl%X^IK%=ucb}s$NMV;X1W6G51F|&zpXQW_LxMn&5Fwdnola zNm+CH7R-CYU2YHYG(+#SCyKd!0x#!~O}5%62==0L233BR;sLtZ(&$16KeeFUV1nG- z@`qu8XuYwz0?k553-S7hDKNUKVtaQ9SXdQs?k{PmDuVvh%ooNidS+WKpT_~(%vWkH zPOO#0<;ZNpc@YaVJhfb5-~-cKdBOO>cT;@RawXhccY4q+7W0N0)CWpXqH0vAB<8O5 zK|si6v>&jTEmaEMR8Hu{{9nh>+t)a`bAs1>7%xG2BpcO1_PQz_4%Y9TuMavdzH=sP zg5ls!%5|*cV1t;dbczHsS#JHz+n-*lHwbD+vNUrp&O6JJQO76)M9sAO?N;G#O$3!Y zM{6jNOzqnM?Sv(-^nK_!ndbZTj-`BenwqM|-mS-jp#cpFM>zP*eb9r9?jR0gM%q$q zO1GTb?Wm9MA4iAVL0>%*@QWE~wHN1Afc2M0@+gb~3-z0MeCxDQgMGpZ!w&|4!PVW(Yw*(>gj#UYjm1A|qTO zsOR_Z$2PCFvUhL=0)BJv4z(?!2~xnI(>lZ)y<8ca(1^{=cN@<9+Evf?Rmv5zLRYDYW_cSn99K>R zarDnWo5!<|`0wlUj`<%BxvMpLNpytC>FPP@A6i@_Y>osrSao4YNj9x&sl$NGgmLhn z*Y_}Tex5qKOZn7$90Nq#zAY=dac*9ow(4^wdctN&)m`&sR#{@Db-QcBQA|hCpgN)| zORkBfOs9wI=j@ca_Q2PIR37~SCBNI8zvq|DGlE6Eu}E9X9(hFhA{e}mb-on6Pug8G1csLgsSx$d(12BD>wXH@-nEQ?IqWSh(-$Y zSz7at8(@mPZM~3o3B4|k^7rI2?a7rG-*?WLKhw-$*kV+VqIrwZDb9U*{E2zh%c$Bp zaf$1bB69R{A=G9U+>_fGw>oNAB_+Qf5{2Af*W2Q=G36-7$B0%V%cv+-t0e`%#S(jc zTRGwDW;G^{KQRs$MIx}khtoNNW9g8rN;DsRw5>cER9qy>g|`-yqQGf#tj zGeln^+LV_SM5qoE!;jhK<|d}Mckr!2I+cfV9t#{r&+4{Uy5DLnFz4$`ptXEe73ap` z4PnTG_cf74Qog2Y2-Auv529H**GHkwuwI@NM9QKzTGRSm_2_ z;M^yh1GI6<>wNkx^k`^->E5#9`hZlsqD1xe72ZxIK5GyJpFy zx?hu1%(aZVrBk$17OApkIrZ5>SU`D0`IlHJ-3x$W2p{p(CrcF7p@NY1=SdMOcG z@1aXoEc>OTh_E;zd)fMXYRJia~Vlj)8m2*l{$>*B)*@p4;W z2sJyL41sQP{eV|362w5>S=>k+rc6M@D>&{?{e*qzHUCwCiV3e`L9(Y0T8!QvlfH%j zL&6kXA7+*iFsHg*XS%PBT!s%z8Hp_b=8Ig)fJVr^dI@Zb5L721-(}01-(MJKk`(H2 zevG&xjuD$Z0oGT0ngi|0WU~qZf_y?;L4Nz3Nvm9RC5+B#EJ3!~Zzq%bbl!TNe6=Is z&|{3fKd`+WPrAbR$BdYVIZEeGI3lOMxltDMzP*K2WZY*FwcJs)&-Ja}KLO?RlQ8V8 zW_7sBg7^wz(6IX%7}(p2Jke{Xq7z8M8XEEXw#oaB@~VlYAUf!ym{7{7zOiFmG-67s z*|vk^zwwbB2a!n^O}3;|Bal+XPNa_CY)G}A;{an9OJp&ccPyPtu_H(r!ta(-WVhF9 zfPf&Xe#`C_5Xv|g&}Ok~W=rjZ{C4M5_XA>~dS?~|m3ERT!Y7q@ei;33b-CTE9sc*r zca`;m#g@w@t|{=nwB+J%B=y6tX1%_MDU{{rllN+$mchlXwG#Gd3eqCx&4rmGYmGPT zx*g#j9if7kd?UORM3ZWD9c1U+N^|EIKruq&n+>{mMz!8Bhlqk18DyoC7$*rwsw@c1 z0T)FQ(#o0nWN>mG4+~pS$RTj(RVLT}5LdtpjJFuRZS%Wf^Hb}`R?#m(;0ddzlJQj8 zP}xm$O0IslTC3gzv9IN`fDCAib?`$9T}Z=}M=R@=M5js$c$cK_63|Q9|9u!+P!{u` zM%z`9lgEtf7%PIMo!CMPsAh&v!F>@=gjyb67Q4b{Aj0(zMm zEUgz)xsVJD11N72l^J8**9@e24ju6Kl3}`TwWLOGiJz<>)cyC@+W|T~rEhI691!fB ze0~hF+%iWNeLaUKvsQ39Q7O3jma|qGD6jq?*Ey+!Hs0?QL@!ROwK`}zOmt||vhso0 z7eRNEFRk4G-E3%{+CJr7=^i}gC>QRE>g;3+!uo9VH1~%VxOY5T(yoJ=A5%yazeqG$ zf;6CuWnrOCTF_Dghw5~ycTGuM@g=dsT4zS;9&}B5I|8+6rq-Ev* zCnJ8B^xZu1GsG|13McS3$3&d66C3pFuY%yOR_5M4ul3)p2*b5B!Yi{>J>-!?TuIAL zccMV}CLmo&Cs_s_s~Z^~!BQJ+R$Z}clkDi7r`y#7 z-{Te5*Wx_z3u8%WACm#wOh}~JN0$b#X_sWgzV6$aOTBlTn%-=kHh1iPIU>VkozKi8 z;f8X{H5f8#Nl|l$Y*D>lBZlsJg+>xj15RTPglXTJxzc90x#F081m(T;^=za~)^;^P z2Uu^=!YEb9n(?xg;ojH|ez_0BWRyeT#;!mV_M7B6`Pd^1998phU~#R%rU);2JEb|w zi&qF4Sl@uxdr+um`e`#xB?O&4PDyCPkW5}Sp1o9Vya08C_?ABMgend~x3+o2|EkV?0{3vmQ4VBEs5%(2IS5etIa^GQE z|Hp5u$n?sRX%%4%Y)%MN(&R*PZR^~Ek0s@fAQ-^_nBnNn1BvqTby%G$5iYtNzGehs zE+__RUru;tdg)Gb8;#WX21kPGIpxrt&*VV_D$lU3t5K6fhIVgG|BNlnP zot$OQ(oJ{6I~e-Gxy0889QZ2z`1Pr%ryYN{pEuEeV6%rl?pK!#<^ z;6)|2DRyU$=EkXieWaPB zvFAh^=SXh}6vcDkF*frsay>HxxPj62hR6>*&Zr#VRw#%YDsi*G27jK85RBD*gci3$7hz;(fj?a<0xkO&S%{TB{bi9 z-g7y$U>SdnpUZ_g_fAFg4~UGxncoiTGWKxj+I!7DV>2C8s<*E5K2)4EuACgzNU+>i z3u|izVF#TzHd9NQBYvOAVURW9GKR9c&!e_R=<8EzxuWVL=YSVY)W)y+ z)E;8AG(gg8Pj=egjJFf~PCUR&I8%@71`DVYzQd_Iv#MpyT^m{$SfQdzGi1^7X4UrE zi;_2qb+9P5(~CNIE;V$=V+<60HR_wC=rOBudMnFx+|>_Wx+$u|^i!_yl`axzYAs3` zNguAPtX2_VNX&ZpPXNf4tE9@fNK;l^QXIVX9}n1IBsH|QuA~dGzUI{l>?$f-A~O_G z_m-|mL**eY8z$Qa&)O3L)I&>;`58FX6Rssa`-}n$eH*aCCkrESUhz8 zQSMaEEYSjo{aGqvg;M#RH|z3q8|en02VEVAXC6m7J3e-c{(YyWgRG*r!g_{fo@l>u zGhvHa{LEs*`l5D*EOc_fkjy@;*hxurEhhr?Gy3~C+Y2V6F4mW`BWlx7cLDH{C{r?+ zWgv|##PuYa-pz(X5nsPw`d5u-}dGZw~7T-prim@k!k@vS0+GYp@qg`c%3dx*JiD~7wun%nR zYd$t8?Bs2oiEpGWfB)_wsL9)Vcv0O0+sriH;GV}~8-6{uRaerR1LoH*a<3s@m=9Aw zG4eB(pcO{qG2_ELYk$hSwvLfabJV4vyK&TKEev>2o32}K=a006wFXB(gK^rlrUJPh z9eETPGA(hQVEi^P`-~?CYut$YB|!uyf0X-ZlxOA{`fT0jR6Td> zHlzJ|muQmlc*6V%$#HeiBcfH--Hj-%pOyU?jfLn5=`|$xO!skvM+5=MHU1Tn|5L*0 z%}WevXl>>2zf+6D>YCPz?C4&rUyzl6)?wt_)Ts0_RaU0*#E4;i1Xn6!=m4|=vB-Sj z&g!vTywSHrAeW3^D<|^kAvYEw;k$Ywc4~VSVH%p79t1|PSrYv4Rj+nP?12FZaSb_`>^2kd!SBvz3N(Dph z^DnbM!!H}wGCa=_h9`~k9>d&8Hj*7}{kN;yPYm;8>T``AD`My992cljR+g4-Aio+& z2S{*yp`jK8JO&iogDqlOJ)juH+UrS-artz4^y z&;c$rKg#9lqzJXCiAtW%&@Fb6CVb}m9a62b}@I&BC{?dK$DjC zkN8R#HE1lI5~s!b7^~~!8<*z_4(5rWOi!0XSzomWspGWI!(;n%ylUu)tawW>^v*-f zd2*LG>}T}zj)OOBeSTH$s>2{ErDs0_A&fy81(IEuJEfMF7Y^kZxvv(9Ga9_b!q(OT z{c{b(sNEMTtVQJM$QehfL+{l|r%5%KtpzwYF`Jq-6sNZbiu$6HFu-~XYac-y(m%of z$RgPF5=xP4=WsdbdIq1(BScXhQL-6Nd*bu8uh*tAAazZmgJyal7nth%+%Ut(cp+I#My-prN45G{g8X>J>HfLu>|M7G&>CV+V0JWbydXQamhd7fA z!!lF>`^Mo3_BF04(g&heunXb2>eoSo9Z6namefM2dXikQm0EL zFiX}qR~K`-4q*k!B@sDqWj9mhWq3qY0tC#pCF^YOyVMXjyie_>EPp@%YWDNFWy8gn z8YP~pj~7gS-U?$i)_!*OK4GC9Kj_dMrj61bMqd4#)_B*idpJcH4CYErZk}*38rAM;5YLEusj9E96|e zI!dHzUg{3GS*pdEP5W~lzPL;CD%K?$Sd@7isxxo)%V1M3;dm#wp&zl>X^8063K@=m(Y($Y(G{kDBOe`tkX)e1lX)vyMTGZOgi=uf;-8s z-^~5Ih(~#YgW9OAw1PIDC=VRy77CvILP@DU6|6j=nT}y`%z8Vjl&}YS5uL`^k$ezB z)XpXi94j|Wz2%rmz#^wyR4V+8+Y(auoa@q+bBPG1Ptm{5p&OL*YMX@qhfre(?kTPI~%- z&h=Mw{-O1E6q$cO`Gel|?Mjdg+HX_A8`JlfBiekUkB;zA5d)m zLI?YIq*p@NA42y+$oRXB{|7znKVZM+;H&a4j@K(e><=;f2e5yki~YA*@K?)s`~&Ep z$zuQB)4$@}`~%LP$zy-*CWOC|$$s_ZmwEoogZYgQ_q(q3i{tz9PdmTy zsQ#|?=Umla>uW~-D`V!D=CAeh_gvQR)qzOk{Cj5W7s{_z|JgBrP2v0@=`UvdBcbzm zy+6N;UMA(AWR2=CPW;~$|GYQ8zN-EZ3Wk4qamh(SLcKorx{V6GY^fuRufP5mTW=@z literal 0 HcmV?d00001 diff --git a/src/Blocks.hi b/src/Blocks.hi new file mode 100644 index 0000000000000000000000000000000000000000..4d6e44a2ece0a38273e0545193cef1cbdd6c3ea4 GIT binary patch literal 4880 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 literal 0 HcmV?d00001 diff --git a/src/Blocks.hs b/src/Blocks.hs new file mode 100644 index 0000000..bc3a253 --- /dev/null +++ b/src/Blocks.hs @@ -0,0 +1,126 @@ +{- | + Module : Blocks + Description : Ce module contient les fonctions nécessaires au traitement des blocks. +-} +module Blocks (topLvlBlock) where + +import Inlines + +import Data.List +import Data.Maybe +import Data.Text +-- +import Text.Pandoc.Definition +import Text.Pandoc.Builder +import Text.Pandoc.Walk + +-- Construit une structure d'attributs de Div à partir du nom du style. +styleDivAttr :: Maybe String -> Attr +styleDivAttr Nothing = styleDivAttr . Just $ "Normal" +styleDivAttr (Just "") = (pack "", [], []) +styleDivAttr (Just style) = (pack "", [], [(pack "custom-style", pack style)]) + +topLvlBlock :: Block -> Blocks + +-- Traite un block Para (paragraphe). +topLvlBlock (Para inlines) = + divWith + (styleDivAttr Nothing) + (para . mconcat $ inline <$> inlines) + +-- Traite un block Header (titre). +topLvlBlock (Header level attributes inlines) = + headerWith attributes level $ fromList inlines + +-- Transforme un CodeBlock en bloc avec le style "code". +topLvlBlock (CodeBlock _ txt) = + mconcat $ codeBlockLine <$> Data.Text.lines txt + where + codeBlockLine :: Text -> Blocks + codeBlockLine txt = + divWith + (styleDivAttr $ Just "code") + (para . mconcat $ codeEmInline <$> (toList . text $ txt)) + +-- Traite un block Div. +topLvlBlock (Div (identifier, classes, pairs) blocks) + -- Note "PAO" + | pack "pao" `Prelude.elem` classes = + noteBlock + (Just "Début note PAO") + (fromList blocks) + (Just "Fin note PAO") + (Just "Normal") + | pack "note" `Prelude.elem` classes = + noteBlock + (Just $ "Début note") + (fromList blocks) + (Just "Fin note") + (Just "note") + -- Note "Attention" + | Data.List.length classes > 0 = + noteBlock + (Just $ "Début note : " ++ (unpack . toTitle . Data.Text.unwords $ classes)) + (fromList blocks) + (Just "Fin note") + (Just "note") + where + --- Note générique. + noteBlock :: Maybe String -> Blocks -> Maybe String -> Maybe String -> Blocks + noteBlock header blocks footer style = + (pragma . pack $ "/// " ++ fromJust header ++ " ///") + <> (divWith (styleDivAttr style) blocks) + <> (pragma . pack $ "/// " ++ fromJust footer ++ " ///") + -- Block "pragma". + pragma :: Text -> Blocks + pragma txt = + divWith + (styleDivAttr $ Just "pragma") + (para . Text.Pandoc.Builder.singleton $ Str txt) + +-- Transforme un LineBlock avec un seul Div en block avec le style "console". +topLvlBlock (LineBlock inlines) = + divWith + (styleDivAttr $ Just "console") + (mconcat $ lineBlockLine <$> inlines) + where + lineBlockLine :: [Inline] -> Blocks + lineBlockLine inlines = para . mconcat $ codeEmInline <$> inlines + +-- Traite un block BulletList (list à puces). +topLvlBlock (BulletList blocks) = + mconcat $ bulletListItem <$> blocks + where + -- Traite un élément de liste. + -- Note : on traite ici le cas simple. Ça plantera probablement si on met du + -- code ou autre dans un élémente de liste. + bulletListItem :: [Block] -> Blocks + bulletListItem (first:others) = + divWith + (styleDivAttr $ Just "Normal") + (firstBlock first <> fromList others) + where + firstBlock :: Block -> Blocks + firstBlock (Plain inlines) = + para + $ (Text.Pandoc.Builder.singleton . Str $ pack "- ") + <> mconcat (inline <$> inlines) + +-- TODO Alexis Lahouze 2025-09-30 Tables +topLvlBlock (Table attributes caption columns header body footer) = + tableWith attributes caption columns header body footer + +topLvlBlock (Figure attributes caption blocks) = + fromList [Figure attributes caption blocks] + +-- Ignore les blocs HTML bruts. +topLvlBlock (RawBlock (Format format) text) = fromList [] + + +-- Transforme un BlockQuote en bloc avec le style "console" +--diamond (BlockQuote block) = styleBlock block "console" +--topLvlBlock (BlockQuote blocks) = blockQuote . fromList $ blocks + +-- TODO Alexis Lahouze 2025-09-30 Références + +--topLvlBlock block = Text.Pandoc.Builder.singleton block diff --git a/src/Blocks.o b/src/Blocks.o new file mode 100644 index 0000000000000000000000000000000000000000..9c13754750b59026d43a22f6e7b3f83738e179de GIT binary patch literal 42664 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 literal 0 HcmV?d00001 diff --git a/src/Inlines.hi b/src/Inlines.hi new file mode 100644 index 0000000000000000000000000000000000000000..31f9635e9c9b5e6528801fc27a1b4f0469628aba GIT binary patch literal 4923 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 yVSbs%MPdD? Attr +styleSpanAttr Nothing = styleSpanAttr $ Just "" +styleSpanAttr (Just "") = (pack "", [], []) +styleSpanAttr (Just style) = (pack "", [], [(pack "custom-style", pack style)]) + +-- Applique le style ODT à une liste d'Inline. +styleInlines :: Inlines -> Maybe String -> Inlines +-- Intègre la liste d'Inline dans un paragraphe. +styleInlines inlines style = spanWith (styleSpanAttr style) inlines + + +codeEmInline :: Inline -> Inlines +codeEmInline (Emph inlines) = + spanWith (styleSpanAttr $ Just "code_em") $ fromList inlines +codeEmInline (Strong inlines) = + spanWith (styleSpanAttr $ Just "code_em") $ fromList inlines +codeEmInline (Str txt) = + codeEmStr txt + where + codeEmStr :: Text -> Inlines + codeEmStr txt + | isJust strippedSuffix && isJust stripped = + codeEmInline $ Emph [Str . fromJust $ stripped] + | otherwise = text txt + where + strippedSuffix = Data.Text.stripSuffix (pack "**") txt + stripped = Data.Text.stripPrefix (pack "**") $ fromJust strippedSuffix +codeEmInline txt = Text.Pandoc.Builder.singleton txt + +inline :: Inline -> Inlines +inline (Emph inlines) = + spanWith (styleSpanAttr $ Just "italic") $ fromList inlines +inline (Strong inlines) = + spanWith (styleSpanAttr $ Just "gras") $ fromList inlines +inline (Code _ txt) = + spanWith (styleSpanAttr $ Just "code_par") $ text txt +inline (Link _ _ (url, _)) = + spanWith + (styleSpanAttr $ Just "url") + (Text.Pandoc.Builder.singleton $ Str url) + +inline (Span (_, classes, _) inlines) + | Data.List.elem (pack "menu") classes = + spanWith (styleSpanAttr $ Just "menu") $ fromList inlines + +inline inline = Text.Pandoc.Builder.singleton inline diff --git a/src/Inlines.o b/src/Inlines.o new file mode 100644 index 0000000000000000000000000000000000000000..65a570327379d9f638ba90ae686a276e4c15ed18 GIT binary patch literal 24536 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 DfR5`t literal 0 HcmV?d00001 diff --git a/src/Makefile b/src/Makefile new file mode 100644 index 0000000..9e91ec8 --- /dev/null +++ b/src/Makefile @@ -0,0 +1,19 @@ + +# Tâche par défaut. +all: $(FILTERS_DIR)/diamond +.DEFAULT_GOAL:=all + +# Tâches virtuelles. +.PHONY: lean all + +# Construction du filtre diamond. +SRC_FILES=$(wildcard *.hs) + +../filters/diamond: diamond.hs $(SRC_FILES) + ghc -o $@ $< + +# Nettoyage. +clean: + rm -f *.hi *.o + +# vim: set tw=80 ts=4 sw=4 sts=4 spelllang=fr: diff --git a/src/diamond.hi b/src/diamond.hi new file mode 100644 index 0000000000000000000000000000000000000000..694e3d9fdb422f8727c7b50dbe43a1ad7cd18180 GIT binary patch literal 4945 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 literal 0 HcmV?d00001 diff --git a/src/diamond.hs b/src/diamond.hs new file mode 100755 index 0000000..a094ab3 --- /dev/null +++ b/src/diamond.hs @@ -0,0 +1,45 @@ +{-| Main filter module. +-} + +{- | + Module : Main + Copyright : (c) Alexis Lahouze, 2025 +-} + +module Main (main, diamond) where + +import Inlines +import Blocks + +import Data.Map +import Data.Maybe +import Data.Text + +import Text.Pandoc.Builder +import Text.Pandoc.Definition +import Text.Pandoc.JSON +import Text.Pandoc.Walk + +-- | Extract notes from inline. +note :: Inline -> [Block] +note (Note blocks) = Text.Pandoc.Builder.toList . mconcat $ topLvlBlock <$> blocks +note _ = [] + +-- | Extract notes in a Metavalue. +notes :: [Block] -> MetaValue +notes blocks = MetaBlocks $ query Main.note blocks + + +-- | Fonction de base du filtre. +diamond :: Pandoc -> Pandoc + +-- | Par défaut on retourne le block sans transformation. +diamond (Pandoc meta blocks) = + Pandoc + (Meta $ insert (pack "notes") (notes blocks) (unMeta meta)) + (Text.Pandoc.Builder.toList . mconcat $ topLvlBlock <$> blocks) + -- TODO Alexis Lahouze 2025-11-20 Append notes. + +-- | Fonction principale du filtre. +main :: IO () +main = toJSONFilter diamond diff --git a/src/diamond.o b/src/diamond.o new file mode 100644 index 0000000000000000000000000000000000000000..6cf3861bde55796c7e8d92523ad9dd59313a56ee GIT binary patch literal 11176 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 + + + + + + $automatic-styles$ + +$for(header-includes)$ + $header-includes$ +$endfor$ + + +$if(titre)$ +$titre$ +$endif$ +$for(auteurs)$ +$it.nom$ +$if(it.description)$ +$it.description$ +$endif$ +$sep$ +$endfor$ +$if(chapeau)$ + +$chapeau$ + +$endif$ +$if(mots_cles)$ +/// Mots-clés /// +$if(mots_cles_entete)$ +$mots_cles_entete$ +$endif$ +$for(mots_cles)$$mots_cles$$sep$ / $endfor$ +/// Fin Mots-clés /// +$endif$ +$for(include-before)$ +$include-before$ +$endfor$ +$body$ +Références +$for(include-after)$ +$include-after$ +$endfor$ + + +