@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 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
- ランディングページになります。解決済みの permalink を `/folder/README` や
34
+ ランディングページになります。解決済みのパーマリンクを `/folder/README` や
31
35
  `/folder/index` から `/folder/` へ畳み込み、元の URL から新しい URL へ
32
36
  リダイレクトします。
33
37
 
34
- 畳み込みは slug から URL を推測しません。ロケーションリゾルバが確定させた
35
- permalink を書き換えるため、l10n やカスタム permalink でも正しい URL を
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
- 入口ノートを持たず、公開されたコンテンツがあるフォルダには `/folder/` に
50
+ 入口ノートを持たず、公開・発見可能なコンテンツがあるフォルダには `/folder/` に
47
51
  ページを自動生成します。表示するのはフォルダ直下の要素だけです。
48
52
 
49
- - **Pages**: 直下の公開・discoverable なノート
50
- - **Folders**: discoverable なコンテンツを持つ直下のサブフォルダ
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 は解決済み permalink、次に title で並べます。プラグインの
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` capability への任意依存を宣言しています。
76
+ `content.localization` ケイパビリティへの任意依存を宣言しています。
73
77
  `@riebeckite/plugin-l10n` を有効にすると、フォルダページのロケーション
74
78
  書き換えがローカライズの後に実行され、畳み込み後の URL とリダイレクトが
75
- 最終的なローカライズ済み permalink を使います。l10n なしでも単独で動作します。
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 { title: owner.title, permalink: owner.permalink };
145
+ if (owner) return toLink(owner, folderIcons[folder]);
145
146
  const page = hasRoutablePage(folder, language) ? routableBySlug.get(folder) : void 0;
146
- if (page) return { title: page.title, permalink: page.permalink };
147
+ if (page) return toLink(page, folderIcons[folder]);
147
148
  const pathname = generatedPath(folder, language);
148
149
  if (!pathname) return null;
149
- return { title: lastSegment(folder), permalink: pathname };
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
- pages: sortedPages(folder, language).map(toLink),
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
- return { title: entry.title, permalink: entry.permalink };
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
  };
@@ -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.32",
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.32"
17
+ "@riebeckite/core": "0.0.33"
18
18
  },
19
19
  "devDependencies": {
20
- "tsx": "^4.22.4",
21
- "@riebeckite/plugin-l10n": "0.0.32",
22
- "@riebeckite/plugin-taxonomy": "0.0.32"
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"