@riebeckite/plugin-permalink 0.0.31 → 0.0.33

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
@@ -872,7 +872,7 @@ The exact output format may vary between CLI versions.
872
872
  ### Functions
873
873
 
874
874
  - `permalink(options?)`
875
- - `permalinkPlugin(options?)`
875
+ - `permalink(options?)`
876
876
 
877
877
  Both create the Permalink Plugin.
878
878
 
package/README_ja.md CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
  <!-- Generated from docs/docs/plugins/permalink.ja.md. Edit the canonical documentation in docs/docs/plugins and run `pnpm docs:sync`. -->
4
4
 
5
- Riebeckite の記事に対して、公開 URL(permalink)を決定するプラグインです。
5
+ Riebeckite のコンテンツに、安定した公開 URL(permalink)を与えるプラグインです。
6
6
 
7
- ファイル構造をそのまま URL に使う代わりに、frontmatter の ID、ファイルパスから導出した ID、独自の resolver などを使って公開 URL を構築できます。
7
+ 公開 URL をファイルの配置に直接結び付けず、frontmatter の ID、ファイルパスから決定論的に導いた ID、独自の resolver などから URL を組み立てられます。
8
8
 
9
- 旧 URL から canonical URL へのリダイレクトも同じ設定から登録できます。
9
+ 旧 URL から canonical URL へのリダイレクトも、同じ設定で登録できます。
10
10
 
11
11
  [English](./README.md)
12
12
 
@@ -38,7 +38,7 @@ export default defineConfig({
38
38
  });
39
39
  ```
40
40
 
41
- 例えば次の記事があるとします。
41
+ 次のコンテンツがあるとします。
42
42
 
43
43
  ```md
44
44
  ---
@@ -48,39 +48,39 @@ id: hello-world
48
48
  # Hello
49
49
  ```
50
50
 
51
- `path.mode: "flat"`、`path.prefix: "/n"` なら公開 URL は次のようになります。
51
+ `path.mode: "flat"` と `path.prefix: "/n"` を指定すると、公開 URL は次のようになります。
52
52
 
53
53
  ```text
54
54
  /n/hello-world
55
55
  ```
56
56
 
57
- frontmatter に ID がない場合も、既定の `frontmatter-or-hash` ではファイルパスから決定論的な ID を生成できます。
57
+ frontmatter に ID がないコンテンツにも、既定の `frontmatter-or-hash` ならファイルパスから決定論的な ID が付きます。
58
58
 
59
- そのため、既存の Obsidian Vault の全記事へ `id` を追加する必要はありません。
59
+ そのため、既存の Obsidian Vault の全ファイルに `id` を追加する必要はありません。
60
60
 
61
61
  ---
62
62
 
63
- ## 仕組み
63
+ ## URL が決まるまで
64
64
 
65
- `permalink()` はビルド時の `resolveContentLocations` フックを利用して、各記事の公開位置を解決します。
65
+ `permalink()` は、ビルド時に `resolveContentLocations` フックを使って各コンテンツの公開位置を解決します。
66
66
 
67
- 概念的には次の流れです。
67
+ 処理の流れは次のとおりです。
68
68
 
69
69
  ```text
70
- Content
70
+ コンテンツ
71
71
  │
72
72
  ├─ frontmatter
73
73
  ├─ slug
74
- └─ source path
74
+ └─ ソースパス
75
75
  │
76
76
  ▼
77
77
  @riebeckite/plugin-permalink
78
78
  │
79
- ├─ resolve ID
80
- ├─ resolve path
81
- ├─ normalize
82
- ├─ validate
83
- └─ redirects
79
+ ├─ ID を解決
80
+ ├─ パスを解決
81
+ ├─ 正規化
82
+ ├─ 検証
83
+ └─ リダイレクト
84
84
  │
85
85
  ▼
86
86
  ContentPublicLocation
@@ -90,19 +90,19 @@ ContentPublicLocation
90
90
  └─ metadata
91
91
  ```
92
92
 
93
- Core は返された `permalink` を canonical URL として扱います。
93
+ Core は、解決された `permalink` を canonical URL として扱います。
94
94
 
95
- その URL は、Wikilink、Backlinks、Search、Content Graph などから共通して参照されます。SEO canonical、Sitemap、RSS / Atom / JSON Feed も同じ URL を使います。
95
+ 同じ URL が、Wikilink、バックリンク、検索、コンテンツグラフなどから共通して参照されます。SEO の canonical、サイトマップ、RSS / Atom / JSON Feed も同じ URL を使います。
96
96
 
97
- Permalink Plugin を使用しない場合も、Core の resolver `resolveDefaultContentLocation` が URL を解決します。`index` は `/`、それ以外は `/{slug}` です。これはフォールバックではなく、Core の標準方針です。
97
+ このプラグインを使わなくても、Core の resolver `resolveDefaultContentLocation` がすべての URL を解決します。`index` は `/`、それ以外は `/{slug}` です。これはフォールバックではなく、Core の正式な方針です。
98
98
 
99
99
  ---
100
100
 
101
- ## Frontmatter
101
+ ## frontmatter で指定する
102
102
 
103
- ### ID
103
+ ### ID を指定する
104
104
 
105
- 既定では `id` を読み取ります。
105
+ 既定では `id` フィールドを読みます。
106
106
 
107
107
  ```md
