summaryrefslogtreecommitdiffhomepage
path: root/vhosts/blog/nuldoc-src/djot/document.ts
blob: be9c08d5d38958d0538497b44dfca3f03f20df65 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import { Doc as DjotDoc } from "@djot/djot";
import { join } from "@std/path";
import { z } from "zod/mod.ts";
import { Config } from "../config.ts";
import { Element } from "../dom.ts";
import { Revision, stringToDate } from "../revision.ts";
import { djot2ndoc } from "./djot2ndoc.ts";

export const PostMetadataSchema = z.object({
  article: z.object({
    uuid: z.string(),
    title: z.string(),
    description: z.string(),
    tags: z.array(z.string()),
    revisions: z.array(z.object({
      date: z.string(),
      remark: z.string(),
      isInternal: z.boolean().optional(),
    })),
  }),
});

export type PostMetadata = z.infer<typeof PostMetadataSchema>;

export type Document = {
  root: Element;
  sourceFilePath: string;
  uuid: string;
  link: string;
  title: string;
  description: string; // TODO: should it be markup text?
  tags: string[];
  revisions: Revision[];
};

export function createNewDocumentFromDjotDocument(
  root: DjotDoc,
  meta: PostMetadata,
  sourceFilePath: string,
  config: Config,
): Document {
  const cwd = Deno.cwd();
  const contentDir = join(cwd, config.locations.contentDir);
  const link = sourceFilePath.replace(contentDir, "").replace(".xml", "/");
  return {
    root: djot2ndoc(root),
    sourceFilePath,
    uuid: meta.article.uuid,
    link: link,
    title: meta.article.title,
    description: meta.article.description,
    tags: meta.article.tags,
    revisions: meta.article.revisions.map((r, i) => ({
      number: i,
      date: stringToDate(r.date),
      remark: r.remark,
      isInternal: !!r.isInternal,
    })),
  };
}