PROAPPLI OPEN FILE FORMATS Working Draft 0.10

Spécification ouverte des formats texte basés sur Markdown — lisibles dans n'importe quel éditeur, versionnables avec Git, utilisables sans ProAppli. Open specification for Markdown-based text formats — readable in any editor, versionable with Git, usable without ProAppli.

.doc.md .table.md .pres.md
Spécification ouverte — vos données vous appartiennent Open specification — your data belongs to you
AccueilHome › Solutions › PAOFF 0.10 — Formats ouvertsPAOFF 0.10 — Open formats
ProAppli Open File Formats
PAOFF 0.10
StatutStatus
Working Draft — appel à commentaires Working Draft — call for comments
VersionVersion
0.10 — 26 septembre 202626 September 2026
Cette versionThis version
proappli.com/appli/webpages/formats-ouverts.html
ÉditeurEditor
David J. Chemla — Espace Informatique de Vincennes
ImplémentationImplementation
ProAppli Writer, Tabler, Presenter, Organizer (implémentation de référence) ProAppli Writer, Tabler, Presenter, Organizer (reference implementation)
LicenceLicense
CC BY 4.0
CommentairesFeedback
info@netvincennes.fr

RésuméAbstract

§

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.

Statut de ce documentStatus of This Document

§

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.

1.ConformitéConformance

§

Les mots-clés doit, ne doit pas, devrait, ne devrait pas et peut employés dans ce document sont à interpréter au sens de RFC 2119 (respectivement MUST, MUST NOT, SHOULD, SHOULD NOT, MAY).

The keywords must, must not, should, should not and may in this document are to be interpreted as described in RFC 2119.

Exigences généralesGeneral requirements

  • Un fichier PAOFF doit être encodé en UTF-8, sans BOM.
  • Un fichier PAOFF doit rester un document Markdown valide au sens de CommonMark : tout ce que cette spécification ajoute doit se dégrader en contenu Markdown lisible dans un lecteur qui l'ignore.
  • Le front matter, s'il est présent, doit être délimité par une ligne --- en tout début de fichier et une ligne --- de fermeture.
  • Une implémentation doit ignorer silencieusement les clés de front matter qu'elle ne reconnaît pas, et ne doit pas les supprimer lors d'une réécriture du fichier.
  • Une implémentation devrait préserver le contenu qu'elle ne sait pas rendre, plutôt que de l'écarter.
  • L'extension de fichier (.doc.md, .table.md, .pres.md) devrait refléter le type de contenu ; une implémentation peut se fonder sur la clé type du front matter lorsque l'extension est simplement .md.
  • A PAOFF file must be encoded in UTF-8, without BOM.
  • A PAOFF file must remain a valid Markdown document per CommonMark: everything this specification adds must degrade into readable Markdown content in a reader that ignores it.
  • The front matter, when present, must be delimited by a --- line at the very start of the file and a closing --- line.
  • An implementation must silently ignore front matter keys it does not recognise, and must not drop them when rewriting the file.
  • An implementation should preserve content it cannot render, rather than discarding it.
  • The file extension (.doc.md, .table.md, .pres.md) should reflect the content type; an implementation may rely on the front matter type key when the extension is plain .md.
Les blocs d'exemple de ce document sont informatifs. Seules les prescriptions employant les mots-clés ci-dessus sont normatives. The example blocks in this document are informative. Only statements using the keywords above are normative.

2.MotivationRationale

§

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.

3.DocumentDocument

.doc.md Writer §

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

