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,
sourceFilePath: sourceFilePath,
link: link,
title: title,
summary: summary,
tags: tags,
revisions: revisions,
};
}
|