@tenjuu99/blog 0.2.56 → 0.2.57

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 CHANGED
@@ -2,96 +2,39 @@
2
2
 
3
3
  静的なブログを作るのにどうして React を必要としてしまったんですか
4
4
 
5
- ## setup
5
+ `@tenjuu99/blog` は、Markdownファイルから静的HTMLサイトを生成する軽量な静的サイトジェネレーターです。
6
6
 
7
- ```
8
- npm i @tenjuu99/blog
9
- ```
7
+ ## クイックスタート
10
8
 
11
- ```
9
+ ```bash
10
+ npm i @tenjuu99/blog
12
11
  npx create-blog
13
12
  npx server
14
13
  ```
15
14
 
16
- `http://localhost:8000` にアクセスできます
17
-
18
- ## 記事を書く
15
+ 詳細な使い方は [チュートリアル](docs/tutorial.md) をご覧ください。
19
16
 
20
- `./src/pages/` 以下にマークダウンファイルを入稿します。
17
+ ## ドキュメント
21
18
 
22
- とりあえずなにも設定せずに、内容は空のままで構わないので `src/pages/test.md` を追加してみます。
23
- `src/pages/test.md` を保存したら、 `http://localhost:8000/test` にアクセスして表示できていることを確認します。
19
+ - **[チュートリアル (docs/tutorial.md)](docs/tutorial.md)** - 初めての方向けの入門ガイド
20
+ - **[技術仕様書 (docs/spec.md)](docs/spec.md)** - 詳細な技術仕様とリファレンス
21
+ - **[開発ガイド (docs/develop.md)](docs/develop.md)** - ライブラリ開発者向けガイド
22
+ - **[CLAUDE.md](CLAUDE.md)** - AI開発アシスタント向け参照ドキュメント
24
23
 
25
- 次に、内容を記述します。
26
- `src/pages/test.md` を次のような内容で保存します。
27
-
28
- ```
29
- # 第一章 人情の碗
24
+ ## 主な特徴
30
25
 
31
- 茶は薬用として始まり後飲料となる。シナにおいては八世紀に高雅な遊びの一つとして詩歌の域に達した。十五世紀に至り日本はこれを高めて一種の審美的宗教、すなわち茶道にまで進めた。茶道は日常生活の俗事の中に存する美しきものを崇拝することに基づく一種の儀式であって、純粋と調和、相互愛の神秘、社会秩序のローマン主義を諄々と教えるものでる。茶道の要義は「不完全なもの」を崇拝するにある。いわゆる人生というこの不可解なもののうちに、何か可能なものを成就しようとするやさしい企てであるから。
32
- ```
33
-
34
- 保存したら、 `http://localhost:8000/test` をリロードして表示を確認しましょう。
35
-
36
- ## タイトルとURL
37
-
38
- ファイル冒頭を `---` でくくると変数を指定できます。
39
-
40
- `src/pages/test.md` の冒頭に次のような変数を設定してみましょう。
41
-
42
- ```markdown
43
- ---
44
- title: 第一章 人情の碗
45
- url: /the_book_of_tea/section_one
46
- ---
47
- ```
26
+ - Markdownファイルベースのコンテンツ管理
27
+ - フロントマターによるメタデータ定義
28
+ - テンプレートエンジン機能(変数展開、条件分岐、スクリプト実行)
29
+ - ホットリロード対応の開発サーバー
30
+ - CSSの自動結合・minify・キャッシュバスト
31
+ - ヘルパー関数による拡張性
32
+ - パッケージシステムによる機能拡張
48
33
 
49
- `http://localhost:8000/test` ではアクセスできず、 `http://localhost:8000/the_book_of_tea/section_one` でアクセスできるようになったとおもいます。
34
+ ## システム要件
50
35
 
51
- ここで定義した変数は、テンプレート内でも利用できます。
52
- 次のように書き換えてみます。
36
+ - Node.js >= 21.7
53
37
 
