Initialisation du dépôt.

This commit is contained in:
Alexis Lahouze
2026-02-07 10:51:00 +01:00
commit 95b226f659
18 changed files with 646 additions and 0 deletions
+10
View File
@@ -0,0 +1,10 @@
tags
*.odt
!reference.odt
docs/*
!docs/Makefile
filters/*
!filters/Makefile
+51
View File
@@ -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:
+38
View File
@@ -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
```
<!-- vim: set tw=80 ts=4 sw=4 sts=4 spelllang=fr: -->
+27
View File
@@ -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:
+16
View File
@@ -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:
+207
View File
@@ -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 la 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 laudit des applications à la découverte
de failles de sécurité. Il souvre 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 dexé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 : <https://connect.ed-diamond.com/>
(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 larticle).
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
<!-- vim: set tw=80 ts=4 sw=4 sts=4 spelllang=fr:-->
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+126
View File
@@ -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
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+60
View File
@@ -0,0 +1,60 @@
module Inlines
( styleInlines
, codeEmInline
, inline
) where
import Data.List
import Data.Maybe
import Data.Text
import Text.Pandoc.Definition
import Text.Pandoc.Builder
-- Génère une structure d'attributs de Spam à partir du nom du style.
styleSpanAttr :: Maybe String -> 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
BIN
View File
Binary file not shown.
+19
View File
@@ -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:
BIN
View File
Binary file not shown.
Executable
+45
View File
@@ -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
BIN
View File
Binary file not shown.
+47
View File
@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="utf-8" ?>
<office:document-content xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" office:version="1.3">
<office:font-face-decls>
<style:font-face style:name="Courier New" style:font-family-generic="modern" style:font-pitch="fixed" svg:font-family="'Courier New'" />
</office:font-face-decls>
<office:automatic-styles>
$automatic-styles$
</office:automatic-styles>
$for(header-includes)$
$header-includes$
$endfor$
<office:body>
<office:text>
$if(titre)$
<text:p text:style-name="Heading">$titre$</text:p>
$endif$
$for(auteurs)$
<text:p text:style-name="Signature">$it.nom$</text:p>
$if(it.description)$
<text:p text:style-name="Signature">$it.description$</text:p>
$endif$
$sep$<text:p text:style-name="Signature"></text:p>
$endfor$
$if(chapeau)$
<text:p text:style-name="chapeau">
$chapeau$
</text:p>
$endif$
$if(mots_cles)$
<text:p text:style-name="pragma">/// Mots-clés ///</text:p>
$if(mots_cles_entete)$
<text:p text:style-name="Normal">$mots_cles_entete$</text:p>
$endif$
<text:p text:style-name="Normal">$for(mots_cles)$$mots_cles$$sep$ / $endfor$</text:p>
<text:p text:style-name="pragma">/// Fin Mots-clés ///</text:p>
$endif$
$for(include-before)$
$include-before$
$endfor$
$body$
<text:p text:style-name="Heading 1">Références</text:p>
$for(include-after)$
$include-after$
$endfor$
</office:text>
</office:body>
</office:document-content>