108
108
  ---
@@ -124,11 +124,11 @@ permalink-id: hello-world
124
124
  ---
125
125
  ```
126
126
 
127
- `frontmatter` が指定するのはトップレベルのフィールドです。
127
+ `frontmatter` が指すのは、トップレベルの frontmatter フィールドです。
128
128
 
129
- ### Permalink override
129
+ ### permalink を直接指定する
130
130
 
131
- 特定の記事だけ URL を直接指定できます。
131
+ 特定のコンテンツだけ、公開 URL を直接指定できます。
132
132
 
133
133
  ```md
134
134
  ---
@@ -137,9 +137,9 @@ permalink: /about
137
137
  ---
138
138
  ```
139
139
 
140
- この場合、通常の ID からのパス生成より `/about` が優先されます。
140
+ この場合、ID からの通常のパス生成より `/about` が優先されます。
141
141
 
142
- `id` と公開 URL は別の概念なので、
142
+ `id` と公開 URL は別の概念であり、次のように扱います。
143
143
 
144
144
  ```text
145
145
  ID
@@ -149,9 +149,7 @@ Canonical URL
149
149
  /about
150
150
  ```
151
151
 
152
- として扱われます。
153
-
154
- フィールド名は変更できます。
152
+ フィールド名も変更できます。
155
153
 
156
154
  ```ts
157
155
  permalink({
@@ -161,9 +159,9 @@ permalink({
161
159
  });
162
160
  ```
163
161
 
164
- ### Redirects
162
+ ### 旧 URL からのリダイレクトを指定する
165
163
 
166
- 旧 URL も frontmatter から指定できます。
164
+ 旧 URL も frontmatter で指定できます。
167
165
 
168
166
  ```md
169
167
  ---
@@ -174,13 +172,13 @@ redirect_from:
174
172
  ---
175
173
  ```
176
174
 
177
- 例えば canonical URL が、
175
+ canonical URL が
178
176
 
179
177
  ```text
180
178
  /n/hello-world
181
179
  ```
182
180
 
183
- なら、
181
+ の場合、旧 URL は次のようにリダイレクトされます。
184
182
 
185
183
  ```text
186
184
  /posts/hello
@@ -192,8 +190,6 @@ redirect_from:
192
190
  /n/hello-world
193
191
  ```
194
192
 
195
- として扱われます。
196
-
197
193
  設定は次のとおりです。
198
194
 
199
195
  ```ts
@@ -214,13 +210,13 @@ permalink({
214
210
  | オプション | 型 | 既定値 | 内容 |
215
211
  | --- | --- | --- | --- |
216
212
  | `frontmatter` | `string` | `"id"` | ID として読むトップレベルの frontmatter フィールド |
217
- | `id.strategy` | `"frontmatter" \| "hash" \| "frontmatter-or-hash"` | `"frontmatter-or-hash"` | ID の決定方法 |
218
- | `id.length` | `number` | `12` | ハッシュ ID の文字数(6〜43) |
219
- | `path.mode` | `"flat" \| "preserve" \| "append"` | `"flat"` | ID を公開 URL へ配置する方式 |
220
- | `path.prefix` | `string` | `"/n"` | URL prefix。`"/"` または空文字なら prefix なし |
221
- | `path.trailingSlash` | `boolean` | `false` | canonical URL 末尾へ `/` を付ける |
222
- | `index.collapse` | `boolean` | `true` | `index` ファイルのパスを collapse する |
223
- | `override.frontmatter` | `string` | `"permalink"` | URL を直接指定する frontmatter フィールド |
213
+ | `id.strategy` | `"frontmatter" \| "hash" \| "frontmatter-or-hash"` | `"frontmatter-or-hash"` | ID の解決方法 |
214
+ | `id.length` | `number` | `12` | パス由来ハッシュ ID の長さ(6〜43) |
215
+ | `path.mode` | `"flat" \| "preserve" \| "append"` | `"flat"` | 解決した ID を公開 URL のどこに置くか |
216
+ | `path.prefix` | `string` | `"/n"` | URL の接頭辞。`"/"` または空文字なら接頭辞なし |
217
+ | `path.trailingSlash` | `boolean` | `false` | canonical URL の末尾に `/` を付けるか |
218
+ | `index.collapse` | `boolean` | `true` | `index` セグメントを畳むか |
219
+ | `override.frontmatter` | `string` | `"permalink"` | URL を直接上書きする frontmatter フィールド |
224
220
  | `redirects.frontmatter` | `string` | `"redirect_from"` | 旧 URL を指定する frontmatter フィールド |
225
221
  | `redirects.status` | `301 \| 302 \| 307 \| 308` | `308` | リダイレクトの HTTP ステータス |
226
222
  | `resolveId` | `(content) => string` | なし | ID の解決を完全にカスタマイズする |
@@ -228,11 +224,11 @@ permalink({
228
224
 
229
225
  ---
230
226
 
231
- ## ID strategy
227
+ ## ID の解決方法(`id.strategy`)
232
228
 
233
229
  ### `frontmatter`
234
230
 
235
- frontmatter から ID を取得します。
231
+ `frontmatter` フィールドの値を ID にします。
236
232
 
237
233
  ```ts
238
234
  permalink({
@@ -243,9 +239,9 @@ permalink({
243
239
  });
244
240
  ```
245
241
 
246
- ID が存在しない記事はビルドエラーになります。
242
+ すべてのコンテンツがこのフィールドを持つ必要があります。ID がないコンテンツがあると、ビルドはエラーになります。
247
243
 
248
- 永続的な URL を明示的に管理したい場合に向いています。
244
+ URL の同一性を明示的に管理したい場合に向いています。
249
245
 
250
246
  ```md
251
247
  ---
@@ -253,13 +249,13 @@ id: article-123
253
249
  ---
254
250
  ```
255
251
 
256
- ファイルを rename/move しても、`flat` の mode なら ID および URL を維持できます。
252
+ ソースファイルを名前変更したり移動したりしても、`flat` モードなら ID と公開 URL は変わりません。
257
253
 
258
254
  ---
259
255
 
260
256
  ### `hash`
261
257
 
262
- frontmatter を使用せず、ファイルパスから ID を導出します。
258
+ frontmatter の ID を使わず、ソースファイルのパスから ID を導出します。
263
259
 
264
260
  ```ts
265
261
  permalink({
@@ -270,21 +266,19 @@ permalink({
270
266
  });
271
267
  ```
272
268
 
273
- 入力 path は、
269
+ 入力となるパスは、次の正規化を経て SHA-256 でハッシュ化されます。
274
270
 
275
271
  - `\` → `/`
276
- - 先頭 `/` の除去
277
- - Unicode NFC 正規化
272
+ - 先頭の `/` を除去
273
+ - Unicode NFC で正規化
278
274
 
279
- を行った上で SHA-256 へ渡されます。
280
-
281
- 結果を base64url として表現し、その先頭 `id.length` 文字を ID として利用します。
275
+ ハッシュは base64url として表現し、先頭の `id.length` 文字を ID に使います。
282
276
 
283
277
  ```text
284
278
  notes/flutter/riverpod.md
285
279
  │
286
280
  ▼
287
- normalized path
281
+ 正規化したパス
288
282
  │
289
283
  ▼
290
284
  SHA-256
@@ -296,15 +290,15 @@ base64url
296
290
  K7m3Qp8d...
297
291
  ```
298
292
 
299
- 同じ path なら OS や build 環境が異なっても同じ ID になります。
293
+ 同じパスなら、OS やビルド環境が違っても同じ ID になります。
300
294
 
301
- ただし、path が入力なので rename/move すると ID も変わります。
295
+ ただし、パスが入力になるため、名前変更や移動をすると ID も変わります。
302
296
 
303
297
  ---
304
298
 
305
299
  ### `frontmatter-or-hash`
306
300
 
307
- 既定値です。
301
+ これが既定の strategy です。
308
302
 
309
303
  ```ts
310
304
  permalink({
@@ -315,54 +309,50 @@ permalink({
315
309
  });
316
310
  ```
317
311
 
318
- 解決順序は、
312
+ 解決の順序は次のとおりです。
319
313
 
320
314
  ```text
321
- frontmatter ID あり
315
+ frontmatter に ID がある
322
316
  ↓
323
- frontmatter ID
317
+ その ID を使う
324
318
 
325
- frontmatter ID なし
319
+ frontmatter に ID がない
326
320
  ↓
327
- path-derived hash
321
+ パスから ID を導出する
328
322
  ```
329
323
 
330
- この順序で解決します。
331
-
332
- 既存 Obsidian Vault を変更せず利用しながら、重要な記事だけ永続 ID を与えたい場合に向いています。
324
+ 既存の Obsidian Vault を変更せずに使いながら、重要なコンテンツだけに明示的な永続 ID を与えたい場合に向いています。
333
325
 
334
326
  ---
335
327
 
336
- ## ID メタデータ
328
+ ## ID の出所を確認する
337
329
 
338
- 解決された ID の由来はメタデータから確認できます。
330
+ 解決された ID がどこから来たかは、メタデータで確認できます。
339
331
 
340
332
  | `metadata.idSource` | 意味 |
341
333
  | --- | --- |
342
- | `frontmatter` | frontmatter から取得 |
343
- | `derived` | path hash から導出 |
344
- | `custom` | `resolveId` から取得 |
334
+ | `frontmatter` | frontmatter のフィールドから取得 |
335
+ | `derived` | ソースパスのハッシュから導出 |
336
+ | `custom` | `resolveId` が返した値 |
345
337
 
346
- 手動の `permalink` override は URL を変更しますが、同一性は消しません。frontmatter の ID があれば引き続き記録されます。明示的な ID がない場合のみメタデータは付与されません。override から暗黙の `/{id}` URL を生成することはありません。
338
+ 手動の `permalink` による上書きは URL を変えますが、同一性は失われません。frontmatter に ID があれば、その ID は引き続き記録されます(`metadata.idSource` は `frontmatter`)。メタデータが付かないのは、明示的な ID が存在しない場合だけです。上書きによって `/{id}` という URL が暗黙に生成されることはありません。
347
339
 
348
340
  ---
349
341
 
350
- ## URL path mode
342
+ ## URL への配置方法(`path.mode`)
351
343
 
352
- ID の決定方法と、URL の構築方法は独立しています。
344
+ ID の解決と URL の組み立ては、別々に設定できます。
353
345
 
354
- 例えば、
346
+ 次の例で考えます。
355
347
 
356
348
  ```text
357
- source:
349
+ ソース:
358
350
  notes/flutter/hello.md
359
351
 
360
352
  ID:
361
353
  hello-world
362
354
  ```
363
355
 
364
- とします。
365
-
366
356
  ### `flat`
367
357
 
368
358
  ```ts
@@ -378,15 +368,15 @@ path: {
378
368
  /n/hello-world
379
369
  ```
380
370
 
381
- ファイルシステムのディレクトリ構造を URL へ含めません。
371
+ ファイルシステムのディレクトリ構造は URL に現れません。
382
372
 
383
- 読み取れない URL を作りたい場合に適しています。
373
+ ファイルの場所を URL から隠したい場合に適しています。
384
374
 
385
375
  ---
386
376
 
387
377
  ### `preserve`
388
378
 
389
- ディレクトリ構造を残しつつ ID を配置します。
379
+ ソースのディレクトリ構造を残したまま、ID を URL に配置します。
390
380
 
391
381
  ```ts
392
382
  path: {
@@ -395,7 +385,7 @@ path: {
395
385
  }
396
386
  ```
397
387
 
398
- 例を示します。
388
+ 例は次のとおりです。
399
389
 
400
390
  ```text
401
391
  notes/flutter/hello.md
@@ -409,7 +399,7 @@ notes/flutter/hello.md
409
399
 
410
400
  ### `append`
411
401
 
412
- `append` も選べます。
402
+ `append` も指定できます。
413
403
 
414
404
  ```ts
415
405
  path: {
@@ -417,15 +407,15 @@ path: {
417
407
  }
418
408
  ```
419
409
 
420
- 現在の実装では `append` は `preserve` と同じパスを返します。
410
+ 現在の実装では、`append` は `preserve` と同じパスを返します。
421
411
 
422
- 将来的に別の意味を持たせる場合に備えて mode として分離されています。`append` 固有の挙動を期待する場合は、現在の実装仕様に注意してください。
412
+ 将来、別の意味を持たせられるようにモードとして分けています。現行バージョンで `append` に `preserve` と異なる挙動を期待しないでください。
423
413
 
424
414
  ---
425
415
 
426
- ## index ファイル
416
+ ## index ファイルの扱い
427
417
 
428
- `index.collapse` によって `index.md` の扱いを変更できます。
418
+ `index.collapse` で `index.md` の扱いを変えられます。
429
419
 
430
420
  ```ts
431
421
  index: {
@@ -433,13 +423,13 @@ index: {
433
423
  }
434
424
  ```
435
425
 
436
- 例えば、
426
+ 例として、
437
427
 
438
428
  ```text
439
429
  notes/flutter/index.md
440
430
  ```
441
431
 
442
- ID が `hello-world` の場合、URL は次のとおりです。
432
+ ID が `hello-world` の場合、URL は次のようになります。
443
433
 
444
434
  | 設定 | URL |
445
435
  | --- | --- |
@@ -447,19 +437,19 @@ ID が `hello-world` の場合、URL は次のとおりです。
447
437
  | `preserve` + collapse | `/n/notes/flutter/hello-world` |
448
438
  | `preserve` + `collapse` なし | `/n/notes/flutter/index/hello-world` |
449
439
 
450
- `flat` ではファイルシステム構造自体を使わないため、`collapse` の影響を受けません。
440
+ `flat` はファイルシステムの構造を使わないため、`collapse` の影響を受けません。
451
441
 
452
442
  ---
453
443
 
454
- ## 上級者向け: カスタム resolver
444
+ ## 上級: 独自の resolver を書く
455
445
 
456
- 組み込みの strategy では表現できない URL 設計なら、`resolveId` と `resolvePath` を利用できます。
446
+ 組み込みの strategy では表せない URL 設計には、`resolveId` と `resolvePath` を使えます。
457
447
 
458
- Permalink Plugin の通常設定で十分な場合は、カスタム resolver を使う必要はありません。
448
+ 通常のオプションで足りるなら、カスタム resolver は不要です。プロジェクト固有の ID や URL の設計に使います。
459
449
 
460
450
  ### `resolveId`
461
451
 
462
- 記事から独自 ID を生成します。
452
+ `resolveId` を使うと、コンテンツの ID を自分で計算できます。
463
453
 
464
454
  ```ts
465
455
  permalink({
@@ -474,29 +464,27 @@ permalink({
474
464
  });
475
465
  ```
476
466
 
477
- 概念的には、
467
+ 概念的な流れは次のとおりです。
478
468
 
479
469
  ```text
480
- Content
470
+ コンテンツ
481
471
  ↓
482
472
  resolveId(content)
483
473
  ↓
484
474
  ID
485
475
  ↓
486
- built-in path resolver
476
+ 組み込みのパス resolver
487
477
  ↓
488
478
  canonical URL
489
479
  ```
490
480
 
491
- となります。
481
+ `resolveId` の戻り値も、組み込みの ID と同じ検証を通ります。
492
482
 
493
- `resolveId` の戻り値も組み込み ID と同じ検証を通ります。
483
+ つまり、カスタム resolver はプラグインの通常の検証を迂回できません。
494
484
 
495
- 不正な ID を返しても検証を通りません。
485
+ #### 例: 独自の frontmatter から ID を作る
496
486
 
497
- #### 例: frontmatter を組み合わせる
498
-
499
- 例えば、プロジェクト固有の frontmatter から ID を作る場合は次のとおりです。
487
+ プロジェクト固有の frontmatter から ID を作る例です。
500
488
 
501
489
  ```md
502
490
  ---
@@ -535,13 +523,13 @@ permalink({
535
523
  /articles/flutter-42
536
524
  ```
537
525
 
538
- カスタム resolver 内で扱う frontmatter の検証は resolver 側の責務です。
526
+ カスタム resolver が読むプロジェクト固有の frontmatter の検証は、resolver の責任です。
539
527
 
540
528
  ---
541
529
 
542
- ## 上級者向け: `resolvePath`
530
+ ## 上級: `resolvePath` で URL を組み立てる
543
531
 
544
- `resolvePath` を使うと、ID を URL のどこへ配置するかを完全に制御できます。
532
+ `resolvePath` を使えば、解決した ID を URL のどこに置くかを完全に制御できます。
545
533
 
546
534
  ```ts
547
535
  permalink({
@@ -563,24 +551,24 @@ permalink({
563
551
  /articles/hello-world
564
552
  ```
565
553
 
566
- `resolvePath` はサイト内の絶対パスを返してください。
554
+ `resolvePath` は、サイト内の絶対パスを返してください。
567
555
 
568
556
  ```text
569
- /articles/hello OK
570
- /articles/hello/ OK
571
- articles/hello NG
572
- https://example.com NG
557
+ /articles/hello 有効
558
+ /articles/hello/ 有効
559
+ articles/hello 無効
560
+ https://example.com 無効
573
561
  ```
574
562
 
575
- 戻り値は Plugin の通常の URL 正規化・検証・衝突検出を通ります。
563
+ 戻り値は、プラグインの通常の URL 正規化、検証、衝突検出を通ります。
576
564
 
577
565
  ---
578
566
 
579
567
  ## `resolveId` と `resolvePath` を組み合わせる
580
568
 
581
- 両方を指定すると、ID 決定と URL 構築を完全にカスタマイズできます。
569
+ 2つを指定すれば、ID の解決と URL の構造の両方を自分で決められます。
582
570
 
583
- 例えば年別 URL を作る場合は次のとおりです。
571
+ たとえば、年ごとの URL を作る例です。
584
572
 
585
573
  ```md
586
574
  ---
@@ -621,39 +609,39 @@ permalink({
621
609
  /articles/2026/riebeckite-permalink
622
610
  ```
623
611
 
624
- この場合も Riebeckite 内部では最終的に解決された URL だけが canonical URL として扱われます。
612
+ この場合も、Riebeckite が canonical URL として扱うのは、最終的に解決された URL だけです。
625
613
 
626
614
  ---
627
615
 
628
- ## カスタム resolver の使い分け
616
+ ## 組み込みオプションとカスタム resolver の使い分け
629
617
 
630
- 基本的には次の順序で検討してください。
618
+ 基本的には、次の順に検討してください。
631
619
 
632
620
  ```text
633
- built-in strategy で足りる
621
+ 組み込みの strategy で足りる
634
622
  ↓
635
- 通常オプションを使用
623
+ 通常のオプションを使う
636
624
 
637
625
  ID だけ特殊
638
626
  ↓
639
- resolveId
627
+ resolveId を使う
640
628
 
641
629
  URL 構造だけ特殊
642
630
  ↓
643
- resolvePath
631
+ resolvePath を使う
644
632
 
645
- 両方特殊
633
+ 両方とも特殊
646
634
  ↓
647
- resolveId + resolvePath
635
+ resolveId + resolvePath を使う
648
636
  ```
649
637
 
650
- 例えば、
638
+ たとえば、
651
639
 
652
640
  ```text
653
641
  /n/{id}
654
642
  ```
655
643
 
656
- を作るだけならカスタム resolver は不要です。
644
+ を作るだけなら、カスタム resolver は要りません。
657
645
 
658
646
  ```ts
659
647
  permalink({
@@ -667,13 +655,13 @@ permalink({
667
655
  });
668
656
  ```
669
657
 
670
- こちらの方が設定意図が明確です。
658
+ こちらのほうが設定の意図が明確で、宣言的なまま保てます。
671
659
 
672
660
  ---
673
661
 
674
- ## カスタム resolver でも維持される保証
662
+ ## カスタム resolver を使っても保証されること
675
663
 
676
- カスタム resolver を使用しても、Permalink Plugin の以下の処理は維持されます。
664
+ カスタム resolver を使っても、次の処理は変わりません。
677
665
 
678
666
  - ID の検証
679
667
  - URL の正規化
@@ -684,15 +672,15 @@ permalink({
684
672
  - 末尾スラッシュの扱い
685
673
  - Core への canonical な公開位置の登録
686
674
 
687
- つまりカスタム resolver は Plugin の安全機構を迂回する API ではありません。
675
+ カスタム resolver が変えるのは ID やパスの作り方だけで、出来上がった公開位置の検証と登録の方法は変わりません。つまり、カスタム resolver はプラグインの安全機構を迂回する API ではありません。
688
676
 
689
677
  ---
690
678
 
691
- ## 手動の permalink との優先順位
679
+ ## 手動の permalink が優先される
692
680
 
693
- frontmatter に手動の permalink がある場合は、通常の ID 解決と path 構築より優先されます。
681
+ frontmatter に手動の permalink があれば、通常の ID 解決とパス生成より優先されます。
694
682
 
695
- 例えば、次のようになります。
683
+ たとえば、次のとおりです。
696
684
 
697
685
  ```md
698
686
  ---
@@ -701,29 +689,27 @@ permalink: /about
701
689
  ---
702
690
  ```
703
691
 
704
- とすると、
692
+ とした場合、次のように扱われます。
705
693
 
706
694
  ```text
707
- ID候補
695
+ ID の候補
708
696
  abc
709
697
 
710
698
  Canonical URL
711
699
  /about
712
700
  ```
713
701
 
714
- となります。
715
-
716
- `resolvePath` で別の URL を返す設定があっても、手動の permalink override が優先されます。
702
+ `resolvePath` が別の URL を返す設定でも、手動の permalink による上書きが優先されます。
717
703
 
718
- 特殊ページだけ URL を固定したい場合に利用できます。
704
+ 全体では共通の URL 戦略を使いつつ、一部の特別なページだけ URL を固定したい場合に使えます。
719
705
 
720
706
  ---
721
707
 
722
- ## ステートレスな設計
708
+ ## 状態を持たずにビルドする
723
709
 
724
- Permalink Plugin は永続的な ID のレジストリを持ちません。
710
+ このプラグインは、永続的な ID のレジストリを持ちません。
725
711
 
726
- 以下は作成しません。
712
+ 次のものは作成せず、必要としません。
727
713
 
728
714
  ```text
729
715
  .riebeckite/content-ids.json
@@ -732,36 +718,34 @@ SQLite database
732
718
  KV database
733
719
  ```
734
720
 
735
- 必要な情報は、
721
+ 公開位置は、ビルド時に次の入力だけから決まります。
736
722
 
737
723
  ```text
738
- Plugin 設定
724
+ プラグインの設定
739
725
  +
740
726
  ソースコンテンツ
741
727
  ```
742
728
 
743
- からビルド時に決定されます。
744
-
745
- そのため Cloudflare Workers、CI、別 PC などでも同じ入力から同じ URL を生成できます。
729
+ そのため、ローカルビルド、CI、Cloudflare Workers、別の PC でも、追加の状態を持たずに同じ入力から同じ URL を生成できます。
746
730
 
747
- `hash` strategy では path が同一性を決める入力になるため、rename/move によって URL が変化します。
731
+ `hash` strategy ではソースパスが同一性の入力になるため、名前変更や移動をすると URL が変わります。
748
732
 
749
- rename/move 後も URL を維持したい記事には frontmatter ID を利用してください。
733
+ 名前変更や移動の後も URL を維持したいコンテンツには、frontmatter の ID を使ってください。
750
734
 
751
735
  ---
752
736
 
753
- ## Rename / Move 時の挙動
737
+ ## 名前変更や移動で URL はどう変わるか
754
738
 
755
- URL の安定性は ID strategy と path mode の組み合わせによって変わります。
739
+ URL の安定性は、ID の strategy とパスモードの組み合わせで決まります。
756
740
 
757
- | ID | Path mode | Rename | Move |
741
+ | ID | パスモード | 名前変更 | 移動 |
758
742
  | --- | --- | --- | --- |
759
743
  | frontmatter | flat | 維持 | 維持 |
760
- | frontmatter | preserve | 状況により変更 | 変更 |
761
- | frontmatter | append | 状況により変更 | 変更 |
762
- | hash | flat | 変更 | 変更 |
763
- | hash | preserve | 変更 | 変更 |
764
- | hash | append | 変更 | 変更 |
744
+ | frontmatter | preserve | 変わる場合がある | 変わる |
745
+ | frontmatter | append | 変わる場合がある | 変わる |
746
+ | hash | flat | 変わる | 変わる |
747
+ | hash | preserve | 変わる | 変わる |
748
+ | hash | append | 変わる | 変わる |
765
749
 
766
750
  永続的な URL が必要なら、
767
751
 
@@ -779,7 +763,7 @@ permalink({
779
763
 
780
764
  が最も明示的です。
781
765
 
782
- 既存 Vault への変更を最小化したい場合は、
766
+ 既存の Vault への変更を最小限にしたい場合は、
783
767
 
784
768
  ```ts
785
769
  id: {
@@ -791,13 +775,13 @@ id: {
791
775
 
792
776
  ---
793
777
 
794
- ## 検証
778
+ ## 検証される値
795
779
 
796
- ### ID
780
+ ### ID の条件
797
781
 
798
- ID は URL の 1 つのパスセグメントとして扱われます。
782
+ ID は、URL の1つのパスセグメントでなければなりません。
799
783
 
800
- 以下はエラーになります。
784
+ 次の値はエラーになります。
801
785
 
802
786
  - 空文字列
803
787
  - `/` を含む
@@ -806,13 +790,13 @@ ID は URL の 1 つのパスセグメントとして扱われます。
806
790
  - 空白を含む
807
791
  - 正しくデコードできないパーセントエンコード
808
792
 
809
- Custom `resolveId` の結果も同じ検証を受けます。
793
+ `resolveId` が返した値も同じ検証を受けます。
810
794
 
811
- ### Permalink
795
+ ### permalink とリダイレクトの条件
812
796
 
813
- Permalink とリダイレクトはサイト内の絶対 path である必要があります。
797
+ permalink とリダイレクトは、サイト内の絶対パスである必要があります。
814
798
 
815
- 以下は許可されません。
799
+ 次の値は許可されません。
816
800
 
817
801
  - 相対パス
818
802
  - クエリ文字列
@@ -821,22 +805,22 @@ Permalink とリダイレクトはサイト内の絶対 path である必要が
821
805
  - 不正な `//`
822
806
  - 外部 URL
823
807
 
824
- Custom `resolvePath` の結果も同じ検証を受けます。
808
+ `resolvePath` が返した値も同じ検証を受けます。
825
809
 
826
810
  ---
827
811
 
828
- ## 衝突検出
812
+ ## 衝突の検出
829
813
 
830
- Permalink Plugin はビルド時に衝突を検出します。
814
+ このプラグインは、ビルド時に公開位置の衝突を検出します。
831
815
 
832
- 対象は次のとおりです。
816
+ 検出する組み合わせは次のとおりです。
833
817
 
834
818
  - ID ↔ ID
835
819
  - canonical URL ↔ canonical URL
836
820
  - canonical URL ↔ リダイレクト
837
821
  - リダイレクト ↔ リダイレクト
838
822
 
839
- 例えば、次のようになります。
823
+ たとえば、次の2つが同じ URL になると、ビルドはエラーになります。
840
824
 
841
825
  ```text
842
826
  a.md
@@ -846,9 +830,7 @@ b.md
846
830
  → /about
847
831
  ```
848
832
 
849
- はビルドエラーです。
850
-
851
- また、
833
+ 次のように、canonical URL とリダイレクトがぶつかる場合もエラーです。
852
834
 
853
835
  ```text
854
836
  a.md canonical
@@ -858,25 +840,23 @@ b.md redirect
858
840
  → /about
859
841
  ```
860
842
 
861
- もエラーです。
862
-
863
- 自動的に接尾辞を付けて回避することはありません。
843
+ 衝突を避けるために接尾辞を自動で付けることはありません。
864
844
 
865
- これにより、ビルド順序によって URL が変化することを防ぎます。
845
+ これにより、ビルドやコンテンツの順序によって公開 URL が変わることを防ぎます。
866
846
 
867
847
  ---
868
848
 
869
- ## Inspect
849
+ ## 解決結果を確認する
870
850
 
871
- 解決結果は Riebeckite の inspect 機能から確認できます。
851
+ 解決結果は、Riebeckite の inspect 機能で確認できます。
872
852
 
873
853
  ```sh
874
854
  riebeckite inspect content --list
875
855
  ```
876
856
 
877
- Permalink Plugin が有効な場合、記事ごとの ID、ID の出典、permalink を確認できます。
857
+ Permalink Plugin が有効なら、コンテンツごとの ID、ID の出典、permalink を確認できます。
878
858
 
879
- 例えば、次のようになります。
859
+ 出力例は次のとおりです。
880
860
 
881
861
  ```text
882
862
  PATH ID ID SOURCE PERMALINK
@@ -884,16 +864,16 @@ notes/a.md K7m3Qp8d... derived /n/K7m3Qp8d...
884
864
  notes/about.md about frontmatter /about
885
865
  ```
886
866
 
887
- 実際の表示形式は CLI バージョンによって異なる場合があります。
867
+ 実際の表示形式は CLI のバージョンによって異なる場合があります。
888
868
 
889
869
  ---
890
870
 
891
- ## 主なエクスポート
871
+ ## エクスポートされる関数と型
892
872
 
893
873
  ### 関数
894
874
 
895
875
  - `permalink(options?)`
896
- - `permalinkPlugin(options?)`
876
+ - `permalink(options?)`
897
877
 
898
878
  どちらも Permalink Plugin を生成します。
899
879
 
@@ -904,15 +884,15 @@ notes/about.md about frontmatter /about
904
884
  - `PermalinkPathMode`
905
885
  - `RedirectStatus`
906
886
 
907
- カスタム resolver を書く場合は、公開されている型を使って設定を型安全に書けます。
887
+ カスタム resolver を書くときは、公開されている型を使えば、設定を型安全に書けます。
908
888
 
909
889
  ---
910
890
 
911
891
  ## 設定例
912
892
 
913
- ### 既存 Obsidian Vault 向け
893
+ ### 既存の Obsidian Vault 向け
914
894
 
915
- frontmatter 変更を必須とせず、URL からファイルシステム構造を隠します。
895
+ Vault 全体に frontmatter を追加することなく、URL からファイルシステムの構造を隠します。
916
896
 
917
897
  ```ts
918
898
  permalink({
@@ -928,7 +908,7 @@ permalink({
928
908
  });
929
909
  ```
930
910
 
931
- ### 完全に明示的な永続 URL
911
+ ### 永続 URL を明示的に管理する
932
912
 
933
913
  ```ts
934
914
  permalink({
@@ -943,7 +923,7 @@ permalink({
943
923
  });
944
924
  ```
945
925
 
946
- すべての記事に frontmatter ID が必要になります。
926
+ すべてのコンテンツに frontmatter の ID が必要になります。
947
927
 
948
928
  ### ディレクトリ構造を残す
949
929
 
@@ -959,7 +939,7 @@ permalink({
959
939
  });
960
940
  ```
961
941
 
962
- ### 独自 URL 設計
942
+ ### 独自の URL 設計を使う
963
943
 
964
944
  ```ts
965
945
  permalink({
@@ -979,5 +959,5 @@ permalink({
979
959
 
980
960
  ## 関連資料
981
961
 
982
- - [プラグインシステム](https://github.com/Rerurate514/riebeckite/blob/main/docs/docs/reference/plugin-api.ja.md)
962
+ - [プラグイン API](https://github.com/Rerurate514/riebeckite/blob/main/docs/docs/reference/plugin-api.ja.md)
983
963
  - [コンテンツシステム](https://github.com/Rerurate514/riebeckite/blob/main/docs/docs/framework/content-system.ja.md)
package/dist/index.d.ts CHANGED
@@ -33,5 +33,4 @@ export type PermalinkOptions = {
33
33
  }) => string;
34
34
  };
35
35
  export declare function permalink(options?: PermalinkOptions): import("@riebeckite/core").RiebeckitePlugin<unknown>;
36
- export declare const permalinkPlugin: typeof permalink;
37
36
  export {};
package/dist/index.js CHANGED
@@ -22,7 +22,6 @@ function permalink(options = {}) {
22
22
  }
23
23
  });
24
24
  }
25
- var permalinkPlugin = permalink;
26
25
  function resolveLocation(content, options, resolved) {
27
26
  const override = readOptionalString(
28
27
  content.frontmatter,
@@ -255,6 +254,5 @@ function validateFieldName(value, label) {
255
254
  return value;
256
255
  }
257
256
  export {
258
- permalink,
259
- permalinkPlugin
257
+ permalink
260
258
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@riebeckite/plugin-permalink",
3
- "version": "0.0.31",
3
+ "version": "0.0.33",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -14,12 +14,12 @@
14
14
  }
15
15
  },
16
16
  "dependencies": {
17
- "yaml": "^2.9.0",
18
- "@riebeckite/core": "0.0.31"
17
+ "@riebeckite/core": "0.0.33",
18
+ "yaml": "^2.9.0"
19
19
  },
20
20
  "devDependencies": {
21
- "tsx": "^4.22.4",
22
- "@riebeckite/test": "0.0.31"
21
+ "@riebeckite/test": "0.0.33",
22
+ "tsx": "^4.22.4"
23
23
  },
24
24
  "publishConfig": {
25
25
  "access": "public"