TypeCellOS / TypeCellOS/BlockNote

Add a configurable Markdown link serialization policy

Open
#3,035 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
TypeScript
Stars
10.2k
Forks
772
Avg merge
3d 11h
Merged PRs (30d)
17

Description

What’s broken?

The Markdown exporter does not provide a public option to control how links are serialized.

When a URL-only link is created in BlockNote, blocksToMarkdownLossy may serialize it as a bare URL:

https://example.com

This is valid in GFM, but it loses the explicit distinction between ordinary text and a Markdown link. It also makes it difficult for applications to enforce a consistent Markdown export policy.

What did you expect to happen?

Applications should be able to choose whether links are serialized as:

https://example.com

or explicitly as:

[https://example.com](https://example.com)

For links with a separate label, the explicit format should remain:

[Documentation](https://example.com)

The default behavior should remain unchanged for backward compatibility.

Steps to reproduce
  1. Create a BlockNote editor.
  2. Insert a link where the displayed text is the same as the URL.
  3. Export the document with blocksToMarkdownLossy.
  4. Observe that the result may contain a bare URL instead of explicit Markdown link syntax.

Example:

const markdown = editor.blocksToMarkdownLossy(editor.document);
console.log(markdown);

Observed output:

https://example.com

Desired opt-in output:

[https://example.com](https://example.com)
BlockNote version

v0.54.0

Environment

React application, macOS

Proposed API

One possible API would be an export option:

editor.blocksToMarkdownLossy(editor.document, {
  linkStyle: "explicit",
});

Possible values:

type MarkdownLinkStyle = "auto" | "explicit";

Where:

  • "auto" preserves the current behavior.
  • "explicit" always emits [label](url) for links.
  • Links with different labels continue to emit [label](url).

The option could be exposed through the lower-level Markdown exporter API as well.

Additional context

We initially implemented an application-level HTML-to-Markdown serializer only to change this link behavior. However, that requires duplicating BlockNote’s complete Markdown serialization logic and creates compatibility and maintenance risks when BlockNote changes its exporter.

A public link serialization option or hook would allow applications to customize this behavior without forking the whole serializer.

Contribution

I’d be interested in contributing a fix for this issue.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start at the public blocksToMarkdownLossy entry point and trace into the lower-level Markdown exporter’s link serialization. Verify how URL-only links and separately labelled links are currently emitted. Done means an opt-in explicit style is supported, auto preserves existing output, and both link cases have coverage.

Written by the indexing model from the issue text.

Assessment

Tech stack
react, typescript
Domain
frontend
Issue type
Feature
Difficulty
3/5
Estimated time
1-2 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
68/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.