Skip to content

Commit 066d5d1

Browse files
committed
rewrite pages html
1 parent ca6ef43 commit 066d5d1

File tree

4 files changed

+113
-83
lines changed

4 files changed

+113
-83
lines changed

src/plugins/feed.js

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,20 +21,23 @@ export const feedPlugin = {
2121
const __sitemap_dist = new URL('./sitemap.xml', dist)
2222
const itemsSitemap =
2323
`<?xml version="1.0" encoding="UTF-8"?>\n<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
24-
${meta.reduce(
25-
(acc, { date }) =>
26-
`${acc}<url><loc>${website}posts/${handleUTC(date)
27-
}/</loc></url>`,
28-
'',
29-
)
24+
${
25+
meta.reduce(
26+
(acc, { date }) =>
27+
`${acc}<url><loc>${website}posts/${
28+
handleUTC(date)
29+
}/</loc></url>`,
30+
'',
31+
)
3032
}\n</urlset>`
3133

3234
// rss
3335
const __rss_dist = new URL('./feed.xml', dist)
3436
const rssItem = meta.reduce((acc, { date, title, summary }) => {
3537
const url = `${config.website}posts/${handleUTC(date)}/`
3638
return acc +
37-
`<item>\n<title>${title}</title>\n<link>${url}</link>\n<description>${summary}</description>\n<pubDate>${new Date(date).toUTCString()
39+
`<item>\n<title>${title}</title>\n<link>${url}</link>\n<description>${summary}</description>\n<pubDate>${
40+
new Date(date).toUTCString()
3841
}</pubDate>\n</item>`
3942
}, '')
4043
const rssContent = getRss(author, website, rssItem)
@@ -43,15 +46,15 @@ export const feedPlugin = {
4346
const __robots_dist = new URL('./robots.txt', dist)
4447
const robotsContent =
4548
`User-agent: *\nAllow: /\nSitemap: ${website}sitemap.xml`
46-
;[
47-
[__cname_dist, website.slice("https://".length, -1)],
48-
[__sitemap_dist, itemsSitemap],
49-
[__rss_dist, rssContent],
50-
[__robots_dist, robotsContent],
51-
].forEach(async ([path, content]) => {
52-
if (!await exists(path)) await ensureFile(path)
53-
await Deno.writeTextFile(path, content)
54-
})
49+
;[
50+
[__cname_dist, website.slice('https://'.length, -1)],
51+
[__sitemap_dist, itemsSitemap],
52+
[__rss_dist, rssContent],
53+
[__robots_dist, robotsContent],
54+
].forEach(async ([path, content]) => {
55+
if (!await exists(path)) await ensureFile(path)
56+
await Deno.writeTextFile(path, content)
57+
})
5558
},
5659
)
5760
},

src/plugins/pages.js

Lines changed: 56 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
import { ensureDir } from 'fs'
2-
import { replaceBody, generatePage } from '../util/utils.js'
2+
import { generatePage, replaceBody } from '../util/utils.js'
33
import { templateBox, templateProcess } from '../util/template.js'
44
import { convertToUSA, handleUTC } from '../util/utils.js'
55

6-
76
export const pagesPlugin = {
87
name: 'pages',
98
/**@param {import("./core.js").Core} core */
@@ -20,65 +19,79 @@ export const pagesPlugin = {
2019
meta,
2120
(item) => new Date(item.date).getFullYear(),
2221
)
23-
await generatePage({ group: groupArchive, basePath: 'archive', dist, header, footer, version, author })
22+
await generatePage({
23+
group: groupArchive,
24+
basePath: 'archive',
25+
dist,
26+
header,
27+
footer,
28+
version,
29+
author,
30+
})
2431

2532
// Handle the tags
2633
const groupTags = Object.groupBy(
2734
meta.flatMap((item) => item.tags.map((tag) => ({ tag, ...item }))),
2835
(item) => item.tag,
2936
)
30-
await generatePage({ group: groupTags, basePath: 'tags', dist, header, footer, version, author })
37+
await generatePage({
38+
group: groupTags,
39+
basePath: 'tags',
40+
dist,
41+
header,
42+
footer,
43+
version,
44+
author,
45+
})
3146

3247
// Handle the home
33-
const homeDest = new URL('./home/', dist)
34-
let indexPage = await Deno.readTextFile(new URL('../index.html', src))
35-
indexPage = replaceBody(indexPage, header, footer, version)
36-
37-
const mLength = meta.length
38-
const lastPage = Math.ceil(mLength / 8)
39-
let content = ''
48+
const POST_PER_PAGE = 8
49+
const groupMetaData = Array.from(
50+
{ length: Math.ceil(meta.length / POST_PER_PAGE) },
51+
(_, index) =>
52+
meta.slice(index * POST_PER_PAGE, (index + 1) * POST_PER_PAGE),
53+
)
54+
const totalPage = groupMetaData.length
4055

41-
for (let index = 0; index < mLength; index++) {
42-
const { date, title, summary, tags } = meta[index]
43-
const aTags = tags.reduce(
56+
/**@param {string[]} */
57+
const generateTags = (/**@type {string[]} */ tags) =>
58+
tags.reduce(
4459
(acc, tag) =>
4560
acc +
4661
`<a class="tag" href="/./tags/${tag}/"><i class="fa-solid fa-tag"></i> ${tag}</a>`,
4762
'',
4863
)
49-
content += templateBox({
50-
place: `/./posts/${handleUTC(date)}/`,
51-
title,
52-
summary,
53-
time: convertToUSA(date),
54-
tags: aTags,
55-
})
56-
57-
if ((index + 1) % 8 === 0 || index + 1 === mLength) {
58-
const cur = index + 1 === mLength
59-
? lastPage
60-
: Math.floor((index + 1) / 8)
61-
const process = templateProcess({
62-
before: cur > 2 ? `/./home/${cur - 1}/` : '/',
63-
page: `${cur} / ${lastPage}`,
64-
after: index === mLength ? '#' : `/./home/${cur + 1}/`,
64+
const generateBox = (
65+
/**@type {import("../util/type.js").MetaData[]} */ meta,
66+
) => {
67+
return meta.map(({ date, title, summary, tags }) => {
68+
return templateBox({
69+
place: `/./posts/${handleUTC(date)}/`,
70+
title,
71+
summary,
72+
time: convertToUSA(date),
73+
tags: generateTags(tags),
6574
})
66-
const home = indexPage.replace(
67-
'<!-- Template -->',
68-
content + process,
69-
)
70-
71-
// Reset the content
72-
content = ''
75+
})
76+
}
7377

74-
// Generate the home dir
75-
if (cur !== 1) await ensureDir(new URL(`${cur}/`, homeDest))
76-
const url = cur === 1
77-
? new URL('./index.html', dist)
78-
: new URL(`${cur}/index.html`, homeDest)
78+
const indexPage = replaceBody(header, footer, version, src)
79+
for (const [index, metaData] of groupMetaData.entries()) {
80+
const content = generateBox(metaData).join('')
81+
const process = templateProcess({
82+
before: index <= 1 ? '/' : `/./home/${index}/`,
83+
page: `${index + 1} / ${totalPage}`,
84+
after: index === totalPage - 1 ? '#' : `/./home/${index + 2}/`,
85+
})
86+
const home = indexPage.replace('<!-- Template -->', content + process)
87+
const url = index === 0
88+
? new URL('./index.html', dist)
89+
: new URL(`./home/${index + 1}/index.html`, dist)
7990

80-
await Deno.writeTextFile(url, home)
91+
if (index !== 0) {
92+
await ensureDir(new URL(`./home/${index + 1}/`, dist))
8193
}
94+
await Deno.writeTextFile(url, home)
8295
}
8396
},
8497
)

src/util/type.js

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,12 @@
3131
*/
3232

3333
/**
34-
* @typedef {Object} Yaml
35-
* @property {string} [Yaml.name]
36-
* @property {string} Yaml.title
37-
* @property {string} [Yaml.summary]
38-
* @property {string[]} [Yaml.tags]
39-
* @property {string} [Yaml.date]
34+
* @typedef {Object} Yaml
35+
* @property {string} [Yaml.name]
36+
* @property {string} Yaml.title
37+
* @property {string} [Yaml.summary]
38+
* @property {string[]} [Yaml.tags]
39+
* @property {string} [Yaml.date]
4040
*/
4141

4242
/**
@@ -48,12 +48,12 @@
4848
*/
4949

5050
/**
51-
* @typedef {Object} GeneratePageOptions
52-
* @property {Record<string, import("../plugins/core.js").MetaData>} group
53-
* @property {"archive" | "tags"} basePath
54-
* @property {string} dist
55-
* @property {string} header
56-
* @property {string} footer
57-
* @property {string} version
58-
* @property {string} author
59-
*/
51+
* @typedef {Object} GeneratePageOptions
52+
* @property {Record<string, import("../plugins/core.js").MetaData>} group
53+
* @property {"archive" | "tags"} basePath
54+
* @property {string} dist
55+
* @property {string} header
56+
* @property {string} footer
57+
* @property {string} version
58+
* @property {string} author
59+
*/

src/util/utils.js

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,13 @@ export const replaceHead = async (metaData, content) => {
5050
}
5151

5252
/**
53-
* @param {string} body
5453
* @param {string} header
5554
* @param {string} footer
5655
* @param {string} version
56+
* @param {string} src
5757
*/
58-
export const replaceBody = (body, header, footer, version) => {
58+
export const replaceBody = (header, footer, version, src) => {
59+
const body = Deno.readTextFileSync(new URL('../index.html', src))
5960
return body.replace('<!-- Header -->', header)
6061
.replace('<!-- Footer -->', footer)
6162
.replace('<!-- base.css -->', `/public/css/base.${version}.css`)
@@ -67,10 +68,17 @@ export const replaceBody = (body, header, footer, version) => {
6768
/**
6869
* @param {import("./type.js").GeneratePageOptions}
6970
*/
70-
export async function generatePage({ group, basePath, dist, header, footer, version, author }) {
71+
export async function generatePage(
72+
{ group, basePath, dist, header, footer, version, author },
73+
) {
7174
const url = new URL(`./${basePath}/index.html`, dist)
7275
const keys = Object.keys(group)
73-
const head = await replaceHead({ keywords: keys.join(', '), description: `${author} ~ ${basePath}`, title: `${author} ~ ${basePath}`, version })
76+
const head = await replaceHead({
77+
keywords: keys.join(', '),
78+
description: `${author} ~ ${basePath}`,
79+
title: `${author} ~ ${basePath}`,
80+
version,
81+
})
7482

7583
// a tags
7684
const body = templateArticle({
@@ -88,20 +96,28 @@ export async function generatePage({ group, basePath, dist, header, footer, vers
8896

8997
for (const [key, items] of Object.entries(group)) {
9098
const itemUrl = new URL(`./${basePath}/${key}/index.html`, dist)
91-
const itemHead = await replaceHead({ keywords: [...new Set(items.flatMap((item) => item.tags))], description: `${author} ~ ${key}`, title: `${author} ~ ${key}`, version })
99+
const itemHead = await replaceHead({
100+
keywords: [...new Set(items.flatMap((item) => item.tags))],
101+
description: `${author} ~ ${key}`,
102+
title: `${author} ~ ${key}`,
103+
version,
104+
})
92105
if (!await exists(itemUrl)) await ensureFile(itemUrl)
93106

94107
// p tags
95108
const p = items.reduce(
96109
(acc, { date, summary }) => {
97110
const place = `/./posts/${handleUTC(date)}/index.html`
98111
return acc +
99-
`<p><a class="decoration-line" href=${place} target="_blank"> ${summary} ··· ${convertToUSA(date)
112+
`<p><a class="decoration-line" href=${place} target="_blank"> ${summary} ··· ${
113+
convertToUSA(date)
100114
}</a></p>`
101115
},
102116
'',
103117
)
104-
const itemBody = `${itemHead}${header}${templateArticle({ title: key, content: p })}${footer}`
118+
const itemBody = `${itemHead}${header}${
119+
templateArticle({ title: key, content: p })
120+
}${footer}`
105121
await Deno.writeTextFile(itemUrl, itemBody)
106122
}
107123
}
@@ -179,5 +195,3 @@ const handler = async (request, version) => {
179195

180196
return new Response(compress.readable, { headers })
181197
}
182-
183-

0 commit comments

Comments
 (0)