100 % local — vos données ne quittent jamais votre navigateur

Markdown en HTML — à coller dans un gabarit

Transformez du Markdown en HTML : tableaux GFM, cases à cocher, barré et notes de bas de page, prêts pour une page, un gabarit d’e-mail ou un CMS.

Instantané Privé Zéro cookie

Entrée Markdown

Sortie HTML

Ce que fait cet outil

Du Markdown entre, du HTML sort.

# Titre

Du **gras** et un [lien](https://x.dev).
<h1>Titre</h1>
<p>Du <strong>gras</strong> et un <a href="https://x.dev">lien</a>.</p>

Le GitHub Flavored Markdown est actif : tableaux, listes de tâches, barré et liens automatiques sont lus. Un bloc clôturé garde son langage en class="language-js", ce qu’attendent les colorateurs.

Les notes de bas de page, enfin

Ada a écrit le premier algorithme[^1].

[^1]: Sur les notes de Menabrea, 1843.
<p>Ada a écrit le premier algorithme<sup class="footnote-ref"><a href="#fn-1" id="fnref-1">1</a></sup>.</p>
<section class="footnotes">
<ol>
<li id="fn-1"><p>Sur les notes de Menabrea, 1843. <a href="#fnref-1">↩</a></p></li>
</ol>
</section>

marked, la bibliothèque derrière cet outil, n’a pas de règle pour les notes. [^1] était donc lu comme un lien de référence et [^1]: Sur les notes de Menabrea, 1843. comme sa définition : le repère devenait un lien vers une page nommée d’après la note, et le texte de la note n’apparaissait nulle part. C’était un vrai défaut, trouvé en écrivant cette page puis corrigé. Les notes sont numérotées dans l’ordre des repères, et un repère sans note derrière lui reste le texte qu’il est.

Le HTML est le vôtre, et il n’est pas assaini

Un [lien anodin](javascript:alert(1)) et <div onclick="voler()">du HTML brut</div>.

Les deux traversent intacts, et c’est le Markdown qui tient sa promesse : le format autorise le HTML brut, et un convertisseur qui le retirerait mentirait sur votre document. Le résultat, ici, est affiché comme du texte et n’est jamais inséré dans la page.

La conséquence vous revient : si le Markdown vient de quelqu’un d’autre — un commentaire, un ticket, un formulaire — assainissez le HTML avant de le publier. Une bibliothèque comme DOMPurify le fait en un appel, et sa place est là où le HTML est publié, pas ici.

Ce que vous n’obtenez pas

  • Un document. Ni <html>, ni <head>, ni encodage déclaré, ni feuille de style : c’est un fragment à coller dans quelque chose.
  • Des ancres sur les titres. GitHub pose un id sur chaque titre ; c’est une convention d’affichage, pas du Markdown, et les <h2> sortent donc nus.
  • Un <br> à chaque saut de ligne. Un saut simple dans un paragraphe reste une espace, comme le veut la spécification. Deux espaces en fin de ligne, ou une ligne vide, font ce que vous attendez.

Confidentiel par conception

Tout s’exécute localement dans votre navigateur en JavaScript. Vos données ne sont jamais envoyées sur un serveur, ce qui rend l’outil sûr pour des contenus sensibles, et il fonctionne hors ligne.

Questions fréquentes

Le HTML est-il assaini ?
Non, et c’est la règle du Markdown plutôt qu’un oubli : le format autorise le HTML brut, donc un `<script>` ou un `onclick` écrit dans votre Markdown ressort tel quel. Cette page affiche le résultat comme du texte et ne l’insère jamais en elle-même. Si vous convertissez du Markdown qui n’est pas le vôtre pour le publier, passez-le à un assainisseur — un `[lien](javascript:…)` traverse pour la même raison.
Les notes de bas de page fonctionnent-elles ?
Oui, depuis l’écriture de cette page. marked n’a pas de règle pour elles : `[^1]` était lu comme un lien de référence et `[^1]: la note` comme sa définition, si bien que le repère devenait un lien vers une page nommée « la note », et que la note elle-même disparaissait du document. Elles sont maintenant numérotées dans l’ordre des repères et rassemblées en bas, avec un lien de retour, comme chez GitHub.
Qu’est-ce que j’obtiens, exactement ?
Un fragment, pas un document : ni `<html>`, ni `<head>`, ni feuille de style, ni `id` sur les titres. Collez-le dans un gabarit ou un champ de CMS. GFM est actif : tableaux, listes de tâches, barré, liens automatiques et blocs clôturés avec `class="language-…"` passent tous.

Convertisseurs associés