@hirokisakabe/pom 0.1.5 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +104 -51
- package/package.json +10 -2
package/README.md
CHANGED
|
@@ -1,11 +1,60 @@
|
|
|
1
1
|
# pom
|
|
2
2
|
|
|
3
|
-
**pom (PowerPoint Object Model)** は、PowerPoint プレゼンテーション(pptx)を TypeScript
|
|
3
|
+
**pom (PowerPoint Object Model)** は、PowerPoint プレゼンテーション(pptx)を TypeScript で宣言的に記述するためのライブラリです。生成 AI に出力させた POM 形式の JSON を、PowerPoint ファイルに変換するユースケースを想定しています。
|
|
4
|
+
|
|
5
|
+
## 目次
|
|
6
|
+
|
|
7
|
+
- [インストール](#インストール)
|
|
8
|
+
- [クイックスタート](#クイックスタート)
|
|
9
|
+
- [特徴](#特徴)
|
|
10
|
+
- [ノード](#ノード)
|
|
11
|
+
- [マスタースライド](#マスタースライド)
|
|
12
|
+
- [LLM 連携](#llm-連携)
|
|
13
|
+
- [ライセンス](#ライセンス)
|
|
14
|
+
|
|
15
|
+
## インストール
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install @hirokisakabe/pom
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## クイックスタート
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
import { buildPptx, POMNode } from "@hirokisakabe/pom";
|
|
25
|
+
|
|
26
|
+
const slide: POMNode = {
|
|
27
|
+
type: "vstack",
|
|
28
|
+
w: "100%",
|
|
29
|
+
h: "max",
|
|
30
|
+
padding: 48,
|
|
31
|
+
gap: 24,
|
|
32
|
+
alignItems: "start",
|
|
33
|
+
children: [
|
|
34
|
+
{
|
|
35
|
+
type: "text",
|
|
36
|
+
text: "プレゼンテーションタイトル",
|
|
37
|
+
fontPx: 48,
|
|
38
|
+
bold: true,
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
type: "text",
|
|
42
|
+
text: "サブタイトル",
|
|
43
|
+
fontPx: 24,
|
|
44
|
+
color: "666666",
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const pptx = await buildPptx([slide], { w: 1280, h: 720 });
|
|
50
|
+
await pptx.writeFile({ fileName: "presentation.pptx" });
|
|
51
|
+
```
|
|
4
52
|
|
|
5
53
|
## 特徴
|
|
6
54
|
|
|
7
55
|
- **型安全**: TypeScript による厳密な型定義
|
|
8
56
|
- **宣言的**: JSON ライクなオブジェクトでスライドを記述
|
|
57
|
+
- **PowerPoint ファースト**: Shape 機能をネイティブサポート
|
|
9
58
|
- **柔軟なレイアウト**: VStack/HStack/Box による自動レイアウト
|
|
10
59
|
- **ピクセル単位**: 直感的なピクセル単位での指定(内部でインチに変換)
|
|
11
60
|
- **マスタースライド**: 全ページ共通のヘッダー・フッター・ページ番号を自動挿入
|
|
@@ -118,7 +167,54 @@
|
|
|
118
167
|
- `rows` の `height` を省略すると `defaultRowHeight`(未指定なら32px)が適用されます。
|
|
119
168
|
- セル背景やフォント装飾を `cells` の各要素で個別に指定できます。
|
|
120
169
|
|
|
121
|
-
#### 4.
|
|
170
|
+
#### 4. Shape
|
|
171
|
+
|
|
172
|
+
図形を描画するノード。テキスト付き/なしで異なる表現が可能で、複雑なビジュアル効果をサポートしています。
|
|
173
|
+
|
|
174
|
+
```typescript
|
|
175
|
+
{
|
|
176
|
+
type: "shape";
|
|
177
|
+
shapeType: PptxGenJS.SHAPE_NAME; // 例: "roundRect", "ellipse", "cloud", "star5" など
|
|
178
|
+
text?: string; // 図形内に表示するテキスト(オプション)
|
|
179
|
+
fill?: {
|
|
180
|
+
color?: string;
|
|
181
|
+
transparency?: number;
|
|
182
|
+
};
|
|
183
|
+
line?: {
|
|
184
|
+
color?: string;
|
|
185
|
+
width?: number;
|
|
186
|
+
dashType?: "solid" | "dash" | "dashDot" | "lgDash" | "lgDashDot" | "lgDashDotDot" | "sysDash" | "sysDot";
|
|
187
|
+
};
|
|
188
|
+
shadow?: {
|
|
189
|
+
type: "outer" | "inner";
|
|
190
|
+
opacity?: number;
|
|
191
|
+
blur?: number;
|
|
192
|
+
angle?: number;
|
|
193
|
+
offset?: number;
|
|
194
|
+
color?: string;
|
|
195
|
+
};
|
|
196
|
+
fontPx?: number;
|
|
197
|
+
fontColor?: string;
|
|
198
|
+
alignText?: "left" | "center" | "right";
|
|
199
|
+
|
|
200
|
+
// 共通プロパティ
|
|
201
|
+
w?: number | "max" | `${number}%`;
|
|
202
|
+
h?: number | "max" | `${number}%`;
|
|
203
|
+
...
|
|
204
|
+
}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
**主な図形タイプの例:**
|
|
208
|
+
|
|
209
|
+
- `roundRect`: 角丸長方形(タイトルボックス、カテゴリ表示)
|
|
210
|
+
- `ellipse`: 楕円/円(ステップ番号、バッジ)
|
|
211
|
+
- `cloud`: 雲型(コメント、重要ポイント)
|
|
212
|
+
- `wedgeRectCallout`: 矢印付き吹き出し(注記)
|
|
213
|
+
- `cloudCallout`: 雲吹き出し(コメント)
|
|
214
|
+
- `star5`: 5つ星(強調、デコレーション)
|
|
215
|
+
- `downArrow`: 下矢印(フロー図)
|
|
216
|
+
|
|
217
|
+
#### 5. Box
|
|
122
218
|
|
|
123
219
|
単一の子要素をラップする汎用コンテナ。
|
|
124
220
|
|
|
@@ -137,7 +233,7 @@
|
|
|
137
233
|
}
|
|
138
234
|
```
|
|
139
235
|
|
|
140
|
-
####
|
|
236
|
+
#### 6. VStack
|
|
141
237
|
|
|
142
238
|
子要素を **縦方向** に並べる。
|
|
143
239
|
|
|
@@ -156,7 +252,7 @@
|
|
|
156
252
|
}
|
|
157
253
|
```
|
|
158
254
|
|
|
159
|
-
####
|
|
255
|
+
#### 7. HStack
|
|
160
256
|
|
|
161
257
|
子要素を **横方向** に並べる。
|
|
162
258
|
|
|
@@ -175,53 +271,6 @@
|
|
|
175
271
|
}
|
|
176
272
|
```
|
|
177
273
|
|
|
178
|
-
#### 7. Shape
|
|
179
|
-
|
|
180
|
-
図形を描画するノード。テキスト付き/なしで異なる表現が可能で、複雑なビジュアル効果をサポートしています。
|
|
181
|
-
|
|
182
|
-
```typescript
|
|
183
|
-
{
|
|
184
|
-
type: "shape";
|
|
185
|
-
shapeType: PptxGenJS.SHAPE_NAME; // 例: "roundRect", "ellipse", "cloud", "star5" など
|
|
186
|
-
text?: string; // 図形内に表示するテキスト(オプション)
|
|
187
|
-
fill?: {
|
|
188
|
-
color?: string;
|
|
189
|
-
transparency?: number;
|
|
190
|
-
};
|
|
191
|
-
line?: {
|
|
192
|
-
color?: string;
|
|
193
|
-
width?: number;
|
|
194
|
-
dashType?: "solid" | "dash" | "dashDot" | "lgDash" | "lgDashDot" | "lgDashDotDot" | "sysDash" | "sysDot";
|
|
195
|
-
};
|
|
196
|
-
shadow?: {
|
|
197
|
-
type: "outer" | "inner";
|
|
198
|
-
opacity?: number;
|
|
199
|
-
blur?: number;
|
|
200
|
-
angle?: number;
|
|
201
|
-
offset?: number;
|
|
202
|
-
color?: string;
|
|
203
|
-
};
|
|
204
|
-
fontPx?: number;
|
|
205
|
-
fontColor?: string;
|
|
206
|
-
alignText?: "left" | "center" | "right";
|
|
207
|
-
|
|
208
|
-
// 共通プロパティ
|
|
209
|
-
w?: number | "max" | `${number}%`;
|
|
210
|
-
h?: number | "max" | `${number}%`;
|
|
211
|
-
...
|
|
212
|
-
}
|
|
213
|
-
```
|
|
214
|
-
|
|
215
|
-
**主な図形タイプの例:**
|
|
216
|
-
|
|
217
|
-
- `roundRect`: 角丸長方形(タイトルボックス、カテゴリ表示)
|
|
218
|
-
- `ellipse`: 楕円/円(ステップ番号、バッジ)
|
|
219
|
-
- `cloud`: 雲型(コメント、重要ポイント)
|
|
220
|
-
- `wedgeRectCallout`: 矢印付き吹き出し(注記)
|
|
221
|
-
- `cloudCallout`: 雲吹き出し(コメント)
|
|
222
|
-
- `star5`: 5つ星(強調、デコレーション)
|
|
223
|
-
- `downArrow`: 下矢印(フロー図)
|
|
224
|
-
|
|
225
274
|
## マスタースライド
|
|
226
275
|
|
|
227
276
|
全ページに共通のヘッダー・フッター・ページ番号を自動挿入できます。
|
|
@@ -399,3 +448,7 @@ await pptx.writeFile({ fileName: "sales-report.pptx" });
|
|
|
399
448
|
| `inputVStackNodeSchema` | VStackノード用 |
|
|
400
449
|
| `inputHStackNodeSchema` | HStackノード用 |
|
|
401
450
|
| `inputMasterSlideOptionsSchema` | マスタースライド設定用 |
|
|
451
|
+
|
|
452
|
+
## ライセンス
|
|
453
|
+
|
|
454
|
+
MIT
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hirokisakabe/pom",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.6",
|
|
4
4
|
"description": "PowerPoint Object Model - A declarative TypeScript library for creating PowerPoint presentations",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -35,16 +35,24 @@
|
|
|
35
35
|
"typecheck": "tsc --noEmit",
|
|
36
36
|
"test": "vitest",
|
|
37
37
|
"test:ui": "vitest --ui",
|
|
38
|
-
"test:run": "vitest run"
|
|
38
|
+
"test:run": "vitest run",
|
|
39
|
+
"vrt": "tsx vrt/runVrt.ts",
|
|
40
|
+
"vrt:update": "tsx vrt/runVrt.ts --update",
|
|
41
|
+
"vrt:docker": "docker compose run --rm vrt",
|
|
42
|
+
"vrt:docker:update": "docker compose run --rm vrt-update"
|
|
39
43
|
},
|
|
40
44
|
"devDependencies": {
|
|
41
45
|
"@eslint/js": "^9.39.1",
|
|
42
46
|
"@types/image-size": "0.7.0",
|
|
47
|
+
"@types/pngjs": "6.0.5",
|
|
43
48
|
"@vitest/ui": "^4.0.8",
|
|
44
49
|
"eslint": "^9.39.1",
|
|
45
50
|
"globals": "^16.5.0",
|
|
46
51
|
"jiti": "2.6.1",
|
|
52
|
+
"pixelmatch": "7.1.0",
|
|
53
|
+
"pngjs": "7.0.0",
|
|
47
54
|
"prettier": "3.6.2",
|
|
55
|
+
"tsx": "4.21.0",
|
|
48
56
|
"typescript": "5.9.3",
|
|
49
57
|
"typescript-eslint": "^8.47.0",
|
|
50
58
|
"vitest": "^4.0.8"
|