comark
Comark - Skills Guide
A high-performance markdown parser with Comark (Components in Markdown) support, built on markdown-it, offering both string-based and streaming APIs.
Overview
Comark extends standard markdown with a powerful component system while maintaining full compatibility with CommonMark and GitHub Flavored Markdown. It provides:
- π High-performance parsing with markdown-it engine
- π¦ Streaming support with buffered and incremental modes
- β‘ Real-time rendering with auto-close for incomplete syntax
- π§ Comark component syntax for custom components
- π¨ Vue, React & Svelte renderers with custom component mapping
- π YAML frontmatter support
- π Automatic TOC generation
- π― Full TypeScript support
- π Syntax highlighting with Shiki integration
Package Information
- Package Name:
comark - Installation:
npm install comarkorpnpm add comark - Exports:
- Main parser:
comark - Vue components:
@comark/vue - React components:
@comark/react - Svelte components:
@comark/svelte - HTML rendering:
@comark/html - ANSI terminal rendering:
@comark/ansi - Nuxt module:
@comark/nuxt
- Main parser:
Quick Start
Basic Usage
import { parse } from 'comark'
const content = `---
title: Hello World
---
# Hello World
This is **markdown** with :icon component.
::alert{type="info"}
Important message
::
`
const result = await parse(content)
console.log(result.nodes) // Comark AST
console.log(result.frontmatter) // { title: 'Hello World' }
console.log(result.meta) // Additional metadata
Vue Rendering
<template>
<Comark :markdown="content" />
</template>
<script setup lang="ts">
import { Comark } from '@comark/vue'
const content = `# Hello World`
</script>
React Rendering
import { Comark } from '@comark/react'
export default function App() {
return <Comark markdown={content} />
}
Svelte Rendering
<script lang="ts">
import { Comark } from '@comark/svelte'
const content = `# Hello World`
</script>
<Comark markdown={content} />
Documentation Sections
This guide is organized into focused sections covering different aspects of the package:
π 1. Markdown Syntax
Learn how to write Comark documents with complete syntax reference:
- Standard Markdown: headings, text formatting, lists, links, images, blockquotes
- Frontmatter: YAML metadata with special fields (title, depth, searchDepth)
- Comark Components: block components (
::component), inline components (:component), properties, slots, nesting - Attributes: custom attributes on native markdown elements using
{...}syntax - Code Blocks: language specification, filename metadata, line highlighting, special characters
- Task Lists: GFM-style checkboxes with
[x]and[ ]syntax - Tables: GFM tables with alignment and inline markdown support
β Read Full Markdown Syntax Guide
π§ 2. Parsing & AST Generation
Complete guide for parsing documents and working with AST:
- String Parsing:
parse()function with options (autoUnwrap, autoClose) - Async Parsing:
parse()with Shiki syntax highlighting - AST Structure: Comark AST format - lightweight array-based AST
- Rendering AST: convert to HTML (
renderHTMLvia@comark/html) or markdown (renderMarkdownviacomark/render) - Auto-close: automatic closing of unclosed syntax
- Auto-unwrap: remove unnecessary paragraph wrappers from container components
β Read Full Parsing & AST Guide
βοΈ 3. Vue Rendering
Comprehensive guide for rendering in Vue applications:
- Basic Usage:
Comarkcomponent setup - Custom Components: mapping custom Vue components to Comark elements
- Dynamic Loading:
componentsManifestfor lazy-loaded components - Slots Support: named slots with
#slot-namesyntax - Streaming Mode: real-time rendering with reactive content
- Prose Components: pre-built styled components for standard elements
- Error Handling: built-in error capture for streaming scenarios
- Props Access: accessing
__nodeand parsed properties
β Read Full Vue Rendering Guide
βοΈ 4. React Rendering
Comprehensive guide for rendering in React applications:
- Basic Usage:
Comarkcomponent setup - Custom Components: mapping custom React components to Comark elements
- Dynamic Loading:
componentsManifestfor lazy-loaded components - Props Conversion: automatic HTML attribute conversion (
classβclassName, etc.) - Streaming Mode: real-time rendering with reactive content
- Prose Components: pre-built styled components for standard elements
- Custom Props: accessing parsed properties and
__node - CSS Class Name: custom wrapper classes and Tailwind CSS integration
β Read Full React Rendering Guide
π‘ 5. Svelte Rendering
Comprehensive guide for rendering in Svelte 5 applications:
- Basic Usage:
Comarkcomponent setup with$state - Custom Components: mapping custom Svelte components to Comark elements
- Dynamic Loading:
componentsManifestfor lazy-loaded components - Props Mapping: attribute-to-prop conversion (close to HTML semantics)
- Streaming Mode: real-time rendering with reactive
$state - Experimental Async:
ComarkAsyncwith<svelte:boundary> - Prose Components:
Proseprefix for overriding native HTML elements
β Read Full Svelte Rendering Guide
π€ 6. Using with AI Agents
Guide for integrating Comark in AI agent and LLM streaming workflows:
- Streaming from LLMs: rendering incremental AI output in real time
- Auto-Close: handling incomplete syntax from partial LLM tokens
- Caret Indicator: showing a live cursor during generation
- Framework Examples: Vue, React, Svelte streaming patterns
- ANSI for CLIs: rendering AI output in terminal agents
Key Features Deep Dive
Comark Component Syntax
Comark extends markdown with custom components while preserving readability:
<!-- Block Component -->
::alert{type="warning" .important}
This is a **warning** message with markdown support.
::
<!-- Inline Component -->
Check out this :icon-star{.text-yellow} component.
<!-- Component with Slots -->
::card
#header
## Title
#content
Main content
#footer
Footer
::
Comark AST Format
Lightweight array-based structure for efficient processing:
interface ComarkTree {
nodes: [
["h1", { "id": "hello" }, "Hello"],
["p", {}, "Text with ", ["strong", {}, "bold"], " word"],
["alert", { "type": "info" }, "Message"]
],
frontmatter: {},
meta: {}
}
Common Use Cases
1. Static Site Generator
import { parse } from 'comark'
import { renderHTML } from '@comark/html'
import highlight from '@comark/html/plugins/highlight'
async function processMarkdownFile(filePath: string) {
const content = await readFile(filePath, 'utf-8')
const tree = await parse(content, {
plugins: [
highlight({
themes: { light: 'github-dark', dark: 'github-dark' },
}),
],
})
return {
html: renderHTML(tree),
frontmatter: tree.frontmatter,
toc: tree.meta.toc
}
}
2. Real-time Markdown Editor
import { useState } from 'react'
import { Comark } from '@comark/react'
export default function Editor() {
const [content, setContent] = useState('# Hello')
return (
<div className="split-editor">
<textarea value={content} onChange={e => setContent(e.target.value)} />
<Comark markdown={content} />
</div>
)
}
3. Batch File Processing
import { readFile } from 'node:fs/promises'
import { parse } from 'comark'
async function processMultipleFiles(files: string[]) {
const results = await Promise.all(
files.map(async (file) => {
const content = await readFile(file, 'utf-8')
return await parse(content)
})
)
results.forEach((result, i) => {
console.log(`File ${files[i]}:`)
console.log(` - ${result.nodes.length} nodes`)
})
}
4. Documentation Platform
<template>
<article class="prose">
<Comark :markdown="markdownContent" :components="docComponents" />
</article>
</template>
<script setup lang="ts">
import { Comark } from '@comark/vue'
import { docComponents } from './components'
</script>
API Reference Summary
Core Functions (comark)
// Asynchronous parsing
parse(source: string, options?: ParseOptions): Promise<ComarkTree>
// Auto-close unclosed syntax
autoCloseMarkdown(source: string): string
HTML Rendering Functions (@comark/html)
// Render markdown to HTML string (parse + render in one step)
render(markdown: string, options?: RenderOptions): Promise<string>
// Render a pre-parsed tree to HTML
renderHTML(tree: ComarkTree, options?: RenderOptions): Promise<string>
// Create a reusable render function with shared parser instance
createRender(options?: ParseOptions & RenderOptions): (markdown: string) => Promise<string>
Vue Components (@comark/vue)
<Comark :markdown="markdownString" :components="customComponents" />
React Components (@comark/react)
<Comark markdown={markdownString} components={customComponents} />
Svelte Components (@comark/svelte)
<Comark markdown={markdownString} components={customComponents} />
Performance Characteristics
- Comark AST format - lightweight array-based AST
- Lazy component loading - only load what's needed
- Shiki highlighter caching - avoid re-initialization
- Parallel processing - batch parse multiple files efficiently
TypeScript Support
Full TypeScript definitions included:
import type {
ComarkTree,
ComarkNode,
ParseOptions,
} from 'comark'
Architecture Overview
βββββββββββββββββββββββββββββββββββββββββββ
β Markdown Input (String) β
ββββββββββββββββββ¬βββββββββββββββββββββββββ
β
ββββββββββΌβββββββββ
β Auto-close β (Optional)
β Unclosed β
β Syntax β
ββββββββββ¬βββββββββ
β
ββββββββββΌβββββββββ
β Parse β
β Frontmatter β (YAML)
ββββββββββ¬βββββββββ
β
ββββββββββΌβββββββββ
β MarkdownIt β
β + Plugins β (Comark, Tasks)
ββββββββββ¬βββββββββ
β
ββββββββββΌβββββββββ
β Token β
β Processing β
ββββββββββ¬βββββββββ
β
ββββββββββΌβββββββββ
β Comark β
β AST β
ββββββββββ¬βββββββββ
β
ββββββββββΌβββββββββ
β Auto-unwrap β (Optional)
ββββββββββ¬βββββββββ
β
ββββββββββΌβββββββββ
β Generate TOC β
ββββββββββ¬βββββββββ
β
ββββββββββΌβββββββββ
β ComarkTree β
β (nodes + data β
β + meta) β
ββββββββββ¬βββββββββ
β
βββββββββββββ¬ββββββββββββ΄ββββββββββββ
βΌ βΌ βΌ
βββββββββββ βββββββββββ βββββββββββ
β Vue β β React β β Svelte β
β Rendererβ β Rendererβ β Rendererβ
βββββββββββ βββββββββββ βββββββββββ
Contributing & Testing
See the test specifications for examples of all supported syntax features.
Run tests:
pnpm test
Run specific test:
pnpm test -- tests/parse.test.ts
Resources
Summary
Comark is a comprehensive solution for parsing and rendering markdown with component support. It excels at:
- Extending Markdown - Component syntax without breaking compatibility
- Streaming Support - Real-time rendering with auto-close
- Lightweight AST - Efficient Comark AST format
- Framework Support - First-class Vue, React, and Svelte integration
- Developer Experience - Full TypeScript support and comprehensive documentation
Choose Comark when you need:
- Markdown with custom components
- Streaming/incremental parsing
- Real-time markdown editors
- AI-generated content rendering
- Documentation platforms
- Static site generation with custom components
Next Steps:
- π Learn Markdown Syntax
- π§ Master Parsing & AST
- βοΈ Explore Vue Rendering
- βοΈ Explore React Rendering
- π‘ Explore Svelte Rendering
- π€ Use with AI Agents