mdja

Crates.iomdja
lib.rsmdja
version0.1.0
created_at2025-11-17 13:29:59.993703+00
updated_at2025-11-17 13:29:59.993703+00
description日本語に最適化されたMarkdownパーサー - CommonMark + GFM対応、目次生成、読了時間計算
homepage
repositoryhttps://github.com/0809android/mdja
max_upload_size
id1936793
size88,254
asakura (0809android)

documentation

README

mdja

日本語に最適化されたMarkdownパーサー

Crates.io Documentation License

特徴

  • 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完全対応
  • 大規模ドキュメントにも対応

技術スタック

ロードマップ

  • 基本的なMarkdownパース
  • frontmatter解析
  • 日本語見出しアンカー生成
  • 目次生成
  • 読了時間計算
  • GFM対応
  • CLIツール
  • Pythonバインディング
  • WASMバインディング
  • シンタックスハイライト統合
  • カスタムレンダラー
  • プラグインシステム

コントリビューション

プルリクエストを歓迎します!

  1. このリポジトリをフォーク
  2. フィーチャーブランチを作成 (git checkout -b feature/amazing-feature)
  3. 変更をコミット (git commit -m 'Add amazing feature')
  4. ブランチにプッシュ (git push origin feature/amazing-feature)
  5. プルリクエストを作成

ライセンス

このプロジェクトは、以下のいずれかのライセンスでデュアルライセンスされています:

お好みのライセンスをお選びください。

謝辞

このライブラリは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

Commit count: 0

cargo fmt