# 機能設計書 23 --print オプション

## 概要

本ドキュメントは、CoffeeScript CLIツールの `--print` (`-p`) オプションの機能設計を記述する。このオプションは、コンパイルされたJavaScriptコードをファイルに書き出す代わりに標準出力に表示する機能を提供する。

### 本機能の処理概要

`--print` オプションは、CoffeeScriptからJavaScriptへのコンパイル結果をファイルに保存せず、標準出力（stdout）に直接出力する機能を提供する。これにより、パイプラインでの処理やコンパイル結果の即座の確認が可能となる。

**業務上の目的・背景**：開発者がCoffeeScriptコードをコンパイルした結果を確認したい場合、ファイルを作成して開くよりも標準出力で直接確認する方が効率的である。また、シェルのパイプライン（`|`）と組み合わせることで、他のツールとの連携が容易になる。例えば、コンパイル結果をクリップボードにコピーしたり、別のコマンドに渡して処理したりできる。

**機能の利用シーン**：
- コンパイル結果を即座に確認したい場合
- シェルパイプラインで他のツールにJavaScriptコードを渡したい場合
- ファイルを生成せずにコンパイル結果を検証したい場合
- 標準入力から受け取ったコードをコンパイルして標準出力に返す場合

**主要な処理内容**：
1. CoffeeScriptコードをコンパイルする
2. コンパイル結果のJavaScriptを`printLine`関数で標準出力に表示する
3. 出力前に末尾の空白文字を`trim()`で除去する

**関連システム・外部連携**：Node.js process.stdout

**権限による制御**：特になし

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | - | - | CLIオプションのため関連画面なし |

## 機能種別

出力制御 / パイプライン連携

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| --print / -p | boolean | No | 標準出力モードを有効にする | オプションの有無で判定 |
| source | string | Yes | コンパイル対象のCoffeeScriptファイルまたはコード | ファイルが存在するか、有効なコードであること |

### 入力データソース

- ファイルシステム（CoffeeScriptソースファイル）
- コマンドライン引数（`--eval` 併用時）
- 標準入力（`--stdio` 併用時）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| compiled JS | string | コンパイルされたJavaScriptコード（trim済み） |

### 出力先

- 標準出力（process.stdout）

## 処理フロー

### 処理シーケンス

```
1. コマンドライン引数をパース
   └─ --print オプションが指定されているか確認

2. ソースコードの取得
   └─ ファイル、--eval、--stdio から入力を取得

3. CoffeeScript.compile() によるコンパイル
   └─ オプションに基づきコンパイル実行

4. 出力処理
   └─ task.output.trim() で末尾空白を除去
   └─ printLine で標準出力に表示
```

### フローチャート

```mermaid
flowchart TD
    A[開始: coffee -p source.coffee] --> B[引数パース]
    B --> C{--print 指定?}
    C -->|No| D[通常処理: ファイル出力]
    C -->|Yes| E[ソースコード取得]
    E --> F[CoffeeScript.compile]
    F --> G[task.output 取得]
    G --> H[.trim で末尾空白除去]
    H --> I[printLine: 標準出力へ]
    I --> J[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-23-01 | 末尾空白除去 | 出力前にtrim()で末尾の空白・改行を除去する | --print指定時 |
| BR-23-02 | 暗黙のprint | --eval または --stdio と --compile を併用すると暗黙的に --print が有効になる | 該当オプション併用時 |
| BR-23-03 | 実行モード排他 | --print を指定すると実行モード（--run）は無効になる | --print指定時 |
| BR-23-04 | 改行付き出力 | printLine関数は末尾に改行を追加して出力する | 常時 |

### 計算ロジック

特になし

## データベース操作仕様

本機能はデータベースを使用しない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| SyntaxError | 構文エラー | CoffeeScriptの文法エラー | エラーメッセージを標準エラー出力に表示して終了コード1 |
| ENOENT | ファイル不存在 | 指定されたファイルが存在しない | エラーメッセージを表示して終了コード1 |

### リトライ仕様

本機能はリトライ処理を行わない。

## トランザクション仕様

本機能はトランザクション処理を使用しない。

## パフォーマンス要件

特になし

## セキュリティ考慮事項

- 出力されるJavaScriptコードに機密情報が含まれないよう注意
- パイプラインで他のコマンドに渡す際は、受け取り側のセキュリティも考慮

## 備考

- `--compile` オプションなしでも `--print` 単独で使用可能
- `--map` オプションと `--stdio` は併用できない

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: オプション定義を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | command.coffee | `src/command.coffee` | SWITCHESの `--print` 定義（49行目）を確認 |

**読解のコツ**: `['-p', '--print', 'print out the compiled JavaScript']` の形式で定義されている。

#### Step 2: 暗黙のprint有効化ロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | command.coffee | `src/command.coffee` | parseOptions関数（445行目〜）を確認 |

**主要処理フロー**:
- **448行目**: `o.run = not (o.compile or o.print or o.map)` で実行モードとの排他制御
- **449行目**: `o.print = !! (o.print or (o.eval or o.stdio and o.compile))` で暗黙のprint

#### Step 3: 出力処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | command.coffee | `src/command.coffee` | compileScript関数内のprint処理（230-231行目） |
| 3-2 | command.coffee | `src/command.coffee` | printLine関数（21行目） |

**主要処理フロー**:
- **230-231行目**: `if opts.print` の条件分岐と `printLine task.output.trim()`
- **21行目**: `printLine = (line) -> process.stdout.write line + '\n'`

### プログラム呼び出し階層図

```
exports.run (72行目)
    │
    ├─ parseOptions (74行目)
    │      └─ opts.print 設定 (449行目)
    │
    └─ compileScript (202行目)
           │
           ├─ CoffeeScript.compile (223行目)
           │      └─ コンパイル結果取得
           │
           └─ [opts.print 分岐]
                  └─ printLine task.output.trim() (231行目)
                         │
                         └─ process.stdout.write (21行目)
```

### データフロー図

```
[入力]                    [処理]                         [出力]

CoffeeScriptソース ───▶ compileScript (202行目)
                              │
                              ▼
                        CoffeeScript.compile (223行目)
                              │
                              ▼
                        task.output 取得 (224行目)
                              │
                              ▼
                        .trim() で空白除去 (231行目)
                              │
                              ▼
                        printLine (21行目) ───▶ process.stdout
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| command.coffee | `src/command.coffee` | ソース | CLIメイン処理、printLine関数、--print分岐処理 |
| coffeescript.coffee | `src/coffeescript.coffee` | ソース | コンパイル処理の実装 |
| optparse.coffee | `src/optparse.coffee` | ソース | コマンドライン引数パーサー |
