Skip to content

Instantly share code, notes, and snippets.

@darkwing
Created October 13, 2015 14:45
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save darkwing/b1800cadb6f5559a23ed to your computer and use it in GitHub Desktop.
Save darkwing/b1800cadb6f5559a23ed to your computer and use it in GitHub Desktop.
"punky" theme build file for David Walsh Blog
'use strict';
/*
Ways to improve site speed for theme:
===========================================
- Store fonts.css in localStorage, don't make request if it's there
- Create a custom FontAwesome lib, lazyload
*/
var gulp = require('gulp');
var runSequence = require('run-sequence');
var minifyCss = require('gulp-minify-css');
var buildDir = './build/';
var build = new Date().getTime();
var minifyCssSettings = { advanced: true, aggressiveMerging: true };
// Main build
gulp.task('build', function() {
return runSequence(
['clean'],
['move-js', 'move-php', 'move-images', 'compile-stylus'],
['clone-history'],
['clone-prism'],
['move-prism-css', 'move-prism-js', 'move-example-files'],
['remove-prism'],
['minify-css', 'minify-js', 'minify-php'],
['concat-prism-css'],
['concat-all-css'],
['replace-build-ids'],
['create-backup-zip'],
['move-to-wordpress']
);
});
// Wipes out the build dir
gulp.task('clean', function() {
return gulp.src(buildDir, { read: false }).pipe(require('gulp-clean')());
});
// Validate JS
gulp.task('validate-js', function() {
return gulp.src('./js/**.js').pipe(require('gulp-jshint')());
});
// Move files to build dir before minifying them
[['js', 'js'], ['php', ''], ['images', 'images']].forEach(function(item) {
gulp.task('move-' + item[0], function() {
return gulp.src('./' + item[0] + '/**').pipe(gulp.dest(buildDir + item[1]));
});
});
// Minify JS and create sourcemaps
gulp.task('minify-js', function() {
return gulp.src(buildDir + 'js/**.js').pipe(require('gulp-uglify')({
compress: { drop_console: true }
})).pipe(gulp.dest(buildDir + 'js'));
});
// Minify CSS and create sourcemaps
gulp.task('minify-css', function() {
var sourcemaps = require('gulp-sourcemaps');
return gulp.src(buildDir + '**.css')
.pipe(sourcemaps.init())
.pipe(minifyCss(minifyCssSettings))
.pipe(sourcemaps.write('./maps'))
.pipe(gulp.dest(buildDir));
});
// Minify PHP - not scientific, very basic
gulp.task('minify-php', function() {
var replace = require('gulp-replace');
return gulp.src([buildDir + '**.php'])
.pipe(require('gulp-trimlines')())
.pipe(replace(/\n\n/g, '\n')).pipe(replace(/\n\n/g, '\n'))
.pipe(replace(/\>\n\</g, '><'))
.pipe(replace(/([class|aria-hidden|rel|id|data-src|fill|title|itemprop|charset|href|charset|content|property|itemtype|name|data-src|placeholder|style])\=\"([A-z-\#\-\:\/\;0-9\.]+?)\"/g, '$1=$2'))
.pipe(gulp.dest(buildDir));
});
// Concat the prism CSS to main CSS to save a request
gulp.task('concat-prism-css', function() {
return gulp.src([buildDir + 'style.css', buildDir + 'js/libs/prism.css']).pipe(require('gulp-concat')('style.css')).pipe(gulp.dest(buildDir));
});
// Concat all CSS as a backup
gulp.task('concat-all-css', function() {
return gulp.src([buildDir + 'above-fold.css', buildDir + 'style.css']).pipe(require('gulp-concat')('all.css')).pipe(gulp.dest(buildDir));
});
// Compiles stylus but doesn't minify or cleanup
gulp.task('compile-stylus', function() {
var sourcemaps = require('gulp-sourcemaps');
return gulp.src('./stylus/**')
.pipe(sourcemaps.init())
.pipe(require('gulp-stylus')({ compress: false }))
.pipe(gulp.dest(buildDir));
});
// Minify Images
gulp.task('minify-images', function() {
return gulp.src('./images/**').pipe(require('gulp-imagemin')({ progressive: true, use: [require('imagemin-pngquant')()] })).pipe(gulp.dest(buildDir + 'images'));
});
// Clones down MooTools History
gulp.task('clone-history', function(done) {
require('gulp-git').clone('https://github.com/cpojer/mootools-history.git', { args: buildDir + 'js/libs/mootools-history' }, function() {
done();
});
});
// Clones down the Prism repo
gulp.task('clone-prism', function(done) {
require('gulp-git').clone('https://github.com/LeaVerou/prism.git', { args: buildDir + 'js/libs/prism' }, function(err) {
done();
});
});
// Move the Prism CSS file out of its burried place
gulp.task('move-prism-css', function() {
return gulp.src(buildDir + 'js/libs/prism/themes/prism.css').pipe(minifyCss(minifyCssSettings)).pipe(gulp.dest(buildDir + 'js/libs/'));
});
// Concatenate and move the Prism JS files
gulp.task('move-prism-js', function() {
var base = buildDir + 'js/libs/prism/components/';
var files = [];
['core', 'clike', 'apacheconf', 'bash', 'css', 'css-extras', 'javascript', 'markup', 'php', 'php-extras', 'python', 'sass', 'scss', 'stylus', 'sql'].forEach(function(item) {
files.push(base + 'prism-' + item + '.min.js');
});
return gulp.src(files, { base: '.' }).pipe(require('gulp-concat')('prism.js')).pipe(gulp.dest(buildDir + 'js/libs/'));
});
// Move the example files over
gulp.task('move-example-files', function() {
gulp.src('examples/**').pipe(gulp.dest(buildDir + 'examples/'));
});
// Remove the stuff from prism we never wanted
gulp.task('remove-prism', function() {
return gulp.src(buildDir + 'js/libs/prism', { read: false }).pipe(require('gulp-clean')());
});
// Replace build IDs inside required PHP and JS files
gulp.task('replace-build-ids', function() {
return gulp.src([buildDir + '**/*.php', buildDir + '**/*.js']).pipe(require('gulp-replace')('{{ VERSION }}', build)).pipe(gulp.dest(buildDir));
});
// Create ZIP of this for backup
gulp.task('create-backup-zip', function() {
return gulp.src('./**').pipe(require('gulp-zip')('punky_source.zip')).pipe(gulp.dest('../'));
});
// Move dist files to Wordpress-visible theme
gulp.task('move-to-wordpress', function() {
return gulp.src(buildDir + '**').pipe(gulp.dest('../punky'));
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment