Rustでdprintライブラリを使用して、JSDoc(Markdown記法を含む)付きのJavaScriptコードをフォーマットするサンプルプログラムです。
このプログラムは以下を実装しています:
- dprint-plugin-typescript を使用したJavaScript/TypeScriptのフォーマット
- JSDoc内でのMarkdown記法のサポート(見出し、リスト、コードブロック、強調など)
- カスタマイズ可能なフォーマット設定(行幅、インデント幅、タブ/スペース)
- JSDocはMarkdown形式ではない - 独自の構文体系(
@param,@returnsなど) - JSDoc内でMarkdownが使える - 説明文を装飾できる(
#見出し,**太字**,`コード`など)
[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"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);
}
JSDoc内で以下のMarkdown記法を使用しています:
- 見出し:
#,##,### - コードブロック:
```javascript - リスト:
-(箇条書き)、1.,2.,3.(番号付き) - 強調:
**太字**,_斜体_ - 引用:
>(blockquote) - インラインコード:
`reduce` - JSDoc専用タグ:
@param,@returns,@throws,@example
print_itemsモジュールは privatePrintItems::push_string()メソッドはString型を要求(&strは不可)PrintOptions::new_line_textを使用(newline_kindは廃止)
FormatTextOptions {
path: &PathBuf::from("sample.js"),
extension: Some("js"), // Option<&str>
text: js_code.to_string(), // String型
config: &config,
external_formatter: None,
}このサンプルコードはパブリックドメインです。自由に使用・改変してください。