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