aboutsummaryrefslogtreecommitdiffhomepage
path: root/nuldoc-src/docbook/document.ts
blob: b779ac7958c6592fee819de1bdb0971ce475a45e (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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import { join } from "std/path/mod.ts";
import { Config } from "../config.ts";
import { DocBookError } from "../errors.ts";
import { Revision } from "../revision.ts";
import {
  Element,
  findChildElements,
  findFirstChildElement,
  innerText,
} from "../dom.ts";

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

export function createNewDocumentFromRootElement(
  root: Element,
  sourceFilePath: string,
  config: Config,
): Document {
  const article = findFirstChildElement(root, "article");
  if (!article) {
    throw new DocBookError(
      `[docbook.new] <article> element not found`,
    );
  }
  const info = findFirstChildElement(article, "info");
  if (!info) {
    throw new DocBookError(
      `[docbook.new] <info> element not found`,
    );
  }

  const titleElement = findFirstChildElement(info, "title");
  if (!titleElement) {
    throw new DocBookError(
      `[docbook.new] <title> element not found`,
    );
  }
  const title = innerText(titleElement).trim();
  const abstractElement = findFirstChildElement(info, "abstract");
  if (!abstractElement) {
    throw new DocBookError(
      `[docbook.new] <abstract> element not found`,
    );
  }
  const summary = innerText(abstractElement).trim();
  const keywordsetElement = findFirstChildElement(info, "keywordset");
  let tags: string[];
  if (!keywordsetElement) {
    tags = [];
  } else {
    tags = findChildElements(keywordsetElement, "keyword").map((x) =>
      innerText(x).trim()
    );
  }
  const revhistoryElement = findFirstChildElement(info, "revhistory");
  if (!revhistoryElement) {
    throw new DocBookError(
      `[docbook.new] <revhistory> element not found`,
    );
  }
  const revisions = findChildElements(revhistoryElement, "revision").map(
    (x, i) => {
      const dateElement = findFirstChildElement(x, "date");
      if (!dateElement) {
        throw new DocBookError(
          `[docbook.new] <date> element not found`,
        );
      }
      const revremarkElement = findFirstChildElement(x, "revremark");
      if (!revremarkElement) {
        throw new DocBookError(
          `[docbook.new] <revremark> element not found`,
        );
      }
      return {
        number: i + 1,
        date: innerText(dateElement).trim(),
        remark: innerText(revremarkElement).trim(),
      };
    },
  );
  if (revisions.length === 0) {
    throw new DocBookError(
      `[docbook.new] <revision> element not found`,
    );
  }

  const cwd = Deno.cwd();
  const contentDir = join(cwd, config.locations.contentDir);
  const link = sourceFilePath.replace(contentDir, "").replace(".xml", "/");
  return {
    root: root,
    title: title,
    summary: summary,
    tags: tags,
    revisions: revisions,
    sourceFilePath: sourceFilePath,
    link: link,
  };
}