日本語に最適化されたMarkdownパーサー - CommonMark + GFM対応
Project description
mdja
日本語に最適化されたMarkdownパーサー
特徴
- ✨ CommonMark + GFM完全対応 - comrak基盤で高速・正確
- ✨ 日本語見出しアンカー生成 -
# はじめに→id="hajimeni" - ✨ 目次(TOC)自動生成 - Markdown形式で目次を出力
- ✨ 読了時間計算 - 日本語文字数を考慮した精密な計算
- ✨ frontmatter解析 - YAMLメタデータの自動抽出
- ✨ GFM機能 - テーブル、タスクリスト、取り消し線、自動リンクなど
- ✨ マルチ言語対応 - Rust、Python、JavaScript(WASM)、CLIツール
- ✨ シンプルなAPI - 1行でパース可能
- ✨ 充実したテスト - 12個のテスト(ユニット + ドキュメント)
インストール
Rustから使う
Cargo.tomlに追加:
[dependencies]
mdja = "0.1.0"
Pythonから使う(予定)
pip install mdja
JavaScriptから使う(予定)
npm install mdja
CLIツールとして使う
cargo install mdja
基本的な使い方
Rust
use 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);
CLIツール
# ファイルからHTML生成
mdja input.md output.html
# 標準出力に表示
mdja input.md
# 標準入力から読み込み
cat input.md | mdja
API リファレンス
Document::parse(markdown: &str) -> Document
Markdownをパースして構造化データを返します。
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, // 読了時間(分)
}
Document::to_html(markdown: &str) -> String
シンプルなHTML変換(メタデータ不要な場合)。
let html = Document::to_html("**太字**");
Heading
pub struct Heading {
pub text: String, // 見出しテキスト
pub level: usize, // レベル (1-6)
pub id: String, // アンカーID
}
機能詳細
frontmatter解析
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");
目次(TOC)生成
見出しから自動的に目次を生成します。
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分
GFM(GitHub Flavored Markdown)
テーブル
| ヘッダー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 --open
パフォーマンス
comrakをベースにしているため、高速かつ正確なパースが可能です。
- 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をベースにしており、日本語ブログ・ドキュメント向けに最適化された追加機能を提供しています。
English Summary
mdja - Japanese-optimized Markdown parser
Features
- 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
Installation
[dependencies]
mdja = "0.1.0"
Usage
use mdja::Document;
let doc = Document::parse("# Hello\n\n**World**");
println!("{}", doc.html);
println!("Reading time: {} min", doc.reading_time);
License
MIT OR Apache-2.0
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mdja-0.1.0.tar.gz.
File metadata
- Download URL: mdja-0.1.0.tar.gz
- Upload date:
- Size: 29.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.10.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e56ba7f3e7f29d41ee81c21b2df1642e92a1cc3d08d2cbe476d084f848ed5289
|
|
| MD5 |
7d12bc69632be29e3dcbf74ab60a6f81
|
|
| BLAKE2b-256 |
3bf4c2f0cfec8d9c445f658937c7418633910151636da677d207fe993f9976bc
|
File details
Details for the file mdja-0.1.0-cp39-cp39-macosx_11_0_arm64.whl.
File metadata
- Download URL: mdja-0.1.0-cp39-cp39-macosx_11_0_arm64.whl
- Upload date:
- Size: 1.0 MB
- Tags: CPython 3.9, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.10.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5ce5a947b5dd9b6ebf496c4e151102007e500f25673c594c94b9f40f042bf26e
|
|
| MD5 |
c022b85ded1f6d93b97f986a5fba7aed
|
|
| BLAKE2b-256 |
afdb074614d20dbc3a247b9f678bc04f025076ff254638c4cedd18448aca25bc
|