diff options
Diffstat (limited to 'gulpfile.js')
| -rw-r--r-- | gulpfile.js | 161 |
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 | |||
| 3 | const util = require('util'); | ||
| 4 | const gulp = require('gulp'); | ||
| 5 | const concat = require('gulp-concat'); | ||
| 6 | const terser = require('gulp-terser'); | ||
| 7 | const clean = require('gulp-clean-css'); | ||
| 8 | const settings = require('./settings.js'); | ||
| 9 | const minify = require('html-minifier').minify; | ||
| 10 | |||
| 11 | const fs = require('fs'); | ||
| 12 | const markdown = require('markdown-it'); | ||
| 13 | const prism = require('markdown-it-prism'); | ||
| 14 | const nunjucks = require('nunjucks'); | ||
| 15 | const yaml = require('yaml'); | ||
| 16 | const slugify = require('slugify'); | ||
| 17 | const dayjs = require('dayjs'); | ||
| 18 | |||
| 19 | const 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 | |||
| 32 | nunjucks.configure('layouts', { | ||
| 33 | autoescape: false, | ||
| 34 | noCache: true, | ||
| 35 | }); | ||
| 36 | |||
| 37 | gulp.task('js', () => gulp.src(settings.assets.javascript) | ||
| 38 | .pipe(concat('bundle.js')) | ||
| 39 | .pipe(terser()) | ||
| 40 | .pipe(gulp.dest('tmp')) | ||
| 41 | ); | ||
| 42 | |||
| 43 | gulp.task('css', () => gulp.src(settings.assets.css) | ||
| 44 | .pipe(concat('bundle.css')) | ||
| 45 | .pipe(clean({})) | ||
| 46 | .pipe(gulp.dest('tmp')) | ||
| 47 | ); | ||
| 48 | |||
| 49 | gulp.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 | |||
| 101 | const 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 | |||
| 144 | const 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 | |||
| 160 | gulp.task('dev', gulp.parallel(watchers)); | ||
| 161 | gulp.task('build', gulp.series('css', 'js', 'generate-static')); | ||
