UNPKG

2.54 kBJavaScriptView Raw
1const _url = require("url");
2const _ = require("lodash");
3const absolutify = require("absolutify");
4const urljoin = require("url-join");
5
6exports.feed = function(children) {
7 return e("feed", { xmlns: "http://www.w3.org/2005/Atom" }, children);
8};
9
10exports.title = function(title) {
11 return e("title", {}, escapeHTML(title));
12};
13
14exports.link = function(target = "", rel = "") {
15 return e("link", { href: target, rel }, "");
16};
17
18exports.updated = function(date) {
19 return e("updated", {}, date);
20};
21
22exports.id = function(value) {
23 return e("id", {}, value);
24};
25
26exports.author = function(author) {
27 return e("author", {}, [
28 e("name", {}, author ? escapeHTML(author.name || author) : ""),
29 e("email", {}, author ? author.email || "" : ""),
30 ]);
31};
32
33exports.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
67function 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
82function 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
96function escapeHTML(input) {
97 if (!input) {
98 return "";
99 }
100
101 return input
102 .replace(/&/g, "&amp;")
103 .replace(/</g, "&lt;")
104 .replace(/>/g, "&gt;")
105 .replace(/"/g, "&quot;")
106 .replace(/'/g, "&apos;");
107}