feat(content): 支持内容集合中可选的日期字段

This commit is contained in:
KazooTTT
2025-03-04 14:08:17 +08:00
parent 5a7c9eced0
commit 0fc8c6cb80
2 changed files with 16 additions and 23 deletions

View File

@ -34,7 +34,10 @@ const post = defineCollection({
draft: z.boolean().default(false), draft: z.boolean().default(false),
banner: z.string().optional(), banner: z.string().optional(),
tags: z.array(z.string()).default([]).transform(removeDupsAndLowerCase), tags: z.array(z.string()).default([]).transform(removeDupsAndLowerCase),
date: z.union([z.string(), z.number(), z.date()]).transform(processDate), date: z
.union([z.string(), z.number(), z.date()])
.optional()
.transform((val) => (val ? processDate(val) : undefined)),
date_modified: z date_modified: z
.union([z.string(), z.number(), z.date()]) .union([z.string(), z.number(), z.date()])
.optional() .optional()
@ -52,7 +55,10 @@ const note = defineCollection({
loader: glob({ base: "./src/content/note", pattern: "**/*.{md,mdx}" }), loader: glob({ base: "./src/content/note", pattern: "**/*.{md,mdx}" }),
schema: baseSchema.extend({ schema: baseSchema.extend({
description: z.string().optional().nullable(), description: z.string().optional().nullable(),
date: z.union([z.string(), z.number(), z.date()]).transform(processDate), date: z
.union([z.string(), z.number(), z.date()])
.optional()
.transform((val) => (val ? processDate(val) : undefined)),
date_modified: z date_modified: z
.union([z.string(), z.number(), z.date()]) .union([z.string(), z.number(), z.date()])
.optional() .optional()

View File

@ -19,25 +19,12 @@ export function collectionDateSort(
a: CollectionEntry<"post" | "note">, a: CollectionEntry<"post" | "note">,
b: CollectionEntry<"post" | "note">, b: CollectionEntry<"post" | "note">,
) { ) {
return b.data.date.getTime() - a.data.date.getTime(); const getDate = (entry: CollectionEntry<"post" | "note">): Date => {
} if (entry.data.date) return entry.data.date;
if (entry.data.data_created) return entry.data.data_created;
const datePriorityForNote = ["date", "date_modified", "data_created"]; if (entry.data.date_modified) return entry.data.date_modified;
return new Date();
export function collectionModifiedDateSort( };
a: CollectionEntry<"post" | "note">,
b: CollectionEntry<"post" | "note">, return getDate(b).getTime() - getDate(a).getTime();
) {
let dateA: Date = new Date(),
dateB: Date = new Date();
datePriorityForNote.forEach((key) => {
if (a.data[key as keyof typeof a.data]) {
dateA = a.data[key as keyof typeof a.data] as Date;
}
if (b.data[key as keyof typeof b.data]) {
dateB = b.data[key as keyof typeof b.data] as Date;
}
});
return dateB.getTime() - dateA.getTime();
} }