generated from LarsBodewig/Template
-
Notifications
You must be signed in to change notification settings - Fork 0
/
.eleventy.js
119 lines (116 loc) · 4.13 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
import config from "./config.js";
import { format } from "prettier";
import { defaultOperators } from 'liquidjs';
import nanomatch from "nanomatch";
import prettierXml from "@prettier/plugin-xml";
export default function (eleventyConfig) {
Object.entries(config).forEach(([key, value]) =>
eleventyConfig.addGlobalData(key, value));
if (!config.server.suffixPaths) {
const oldUrlFilter = eleventyConfig.getFilter("url");
eleventyConfig.addFilter("url", (url) => {
const path = oldUrlFilter(url);
if (path.endsWith("/")) {
if (path.length > 1) {
return path.substring(0, path.length - 1);
}
}
return path;
});
}
eleventyConfig.setLiquidOptions({
...config.liquid,
operators: {
...defaultOperators,
'+': (a, b) => a + b,
'mod': (a, b) => a % b,
'inCol': (elem, collection) =>
collection.some(item => item.url === elem.url),
'from': (elem, collection) =>
collection.find(item => item.url === elem.url),
'in': (field, obj) => field in obj,
",": (a, b) => [
...(Array.isArray(a) ? a : [a]),
...(Array.isArray(b) ? b : [b])
],
},
strictVariables: true,
lenientIf: true,
});
config.passthrough.forEach(rule => eleventyConfig.addPassthroughCopy(rule));
if (config.favicon) {
eleventyConfig.addPassthroughCopy({ [config.favicon]: 'favicon.svg' });
}
eleventyConfig.addFilter("asset", (file) => {
const url = "/assets/" + file;
const path = eleventyConfig.getFilter("url")(url);
return path;
});
eleventyConfig.addFilter("absoluteUrl", (url) => {
const host = config.server.protocol + "://" + config.server.domain;
const path = eleventyConfig.getFilter("url")(url);
return host + path;
});
eleventyConfig.addFilter("absoluteUrlNoPrefix", (url) => {
const host = config.server.protocol + "://" + config.server.domain;
return host + "/" + url;
});
eleventyConfig.addFilter("encode", (value) => {
const encoded = value.split("")
.map(c => c.charCodeAt(0).toString(16).padStart(2, "0"))
.join("");
return encoded;
});
eleventyConfig.addFilter("color", (value) => {
let h = 0;
const s = 100;
let l = 0;
for (let i = 0; i < value.length; i++) {
const code = value.charCodeAt(i);
h += code;
if (i % 2) l += code;
}
h = h % 360;
if (h > 40 && h < 200) {
l = l % 20 + 20;
} else {
l = l % 30 + 30;
}
return "hsl(" + h + ',' + s + '%,' + l + '%)';
});
eleventyConfig.addFilter("hash", (value) => {
let hash = 0;
for (let i = 0; i < value.length; i++) {
const char = value.charCodeAt(i);
hash = (hash << 5) - hash + char;
hash = hash & hash;
}
return hash;
});
eleventyConfig.addFilter("sortBy", (collection, ...fields) => {
const colCopy = [...collection];
colCopy.sort((left, right) => {
for (const field of fields) {
const valueLeft = left.data[field].toString();
const valueRight = right.data[field].toString();
const result = valueLeft.localeCompare(valueRight);
if (result !== 0) return result;
}
return 0;
});
return colCopy;
});
eleventyConfig.addTransform("prettier", async (content, outputPath) => {
const excluded = nanomatch(outputPath, config.prettierExclude);
if (excluded.length) { // empty if outputPath is not excluded
return content.trimStart();
}
const text = content.trim(); // prettier fails on leading newline
return await format(text, {
...config.prettier,
filepath: outputPath,
plugins: [prettierXml]
});
});
return config.eleventyConfig;
};