日本語に最適化されたMarkdownパーサー
- ✨ CommonMark + GFM完全対応 - comrak基盤で高速・正確
- ✨ 日本語見出しアンカー生成 -
# はじめに→id="hajimeni" - ✨ 目次(TOC)自動生成 - Markdown形式で目次を出力
- ✨ 読了時間計算 - 日本語文字数を考慮した精密な計算
- ✨ frontmatter解析 - YAMLメタデータの自動抽出
- ✨ GFM機能 - テーブル、タスクリスト、取り消し線、自動リンクなど
- ✨ マルチ言語対応 - Rust、Python、JavaScript(WASM)、CLIツール
- ✨ シンプルなAPI - 1行でパース可能
- ✨ 充実したテスト - 12個のテスト(ユニット + ドキュメント)
Cargo.tomlに追加:
[dependencies]
mdja = "0.1.0"pip install mdjanpm install mdjacargo install mdjause mdja::Document;
fn main() {
let markdown = r#"
---
title: サンプル記事
author: Taro
---
# はじめに
これは**サンプル**記事です。
## 特徴
- 簡単に使える
- 高速
- 日本語対応
"#;
let doc = Document::parse(markdown);
// HTML出力
println!("{}", doc.html);
// メタデータ
println!("タイトル: {}", doc.metadata.get("title").unwrap());
// 目次
println!("## 目次\n{}", doc.toc);
// 読了時間
println!("読了時間: {}分", doc.reading_time);
// 見出し一覧
for heading in doc.headings {
println!("{} (id: {})", heading.text, heading.id);
}
}use mdja::Document;
let html = Document::to_html("# Hello\n\n**World**");
println!("{}", html);# ファイルからHTML生成
mdja input.md output.html
# 標準出力に表示
mdja input.md
# 標準入力から読み込み
cat input.md | mdjaMarkdownをパースして構造化データを返します。
let doc = Document::parse("# Hello");返り値: Document
pub struct Document {
pub html: String, // HTML出力
pub metadata: HashMap<String, String>, // frontmatterメタデータ
pub toc: String, // 目次(Markdown形式)
pub headings: Vec<Heading>, // 見出し一覧
pub reading_time: usize, // 読了時間(分)
}シンプルなHTML変換(メタデータ不要な場合)。
let html = Document::to_html("**太字**");pub struct Heading {
pub text: String, // 見出しテキスト
pub level: usize, // レベル (1-6)
pub id: String, // アンカーID
}YAML形式のメタデータを自動抽出します。
---
title: 記事タイトル
author: Taro
date: 2025-01-17
tags: rust, markdown
---
# 本文let doc = Document::parse(markdown);
println!("{}", doc.metadata.get("title").unwrap()); // "記事タイトル"
println!("{}", doc.metadata.get("author").unwrap()); // "Taro"日本語の見出しからアンカーIDを自動生成します。
# はじめに
## インストール方法↓
<h1 id="hajimeni">はじめに</h1>
<h2 id="insutoruhouhou">インストール方法</h2>let doc = Document::parse("# はじめに");
assert_eq!(doc.headings[0].id, "hajimeni");見出しから自動的に目次を生成します。
let doc = Document::parse("# H1\n## H2\n### H3");
println!("{}", doc.toc);
// - [H1](#h1)
// - [H2](#h2)
// - [H3](#h3)日本語と英語の文字数を考慮して読了時間を計算します。
- 日本語: 400文字/分
- 英語: 200単語/分
let doc = Document::parse("あ".repeat(800));
assert_eq!(doc.reading_time, 2); // 2分| ヘッダー1 | ヘッダー2 |
|----------|----------|
| セル1 | セル2 |- [x] 完了したタスク
- [ ] 未完了のタスク~~古い情報~~ 新しい情報https://example.com本文[^1]
[^1]: 脚注の内容- 静的サイトジェネレーター - ブログ記事のHTML変換
- CMSシステム - ユーザー入力のMarkdown処理
- ドキュメント生成 - 技術文書のHTML化
- APIサーバー - Markdown→HTML変換エンドポイント
- CLIツール - バッチ処理でのMarkdown変換
- Webアプリケーション - WASM経由でブラウザ内変換
# サンプルプログラムを実行
cargo run --example basic
# テストを実行
cargo test
# CLIツールをビルド
cargo build --release
# CLIツールを使用
./target/release/mdja examples/sample.md
# ドキュメントを生成
cargo doc --opencomrakをベースにしているため、高速かつ正確なパースが可能です。
- CommonMark準拠
- GFM完全対応
- 大規模ドキュメントにも対応
- パーサー: comrak (CommonMark + GFM)
- YAML: serde_yaml
- 正規表現: regex
- Python bindings: PyO3 (オプション)
- WASM bindings: wasm-bindgen (オプション)
- 基本的なMarkdownパース
- frontmatter解析
- 日本語見出しアンカー生成
- 目次生成
- 読了時間計算
- GFM対応
- CLIツール
- Pythonバインディング
- WASMバインディング
- シンタックスハイライト統合
- カスタムレンダラー
- プラグインシステム
プルリクエストを歓迎します!
- このリポジトリをフォーク
- フィーチャーブランチを作成 (
git checkout -b feature/amazing-feature) - 変更をコミット (
git commit -m 'Add amazing feature') - ブランチにプッシュ (
git push origin feature/amazing-feature) - プルリクエストを作成
このプロジェクトは、以下のいずれかのライセンスでデュアルライセンスされています:
- MITライセンス (LICENSE-MIT または http://opensource.org/licenses/MIT)
- Apache License, Version 2.0 (LICENSE-APACHE または http://www.apache.org/licenses/LICENSE-2.0)
お好みのライセンスをお選びください。
このライブラリはcomrakをベースにしており、日本語ブログ・ドキュメント向けに最適化された追加機能を提供しています。
mdja - Japanese-optimized Markdown parser
- CommonMark + GFM support (powered by comrak)
- Japanese heading anchor generation (
# はじめに→id="hajimeni") - Automatic table of contents generation
- Reading time calculation (Japanese character aware)
- Frontmatter parsing (YAML)
- Multi-language support (Rust, Python, JavaScript, CLI)
- Simple API
[dependencies]
mdja = "0.1.0"use mdja::Document;
let doc = Document::parse("# Hello\n\n**World**");
println!("{}", doc.html);
println!("Reading time: {} min", doc.reading_time);MIT OR Apache-2.0