diff --git a/README.md b/README.md index bca7db9..6d59870 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,12 @@ _Version `0.4.x` of this plugin is compatible with Grunt `0.4.x`. Version `0.3.x ### Options +#### separator +Type: `String` +Default: linefeed + linefeed + +Concatenated files will be joined on this string. + #### namespace Type: `String` Default: 'JST' @@ -32,7 +38,7 @@ Default: 'JST' The namespace in which the precompiled templates will be asssigned. *Use dot notation (e.g. App.Templates) for nested namespaces.* #### processName -Type: ```function``` +Type: `function` Default: null This option accepts a function which takes one argument (the template filepath) and returns a string which will be used as the key for the precompiled template object. The example below stores all templates on the default JST namespace in capital letters. @@ -46,7 +52,7 @@ options: { ``` #### templateSettings -Type: ```Object``` +Type: `Object` Default: null The settings passed to underscore when compiling templates. @@ -67,27 +73,27 @@ jst: { ``` #### prettify -Type: ```boolean``` +Type: `boolean` Default: false When doing a quick once-over of your compiled template file, it's nice to see an easy-to-read format that has one line per template. This will accomplish that. -```javascript +```js options: { prettify: true } ``` #### amdWrapper -Type: ```boolean``` +Type: `boolean` Default: false With Require.js and a pre-compiled template.js you want the templates to be wrapped in a define. This will wrap the output in: -``` javascript +```js define(function() { //Templates return this["NAMESPACE"]; @@ -95,21 +101,21 @@ define(function() { ``` Example: -``` javascript +```js options: { amdWrapper: true } ``` #### processContent -Type: ```function``` +Type: `function` This option accepts a function which takes one argument (the file content) and returns a string which will be used as template string. The example below strips whitespace characters from the beginning and the end of each line. -```javascript +```js options: { processContent: function(src) { return src.replace(/(^\s+|\s+$)/gm, ''); @@ -137,7 +143,7 @@ jst: { ## Release History - * 2013-01-08   v0.4.0rc5   Updating to work with grunt v0.4.0rc5. Switching to this.filesSrc api. + * 2013-01-08   v0.4.0rc5   Updating to work with grunt v0.4.0rc5. Switching to this.files api. * 2012-10-11   v0.3.1   Rename grunt-contrib-lib dep to grunt-lib-contrib. * 2012-08-22   v0.3.0   Options no longer accepted from global config key. * 2012-08-15   v0.2.3   Support for nested namespaces. @@ -148,4 +154,4 @@ jst: { Task submitted by [Tim Branyen](http://tbranyen.com) -*This file was generated on Wed Jan 09 2013 14:42:32.* +*This file was generated on Thu Jan 10 2013 13:04:44.* diff --git a/docs/jst-options.md b/docs/jst-options.md index c2ca678..aa09c5a 100644 --- a/docs/jst-options.md +++ b/docs/jst-options.md @@ -1,5 +1,11 @@ # Options +## separator +Type: `String` +Default: linefeed + linefeed + +Concatenated files will be joined on this string. + ## namespace Type: `String` Default: 'JST' @@ -7,7 +13,7 @@ Default: 'JST' The namespace in which the precompiled templates will be asssigned. *Use dot notation (e.g. App.Templates) for nested namespaces.* ## processName -Type: ```function``` +Type: `function` Default: null This option accepts a function which takes one argument (the template filepath) and returns a string which will be used as the key for the precompiled template object. The example below stores all templates on the default JST namespace in capital letters. @@ -21,7 +27,7 @@ options: { ``` ## templateSettings -Type: ```Object``` +Type: `Object` Default: null The settings passed to underscore when compiling templates. @@ -42,27 +48,27 @@ jst: { ``` ## prettify -Type: ```boolean``` +Type: `boolean` Default: false When doing a quick once-over of your compiled template file, it's nice to see an easy-to-read format that has one line per template. This will accomplish that. -```javascript +```js options: { prettify: true } ``` ## amdWrapper -Type: ```boolean``` +Type: `boolean` Default: false With Require.js and a pre-compiled template.js you want the templates to be wrapped in a define. This will wrap the output in: -``` javascript +```js define(function() { //Templates return this["NAMESPACE"]; @@ -70,21 +76,21 @@ define(function() { ``` Example: -``` javascript +```js options: { amdWrapper: true } ``` ## processContent -Type: ```function``` +Type: `function` This option accepts a function which takes one argument (the file content) and returns a string which will be used as template string. The example below strips whitespace characters from the beginning and the end of each line. -```javascript +```js options: { processContent: function(src) { return src.replace(/(^\s+|\s+$)/gm, ''); diff --git a/package.json b/package.json index 2cea5a9..ad938cc 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ }, "dependencies": { "lodash": "~1.0.0", - "grunt-lib-contrib": "~0.3.0" + "grunt-lib-contrib": "~0.5.1" }, "devDependencies": { "grunt-contrib-jshint": "~0.1.1rc5", diff --git a/tasks/jst.js b/tasks/jst.js index 129b584..87f2241 100644 --- a/tasks/jst.js +++ b/tasks/jst.js @@ -16,12 +16,13 @@ module.exports = function(grunt) { var defaultProcessName = function(name) { return name; }; grunt.registerMultiTask('jst', 'Compile underscore templates to JST file', function() { - + var lf = grunt.util.linefeed; var helpers = require('grunt-lib-contrib').init(grunt); var options = this.options({ namespace: 'JST', templateSettings: {}, - processContent: function (src) { return src; } + processContent: function (src) { return src; }, + separator: lf + lf }); // assign filename transformation functions @@ -29,12 +30,21 @@ module.exports = function(grunt) { grunt.verbose.writeflags(options, 'Options'); - var compiled, src, filename, output; var nsInfo = helpers.getNamespaceDeclaration(options.namespace); this.files.forEach(function(f) { - output = f.src.map(function(file) { - src = options.processContent(grunt.file.read(file)); + var output = f.src.filter(function(filepath) { + // Warn on and remove invalid source files (if nonull was set). + if (!grunt.file.exists(filepath)) { + grunt.log.warn('Source file "' + filepath + '" not found.'); + return false; + } else { + return true; + } + }) + .map(function(filepath) { + var src = options.processContent(grunt.file.read(filepath)); + var compiled, filename; try { compiled = _.template(src, false, options.templateSettings).source; @@ -44,14 +54,16 @@ module.exports = function(grunt) { } if (options.prettify) { - compiled = compiled.replace(/\n+/g, ''); + compiled = compiled.replace(new RegExp(lf, 'g'), ''); } - filename = processName(file); + filename = processName(filepath); return nsInfo.namespace+'['+JSON.stringify(filename)+'] = '+compiled+';'; }); - if (output.length > 0) { + if (output.length < 1) { + grunt.log.warn('Destination not written because compiled files were empty.'); + } else { output.unshift(nsInfo.declaration); if (options.amdWrapper) { if (options.prettify) { @@ -60,9 +72,9 @@ module.exports = function(grunt) { }); } output.unshift("define(function(){"); - output.push(" return " + nsInfo.namespace + ";\n});"); + output.push(" return " + nsInfo.namespace + ";" + lf + "});"); } - grunt.file.write(f.dest, output.join('\n\n')); + grunt.file.write(f.dest, output.join(grunt.util.normalizelf(options.separator))); grunt.log.writeln('File "' + f.dest + '" created.'); } });