@plim/markdown
v0.4.0
Published
Plim markdown: parse Markdown into Plim documents and serialize Plim back to Markdown.
Maintainers
Readme
@plim/markdown
A Markdown parser and serializer for Plim documents. It round-trips between Markdown text and Plim's block tree, understands the built-in block & mark vocabulary, and lets your custom blocks opt into Markdown support. Runtime-agnostic (no DOM) — useful in the browser, on a server, or in a build step.
Install
pnpm add @plim/markdown @plim/coreParse & serialize
import { contentFromMarkdown, parseMarkdown, contentToMarkdown } from '@plim/markdown';
// Variadic line form — convenient for inline-defined initial content.
const doc = contentFromMarkdown(
'# Hello, Plim',
'',
'A **block** editor with `code` and *style*.',
);
// Array form, with custom-block descriptors that implement `fromMarkdown`.
const parsed = parseMarkdown(rawText.split('\n'), { blocks: [calloutBlock] });
// Serialize back; pass the same descriptors so their `toMarkdown` runs.
const md = contentToMarkdown(parsed, { blocks: [calloutBlock] });API
contentFromMarkdown(...lines: string[]): DocumentNode— variadic convenience wrapper aroundparseMarkdown.parseMarkdown(lines: readonly string[], options?: { blocks?: BlockDescriptor[] }): DocumentNode.contentToMarkdown(doc: DocumentNode | BlockNode[], options?: { blocks?: BlockDescriptor[] }): string.
Supported vocabulary
Out of the box it handles the built-in blocks and marks:
- Blocks — paragraphs, headings (
#…######), quotes (>), bulleted / numbered / todo lists, horizontal rules (---), fenced code blocks, and images. - Marks —
**bold**,*italic*,`code`,~strike~,[link](href), and<u>underline</u>.
Custom-block round-tripping
A custom block participates in Markdown by implementing two optional hooks on its descriptor:
fromMarkdown— consulted before the built-in line parser; the first non-null result wins. Use it to claim lines (e.g. a> [!NOTE]callout) and produce aBlockNode.toMarkdown— returns a string or an array of lines for serialization.
Pass the descriptors that implement these hooks to both parseMarkdown and contentToMarkdown via the blocks option, and the round-trip stays lossless for your custom content.
Where to go next
- Document model —
@plim/core(defineBlock,BlockDescriptor,DocumentNode). - HTML output —
@plim/htmlfor SSR / email rendering. - Reference app —
examples/notion-clone.
License
See the LICENSE file in this package.
