diff --git a/.gitignore b/.gitignore index b795bae8..43a5f062 100644 --- a/.gitignore +++ b/.gitignore @@ -21,8 +21,14 @@ diff.txt # build destination dest +dest-dev +dest-tmp build/closure/closure_compiled_binary.js +# spriting artifacts +src/img/icons.png +src/css/icons.css + # plato report directory report diff --git a/Gruntfile.js b/Gruntfile.js index d580dd74..f308b1a6 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -70,14 +70,21 @@ module.exports = function(grunt) { grunt.initConfig({ clean: { - before: ['dest'] + prod: ['dest', 'dest-tmp'], + dev: ['dest-dev', 'dest-tmp'] }, + + /** + * STYLE CHECKS + */ + leadingIndent : { options: { indentation : "spaces" }, css : ['src/css/**/*.css'] }, + jscs : { options : { "preset": "google", @@ -89,6 +96,7 @@ module.exports = function(grunt) { }, js : [ 'src/js/**/*.js' , '!src/js/**/lib/**/*.js' ] }, + jshint: { options: { undef : true, @@ -105,11 +113,17 @@ module.exports = function(grunt) { '!src/js/**/lib/**/*.js' // Exclude lib folder (note the leading !) ] }, + + /** + * SERVERS, BROWSER LAUNCHERS + */ + express: { - test: getExpressConfig(['src', 'test'], 9991), + test: getExpressConfig(['dest-dev', 'test'], 9991), regular: getExpressConfig('dest', 9001), - debug: getExpressConfig(['src', 'test'], 9901) + debug: getExpressConfig(['dest-dev', 'test'], 9901) }, + open : { regular : { path : 'http://' + ip + ':9001/' @@ -118,6 +132,7 @@ module.exports = function(grunt) { path : 'http://' + ip + ':9901/?debug' } }, + watch: { prod: { files: ['src/**/*.*'], @@ -127,17 +142,26 @@ module.exports = function(grunt) { } }, dev: { - files: ['src/img/**/*.*'], - tasks: ['sprite'], + files: ['src/**/*.*'], + tasks: ['build-dev'], options: { spawn: false } } }, - ghost : { - 'travis' : getCasperConfig('travis'), - 'local' : getCasperConfig('local') + + /** + * BUILD STEPS + */ + + sprite:{ + all : { + src: 'src/img/icons/**/*.png', + dest: 'src/img/icons.png', + destCss: 'src/css/icons.css' + } }, + concat : { js : { options : { @@ -151,18 +175,27 @@ module.exports = function(grunt) { dest : 'dest/css/piskel-style-packaged' + version + '.css' } }, + uglify : { options : { mangle : true }, js : { files : { - 'dest/js/piskel-packaged-min.js' : ['dest/js/piskel-packaged' + version + '.js'] + 'dest-tmp/js/piskel-packaged-min.js' : ['dest/js/piskel-packaged' + version + '.js'] } } }, + + includereplace: { + all: { + src: 'src/index.html', + dest: 'dest-tmp/index.html' + } + }, + replace: { - main: { + piskelBoot: { options: { patterns: [ { @@ -172,16 +205,14 @@ module.exports = function(grunt) { ] }, files: [ - {src: ['src/piskel-boot.js'], dest: 'dest/piskel-boot.js'} + {src: ['src/piskel-boot.js'], dest: 'dest/piskel-boot.js'}, + {src: ['src/piskel-boot.js'], dest: 'dest/piskel-boot' + version +'.js'} ] }, - editor: { + // main-partial.html is used when embedded in piskelapp.com + mainPartial: { options: { - patterns: [ - { - match: /templates\//g, - replacement: "../templates"+version+"/" - },{ + patterns: [{ match: /piskel-boot.js/g, replacement: "../piskel-boot"+version+".js" },{ @@ -200,29 +231,57 @@ module.exports = function(grunt) { ] }, files: [ - {src: ['src/index.html'], dest: 'dest/piskelapp-partials/main-partial.html'} + // src/index.html should already have been moved by the includereplace task + {src: ['dest/index.html'], dest: 'dest/piskelapp-partials/main-partial.html'} ] } }, + copy: { - main: { + prod: { files: [ - {src: ['dest/js/piskel-packaged-min.js'], dest: 'dest/js/piskel-packaged-min' + version + '.js'}, - {src: ['dest/piskel-boot.js'], dest: 'dest/piskel-boot' + version + '.js'}, + // dest/js/piskel-packaged-min.js should have been created by the uglify task + {src: ['dest-tmp/js/piskel-packaged-min.js'], dest: 'dest/js/piskel-packaged-min' + version + '.js'}, + {src: ['dest-tmp/index.html'], dest: 'dest/index.html'}, {src: ['src/logo.png'], dest: 'dest/logo.png'}, - {src: ['src/js/lib/iframeLoader-0.1.0.js'], dest: 'dest/js/lib/iframeLoader-0.1.0.js'}, {src: ['src/js/lib/gif/gif.ie.worker.js'], dest: 'dest/js/lib/gif/gif.ie.worker.js'}, {expand: true, src: ['img/**'], cwd: 'src/', dest: 'dest/', filter: 'isFile'}, - {expand: true, src: ['css/fonts/**'], cwd: 'src/', dest: 'dest/', filter: 'isFile'}, - {expand: true, src: ['**/*.html'], cwd: 'src/', dest: 'dest/', filter: 'isFile'} + {expand: true, src: ['css/fonts/**'], cwd: 'src/', dest: 'dest/', filter: 'isFile'} + ] + }, + dev: { + files: [ + // in dev copy everything to dest-dev + {src: ['dest-tmp/index.html'], dest: 'dest-dev/index.html'}, + {src: ['src/piskel-boot.js'], dest: 'dest-dev/piskel-boot.js'}, + {src: ['src/piskel-script-list.js'], dest: 'dest-dev/piskel-script-list.js'}, + {src: ['src/piskel-style-list.js'], dest: 'dest-dev/piskel-style-list.js'}, + {expand: true, src: ['js/**'], cwd: 'src/', dest: 'dest-dev/', filter: 'isFile'}, + {expand: true, src: ['css/**'], cwd: 'src/', dest: 'dest-dev/', filter: 'isFile'}, + {expand: true, src: ['img/**'], cwd: 'src/', dest: 'dest-dev/', filter: 'isFile'}, ] } }, + + /** + * TESTING + */ + karma: { unit: { configFile: 'karma.conf.js' } }, + + ghost : { + 'travis' : getCasperConfig('travis'), + 'local' : getCasperConfig('local') + }, + + /** + * DESKTOP BUILDS + */ + nodewebkit: { windows : { options: { @@ -237,23 +296,12 @@ module.exports = function(grunt) { macos : { options: { platforms : ['osx64'], + // had performance issues with 0.11.5 on mac os, need to test new versions/new hardware version : "0.10.5", build_dir: './dest/desktop/' }, src: ['./dest/**/*', "./package.json", "!./dest/desktop/"] } - }, - /** - * - * SPRITING - * - */ - sprite:{ - all : { - src: 'src/img/icons/**/*.png', - dest: 'src/img/icons.png', - destCss: 'src/css/icons.css' - } } }); @@ -264,19 +312,22 @@ module.exports = function(grunt) { grunt.registerTask('unit-test', ['karma']); // Validate & Test - grunt.registerTask('test-travis', ['lint', 'unit-test', 'express:test', 'ghost:travis']); + grunt.registerTask('test-travis', ['lint', 'unit-test', 'build-dev', 'express:test', 'ghost:travis']); // Validate & Test (faster version) will NOT work on travis !! - grunt.registerTask('test-local', ['lint', 'unit-test', 'express:test', 'ghost:local']); - grunt.registerTask('test-local-nolint', ['unit-test', 'express:test', 'ghost:local']); + grunt.registerTask('test-local', ['lint', 'unit-test', 'build-dev', 'express:test', 'ghost:local']); + grunt.registerTask('test-local-nolint', ['unit-test', 'build-dev', 'express:test', 'ghost:local']); grunt.registerTask('test', ['test-travis']); grunt.registerTask('precommit', ['test-local']); - grunt.registerTask('build', ['sprite', 'concat:js', 'concat:css', 'uglify', 'replace:main', 'replace:editor', 'copy']); + grunt.registerTask('build-index.html', ['includereplace']); + grunt.registerTask('merge-statics', ['concat:js', 'concat:css', 'uglify']); + grunt.registerTask('replace-all', ['replace:piskelBoot', 'replace:mainPartial']); + grunt.registerTask('build', ['clean:prod', 'sprite', 'merge-statics', 'build-index.html', 'replace-all', 'copy:prod']); + grunt.registerTask('build-dev', ['clean:dev', 'sprite', 'build-index.html', 'copy:dev']); // Validate & Build - grunt.registerTask('default', ['clean:before', 'lint', 'build']); - grunt.registerTask('caca', ['sprite']); + grunt.registerTask('default', ['lint', 'build']); // Build stand alone app with nodewebkit grunt.registerTask('desktop', ['default', 'nodewebkit:windows']); @@ -284,8 +335,7 @@ module.exports = function(grunt) { // Start webserver and watch for changes grunt.registerTask('serve', ['build', 'express:regular', 'open:regular', 'watch:prod']); - // Start webserver on src folder, in debug mode - grunt.registerTask('serve-debug', ['sprite', 'express:debug', 'open:debug', 'watch:dev']); + grunt.registerTask('serve-debug', ['build-dev', 'express:debug', 'open:debug', 'watch:dev']); grunt.registerTask('play', ['serve-debug']); }; diff --git a/package.json b/package.json index cddcb6f5..2946b406 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "grunt-contrib-watch": "0.6.1", "grunt-express": "1.4.1", "grunt-ghost": "1.1.0", + "grunt-include-replace": "^3.2.0", "grunt-jscs": "^1.6.0", "grunt-karma": "^0.10.1", "grunt-leading-indent": "^0.2.0", diff --git a/src/css/icons.css b/src/css/icons.css deleted file mode 100644 index 00c8d017..00000000 --- a/src/css/icons.css +++ /dev/null @@ -1,197 +0,0 @@ -/* -Icon classes can be used entirely standalone. They are named after their original file names. - -```html - -
- - - -``` -*/ -.icon-common-keyboard-gold { - background-image: url(../img/icons.png); - background-position: -230px 0px; - width: 35px; - height: 20px; -} -.icon-common-swapcolors-arrow-grey { - background-image: url(../img/icons.png); - background-position: -230px -46px; - width: 18px; - height: 18px; -} -.icon-frame-dragndrop-white { - background-image: url(../img/icons.png); - background-position: -198px -184px; - width: 30px; - height: 30px; -} -.icon-frame-duplicate-white { - background-image: url(../img/icons.png); - background-position: -168px -184px; - width: 30px; - height: 30px; -} -.icon-frame-plus-white { - background-image: url(../img/icons.png); - background-position: -230px -20px; - width: 26px; - height: 26px; -} -.icon-frame-recyclebin-white { - background-image: url(../img/icons.png); - background-position: -138px -184px; - width: 30px; - height: 30px; -} -.icon-minimap-popup-preview-arrow-gold { - background-image: url(../img/icons.png); - background-position: -230px -82px; - width: 18px; - height: 18px; -} -.icon-minimap-popup-preview-arrow-white { - background-image: url(../img/icons.png); - background-position: -230px -64px; - width: 18px; - height: 18px; -} -.icon-settings-export-white { - background-image: url(../img/icons.png); - background-position: -92px -92px; - width: 46px; - height: 46px; -} -.icon-settings-gear-white { - background-image: url(../img/icons.png); - background-position: -138px 0px; - width: 46px; - height: 46px; -} -.icon-settings-open-folder-white { - background-image: url(../img/icons.png); - background-position: -138px -46px; - width: 46px; - height: 46px; -} -.icon-settings-resize-white { - background-image: url(../img/icons.png); - background-position: -138px -92px; - width: 46px; - height: 46px; -} -.icon-settings-save-white { - background-image: url(../img/icons.png); - background-position: 0px -138px; - width: 46px; - height: 46px; -} -.icon-tool-circle { - background-image: url(../img/icons.png); - background-position: -46px -138px; - width: 46px; - height: 46px; -} -.icon-tool-colorpicker { - background-image: url(../img/icons.png); - background-position: -92px -138px; - width: 46px; - height: 46px; -} -.icon-tool-colorswap { - background-image: url(../img/icons.png); - background-position: 0px 0px; - width: 46px; - height: 46px; -} -.icon-tool-dithering { - background-image: url(../img/icons.png); - background-position: -184px 0px; - width: 46px; - height: 46px; -} -.icon-tool-eraser { - background-image: url(../img/icons.png); - background-position: -184px -46px; - width: 46px; - height: 46px; -} -.icon-tool-lasso-select { - background-image: url(../img/icons.png); - background-position: -184px -92px; - width: 46px; - height: 46px; -} -.icon-tool-lighten { - background-image: url(../img/icons.png); - background-position: -184px -138px; - width: 46px; - height: 46px; -} -.icon-tool-move { - background-image: url(../img/icons.png); - background-position: 0px -184px; - width: 46px; - height: 46px; -} -.icon-tool-paint-bucket { - background-image: url(../img/icons.png); - background-position: -46px -184px; - width: 46px; - height: 46px; -} -.icon-tool-pen { - background-image: url(../img/icons.png); - background-position: -92px -184px; - width: 46px; - height: 46px; -} -.icon-tool-rectangle-select { - background-image: url(../img/icons.png); - background-position: -138px -138px; - width: 46px; - height: 46px; -} -.icon-tool-rectangle { - background-image: url(../img/icons.png); - background-position: -46px -92px; - width: 46px; - height: 46px; -} -.icon-tool-shape-select { - background-image: url(../img/icons.png); - background-position: 0px -92px; - width: 46px; - height: 46px; -} -.icon-tool-stroke { - background-image: url(../img/icons.png); - background-position: -92px -46px; - width: 46px; - height: 46px; -} -.icon-tool-vertical-mirror-pen { - background-image: url(../img/icons.png); - background-position: -92px 0px; - width: 46px; - height: 46px; -} -.icon-tool-clone { - background-image: url(../img/icons.png); - background-position: -46px -46px; - width: 46px; - height: 46px; -} -.icon-tool-flip { - background-image: url(../img/icons.png); - background-position: 0px -46px; - width: 46px; - height: 46px; -} -.icon-tool-rotate { - background-image: url(../img/icons.png); - background-position: -46px 0px; - width: 46px; - height: 46px; -} diff --git a/src/img/canvas-backgrounds.png b/src/img/canvas-backgrounds.png deleted file mode 100644 index a62d1d3b..00000000 Binary files a/src/img/canvas-backgrounds.png and /dev/null differ diff --git a/src/img/icons.png b/src/img/icons.png deleted file mode 100644 index 83638553..00000000 Binary files a/src/img/icons.png and /dev/null differ diff --git a/src/img/icons/transform/tool-clone.png b/src/img/icons/transform/tool-clone.png index 4d43dae7..0425befd 100644 Binary files a/src/img/icons/transform/tool-clone.png and b/src/img/icons/transform/tool-clone.png differ diff --git a/src/index.html b/src/index.html index 3b30b73d..42e97abf 100644 --- a/src/index.html +++ b/src/index.html @@ -22,7 +22,6 @@ color:white;"> Loading Piskel ... -