diff --git a/grunt.js b/Gruntfile.js similarity index 60% rename from grunt.js rename to Gruntfile.js index 008da40..ccdf7bd 100644 --- a/grunt.js +++ b/Gruntfile.js @@ -1,12 +1,14 @@ +'use strict'; + module.exports = function(grunt) { + // Load grunt tasks automatically + require('load-grunt-tasks')(grunt); + // Project configuration. grunt.initConfig({ - test: { - files: ['test/**/*.js'] - }, - lint: { - files: ['grunt.js', 'tasks/**/*.js', 'test/**/*.js'] + nodeunit: { + all: ['test/**/_test.js'] }, watch: { files: '', @@ -25,16 +27,19 @@ module.exports = function(grunt) { boss: true, eqnull: true, node: true, - es5: true }, - globals: {} + all: [ + 'Gruntfile.js', + 'tasks/{,*/}*.js', + 'test/{,*/}*.js', + ] } }); - // Load local tasks. - grunt.loadTasks('tasks'); - // Default task. - grunt.registerTask('default', 'lint test'); + grunt.registerTask('default', [ + 'jshint', + 'nodeunit:all' + ]); }; diff --git a/package.json b/package.json index a677a37..925f2a0 100644 --- a/package.json +++ b/package.json @@ -30,10 +30,13 @@ "test": "grunt test" }, "dependencies": { - "grunt": "~0.3.9" + "grunt": "~0.4.1" }, "devDependencies": { - "grunt": "~0.3.9" + "grunt": "~0.4.1", + "grunt-contrib-jshint": "^0.10.0", + "grunt-contrib-nodeunit": "^0.4.0", + "load-grunt-tasks": "^0.4.0" }, "keywords": [ "gruntplugin", @@ -41,4 +44,4 @@ "convert", "html" ] -} \ No newline at end of file +} diff --git a/tasks/wkhtmltopdf.js b/tasks/wkhtmltopdf.js index ee673be..6f6dc05 100644 --- a/tasks/wkhtmltopdf.js +++ b/tasks/wkhtmltopdf.js @@ -18,33 +18,54 @@ module.exports = function(grunt) { grunt.registerMultiTask('wkhtmltopdf', 'Your task description goes here.', function() { - var htmlFiles = grunt.file.expandFiles(this.file.src), - dest = (this.file.dest && this.file.dest !== '') ? this.file.dest + '/' : ''; + this.files.forEach(function(file) { - grunt.log.writeln("pdf output is: " + dest); + var pathlib = require('path'); + // calculate the destination directory and ensure it exists, since + // wkhtmltopdf won't create the PDF if the destination directory doesn't + // exist + var destPath = file.dest; + if (grunt.file.isFile(file.dest)) { + destPath = pathlib.dirname(file.dest); + } + grunt.file.mkdir(destPath); - htmlFiles.forEach(function(srcpath) { - var dir = dest + srcpath.replace(/.*\/([^\/]+)\/[^\/]+\.html/, '$1'); + file.src.forEach(function(src) { - // Create dest folder as wkhtmltopdf won't generate output if it doesn't exist - grunt.file.mkdir(dir); - var destpath = dir + '/' + - srcpath.replace(/.*\/([^\/]+)\.html/, '$1.pdf'); - - // Launch PhantomJS. - helper.convert({ - code: 90, - args: [ - '--dpi', '96', // workarround to wkhtmltopdf letter-spacing bug (see http://code.google.com/p/wkhtmltopdf/issues/detail?id=72) - '--print-media-type', // Use @print media type - srcpath, - destpath - ], - done: function(err) { - if (err) { - grunt.log('>>>', err); - } + var dest = file.dest; + // wkhtmltopdf seems to require that the destination be a file + // location, not a directory, so if the given destination is a + // directory then append the name of the source file but with the + // extension changed to .pdf + if (grunt.file.isDir(dest)) { + var srcFileName = pathlib.basename(src); + var srcFileExtension = pathlib.extname(src); + var destFileName = srcFileName.replace( + new RegExp(srcFileExtension + "$"), // match only the end of the string + ".pdf" + ); + dest = pathlib.join(destPath + destFileName); } + + grunt.log.writeln( + "Converting " + src + " -> " + dest + ); + + // Launch PhantomJS. + helper.convert({ + code: 90, + args: [ + '--dpi', '96', // workarround to wkhtmltopdf letter-spacing bug (see http://code.google.com/p/wkhtmltopdf/issues/detail?id=72) + '--print-media-type', // Use @print media type + src, + dest + ], + done: function(err) { + if (err) { + grunt.log('>>>', err); + } + } + }); }); }); });