commit 21637cf3a64bd592a547e1cef227a7b1a162662c Author: Olivier Audard Date: Sun Aug 26 03:52:27 2012 +0200 Initial import diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b91331e --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.npmignore +node_modules diff --git a/LICENSE-MIT b/LICENSE-MIT new file mode 100644 index 0000000..910f19d --- /dev/null +++ b/LICENSE-MIT @@ -0,0 +1,22 @@ +Copyright (c) 2012 Olivier Audard + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..9e174c8 --- /dev/null +++ b/README.md @@ -0,0 +1,57 @@ +# grunt-wkhtmltopdf + +A simple [Grunt][grunt] task that uses [wkhtmltopdf][wkhtmltopdf] to convert HTML files to PDF. +Convertion to PDF takes care of `@media print` CSS rules and preserves links to remote web pages. + +## Getting Started + +### Setting up wkhtmltopdf + +Download and install wkhtmltopdf from the [project page][wkhtmltopdf_dl]. + +Make sure `wkhtmltopdf` is accessible from your `PATH` (Try `wkhtmltopdf -V` in your Terminal). +I'm on Mas OS X, so I created the following symlink to my `/usr/local/bin/` folder: + +``` +ln -s /usr/local/bin/wkhtmltopdf.app/Contents/MacOS/wkhtmltopdf /usr/local/bin/wkhtmltopdf +``` + +### Use it with grunt + +Install this grunt plugin next to your project's [grunt.js gruntfile][getting_started] with: `npm install grunt-wkhtmltopdf` + +Then add this line to your project's `grunt.js` gruntfile: + +```javascript +grunt.loadNpmTasks('grunt-wkhtmltopdf'); +``` + +[wkhtmltopdf]: http://code.google.com/p/wkhtmltopdf/ +[wkhtmltopdf_dl]: http://code.google.com/p/wkhtmltopdf/downloads/list +[grunt]: https://github.com/cowboy/grunt +[getting_started]: https://github.com/cowboy/grunt/blob/master/docs/getting_started.md + +## Documentation +Simply add the following to your gruntfile: + +```javascript + //... + wkhtmltopdf: { + src: 'path/to/some/html/file/*.html', + dest: 'pdf/output/' + }, + //... +``` + +Then run `grunt wkhtmltopdf` or use it as any other grunt task. Every `html` file in your `path/to/some/html/file/` folder will be turned into a PDF and saved to `pdf/output/` folder. + +## Contributing +In lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using [grunt][grunt]. + +## Release History + + - *v0.1.0*: First Release + +## License +Copyright (c) 2012 Olivier Audard +Licensed under the MIT license. diff --git a/bin/grunt-wkhtmltopdf b/bin/grunt-wkhtmltopdf new file mode 100644 index 0000000..b3d344f --- /dev/null +++ b/bin/grunt-wkhtmltopdf @@ -0,0 +1,2 @@ +#!/usr/bin/env node +require('grunt').npmTasks('grunt-wkhtmltopdf').cli(); diff --git a/grunt.js b/grunt.js new file mode 100644 index 0000000..008da40 --- /dev/null +++ b/grunt.js @@ -0,0 +1,40 @@ +module.exports = function(grunt) { + + // Project configuration. + grunt.initConfig({ + test: { + files: ['test/**/*.js'] + }, + lint: { + files: ['grunt.js', 'tasks/**/*.js', 'test/**/*.js'] + }, + watch: { + files: '', + tasks: 'default' + }, + jshint: { + options: { + curly: true, + eqeqeq: true, + immed: true, + latedef: true, + newcap: true, + noarg: true, + sub: true, + undef: true, + boss: true, + eqnull: true, + node: true, + es5: true + }, + globals: {} + } + }); + + // Load local tasks. + grunt.loadTasks('tasks'); + + // Default task. + grunt.registerTask('default', 'lint test'); + +}; diff --git a/package.json b/package.json new file mode 100644 index 0000000..7d10f45 --- /dev/null +++ b/package.json @@ -0,0 +1,41 @@ +{ + "name": "grunt-wkhtmltopdf", + "description": "Grunt Task that uses wkhtmltopdf to convert HTML files to PDF", + "version": "0.1.0", + "homepage": "https://github.com/dhar/grunt-wkhtmltopdf", + "author": { + "name": "Olivier Audard", + "email": "audard@gmail.com", + "url": "http://www.dhar.fr/" + }, + "repository": { + "type": "git", + "url": "git://github.com/dhar/grunt-wkhtmltopdf.git" + }, + "bugs": { + "url": "https://github.com/dhar/grunt-wkhtmltopdf/issues" + }, + "licenses": [ + { + "type": "MIT", + "url": "https://github.com/dhar/grunt-wkhtmltopdf/blob/master/LICENSE-MIT" + } + ], + "main": "grunt.js", + "bin": "bin/grunt-wkhtmltopdf", + "engines": { + "node": "*" + }, + "scripts": { + "test": "grunt test" + }, + "dependencies": { + "grunt": "~0.3.9" + }, + "devDependencies": { + "grunt": "~0.3.9" + }, + "keywords": [ + "gruntplugin" + ] +} \ No newline at end of file diff --git a/tasks/wkhtmltopdf.js b/tasks/wkhtmltopdf.js new file mode 100644 index 0000000..c44be6b --- /dev/null +++ b/tasks/wkhtmltopdf.js @@ -0,0 +1,91 @@ +/* + * grunt-wkhtmltopdf + * https://github.com/dhar/grunt-wkhtmltopdf + * + * Copyright (c) 2012 Olivier Audard + * Licensed under the MIT license. + */ +/*globals module:false*/ +module.exports = function(grunt) { + + // Please see the grunt documentation for more information regarding task and + // helper creation: https://github.com/cowboy/grunt/blob/master/docs/toc.md + + // ========================================================================== + // TASKS + // ========================================================================== + + grunt.registerTask('wkhtmltopdf', 'Your task description goes here.', function() { + grunt.config.requires('wkhtmltopdf.src'); + grunt.config.requires('wkhtmltopdf.dest'); + + var conf = grunt.config('wkhtmltopdf'); + + var htmlFiles = grunt.file.expandFiles(conf.src), + dest = (conf.dest && conf.dest !== '') ? conf.dest + '/' : ''; + + grunt.log.writeln("pdf output is: " + dest); + + htmlFiles.forEach(function(srcpath) { + var dir = dest + srcpath.replace(/.*\/([^\/]+)\/[^\/]+\.html/, '$1'); + + // 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. + grunt.helper('wkhtmltopdf', { + 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); + } + } + }); + }); + }); + + // ========================================================================== + // HELPERS + // ========================================================================== + + grunt.registerHelper('wkhtmltopdf', function(options) { + + if (!options || !options.args) { + grunt.warn("You need to specify atleast one input file, and exactly one output file"); + return null; + } + + return grunt.utils.spawn({ + cmd: 'wkhtmltopdf', + args: options.args + }, function(err, result, code) { + grunt.log.writeln('wkhtmltopdf done'); + if (!err) { return options.done(null); } + // Something went horribly wrong. + grunt.verbose.or.writeln(); + grunt.log.write('Running wkhtmltopdf...').error(); + if (code === 127) { + grunt.log.errorlns( + 'In order for this task to work properly, wkhtmltopdf must be ' + + 'installed and in the system PATH (if you can run "wkhtmltopdf" at' + + ' the command line, this task should work). Unfortunately, ' + + 'wkhtmltopdf cannot be installed automatically via npm or grunt. ' + ); + grunt.warn('wkhtmltopdf not found.', options.code); + } else { + result.split('\n').forEach(grunt.log.error, grunt.log); + grunt.warn('wkhtmltopdf exited unexpectedly with exit code ' + code + '.', options.code); + } + options.done(code); + }); + }); + +}; diff --git a/test/wkhtmltopdf_test.js b/test/wkhtmltopdf_test.js new file mode 100644 index 0000000..79ac32e --- /dev/null +++ b/test/wkhtmltopdf_test.js @@ -0,0 +1,34 @@ +/*globals require:false exports:false*/ +var grunt = require('grunt'); + +/* + ======== A Handy Little Nodeunit Reference ======== + https://github.com/caolan/nodeunit + + Test methods: + test.expect(numAssertions) + test.done() + Test assertions: + test.ok(value, [message]) + test.equal(actual, expected, [message]) + test.notEqual(actual, expected, [message]) + test.deepEqual(actual, expected, [message]) + test.notDeepEqual(actual, expected, [message]) + test.strictEqual(actual, expected, [message]) + test.notStrictEqual(actual, expected, [message]) + test.throws(block, [error], [message]) + test.doesNotThrow(block, [error], [message]) + test.ifError(value) +*/ + +exports['wkhtmltopdf'] = { + setUp: function(done) { + // setup here + done(); + }, + 'helper': function(test) { + test.expect(0); + // tests here + test.done(); + } +};