| Crates.io | mdja |
| lib.rs | mdja |
| version | 0.1.0 |
| created_at | 2025-11-17 13:29:59.993703+00 |
| updated_at | 2025-11-17 13:29:59.993703+00 |
| description | 日本語に最適化されたMarkdownパーサー - CommonMark + GFM対応、目次生成、読了時間計算 |
| homepage | |
| repository | https://github.com/0809android/mdja |
| max_upload_size | |
| id | 1936793 |
| size | 88,254 |
日本語に最適化されたMarkdownパーサー
# はじめに → id="hajimeni"Cargo.tomlに追加:
[dependencies]
mdja = "0.1.0"
pip install mdja
npm install mdja
cargo install mdja
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);
# ファイルからHTML生成
mdja input.md output.html
# 標準出力に表示
mdja input.md
# 標準入力から読み込み
cat input.md | mdja
Document::parse(markdown: &str) -> DocumentMarkdownをパースして構造化データを返します。
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("**太字**");
Headingpub 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)
日本語と英語の文字数を考慮して読了時間を計算します。
let doc = Document::parse("あ".repeat(800));
assert_eq!(doc.reading_time, 2); // 2分
| ヘッダー1 | ヘッダー2 |
|----------|----------|
| セル1 | セル2 |
- [x] 完了したタスク
- [ ] 未完了のタスク
~~古い情報~~ 新しい情報
https://example.com
本文[^1]
[^1]: 脚注の内容
# サンプルプログラムを実行
cargo run --example basic
# テストを実行
cargo test
# CLIツールをビルド
cargo build --release
# CLIツールを使用
./target/release/mdja examples/sample.md
# ドキュメントを生成
cargo doc --open
comrakをベースにしているため、高速かつ正確なパースが可能です。
プルリクエストを歓迎します!
git checkout -b feature/amazing-feature)git commit -m 'Add amazing feature')git push origin feature/amazing-feature)このプロジェクトは、以下のいずれかのライセンスでデュアルライセンスされています:
お好みのライセンスをお選びください。
このライブラリはcomrakをベースにしており、日本語ブログ・ドキュメント向けに最適化された追加機能を提供しています。
mdja - Japanese-optimized Markdown parser
# はじめに → id="hajimeni")[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