Skip to content

Instantly share code, notes, and snippets.

@Comamoca
Created January 14, 2026 00:19
Show Gist options
  • Select an option

  • Save Comamoca/bf3ec7048e1d334cf81b9acf3ca5b520 to your computer and use it in GitHub Desktop.

Select an option

Save Comamoca/bf3ec7048e1d334cf81b9acf3ca5b520 to your computer and use it in GitHub Desktop.
dprintを使ったJSDoc(Markdown記法含む)付きJavaScriptフォーマッター - Rustサンプルコード

dprintを使ったJSDoc付きJavaScriptフォーマッター

Rustでdprintライブラリを使用して、JSDoc(Markdown記法を含む)付きのJavaScriptコードをフォーマットするサンプルプログラムです。

概要

このプログラムは以下を実装しています:

  • dprint-plugin-typescript を使用したJavaScript/TypeScriptのフォーマット
  • JSDoc内でのMarkdown記法のサポート(見出し、リスト、コードブロック、強調など)
  • カスタマイズ可能なフォーマット設定(行幅、インデント幅、タブ/スペース)

JSDocとMarkdownの関係

  • JSDocはMarkdown形式ではない - 独自の構文体系(@param, @returnsなど)
  • JSDoc内でMarkdownが使える - 説明文を装飾できる(#見出し, **太字**, `コード` など)

Cargo.toml

[package]
name = "tmp"
version = "0.1.0"
edition = "2024"

[dependencies]
dprint-core = "0.67.4"
dprint-plugin-markdown = "=0.20.0"
dprint-plugin-typescript = "=0.95.13"

src/main.rs

use dprint_plugin_typescript::configuration::ConfigurationBuilder;
use dprint_plugin_typescript::FormatTextOptions;
use std::path::PathBuf;

fn main() {
    // JSDoc内でMarkdownを使用したJavaScriptのサンプルコード
    let js_code = r#"
/**
 * # ユーザー情報取得API
 *
 * データベースからユーザー情報を取得する非同期関数です。
 *
 * ## 使用例
 * ```javascript
 * const user = await getUser(123, true);
 * console.log(user.name);
 * ```
 *
 * ## 機能
 * - ユーザーIDによる検索
 * - **詳細情報**の取得オプション
 * - エラーハンドリング
 *
 * > **注意:** ユーザーが存在しない場合はエラーをスローします
 *
 * @param {number} userId - ユーザーID(必須)
 * @param {boolean} includeDetails - 詳細情報を含めるかどうか
 * @returns {Promise<User>} ユーザー情報を含むPromise
 * @throws {Error} ユーザーが見つからない場合
 */
async function getUser(userId,includeDetails){const user=await fetchUserFromDB(userId);if(!user){throw new Error("User not found");}if(includeDetails){user.details=await fetchUserDetails(userId);}return user;}

/**
 * 配列の合計値を計算
 *
 * 数値の配列を受け取り、**合計値**を返します。
 *
 * ### アルゴリズム
 * 1. `reduce`メソッドを使用
 * 2. 初期値は`0`
 * 3. 各要素を累積加算
 *
 * _空配列の場合は0を返します_
 *
 * @param {number[]} numbers - 数値の配列
 * @returns {number} 合計値
 * @example
 * sum([1, 2, 3]); // returns 6
 */
function sum(numbers){return numbers.reduce((acc,num)=>acc+num,0);}
"#;

    // TypeScriptプラグインの設定
    let config = ConfigurationBuilder::new()
        .line_width(80)
        .indent_width(2)
        .use_tabs(false)
        .build();

    // JavaScriptファイルとしてフォーマット
    let formatted = dprint_plugin_typescript::format_text(FormatTextOptions {
        path: &PathBuf::from("sample.js"),
        extension: Some("js"),
        text: js_code.to_string(),
        config: &config,
        external_formatter: None,
    });

    match formatted {
        Ok(Some(result)) => {
            println!("=== フォーマット結果 ===\n");
            println!("{}", result);
        }
        Ok(None) => {
            println!("変更なし(すでにフォーマット済み)");
        }
        Err(e) => {
            eprintln!("エラー: {}", e);
        }
    }
}

使い方

# プロジェクトのビルドと実行
cargo run

出力例

=== フォーマット結果 ===

/**
 * # ユーザー情報取得API
 *
 * データベースからユーザー情報を取得する非同期関数です。
 *
 * ## 使用例
 * ```javascript
 * const user = await getUser(123, true);
 * console.log(user.name);
 * ```
 *
 * ## 機能
 * - ユーザーIDによる検索
 * - **詳細情報**の取得オプション
 * - エラーハンドリング
 *
 * > **注意:** ユーザーが存在しない場合はエラーをスローします
 *
 * @param {number} userId - ユーザーID(必須)
 * @param {boolean} includeDetails - 詳細情報を含めるかどうか
 * @returns {Promise<User>} ユーザー情報を含むPromise
 * @throws {Error} ユーザーが見つからない場合
 */
async function getUser(userId, includeDetails) {
  const user = await fetchUserFromDB(userId);
  if (!user) throw new Error("User not found");
  if (includeDetails) user.details = await fetchUserDetails(userId);
  return user;
}

/**
 * 配列の合計値を計算
 *
 * 数値の配列を受け取り、**合計値**を返します。
 *
 * ### アルゴリズム
 * 1. `reduce`メソッドを使用
 * 2. 初期値は`0`
 * 3. 各要素を累積加算
 *
 * _空配列の場合は0を返します_
 *
 * @param {number[]} numbers - 数値の配列
 * @returns {number} 合計値
 * @example
 * sum([1, 2, 3]); // returns 6
 */
function sum(numbers) {
  return numbers.reduce((acc, num) => acc + num, 0);
}

使用したMarkdown記法

JSDoc内で以下のMarkdown記法を使用しています:

  1. 見出し: #, ##, ###
  2. コードブロック: ```javascript
  3. リスト: - (箇条書き)、1., 2., 3. (番号付き)
  4. 強調: **太字**, _斜体_
  5. 引用: > (blockquote)
  6. インラインコード: `reduce`
  7. JSDoc専用タグ: @param, @returns, @throws, @example

重要なポイント

dprint-core 0.67.4 での変更点

  • print_items モジュールは private
  • PrintItems::push_string() メソッドは String 型を要求(&str は不可)
  • PrintOptions::new_line_text を使用(newline_kind は廃止)

dprint-plugin-typescript 0.95.13 での使用法

FormatTextOptions {
    path: &PathBuf::from("sample.js"),
    extension: Some("js"),  // Option<&str>
    text: js_code.to_string(),  // String型
    config: &config,
    external_formatter: None,
}

ライセンス

このサンプルコードはパブリックドメインです。自由に使用・改変してください。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment