Skip to content

Comment fonctionne Markdown

Comprendre le fonctionnement de Markdown peut vous aider à mieux exploiter cet outil puissant. Ce chapitre explique comment Markdown est transformé d'un texte brut en documents joliment formatés.

Flux de travail de base

Le flux de travail Markdown peut se résumer ainsi :

Fichier source Markdown (.md) → Parseur Markdown → Document HTML → Rendu navigateur

1. Rédaction du fichier source Markdown

Vous utilisez n'importe quel éditeur de texte pour créer un fichier .md et écrire du contenu avec la syntaxe Markdown :

markdown
# Mon document

Ceci est un paragraphe **important**.

## Exemple de liste

- Élément 1
- Élément 2
- Élément 3

2. Traitement par le parseur Markdown

Le parseur lit le fichier Markdown, reconnaît les éléments de syntaxe et les convertit en HTML correspondant :

html
<h1>Mon document</h1>
<p>Ceci est un <strong>important</strong> paragraphe.</p>
<h2>Exemple de liste</h2>
<ul>
  <li>Élément 1</li>
  <li>Élément 2</li>
  <li>Élément 3</li>
</ul>

3. Rendu navigateur

Le HTML généré est affiché comme un document formaté dans le navigateur.

Fonctionnement des parseurs

Analyse lexicale

Le parseur effectue d'abord une analyse lexicale, découpant le texte Markdown en jetons (tokens) :

  • # reconnu comme un jeton de titre
  • **texte** reconnu comme un jeton gras
  • - élément reconnu comme un jeton de liste

Analyse syntaxique

Ensuite, il effectue une analyse syntaxique pour construire un arbre de syntaxe abstraite (AST) :

Document
├── Titre (niveau 1) : "Mon document"
├── Paragraphe
│   ├── Texte : "Ceci est un"
│   ├── Gras : "important"
│   └── Texte : "paragraphe."
├── Titre (niveau 2) : "Exemple de liste"
└── Liste non ordonnée
    ├── Élément de liste : "Élément 1"
    ├── Élément de liste : "Élément 2"
    └── Élément de liste : "Élément 3"

Génération HTML

Enfin, l'arbre de syntaxe est parcouru pour générer la sortie HTML correspondante.

Parseurs principaux

CommonMark

  • Spécification standard – Fournit une norme unifiée de parsing Markdown
  • Définition stricte – Élimine les ambiguïtés entre implémentations
  • Large adoption – Adopté par de nombreux parseurs

GitHub Flavored Markdown (GFM)

Basé sur CommonMark, avec des ajouts :

  • Support des tableaux
  • Barré
  • Listes de tâches
  • Détection automatique de liens
  • Blocs de code avec coloration syntaxique

Autres parseurs

ParseurLangageFonctionnalités
markedJavaScriptRapide, léger
markdown-itJavaScriptModulaire, très extensible
Python-MarkdownPythonRiche en fonctionnalités, plugins
kramdownRubySupporte plusieurs formats de sortie
PandocHaskellConvertisseur universel de documents

Moteurs de rendu

Rendu côté client

Parser le Markdown dans le navigateur en temps réel :

javascript
// Avec marked.js
const html = marked.parse('# Bonjour le monde');
document.body.innerHTML = html;

Avantages :

  • Pas de traitement serveur requis
  • Aperçu en temps réel
  • Réduit la charge serveur

Inconvénients :

  • Dépend du JavaScript
  • Pas SEO-friendly
  • Chargement initial plus lent

Rendu côté serveur

Pré-générer le HTML côté serveur :

javascript
// Exemple Node.js
const fs = require('fs');
const marked = require('marked');

const markdown = fs.readFileSync('document.md', 'utf8');
const html = marked.parse(markdown);

Avantages :

  • SEO-friendly
  • Chargement rapide
  • Ne dépend pas du JavaScript côté client

Inconvénients :

  • Charge serveur supplémentaire
  • Gestion du cache plus complexe

Génération de site statique

Pré-générer toutes les pages à la compilation :

bash
# Avec VitePress
npm run build

Avantages :

  • Vitesse de chargement maximale
  • Meilleur SEO
  • Haute sécurité
  • Déploiement facile

Inconvénients :

  • Support limité du contenu dynamique
  • Temps de build plus long

Mécanismes d'extension

Système de plugins

De nombreux parseurs supportent les extensions via plugins :

javascript
// Exemple de plugin markdown-it
const md = require('markdown-it')()
  .use(require('markdown-it-footnote'))
  .use(require('markdown-it-deflist'))
  .use(require('markdown-it-abbr'));

Rendu personnalisé

javascript
// Rendu personnalisé de lien
const renderer = new marked.Renderer();
renderer.link = function(href, title, text) {
  return `<a href="${href}" target="_blank">${text}</a>`;
};

Optimisation des performances

Stratégie de cache

javascript
const cache = new Map();

function parseMarkdown(content) {
  const hash = generateHash(content);
  if (cache.has(hash)) {
    return cache.get(hash);
  }
  
  const result = marked.parse(content);
  cache.set(hash, result);
  return result;
}

Chargement paresseux (lazy loading)

javascript
// Ne parser que le contenu visible
const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      parseAndRender(entry.target);
    }
  });
});

Traitement en streaming

javascript
// Parsing en flux pour les gros fichiers
const fs = require('fs');
const { Transform } = require('stream');

const markdownTransform = new Transform({
  transform(chunk, encoding, callback) {
    const html = marked.parse(chunk.toString());
    callback(null, html);
  }
});

fs.createReadStream('large-document.md')
  .pipe(markdownTransform)
  .pipe(fs.createWriteStream('output.html'));

Problèmes courants

1. Problèmes de saut de ligne

Différents parseurs peuvent gérer les sauts de ligne différemment :

markdown
Ligne 1
Ligne 2        ← Peut être interprété comme le même paragraphe

Ligne 1  
Ligne 2        ← Deux espaces en fin de ligne forcent un saut de ligne

Ligne 1

Ligne 2        ← Ligne vide = nouveau paragraphe

2. Mélange HTML

markdown
Ceci est un mélange de **Markdown** et <em>HTML</em>.

Attention à bien fermer et imbriquer les balises HTML.

3. Échappement des caractères spéciaux

markdown
Vous devez échapper ici les caractères \* et \_.

Scénarios d'application pratiques

1. Systèmes de blog

Articles Markdown → Générateur de site statique → Site web HTML

2. Sites de documentation

Documents .md → VitePress/Docusaurus → Documentation en ligne

3. Fichiers README

README.md → GitHub/GitLab → Page d'accueil du projet

4. Applications de prise de notes

Notes Markdown → Rendu en temps réel → Affichage texte enrichi

Prochaines étapes

Maintenant que vous comprenez comment fonctionne Markdown, vous pouvez :

Build by www.markdownlang.com