/
.eleventy.js
127 lines (119 loc) · 3.93 KB
/
.eleventy.js
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
require('dotenv').config();
const eleventyGoogleFonts = require("eleventy-google-fonts");
const pluginRss = require("@11ty/eleventy-plugin-rss");
const CleanCSS = require("clean-css");
const ogImg = require("./ogImg");
const {
fortawesomeBrandsPlugin,
} = require('@vidhill/fortawesome-brands-11ty-shortcode');
const {
fortawesomeFreeRegularPlugin,
} = require('@vidhill/fortawesome-free-regular-11ty-shortcode');
const {
fortawesomeSolidShortcode,
} = require('@vidhill/fortawesome-solid-11ty-shortcode');
const markdownIt = require("markdown-it");
let mdOptions = {
html: true,
breaks: true,
linkify: true,
typographer: true,
};
module.exports = config => {
config.addLayoutAlias('base', 'layouts/base.njk');
config.addLayoutAlias('post', 'layouts/post.njk');
config.addLayoutAlias('page', 'layouts/page.njk');
config.addLayoutAlias('home', 'layouts/home.njk');
config.addLayoutAlias('resume', 'layouts/resume.njk');
// Copy images and files to dist directory.
config.addPassthroughCopy('./src/img/');
config.addPassthroughCopy('./src/files/');
config.addPassthroughCopy('./src/_redirects');
config.addPassthroughCopy('./src/_headers');
config.addPassthroughCopy('./src/browserconfig.xml');
config.addPassthroughCopy('./src/manifest.json');
// Plugins
config.addPlugin(eleventyGoogleFonts);
config.addPlugin(pluginRss);
const md = markdownIt(mdOptions)
.use(require('markdown-it-footnote'))
.use(require('markdown-it-mathjax3'))
.use(require('@sup39/markdown-it-attr'))
.use(require('markdown-it-bracketed-spans'));
config.setLibrary("md", md);
config.addPlugin(fortawesomeBrandsPlugin);
// Shortcodes
config.addShortcode('fortawesomeSolid', fortawesomeSolidShortcode);
config.addShortcode("thisYear", () => {
const date = new Date();
return date.getFullYear().toString();
});
// Filters
config.addFilter("dateDisplay", require("./filters/dates.js"))
config.addFilter('w3DateFilter', require("./filters/w3-date-filter.js"));
config.addFilter("cssmin", (code) => {
return new CleanCSS({
level: {
1: {
all: true, // set all values to `false`
tidySelectors: true // turns on optimizing selectors
}
}
}).minify(code).styles;
});
config.addFilter("keys", obj => Object.keys(obj));
config.addNunjucksAsyncFilter("ogFeedImg", (slug, callback) => {
ogImg.get(slug).then((value) => {
const img = value ? `<p><img src="${value}" alt="${slug}" /></p>` : '';
callback(null, img);
}).catch((err) => {
console.error(err);
callback(null, null);
});
});
config.addNunjucksAsyncFilter("ogImg", (meta, callback) => {
ogImg.make(meta).then((value) => {
callback(null, value);
}).catch((err) => {
console.error(err);
callback(null, null);
});
});
config.addFilter("pinnedSort", collection => {
const sorted = collection
.filter(a => !a.data.pinned);
const pinned = collection.filter(a => a.data.pinned);
return pinned.concat(sorted);
});
config.addFilter("limit", (arr, limit) => arr.slice(0, limit));
config.addFilter("sitemapClean", (arr) => {
return arr.filter(a => !!a.data.title);
});
function filterTagList(tags) {
return (tags || []).filter(
(tag) =>
["all", "nav", "post", "posts", "page", "pages", "articles", "article"].indexOf(tag) === -1
);
}
config.addFilter("filterTagList", filterTagList);
// Collections
config.addCollection("articles", function (collectionApi) {
return collectionApi.getFilteredByGlob("./src/article/*.md")
.reverse();
});
// Create an array of all tags
config.addCollection("tagList", function (collection) {
let tagSet = new Set();
collection.getAll().forEach((item) => {
(item.data.tags || []).forEach((tag) => tagSet.add(tag));
});
return filterTagList([...tagSet]);
});
return {
dir: {
input: 'src',
output: 'dist',
data: '_data',
}
};
};