@riebeckite/plugin-folder-pages 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 +4 -0
- package/README_ja.md +14 -10
- package/dist/index.d.ts +0 -1
- package/dist/index.js +23 -10
- package/dist/src/types.d.ts +3 -1
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -8,6 +8,10 @@ Folder Page support for Riebeckite. The plugin turns folder entry notes into the
|
|
|
8
8
|
folder's landing page and generates a listing page for folders that have no
|
|
9
9
|
entry note.
|
|
10
10
|
|
|
11
|
+
## Live example
|
|
12
|
+
|
|
13
|
+
The generated [folders](/folders) index is a Folder Page tree built from the site's folder structure.
|
|
14
|
+
|
|
11
15
|
## Installation
|
|
12
16
|
|
|
13
17
|
```bash
|
package/README_ja.md
CHANGED
|
@@ -8,6 +8,10 @@ Riebeckite の Folder Page を提供するプラグインです。フォルダ
|
|
|
8
8
|
フォルダのランディングページにし、入口ノートのないフォルダには一覧ページを
|
|
9
9
|
自動生成します。
|
|
10
10
|
|
|
11
|
+
## 実行例
|
|
12
|
+
|
|
13
|
+
生成された [フォルダ](/folders) の一覧が、サイトのフォルダ構成から作られた Folder Page のツリーです。
|
|
14
|
+
|
|
11
15
|
## インストール
|
|
12
16
|
|
|
13
17
|
```bash
|
|
@@ -27,27 +31,27 @@ export default {
|
|
|
27
31
|
## Markdown ベースの Folder Page
|
|
28
32
|
|
|
29
33
|
`<folder>/README.md` または `<folder>/index.md` にあるノートは、そのフォルダの
|
|
30
|
-
|
|
34
|
+
ランディングページになります。解決済みのパーマリンクを `/folder/README` や
|
|
31
35
|
`/folder/index` から `/folder/` へ畳み込み、元の URL から新しい URL へ
|
|
32
36
|
リダイレクトします。
|
|
33
37
|
|
|
34
|
-
畳み込みは slug から URL
|
|
35
|
-
|
|
38
|
+
畳み込みは slug から URL を推測しません。ロケーションリゾルバが確定した
|
|
39
|
+
パーマリンクを書き換えるため、l10n やカスタムパーマリンクでも正しい URL を
|
|
36
40
|
維持します。
|
|
37
41
|
|
|
38
42
|
フォルダ入口として扱うのは `README` と `index` だけです。`<folder>.md` は
|
|
39
43
|
通常のコンテンツページのままです。
|
|
40
44
|
|
|
41
45
|
同じフォルダに `README.md` と `index.md` の両方がある場合は、どちらも
|
|
42
|
-
|
|
46
|
+
畳み込まず、既定の場所のままにします。暗黙に一方を選ぶと曖昧になるためです。
|
|
43
47
|
|
|
44
48
|
## 自動生成される Folder Page
|
|
45
49
|
|
|
46
|
-
|
|
50
|
+
入口ノートを持たず、公開・発見可能なコンテンツがあるフォルダには `/folder/` に
|
|
47
51
|
ページを自動生成します。表示するのはフォルダ直下の要素だけです。
|
|
48
52
|
|
|
49
|
-
- **Pages**:
|
|
50
|
-
- **Folders**:
|
|
53
|
+
- **Pages**: 直下の公開・発見可能なノート
|
|
54
|
+
- **Folders**: 発見可能なコンテンツを持つ直下のサブフォルダ
|
|
51
55
|
|
|
52
56
|
一覧は `manifest.discoverableEntries` を基準に作るため、unlisted・draft・
|
|
53
57
|
scheduled のノートは表示されません。URL を知っていれば到達できるノートと、
|
|
@@ -56,7 +60,7 @@ scheduled のノートは表示されません。URL を知っていれば到達
|
|
|
56
60
|
|
|
57
61
|
## 並び順
|
|
58
62
|
|
|
59
|
-
Pages と Folders
|
|
63
|
+
Pages と Folders は解決済みパーマリンク、次にタイトルで並べます。プラグインの
|
|
60
64
|
順序に依存せず、出力は常に決定的です。
|
|
61
65
|
|
|
62
66
|
## オプション
|
|
@@ -69,7 +73,7 @@ Pages と Folders は解決済み permalink、次に title で並べます。プ
|
|
|
69
73
|
|
|
70
74
|
## プラグイン依存
|
|
71
75
|
|
|
72
|
-
`content.localization`
|
|
76
|
+
`content.localization` ケイパビリティへの任意依存を宣言しています。
|
|
73
77
|
`@riebeckite/plugin-l10n` を有効にすると、フォルダページのロケーション
|
|
74
78
|
書き換えがローカライズの後に実行され、畳み込み後の URL とリダイレクトが
|
|
75
|
-
|
|
79
|
+
最終的なローカライズ済みパーマリンクを使います。l10n なしでも単独で動作します。
|
package/dist/index.d.ts
CHANGED
|
@@ -5,4 +5,3 @@ export { renderFolderPage } from "./src/pages.js";
|
|
|
5
5
|
export type { FolderPage, FolderPageLink, FolderPagesModel, FolderPagesOptions, ResolvedFolderPagesOptions, } from "./src/types.js";
|
|
6
6
|
export declare const FOLDER_PAGES_PLUGIN_NAME = "folder-pages";
|
|
7
7
|
export declare function folderPages(options?: FolderPagesOptions): import("@riebeckite/core").RiebeckitePlugin<FolderPagesOptions>;
|
|
8
|
-
export declare const folderPagesPlugin: typeof folderPages;
|
package/dist/index.js
CHANGED
|
@@ -47,6 +47,7 @@ function collapseFolderEntryLocations(locations) {
|
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
49
|
function buildFolderPages(manifest) {
|
|
50
|
+
const folderIcons = manifest.icons?.folders ?? {};
|
|
50
51
|
const routableBySlug = /* @__PURE__ */ new Map();
|
|
51
52
|
const routablePermalinks = /* @__PURE__ */ new Set();
|
|
52
53
|
for (const entry of manifest.publicEntries) {
|
|
@@ -141,12 +142,16 @@ function buildFolderPages(manifest) {
|
|
|
141
142
|
const isListed = (folder, language) => hasOwner(folder, language) || hasRoutablePage(folder, language) || isNavigable(folder, language) && generatedPath(folder, language) !== null;
|
|
142
143
|
const folderLink = (folder, language) => {
|
|
143
144
|
const owner = owners.get(languageKey(folder, language));
|
|
144
|
-
if (owner) return
|
|
145
|
+
if (owner) return toLink(owner, folderIcons[folder]);
|
|
145
146
|
const page = hasRoutablePage(folder, language) ? routableBySlug.get(folder) : void 0;
|
|
146
|
-
if (page) return
|
|
147
|
+
if (page) return toLink(page, folderIcons[folder]);
|
|
147
148
|
const pathname = generatedPath(folder, language);
|
|
148
149
|
if (!pathname) return null;
|
|
149
|
-
return {
|
|
150
|
+
return {
|
|
151
|
+
title: lastSegment(folder),
|
|
152
|
+
permalink: pathname,
|
|
153
|
+
...folderIcons[folder] ? { icon: folderIcons[folder] } : {}
|
|
154
|
+
};
|
|
150
155
|
};
|
|
151
156
|
const sortedSubfolders = (folder, language) => {
|
|
152
157
|
const subs = [...subfoldersFor(folder, language)].flatMap((sub) => {
|
|
@@ -178,7 +183,8 @@ function buildFolderPages(manifest) {
|
|
|
178
183
|
pathname,
|
|
179
184
|
language,
|
|
180
185
|
title: lastSegment(folder),
|
|
181
|
-
|
|
186
|
+
...folderIcons[folder] ? { icon: folderIcons[folder] } : {},
|
|
187
|
+
pages: sortedPages(folder, language).map((entry) => toLink(entry)),
|
|
182
188
|
folders: folderLinks.map((sub) => sub.link),
|
|
183
189
|
dependencies: [
|
|
184
190
|
{ type: "folder", folder },
|
|
@@ -218,8 +224,13 @@ function sortedLanguages(languages) {
|
|
|
218
224
|
function isEntryBasename(basename) {
|
|
219
225
|
return ENTRY_BASENAMES.includes(basename);
|
|
220
226
|
}
|
|
221
|
-
function toLink(entry) {
|
|
222
|
-
|
|
227
|
+
function toLink(entry, fallbackIcon) {
|
|
228
|
+
const icon = entry.icon ?? fallbackIcon;
|
|
229
|
+
return {
|
|
230
|
+
title: entry.title,
|
|
231
|
+
permalink: entry.permalink,
|
|
232
|
+
...icon ? { icon } : {}
|
|
233
|
+
};
|
|
223
234
|
}
|
|
224
235
|
function lastSegment(path) {
|
|
225
236
|
const index = path.lastIndexOf("/");
|
|
@@ -277,7 +288,7 @@ function renderFolderPage(page, options) {
|
|
|
277
288
|
const className = escapeHtmlAttribute(options.className);
|
|
278
289
|
const parts = [
|
|
279
290
|
`<section class="${className}" data-rr-folder-page="${escapeHtmlAttribute(page.folder)}">`,
|
|
280
|
-
`<h1 class="${className}__title">${escapeHtml(page.title)}</h1>`
|
|
291
|
+
`<h1 class="${className}__title">${renderIcon(page.icon)}${escapeHtml(page.title)}</h1>`
|
|
281
292
|
];
|
|
282
293
|
if (page.pages.length > 0) {
|
|
283
294
|
parts.push(
|
|
@@ -299,7 +310,10 @@ function renderFolderPage(page, options) {
|
|
|
299
310
|
return { title: page.title, html: parts.join("") };
|
|
300
311
|
}
|
|
301
312
|
function renderLink(className, link) {
|
|
302
|
-
return `<li class="${className}__item"><a class="${className}__link" href="${escapeHtmlAttribute(link.permalink)}">${escapeHtml(link.title)}</a></li>`;
|
|
313
|
+
return `<li class="${className}__item"><a class="${className}__link" href="${escapeHtmlAttribute(link.permalink)}">${renderIcon(link.icon)}${escapeHtml(link.title)}</a></li>`;
|
|
314
|
+
}
|
|
315
|
+
function renderIcon(icon) {
|
|
316
|
+
return icon ? `<span class="rr-folder-page__icon">${icon.html}</span>` : "";
|
|
303
317
|
}
|
|
304
318
|
|
|
305
319
|
// index.ts
|
|
@@ -331,6 +345,7 @@ function folderPages(options = {}) {
|
|
|
331
345
|
...page.language === void 0 ? {} : { language: page.language }
|
|
332
346
|
});
|
|
333
347
|
}
|
|
348
|
+
models.delete(manifest);
|
|
334
349
|
},
|
|
335
350
|
pageTypes: [
|
|
336
351
|
{
|
|
@@ -361,7 +376,6 @@ function folderPages(options = {}) {
|
|
|
361
376
|
]
|
|
362
377
|
});
|
|
363
378
|
}
|
|
364
|
-
var folderPagesPlugin = folderPages;
|
|
365
379
|
function validateFolderPagesOptions(options) {
|
|
366
380
|
if (!options) return [];
|
|
367
381
|
const issues = [];
|
|
@@ -381,7 +395,6 @@ export {
|
|
|
381
395
|
buildFolderPages,
|
|
382
396
|
collapseFolderEntryLocations,
|
|
383
397
|
folderPages,
|
|
384
|
-
folderPagesPlugin,
|
|
385
398
|
renderFolderPage,
|
|
386
399
|
resolveFolderPagesOptions
|
|
387
400
|
};
|
package/dist/src/types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { OutputDependency } from "@riebeckite/core";
|
|
1
|
+
import type { ContentIcon, OutputDependency } from "@riebeckite/core";
|
|
2
2
|
export type FolderPagesOptions = {
|
|
3
3
|
className?: string;
|
|
4
4
|
pagesLabel?: string;
|
|
@@ -12,12 +12,14 @@ export type ResolvedFolderPagesOptions = {
|
|
|
12
12
|
export type FolderPageLink = {
|
|
13
13
|
title: string;
|
|
14
14
|
permalink: string;
|
|
15
|
+
icon?: ContentIcon;
|
|
15
16
|
};
|
|
16
17
|
export type FolderPage = {
|
|
17
18
|
folder: string;
|
|
18
19
|
pathname: string;
|
|
19
20
|
language?: string;
|
|
20
21
|
title: string;
|
|
22
|
+
icon?: ContentIcon;
|
|
21
23
|
pages: FolderPageLink[];
|
|
22
24
|
folders: FolderPageLink[];
|
|
23
25
|
dependencies: OutputDependency[];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@riebeckite/plugin-folder-pages",
|
|
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
|
-
"@riebeckite/core": "0.0.
|
|
17
|
+
"@riebeckite/core": "0.0.33"
|
|
18
18
|
},
|
|
19
19
|
"devDependencies": {
|
|
20
|
-
"
|
|
21
|
-
"@riebeckite/plugin-
|
|
22
|
-
"
|
|
20
|
+
"@riebeckite/plugin-l10n": "0.0.33",
|
|
21
|
+
"@riebeckite/plugin-taxonomy": "0.0.33",
|
|
22
|
+
"tsx": "^4.22.4"
|
|
23
23
|
},
|
|
24
24
|
"publishConfig": {
|
|
25
25
|
"access": "public"
|