Skip to main content

日本語に最適化されたMarkdownパーサー - CommonMark + GFM対応

Project description

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

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mdja-0.1.0.tar.gz (29.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mdja-0.1.0-cp39-cp39-macosx_11_0_arm64.whl (1.0 MB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

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

Hashes for mdja-0.1.0.tar.gz
Algorithm Hash digest
SHA256 e56ba7f3e7f29d41ee81c21b2df1642e92a1cc3d08d2cbe476d084f848ed5289
MD5 7d12bc69632be29e3dcbf74ab60a6f81
BLAKE2b-256 3bf4c2f0cfec8d9c445f658937c7418633910151636da677d207fe993f9976bc

See more details on using hashes here.

File details

Details for the file mdja-0.1.0-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for mdja-0.1.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5ce5a947b5dd9b6ebf496c4e151102007e500f25673c594c94b9f40f042bf26e
MD5 c022b85ded1f6d93b97f986a5fba7aed
BLAKE2b-256 afdb074614d20dbc3a247b9f678bc04f025076ff254638c4cedd18448aca25bc

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page