-
Notifications
You must be signed in to change notification settings - Fork 0
/
zou.config.js
142 lines (120 loc) · 3.88 KB
/
zou.config.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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
// zou.config.js
// Get Lodash in
const _ = require('lodash');
/* Import Data file*/
const store = require("./src/data/store.js");
const db = require('./src/data/db.js');
const nav = require('./src/data/nav.js');
const tags = _.uniqBy( _.flatMap(db.pages, 'tags') );
/* Data to use from .njk files */
/* <h2>{{data.appName}}</h2> */
/* {% for link in data.links %} ... {% endfor %}*/
const data = {
appName: 'full',
links: store.links,
pages: db.pages,
navMain: nav.navMain,
tags: tags,
};
module.exports = {
"options": {
/**
* A path to the file containing data for the template.
* If you want to pass an object, use "render.context" instead.
*/
//"data": "src/njk/data/data.js",
/**
* A hook that's called before calling nunjucks.render()
* but after nunjucks.configure().
*
* Return false to skip rendering (and writing).
*/
beforeRender (nunjucksEnv, renderName, renderData) {
let nunjucks = this;
nunjucksEnv.addFilter('shorten', function(str, count) {
return str.trim().slice(0, count || 5);
});
// Get data of a particular Tag (from frontmatter)
// {% for posts data.pages | withTag('racoon') %}
nunjucksEnv.addFilter('withTag', function(input, tag){
function byTag(input) {
return input.tags.includes(tag);
}
return input.filter(byTag);
});
// Collections. Get pages with urls including a pattern
// {% for posts data.pages | urlInc('/blog/') %}
nunjucksEnv.addFilter('urlInc', function(input, url){
function byUrl(input) {
return input.url.includes(url);
}
return input.filter(byUrl);
});
// Frontmatter data of the curent page
// {% for posts data.pages | urlIs('/blog/article-one') %}
nunjucksEnv.addFilter('urlIs', function(input, url){
function byUrl(input) {
return input.url === url;
}
return input.filter(byUrl);
});
// Limt the amount of results from/to. 3 most recent posts:
// {% for posts in data.pages | reverse | urlInc('/blog/') | limitFormTo(0, 3) %}
// The selection function works on numbers and strings too.
nunjucksEnv.addFilter('limitFromTo', function(input, from, limit) {
'use strict';
if(typeof limit !== 'number'){
return input;
}
if(typeof input === 'string'){
if(limit >= 0){
return input.substring(from, limit);
} else {
return input.substr(limit);
}
}
if(Array.isArray(input)){
limit = Math.min(limit, input.length);
if(limit >= 0){
return input.splice(from, limit);
} else {
return input.splice(input.length + limit, input.length);
}
}
return input;
});
},
/**
* A hook that's called after calling nunjucks.render()
* but before writing to a file.
*
* Return false to skip writing.
*/
beforeWrite (destinationFilepath, renderResult) { let nunjucks = this; }
},
/**
* The following keys are members of Nunjucks.
* To modify any parameter or see possible values,
* please check https://mozilla.github.io/nunjucks/api.html
*/
// Executes nunjucks.configure([path], [options]).
"configure": {
"path": undefined,
"options": {
"autoescape": true,
"throwOnUndefined": false,
// ...
}
},
// Executes nunjucks.render(name, [context], [callback]).
"render": {
"name": undefined, // You shouldn't change this.
/**
* An object literal containing the data for the template.
* If you need to load data from a file, use "options.data" instead.
* If you decide to use "options.data" too, this property will be assigned to it.
*/
"context": {data},
"callback": () => {} // Not modificable.
}
};