2019-02-26 22:14:51 +01:00
|
|
|
"use strict";
|
|
|
|
|
|
|
|
// Define variables.
|
|
|
|
const autoprefixer = require("autoprefixer");
|
2019-02-27 01:59:05 +01:00
|
|
|
const babel = require("gulp-babel");
|
2019-02-26 22:37:51 +01:00
|
|
|
const browserSync = require("browser-sync").create();
|
|
|
|
const cleancss = require("gulp-clean-css");
|
|
|
|
const concat = require("gulp-concat");
|
|
|
|
const del = require("del");
|
2019-02-27 00:36:36 +01:00
|
|
|
const exec = require("child_process").exec;
|
2019-02-26 22:37:51 +01:00
|
|
|
const gulp = require("gulp");
|
|
|
|
const gutil = require("gulp-util");
|
|
|
|
const imagemin = require("gulp-imagemin");
|
|
|
|
const notify = require("gulp-notify");
|
|
|
|
const postcss = require("gulp-postcss");
|
|
|
|
const rename = require("gulp-rename");
|
|
|
|
const run = require("gulp-run");
|
|
|
|
const sass = require("gulp-ruby-sass");
|
2019-02-27 01:59:05 +01:00
|
|
|
const sourcemaps = require("gulp-sourcemaps");
|
2019-02-27 00:23:07 +01:00
|
|
|
const terser = require("gulp-terser");
|
2019-02-26 22:14:51 +01:00
|
|
|
|
|
|
|
// Include paths file.
|
|
|
|
const paths = require("./_assets/gulp_config/paths");
|
|
|
|
|
|
|
|
// Uses Sass compiler to process styles, adds vendor prefixes, minifies, then
|
|
|
|
// outputs file to the appropriate location.
|
2019-02-26 22:37:51 +01:00
|
|
|
gulp.task("build:styles:main", function () {
|
2019-02-26 22:14:51 +01:00
|
|
|
return sass(paths.sassFiles + "/main.scss", {
|
|
|
|
style: "compressed",
|
|
|
|
trace: true,
|
2019-02-26 23:33:05 +01:00
|
|
|
loadPath: [paths.includeSass, paths.sassFiles]
|
2019-02-26 22:37:51 +01:00
|
|
|
}).pipe(postcss([autoprefixer({browsers: ["last 2 versions"]})]))
|
2019-02-26 22:14:51 +01:00
|
|
|
.pipe(cleancss())
|
|
|
|
.pipe(gulp.dest(paths.jekyllCssFiles))
|
|
|
|
.pipe(gulp.dest(paths.siteCssFiles))
|
|
|
|
.pipe(browserSync.stream())
|
|
|
|
.on("error", gutil.log);
|
|
|
|
});
|
|
|
|
|
|
|
|
// Processes critical CSS, to be included in head.html.
|
2019-02-26 22:37:51 +01:00
|
|
|
gulp.task("build:styles:critical", function () {
|
2019-02-26 22:14:51 +01:00
|
|
|
return sass(paths.sassFiles + "/critical.scss", {
|
|
|
|
style: "compressed",
|
|
|
|
trace: true,
|
2019-02-26 23:33:05 +01:00
|
|
|
loadPath: [paths.includeSass, paths.sassFiles]
|
2019-02-26 22:37:51 +01:00
|
|
|
}).pipe(postcss([autoprefixer({browsers: ["last 2 versions"]})]))
|
2019-02-26 22:14:51 +01:00
|
|
|
.pipe(cleancss())
|
|
|
|
.pipe(gulp.dest("_includes"))
|
|
|
|
.on("error", gutil.log);
|
|
|
|
});
|
|
|
|
|
|
|
|
// Builds all styles.
|
2019-02-26 22:37:51 +01:00
|
|
|
gulp.task("build:styles", gulp.series("build:styles:main", "build:styles:critical"));
|
2019-02-26 22:14:51 +01:00
|
|
|
|
2019-02-26 23:33:25 +01:00
|
|
|
gulp.task("clean:styles", function () {
|
|
|
|
return del([paths.jekyllCssFiles + "main.css",
|
2019-02-26 22:14:51 +01:00
|
|
|
paths.siteCssFiles + "main.css",
|
|
|
|
"_includes/critical.css"
|
|
|
|
]);
|
|
|
|
});
|
|
|
|
|
|
|
|
// Concatenates and uglifies global JS files and outputs result to the
|
|
|
|
// appropriate location.
|
2019-02-26 22:37:51 +01:00
|
|
|
gulp.task("build:scripts:global", function () {
|
2019-02-26 22:14:51 +01:00
|
|
|
return gulp.src([
|
|
|
|
paths.jsFiles + "/global/lib" + paths.jsPattern,
|
|
|
|
paths.jsFiles + "/global/*.js"
|
2019-02-27 01:59:05 +01:00
|
|
|
]).pipe(sourcemaps.init())
|
|
|
|
.pipe(babel({
|
|
|
|
presets: ["@babel/env"]
|
|
|
|
}))
|
|
|
|
.pipe(concat("main.js"))
|
2019-02-27 02:09:09 +01:00
|
|
|
.pipe(terser({
|
|
|
|
keep_fnames: true,
|
|
|
|
mangle: false
|
|
|
|
}))
|
2019-02-27 00:36:36 +01:00
|
|
|
.pipe(gulp.dest(paths.jekyllJsFiles))
|
|
|
|
.pipe(gulp.dest(paths.siteJsFiles))
|
|
|
|
.on("error", gutil.log);
|
2019-02-26 22:14:51 +01:00
|
|
|
});
|
|
|
|
|
2019-02-26 23:33:25 +01:00
|
|
|
gulp.task("clean:scripts", function () {
|
|
|
|
return del([paths.jekyllJsFiles + "main.js", paths.siteJsFiles + "main.js"]);
|
2019-02-26 22:14:51 +01:00
|
|
|
});
|
|
|
|
|
|
|
|
// Concatenates and uglifies leaflet JS files and outputs result to the
|
|
|
|
// appropriate location.
|
2019-02-26 22:37:51 +01:00
|
|
|
gulp.task("build:scripts:leaflet", function () {
|
2019-02-26 22:14:51 +01:00
|
|
|
return gulp.src([
|
|
|
|
paths.jsFiles + "/leaflet/leaflet.js",
|
|
|
|
paths.jsFiles + "/leaflet/leaflet-providers.js"
|
2019-02-26 23:33:25 +01:00
|
|
|
]).pipe(concat("leaflet.js"))
|
2019-02-27 00:36:36 +01:00
|
|
|
.pipe(terser())
|
|
|
|
.pipe(gulp.dest(paths.jekyllJsFiles))
|
|
|
|
.pipe(gulp.dest(paths.siteJsFiles))
|
|
|
|
.on("error", gutil.log);
|
2019-02-26 22:14:51 +01:00
|
|
|
});
|
|
|
|
|
2019-02-26 23:33:25 +01:00
|
|
|
gulp.task("clean:scripts:leaflet", function () {
|
|
|
|
return del([paths.jekyllJsFiles + "leaflet.js", paths.siteJsFiles + "leaflet.js"]);
|
2019-02-26 22:14:51 +01:00
|
|
|
});
|
|
|
|
|
|
|
|
// Builds all scripts.
|
2019-02-27 00:23:30 +01:00
|
|
|
gulp.task("build:scripts", gulp.series("build:scripts:global"));
|
2019-02-26 22:14:51 +01:00
|
|
|
|
|
|
|
// Optimizes and copies image files.
|
2019-02-26 22:37:51 +01:00
|
|
|
gulp.task("build:images", function () {
|
2019-02-26 22:14:51 +01:00
|
|
|
return gulp.src(paths.imageFilesGlob)
|
|
|
|
.pipe(imagemin())
|
|
|
|
.pipe(gulp.dest(paths.jekyllImageFiles))
|
|
|
|
.pipe(gulp.dest(paths.siteImageFiles))
|
|
|
|
.pipe(browserSync.stream());
|
|
|
|
});
|
|
|
|
|
2019-02-26 23:33:25 +01:00
|
|
|
gulp.task("clean:images", function () {
|
|
|
|
return del([paths.jekyllImageFiles, paths.siteImageFiles]);
|
2019-02-26 22:14:51 +01:00
|
|
|
});
|
|
|
|
|
|
|
|
// Runs jekyll build command.
|
2019-02-26 22:37:51 +01:00
|
|
|
gulp.task("build:jekyll", function () {
|
2019-02-27 00:36:36 +01:00
|
|
|
const shellCommand = "bundle exec jekyll build --config _config.yml";
|
|
|
|
return exec(shellCommand);
|
2019-02-26 22:14:51 +01:00
|
|
|
});
|
|
|
|
|
|
|
|
// Runs jekyll build command using test config.
|
2019-02-26 22:37:51 +01:00
|
|
|
gulp.task("build:jekyll:test", function () {
|
2019-02-27 00:36:36 +01:00
|
|
|
const shellCommand = "bundle exec jekyll build --config _config.yml,_config.test.yml";
|
|
|
|
return exec(shellCommand);
|
2019-02-26 22:14:51 +01:00
|
|
|
});
|
|
|
|
|
|
|
|
// Runs jekyll build command using local config.
|
2019-02-26 22:37:51 +01:00
|
|
|
gulp.task("build:jekyll:local", function () {
|
2019-02-27 00:36:36 +01:00
|
|
|
const shellCommand = "bundle exec jekyll build --config _config.yml,_config.test.yml,_config.dev.yml";
|
|
|
|
return exec(shellCommand);
|
2019-02-26 22:14:51 +01:00
|
|
|
});
|
|
|
|
|
|
|
|
// Deletes the entire _site directory.
|
2019-02-26 23:33:25 +01:00
|
|
|
gulp.task("clean:jekyll", function () {
|
|
|
|
return del(["_site"]);
|
2019-02-26 22:14:51 +01:00
|
|
|
});
|
|
|
|
|
2019-02-26 22:37:51 +01:00
|
|
|
gulp.task("clean", gulp.series("clean:jekyll",
|
2019-02-26 23:36:53 +01:00
|
|
|
//"clean:images",
|
2019-02-26 22:14:51 +01:00
|
|
|
"clean:scripts",
|
2019-02-26 22:37:51 +01:00
|
|
|
"clean:styles"));
|
2019-02-26 22:14:51 +01:00
|
|
|
|
|
|
|
// Builds site anew.
|
2019-02-26 23:33:25 +01:00
|
|
|
gulp.task("build", gulp.series("clean",
|
2019-02-26 23:36:53 +01:00
|
|
|
gulp.parallel("build:scripts", "build:styles"),
|
2019-02-26 23:33:25 +01:00
|
|
|
"build:jekyll")
|
|
|
|
);
|
2019-02-26 22:14:51 +01:00
|
|
|
|
|
|
|
// Builds site anew using test config.
|
2019-02-26 23:33:25 +01:00
|
|
|
gulp.task("build:test", gulp.series("clean",
|
2019-02-27 00:36:36 +01:00
|
|
|
gulp.parallel("build:scripts", "build:styles"),
|
|
|
|
"build:jekyll:test"));
|
2019-02-26 22:14:51 +01:00
|
|
|
|
|
|
|
// Builds site anew using local config.
|
2019-02-26 23:33:25 +01:00
|
|
|
gulp.task("build:local", gulp.series("clean",
|
2019-02-27 00:36:36 +01:00
|
|
|
gulp.parallel("build:scripts", "build:styles"),
|
|
|
|
"build:jekyll:local"));
|
2019-02-26 22:14:51 +01:00
|
|
|
|
|
|
|
// Default Task: builds site.
|
2019-02-26 22:37:51 +01:00
|
|
|
gulp.task("default", gulp.series("build"));
|
2019-02-26 22:14:51 +01:00
|
|
|
|
|
|
|
// Special tasks for building and then reloading BrowserSync.
|
2019-02-27 00:44:58 +01:00
|
|
|
gulp.task("build:jekyll:watch", gulp.series("build:jekyll:test", function (callback) {
|
2019-02-26 22:14:51 +01:00
|
|
|
browserSync.reload();
|
|
|
|
callback();
|
2019-02-26 22:37:51 +01:00
|
|
|
}));
|
2019-02-26 22:14:51 +01:00
|
|
|
|
2019-02-26 22:37:51 +01:00
|
|
|
gulp.task("build:scripts:watch", gulp.series("build:scripts", function (callback) {
|
2019-02-26 22:14:51 +01:00
|
|
|
browserSync.reload();
|
|
|
|
callback();
|
2019-02-26 22:37:51 +01:00
|
|
|
}));
|
2019-02-26 22:14:51 +01:00
|
|
|
|
|
|
|
// Static Server + watching files.
|
|
|
|
// Note: passing anything besides hard-coded literal paths with globs doesn't
|
|
|
|
// seem to work with gulp.watch().
|
2019-02-27 00:38:17 +01:00
|
|
|
gulp.task("serve", gulp.series("build:test", function () {
|
2019-02-26 22:14:51 +01:00
|
|
|
|
|
|
|
browserSync.init({
|
|
|
|
server: paths.siteDir,
|
|
|
|
ghostMode: false, // Toggle to mirror clicks, reloads etc. (performance)
|
|
|
|
logFileChanges: true,
|
|
|
|
logLevel: "debug",
|
|
|
|
open: true // Toggle to automatically open page when starting.
|
|
|
|
});
|
|
|
|
|
|
|
|
// Watch site settings.
|
2019-02-26 22:37:51 +01:00
|
|
|
gulp.watch(["_config.yml"], gulp.series("build:jekyll:watch"));
|
2019-02-26 22:14:51 +01:00
|
|
|
|
|
|
|
// Watch .scss files; changes are piped to browserSync.
|
2019-02-26 23:56:02 +01:00
|
|
|
gulp.watch("_assets/css/**/*.scss", gulp.series("build:styles"));
|
2019-02-26 22:14:51 +01:00
|
|
|
|
|
|
|
// Watch .js files.
|
2019-02-26 23:55:26 +01:00
|
|
|
gulp.watch("_assets/javascripts/**/*.js", gulp.series("build:scripts:watch"));
|
2019-02-26 22:14:51 +01:00
|
|
|
|
|
|
|
// Watch image files; changes are piped to browserSync.
|
2019-02-26 23:36:53 +01:00
|
|
|
gulp.watch("_assets/images/**/*", gulp.series("build:images"));
|
2019-02-26 22:14:51 +01:00
|
|
|
|
|
|
|
// Watch posts.
|
2019-02-26 22:37:51 +01:00
|
|
|
gulp.watch("_posts/**/*.+(md|markdown|MD)", gulp.series("build:jekyll:watch"));
|
2019-02-26 22:14:51 +01:00
|
|
|
|
|
|
|
// Watch drafts if --drafts flag was passed.
|
|
|
|
if (module.exports.drafts) {
|
2019-02-26 22:37:51 +01:00
|
|
|
gulp.watch("_drafts/*.+(md|markdown|MD)", gulp.series("build:jekyll:watch"));
|
2019-02-26 22:14:51 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// Watch html and markdown files.
|
2019-02-26 22:37:51 +01:00
|
|
|
gulp.watch(["**/*.+(html|md|markdown|MD)", "!_site/**/*.*"], gulp.series("build:jekyll:watch"));
|
2019-02-26 22:14:51 +01:00
|
|
|
|
|
|
|
// Watch RSS feed XML files.
|
2019-02-26 22:37:51 +01:00
|
|
|
gulp.watch("**.xml", gulp.series("build:jekyll:watch"));
|
2019-02-26 22:14:51 +01:00
|
|
|
|
|
|
|
// Watch data files.
|
2019-02-26 22:37:51 +01:00
|
|
|
gulp.watch("_data/**.*+(yml|yaml|csv|json)", gulp.series("build:jekyll:watch"));
|
2019-02-26 22:14:51 +01:00
|
|
|
|
|
|
|
// Watch favicon.png.
|
2019-02-26 22:37:51 +01:00
|
|
|
gulp.watch("favicon.png", gulp.series("build:jekyll:watch"));
|
|
|
|
}));
|
2019-02-26 22:14:51 +01:00
|
|
|
|
|
|
|
// Updates Ruby gems
|
2019-02-26 22:37:51 +01:00
|
|
|
gulp.task("update:bundle", function () {
|
2019-02-26 22:14:51 +01:00
|
|
|
return gulp.src("")
|
|
|
|
.pipe(run("bundle install"))
|
|
|
|
.pipe(run("bundle update"))
|
2019-02-26 22:37:51 +01:00
|
|
|
.pipe(notify({message: "Bundle Update Complete"}))
|
2019-02-26 22:14:51 +01:00
|
|
|
.on("error", gutil.log);
|
|
|
|
});
|