Cette spécification définit PAOFF (ProAppli Open File Formats), une
famille de trois formats de fichiers texte fondés sur Markdown et un front matter YAML :
.doc.md (document), .table.md (tableau de données ou quiz) et
.pres.md (présentation). Elle définit également un mécanisme de
transclusion permettant d'inclure un fichier dans un autre.
This specification defines PAOFF (ProAppli Open File Formats), a family
of three plain-text file formats built on Markdown and a YAML front matter:
.doc.md (document), .table.md (data table or quiz) and
.pres.md (presentation). It also defines a transclusion mechanism
for embedding one file inside another.
L'objectif est qu'un fichier PAOFF reste intégralement lisible, modifiable et
interprétable sans le logiciel qui l'a produit — par un être humain, par un éditeur de
texte quelconque, par un système de gestion de versions ou par un modèle de langage.
The goal is for a PAOFF file to remain fully readable, editable and interpretable
without the software that produced it — by a human being, by any text editor, by a
version control system or by a language model.
Ce document est un Working Draft publié le 26 septembre 2026. Il décrit
l'état des formats tels qu'ils sont effectivement implémentés dans les applications
ProAppli à cette date. Les parties marquées comme non stabilisées peuvent changer sans
préavis avant la version 1.0.
This document is a Working Draft published on 26 September 2026. It
describes the formats as they are actually implemented in the ProAppli applications at
that date. Parts marked as not yet stabilised may change without notice before version 1.0.
Publier ce document en Working Draft est un appel à commentaires : toute
personne souhaitant implémenter ces formats, signaler une ambiguïté ou proposer une
évolution est invitée à écrire à info@netvincennes.fr.
Publishing this document as a Working Draft is a call for comments:
anyone wishing to implement these formats, report an ambiguity or propose a change is
invited to write to info@netvincennes.fr.
Spécification libre, applications propriétaires.
Ce document est publié sous licence CC BY 4.0 :
quiconque peut l'implémenter, le citer ou le redistribuer, y compris à des fins
commerciales, avec attribution. Cette liberté porte sur le format ; le code
source des applications ProAppli reste propriétaire et n'entre pas dans le périmètre
de cette licence.
Free specification, proprietary applications.
This document is published under the CC BY 4.0
license: anyone may implement, cite or redistribute it, including for commercial
purposes, with attribution. That freedom covers the format; the source code of
the ProAppli applications remains proprietary and is outside the scope of this license.
Les formats propriétaires binaires (.docx, .xlsx, .pptx)
ont été conçus pour l'impression dans les années 90. Ils stockent les données dans des
archives ZIP opaques, illisibles sans un logiciel spécifique. Les formats PAOFF sont du
Markdown pur — du texte UTF-8, avec un en-tête YAML optionnel pour les
métadonnées.
Proprietary binary formats (.docx, .xlsx, .pptx)
were designed for printing in the 1990s. They store data in opaque ZIP archives, unreadable
without specific software. PAOFF formats are plain Markdown — UTF-8 text,
with an optional YAML header for metadata.
2.1
Pourquoi le texte brutWhy plain text
Adapté à l'IA
Les modèles de langage (GPT, Claude, Gemini…) traitent du texte. Modifier un
.doc.md par IA est immédiat — l'IA lit, comprend et réécrit directement.
Modifier un .docx nécessite de le décompresser, parser le XML interne,
modifier en aveugle et recompresser — opération fragile, coûteuse et souvent incorrecte.
Le Markdown est le format natif de l'IA.
AI-native
Language models (GPT, Claude, Gemini…) process text. Editing a .doc.md with
AI is immediate — the model reads, understands and rewrites it directly. Editing a
.docx requires unzipping it, parsing the internal XML, editing blindly and
re-zipping — a fragile, expensive and often incorrect operation. Markdown is the native
format of AI.
Adapté à Git
Git est conçu pour versionner du texte : il affiche les différences ligne par ligne,
fusionne les modifications concurrentes, conserve l'historique complet.
Un .docx est un binaire opaque — Git peut le stocker mais ne peut pas
en afficher les différences ni fusionner deux versions. Avec .doc.md,
chaque modification IA ou humaine est traçable, réversible, auditable.
Git-friendly
Git is designed to version text: it shows line-by-line diffs, merges concurrent changes
and keeps a complete history. A .docx is an opaque binary — Git can store it
but cannot diff it or merge two versions. With .doc.md, every change, whether
made by a human or an AI, is traceable, reversible and auditable.
Adapté aux web apps
Une web app charge, affiche et modifie du texte nativement. Pas de conversion,
pas de plugin, pas de binaire à parser. .doc.md s'affiche dans un
<textarea>, se rend via une lib Markdown légère, se sauvegarde
en une ligne de PHP. Un .docx nécessite LibreOffice ou une API payante
pour être lu ou rendu côté serveur.
Web-app-friendly
A web app loads, displays and edits text natively. No conversion, no plugin, no binary to
parse. A .doc.md displays in a <textarea>, renders through
a lightweight Markdown library and saves in one line of PHP. A .docx requires
LibreOffice or a paid API to be read or rendered server-side.
Les fichiers fonctionnent sans ProAppli : lisibles avec VS Code,
Obsidian, Typora, vim, ou cat. Compatibles Git. Archivables à long terme
sans risque d'obsolescence logicielle.
Files work without ProAppli: readable with VS Code, Obsidian,
Typora, vim, or cat. Git-compatible. Suitable for long-term archival with no
risk of software obsolescence.
2.2
Le test de l'affichageThe rendering test
Pour afficher un fichier dans un navigateur ou une web app,
voici ce que chaque format nécessite :
To display a file in a browser or a web app, here is what each format
requires:
| Format |
Pour l'afficher dans un navigateurTo display it in a browser |
VerdictVerdict |
| .doc.md |
Lire le fichier texte → passer par une lib Markdown légère (~50 Ko) → afficher
Read the text file → pass through a lightweight Markdown library (~50 KB) → display
|
✓ Natif webWeb-native |
| .table.md |
Lire le fichier texte → parser le tableau Markdown → afficher
Read the text file → parse the Markdown table → display
|
✓ Natif webWeb-native |
| .pres.md |
Lire le fichier texte → passer par Marp/Reveal.js → afficher
Read the text file → pass through Marp/Reveal.js → display
|
✓ Natif webWeb-native |
| .docx |
Décompresser le ZIP → parser le XML Office Open → convertir en HTML → afficher — ou installer LibreOffice / Microsoft Office / API payante
Unzip the archive → parse the Office Open XML → convert to HTML → display — or install LibreOffice / Microsoft Office / a paid API
|
✗ Conversion obligatoireConversion required |
| .xlsx |
Décompresser le ZIP → parser le XML de classeur → recalculer les formules → convertir → afficher — ou installer LibreOffice / Excel / API payante
Unzip the archive → parse the workbook XML → recompute formulas → convert → display — or install LibreOffice / Excel / a paid API
|
✗ Conversion obligatoireConversion required |
| .pptx |
Décompresser le ZIP → parser le XML de diapositives + thèmes + médias → convertir → afficher — ou installer LibreOffice / PowerPoint / API payante
Unzip the archive → parse slide + theme + media XML → convert → display — or install LibreOffice / PowerPoint / a paid API
|
✗ Conversion obligatoireConversion required |
Des formats du siècle dernier
.docx, .xlsx et .pptx ont été introduits en 2007 comme successeurs des formats
binaires Office 97. Ils ont été conçus pour l'impression, pas pour le web,
pas pour l'IA, pas pour le versioning. Le fait qu'il faille obligatoirement les
convertir pour les afficher dans n'importe quelle application web est la preuve
qu'ils sont architecturalement inadaptés au logiciel moderne.
Le Markdown n'a pas ce problème — il est déjà du texte.
Formats from the previous century
.docx, .xlsx and .pptx were introduced in 2007 as successors to the Office 97 binary
formats. They were designed for printing — not for the web, not for AI, not for
version control. The fact that they must be converted before they can be displayed in any
web application is proof that they are architecturally unsuited to modern
software. Markdown does not have this problem — it is already text.
2.3
Structure communeCommon structure
Les trois formats PAOFF partagent la même structure : un front matter YAML
délimité par ---, suivi du contenu Markdown standard. La clé
type du front matter détermine comment le fichier est interprété.
The three PAOFF formats share the same structure: a YAML front matter
delimited by ---, followed by standard Markdown content. The front matter
type key determines how the file is interpreted.
Document texte enrichi en Markdown, avec prise en charge des inclusions de
tableaux et de quiz via la syntaxe de transclusion (§ 7) et d'une structure
de présentation via des blocs ```slide (§ 3.2).
A rich text document in Markdown, supporting table and quiz inclusions
through the transclusion syntax (§ 7) and a presentation structure through
```slide blocks (§ 3.2).
ExempleExample
---
title: Rapport annuel 2025
author: Marie Dupont
date: 2025-12-01
type: document
---
# Introduction
Le bilan de l'exercice 2025 confirme une croissance de **12 %**.
## Résultats par région
![[resultats-regions.table.md]]
## Évaluation des connaissances
![[quiz-bilan.table.md]]
---
title: Annual Report 2025
author: Jane Smith
date: 2025-12-01
type: document
---
# Introduction
The 2025 fiscal year results confirm **12%** growth.
## Results by Region
![[regional-results.table.md]]
## Knowledge Assessment
![[assessment-quiz.table.md]]
3.1
Front matter — clés reconnuesFront matter — recognised keys
| CléKey |
ValeurValue |
DescriptionDescription |
| title | texte librefree text | Titre affiché dans l'interfaceTitle shown in the interface |
| author | texte librefree text | Auteur du documentDocument author |
| date | YYYY-MM-DD | Date de création ou de révisionCreation or revision date |
| type | document (défaut)(default) | Type de renduRendering type |
| lang | fr, en… | Langue (pour l'IA et la correction)Language (for AI and proofreading) |
| skipPages | entierinteger, 2 (par défaut)(default) | Nombre de pages liminaires laissées sans numéro (page de titre, dédicace, copyright). La numérotation commence à la page suivante.Number of preliminary pages left unnumbered (title page, dedication, copyright). Numbering starts on the following page. |
3.2
Mode hybride — blocs ```slide
Hybrid mode — ```slide blocks
Un .doc.md peut contenir des blocs ```slide ... ``` pour être
utilisé à la fois comme document et comme présentation. Le texte situé hors d'un bloc
```slide doit être ignoré lors du rendu en mode
présentation. Le contenu d'un bloc ```slide n'est pas libre : c'est lui qui
détermine la disposition, automatiquement, d'après ce qu'il contient
(§ 3.2). Un bloc peut donc contenir un titre
##, une liste à puces, des paragraphes, une image, ou seulement un titre
et une image.
A .doc.md file may contain ```slide ... ``` blocks so that it can
serve both as a document and as a presentation. Text outside a ```slide block
must be ignored when rendering in presentation mode. The
content of a ```slide block is not free-form: it determines the layout,
automatically, from what it contains (§ 3.2). A block may
therefore hold a ## heading, a bulleted list, paragraphs, an image, or
nothing but a heading and an image.
3.2.1
Dispositions automatiques d'une diapositive
Automatic slide layouts
Un moteur de rendu doit déterminer la disposition d'une
diapositive à partir de son seul contenu, sans marqueur ni attribut. Quatre
compositions sont définies ; toute autre combinaison de titre, d'image et de texte tombe
sur la composition « image à côté ».
A rendering engine must determine a slide's layout from its
content alone, with no marker and no attribute. Four compositions are defined; any other
combination of heading, image and text falls back to the image-on-the-side layout.
| Contenu du blocBlock content |
DispositionLayout |
un titre ## et une image, rien d'autreone ## heading and one image, nothing else | titre en haut, image centrée et agrandie, sans rognageheading on top, image centred and enlarged, never cropped |
| une image et du textean image and text | image à gauche (30 % de la largeur), texte à droiteimage on the left (30 % of the width), text on the right |
| une image seule, sans titrean image alone, no heading | image en plein cadrefull-frame image |
| un titre seul, sans imagea heading alone, no image | titre centré, en grandcentred heading, large |
Une légende placée sous l'image compte comme du texte : une diapositive « titre + image +
légende » doit donc être composée comme une image à côté. Une
disposition peut aussi être demandée explicitement par l'auteur ; cette forme étant
réservée et non normalisée (§ 3.3.1), un rendu
peut l'ignorer sans erreur et appliquer la déduction.
A caption placed under the image counts as text: a “heading + image + caption” slide
must therefore be laid out as image-on-the-side. An author may
may also request a layout explicitly; since that form is reserved and not standardised
(§ 3.3.1), a renderer may
ignore it without error and apply the deduction.
---
title: Introduction au Markdown
type: document
---
Ce document peut s'ouvrir dans Writer ou être présenté slide par slide.
Ce texte-ci est visible en mode document, ignoré en présentation.
```slide
## Slide 1 — Qu'est-ce que Markdown ?
- Langage de balisage léger créé en 2004
- Devenu le standard du web et de la documentation
```
Markdown est un langage de balisage **léger** créé en 2004 — ce paragraphe reste
dans le document mais n'apparaît pas dans le diaporama.
```slide
## Slide 2 — Pourquoi l'utiliser ?
- Lisible sans outil
- Versionnable avec Git
- Universel
```
---
title: Introduction to Markdown
type: document
---
This document can be opened in Writer or presented slide by slide.
This text is visible in document mode, ignored in presentation mode.
```slide
## Slide 1 — What is Markdown?
- A lightweight markup language created in 2004
- Became the standard for the web and documentation
```
Markdown is a **lightweight** markup language created in 2004 — this paragraph
stays in the document but does not appear in the slideshow.
```slide
## Slide 2 — Why use it?
- Readable without any tool
- Versionable with Git
- Universal
```
Même famille de syntaxe que les blocs ```mermaid : un
bloc de code fenced standard, reconnu nativement par tout éditeur Markdown, sans
collision avec d'autres syntaxes. Les documents créés avant le 22 septembre 2026 avec
l'ancienne syntaxe [SLIDE]...[/SLIDE] restent lisibles : une implémentation
devrait accepter les deux syntaxes en lecture, et
devrait n'écrire que ```slide.
Same syntax family as ```mermaid blocks: a standard
fenced code block, natively recognised by every Markdown editor, with no collision with
other syntaxes. Documents created before 22 September 2026 using the legacy
[SLIDE]...[/SLIDE] syntax remain readable: an implementation
should accept both syntaxes on read, and
should only write ```slide.
3.3
Images et largeur
Images and width
Une image s'écrit . L'adresse
doit être absolue (https://) et
doit désigner l'image elle-même, pas la page qui la contient.
Le texte alternatif doit décrire l'image en une phrase : il
est lu par les lecteurs d'écran et s'affiche si l'image ne se charge pas.
An image is written . The URL
must be absolute (https://) and
must point at the image itself, not at the page containing
it. The alt text must describe the image in one sentence: it
is read by screen readers and shown if the image fails to load.
Une largeur peut être demandée par une directive
w: placée dans le texte alternatif. Elle s'applique dans le corps du document
comme dans une diapositive.
A width may be requested by a w: directive
placed in the alt text. It applies in the document body and in a slide alike.
| ÉcritureWritten as |
SignificationMeaning |
w:50% | 50 % de la largeur du texte — la largeur s'adapte à l'écran50 % of the text width — the width adapts to the screen |
w:400 | 400 pixels — largeur fixe, indépendante de l'écran400 pixels — fixed width, screen-independent |
Un moteur de rendu doit appliquer la largeur demandée,
doit retirer la directive du texte alternatif affiché et
ne doit pas l'afficher comme texte. Une largeur en pourcentage
ne doit jamais être rognée : l'image
doit être réduite pour tenir, jamais coupée. En l'absence de
directive, l'image garde sa taille d'origine.
A rendering engine must apply the requested width,
must strip the directive from the displayed alt text, and
must not show it as text. A percentage width
must never be cropped: the image
must be scaled down to fit, never cut. Without a directive,
the image keeps its intrinsic size.
## Insérer un quiz


3.3.1
Demande explicite de disposition
Explicit layout request
Un moteur de rendu peut prévoir un moyen, pour l'auteur, de
demander une disposition précise plutôt que de la déduire. Cette forme
n'est pas définie par la présente version de la
spécification : elle est réservée. Tant qu'elle n'est pas normalisée, un rendu
doit s'en tenir aux quatre dispositions déduites du
§ 3.2.1, et peut ignorer une
telle demande sans erreur.
A rendering engine may provide a way for the author to request
a specific layout instead of deducing it. This form is
not defined by the present version of the specification: it
is reserved. Until it is standardised, a renderer must stick
to the four layouts deduced in § 3.2.1, and
may ignore such a request without error.
Tableau de données en Markdown standard, accompagné d'un front matter YAML qui type les
colonnes et détermine le comportement du fichier. La clé type bascule entre
un rendu tableur, un quiz interactif et une FAQ.
A data table in standard Markdown, together with a YAML front matter that types the
columns and determines the behaviour of the file. The type key switches
between a spreadsheet rendering, an interactive quiz and a FAQ.
4.1
Tableau de données standardStandard data table
---
title: Budget prévisionnel 2025
type: table
start_date: type=date label="Date de début"
amount: type=currency aggregations=sum label=Montant
status: input=select values=Prévu,Validé,Annulé label=Statut
---
| start_date | amount | status |
|------------|--------|--------|
| 2025-01-01 | 12 000 | Validé |
| 2025-04-01 | 3 500 | Prévu |
---
title: 2025 Forecast Budget
type: table
start_date: type=date label="Start date"
amount: type=currency aggregations=sum label=Amount
status: input=select values=Planned,Approved,Cancelled label=Status
---
| start_date | amount | status |
|------------|--------|----------|
| 2025-01-01 | 12,000 | Approved |
| 2025-04-01 | 3,500 | Planned |
4.2
Quiz — type: quizQuiz — type: quiz
Lorsque le front matter porte type: quiz, le fichier est rendu comme un
widget interactif. Chaque ligne du tableau est une question ; la colonne type
détermine la mécanique de la question (§ 8).
When the front matter carries type: quiz, the file is rendered as an
interactive widget. Each table row is one question; the type column
determines the question mechanic (§ 8).
---
title: Quiz — La photosynthèse
type: quiz
---
| id | type | question | options | answer |
|----|------------------|--------------------------------------|-----------------------------------|-------------|
| q1 | qcm_simple | Quel gaz est produit ? | Azote,Oxygène,CO2,Argon | Oxygène |
| q2 | tri_sequence | Remettre les étapes dans l'ordre | Absorption,Réaction,Libération O2 | Absorption,…|
| q3 | question_ouverte | Rôle de la chlorophylle ? | | |
---
title: Quiz — Photosynthesis
type: quiz
---
| id | type | question | options | answer |
|----|------------------|-------------------------------------|--------------------------------|-------------|
| q1 | qcm_simple | Which gas is produced? | Nitrogen,Oxygen,CO2,Argon | Oxygen |
| q2 | tri_sequence | Put the steps in the right order | Absorption,Reaction,O2 Release | Absorption,…|
| q3 | question_ouverte | What is the role of chlorophyll? | | |
qcm_simple et tri_sequence sont gérés de
façon identique dans les 4 points de contact de l'implémentation de référence : ouverture
directe dans Tabler, vue autonome (bouton « Tester »), lecteur
Presenter, et aperçu Writer (![[quiz.table.md]])
— y compris le glisser-par-clic pour tri_sequence (harmonisé le 2026-09-23).
qcm_simple and tri_sequence are handled
identically across the 4 touch points of the reference implementation: opened directly in
Tabler, the standalone view ("Test" button), the Presenter
reader, and the Writer preview (![[quiz.table.md]]) — including
click-to-reorder for tri_sequence (harmonised 2026-09-23).
🚧 question_ouverte est temporairement
désactivée (2026-09-24) dans tous les points de rendu et de génération : elle
s'affiche comme un avis « désactivé », n'est plus proposée par la génération IA, et n'est
plus comptée dans le score. Raison : la correction d'une réponse libre nécessite une
évaluation par IA dont la conception (mesure de la validité de la réponse) reste à faire.
Le code existant est conservé, commenté, pas supprimé.
🚧 question_ouverte is temporarily
disabled (2026-09-24) across every rendering and generation touch point: it shows
a "disabled" notice, is no longer suggested by AI generation, and no longer counts toward
the score. Reason: grading a free-text answer requires AI evaluation whose design (how to
measure answer validity) is not yet done. The existing code is kept, commented out, not
deleted.
Mapping de colonnes — role=Column mapping — role=
Si les colonnes d'un fichier quiz n'ont pas exactement les noms attendus (import externe,
ordre différent, autre langue), chaque colonne du front matter peut
déclarer role=id, role=type, role=question,
role=options, role=answer ou role=explanation. Sans
mapping explicite, la résolution retombe sur la correspondance par nom littéral (colonnes
id/type/question/options/correcte/explication)
— rétrocompatible, aucun fichier existant à modifier.
If a quiz file's columns don't exactly match the expected names (external import, different
order, another language), each front matter column may declare
role=id, role=type, role=question,
role=options, role=answer or role=explanation. Without
an explicit mapping, resolution falls back to matching by literal column name
(id/type/question/options/correcte/explication)
— backward compatible, no existing file needs changes.
---
title: Quiz — La photosynthèse
type: quiz
qid: role=id
qtype: role=type
libelle: role=question
choix: role=options
bonne_reponse: role=answer
---
---
title: Quiz — Photosynthesis
type: quiz
qid: role=id
qtype: role=type
label: role=question
choices: role=options
right_answer: role=answer
---
4.3
FAQ — type: faqFAQ — type: faq
Lorsque le front matter porte type: faq, le fichier est rendu comme un
accordéon dépliable question/réponse. Chaque ligne est une entrée. Les colonnes attendues
sont question et réponse (les variantes reponse,
answer devraient également être acceptées).
When the front matter carries type: faq, the file is rendered as a
collapsible question/answer accordion. Each row is one entry. The expected columns are
question and answer (the variants réponse and
reponse should also be accepted).
---
title: FAQ — Tarifs
type: faq
---
| question | réponse |
|------------------------------------|--------------------------------------------|
| Puis-je changer de plan à tout moment ? | Oui, sans frais, effet immédiat. |
---
title: FAQ — Pricing
type: faq
---
| question | answer |
|------------------------------------|--------------------------------------------|
| Can I change my plan at any time? | Yes, free of charge, effective immediately. |
Dans l'implémentation de référence, le type faq n'est
interprété qu'à la transclusion dans Writer : ouvert directement dans Tabler, un fichier
type: faq s'affiche comme un tableau classique.
In the reference implementation, the faq type is only
interpreted on transclusion into Writer: opened directly in Tabler, a
type: faq file is displayed as a plain table.
Chaque colonne d'un .table.md peut être annotée
dans le front matter par des propriétés clé=valeur placées sur la même
ligne que le nom technique de la colonne. Ce nom technique doit
correspondre exactement à l'en-tête de colonne du tableau Markdown.
Each column of a .table.md file may be annotated
in the front matter with key=value properties placed on the same line as
the column's technical name. That technical name must match
the Markdown table column header exactly.
Ces types et widgets sont identiques à ceux utilisés dans
les métadonnées des tables SQLite des applications ProAppli (CRM, ERP,
formulaires…). Un tableau .table.md et une table de base de données ProAppli
partagent le même système de typage — ce qui permet des imports/exports directs entre les
deux sans conversion.
These types and widgets are identical to those used in the
SQLite table metadata of the ProAppli applications (CRM, ERP, forms…). A
.table.md table and a ProAppli database table share the same typing system,
which allows direct import/export between the two without conversion.
---
title: Contacts clients
name: label=Nom
email: type=email label=Email
phone: type=phone label=Téléphone
category: input=select values=client,prospect,partenaire label=Catégorie
birthdate: type=date label="Date de naissance"
balance: type=currency aggregations=sum label=Solde
rating: type=number input=rating label=Note
notes: input=textarea label=Notes
active: type=boolean input=checkbox label=Actif
---
---
title: Customer Contacts
name: label=Name
email: type=email label=Email
phone: type=phone label=Phone
category: input=select values=customer,prospect,partner label=Category
birthdate: type=date label="Date of birth"
balance: type=currency aggregations=sum label=Balance
rating: type=number input=rating label=Rating
notes: input=textarea label=Notes
active: type=boolean input=checkbox label=Active
---
5.1
Types de données — type=Data types — type=
| type | Rendu / comportementRendering / behaviour |
| text | Texte libre (défaut)Free text (default) |
| number | Nombre, aligné à droite, trié numériquementNumber, right-aligned, sorted numerically |
| date | Sélecteur de date, format YYYY-MM-DDDate picker, YYYY-MM-DD format |
| time | Heure au format HH:MMTime in HH:MM format |
| datetime | Date et heure combinéesCombined date and time |
| email | Lien mailto:, validation de formatmailto: link, format validation |
| url | Lien cliquable, validation d'URLClickable link, URL validation |
| phone | Numéro de téléphonePhone number |
| boolean | Vrai/faux — case à cocher si input=checkboxTrue/false — checkbox when input=checkbox |
| percent | Valeur numérique affichée avec %Numeric value displayed with % |
| currency | Montant avec symbole (€ par défaut, configurable via currency=)Amount with symbol (€ by default, configurable via currency=) |
| image | URL d'image avec aperçu miniature inlineImage URL with inline thumbnail preview |
| color | Code couleur hexadécimal avec aperçu visuelHexadecimal colour code with visual swatch |
| file | Chemin ou URL de fichierFile path or URL |
5.2
Widgets de saisie — input=Input widgets — input=
| input |
WidgetWidget |
Propriétés associéesRelated properties |
| input | Champ texte standard (défaut)Standard text field (default) | — |
| select | Liste déroulanteDrop-down list | values=A,B,C |
| radio | Boutons radio horizontauxHorizontal radio buttons | values=A,B,C |
| checkbox | Case à cocher (boolean)Checkbox (boolean) | — |
| textarea | Zone de texte multiligneMulti-line text area | — |
| formula | Formule calculée (lecture seule)Computed formula (read-only) | formula=… |
| rating | Étoiles 1–51–5 stars | Stocké comme numberStored as number |
5.3
Autres propriétésOther properties
| PropriétéProperty |
ExempleExample |
DescriptionDescription |
| label | label=Nom complet · label="Code postal" | Libellé affiché (guillemets si espace)Displayed label (quoted if it contains a space) |
| values | values=Actif,Inactif,Archivé | Valeurs autorisées pour select ou radioAllowed values for select or radio |
| aggregations | aggregations=sum,average | Calculs affichés en pied de colonneComputations displayed in the column footer |
| currency | currency=$ | Symbole monétaire pour type=currencyCurrency symbol for type=currency |
5.4
Fonctions — formula=Functions — formula=
Le langage de formules s'inspire d'Excel mais travaille par colonne, pas par
cellule : il n'existe pas de notation A1/B2 ni de plage
A1:B10. Une formule doit référencer une colonne
par son nom technique, et une fonction d'agrégation (SUM,
AVERAGE…) reçoit la colonne entière. Le séparateur d'arguments
doit être le point-virgule ;
(convention Excel FR), et non la virgule.
The formula language is inspired by Excel but works by column, not by cell:
there is no A1/B2 notation and no A1:B10 range. A
formula must reference a column by its technical
name, and an aggregation function (SUM, AVERAGE…)
receives the whole column. The argument separator must be the
semicolon ; (French Excel convention), not the comma.
price_ttc: type=formula formula=ROUND(price_ht*(1+vat/100);2) currency=€
total_ht: type=formula formula=SUM(price_ht) aggregations=sum
statut: type=formula formula=IF(stock>0;"En stock";"Épuisé")
tva_lookup: type=formula formula=VLOOKUP(reference;"taux_tva";reference;taux)
price_gross: type=formula formula=ROUND(price_net*(1+vat/100);2) currency=€
total_net: type=formula formula=SUM(price_net) aggregations=sum
status: type=formula formula=IF(stock>0;"In stock";"Out of stock")
vat_lookup: type=formula formula=VLOOKUP(reference;"vat_rates";reference;rate)
| CatégorieCategory |
FonctionsFunctions |
| Agrégation (colonne entière)Aggregation (whole column) | SUM AVERAGE AVG COUNT COUNTA MIN MAX |
| MathMath | ROUND FLOOR CEIL ABS SQRT POWER MOD INT |
| LogiqueLogic | IF AND OR NOT IFERROR ISBLANK ISNUMBER |
| TexteText | CONCAT LEFT RIGHT MID LEN LOWER UPPER TRIM SUBSTITUTE VALUE TEXT |
| DateDate | TODAY NOW DATE YEAR MONTH DAY DATEDIF DAYS |
| Recherche inter-tableauxCross-table lookup |
LOOKUP(valeur; table; colonne_clé; colonne_résultat) / VLOOKUP (alias)
LOOKUP(value; table; key_column; result_column) / VLOOKUP (alias)
|
VLOOKUP/LOOKUP ne fonctionnent
pas comme dans Excel : pas de plage de cellules ni de numéro de colonne —
on donne un nom de table (un autre .table.md lié) et des
noms de colonnes (colonne_clé, colonne_résultat),
ce qui est cohérent avec le modèle par colonne.
VLOOKUP/LOOKUP do not
behave as in Excel: no cell range and no column index — you pass a table
name (another linked .table.md) and column names
(key_column, result_column), consistent with the column-based
model.
Opérateurs : + - * / % ** ^, comparaisons < > <= >= = == != <>,
logique && ||, concaténation texte &, ternaire ? :.
Le moteur ne doit pas évaluer une formule via eval :
l'implémentation de référence utilise un DSL parsé (tokenizer + AST) sans accès à
window, document ni au réseau.
Operators: + - * / % ** ^, comparisons < > <= >= = == != <>,
logic && ||, text concatenation &, ternary ? :.
An engine must not evaluate a formula through eval:
the reference implementation uses a parsed DSL (tokenizer + AST) with no access to
window, document or the network.
Format de présentation compatible avec Marp — un fichier
.pres.md s'ouvre directement dans VS Code avec l'extension Marp, ou dans tout
outil compatible. Les slides doivent être séparées par une
ligne ---.
A presentation format compatible with Marp — a .pres.md file
opens directly in VS Code with the Marp extension, or in any compatible tool. Slides
must be separated by a --- line.
---
marp: true
title: Introduction au Qigong
theme: default
paginate: true
---
# Introduction au Qigong
Formation certifiante — Niveau 1
---
## Les origines
Le Qigong est une pratique millénaire fondée sur la circulation du **qi**.
---
## Évaluation
![[quiz-qigong-niveau1.table.md]]
---
marp: true
title: Introduction to Qigong
theme: default
paginate: true
---
# Introduction to Qigong
Certified training — Level 1
---
## Origins
Qigong is a millennia-old practice based on the circulation of **qi**.
---
## Assessment
![[qigong-level1-quiz.table.md]]
| CléKey |
ValeurValue |
DescriptionDescription |
| marp | true | Active le mode Marp (requis)Enables Marp mode (required) |
| title | texte librefree text | Titre de la présentationPresentation title |
| theme | default · gaia · uncover | Thème Marp appliquéMarp theme applied |
| paginate | true / false | Numérotation des slidesSlide numbering |
| author | texte librefree text | Auteur affiché dans les métadonnéesAuthor shown in the metadata |
La transclusion ![[fichier.table.md]]
devrait être résolue avant le rendu Marp ; un quiz est alors
injecté comme HTML dans la slide.
The ![[file.table.md]] transclusion
should be resolved before Marp rendering; a quiz is then
injected as HTML into the slide.
La transclusion permet d'inclure un fichier .table.md dans un
document ou une présentation. La syntaxe est inspirée d'Obsidian.
Transclusion allows a .table.md file to be embedded in a document or
a presentation. The syntax is inspired by Obsidian.
![[nom-du-fichier.table.md]]
![[file-name.table.md]]
| type du .table.md inclustype of the included .table.md |
Rendu produitResulting rendering |
| table (défaut)(default) |
Tableau HTML avec en-têtes et lignesHTML table with headers and rows |
| quiz |
Widget quiz interactif avec correction et enregistrement des résultatsInteractive quiz widget with grading and result recording |
| faq |
Accordéon dépliable question/réponseCollapsible question/answer accordion |
Le fichier inclus devrait se trouver
dans le même dossier que le document qui le référence. Si le fichier est
introuvable, l'implémentation ne doit pas échouer : elle
devrait laisser la directive visible ou insérer un
commentaire, sans interrompre le rendu du reste du document.
The included file should reside in the
same folder as the document that references it. If the file cannot be
found, an implementation must not fail: it
should leave the directive visible or insert a comment,
without interrupting the rendering of the rest of the document.
| type (ligne)type (row) |
MécaniqueMechanic |
Colonnes requisesRequired columns |
| qcm_simple |
Choix unique parmi plusieurs options (boutons radio). Une seule réponse correcte.
Single choice among several options (radio buttons). Exactly one correct answer.
|
id · question · options (séparées par des virgules) · correcte
id · question · options (comma-separated) · correcte
|
| tri_sequence |
Glisser-déposer pour remettre des éléments dans le bon ordre. Options mélangées à l'affichage.
Drag and drop to restore the correct order. Options are shuffled on display.
|
id · question · options · correcte (ordre correct)
id · question · options · correcte (correct order)
|
| question_ouverte 🚧 désactivédisabled |
Zone de texte libre. Temporairement désactivée
(2026-09-24) dans tous les rendus — évaluation IA à concevoir. Une ligne de ce type
dans un fichier existant s'affiche comme un avis « désactivé », sans erreur.
Free-text area. Temporarily disabled
(2026-09-24) in every renderer — AI grading design pending. A row of this type in an
existing file is shown as a "disabled" notice, without error.
|
id · question |
La colonne explication peut être présente pour
tout type de question : son contenu est affiché après la réponse.
An explication column may be present for any
question type: its content is displayed after the answer is given.
Tous les formats peuvent comporter un en-tête YAML facultatif
délimité par --- au début du fichier. Un fichier sans front matter
doit rester valide et être rendu avec les valeurs par défaut.
Les clés non reconnues doivent être ignorées silencieusement
et préservées à la réécriture (§ 1).
All formats may carry an optional YAML header delimited by
--- at the start of the file. A file without a front matter
must remain valid and be rendered with default values.
Unrecognised keys must be silently ignored and preserved on
rewrite (§ 1).
--- # délimiteur d'ouverture
clé: valeur
clé2: valeur2
--- # délimiteur de fermeture
Contenu Markdown...
--- # opening delimiter
key: value
key2: value2
--- # closing delimiter
Markdown content...
.doc.md
Document — Writer
- Markdown standardStandard Markdown
- Transclusion
![[]]
- Blocs
```slide hybridesHybrid ```slide blocks
- Largeur d'image
w:NN% ou w:NNImage width w:NN% or w:NN
- Génération IA intégréeBuilt-in AI generation
- Versioning Git
.table.md
Tableau / QuizTable / Quiz — Tabler
- Tableau Markdown standardStandard Markdown table
type: table ouor quiz
- 14 types de colonnescolumn types
- 3 types de questionsquestion types
- Export .xlsx prévuplanned
.pres.md
PrésentationPresentation — Presenter
- Compatible MarpMarp compatible
- Slides séparés parSlides separated by
---
- Transclusion
![[]]
- Thèmes Marp natifsNative Marp themes
- Import .pptx prévuplanned
11.1
Références normativesNormative references
| [RFC2119] |
S. Bradner, Key words for use in RFCs to Indicate Requirement Levels, BCP 14, RFC 2119, 1997.
rfc-editor.org/rfc/rfc2119 |
| [CommonMark] |
J. MacFarlane, CommonMark Spec.
spec.commonmark.org |
| [GFM] |
GitHub Flavored Markdown Spec — extension « tables » utilisée par .table.md"tables" extension used by .table.md.
github.github.com/gfm |
| [YAML] |
YAML Ain't Markup Language (YAML) version 1.2.
yaml.org/spec/1.2.2 |
| [UNICODE] |
F. Yergeau, UTF-8, a transformation format of ISO 10646, STD 63, RFC 3629, 2003.
rfc-editor.org/rfc/rfc3629 |
11.2
Références informativesInformative references
| [Marp] |
Marp — Markdown Presentation Ecosystem — base du format .pres.md — basis of the .pres.md format.
marp.app |
| [Obsidian] |
Obsidian — Internal links — origine de la syntaxe de transclusion ![[…]] — origin of the ![[…]] transclusion syntax.
help.obsidian.md |
| [Mermaid] |
Mermaid — Diagramming and charting tool — blocs ```mermaid, même famille syntaxique que ```slide — ```mermaid blocks, same syntax family as ```slide.
mermaid.js.org |
| [ODF] |
OASIS Open Document Format for Office Applications (OpenDocument) v1.3 — référence de comparaison — comparison reference.
docs.oasis-open.org |
0.10
2026-09-26
Alignement sur l'implémentation de référence après trois jours de
corrections. Ajouts : la largeur d'image, jamais spécifiée, avec ses
deux formes w:NN% (pourcentage) et w:NN (pixels), et la règle
de retrait de la directive du texte alternatif (§ 3.3) ; la clé
skipPages pour les pages liminaires sans numéro (§ 3.1) ; les quatre
dispositions automatiques d'une diapositive (§ 3.2.1). Correction : la
version 0.9 (§ 3.2) affirmait qu'un bloc ```slide ne
devrait contenir qu'un titre et une liste à puces, ce qui
était faux et conduirait un implémenteur à supprimer l'image d'une diapositive. La
disposition d'une diapositive est maintenant définie par son contenu, pas par une syntaxe.
La demande explicite de disposition est réservée, non normalisée (§ 3.3.1).
Alignment with the reference implementation after three days of
corrections. Additions: image width, previously unspecified, with its
two forms w:NN% (percentage) and w:NN (pixels), plus the rule
requiring the directive to be stripped from the alt text (§ 3.3); the
skipPages key for unnumbered preliminary pages (§ 3.1); the four automatic
slide layouts (§ 3.2.1). Correction: version 0.9 (§ 3.2) stated that a
```slide block should contain only a heading
and a bulleted list, which was wrong and would lead an implementer to strip the image
from a slide. A slide's layout is now defined by its content, not by a syntax. The
explicit layout request is reserved and not standardised (§ 3.3.1).
0.9
2026-09-23
Première publication en tant que spécification nommée et versionnée
(PAOFF). Ajout de l'appareil normatif : conformité RFC 2119 (§ 1), références,
licence CC BY 4.0, numérotation des sections. Documentation du type faq
(§ 4.3) et du langage de formules (§ 5.4), jusque-là non spécifiés. Version
bilingue FR/EN.
First publication as a named, versioned specification (PAOFF).
Added the normative apparatus: RFC 2119 conformance (§ 1), references, CC BY 4.0
license, section numbering. Documented the faq type (§ 4.3) and the
formula language (§ 5.4), both previously unspecified. Bilingual FR/EN edition.
antérieurearlier
2026-09-22
Le mode hybride document/présentation passe de
[SLIDE]…[/SLIDE] à un bloc de code ```slide (§ 3.2).
Motif : les crochets entraient en collision avec d'autres syntaxes et nécessitaient un
échappement spécifique. La lecture de l'ancienne syntaxe reste prise en charge.
The hybrid document/presentation mode moved from
[SLIDE]…[/SLIDE] to a ```slide fenced code block (§ 3.2).
Rationale: the brackets collided with other syntaxes and required specific escaping.
Reading the legacy syntax remains supported.
origineorigin
2026-02
Première documentation publique des formats .doc.md,
.table.md et .pres.md, sans numéro de version ni statut
formel.
First public documentation of the .doc.md,
.table.md and .pres.md formats, without a version number or
formal status.
Référence bibliographique recommandée :
Recommended bibliographic reference:
Chemla, David J. ProAppli Open File Formats (PAOFF) 0.10.
Espace Informatique de Vincennes, 2026.
https://proappli.com/appli/webpages/formats-ouverts.html
Ce document est publié sous licence
Creative Commons Attribution 4.0 International.
Vous êtes libre de le partager et de l'adapter, y compris à des fins commerciales, à
condition d'en créditer l'origine.
This document is published under the
Creative Commons Attribution 4.0 International
license. You are free to share and adapt it, including for commercial purposes, provided
you give appropriate credit.