38
+ ## ライセンス
54
39
 
55
- ```markdown
56
- ---
57
- title: 第一章 人情の碗
58
- url: /the_book_of_tea/section_one
59
- ---
60
-
61
- # {{title}}
62
-
63
- 茶は薬用として始まり後飲料となる。シナにおいては八世紀に高雅な遊びの一つとして詩歌の域に達した。十五世紀に至り日本はこれを高めて一種の審美的宗教、すなわち茶道にまで進めた。茶道は日常生活の俗事の中に存する美しきものを崇拝することに基づく一種の儀式であって、純粋と調和、相互愛の神秘、社会秩序のローマン主義を諄々と教えるものでる。茶道の要義は「不完全なもの」を崇拝するにある。いわゆる人生というこの不可解なもののうちに、何か可能なものを成就しようとするやさしい企てであるから。
64
- ```
65
-
66
- URLの変更は、変数による定義ではなく、ファイルを移動しても問題ありません。
67
- `src/pages/test.md` を `src/pages/the_book_of_tea/section_one.md` としてファイルを移動すれば、変数定義がなくてもこのURLになります。
68
-
69
- ## テンプレート
70
-
71
- タイトルが重複して表示されて鬱陶しいので、テンプレートを編集します。
72
-
73
- `src/template/default.html` を開き、h1 を削除しましょう。
74
-
75
- ```diff
76
- <article class="container">
77
- - <h1>{{TITLE}}</h1>
78
- ```
79
-
80
- ## 設定ファイル
81
-
82
- サイト全体の名称がデフォルトのままでは味気ないので変えましょう。
83
- blog.json を開いて、 `site_name` を変更します。
84
-
85
- ```json
86
- {
87
- "site_name": "茶の本",
88
- "url_base": "http://localhost:8000",
89
- "src_dir": "src",
90
- "dist_dir": "dist",
91
- "distribute_raw": "image",
92
- "helper": "index.js"
93
- }
94
- ```
95
-
96
- 設定ファイルを変更したら、一旦 `CTRL+c` で `npx server` を停止して、もういちど `npx server` を実行します。
97
- ヘッダーが「茶の本」になっていたら設定更新が完了です。
40
+ MIT
@@ -0,0 +1,432 @@
1
+ # @tenjuu99/blog — 開発ガイド
2
+
3
+ このドキュメントは `@tenjuu99/blog` ライブラリを開発する際のガイドです。
4
+
5
+ **注意**: このライブラリを使用してウェブサイトを構築する方法ではなく、ライブラリ自体を開発・改善するための情報を提供します。
6
+
7
+ ## 前提知識
8
+
9
+ 完全な仕様は [spec.md](spec.md) を参照してください。このドキュメントでは開発のコツや実践的な情報のみ記載します。
10
+
11
+ ## 開発環境のセットアップ
12
+
13
+ ```bash
14
+ git clone https://github.com/amashigeseiji/tenjuu99-blog.git
15
+ cd tenjuu99-blog
16
+ npm install
17
+ ```
18
+
19
+ ### 動作確認
20
+
21
+ サンプルプロジェクトで動作確認:
22
+
23
+ ```bash
24
+ npm run dev # 開発サーバー起動 (src-sample/ を使用)
25
+ npm run generate # 静的サイト生成
26
+ ```
27
+
28
+ ## プロジェクト構造
29
+
30
+ ```
31
+ tenjuu99-blog/
32
+ ├── lib/ # コアライブラリ(メインロジック)
33
+ ├── bin/ # CLIコマンド
34
+ ├── src-sample/ # サンプルプロジェクト(動作確認用)
35
+ ├── packages/ # コアパッケージ
36
+ ├── index.js # エントリーポイント
37
+ ├── package.json
38
+ └── README.md
39
+ ```
40
+
41
+ ## lib/ ディレクトリの構成
42
+
43
+ 各モジュールの役割:
44
+
45
+ ### コア処理
46
+
47
+ | ファイル | 役割 |
48
+ |---------|------|
49
+ | `config.js` | 設定管理(blog.json読み込み) |
50
+ | `pageData.js` | フロントマター解析・ページデータ生成 |
51
+ | `indexer.js` | 全ページをスキャンして `allData` オブジェクト生成 |
52
+ | `render.js` | ページレンダリング(Markdown変換、フィルター適用) |
53
+ | `generate.js` | 静的サイト生成プロセス全体の制御 |
54
+ | `distribute.js` | ビルド結果の出力・ファイルコピー |
55
+
56
+ ### テンプレート処理
57
+
58
+ | ファイル | 役割 |
59
+ |---------|------|
60
+ | `applyTemplate.js` | テンプレート読み込み・適用 |
61
+ | `filter.js` | `{if}` 条件分岐、`{script}` 実行 |
62
+ | `includeFilter.js` | `{include()}` ディレクティブ処理 |
63
+ | `replaceVariablesFilter.js` | `{{変数}}` 展開、ヘルパー関数実行 |
64
+
65
+ ### CSS処理
66
+
67
+ | ファイル | 役割 |
68
+ |---------|------|
69
+ | `cssGenerator.js` | CSS結合・minify・キャッシュバスト |
70
+ | `minify.js` | CSS/HTML minify |
71
+
72
+ ### サーバー
73
+
74
+ | ファイル | 役割 |
75
+ |---------|------|
76
+ | `server.js` | HTTPサーバー(開発用) |
77
+ | `tryServer.js` | カスタムサーバーハンドラー |
78
+ | `watcher.js` | ファイル監視 |
79
+ | `contentType.js` | MIMEタイプ判定 |
80
+
81
+ ### ユーティリティ
82
+
83
+ | ファイル | 役割 |
84
+ |---------|------|
85
+ | `dir.js` | ディレクトリパス定義・キャッシュ管理 |
86
+ | `files.js` | 静的ファイル読み込み・キャッシュ |
87
+ | `helper.js` | ユーザー定義ヘルパー関数読み込み |
88
+
89
+ ## 開発ワークフロー
90
+
91
+ ### 1. 機能追加の基本フロー
92
+
93
+ 1. **仕様検討**: 追加する機能の要件を明確化
94
+ 2. **影響範囲調査**: どのモジュールに影響があるか確認
95
+ 3. **テスト作成**: 機能の振る舞いを定義するテストコードを先に書く(TDD推奨)
96
+ 4. **実装**: 該当モジュールを編集してテストをパスさせる
97
+ 5. **動作確認**: `src-sample/` で実際の動作テスト
98
+ 6. **ドキュメント更新**: `docs/spec.md` を更新
99
+
100
+ #### TDD(テスト駆動開発)のワークフロー
101
+
102
+ 新機能の実装時は、以下のTDDサイクルを推奨します:
103
+
104
+ **Red → Green → Refactor サイクル:**
105
+
106
+ 1. **Red(テスト作成)**: 失敗するテストを書く
107
+ ```bash
108
+ # test/ ディレクトリにテストファイルを作成
109
+ # 例: test/category-tree.test.js
110
+ ```
111
+
112
+ 2. **Green(最小限の実装)**: テストがパスする最小限のコードを書く
113
+ ```bash
114
+ # 実装を追加
115
+ # 例: packages/category/helper/category.js
116
+ ```
117
+
118
+ 3. **テスト実行**: すべてのテストが通ることを確認
119
+ ```bash
120
+ npm test
121
+ ```
122
+
123
+ 4. **Refactor(リファクタリング)**: コードを改善(テストは変更しない)
124
+
125
+ **テストファイルの配置:**
126
+
127
+ - `test/` ディレクトリに `*.test.js` 形式で配置
128
+ - Node.js標準のテストランナーを使用(`node --test`)
129
+
130
+ **テストの例:**
131
+
132
+ ```javascript
133
+ // test/example.test.js
134
+ import { test } from 'node:test'
135
+ import assert from 'node:assert'
136
+ import { myFunction } from '../lib/myModule.js'
137
+
138
+ test('機能の説明', () => {
139
+ const result = myFunction('input')
140
+ assert.strictEqual(result, 'expected')
141
+ })
142
+ ```
143
+
144
+ **実装例(カテゴリー機能の場合):**
145
+
146
+ 1. `test/category-tree.test.js` - カテゴリーツリー構築のテスト(12件)
147
+ 2. `packages/category/helper/category.js` - 実装
148
+ 3. `npm test` - テスト実行
149
+ 4. すべてパス後、次のテストを作成
150
+
151
+ このアプローチにより:
152
+ - 仕様が明確になる
153
+ - リグレッションを防止できる
154
+ - リファクタリングが安全になる
155
+
156
+ ### 2. バグ修正のフロー
157
+
158
+ 1. **再現**: `src-sample/` で問題を再現
159
+ 2. **原因特定**: 該当モジュールを特定
160
+ 3. **修正**: コードを修正
161
+ 4. **検証**: 再度 `src-sample/` でテスト
162
+ 5. **リグレッションチェック**: 他の機能に影響がないか確認
163
+
164
+ ## 主要モジュールの開発ガイド
165
+
166
+ ### pageData.js の編集
167
+
168
+ フロントマターの解析ロジックを変更する際:
169
+
170
+ - `parse()`: メタデータ抽出
171
+ - `parseMetaData()`: フロントマターのパース(JSON対応)
172
+ - デフォルト値の変更: `metaDataDefault` オブジェクト
173
+
174
+ **注意点**:
175
+ - `config.` プレフィックスで設定値を参照可能(lib/pageData.js:74-77)
176
+ - 複数行文字列は `"` で開始・終了(lib/pageData.js:80-89)
177
+
178
+ ### filter.js の編集
179
+
180
+ テンプレートエンジンの機能追加:
181
+
182
+ - `replaceIfFilter()`: if文処理
183
+ - `ifConditionEvaluator()`: 条件評価ロジック
184
+ - `replaceScriptFilter()`: SSGスクリプト実行
185
+
186
+ **注意点**:
187
+ - `{if}` と `<if>` 両方の記法をサポート(lib/filter.js:67)
188
+ - `helper` 関数へのアクセスは `helper` オブジェクト経由(lib/filter.js:94)
189
+ - `Promise` 対応済み(lib/filter.js:95-96)
190
+
191
+ ### cssGenerator.js の編集
192
+
193
+ CSS処理の変更:
194
+
195
+ - `cssGenerator()`: CSS結合・minify・ハッシュ生成
196
+ - `applyCss()`: テンプレート内のCSS記法を処理
197
+
198
+ **記法**: `${出力先<<元ファイル1,元ファイル2}` (lib/cssGenerator.js:54)
199
+
200
+ ### watcher.js の編集
201
+
202
+ ファイル監視の変更:
203
+
204
+ - `watchers.push()`: 監視対象追加
205
+ - `prior: true` で優先度の高い監視を登録可能(lib/watcher.js:11)
206
+
207
+ ### dir.js の重要性
208
+
209
+ **最初に読み込まれるモジュール**: 他のモジュールが `import` する前に実行されます。
210
+
211
+ - `cache()` 関数: `.cache/` ディレクトリへのコピー
212
+ - パッケージの統合処理(lib/dir.js:34-51)
213
+ - 自動実行: `import` 時に自動で `cache()` が呼ばれる(lib/dir.js:64)
214
+
215
+ **注意**: `dir.js` の変更は広範囲に影響するため慎重に行ってください。
216
+
217
+ ## パッケージ開発
218
+
219
+ ### パッケージ構成
220
+
221
+ ```
222
+ packages/{パッケージ名}/
223
+ ├── {パッケージ名}.js # ヘルパー関数(必須)
224
+ ├── template/ # テンプレートファイル(任意)
225
+ ├── css/ # スタイルシート(任意)
226
+ └── helper/ # 追加ヘルパー(任意)
227
+ ```
228
+
229
+ ### パッケージの動作
230
+
231
+ 1. `blog.json` の `packages` で有効化
232
+ 2. `dir.js` の `cache()` で `.cache/` にコピー(lib/dir.js:34-51)
233
+ 3. `{パッケージ名}.js` が自動的に `helper` に追加
234
+
235
+ ### 既存パッケージの参考
236
+
237
+ - `packages/breadcrumbs/` - パンくずリスト機能
238
+ - `packages/editor/` - エディター機能
239
+ - `packages/turbolink/` - Turbolink機能
240
+
241
+ ## デバッグ方法
242
+
243
+ ### 1. console.log デバッグ
244
+
245
+ 各モジュールに `console.log()` を追加:
246
+
247
+ ```javascript
248
+ // lib/pageData.js
249
+ const parse = (content, name, ext) => {
250
+ console.log('Parsing:', name, ext)
251
+ // ...
252
+ }
253
+ ```
254
+
255
+ ### 2. ビルドプロセスの確認
256
+
257
+ ```bash
258
+ npm run generate
259
+ ```
260
+
261
+ - 青色: 情報メッセージ(キャッシュ、インデックス)
262
+ - 緑色: 成功(ファイル生成)
263
+ - 赤色: エラー(ファイル削除、404)
264
+
265
+ ログ出力は `node:util` の `styleText()` を使用(lib/generate.js:6, lib/dir.js:3)
266
+
267
+ ### 3. .cache/ ディレクトリの確認
268
+
269
+ ビルド時に `.cache/` ディレクトリが作成されます:
270
+
271
+ ```bash
272
+ ls -la .cache/
273
+ cat .cache/index.json # ページインデックス
274
+ ```
275
+
276
+ ### 4. dist/ の確認
277
+
278
+ 生成されたHTMLを直接確認:
279
+
280
+ ```bash
281
+ cat dist/index.html
282
+ ```
283
+
284
+ ## Claude Code での開発のコツ
285
+
286
+ ### 1. モジュール間の依存関係を把握
287
+
288
+ 各モジュールがどのモジュールをimportしているか確認:
289
+
290
+ ```bash
291
+ grep -r "import.*from.*lib/" lib/
292
+ ```
293
+
294
+ ### 2. 変更影響範囲の特定
295
+
296
+ 特定の関数がどこで使われているか検索:
297
+
298
+ ```bash
299
+ grep -r "関数名" lib/
300
+ ```
301
+
302
+ ### 3. フロー全体の理解
303
+
304
+ ビルドプロセス全体:
305
+ 1. `bin/dev-server` または `bin/server` 実行
306
+ 2. `lib/generate.js` 呼び出し
307
+ 3. `lib/indexer.js` で全ページスキャン
308
+ 4. `lib/render.js` で各ページレンダリング
309
+ 5. `lib/distribute.js` で出力
310
+
311
+ ### 4. エントリーポイントの確認
312
+
313
+ - `index.js`: ライブラリとしてのエクスポート
314
+ - `bin/server`: 本番サーバー
315
+ - `bin/dev-server`: 開発サーバー(ホットリロード)
316
+ - `bin/generate`: 静的サイト生成のみ
317
+ - `bin/new`: 新規プロジェクト作成
318
+
319
+ ## よくある問題と対処法
320
+
321
+ ### 1. キャッシュ問題
322
+
323
+ `.cache/` ディレクトリが古い状態の場合:
324
+
325
+ ```bash
326
+ rm -rf .cache/
327
+ npm run dev
328
+ ```
329
+
330
+ ### 2. テンプレートが反映されない
331
+
332
+ `lib/applyTemplate.js` のキャッシュをクリア:
333
+ - 開発サーバー再起動で自動クリア
334
+
335
+ ### 3. ヘルパー関数が認識されない
336
+
337
+ - `blog.json` の `helper` 設定を確認
338
+ - `lib/helper.js` が正しくimportしているか確認
339
+ - パッケージの場合、`dir.js` でヘルパーが追加されているか確認
340
+
341
+ ### 4. パッケージが有効化されない
342
+
343
+ - `blog.json` の `packages` 設定を確認
344
+ - `packages/{パッケージ名}/{パッケージ名}.js` が存在するか確認
345
+ - `.cache/helper/{パッケージ名}.js` にコピーされているか確認
346
+
347
+ ## 制約事項と設計上の注意
348
+
349
+ ### 1. 同期処理の制約
350
+
351
+ - `includeFilter.js`: 同期処理のため `await` 不可(lib/includeFilter.js:22)
352
+ - `files.js` の `warmUp()` で事前読み込みが必要
353
+
354
+ ### 2. 変数名の小文字化
355
+
356
+ - `replaceVariablesFilter.js`: 変数名を強制的に小文字化(lib/replaceVariablesFilter.js:13)
357
+ - 大文字小文字を区別したい場合は別の方法を検討
358
+
359
+ ### 3. eval() の使用
360
+
361
+ - `pageData.js`: `config.` 参照に `eval()` を使用(lib/pageData.js:76)
362
+ - セキュリティ上の理由で将来的に変更の可能性あり
363
+
364
+ ### 4. フロントマターパーサー
365
+
366
+ - YAML完全互換ではなく独自実装(lib/pageData.js:61-93)
367
+ - 配列・オブジェクトはJSON形式必須
368
+
369
+ ## テストについて
370
+
371
+ ### テストフレームワーク
372
+
373
+ **Node.js標準の `node:test` を使用** - 追加の依存関係なし
374
+
375
+ ```bash
376
+ npm test # 全テスト実行
377
+ npm run test:watch # ウォッチモード
378
+ ```
379
+
380
+ ### テストの追加方法
381
+
382
+ 新しいテストを追加する場合:
383
+
384
+ ```javascript
385
+ // test/example.test.js
386
+ import { test } from 'node:test';
387
+ import assert from 'node:assert';
388
+
389
+ test('テストの説明', () => {
390
+ assert.strictEqual(actual, expected);
391
+ });
392
+ ```
393
+
394
+ ### 統合テスト
395
+
396
+ ユニットテストに加えて、`src-sample/` での手動テストも推奨します。
397
+
398
+ ## コントリビューション
399
+
400
+ ### コーディングスタイル
401
+
402
+ - ES Modules使用(`import/export`)
403
+ - `"use strict"` は一部モジュールで使用
404
+ - JSDocコメントは部分的に記載
405
+
406
+ ### 変更を加える際の確認事項
407
+
408
+ 1. `src-sample/` で動作確認
409
+ 2. 既存機能が壊れていないか確認
410
+ 3. `docs/spec.md` を更新
411
+ 4. `README.md` が必要に応じて更新
412
+
413
+ ## パフォーマンス最適化
414
+
415
+ ### 現在の最適化
416
+
417
+ 1. **テンプレートキャッシュ**: `lib/applyTemplate.js` と `lib/files.js`
418
+ 2. **CSSキャッシュバスト**: MD5ハッシュで変更検知(lib/cssGenerator.js:32)
419
+ 3. **差分ビルド**: 開発サーバーでは変更ページのみ再生成
420
+
421
+ ### 最適化の余地
422
+
423
+ - ページデータのキャッシュ
424
+ - 並列処理の導入
425
+ - インクリメンタルビルド
426
+
427
+ ## 参考リソース
428
+
429
+ - [spec.md](spec.md) — 完全な技術仕様
430
+ - [README.md](../README.md) — ユーザー向けガイド
431
+ - GitHub Issues — バグ報告・機能要望
432
+ - `src-sample/` — サンプルプロジェクト(動作確認用)