comark について
Comarkはmarkdown-itを基盤とするMarkdown解析・レンダリングツールです。カスタムコンポーネント構文とストリーミングAPIを備え、Vue、React、Svelte、Angular向けのレンダラーも提供します。
主な機能
- 01CommonMarkとGFMへの対応
- 02カスタムコンポーネント構文
- 03バッファー型・増分型ストリーミング
- 04Vue、React、Svelte、Angularレンダラー
- 05YAML frontmatterと目次生成
- 06Shikiによる構文ハイライト
活用シーン
- 01独自コンポーネントを使う静的サイトの構築
- 02リアルタイムMarkdownエディターの作成
- 03ストリーミング生成されるAIコンテンツの表示
- 04Markdownファイルの一括解析
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ onmax/ nuxt-skills --skill comarkインストール後、Claude Code で/comarkを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
AGENTS.mdreferences/markdown-syntax.mdparsing-ast.mdrendering-angular.mdrendering-react.mdrendering-svelte.mdrendering-vue.md詳細
Comark - スキルガイド
Comark(Markdown 内のコンポーネント)をサポートする高性能な Markdown パーサーです。markdown-it を基盤とし、文字列ベースとストリーミングの両方の API を提供します。
概要
Comark は、CommonMark および GitHub Flavored Markdown との完全な互換性を維持しながら、強力なコンポーネントシステムで標準の Markdown を拡張します。次の機能を提供します。
- 🚀 markdown-it エンジンによる 高性能な解析
- 📦 バッファリングモードと増分モードによる ストリーミングのサポート
- ⚡ 未完了の構文を自動で閉じる リアルタイムレンダリング
- 🔧 カスタムコンポーネント向けの Comark コンポーネント構文
- 🎨 カスタムコンポーネントのマッピングに対応した Vue、React、Svelte、Angular のレンダラー
- 📝 YAML フロントマターのサポート
- 📑 目次の自動生成
- 🎯 TypeScript の完全なサポート
- 🌈 Shiki との統合による 構文ハイライト
パッケージ情報
- パッケージ名:
comark - インストール:
npm install comarkまたはpnpm add comark - エクスポート:
- メインパーサー:
comark - Vue コンポーネント:
@comark/vue - React コンポーネント:
@comark/react - Svelte コンポーネント:
@comark/svelte - Angular コンポーネント:
@comark/angular - HTML レンダリング:
@comark/html - ANSI ターミナルレンダリング:
@comark/ansi - Nuxt モジュール:
@comark/nuxt
- メインパーサー:
クイックスタート
基本的な使い方
import { parseMarkdown } from 'comark'
const content = `---
title: Hello World
---
# Hello World
This is **markdown** with :icon component.
::alert{type="info"}
Important message
::
`
const result = await parseMarkdown(content)
console.log(result.nodes) // Markdown AST
console.log(result.frontmatter) // { title: 'Hello World' }
console.log(result.meta) // Additional metadata
Vue レンダリング
<template>
<Markdown :value="content" />
</template>
<script setup lang="ts">
import { Markdown } from '@comark/vue'
const content = `# Hello World`
</script>
React レンダリング
import { Markdown } from '@comark/react'
export default function App() {
return <Markdown value={content} />
}
Svelte レンダリング
<script lang="ts">
import { Markdown } from '@comark/svelte'
const content = `# Hello World`
</script>
<Markdown value={content} />
Angular レンダリング
import { Component } from '@angular/core'
import { Markdown } from '@comark/angular'
@Component({
selector: 'app-root',
standalone: true,
imports: [Markdown],
template: `<comark-markdown [value]="content" />`,
})
export class AppComponent {
content = `# Hello World`
}
ドキュメントのセクション
このガイドは、パッケージのさまざまな側面を扱う、目的別のセクションで構成されています。
📝 1. Markdown 構文
構文を網羅したリファレンスを使って、Comark ドキュメントの書き方を学びましょう。
- 標準 Markdown: 見出し、テキストの書式設定、リスト、リンク、画像、引用
- フロントマター: 特別なフィールド(title、depth、searchDepth)を含む YAML メタデータ
- Comark コンポーネント: ブロックコンポーネント(
::component)、インラインコンポーネント(:component)、プロパティ、スロット、ネスト - 属性:
{...}構文を使った、ネイティブな Markdown 要素へのカスタム属性の指定 - コードブロック: 言語の指定、ファイル名のメタデータ、行のハイライト、特殊文字
- タスクリスト:
[x]と[ ]の構文を使った GFM スタイルのチェックボックス - テーブル: 配置とインライン Markdown に対応した GFM テーブル
🔧 2. 解析とドキュメントモデル
MarkdownDocument の解析と操作に関する完全なガイドです。
- 文字列の解析: オプション(autoUnwrap、autoClose)を指定できる
parseMarkdown()関数 - 非同期解析: Shiki の構文ハイライトに対応した
parseMarkdown() - ドキュメント構造: コンパクトな配列ベースのノードを持つ、シリアライズ可能な
MarkdownDocument - ドキュメントのレンダリング: HTML(
@comark/html経由のrenderHtmlFromDocument)または Markdown(comark/render経由のrenderMarkdown)への変換 - 自動クローズ: 閉じられていない構文を自動で閉じる機能
- 自動アンラップ: コンテナコンポーネントから不要な段落のラッパーを削除する機能
⚛️ 3. Vue レンダリング
Vue アプリケーションでのレンダリングに関する包括的なガイドです。
- 基本的な使い方:
Markdownコンポーネントのセットアップ - カスタムコンポーネント: カスタム Vue コンポーネントを Comark 要素にマッピング
- 動的読み込み: 遅延読み込みコンポーネント向けの
componentsManifest - スロットのサポート:
#slot-name構文を使った名前付きスロット - ストリーミングモード: リアクティブなコンテンツによるリアルタイムレンダリング
- Prose コンポーネント: 標準要素向けの、スタイル設定済みコンポーネント
- エラー処理: ストリーミング時に使用できる組み込みのエラー捕捉機能
- Props へのアクセス:
__nodeと解析済みプロパティへのアクセス
⚛️ 4. React Rendering
React アプリケーションでのレンダリングに関する包括的なガイドです。
- 基本的な使い方:
Markdownコンポーネントのセットアップ - カスタムコンポーネント: カスタム React コンポーネントを Comark 要素にマッピング
- 動的読み込み: 遅延読み込みされるコンポーネントのための
componentsManifest - Props の変換: HTML 属性の自動変換(
class→classNameなど) - ストリーミングモード: リアクティブなコンテンツのリアルタイムレンダリング
- Prose コンポーネント: 標準要素向けのスタイル設定済みコンポーネント
- カスタム Props: パース済みプロパティと
__nodeへのアクセス - CSS クラス名: カスタムラッパークラスと Tailwind CSS の統合
🎡 5. Svelte Rendering
Svelte 5 アプリケーションでのレンダリングに関する包括的なガイドです。
- 基本的な使い方:
$stateを使ったMarkdownコンポーネントのセットアップ - カスタムコンポーネント: カスタム Svelte コンポーネントを Comark 要素にマッピング
- 動的読み込み: 遅延読み込みされるコンポーネントのための
componentsManifest - Props のマッピング: 属性から Props への変換(HTML のセマンティクスに近い形式)
- ストリーミングモード: リアクティブな
$stateによるリアルタイムレンダリング - 実験的な非同期処理:
<svelte:boundary>を使ったMarkdownAsync - Prose コンポーネント: ネイティブ HTML 要素をオーバーライドするための
Proseプレフィックス
🅰️ 6. Angular Rendering
Angular 17 以降のアプリケーションでのレンダリングに関する包括的なガイドです。
- 基本的な使い方:
Markdownスタンドアロンコンポーネントのセットアップ - カスタムコンポーネント: Angular コンポーネントを Comark 要素にマッピング
- コンポーネントの解決:
Prose{PascalTag}、PascalTag、tagの優先順位 - コンテンツプロジェクション:
<ng-content select="[slot=name]">による名前付きスロット - ストリーミングモード: キャレットインジケーターを使ったリアルタイムレンダリング
- データバインディング: アンビエント
data入力による:bindingの解決 - 設定済みコンポーネント:
defineMarkdownComponentとdefineMarkdownDocumentComponent - プラグイン: Angular コンポーネントラッパーを使った Math(KaTeX)、Mermaid、Binding
🤖 7. AI エージェントでの使用
AI エージェントと LLM のストリーミングワークフローに Comark を統合するためのガイドです。
- LLM からのストリーミング: AI の出力を逐次的にリアルタイムでレンダリング
- 自動クローズ: LLM の部分トークンによる未完了の構文への対応
- キャレットインジケーター: 生成中にライブカーソルを表示
- フレームワークの例: Vue、React、Svelte、Angular のストリーミングパターン
- CLI 向け ANSI: ターミナルエージェントで AI の出力をレンダリング
主な機能の詳細
Comark コンポーネント構文
Comark は、読みやすさを保ちながらカスタムコンポーネントで Markdown を拡張します。
::alert{type="warning" .important}
This is a **warning** message with markdown support.
::
Check out this :icon-star{.text-yellow} component.
::card
#header
## Title
#content
Main content
#footer
Footer
::
Markdown ドキュメントモデル
効率的な処理を可能にする、軽量な配列ベースの構造です。
interface MarkdownDocument {
nodes: [
["h1", { "id": "hello" }, "Hello"],
["p", {}, "Text with ", ["strong", {}, "bold"], " word"],
["alert", { "type": "info" }, "Message"]
],
frontmatter: {},
meta: {}
}
一般的なユースケース
1. 静的サイトジェネレーター
import { parseMarkdown } from 'comark'
import { renderHtmlFromDocument } from '@comark/html'
import shiki from '@comark/html/plugins/shiki'
async function processMarkdownFile(filePath: string) {
const content = await readFile(filePath, 'utf-8')
const doc = await parseMarkdown(content, {
plugins: [
shiki({
themes: { light: 'github-dark', dark: 'github-dark' },
}),
],
})
return {
html: await renderHtmlFromDocument(doc),
frontmatter: doc.frontmatter,
toc: doc.meta.toc
}
}
2. リアルタイム Markdown エディター
import { useState } from 'react'
import { Markdown } 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)} />
<Markdown value={content} />
</div>
)
}
3. ファイルの一括処理
import { readFile } from 'node:fs/promises'
import { parseMarkdown } 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 parseMarkdown(content)
})
)
results.forEach((result, i) => {
console.log(`File ${files[i]}:`)
console.log(` - ${result.nodes.length} nodes`)
})
}
4. ドキュメントプラットフォーム
<template>
<article class="prose">
<Markdown :value="markdownContent" :components="docComponents" />
</article>
</template>
<script setup lang="ts">
import { Markdown } from '@comark/vue'
import { docComponents } from './components'
</script>
API リファレンスの概要
コア関数(comark)
// Asynchronous parsing
parseMarkdown(source: string, options?: ParserOptions): Promise<MarkdownDocument>
// Auto-close unclosed syntax
autoCloseMarkdown(source: string): string
HTML レンダリング関数(@comark/html)
// Render markdown to HTML string (parse + render in one step)
renderHtml(markdown: string, options?: ParserOptions & RendererOptions): Promise<string>
// Render a pre-parsed document to HTML
renderHtmlFromDocument(document: MarkdownDocument, options?: RendererOptions): Promise<string>
// Create a reusable render function with shared parser instance
createHtmlRenderer(options?: ParserOptions & RendererOptions): (markdown: string) => Promise<string>
Vue コンポーネント(@comark/vue)
<Markdown :value="markdownString" :components="customComponents" />
React コンポーネント(@comark/react)
<Markdown value={markdownString} components={customComponents} />
Svelte コンポーネント(@comark/svelte)
<Markdown value={markdownString} components={customComponents} />
Angular コンポーネント(@comark/angular)
<comark-markdown [value]="markdownString" [components]="customComponents" />
パフォーマンス特性
- シリアライズ可能なドキュメントモデル - コンパクトな配列ベースのノード
- コンポーネントの遅延読み込み - 必要なものだけを読み込み
- Shiki ハイライターのキャッシュ - 再初期化を回避
- 並列処理 - 複数ファイルを効率的に一括パース
TypeScript サポート
TypeScript の型定義がすべて含まれています。
import type {
MarkdownDocument,
Node,
ParserOptions,
} from 'comark'
アーキテクチャの概要
┌─────────────────────────────────────────┐
│ Markdown Input (String) │
└────────────────┬────────────────────────┘
│
┌────────▼────────┐
│ Auto-close │ (Optional)
│ Unclosed │
│ Syntax │
└────────┬────────┘
│
┌────────▼────────┐
│ Parse │
│ Frontmatter │ (YAML)
└────────┬────────┘
│
┌────────▼────────┐
│ MarkdownIt │
│ + Plugins │ (Comark, Tasks)
└────────┬────────┘
│
┌────────▼────────┐
│ Token │
│ Processing │
└────────┬────────┘
│
┌────────▼────────┐
│ Comark │
│ AST │
└────────┬────────┘
│
┌────────▼────────┐
│ Auto-unwrap │ (Optional)
└────────┬────────┘
│
┌────────▼────────┐
│ Generate TOC │
└────────┬────────┘
│
┌────────▼────────┐
│ MarkdownDocument │
│ (nodes + data │
│ + meta) │
└────────┬────────┘
│
┌───────────┬──────┴──────┬───────────┐
▼ ▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐
│ Vue │ │ React │ │ Svelte │ │ Angular │
│ Renderer│ │ Renderer│ │ Renderer│ │ Renderer│
└─────────┘ └─────────┘ └─────────┘ └─────────┘
貢献とテスト
サポートされているすべての構文機能の例については、テスト仕様を参照してください。
テストを実行します:
pnpm test
特定のテストを実行します:
pnpm test -- tests/parse.test.ts
リソース
- README: README.md - インストールとクイックスタート
- 仕様: SPEC/ - 構文のテストケース一式
概要
Comark は、コンポーネントをサポートする Markdown の解析とレンダリングのための包括的なソリューションです。特に次の点に優れています。
- Markdown の拡張 - 互換性を損なわないコンポーネント構文
- ストリーミングのサポート - 自動クローズによるリアルタイムレンダリング
- シリアライズ可能なドキュメント - コンパクトなノードを備えた効率的な
MarkdownDocumentモデル - フレームワークのサポート - Vue、React、Svelte、Angular とのファーストクラスの統合
- 開発者エクスペリエンス - TypeScript の完全サポートと包括的なドキュメント
次のようなニーズがある場合は、Comark をお選びください:
- カスタムコンポーネントを含む Markdown
- ストリーミング/インクリメンタル解析
- リアルタイム Markdown エディター
- AI 生成コンテンツのレンダリング
- ドキュメントプラットフォーム
- カスタムコンポーネントを使用した静的サイト生成
次のステップ: