@riebeckite/plugin-permalink 0.0.32 → 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 +1 -1
- package/README_ja.md +173 -193
- package/dist/index.d.ts +0 -1
- package/dist/index.js +1 -3
- package/package.json +5 -5
package/README.md
CHANGED
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
|
|
5
|
+
Riebeckite のコンテンツに、安定した公開 URL(permalink)を与えるプラグインです。
|
|
6
6
|
|
|
7
|
-
|
|
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"
|
|
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
|
|
57
|
+
frontmatter に ID がないコンテンツにも、既定の `frontmatter-or-hash` ならファイルパスから決定論的な ID が付きます。
|
|
58
58
|
|
|
59
|
-
そのため、既存の Obsidian Vault
|
|
59
|
+
そのため、既存の Obsidian Vault の全ファイルに `id` を追加する必要はありません。
|
|
60
60
|
|
|
61
61
|
---
|
|
62
62
|
|
|
63
|
-
##
|
|
63
|
+
## URL が決まるまで
|
|
64
64
|
|
|
65
|
-
`permalink()`
|
|
65
|
+
`permalink()` は、ビルド時に `resolveContentLocations` フックを使って各コンテンツの公開位置を解決します。
|
|
66
66
|
|
|
67
|
-
|
|
67
|
+
処理の流れは次のとおりです。
|
|
68
68
|
|
|
69
69
|
```text
|
|
70
|
-
|
|
70
|
+
コンテンツ
|
|
71
71
|
│
|
|
72
72
|
├─ frontmatter
|
|
73
73
|
├─ slug
|
|
74
|
-
└─
|
|
74
|
+
└─ ソースパス
|
|
75
75
|
│
|
|
76
76
|
▼
|
|
77
77
|
@riebeckite/plugin-permalink
|
|
78
78
|
│
|
|
79
|
-
├─
|
|
80
|
-
├─
|
|
81
|
-
├─
|
|
82
|
-
├─
|
|
83
|
-
└─
|
|
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
|
|
93
|
+
Core は、解決された `permalink` を canonical URL として扱います。
|
|
94
94
|
|
|
95
|
-
|
|
95
|
+
同じ URL が、Wikilink、バックリンク、検索、コンテンツグラフなどから共通して参照されます。SEO の canonical、サイトマップ、RSS / Atom / JSON Feed も同じ URL を使います。
|
|
96
96
|
|
|
97
|
-
|
|
97
|
+
このプラグインを使わなくても、Core の resolver `resolveDefaultContentLocation` がすべての URL を解決します。`index` は `/`、それ以外は `/{slug}` です。これはフォールバックではなく、Core の正式な方針です。
|
|
98
98
|
|
|
99
99
|
---
|
|
100
100
|
|
|
101
|
-
##
|
|
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
|
-
###
|
|
129
|
+
### permalink を直接指定する
|
|
130
130
|
|
|
131
|
-
|
|
131
|
+
特定のコンテンツだけ、公開 URL を直接指定できます。
|
|
132
132
|
|
|
133
133
|
```md
|
|
134
134
|
---
|
|
@@ -137,9 +137,9 @@ permalink: /about
|
|
|
137
137
|
---
|
|
138
138
|
```
|
|
139
139
|
|
|
140
|
-
|
|
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
|
-
###
|
|
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
|
-
|
|
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` |
|
|
219
|
-
| `path.mode` | `"flat" \| "preserve" \| "append"` | `"flat"` | ID を公開 URL
|
|
220
|
-
| `path.prefix` | `string` | `"/n"` | URL
|
|
221
|
-
| `path.trailingSlash` | `boolean` | `false` | canonical URL
|
|
222
|
-
| `index.collapse` | `boolean` | `true` | `index`
|
|
223
|
-
| `override.frontmatter` | `string` | `"permalink"` | URL
|
|
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
|
|
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
|
-
|
|
244
|
+
URL の同一性を明示的に管理したい場合に向いています。
|
|
249
245
|
|
|
250
246
|
```md
|
|
251
247
|
---
|
|
@@ -253,13 +249,13 @@ id: article-123
|
|
|
253
249
|
---
|
|
254
250
|
```
|
|
255
251
|
|
|
256
|
-
|
|
252
|
+
ソースファイルを名前変更したり移動したりしても、`flat` モードなら ID と公開 URL は変わりません。
|
|
257
253
|
|
|
258
254
|
---
|
|
259
255
|
|
|
260
256
|
### `hash`
|
|
261
257
|
|
|
262
|
-
frontmatter
|
|
258
|
+
frontmatter の ID を使わず、ソースファイルのパスから ID を導出します。
|
|
263
259
|
|
|
264
260
|
```ts
|
|
265
261
|
permalink({
|
|
@@ -270,21 +266,19 @@ permalink({
|
|
|
270
266
|
});
|
|
271
267
|
```
|
|
272
268
|
|
|
273
|
-
|
|
269
|
+
入力となるパスは、次の正規化を経て SHA-256 でハッシュ化されます。
|
|
274
270
|
|
|
275
271
|
- `\` → `/`
|
|
276
|
-
-
|
|
277
|
-
- Unicode NFC
|
|
272
|
+
- 先頭の `/` を除去
|
|
273
|
+
- Unicode NFC で正規化
|
|
278
274
|
|
|
279
|
-
|
|
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
|
-
|
|
281
|
+
正規化したパス
|
|
288
282
|
│
|
|
289
283
|
▼
|
|
290
284
|
SHA-256
|
|
@@ -296,15 +290,15 @@ base64url
|
|
|
296
290
|
K7m3Qp8d...
|
|
297
291
|
```
|
|
298
292
|
|
|
299
|
-
|
|
293
|
+
同じパスなら、OS やビルド環境が違っても同じ ID になります。
|
|
300
294
|
|
|
301
|
-
|
|
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
|
-
|
|
317
|
+
その ID を使う
|
|
324
318
|
|
|
325
|
-
frontmatter ID
|
|
319
|
+
frontmatter に ID がない
|
|
326
320
|
↓
|
|
327
|
-
|
|
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` |
|
|
344
|
-
| `custom` | `resolveId`
|
|
334
|
+
| `frontmatter` | frontmatter のフィールドから取得 |
|
|
335
|
+
| `derived` | ソースパスのハッシュから導出 |
|
|
336
|
+
| `custom` | `resolveId` が返した値 |
|
|
345
337
|
|
|
346
|
-
手動の `permalink`
|
|
338
|
+
手動の `permalink` による上書きは URL を変えますが、同一性は失われません。frontmatter に ID があれば、その ID は引き続き記録されます(`metadata.idSource` は `frontmatter`)。メタデータが付かないのは、明示的な ID が存在しない場合だけです。上書きによって `/{id}` という URL が暗黙に生成されることはありません。
|
|
347
339
|
|
|
348
340
|
---
|
|
349
341
|
|
|
350
|
-
## URL path
|
|
342
|
+
## URL への配置方法(`path.mode`)
|
|
351
343
|
|
|
352
|
-
ID
|
|
344
|
+
ID の解決と URL の組み立ては、別々に設定できます。
|
|
353
345
|
|
|
354
|
-
|
|
346
|
+
次の例で考えます。
|
|
355
347
|
|
|
356
348
|
```text
|
|
357
|
-
|
|
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
|
-
|
|
371
|
+
ファイルシステムのディレクトリ構造は URL に現れません。
|
|
382
372
|
|
|
383
|
-
|
|
373
|
+
ファイルの場所を URL から隠したい場合に適しています。
|
|
384
374
|
|
|
385
375
|
---
|
|
386
376
|
|
|
387
377
|
### `preserve`
|
|
388
378
|
|
|
389
|
-
|
|
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
|
-
|
|
410
|
+
現在の実装では、`append` は `preserve` と同じパスを返します。
|
|
421
411
|
|
|
422
|
-
|
|
412
|
+
将来、別の意味を持たせられるようにモードとして分けています。現行バージョンで `append` に `preserve` と異なる挙動を期待しないでください。
|
|
423
413
|
|
|
424
414
|
---
|
|
425
415
|
|
|
426
|
-
## index
|
|
416
|
+
## index ファイルの扱い
|
|
427
417
|
|
|
428
|
-
`index.collapse`
|
|
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`
|
|
440
|
+
`flat` はファイルシステムの構造を使わないため、`collapse` の影響を受けません。
|
|
451
441
|
|
|
452
442
|
---
|
|
453
443
|
|
|
454
|
-
##
|
|
444
|
+
## 上級: 独自の resolver を書く
|
|
455
445
|
|
|
456
|
-
組み込みの strategy
|
|
446
|
+
組み込みの strategy では表せない URL 設計には、`resolveId` と `resolvePath` を使えます。
|
|
457
447
|
|
|
458
|
-
|
|
448
|
+
通常のオプションで足りるなら、カスタム resolver は不要です。プロジェクト固有の ID や URL の設計に使います。
|
|
459
449
|
|
|
460
450
|
### `resolveId`
|
|
461
451
|
|
|
462
|
-
|
|
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
|
-
|
|
470
|
+
コンテンツ
|
|
481
471
|
↓
|
|
482
472
|
resolveId(content)
|
|
483
473
|
↓
|
|
484
474
|
ID
|
|
485
475
|
↓
|
|
486
|
-
|
|
476
|
+
組み込みのパス resolver
|
|
487
477
|
↓
|
|
488
478
|
canonical URL
|
|
489
479
|
```
|
|
490
480
|
|
|
491
|
-
|
|
481
|
+
`resolveId` の戻り値も、組み込みの ID と同じ検証を通ります。
|
|
492
482
|
|
|
493
|
-
|
|
483
|
+
つまり、カスタム resolver はプラグインの通常の検証を迂回できません。
|
|
494
484
|
|
|
495
|
-
|
|
485
|
+
#### 例: 独自の frontmatter から ID を作る
|
|
496
486
|
|
|
497
|
-
|
|
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
|
|
526
|
+
カスタム resolver が読むプロジェクト固有の frontmatter の検証は、resolver の責任です。
|
|
539
527
|
|
|
540
528
|
---
|
|
541
529
|
|
|
542
|
-
##
|
|
530
|
+
## 上級: `resolvePath` で URL を組み立てる
|
|
543
531
|
|
|
544
|
-
`resolvePath`
|
|
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
|
|
570
|
-
/articles/hello/
|
|
571
|
-
articles/hello
|
|
572
|
-
https://example.com
|
|
557
|
+
/articles/hello 有効
|
|
558
|
+
/articles/hello/ 有効
|
|
559
|
+
articles/hello 無効
|
|
560
|
+
https://example.com 無効
|
|
573
561
|
```
|
|
574
562
|
|
|
575
|
-
|
|
563
|
+
戻り値は、プラグインの通常の URL 正規化、検証、衝突検出を通ります。
|
|
576
564
|
|
|
577
565
|
---
|
|
578
566
|
|
|
579
567
|
## `resolveId` と `resolvePath` を組み合わせる
|
|
580
568
|
|
|
581
|
-
|
|
569
|
+
2つを指定すれば、ID の解決と URL の構造の両方を自分で決められます。
|
|
582
570
|
|
|
583
|
-
|
|
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
|
-
|
|
612
|
+
この場合も、Riebeckite が canonical URL として扱うのは、最終的に解決された URL だけです。
|
|
625
613
|
|
|
626
614
|
---
|
|
627
615
|
|
|
628
|
-
##
|
|
616
|
+
## 組み込みオプションとカスタム resolver の使い分け
|
|
629
617
|
|
|
630
|
-
|
|
618
|
+
基本的には、次の順に検討してください。
|
|
631
619
|
|
|
632
620
|
```text
|
|
633
|
-
|
|
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
|
-
|
|
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
|
|
664
|
+
カスタム resolver を使っても、次の処理は変わりません。
|
|
677
665
|
|
|
678
666
|
- ID の検証
|
|
679
667
|
- URL の正規化
|
|
@@ -684,15 +672,15 @@ permalink({
|
|
|
684
672
|
- 末尾スラッシュの扱い
|
|
685
673
|
- Core への canonical な公開位置の登録
|
|
686
674
|
|
|
687
|
-
|
|
675
|
+
カスタム resolver が変えるのは ID やパスの作り方だけで、出来上がった公開位置の検証と登録の方法は変わりません。つまり、カスタム resolver はプラグインの安全機構を迂回する API ではありません。
|
|
688
676
|
|
|
689
677
|
---
|
|
690
678
|
|
|
691
|
-
## 手動の permalink
|
|
679
|
+
## 手動の permalink が優先される
|
|
692
680
|
|
|
693
|
-
frontmatter に手動の permalink
|
|
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
|
-
|
|
704
|
+
全体では共通の URL 戦略を使いつつ、一部の特別なページだけ URL を固定したい場合に使えます。
|
|
719
705
|
|
|
720
706
|
---
|
|
721
707
|
|
|
722
|
-
##
|
|
708
|
+
## 状態を持たずにビルドする
|
|
723
709
|
|
|
724
|
-
|
|
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
|
-
|
|
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
|
|
731
|
+
`hash` strategy ではソースパスが同一性の入力になるため、名前変更や移動をすると URL が変わります。
|
|
748
732
|
|
|
749
|
-
|
|
733
|
+
名前変更や移動の後も URL を維持したいコンテンツには、frontmatter の ID を使ってください。
|
|
750
734
|
|
|
751
735
|
---
|
|
752
736
|
|
|
753
|
-
##
|
|
737
|
+
## 名前変更や移動で URL はどう変わるか
|
|
754
738
|
|
|
755
|
-
URL
|
|
739
|
+
URL の安定性は、ID の strategy とパスモードの組み合わせで決まります。
|
|
756
740
|
|
|
757
|
-
| ID |
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
793
|
+
`resolveId` が返した値も同じ検証を受けます。
|
|
810
794
|
|
|
811
|
-
###
|
|
795
|
+
### permalink とリダイレクトの条件
|
|
812
796
|
|
|
813
|
-
|
|
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
|
-
|
|
808
|
+
`resolvePath` が返した値も同じ検証を受けます。
|
|
825
809
|
|
|
826
810
|
---
|
|
827
811
|
|
|
828
|
-
##
|
|
812
|
+
## 衝突の検出
|
|
829
813
|
|
|
830
|
-
|
|
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
|
-
|
|
845
|
+
これにより、ビルドやコンテンツの順序によって公開 URL が変わることを防ぎます。
|
|
866
846
|
|
|
867
847
|
---
|
|
868
848
|
|
|
869
|
-
##
|
|
849
|
+
## 解決結果を確認する
|
|
870
850
|
|
|
871
|
-
|
|
851
|
+
解決結果は、Riebeckite の inspect 機能で確認できます。
|
|
872
852
|
|
|
873
853
|
```sh
|
|
874
854
|
riebeckite inspect content --list
|
|
875
855
|
```
|
|
876
856
|
|
|
877
|
-
Permalink Plugin
|
|
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
|
-
- `
|
|
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
|
-
###
|
|
893
|
+
### 既存の Obsidian Vault 向け
|
|
914
894
|
|
|
915
|
-
frontmatter
|
|
895
|
+
Vault 全体に frontmatter を追加することなく、URL からファイルシステムの構造を隠します。
|
|
916
896
|
|
|
917
897
|
```ts
|
|
918
898
|
permalink({
|
|
@@ -928,7 +908,7 @@ permalink({
|
|
|
928
908
|
});
|
|
929
909
|
```
|
|
930
910
|
|
|
931
|
-
###
|
|
911
|
+
### 永続 URL を明示的に管理する
|
|
932
912
|
|
|
933
913
|
```ts
|
|
934
914
|
permalink({
|
|
@@ -943,7 +923,7 @@ permalink({
|
|
|
943
923
|
});
|
|
944
924
|
```
|
|
945
925
|
|
|
946
|
-
|
|
926
|
+
すべてのコンテンツに frontmatter の ID が必要になります。
|
|
947
927
|
|
|
948
928
|
### ディレクトリ構造を残す
|
|
949
929
|
|
|
@@ -959,7 +939,7 @@ permalink({
|
|
|
959
939
|
});
|
|
960
940
|
```
|
|
961
941
|
|
|
962
|
-
###
|
|
942
|
+
### 独自の URL 設計を使う
|
|
963
943
|
|
|
964
944
|
```ts
|
|
965
945
|
permalink({
|
|
@@ -979,5 +959,5 @@ permalink({
|
|
|
979
959
|
|
|
980
960
|
## 関連資料
|
|
981
961
|
|
|
982
|
-
- [
|
|
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
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.
|
|
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
|
-
"
|
|
18
|
-
"
|
|
17
|
+
"@riebeckite/core": "0.0.33",
|
|
18
|
+
"yaml": "^2.9.0"
|
|
19
19
|
},
|
|
20
20
|
"devDependencies": {
|
|
21
|
-
"
|
|
22
|
-
"
|
|
21
|
+
"@riebeckite/test": "0.0.33",
|
|
22
|
+
"tsx": "^4.22.4"
|
|
23
23
|
},
|
|
24
24
|
"publishConfig": {
|
|
25
25
|
"access": "public"
|