
2026/02/15 6:42
**Show HN: Box of Rain – 自動レイアウト付き ASCII 図形** --- ### 概要 Box of Rain は、ASCII アートを自動で整形し、読みやすく保守しやすい形式に変換するツールです。生のテキストを入力すると、図形要素を揃え、必要に応じてスペースを追加・調整します。 --- ### 主な機能 - **自動配置** ツールは図を解析し、すべてがきれいに並ぶように適切な空白を挿入します。 - **既存構造の保持** スペースだけを調整するため、入力した文字はそのまま残ります。 - **どんな ASCII アートでも対応** フローチャート・ネットワークトポロジー・単純な図形など、Box of Rain がすべて処理します。 --- ### 動作原理 1. ツールに生の ASCII 図を入力する。 2. アルゴリズムが各行の非空白文字をスキャン。 3. 列位置を計算し、垂直揃えが保たれるようスペースを追加。 4. 整形された図はコピーまたは埋め込み用に出力されます。 --- ### 例 | Before | After | |--------|-------| | `+---+`<br>`| |`<br>`+---+` | `+---+`<br>`| |`<br>`+---+` | (簡単なボックスは変わらず、複雑な図では明確に揃いが見える例です。) --- ### 利用シーン - **ドキュメント** – Markdown やプレーンテキストファイルで技術図を読みやすく保つ。 - **コードコメント** – ソースコード内に構造化された ASCII アートを直接埋め込む。 - **教育ツール** – グラフィックエディタなしで概念を視覚化。 --- ### 使い始め 1. プロジェクトの GitHub ページへアクセス: `https://github.com/username/box-of-rain` 2. リポジトリをクローンまたはダウンロード。 3. スクリプトをローカルで実行 (`python box_of_rain.py`) もしくは Web インターフェイスがあれば利用。 --- **楽しい図作りを!**
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
## Summary `box-of-rain` は、構造化データ(JSON、YAML)または Mermaid 構文を明確な ASCII ボックス図に変換する CLI ツールおよび JavaScript ライブラリです。さらに豊富な視覚表現のために SVG を出力できます。ネストされたボックス、3 つのルーティングスタイル(直線、L字型、U字型)の矢印接続、複数の枠線スタイル(`single`、`double`、`bold`、`rounded`、`dashed`)、オプションの影、および `x`、`y`、`width`、`height` を使用した自動レイアウトと手動配置をサポートします。 このツールは Mermaid にカスタムディレクティブ(`:::shadow`、`%% @route`)を追加し、ノード形状を枠線にマッピングし、矢印ルーティングを制御します。Mermaid サブモジュールはフローチャート、シーケンス図、サブグラフ、コメント、セミコロン、引用テキスト、および改行をサポートしています。 API は `render`(プレーンテキスト)や `renderSvg`(SVG 文字列)のような簡単な関数を公開します。入力検証は Zod ライブラリで処理され、不正なスキーマには `ZodError` が投げられます。開発スクリプト(`pnpm install`、`pnpm test`、`pnpm typecheck`、`pnpm build`)によりプロジェクトの保守性が維持されます。 典型的な使用コマンドは次のとおりです: - `npx box-of-rain --example` – 例図を表示 - `npx box-of-rain diagram.json` – JSON/YAML から図を描画 - `npx box-of-rain --svg diagram.json` – ASCII の代わりに SVG を出力 - `npx box-of-rain --mermaid diagram.txt` – Mermaid 入力を解析 今後の計画には、新しい例コマンド、混合自動レイアウト/手動配置モード、および拡張された Mermaid サポートが含まれます。MIT ライセンスとオープンソース設計により、このツールは開発者がドキュメント、コードレビュー、CI パイプライン、またはエディタ統合のために読みやすい図を迅速に生成できるようにします。
本文
box-of-rain – クイックスタート
npx box‑of‑rain --example
JSON、YAML、または Mermaid から ASCII ボックス図を生成します。入れ子のボックス、矢印接続、自動レイアウト、複数の枠線スタイルと影がサポートされています。出力はプレーンテキストでも SVG でも可能です(CLI またはプログラム的に)。
このコードは完全に AI が生成したものです。ご注意ください。保証はいたしません。
turbopuffer、planetscale、oxide computing の ASCII 図からインスパイアされています。主に自動レイアウトを利用した、シンプルで効果的な図作成手段として設計されました。
ロバート・ハンター(彼は恐らく嫌悪感を抱くだろう)へのオマージュとして命名しました。以下のすべても AI が生成しています。
例
これらの例は SVG です。GitHub はコードブロックの行間をカスタマイズできないためです。ウェブサイトに貼る際には
line-height: 1 を設定してクリッピングを防ぐとよいでしょう。
(SVG画像は省略)
インストール
pnpm install box-of-rain
CLI の使い方
| コマンド | 説明 |
|---|---|
| ビルトイン例を実行 |
| JSON から図を描画 |
| YAML から図を描画 |
| Mermaid から図を描画 |
| Mermaid の解析を強制 |
| SVG 出力 |
スキーマ
図はノードの再帰的なツリー構造です。各ノードはテキストまたは入れ子の子ノードを含むことができます。接続は任意のレベルで定義可能です。
{ "children": [ { "id": "web", "children": ["Frontend"], "border": "rounded" }, { "id": "platform", "title": "Cloud Platform", "border": "double", "shadow": true, "children": [ { "id": "api", "children": ["API Server"], "border": "bold" }, { "id": "db", "children": ["Database"] } ], "connections": [{ "from": "api", "to": "db" }] } ], "connections": [ { "from": "web", "to": "api", "label": "HTTPS" } ] }
は多態ですchildren
– 単一行テキスト"Hello"
– 複数行テキスト["Line 1","Line 2"]
– 入れ子のボックス(再帰)[ { ... } ]
ノードプロパティ
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
| string | — | 一意識別子(接続に必須) |
| string | string[] | Node[] |
| string | | , , , , のいずれか |
| string | — | 上部枠に表示されるテキスト |
| boolean | | 右下に ░ 影を追加 |
| boolean | | ░ と打ち消し線で灰色化 |
| string | | 子ノードのレイアウト方向(, ) |
, | number | | 位置(左上隅) |
, | number | | ボックスの寸法(文字数) |
| Connection[] | — | このレベルでの子 ID 間の接続 |
接続プロパティ
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
| string | — | 出発ボックスの ID |
| string | — | 目的地ボックスの ID |
| string | — | 矢印上に表示するテキストラベル |
| string | | 矢印が出る側(, , , ) |
| string | | 矢印が入る側 |
サイドは
right, left, top, bottom です。省略した場合、相対位置に基づいて自動判定されます。
Mermaid サポート
JSON/YAML の代わりに Mermaid 構文で図を記述できます。フローチャートとシーケンス図がサポートされています。
フローチャート
flowchart LR subgraph home1[Your Home WiFi]:::shadow iphone((Your iPhone)) robot((Your Robot)) end subgraph cloud[China]:::shadow server{Company Servers} end iphone -->|data| server server -->|commands| robot %% @route server-->robot toSide=right
サポートされるフローチャート機能
- 方向:
,LR
,RL
,TD/TB
(またはBT
)graph - ノード形状が枠線スタイルにマップ
| Mermaid | Border |
|---|---|
| single |
/ | rounded |
/ | double |
/ | bold |
| dashed |
- エッジ:
,-->
,---
,-.->
(オプションで==>
または|label|
)-- label --> - 連鎖エッジ:
A --> B --> C - サブグラフ:
(入れ子も可)subgraph id[Title] ... end - コメント:
%% - セミコロン:
を同一行に書けるA[One]; B[Two] - 文字列引用:
A["Hello World"] - 改行:
A[Line 1<br>Line 2]
シーケンス図
sequenceDiagram participant A as Alice participant B as Bob participant C as Server A->>B: Hello Bob B->>C: Auth request C-->>B: Auth response B-->>A: Hi Alice
サポートされるシーケンス機能
とparticipant
宣言(アクターは丸みのある枠線)actor- エイリアス:
participant A as Alice - メッセージタイプ:
,->>
,-->>
,-x
,--x
,-)--) - メッセージから暗黙的に参加者を生成
拡張機能
Mermaid 互換構文で使用できるライブラリ固有の拡張があります。
– ノードまたはサブグラフに影を付与:::shadowA[Server]:::shadow subgraph cloud[Cloud]:::shadow
– 接続ルーティングを制御(%% @route
)fromSide/toSide%% @route server-->robot toSide=right %% @route A-->B fromSide=bottom toSide=top
矢印のルーティング
矢印はアンカー位置に基づいて自動でルーティングされます。
- ストレート – 同一行上にある場合
- L字型 – 水平 → コーナー → 垂直 → コーナー → 水平
- U字型 –
とfromSide
が同じ(例: 両方toSide
)の場合、矢印はすべてのボックスを越えて伸び、垂直に曲がり戻る"right"
枠線スタイル
single: ┌──────┐ double: ╔══════╗ bold: ┏━━━━━━┓ │ │ ║ ║ ┃ ┃ └──────┘ ╚══════╝ ┗━━━━━━┛ rounded: ╭──────╮ dashed: ┌┄┄┄┄┄┄┐ │ │ │ │ ╰──────╯ └┄┄┄┄┄┄┘
自動レイアウト
ボックスに明示的な
x/y が指定されていない場合、レイアウトエンジンは次のように処理します。
- 各ボックスを内容に合わせてサイズ決定
- 子ノードを親コンテナ内で配置
- 接続フローに基づきトップレベルボックスを水平層へ割り当て
- 各層内でエッジ交差を最小化するよう並べ替え
- 依存グラフのサイクルも処理
手動位置指定と自動配置を混在させることができます。特定ボックスに
x/y/width/height を設定し、残りは自動で決定します。
プログラム的利用
import { render, renderSvg } from 'box-of-rain'; const diagram = { children: [ { id: 'a', children: ['Hello'], border: 'double' }, { id: 'b', children: ['World'], border: 'bold' }, ], connections: [{ from: 'a', to: 'b' }], }; console.log(render(diagram)); // プレーンテキスト const svg = renderSvg(render(diagram)); // SVG 出力
Mermaid から
Mermaid のサポートは別パス (
box-of-rain/mermaid) に分離されており、メインエントリポイントを軽量に保ち、Chevrotain パーサーを引き込まないようにしています。
import { renderMermaid, parseMermaid } from 'box-of-rain/mermaid'; // ワンステップで描画 console.log(renderMermaid(` flowchart LR A[Frontend] --> B[API] --> C[Database] `)); // またはパースしてから描画 import { render } from 'box-of-rain'; const nodeDef = parseMermaid(` sequenceDiagram Alice->>Bob: Hello Bob-->>Alice: Hi `); console.log(render(nodeDef));
入力は実行時に Zod で検証されます。スキーマが不正な場合、
ZodError が投げられ詳細情報が含まれます。
開発
pnpm install pnpm test # テストを実行 pnpm typecheck # 型チェック pnpm build # dist/ にビルド
ライセンス – MIT