diff options
| author | nsfisis <nsfisis@gmail.com> | 2025-06-27 23:39:31 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2025-06-27 23:39:31 +0900 |
| commit | 674fe965550444db87edc7937ff6932e1a918d9d (patch) | |
| tree | e8a80dd958d3e082485286bf5785a7992b6e6b0e /services/blog/nuldoc-src/slide | |
| parent | fe4d1d625b53796c5f20399790e5ff8c7a7e1608 (diff) | |
| download | nsfisis.dev-674fe965550444db87edc7937ff6932e1a918d9d.tar.gz nsfisis.dev-674fe965550444db87edc7937ff6932e1a918d9d.tar.zst nsfisis.dev-674fe965550444db87edc7937ff6932e1a918d9d.zip | |
feat(meta): rename vhosts/ directory to services/
Diffstat (limited to 'services/blog/nuldoc-src/slide')
| -rw-r--r-- | services/blog/nuldoc-src/slide/parse.ts | 20 | ||||
| -rw-r--r-- | services/blog/nuldoc-src/slide/slide.ts | 67 |
2 files changed, 87 insertions, 0 deletions
diff --git a/services/blog/nuldoc-src/slide/parse.ts b/services/blog/nuldoc-src/slide/parse.ts new file mode 100644 index 00000000..c5a89675 --- /dev/null +++ b/services/blog/nuldoc-src/slide/parse.ts @@ -0,0 +1,20 @@ +import { parse as parseToml } from "@std/toml"; +import { + createNewSlideFromMetadata, + Slide, + SlideMetadataSchema, +} from "./slide.ts"; + +export async function parseSlideFile(filePath: string): Promise<Slide> { + try { + const root = SlideMetadataSchema.parse( + parseToml(await Deno.readTextFile(filePath)), + ); + return createNewSlideFromMetadata(root, filePath); + } catch (e) { + if (e instanceof Error) { + e.message = `${e.message} in ${filePath}`; + } + throw e; + } +} diff --git a/services/blog/nuldoc-src/slide/slide.ts b/services/blog/nuldoc-src/slide/slide.ts new file mode 100644 index 00000000..8fe99eab --- /dev/null +++ b/services/blog/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, + }; +} |
