API Markdown vers HTML#

L'API Markdown vers HTML convertit un fichier Markdown en un document HTML entièrement stylé en une seule requête vers POST /v1/convert/markdown-to-html. Envoyez un fichier .md ou .markdown en multipart form data et recevez une page HTML complète et autonome, avec CSS embarqué, mise en page responsive et bascule de mode sombre intégrée, prête à ouvrir dans n'importe quel navigateur. Le HTML est renvoyé directement par défaut, ou définissez direct_download=false pour des métadonnées JSON avec une URL de téléchargement présignée.


Endpoint#

POST /v1/convert/markdown-to-html

Content-Type : multipart/form-data

Entrée acceptée : fichiers .md ou .markdown (encodés en UTF-8)

Format de sortie : .html (text/html)


Authentification#

Nécessite une clé API privée ou un token JWT obtenu à partir d'une clé publique.

X-API-Key: sk_your_private_key

Ou :

Authorization: Bearer <jwt_token>

Paramètres de requête#

Paramètre Type Obligatoire Défaut Description
file file Oui -- Le fichier .md ou .markdown à convertir. Doit être encodé en UTF-8.
output_filename string Non Nom du fichier d'entrée Nom de fichier de sortie personnalisé. L'extension .html est ajoutée automatiquement.
direct_download boolean Non true À true, renvoie le document HTML directement. À false, renvoie des métadonnées JSON avec une URL de téléchargement présignée.

Règles de conversion#

Le convertisseur utilise Python-Markdown avec les extensions suivantes activées :

