Permalink
var gulp = require('gulp'), | |
$ = require('gulp-load-plugins')(), | |
path = require('path'), | |
minimatch = require('minimatch'), | |
through2 = require('through2'), | |
del = require('del'), | |
inquirer = require('inquirer'), | |
sprite = require('css-sprite').stream; | |
var paths = { | |
dist: { | |
root: './dist' | |
} | |
}; | |
paths.dist.scripts = path.join(paths.dist.root, 'js'); | |
paths.dist.styles = { root: path.join(paths.dist.root, 'css') }; | |
paths.dist.styles.dataURI = path.join(paths.dist.styles.root, 'data-uri'); | |
paths.dist.styles.sprites = path.join(paths.dist.styles.root, 'sprites'); | |
paths.dist.styles.basic = path.join(paths.dist.styles.root, 'basic'); | |
paths.dist.images = { root: path.join(paths.dist.root, 'images') }; | |
paths.dist.images.separate = path.join(paths.dist.images.root, 'basic'); | |
paths.dist.images.sprites = path.join(paths.dist.images.root, 'sprites'); | |
gulp.task('default', ['compile']); | |
gulp.task('compile', ['script', 'images-and-styles']); | |
gulp.task('release', ['update', 'compile', 'bump']); | |
gulp.task('script', function(){ | |
var pkg = require('./package.json'); | |
gulp.src('./src/emojify.js') | |
.pipe(gulp.dest(paths.dist.scripts)) | |
.pipe($.jshint()) | |
.pipe($.jshint.reporter('jshint-stylish')) | |
.pipe($.insert.prepend('/*! ' + pkg.name + ' - v' + pkg.version + ' - \n' + | |
' * Copyright (c) Hassan Khan ' + new Date().getFullYear() + '\n' + | |
' */')) | |
.pipe($.uglify({ | |
preserveComments: 'some' | |
})) | |
.pipe($.rename({ | |
suffix: '.min' | |
})) | |
.pipe(gulp.dest(paths.dist.scripts)); | |
}); | |
var getEmoticonFilter = function(){ | |
var emoticons = [ | |
'smile', 'scream', 'smirk', 'grinning', 'stuck_out_tongue_closed_eyes', 'stuck_out_tongue_winking_eye', | |
'rage', 'frowning', 'sob', 'kissing_heart', 'wink', 'pensive', 'confounded', 'flushed', 'relaxed', 'mask', | |
'heart', 'broken_heart' | |
]; | |
return $.filter(function(file){ | |
var index = emoticons.indexOf(path.basename(file.path, path.extname(file.path))); | |
if(index > -1){ | |
emoticons.splice(index, 1); | |
return true; | |
} | |
}) | |
}; | |
gulp.task('images-and-styles', ['copy-styles', 'data-uri'], function(){ | |
var emoticonFilter = getEmoticonFilter(), | |
cssFilter = $.filter('**.css'), | |
emoticonCssFilter = $.filter('**.css'), | |
emoticonPngFilter = $.filter('**.png'); | |
return gulp.src('./src/images/emoji/*.png') | |
// copy images over as they are | |
.pipe(gulp.dest(paths.dist.images.separate)) | |
// generate emoticon sprites | |
.pipe(emoticonFilter) | |
.pipe(sprite({ | |
name: 'emojify-emoticons', | |
style: 'emojify-emoticons.css', | |
prefix: 'emoji', | |
cssPath: '../../images/sprites/', | |
orientation: 'binary-tree', | |
retina: true, | |
template: './build/sprites.mustache' | |
})) | |
.pipe(emoticonCssFilter) | |
.pipe($.replace('.emoji-+1', '.emoji-plus1')) | |
.pipe(gulp.dest(paths.dist.styles.sprites)) | |
.pipe($.minifyCss()) | |
.pipe($.rename({ | |
suffix: '.min' | |
})) | |
.pipe(gulp.dest(paths.dist.styles.sprites)) | |
.pipe(emoticonCssFilter.restore()) | |
.pipe(emoticonPngFilter) | |
.pipe(gulp.dest(paths.dist.images.sprites)) | |
.pipe(emoticonPngFilter.restore()) | |
.pipe($.filter('!**sprites**')) //exclude generated spritesheets | |
.pipe(emoticonFilter.restore()) | |
// generate all sprites | |
.pipe(sprite({ | |
name: 'emojify', | |
style: 'emojify.css', | |
prefix: 'emoji', | |
cssPath: '../../images/sprites/', | |
orientation: 'binary-tree', | |
retina: true, | |
template: './build/sprites.mustache' | |
})) | |
.pipe(cssFilter) | |
.pipe($.replace('.emoji-+1', '.emoji-plus1')) | |
.pipe(gulp.dest(paths.dist.styles.sprites)) | |
.pipe($.minifyCss()) | |
.pipe($.rename({ | |
suffix: '.min' | |
})) | |
.pipe(gulp.dest(paths.dist.styles.sprites)) | |
.pipe(cssFilter.restore()) | |
.pipe($.filter('**.png')) | |
.pipe(gulp.dest(paths.dist.images.sprites)); | |
}); | |
gulp.task('data-uri', function(){ | |
var emoticonFilter = getEmoticonFilter(); | |
return gulp.src('./src/images/emoji/*.png') | |
.pipe($.imageDataUri({ | |
customClass: function(className){ | |
return 'emoji-' + className | |
} | |
})) | |
.pipe(emoticonFilter) | |
.pipe($.concat('emojify-emoticons.css')) | |
.pipe($.replace('.emoji-+1', '.emoji-plus1')) | |
.pipe(gulp.dest(paths.dist.styles.dataURI)) | |
.pipe($.minifyCss()) | |
.pipe($.rename({ | |
suffix: '.min' | |
})) | |
.pipe(gulp.dest(paths.dist.styles.dataURI)) | |
.pipe(emoticonFilter.restore()) | |
// generate all data-URIs | |
.pipe($.concat('emojify.css')) | |
.pipe($.replace('.emoji-+1', '.emoji-plus1')) | |
.pipe(gulp.dest(paths.dist.styles.dataURI)) | |
.pipe($.minifyCss()) | |
.pipe($.rename({ | |
suffix: '.min' | |
})) | |
.pipe(gulp.dest(paths.dist.styles.dataURI)); | |
}); | |
gulp.task('copy-styles', function(){ | |
gulp.src('./src/css/basic/*.css') | |
.pipe(gulp.dest(paths.dist.styles.basic)) | |
.pipe($.minifyCss()) | |
.pipe($.rename({ | |
suffix: '.min' | |
})) | |
.pipe(gulp.dest(paths.dist.styles.basic)); | |
}); | |
gulp.task('clean', function(done){ | |
del(paths.dist.root, done); | |
}); | |
gulp.task('bump', function(done){ | |
inquirer.prompt({ | |
type: 'list', | |
name: 'bump', | |
message: 'What type of bump would you like to do?', | |
choices: ['patch', 'minor', 'major', "don't bump"] | |
}, function(result){ | |
if(result.bump === "don't bump"){ | |
done(); | |
return; | |
} | |
gulp.src(['./bower.json', './package.json']) | |
.pipe($.bump({type: result.bump})) | |
.pipe(gulp.dest('./')) | |
.on('end', done); | |
}); | |
}); | |
gulp.task('update', function(done){ | |
var emoji = ''; | |
del('./src/images/emoji'); | |
$.download('https://github.com/arvida/emoji-cheat-sheet.com/archive/master.zip') | |
.pipe($.unzip()) | |
.pipe($.filter(function(file){ | |
return minimatch(file.path, '**/public/graphics/emojis/*.png'); | |
})) | |
.pipe($.rename({ dirname: './' })) | |
.pipe(gulp.dest('./src/images/emoji')) | |
.pipe(through2({ objectMode: true }, function(file, enc, cb){ | |
emoji += ',' + path.basename(file.path, path.extname(file.path)); | |
this.push(file); | |
cb(); | |
}, function(){ | |
gulp.src('./src/emojify.js') | |
.pipe($.replace(/(\/\*##EMOJILIST\*\/).+$/m, '$1"' + emoji.substr(1) + '";')) | |
.pipe(gulp.dest('./src')) | |
.on('end', done); | |
})); | |
}); |