aboutsummaryrefslogtreecommitdiff
path: root/gulpfile.js
diff options
context:
space:
mode:
authorMitja Felicijan <mitja.felicijan@gmail.com>2019-02-17 21:53:36 +0100
committerMitja Felicijan <mitja.felicijan@gmail.com>2019-02-17 21:53:36 +0100
commit8e9ef5ba62b8bee028428384ad5666e245eb854c (patch)
treeb382c5b40f122b2a152da2226006abab34abe105 /gulpfile.js
parentad974810d43e1d5f70bca269665c25230e6a3221 (diff)
downloadmitjafelicijan.com-8e9ef5ba62b8bee028428384ad5666e245eb854c.tar.gz
content update
Diffstat (limited to 'gulpfile.js')
-rw-r--r--gulpfile.js161
1 files changed, 161 insertions, 0 deletions
diff --git a/gulpfile.js b/gulpfile.js
new file mode 100644
index 0000000..a50fe51
--- /dev/null
+++ b/gulpfile.js
@@ -0,0 +1,161 @@
1'use strict';
2
3const util = require('util');
4const gulp = require('gulp');
5const concat = require('gulp-concat');
6const terser = require('gulp-terser');
7const clean = require('gulp-clean-css');
8const settings = require('./settings.js');
9const minify = require('html-minifier').minify;
10
11const fs = require('fs');
12const markdown = require('markdown-it');
13const prism = require('markdown-it-prism');
14const nunjucks = require('nunjucks');
15const yaml = require('yaml');
16const slugify = require('slugify');
17const dayjs = require('dayjs');
18
19const md = new markdown({
20 html: true,
21 linkify: false,
22 typographer: true,
23 breaks: true,
24})
25 .use(prism)
26 .use(require('markdown-it-table').markdownItTable)
27 .use(require('markdown-it-deflist'))
28 .use(require('markdown-it-footnote'))
29 .use(require('markdown-it-anchor'))
30 .use(require('markdown-it-checkbox'))
31
32nunjucks.configure('layouts', {
33 autoescape: false,
34 noCache: true,
35});
36
37gulp.task('js', () => gulp.src(settings.assets.javascript)
38 .pipe(concat('bundle.js'))
39 .pipe(terser())
40 .pipe(gulp.dest('tmp'))
41);
42
43gulp.task('css', () => gulp.src(settings.assets.css)
44 .pipe(concat('bundle.css'))
45 .pipe(clean({}))
46 .pipe(gulp.dest('tmp'))
47);
48
49gulp.task('generate-static', function (done) {
50 fs.readdir('content', function (err, items) {
51
52 let posts = [];
53 items.forEach(item => {
54 if (item.endsWith('.md')) {
55
56 processMarkdown(`content/${item}`);
57
58 let contents = fs.readFileSync(`content/${item}`, 'utf8');
59 let raw = contents.split('---');
60 let meta = null;
61
62 try {
63 meta = yaml.parse(raw[1])
64 } catch (error) { }
65
66 if (meta.layout == 'post') {
67 meta.dateFormatted = dayjs(meta.date).format('MMMM D, YYYY');
68 meta.dateOriginal = meta.date;
69 meta.date = new Date(meta.date);
70 posts.push(meta)
71 }
72 }
73 });
74
75 const css = fs.readFileSync('tmp/bundle.css', 'utf8');
76 const javascript = fs.readFileSync('tmp/bundle.js', 'utf8');
77
78 let page = nunjucks.render(`index.njk`, {
79 css: `<style>${css}</style>`,
80 javascript: `<script>${javascript}</script>`,
81 currentYear: new Date().getFullYear(),
82 timestamp: Math.floor(Date.now() / 1000),
83 vars: settings.vars,
84 posts: posts.reverse(),
85 });
86
87 util.log(`Processing: Index`);
88
89 fs.writeFileSync(`public/index.html`, minify(page, {
90 removeAttributeQuotes: true,
91 collapseWhitespace: true,
92 removeComments: true,
93 removeTagWhitespace: true,
94 }));
95
96 });
97
98 done();
99});
100
101const processMarkdown = (file) => {
102 const contents = fs.readFileSync(file, 'utf8');
103 let raw = contents.split('---');
104 let meta = null;
105
106 try {
107 meta = yaml.parse(raw[1])
108 } catch (error) { }
109
110 //const slug = slugify(meta.title, { lower: true });
111 const slug = meta.slug;
112 const css = fs.readFileSync('tmp/bundle.css', 'utf8');
113 const javascript = fs.readFileSync('tmp/bundle.js', 'utf8');
114
115 raw.shift();
116 raw.shift();
117
118 let post = nunjucks.render(`${meta.layout}.njk`, {
119 content: md.render(raw.join('')),
120 title: meta.title.substring(0, 65),
121 description: meta.description,
122 css: `<style>${css}</style>`,
123 javascript: `<script>${javascript}</script>`,
124 slug: slug,
125 currentYear: new Date().getFullYear(),
126 timestamp: Math.floor(Date.now() / 1000),
127 vars: settings.vars,
128 writtenDate: {
129 formatted: dayjs(meta.date).format('MMMM D, YYYY'),
130 original: meta.date,
131 },
132 });
133
134 util.log(`Processing: ${meta.title}`);
135
136 fs.writeFileSync(`public/${slug}.html`, minify(post, {
137 removeAttributeQuotes: true,
138 collapseWhitespace: true,
139 removeComments: true,
140 removeTagWhitespace: true,
141 }));
142};
143
144const watchers = (done) => {
145 gulp.watch('source/*.css', {
146 awaitWriteFinish: true,
147 }).on('change', gulp.series('css'));
148
149 gulp.watch('source/*.js', {
150 awaitWriteFinish: true,
151 }).on('change', gulp.series('js'));
152
153 gulp.watch('content/*.md', {
154 awaitWriteFinish: true,
155 }).on('change', processMarkdown);
156
157 done();
158}
159
160gulp.task('dev', gulp.parallel(watchers));
161gulp.task('build', gulp.series('css', 'js', 'generate-static'));