Extension Rôle
tables Les tableaux Markdown délimités par des barres verticales sont rendus en éléments HTML <table>
fenced_code Blocs de code à triple backtick avec identifiants de langage (```python)
codehilite Classes CSS de coloration syntaxique sur les blocs de code (via Pygments)
toc Génération d'une table des matières via un marqueur [TOC] dans votre document
attr_list Ajout d'attributs HTML aux éléments avec la syntaxe {.class #id}

Exemple#

Entrée :

# My Document

[TOC]

## Introduction

This is a **bold** and *italic* example.

## Data Table

| Name  | Age | City   |
|-------|-----|--------|
| Alice | 30  | London |
| Bob   | 25  | Paris  |

## Code Sample

```python
def hello():
    print("Hello, world!")
```

Sortie : un document <!DOCTYPE html> complet avec :

  • Le Markdown rendu dans un <body> avec largeur max de 800px et mise en page centrée
  • Tableaux, blocs de code, liens et titres stylés
  • Une table des matières cliquable générée à partir des titres
  • Un bouton de bascule de mode sombre (coin supérieur droit) qui conserve la préférence de l'utilisateur dans localStorage

Style de sortie#

Le HTML généré inclut un bloc <style> embarqué avec :

  • Thèmes clair et sombre via des propriétés CSS personnalisées, basculés par un attribut data-theme
  • Pile de polices système (-apple-system, BlinkMacSystemFont, Segoe UI, Arial, sans-serif)
  • Mise en page responsive avec largeur max de 800px et contenu centré
  • Hauteur de ligne de 1.6 pour la lisibilité
  • Éléments stylés : blocs de code (avec arrière-plan), tableaux (avec bordures et lignes alternées), liens et citations
Note sur la coloration syntaxique : L'extension codehilite ajoute les noms de classes CSS Pygments aux blocs de code, mais aucune feuille de style Pygments n'est embarquée dans la sortie. Les blocs de code auront une structure correcte et un style de base, mais la coloration spécifique au langage nécessite d'ajouter un thème CSS Pygments à la page. Le style intégré fournit dans tous les cas un arrière-plan et une police pour tous les blocs de code.

Réponse#

Téléchargement direct (direct_download=true, par défaut)#

HTTP 200 OK
Content-Type: text/html
Content-Disposition: inline; filename="readme_20260405_123456789.html"

Renvoie le document HTML complet. Comme le Content-Disposition est inline, les navigateurs affichent la page directement.

Réponse avec métadonnées (direct_download=false)#

{
    "presigned_url": "https://spaces.example.com/...",
    "object_key": "env/files/{project_id}/markdown-to-html/readme_20260405_123456789.html",
    "filename": "readme_20260405_123456789.html",
    "file_size": 5678,
    "conversion_time_seconds": 0.04
}

Exemples de code#

Python#

import requests

with open("README.md", "rb") as f:
    response = requests.post(
        "https://api.enconvert.com/v1/convert/markdown-to-html",
        headers={"X-API-Key": "sk_your_private_key"},
        files={"file": ("README.md", f, "text/markdown")}
    )

with open("README.html", "wb") as out:
    out.write(response.content)

Node.js#

const form = new FormData();
form.append("file", fs.createReadStream("README.md"));

const response = await fetch("https://api.enconvert.com/v1/convert/markdown-to-html", {
    method: "POST",
    headers: { "X-API-Key": "sk_your_private_key" },
    body: form
});

const html = await response.text();
fs.writeFileSync("README.html", html);

PHP#

$ch = curl_init("https://api.enconvert.com/v1/convert/markdown-to-html");
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ["X-API-Key: sk_your_private_key"],
    CURLOPT_POSTFIELDS => ["file" => new CURLFile("README.md", "text/markdown")]
]);
$html = curl_exec($ch);
curl_close($ch);
file_put_contents("README.html", $html);

Go#

body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
part, _ := writer.CreateFormFile("file", "README.md")
file, _ := os.Open("README.md")
io.Copy(part, file)
writer.Close()

req, _ := http.NewRequest("POST", "https://api.enconvert.com/v1/convert/markdown-to-html", body)
req.Header.Set("Content-Type", writer.FormDataContentType())
req.Header.Set("X-API-Key", "sk_your_private_key")
resp, _ := http.DefaultClient.Do(req)

JavaScript -- Navigateur (clé publique)#

const tokenRes = await fetch("https://api.enconvert.com/v1/auth/token", {
    method: "POST",
    headers: { "X-API-Key": "pk_your_public_key" }
});
const { token } = await tokenRes.json();

const form = new FormData();
form.append("file", fileInput.files[0]);

const response = await fetch("https://api.enconvert.com/v1/convert/markdown-to-html", {
    method: "POST",
    headers: { "Authorization": `Bearer ${token}` },
    body: form
});

const data = await response.json();
window.open(data.presigned_url, "_blank");

Réponses d'erreur#

Statut Condition
400 Bad Request Le fichier n'est pas un fichier .md ou .markdown
400 Bad Request Encodage Markdown invalide (UTF-8 attendu)
400 Bad Request La conversion Markdown vers HTML a échoué
401 Unauthorized Clé API ou token JWT manquant ou invalide
402 Payment Required Quota mensuel d'ops épuisé
402 Payment Required Limite de stockage atteinte
413 Payload Too Large Le fichier dépasse la taille maximale du plan

Limites#

Limite Valeur
Taille max. de fichier Selon le plan (Founding : 5 MB)
Encodage d'entrée UTF-8 uniquement
Extensions acceptées .md, .markdown
Conversions mensuelles Selon le plan

Questions fréquentes#

Comment rendre du Markdown en HTML avec une API REST ?#

Envoyez une requête POST multipart/form-data vers POST /v1/convert/markdown-to-html avec votre fichier .md ou .markdown dans le champ file, en vous authentifiant via un en-tête X-API-Key ou un token JWT Authorization: Bearer. Par défaut, la réponse est un document HTML complet.

L'API Markdown vers HTML prend-elle en charge les tableaux, les blocs de code et la table des matières ?#

Oui. Le convertisseur utilise Python-Markdown avec les extensions tables, fenced_code, codehilite, toc et attr_list activées. Ajoutez un marqueur [TOC] dans votre document pour générer une table des matières cliquable à partir des titres.

Pourquoi mes blocs de code n'ont-ils pas de coloration syntaxique spécifique au langage ?#

L'extension codehilite ajoute les noms de classes CSS Pygments aux blocs de code, mais aucune feuille de style Pygments n'est embarquée dans la sortie. Ajoutez un thème CSS Pygments à la page pour obtenir la coloration ; le style intégré fournit malgré tout un arrière-plan et une police pour tous les blocs de code.

Puis-je convertir du Markdown en HTML directement depuis le navigateur ?#

Oui. Échangez une clé publique (pk_...) contre un JWT via POST /v1/auth/token, puis appelez l'endpoint avec un en-tête Authorization: Bearer et ouvrez la presigned_url renvoyée.

Le HTML généré inclut-il un mode sombre ?#

Oui. La sortie inclut des thèmes clair et sombre via des propriétés CSS personnalisées, basculés par un attribut data-theme, avec un bouton de bascule qui conserve la préférence de l'utilisateur dans localStorage.