import fs from "fs"; import path from "path"; import { src, dest, watch, parallel, series } from "gulp"; import { exec } from "child_process"; import { create as browserSyncCreate } from "browser-sync"; import run from "gulp-run-command"; import postcss from "gulp-postcss"; import magician from "postcss-font-magician"; import cssnano from "cssnano"; import postcssPresetEnv from "postcss-preset-env"; import rfs from "rfs"; import concat from "gulp-concat"; import terser from "gulp-terser"; const browserSync = browserSyncCreate(); const path404 = path.join(__dirname, "documentation/output/404.html"); const content_404 = () => fs.existsSync(path404) ? fs.readFileSync(path404) : null; const cleanOutput = () => exec("cd documentation && rm -rf outout/"); const buildContent = () => exec("cd documentation && invoke build"); const compileBootstrapLess = () => exec( "node_modules/recess/bin/recess --compile static/bootstrap/bootstrap.less > static/css/bootstrap.css" ); const compileResponsiveLess = () => exec( "node_modules/recess/bin/recess --compile static/bootstrap/responsive.less > static/css/bootstrap_responsive.css" ); const reload = cb => { browserSync.init( { ui: { port: 9002 }, server: { baseDir: "documentation/output", serveStaticOptions: { extensions: ["html"] } }, files: "documentation/output/*.html", port: 9001 }, (_, bs) => { bs.addMiddleware("*", (_, res) => { res.write(content_404()); res.end(); }); } ); cb(); }; const watchFiles = () => { watch( [ "documentation/content/**/*.md", "documentation/content/**/*.rest", "documentation/pelicanconf.py", "documentation/publishconf.py", "templates/**/*.html", "static/**/*.css", "static/**/*.less", "static/**/*.js", "!static/**/bootstrap.css", "!static/**/bootstrap_responsive.css", "!static/**/elegant.prod.9e9d5ce754.css", "!static/js/elegant.prod.9e9d5ce754.js" ], { ignoreInitial: false }, buildAll ); }; const pathProdCSS = path.join( __dirname, "static/css/elegant.prod.9e9d5ce754.css" ); const rmProdCSS = cb => { if (fs.existsSync(pathProdCSS)) { fs.unlinkSync(pathProdCSS); } cb(); }; const minifyJS = () => { return src([ "static/applause-button/applause-button.js", "static/photoswipe/photoswipe.js", "static/photoswipe/photoswipe-ui-default.js", "static/photoswipe/photoswipe-array-from-dom.js", "static/lunr/lunr.js", "static/clipboard/clipboard.js", "static/js/copy-to-clipboard.js", "static/js/lunr-search-result.js", "!static/js/elegant.prod.9e9d5ce754.js" ]) .pipe(concat("elegant.prod.9e9d5ce754.js")) .pipe(terser()) .pipe(dest("static/js/")); }; const compileCSS = () => { const plugins = [ // postcssPresetEnv comes with autoprefixer postcssPresetEnv({ stage: 1 }), magician({}), rfs(), cssnano() ]; return src([ "static/applause-button/applause-button.css", "static/photoswipe/photoswipe.css", "static/photoswipe/default-skin/default-skin.css", "static/css/*.css", "!static/css/elegant.prod.9e9d5ce754.css" ]) .pipe(postcss(plugins)) .pipe(concat("elegant.prod.9e9d5ce754.css")) .pipe(dest("static/css/")); }; const buildAll = series( rmProdCSS, compileBootstrapLess, compileResponsiveLess, compileCSS, minifyJS, buildContent ); exports.validate = run("jinja-ninja templates"); exports.js = minifyJS; exports.css = series( rmProdCSS, compileBootstrapLess, compileResponsiveLess, compileCSS ); const build = series( compileBootstrapLess, compileResponsiveLess, compileCSS, minifyJS, cleanOutput, buildContent ); exports.build = build; const elegant = series(build, parallel(watchFiles, reload)); exports.elegant = elegant; exports.default = elegant;