diff options
| author | nsfisis <nsfisis@gmail.com> | 2025-11-02 17:49:34 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2025-11-02 17:49:34 +0900 |
| commit | 57315c52be96d2a2c013f0cfb0de5429980e301a (patch) | |
| tree | 5d691497772fddfe401cd970ead4e9a74b34ef38 /services/nuldoc/nuldoc-src/slide/slide.ts | |
| parent | cf4091a93ed831456e8b30e2a9e1fc2650dcae02 (diff) | |
| download | nsfisis.dev-57315c52be96d2a2c013f0cfb0de5429980e301a.tar.gz nsfisis.dev-57315c52be96d2a2c013f0cfb0de5429980e301a.tar.zst nsfisis.dev-57315c52be96d2a2c013f0cfb0de5429980e301a.zip | |
refactor(blog): rename directory, services/{blog => nuldoc}/
Diffstat (limited to 'services/nuldoc/nuldoc-src/slide/slide.ts')
| -rw-r--r-- | services/nuldoc/nuldoc-src/slide/slide.ts | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/services/nuldoc/nuldoc-src/slide/slide.ts b/services/nuldoc/nuldoc-src/slide/slide.ts new file mode 100644 index 0000000..8fe99ea --- /dev/null +++ b/services/nuldoc/nuldoc-src/slide/slide.ts @@ -0,0 +1,67 @@ +import { SlideError } from "../errors.ts"; +import { Revision, stringToDate } from "../revision.ts"; +import { z } from "zod/mod.ts"; + +export const SlideMetadataSchema = z.object({ + slide: z.object({ + uuid: z.string(), + title: z.string(), + event: z.string(), + talkType: z.string(), + link: z.string(), + tags: z.array(z.string()), + revisions: z.array(z.object({ + date: z.string(), + remark: z.string(), + isInternal: z.boolean().optional(), + })), + }), +}); + +export type SlideMetadata = z.infer<typeof SlideMetadataSchema>; + +export type Slide = { + sourceFilePath: string; + uuid: string; + title: string; + event: string; + talkType: string; + slideLink: string; + tags: string[]; + revisions: Revision[]; +}; + +export function createNewSlideFromMetadata( + { slide }: SlideMetadata, + sourceFilePath: string, +): Slide { + const revisions = slide.revisions.map( + (rev, i) => { + const date = rev.date; + const remark = rev.remark; + const isInternal = rev.isInternal ?? false; + return { + number: i + 1, + date: stringToDate(date), + remark, + isInternal, + }; + }, + ); + if (revisions.length === 0) { + throw new SlideError( + `[slide.new] 'slide.revisions' field is empty`, + ); + } + + return { + sourceFilePath: sourceFilePath, + uuid: slide.uuid, + title: slide.title, + event: slide.event, + talkType: slide.talkType, + slideLink: slide.link, + tags: slide.tags, + revisions: revisions, + }; +} |