rapport-annuel.doc.mdannual-report.doc.mdDocument
---
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
titletexte librefree textTitre affiché dans l'interfaceTitle shown in the interface
authortexte librefree textAuteur du documentDocument author
dateYYYY-MM-DDDate de création ou de révisionCreation or revision date
typedocument (défaut)(default)Type de renduRendering type
langfr, en…Langue (pour l'IA et la correction)Language (for AI and proofreading)
skipPagesentierinteger, 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 elsetitre en haut, image centrée et agrandie, sans rognageheading on top, image centred and enlarged, never cropped
une image et du textean image and textimage à 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 headingimage en plein cadrefull-frame image
un titre seul, sans imagea heading alone, no imagetitre 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.

cours-hybride.doc.mdhybrid-course.doc.mdDocument + présentationDocument + presentation
---
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 ![texte alternatif](adresse). 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 ![alt text](url). 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:400400 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.

illustrations.doc.mdillustrations.doc.mdDocumentDocument
## Insérer un quiz

![Le menu Insérer, avec ses sept entrées w:70%](https://exemple.com/menu.png)

![Un schéma w:600](https://exemple.com/schema.png)

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.

4.TableauTable

.table.md Tabler §

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

budget-2025.table.mdforecast-budget-2025.table.mdTableauTable
---
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).

quiz-photosynthese.table.mdquiz-photosynthesis.table.mdQuiz interactifInteractive quiz
---
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.

Colonnes non standard, mappées par rôleNon-standard columns, mapped by role
---
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).

faq-tarifs.table.mdfaq-pricing.table.mdFAQ
---
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.

5.Types de colonnesColumn types

§

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.
contacts.table.mdcustomer-contacts.table.mdColonnes typéesTyped columns
---
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=

typeRendu / comportementRendering / behaviour
textTexte libre (défaut)Free text (default)
numberNombre, aligné à droite, trié numériquementNumber, right-aligned, sorted numerically
dateSélecteur de date, format YYYY-MM-DDDate picker, YYYY-MM-DD format
timeHeure au format HH:MMTime in HH:MM format
datetimeDate et heure combinéesCombined date and time
emailLien mailto:, validation de formatmailto: link, format validation
urlLien cliquable, validation d'URLClickable link, URL validation
phoneNuméro de téléphonePhone number
booleanVrai/faux — case à cocher si input=checkboxTrue/false — checkbox when input=checkbox
percentValeur numérique affichée avec %Numeric value displayed with %
currencyMontant avec symbole (€ par défaut, configurable via currency=)Amount with symbol (€ by default, configurable via currency=)
imageURL d'image avec aperçu miniature inlineImage URL with inline thumbnail preview
colorCode couleur hexadécimal avec aperçu visuelHexadecimal colour code with visual swatch
fileChemin ou URL de fichierFile path or URL

5.2 Widgets de saisie — input=Input widgets — input=

input WidgetWidget Propriétés associéesRelated properties
inputChamp texte standard (défaut)Standard text field (default)—
selectListe déroulanteDrop-down listvalues=A,B,C
radioBoutons radio horizontauxHorizontal radio buttonsvalues=A,B,C
checkboxCase à cocher (boolean)Checkbox (boolean)—
textareaZone de texte multiligneMulti-line text area—
formulaFormule calculée (lecture seule)Computed formula (read-only)formula=…
ratingÉtoiles 1–51–5 starsStocké comme numberStored as number

5.3 Autres propriétésOther properties

PropriétéProperty ExempleExample DescriptionDescription
labellabel=Nom complet · label="Code postal"Libellé affiché (guillemets si espace)Displayed label (quoted if it contains a space)
valuesvalues=Actif,Inactif,ArchivéValeurs autorisées pour select ou radioAllowed values for select or radio
aggregationsaggregations=sum,averageCalculs affichés en pied de colonneComputations displayed in the column footer
currencycurrency=$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.

produits.table.mdproducts.table.mdFormulesFormulas
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
MathMathROUND FLOOR CEIL ABS SQRT POWER MOD INT
LogiqueLogicIF AND OR NOT IFERROR ISBLANK ISNUMBER
TexteTextCONCAT LEFT RIGHT MID LEN LOWER UPPER TRIM SUBSTITUTE VALUE TEXT
DateDateTODAY 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.

6.PrésentationPresentation

.pres.md Presenter §

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.

formation-qigong.pres.mdqigong-training.pres.mdPrésentation MarpMarp presentation
---
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
marptrueActive le mode Marp (requis)Enables Marp mode (required)
titletexte librefree textTitre de la présentationPresentation title
themedefault · gaia · uncoverThème Marp appliquéMarp theme applied
paginatetrue / falseNumérotation des slidesSlide numbering
authortexte librefree textAuteur 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.

7.TransclusionTransclusion

§

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.

Directive d'inclusionInclusion directive
![[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.

8.Types de questions quizQuiz question types

§
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.

9.Front matter YAMLYAML front matter

§

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).

Structure généraleGeneral structure
---           # 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...

10.RécapitulatifSummary

§
.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.RéférencesReferences

§

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

12.Journal des versionsChange log

§
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.

13.Citer cette spécificationHow to cite this specification

§

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.

🖥️ Applications desktop🖥️ Desktop apps
Télécharger les apps desktop →Download desktop apps →