Skip to content

Export Markdown

Download the current document as a .md file, or get the markdown string to send to your backend.

Setup

Start with the packages in Getting Started. This complete example registers the feature and renders its UI. In an existing editor, merge the imports and extension entries into your setup, and place the controls inside your existing RichTextProvider.

tsx
'use client';

import { EditorContent, useEditor } from '@tiptap/react';
import { Document } from '@tiptap/extension-document';
import { Paragraph } from '@tiptap/extension-paragraph';
import { Text } from '@tiptap/extension-text';
import { RichTextProvider } from 'reactjs-tiptap-editor';
import { Bold } from 'reactjs-tiptap-editor/bold';
import { Heading } from 'reactjs-tiptap-editor/heading';
import { ExportMarkdown, RichTextExportMarkdown } from 'reactjs-tiptap-editor/exportmarkdown';
import 'reactjs-tiptap-editor/style.css';

const extensions = [Document, Paragraph, Text, Bold, Heading, ExportMarkdown];

export default function ExportMarkdownExample() {
  const editor = useEditor({
    extensions,
    content: '<h1>Title</h1><p>Try this <strong>feature</strong> here.</p>',
    immediatelyRender: false,
  });

  if (!editor) return null;

  return (
    <RichTextProvider editor={editor}>
      <RichTextExportMarkdown />
      <EditorContent editor={editor} />
    </RichTextProvider>
  );
}

How to use

Press the toolbar button to download the document as markdown. The serializer (@tiptap/markdown) is loaded on demand the first time it is used, so it does not affect the initial bundle.

Every node is serialized:

ContentOutput
Headings, paragraphs, bold, italic, strike, code, links, images, listsStandard / GFM markdown
Task lists, tables, blockquotes, code blocks, horizontal rules, highlightGFM markdown
Details (toggle)<details><summary>…</summary>…</details>
CalloutGitHub alert (> [!NOTE], > [!TIP], …)
Table of contents block[TOC]
Katex$formula$
Attachment[file name](url)
Twitter[url](url)
ColumnsColumn contents one after another
Subscript / superscript<sub> / <sup>
Video, iframe, mermaid, excalidraw, drawer and other custom nodesRendered as HTML so nothing is lost

Text styles such as color, font size, font family, alignment and line height are dropped, as markdown has no equivalent.

Use from code

ts
import { getMarkdown } from 'reactjs-tiptap-editor/exportmarkdown';

// download
editor.chain().focus().exportToMarkdown({ fileName: 'notes.md' }).run();

// get the string (e.g. to save on your server)
const markdown = await getMarkdown(editor);

Options

ts
ExportMarkdown.configure({
  // name of the downloaded file
  fileName: 'richtext-export-document.md',
  // indentation for nested lists
  indentation: { style: 'space', size: 2 },
});

Source

SourceDocs

Contributors

No recent changes

Changelog

No recent changes

Made with ❤️