From 89a153ddffffcc7210d699096c5cc76ca4c58404 Mon Sep 17 00:00:00 2001 From: miyaji255 <84168445+miyaji255@users.noreply.github.com> Date: Sat, 3 Feb 2024 19:29:03 +0900 Subject: [PATCH] =?UTF-8?q?#55=20=E3=82=BF=E3=82=B0=E3=82=AB=E3=83=86?= =?UTF-8?q?=E3=82=B4=E3=83=AA=E3=83=BC=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/blog/BlogTitle.astro | 2 +- src/components/blog/tag/TagCategoryNav.astro | 34 +++++ src/components/blog/tag/TagListPage.astro | 42 +++++ src/components/blog/tag/TagListSection.astro | 1 + src/components/layout/nav/BlogNav.astro | 24 +-- src/content/_schema.json | 143 ++++++++++-------- src/content/_schema.ts | 3 + src/content/config.ts | 13 ++ src/content/tags/advent-calendar.json | 3 +- src/content/tags/arduino.json | 1 + src/content/tags/asp.net.json | 1 + src/content/tags/astro.json | 1 + src/content/tags/automation.json | 3 +- src/content/tags/blender.json | 3 +- src/content/tags/c-cpp.json | 1 + src/content/tags/csharp.json | 1 + src/content/tags/discord-bot.json | 1 + src/content/tags/docker.json | 1 + src/content/tags/dotnet.json | 1 + src/content/tags/electronic-dictionary.json | 1 + src/content/tags/fashion.json | 3 +- src/content/tags/for-beginer.json | 3 +- src/content/tags/git.json | 1 + src/content/tags/go.json | 1 + src/content/tags/javascript.json | 3 +- src/content/tags/mad.json | 3 +- src/content/tags/markdown.json | 1 + src/content/tags/mixamo.json | 3 +- src/content/tags/open-cv.json | 3 +- src/content/tags/open-xml.json | 3 +- src/content/tags/oracle-cloud.json | 3 +- src/content/tags/power-point.json | 3 +- src/content/tags/python.json | 1 + src/content/tags/reaper.json | 3 +- src/content/tags/rest-api.json | 1 + src/content/tags/rust.json | 1 + src/content/tags/shell.json | 1 + src/content/tags/tello.json | 1 + src/content/tags/transcribe.json | 3 +- src/content/tags/typst.json | 1 + src/content/tags/unity.json | 1 + src/content/tags/vrchat.json | 3 +- src/content/tags/vrm.json | 3 +- src/content/tags/whisper.json | 3 +- src/content/tags/winforms.json | 1 + src/content/tags/workshop.json | 3 +- src/pages/blog/tags/[category].astro | 15 ++ .../tags/{[slug]/index.astro => [slug].astro} | 0 src/pages/blog/tags/index.astro | 33 +--- 49 files changed, 262 insertions(+), 122 deletions(-) create mode 100644 src/components/blog/tag/TagCategoryNav.astro create mode 100644 src/components/blog/tag/TagListPage.astro create mode 100644 src/pages/blog/tags/[category].astro rename src/pages/blog/tags/{[slug]/index.astro => [slug].astro} (100%) diff --git a/src/components/blog/BlogTitle.astro b/src/components/blog/BlogTitle.astro index df59775..b21e9f6 100644 --- a/src/components/blog/BlogTitle.astro +++ b/src/components/blog/BlogTitle.astro @@ -11,7 +11,7 @@ const { title, background } = Astro.props class:list={[ 'bg-dot flex items-center justify-center gap-x-5 py-6 text-6xl', { - 'bg-dot-white': background === 'white', + 'bg-dot-white border-t': background === 'white', 'bg-dot-primary': background === 'primary', 'bg-dot-secondary': background === 'secondary', }, diff --git a/src/components/blog/tag/TagCategoryNav.astro b/src/components/blog/tag/TagCategoryNav.astro new file mode 100644 index 0000000..5be7d4c --- /dev/null +++ b/src/components/blog/tag/TagCategoryNav.astro @@ -0,0 +1,34 @@ +--- +import { TagCategoryMapping, type TagCategory } from '@/content/config' + +export type TagNavCategory = 'all' | TagCategory + +interface Props { + category: TagNavCategory +} +const { category } = Astro.props +const tagCategoryEntries = [['all', '全般'], ...TagCategoryMapping] as const +--- + + diff --git a/src/components/blog/tag/TagListPage.astro b/src/components/blog/tag/TagListPage.astro new file mode 100644 index 0000000..a1f4415 --- /dev/null +++ b/src/components/blog/tag/TagListPage.astro @@ -0,0 +1,42 @@ +--- +import BlogLayout from '@/layouts/BlogLayout.astro' +import { getCollection } from 'astro:content' +import { getTagStatistics } from '@/content/_blog-statistics' +import TagListSection from '@/components/blog/tag/TagListSection.astro' +import type { TagNavCategory } from './TagCategoryNav.astro' +import TagCategoryNav from './TagCategoryNav.astro' + +interface Props { + category: TagNavCategory +} + +const { category } = Astro.props +const [tagEntries, statistics] = await Promise.all([ + getCollection('tags'), + getTagStatistics(), +] as const) + +const tags = tagEntries + .filter((tag) => category === 'all' || category === tag.data.category) + .map((tag) => ({ + ...tag, + articleCount: statistics[tag.id].length, + lastPostedTime: statistics[tag.id][0]?.time ?? 0, + })) +tags.sort((tag1, tag2) => + tag2.articleCount !== tag1.articleCount + ? tag2.articleCount - tag1.articleCount + : tag2.lastPostedTime - tag1.lastPostedTime, +) +--- + + + +
+ + + + + +
+
diff --git a/src/components/blog/tag/TagListSection.astro b/src/components/blog/tag/TagListSection.astro index 04efdd3..6890ce4 100644 --- a/src/components/blog/tag/TagListSection.astro +++ b/src/components/blog/tag/TagListSection.astro @@ -13,5 +13,6 @@ const { title, tags } = Astro.props
{title} +
diff --git a/src/components/layout/nav/BlogNav.astro b/src/components/layout/nav/BlogNav.astro index 5665fd7..6aa1342 100644 --- a/src/components/layout/nav/BlogNav.astro +++ b/src/components/layout/nav/BlogNav.astro @@ -1,29 +1,35 @@ --- +import { TagCategoryMapping } from '@/content/config' + const current = Astro.url.pathname -const navList: { target: string; title: string }[] = [ +const navList = [ { - target: '/blog', + target: '/blog/', title: '記事一覧', + isHere: current === '/blog/', }, { - target: '/blog/tags', + target: '/blog/tags/', title: 'タグ一覧', + isHere: [ + '/blog/tags/', + ...TagCategoryMapping.map(([category]) => `/blog/tags/${category}/`), + ].includes(current), }, -] +] as const satisfies { target: string; title: string; isHere: boolean }[] --- -
+
{ - navList.map(({ target, title }) => ( + navList.map(({ target, title, isHere }) => ( diff --git a/src/content/_schema.json b/src/content/_schema.json index 26527f8..6261c0e 100644 --- a/src/content/_schema.json +++ b/src/content/_schema.json @@ -1,72 +1,89 @@ { - "$schema": "http://json-schema.org/draft-07/schema#", - "definitions": { - "AuthorSchema": { - "title": "AuthorSchema", - "type": "object", - "properties": { - "name": { - "type": "string", - "title": "name" - }, - "description": { - "type": "string", - "title": "description" - }, - "github": { - "type": "string", - "title": "github" - }, - "image": { - "type": "string", - "title": "image" - } - }, - "additionalProperties": false, - "required": ["name"] - }, - "TagSchema": { - "title": "TagSchema", - "type": "object", - "properties": { - "name": { - "type": "string", - "title": "name" - }, - "description": { - "type": "string", - "title": "description" - }, - "image": { - "type": "string", - "title": "image" - }, - "fullSizeImage": { - "type": "boolean", - "title": "fullSizeImage" + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "AuthorSchema": { + "title": "AuthorSchema", + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "name" + }, + "description": { + "type": "string", + "title": "description" + }, + "github": { + "type": "string", + "title": "github" + }, + "image": { + "type": "string", + "title": "image" + } + }, + "additionalProperties": false, + "required": [ + "name" + ] }, - "links": { - "type": "array", - "items": { + "TagSchema": { + "title": "TagSchema", "type": "object", "properties": { - "url": { - "type": "string", - "title": "url" - }, - "text": { - "type": "string", - "title": "text" - } + "name": { + "type": "string", + "title": "name" + }, + "description": { + "type": "string", + "title": "description" + }, + "category": { + "enum": [ + "circle", + "other", + "tech" + ], + "type": "string", + "title": "category" + }, + "image": { + "type": "string", + "title": "image" + }, + "fullSizeImage": { + "type": "boolean", + "title": "fullSizeImage" + }, + "links": { + "type": "array", + "items": { + "type": "object", + "properties": { + "url": { + "type": "string", + "title": "url" + }, + "text": { + "type": "string", + "title": "text" + } + }, + "additionalProperties": false, + "required": [ + "text", + "url" + ] + }, + "title": "links" + } }, "additionalProperties": false, - "required": ["text", "url"] - }, - "title": "links" + "required": [ + "category", + "name" + ] } - }, - "additionalProperties": false, - "required": ["name"] } - } } diff --git a/src/content/_schema.ts b/src/content/_schema.ts index b75f1de..189561d 100644 --- a/src/content/_schema.ts +++ b/src/content/_schema.ts @@ -1,6 +1,8 @@ // JSON Schema 用定義 // こちらを更新した際は npm run json-schema も動かす +import type { TagCategory } from './config' + export interface AuthorSchema { name: string description?: string @@ -11,6 +13,7 @@ export interface AuthorSchema { export interface TagSchema { name: string description?: string + category: TagCategory image?: string fullSizeImage?: boolean links?: { diff --git a/src/content/config.ts b/src/content/config.ts index ad3b39b..2a382c4 100644 --- a/src/content/config.ts +++ b/src/content/config.ts @@ -42,12 +42,25 @@ const authorsCollection = defineCollection({ }), }) +export const TagCategoryMapping = [ + ['tech', '技術'], + ['circle', 'サークル'], + ['other', '雑記'], +] as const satisfies [string, string][] +export type TagCategory = (typeof TagCategoryMapping)[number][0] + const tagsCollection = defineCollection({ type: 'data', schema: ({ image }) => z.object({ name: z.string().min(1), description: z.string().optional(), + category: z.enum( + TagCategoryMapping.map(([category]) => category) as [ + TagCategory, + ...TagCategory[], + ], + ), links: z .array( z.object({ diff --git a/src/content/tags/advent-calendar.json b/src/content/tags/advent-calendar.json index b33d620..694e6d7 100644 --- a/src/content/tags/advent-calendar.json +++ b/src/content/tags/advent-calendar.json @@ -1,3 +1,4 @@ { - "name": "Advent Calendar" + "name": "Advent Calendar", + "category": "circle" } diff --git a/src/content/tags/arduino.json b/src/content/tags/arduino.json index def4a72..7f5b8c5 100644 --- a/src/content/tags/arduino.json +++ b/src/content/tags/arduino.json @@ -1,4 +1,5 @@ { "name": "Arduino", + "category": "tech", "image": "./arduino.svg" } diff --git a/src/content/tags/asp.net.json b/src/content/tags/asp.net.json index 8d5a399..502f64e 100644 --- a/src/content/tags/asp.net.json +++ b/src/content/tags/asp.net.json @@ -1,5 +1,6 @@ { "name": "ASP.NET Core", + "category": "tech", "image": "./dotnet.svg", "fullSizeImage": true, "links": [ diff --git a/src/content/tags/astro.json b/src/content/tags/astro.json index c526a1d..914b075 100644 --- a/src/content/tags/astro.json +++ b/src/content/tags/astro.json @@ -1,4 +1,5 @@ { "name": "Astro", + "category": "tech", "image": "./astro.svg" } diff --git a/src/content/tags/automation.json b/src/content/tags/automation.json index fb5a1e8..770e4af 100644 --- a/src/content/tags/automation.json +++ b/src/content/tags/automation.json @@ -1,3 +1,4 @@ { - "name": "自動化" + "name": "自動化", + "category": "tech" } diff --git a/src/content/tags/blender.json b/src/content/tags/blender.json index 6fc3062..3082a1f 100644 --- a/src/content/tags/blender.json +++ b/src/content/tags/blender.json @@ -1,3 +1,4 @@ { - "name": "Blender" + "name": "Blender", + "category": "tech" } diff --git a/src/content/tags/c-cpp.json b/src/content/tags/c-cpp.json index d7f290a..7176711 100644 --- a/src/content/tags/c-cpp.json +++ b/src/content/tags/c-cpp.json @@ -1,5 +1,6 @@ { "name": "C/C++", + "category": "tech", "description": "C/C++ は低レイヤな処理を得意とし、高速に実行できるコンパイル型言語です。歴史が長く、また組み込み機器のような特殊な環境でも動作します。C と C++ は別の言語ですが、C++ が基本的には C を拡張した言語であるため、ひっくるめて C/C++ と呼ばれることがあります。", "image": "./cpp.svg", "links": [ diff --git a/src/content/tags/csharp.json b/src/content/tags/csharp.json index 757f830..a62d2bb 100644 --- a/src/content/tags/csharp.json +++ b/src/content/tags/csharp.json @@ -1,5 +1,6 @@ { "name": "C#", + "category": "tech", "description": "C#は、最新のタイプ セーフなオブジェクト指向のプログラミング言語です。 開発者は C# を使用することにより、.NET で稼働する、安全かつ堅牢な多くの種類のアプリケーションを構築できます。", "image": "./csharp.svg", "links": [ diff --git a/src/content/tags/discord-bot.json b/src/content/tags/discord-bot.json index 46de62c..d03a59c 100644 --- a/src/content/tags/discord-bot.json +++ b/src/content/tags/discord-bot.json @@ -1,4 +1,5 @@ { "name": "Discord Bot", + "category": "tech", "image": "./discord-bot.svg" } diff --git a/src/content/tags/docker.json b/src/content/tags/docker.json index 55fb880..0e3d4e8 100644 --- a/src/content/tags/docker.json +++ b/src/content/tags/docker.json @@ -1,4 +1,5 @@ { "name": "Docker", + "category": "tech", "image": "./docker.svg" } diff --git a/src/content/tags/dotnet.json b/src/content/tags/dotnet.json index 217215a..6dbed9b 100644 --- a/src/content/tags/dotnet.json +++ b/src/content/tags/dotnet.json @@ -1,6 +1,7 @@ { "name": ".NET", "description": ".NET は C#, F#, VB.NET などが実行可能な仮想マシンです。(JVM に似ています) クラスプラットフォームであるためどんな環境でも同じコードで実行できます。", + "category": "tech", "image": "./dotnet.svg", "fullSizeImage": true, "links": [ diff --git a/src/content/tags/electronic-dictionary.json b/src/content/tags/electronic-dictionary.json index 1ba3feb..7f02daa 100644 --- a/src/content/tags/electronic-dictionary.json +++ b/src/content/tags/electronic-dictionary.json @@ -1,6 +1,7 @@ { "name": "電子辞書", "description": "電子辞書を本来とは異なる目的で活用する、電子辞書ハック関係の記事群です。主に SHARP 社製カラー電子辞書シリーズの Brain を対象としています。SHARP 社とは無関係な非公式の内容であることに注意してください。", + "category": "tech", "image": "./electronic-dictionary.svg", "links": [ { diff --git a/src/content/tags/fashion.json b/src/content/tags/fashion.json index df03442..686ef8e 100644 --- a/src/content/tags/fashion.json +++ b/src/content/tags/fashion.json @@ -1,3 +1,4 @@ { - "name": "ファッション" + "name": "ファッション", + "category": "other" } diff --git a/src/content/tags/for-beginer.json b/src/content/tags/for-beginer.json index 96c626a..87207f8 100644 --- a/src/content/tags/for-beginer.json +++ b/src/content/tags/for-beginer.json @@ -1,3 +1,4 @@ { - "name": "初心者向け" + "name": "初心者向け", + "category": "tech" } diff --git a/src/content/tags/git.json b/src/content/tags/git.json index fb3175e..fdd4ce4 100644 --- a/src/content/tags/git.json +++ b/src/content/tags/git.json @@ -1,4 +1,5 @@ { "name": "Git", + "category": "tech", "image": "./git.svg" } diff --git a/src/content/tags/go.json b/src/content/tags/go.json index 3897316..1f4b727 100644 --- a/src/content/tags/go.json +++ b/src/content/tags/go.json @@ -1,5 +1,6 @@ { "name": "Go", + "category": "tech", "image": "./go.svg", "links": [ { diff --git a/src/content/tags/javascript.json b/src/content/tags/javascript.json index 8ac873a..2e952b7 100644 --- a/src/content/tags/javascript.json +++ b/src/content/tags/javascript.json @@ -1,3 +1,4 @@ { - "name": "JavaScript" + "name": "JavaScript", + "category": "tech" } diff --git a/src/content/tags/mad.json b/src/content/tags/mad.json index 323302a..071288f 100644 --- a/src/content/tags/mad.json +++ b/src/content/tags/mad.json @@ -1,3 +1,4 @@ { - "name": "音MAD" + "name": "音MAD", + "category": "other" } diff --git a/src/content/tags/markdown.json b/src/content/tags/markdown.json index 596fe5a..69e5b66 100644 --- a/src/content/tags/markdown.json +++ b/src/content/tags/markdown.json @@ -1,4 +1,5 @@ { "name": "Markdown", + "category": "tech", "image": "./markdown.svg" } diff --git a/src/content/tags/mixamo.json b/src/content/tags/mixamo.json index 6859e66..db2911a 100644 --- a/src/content/tags/mixamo.json +++ b/src/content/tags/mixamo.json @@ -1,3 +1,4 @@ { - "name": "Mixamo" + "name": "Mixamo", + "category": "tech" } diff --git a/src/content/tags/open-cv.json b/src/content/tags/open-cv.json index daab72a..8b1e9f2 100644 --- a/src/content/tags/open-cv.json +++ b/src/content/tags/open-cv.json @@ -1,3 +1,4 @@ { - "name": "OpenCV" + "name": "OpenCV", + "category": "tech" } diff --git a/src/content/tags/open-xml.json b/src/content/tags/open-xml.json index 1152812..e44fee1 100644 --- a/src/content/tags/open-xml.json +++ b/src/content/tags/open-xml.json @@ -1,3 +1,4 @@ { - "name": "OpenXML" + "name": "OpenXML", + "category": "tech" } diff --git a/src/content/tags/oracle-cloud.json b/src/content/tags/oracle-cloud.json index aa3ef64..81c8ca4 100644 --- a/src/content/tags/oracle-cloud.json +++ b/src/content/tags/oracle-cloud.json @@ -1,3 +1,4 @@ { - "name": "Oracle Cloud" + "name": "Oracle Cloud", + "category": "tech" } diff --git a/src/content/tags/power-point.json b/src/content/tags/power-point.json index 98e4633..75c69c3 100644 --- a/src/content/tags/power-point.json +++ b/src/content/tags/power-point.json @@ -1,3 +1,4 @@ { - "name": "Power Point" + "name": "Power Point", + "category": "tech" } diff --git a/src/content/tags/python.json b/src/content/tags/python.json index 3c5e2df..f59b2d6 100644 --- a/src/content/tags/python.json +++ b/src/content/tags/python.json @@ -1,6 +1,7 @@ { "name": "Python", "description": "Python はインタープリタ型の高水準汎用プログラミング言語です。", + "category": "tech", "image": "./python.svg", "links": [ { diff --git a/src/content/tags/reaper.json b/src/content/tags/reaper.json index 8005b80..a9b80a2 100644 --- a/src/content/tags/reaper.json +++ b/src/content/tags/reaper.json @@ -1,3 +1,4 @@ { - "name": "REAPER" + "name": "REAPER", + "category": "tech" } diff --git a/src/content/tags/rest-api.json b/src/content/tags/rest-api.json index f97cb5e..b392b93 100644 --- a/src/content/tags/rest-api.json +++ b/src/content/tags/rest-api.json @@ -1,4 +1,5 @@ { "name": "REST API", + "category": "tech", "image": "./rest-api.svg" } diff --git a/src/content/tags/rust.json b/src/content/tags/rust.json index 0eed2f4..00b8a73 100644 --- a/src/content/tags/rust.json +++ b/src/content/tags/rust.json @@ -1,4 +1,5 @@ { "name": "Rust", + "category": "tech", "image": "./rust.svg" } diff --git a/src/content/tags/shell.json b/src/content/tags/shell.json index 479d084..87b7d96 100644 --- a/src/content/tags/shell.json +++ b/src/content/tags/shell.json @@ -1,5 +1,6 @@ { "name": "Shell", "description": "Shell はコンピュータを人間が操作するための UI の総称ですが、狭義には Bash や Zsh のようなコマンドラインインタプリタ(CLI)を指します。UI として利用することはもちろん、パイプやリダイレクトを用いた高度な情報処理や、shell script を用いた自動化など、広く活用されています。", + "category": "tech", "image": "./bash.svg" } diff --git a/src/content/tags/tello.json b/src/content/tags/tello.json index 21d3e81..a85381a 100644 --- a/src/content/tags/tello.json +++ b/src/content/tags/tello.json @@ -1,6 +1,7 @@ { "name": "Tello", "description": "Tello、Tello eduはドローン界のAppleと言われるDJIと、CPU部分をIntelで共同開発し、Ryze Techから販売されているトイドローンです。", + "category": "tech", "links": [ { "url": "https://www.ryzerobotics.com/", diff --git a/src/content/tags/transcribe.json b/src/content/tags/transcribe.json index 3e864a5..ef2640d 100644 --- a/src/content/tags/transcribe.json +++ b/src/content/tags/transcribe.json @@ -1,3 +1,4 @@ { - "name": "文字起こし" + "name": "文字起こし", + "category": "tech" } diff --git a/src/content/tags/typst.json b/src/content/tags/typst.json index f4f376e..c5de18e 100644 --- a/src/content/tags/typst.json +++ b/src/content/tags/typst.json @@ -1,5 +1,6 @@ { "name": "Typst", + "category": "tech", "image": "./typst.png", "fullSizeImage": true, "links": [ diff --git a/src/content/tags/unity.json b/src/content/tags/unity.json index e684b06..4830a78 100644 --- a/src/content/tags/unity.json +++ b/src/content/tags/unity.json @@ -1,5 +1,6 @@ { "name": "Unity", + "category": "tech", "image": "./unity.svg", "links": [ { diff --git a/src/content/tags/vrchat.json b/src/content/tags/vrchat.json index a700cd6..d76cc78 100644 --- a/src/content/tags/vrchat.json +++ b/src/content/tags/vrchat.json @@ -1,3 +1,4 @@ { - "name": "VRChat" + "name": "VRChat", + "category": "tech" } diff --git a/src/content/tags/vrm.json b/src/content/tags/vrm.json index b3c91cb..2f734db 100644 --- a/src/content/tags/vrm.json +++ b/src/content/tags/vrm.json @@ -1,3 +1,4 @@ { - "name": "VRM" + "name": "VRM", + "category": "tech" } diff --git a/src/content/tags/whisper.json b/src/content/tags/whisper.json index 1567578..4f74570 100644 --- a/src/content/tags/whisper.json +++ b/src/content/tags/whisper.json @@ -1,3 +1,4 @@ { - "name": "Whisper" + "name": "Whisper", + "category": "tech" } diff --git a/src/content/tags/winforms.json b/src/content/tags/winforms.json index 995a926..04dd70f 100644 --- a/src/content/tags/winforms.json +++ b/src/content/tags/winforms.json @@ -1,6 +1,7 @@ { "name": "Windows Forms", "description": "Windows Forms (WinForms) はWindows 用の豊富なデスクトップ クライアント アプリを作成する UI フレームワークです。C# のUIフレームワークの中では最も古いためとても安定してます。", + "category": "tech", "image": "./dotnet.svg", "fullSizeImage": true, "links": [ diff --git a/src/content/tags/workshop.json b/src/content/tags/workshop.json index f9c21b0..c31990d 100644 --- a/src/content/tags/workshop.json +++ b/src/content/tags/workshop.json @@ -1,3 +1,4 @@ { - "name": "講習会" + "name": "講習会", + "category": "circle" } diff --git a/src/pages/blog/tags/[category].astro b/src/pages/blog/tags/[category].astro new file mode 100644 index 0000000..2b863dc --- /dev/null +++ b/src/pages/blog/tags/[category].astro @@ -0,0 +1,15 @@ +--- +import TagListPage from '@/components/blog/tag/TagListPage.astro' +import { TagCategoryMapping } from '@/content/config' + +export function getStaticPaths() { + return TagCategoryMapping.map(([category]) => ({ + params: { category }, + props: { category }, + })) +} + +const { category } = Astro.props +--- + + diff --git a/src/pages/blog/tags/[slug]/index.astro b/src/pages/blog/tags/[slug].astro similarity index 100% rename from src/pages/blog/tags/[slug]/index.astro rename to src/pages/blog/tags/[slug].astro diff --git a/src/pages/blog/tags/index.astro b/src/pages/blog/tags/index.astro index 5206717..aa2ac7d 100644 --- a/src/pages/blog/tags/index.astro +++ b/src/pages/blog/tags/index.astro @@ -1,34 +1,5 @@ --- -import BlogLayout from '@/layouts/BlogLayout.astro' -import { getCollection } from 'astro:content' -import { getTagStatistics } from '@/content/_blog-statistics' -import TagListSection from '@/components/blog/tag/TagListSection.astro' - -const tagEntries = await getCollection('tags') -const statistics = await getTagStatistics() -const tags = tagEntries - .filter( - (tag) => - ![ - // ignore tags - 'dgv', - 'astro', - ].includes(tag.id), - ) - .map((tag) => ({ - ...tag, - articleCount: statistics[tag.id].length, - lastPostedTime: statistics[tag.id][0]?.time ?? 0, - })) -tags.sort((tag1, tag2) => - tag2.articleCount !== tag1.articleCount - ? tag2.articleCount - tag1.articleCount - : tag2.lastPostedTime - tag1.lastPostedTime, -) +import TagListPage from '@/components/blog/tag/TagListPage.astro' --- - -
- -
-
+