Travailler avec Markdown en TypeScript : bibliothèques, parseurs et outils

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction à Markdown et TypeScript

\n

Markdown est un langage de balisage léger, largement utilisé pour formater du texte dans la documentation, les fichiers README, les blogs et les chats. TypeScript, en tant que surcouche fortement typée de JavaScript, permet de créer des applications robustes et évolutives pour le traitement de Markdown. Sur le site pythonlib.ru, nous examinerons les meilleures bibliothèques et outils pour travailler avec Markdown en TypeScript, leurs fonctionnalités et des exemples d'utilisation.

\n\n

Bibliothèques populaires pour le parsing Markdown

\n

Il existe plusieurs solutions matures pour convertir Markdown en HTML ou en d'autres formats. Examinons les trois plus populaires :

\n
    \n
  • marked — un parseur rapide et léger avec prise en charge de la syntaxe GFM (GitHub Flavored Markdown). Il dispose de types intégrés pour TypeScript.
  • \n
  • showdown — un convertisseur universel de Markdown en HTML avec possibilité d'extension et de personnalisation.
  • \n
  • unified (avec le paquet remark) — un écosystème moderne pour le traitement de Markdown basé sur AST (arbre syntaxique abstrait). Il permet non seulement de parser, mais aussi d'analyser, transformer et formater Markdown.
  • \n
\n\n

Installation et configuration

\n

Pour commencer, installez l'une des bibliothèques via npm. Exemple pour marked :

\n
npm install marked\nnpm install @types/marked --save-dev
\n

Pour unified avec remark, plusieurs paquets sont nécessaires :

\n
npm install unified remark-parse remark-html\nnpm install @types/unified @types/remark-parse
\n\n

Exemple : parsing Markdown avec marked

\n

Créons une fonction simple pour convertir une chaîne Markdown en HTML :

\n
import { marked } from 'marked';\n\nfunction renderMarkdown(mdContent: string): string {\n    return marked.parse(mdContent);\n}\n\nconst md = `# Titre\\n\\nCeci est du texte **gras** et _italique_.`;\nconst html = renderMarkdown(md);\nconsole.log(html);\n// Sortie : <h1>Titre</h1>\n// <p>Ceci est du texte <strong>gras</strong> et <em>italique</em>.</p>
\n\n

Travailler avec AST via unified + remark

\n

La bibliothèque unified permet de travailler avec Markdown au niveau de l'arbre. Cela est utile pour analyser la structure du document, extraire les titres ou transformer les liens.

\n
import { unified } from 'unified';\nimport remarkParse from 'remark-parse';\nimport remarkHtml from 'remark-html';\n\nasync function mdToHtml(mdContent: string): Promise<string> {\n    const file = await unified()\n        .use(remarkParse)\n        .use(remarkHtml)\n        .process(mdContent);\n    return String(file);\n}\n\nconst md = `## Deuxième niveau\\n\\nListe :\\n- Élément 1\\n- Élément 2`;\nmdToHtml(md).then(console.log);\n// Sortie : <h2>Deuxième niveau</h2>\n// <p>Liste :</p>\n// <ul>\n// <li>Élément 1</li>\n// <li>Élément 2</li>\n// </ul>
\n\n

Création d'un éditeur Markdown avec coloration syntaxique

\n

Pour un site éducatif, il est utile d'implémenter un éditeur interactif où l'utilisateur écrit du Markdown et voit à droite un aperçu HTML avec coloration syntaxique. Utilisons marked et highlight.js pour la coloration des blocs de code :

\n
import { marked } from 'marked';\nimport hljs from 'highlight.js';\n\n// Configuration de marked pour utiliser highlight.js\nmarked.setOptions({\n    highlight: (code: string, lang: string) => {\n        if (lang && hljs.getLanguage(lang)) {\n            return hljs.highlight(code, { language: lang }).value;\n        }\n        return code; // si la langue n'est pas spécifiée ou introuvable\n    }\n});\n\nfunction previewMarkdown(mdContent: string): string {\n    return marked.parse(mdContent);\n}\n\n// Exemple d'utilisation dans le navigateur (événement input sur textarea)\nconst textarea = document.getElementById('editor'                    

Recommendations