From 76cca4853053219121a5d9b6a410171b27cf2444 Mon Sep 17 00:00:00 2001 From: andig Date: Fri, 2 Jan 2015 11:57:04 +0100 Subject: [PATCH] Added gulp tasks for js/css minimization, img to css sprite conversion and inlined minimized js libs --- gulpfile.js | 163 ++++++++++++++++++++---- htdocs/frontend/images/sprites.png | Bin 22400 -> 17016 bytes htdocs/frontend/index.html | 10 +- htdocs/frontend/javascripts/entity.js | 5 +- htdocs/frontend/javascripts/init.js | 12 +- htdocs/frontend/javascripts/property.js | 106 --------------- htdocs/frontend/javascripts/wui.js | 43 +++---- htdocs/frontend/stylesheets/sprites.css | 95 +++++++------- htdocs/frontend/stylesheets/style.css | 7 - package.json | 23 ++-- 10 files changed, 232 insertions(+), 232 deletions(-) delete mode 100644 htdocs/frontend/javascripts/property.js diff --git a/gulpfile.js b/gulpfile.js index bcd36e268..9e8dd9a35 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,69 +1,180 @@ // include plug-ins var gulp = require('gulp'); -var debug = require('gulp-debug'); -var gulpif = require("gulp-if"); + +var del = require('del'); +var concat = require('gulp-concat'); +var rename = require('gulp-rename'); +var size = require('gulp-size'); var replace = require('gulp-replace'); var watch = require('gulp-watch'); -var rename = require('gulp-rename'); var jshint = require('gulp-jshint'); var uglify = require('gulp-uglify'); -var spritesmith = require("gulp-spritesmith"); + +var spritesmith = require("gulp.spritesmith"); +var imagemin = require('gulp-imagemin'); +var uncss = require('gulp-uncss'); +var minifyCSS = require('gulp-minify-css'); // settings var base = './htdocs/frontend/'; -var dest = './htdocs/frontend/'; +var build = base + 'build/'; + +// styles +var styles = base + 'stylesheets/'; + +// images +var images = base + 'images/'; + +// js +var vendor = base + 'vendor/'; +var javascripts = base + 'javascripts/'; +var flot = base + 'javascripts/flot/'; +var extensions = base + 'javascripts/jquery/'; /** * Defaults */ -gulp.task('build', ['sprites'/*, 'scripts', 'styles', 'replace'*/]); - -// watch for JS changes gulp.task('default', function() { + // watch for JS changes gulp.src(base + 'javascripts/**/*.js', { read: false }) .pipe(watch()) .pipe(jshint()) .pipe(jshint.reporter('default')); }); + /** - * jsHint JS scripts + * Build */ +gulp.task('build', ['clean', 'jshint', 'scripts', 'sprites']); + +gulp.task('clean', function () { + del([ + build + '**' + ]); +}); + + gulp.task('jshint', function() { - gulp.src([base + 'javascripts/!(property)*.js']) + gulp.src([ + base + 'javascripts/*.js', + '!**/*.min.js', // omit minified files + ]) .pipe(jshint()) .pipe(jshint.reporter('default')); }); + /** - * Create CSS sprites for icons + * Scripts + */ +gulp.task('scripts', ['flot', 'jquery-ext', 'vz-scripts']); + +gulp.task('vz-scripts', function() { + return gulp.src([ + javascripts + 'helper.js', // in order of index.html + javascripts + 'init.js', + javascripts + 'functions.js', + javascripts + 'entities.js', + javascripts + 'wui.js', + javascripts + 'entity.js', + '!**/options.js', // exclude options + ]) + .pipe(concat('scripts.js')) + .pipe(gulp.dest(build)) // for reference only + .pipe(size({showFiles: true})) + .pipe(uglify()) + .pipe(rename('scripts.min.js')) + .pipe(gulp.dest(javascripts)) + .pipe(size({showFiles: true})) +}); + +gulp.task('flot', function() { + return gulp.src([ + flot + '**/jquery.flot.js', // flot first + flot + '**.js', // then flot modules + '!**/excanvas*.js', // omit canvas helper + '!**/*.min.js', // omit minified files + ]) + .pipe(concat('flot.js')) + .pipe(gulp.dest(build)) // for reference only + .pipe(size({showFiles: true})) + .pipe(uglify()) + .pipe(rename('flot.min.js')) + .pipe(gulp.dest(flot)) + .pipe(size({showFiles: true})) +}); + +gulp.task('jquery-ext', function() { + return gulp.src([ + extensions + '**.js', + '!**/*.min.js', // omit minified files + ]) + .pipe(concat('jquery-ext.js')) + .pipe(gulp.dest(build)) // for reference only + .pipe(size({showFiles: true})) + .pipe(uglify()) + .pipe(rename('jquery-ext.min.js')) + .pipe(gulp.dest(extensions)) + .pipe(size({showFiles: true})) +}); + + +/** + * Sprites */ gulp.task('sprites', ['sprites-combine', 'sprites-optimize']); // Combine images into sprite gulp.task('sprites-combine', function () { - var imgBase = base + 'images/'; - var cssDst = 'stylesheets/sprites.max.css'; - - gulp.src([imgBase + '!(sprites|blank|ui-|style_|empty)*.png', imgBase + 'types/*!(32).png']) + var spriteData = gulp.src([ + images + '!(sprites|blank|ui-|style_|empty)*.png', + images + 'types/*!(32).png' + ]) .pipe(spritesmith({ - imgName: 'images/sprites.png', - styleName: cssDst, - imgPath: '../images/sprites.png', + imgName: '../images/sprites.png', // link to images folder + cssName: 'sprites.css', algorithm: 'top-down' - })) - .pipe(gulpif('*.png', gulp.dest(dest))) - .pipe(gulpif('*.css', gulp.dest(dest))); + })); + + spriteData.img + .pipe(imagemin()) + .pipe(gulp.dest(images)); + + spriteData.css + .pipe(gulp.dest(build)); }); // Rewrite sprites.css gulp.task('sprites-optimize', function () { - var cssDst = 'stylesheets/sprites.max.css'; - // remove dimensions and save as new css file - gulp.src(base + cssDst) + gulp.src(build + 'sprites.css') .pipe(replace(/ width: 16px;\n height: 16px;\n/g, '')) - .pipe(rename('sprites.css')) - .pipe(gulp.dest(dest + 'stylesheets/')); + .pipe(gulp.dest(styles)); +}); + + +/** + * CSS + */ +// not used +gulp.task('css-minimize', function () { + gulp.src(styles + '*.css') + .pipe(concat('styles.css')) + .pipe(gulp.dest(build)) + .pipe(minifyCSS({keepBreaks:true})) + .pipe(rename('styles.min.css')) + .pipe(gulp.dest(build)); +}); + +// not used +gulp.task('css-strip', function() { + gulp.src(styles + '*.css') + // gulp.src(build + 'styles.min.css') + .pipe(uncss({ + html: [base + 'index.html'] + })) + // .pipe(rename('styles.min.css')) + .pipe(gulp.dest(build)); }); diff --git a/htdocs/frontend/images/sprites.png b/htdocs/frontend/images/sprites.png index f01adda6ca7583087c30415bcbc87eb73cb37f1f..99ccf0c4b72d761a293d988ef2f8d1dc191cb52b 100644 GIT binary patch literal 17016 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 AhX4Qo diff --git a/htdocs/frontend/index.html b/htdocs/frontend/index.html index 9ee52640d..bfa6a202b 100644 --- a/htdocs/frontend/index.html +++ b/htdocs/frontend/index.html @@ -25,10 +25,17 @@ + + + + + + - diff --git a/htdocs/frontend/javascripts/entity.js b/htdocs/frontend/javascripts/entity.js index 1a24fadf3..523d40a86 100644 --- a/htdocs/frontend/javascripts/entity.js +++ b/htdocs/frontend/javascripts/entity.js @@ -441,6 +441,7 @@ Entity.prototype.getDOMDetails = function(edit) { var definition = vz.capabilities.definitions.get('properties', property); var title = definition.translation[vz.options.language]; var value = this[property]; + var prefix; // unit prefix if (definition.type == 'boolean') { // value = '' + ((value) ? 'ja' : 'nein') + ''; @@ -449,12 +450,12 @@ Entity.prototype.getDOMDetails = function(edit) { switch (property) { case 'cost': - var prefix = (this.definition.scale == 1000) ? ' ct/k' : ' ct/'; // ct per Wh or kWh + prefix = (this.definition.scale == 1000) ? ' ct/k' : ' ct/'; // ct per Wh or kWh value = Number(value * 100).toFixed(2) + prefix + vz.wui.formatConsumptionUnit(this.definition.unit); break; case 'resolution': - var prefix = (this.definition.scale == 1000) ? 'k' : ''; // per Wh or kWh + prefix = (this.definition.scale == 1000) ? 'k' : ''; // per Wh or kWh value += '/' + prefix + vz.wui.formatConsumptionUnit(this.definition.unit); break; diff --git a/htdocs/frontend/javascripts/init.js b/htdocs/frontend/javascripts/init.js index 76e4ded97..51c265d84 100644 --- a/htdocs/frontend/javascripts/init.js +++ b/htdocs/frontend/javascripts/init.js @@ -98,7 +98,7 @@ $(document).ready(function() { // clear cookies and localStorage cache var params = $.getUrlParams(); - if (params.hasOwnProperty('reset') && params['reset']) { + if (params.hasOwnProperty('reset') && params.reset) { $.setCookie('vz_entities', null); try { localStorage.removeItem('vz.capabilities'); @@ -114,16 +114,6 @@ $(document).ready(function() { vz.options.plot.xaxis.max = new Date().getTime(); vz.options.plot.xaxis.min = vz.options.plot.xaxis.max - vz.options.interval; - // clear cookies and localStorage cache - var params = $.getUrlParams(); - if (params.hasOwnProperty('reset') && params['reset']) { - $.setCookie('vz_entities', null); - try { - localStorage.removeItem('vz.capabilities'); - } - catch (e) { } - } - // parse additional url params (new uuid etc e.g. for permalink) after loading defaults vz.parseUrlParams(); diff --git a/htdocs/frontend/javascripts/property.js b/htdocs/frontend/javascripts/property.js deleted file mode 100644 index 6f8bbfc3a..000000000 --- a/htdocs/frontend/javascripts/property.js +++ /dev/null @@ -1,106 +0,0 @@ -/** - * Property handling & validation - * - * @author Florian Ziegler - * @author Justin Otherguy - * @author Steffen Vogel - * @copyright Copyright (c) 2011, The volkszaehler.org project - * @package default - * @license http://opensource.org/licenses/gpl-license.php GNU Public License - */ -/* - * This file is part of volkzaehler.org - * - * volkzaehler.org is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or any later version. - * - * volkzaehler.org is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. - * - * You should have received a copy of the GNU General Public License along with - * volkszaehler.org. If not, see . - */ - -/** - * Property constructor - */ -var Property = function(json) { - $.extend(this, json); -}; - -/** - * Validate value - * @param value - * @return boolean - * @todo implement/test - */ -Property.prototype.validate = function(value) { - switch (this.type) { - case 'string': - case 'text': - // TODO check pattern - // TODO check string length - return true; - - case 'float': - // TODO check format - // TODO check min/max - return true; - - case 'integer': - // TODO check format - // TODO check min/max - return true; - - case 'boolean': - return value == '1' || value == ''; - - case 'multiple': - return this.options.contains(value); - - default: - throw new Exception('EntityException', 'Unknown property'); - } -}; - -/** - * - * @todo implement/test - */ -Property.prototype.getInput = function(value) { - switch (this.type) { - case 'string': - case 'float': - case 'integer': - return $('') - .attr('type', 'text') - .attr('name=', this.name) - .attr('maxlength', (property.type == 'string') ? this.max : 0); - - case 'text': - return $('