1 | const _url = require("url");
|
2 | const _ = require("lodash");
|
3 | const absolutify = require("absolutify");
|
4 | const urljoin = require("url-join");
|
5 |
|
6 | exports.feed = function(children) {
|
7 | return e("feed", { xmlns: "http://www.w3.org/2005/Atom" }, children);
|
8 | };
|
9 |
|
10 | exports.title = function(title) {
|
11 | return e("title", {}, escapeHTML(title));
|
12 | };
|
13 |
|
14 | exports.link = function(target = "", rel = "") {
|
15 | return e("link", { href: target, rel }, "");
|
16 | };
|
17 |
|
18 | exports.updated = function(date) {
|
19 | return e("updated", {}, date);
|
20 | };
|
21 |
|
22 | exports.id = function(value) {
|
23 | return e("id", {}, value);
|
24 | };
|
25 |
|
26 | exports.author = function(author) {
|
27 | return e("author", {}, [
|
28 | e("name", {}, author ? escapeHTML(author.name || author) : ""),
|
29 | e("email", {}, author ? author.email || "" : ""),
|
30 | ]);
|
31 | };
|
32 |
|
33 | exports.entries = function({ baseUrl, sections, pages, get }) {
|
34 | return _.map(pages, function(page, name) {
|
35 | const sectionName = page.sectionName;
|
36 |
|
37 | if (!_.includes(sections, sectionName) || page.type !== "page") {
|
38 | return null;
|
39 | }
|
40 |
|
41 | const pageTitle = get.title(page);
|
42 | const pageContent = get.content(page);
|
43 | const pageDate = get.date(page);
|
44 |
|
45 | return e("entry", {}, [
|
46 | e("title", {}, escapeHTML(pageTitle)),
|
47 | e(
|
48 | "id",
|
49 | {},
|
50 | "a" +
|
51 | _.camelCase(_.escape(_.deburr(pageTitle))).toLowerCase() +
|
52 | pageDate.toLowerCase()
|
53 | ),
|
54 | e("link", { href: _url.resolve(baseUrl, name) }, ""),
|
55 | e("updated", {}, pageDate),
|
56 | e(
|
57 | "content",
|
58 | { type: "html" },
|
59 | escapeHTML(resolveUrls(baseUrl, sectionName, pageContent))
|
60 | ),
|
61 | ]);
|
62 | })
|
63 | .filter(_.identity)
|
64 | .join("");
|
65 | };
|
66 |
|
67 | function e(name, attributes, content) {
|
68 | let attrStr = _.map(attributes, function(val, key) {
|
69 | return key + '="' + val + '"';
|
70 | });
|
71 | let ret = content;
|
72 |
|
73 | attrStr = attrStr.length ? " " + attrStr.join(" ") : "";
|
74 |
|
75 | if (_.isArray(content)) {
|
76 | ret = content.join("");
|
77 | }
|
78 |
|
79 | return "<" + name + attrStr + ">" + ret + "</" + name + ">";
|
80 | }
|
81 |
|
82 | function resolveUrls(baseUrl, section, content) {
|
83 | return absolutify(content, function(url, attrName) {
|
84 | if (!url.indexOf("./")) {
|
85 | return urljoin(baseUrl, section, _.trimStart(url, "./"));
|
86 | }
|
87 |
|
88 | if (attrName === "href") {
|
89 | return _.trimEnd(_url.resolve(baseUrl, url), "/");
|
90 | }
|
91 |
|
92 | return url;
|
93 | });
|
94 | }
|
95 |
|
96 | function escapeHTML(input) {
|
97 | if (!input) {
|
98 | return "";
|
99 | }
|
100 |
|
101 | return input
|
102 | .replace(/&/g, "&")
|
103 | .replace(/</g, "<")
|
104 | .replace(/>/g, ">")
|
105 | .replace(/"/g, """)
|
106 | .replace(/'/g, "'");
|
107 | }
|