@tenjuu99/blog 0.3.4 → 0.3.5

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/docs/spec.md CHANGED
@@ -129,7 +129,7 @@ url: /custom-url
129
129
  |--------|-------------|------|
130
130
  | `name` | ファイル名(拡張子なし) | ページの内部名 |
131
131
  | `title` | `name` の値 | ページタイトル |
132
- | `url` | `/${name}` | URLパス |
132
+ | `url` | `/${name}` | URLパス(出力先も決定する。後述) |
133
133
  | `description` | 本文先頭150文字 | ページ説明 |
134
134
  | `og_description` | `description` と同じ | OGP説明文 |
135
135
  | `published` | `"1970-01-01"` | 公開日 |
@@ -146,9 +146,41 @@ url: /custom-url
146
146
  | `markdown` | 解析後のHTML | Markdown変換後のHTML |
147
147
  | `markdown_not_parsed` | フロントマター除去後 | 変換前のMarkdown |
148
148
  | `full_url` | 自動生成 | 完全なURL |
149
- | `__output` | 自動生成 | 出力ファイルパス |
149
+ | `__output` | 自動生成 | 出力ファイルパス(`url` から導出) |
150
150
  | `__filetype` | 拡張子 | 元ファイルの拡張子 |
151
151
 
152
+ ### `url` と出力先の関係
153
+
154
+ `url` フィールドはリンクの `href` に使われるだけでなく、**出力ファイルパス(`__output`)の導出元**にもなっています。
155
+
156
+ | `url` の形式 | `__output` |
157
+ |-------------|-----------|
158
+ | `/foo/bar`(末尾スラッシュなし) | `/foo/bar.html` |
159
+ | `/foo/bar/`(末尾スラッシュあり) | `/foo/bar/index.html` |
160
+
161
+ フロントマターで `url` を上書きすると `__output` も再計算されるため、ファイルの物理的な配置とは無関係に出力先を変更できます。
162
+
163
+ ```markdown
164
+ ---
165
+ url: /book/new/book
166
+ ---
167
+ ```
168
+
169
+ この場合、ファイルが `src/pages/book/new_book.md` であっても、出力先は `dist/book/new/book.html` になります。
170
+
171
+ **例外**: ファイル名が `index` の場合は `__output = /index.html` 固定(`url` に関係なし)。また、カテゴリーパッケージの仮想ページのように `__output` を明示的に設定するケースでは、この導出は行われません。
172
+
173
+ ### URLの末尾スラッシュ規約
174
+
175
+ S3+CDN 等のファイルシステムベースのホスティングでは、`/book` というURLが `book.html` を指すのか `book/index.html` を指すのかをURLだけから判断できません。これを避けるため、以下の規約を推奨します。
176
+
177
+ | ページ種別 | URL形式 | 出力先 |
178
+ |-----------|---------|-------|
179
+ | アイテム系(記事・個別ページ) | 末尾スラッシュなし `/book/foo` | `dist/book/foo.html` |
180
+ | リスト系(一覧・カテゴリー・ページネーション) | 末尾スラッシュあり `/book/` | `dist/book/index.html` |
181
+
182
+ リスト系ページを作る場合は、フロントマターで `url` を末尾スラッシュつきで指定するか、ファイル名を `index.md` にします。カテゴリーパッケージの仮想ページはこの規約に従い、`url` に末尾スラッシュを付与しています。
183
+
152
184
  ### データ型の記述
153
185
 
154
186
  フロントマター内のデータ型:
package/lib/pageData.js CHANGED
@@ -56,7 +56,11 @@ const parse = (content, name, ext) => {
56
56
  metaDataMerged.url = '/preview' + metaDataMerged.url
57
57
  }
58
58
  metaDataMerged.full_url = fullUrl(metaDataMerged)
59
- metaDataMerged['__output'] = name === 'index' ? '/index.html' : `${metaDataMerged.url}.${metaDataMerged.ext}`
59
+ metaDataMerged['__output'] = name === 'index'
60
+ ? '/index.html'
61
+ : metaDataMerged.url.endsWith('/')
62
+ ? `${metaDataMerged.url}index.html`
63
+ : `${metaDataMerged.url}.${metaDataMerged.ext}`
60
64
 
61
65
  return metaDataMerged
62
66
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tenjuu99/blog",
3
- "version": "0.3.4",
3
+ "version": "0.3.5",
4
4
  "description": "blog template",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -44,7 +44,7 @@ function buildVirtualPage(url, categoryData, children, currentPage, totalPages,
44
44
 
45
45
  const page = {
46
46
  name: pageName,
47
- url: url,
47
+ url: url + '/',
48
48
  __output: `${url}/index.html`,
49
49
  title: categoryData.title,
50
50
  template: categoryConfig.template || 'category.html',
@@ -65,7 +65,7 @@ function buildVirtualPage(url, categoryData, children, currentPage, totalPages,
65
65
  og_description: `${categoryData.title} カテゴリーのページ一覧`,
66
66
  __filetype: 'md',
67
67
  markdown_not_parsed: '',
68
- full_url: `${config.url_base || 'http://localhost:8000'}${url}`,
68
+ full_url: `${config.url_base || 'http://localhost:8000'}${url}/`,
69
69
  category_pages: [],
70
70
  category_current_page: currentPage,
71
71
  category_total_pages: totalPages,
@@ -100,7 +100,7 @@ function generateCategoryPages(allData, categoryConfig, config) {
100
100
 
101
101
  for (const [url, categoryData] of Object.entries(tree)) {
102
102
  const children = Object.entries(categoryData.children).map(([childUrl, childNode]) => ({
103
- url: childUrl,
103
+ url: childUrl + '/',
104
104
  title: childNode.title,
105
105
  }))
106
106