Add separator option, warn on nonexistent src files and empty output.

This commit is contained in:
Kyle Robinson Young 2013-01-10 13:08:29 -08:00
parent f6d67bca77
commit ab2565473e
4 changed files with 55 additions and 31 deletions

View File

@ -25,6 +25,12 @@ _Version `0.4.x` of this plugin is compatible with Grunt `0.4.x`. Version `0.3.x
### Options ### Options
#### separator
Type: `String`
Default: linefeed + linefeed
Concatenated files will be joined on this string.
#### namespace #### namespace
Type: `String` Type: `String`
Default: 'JST' 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.* The namespace in which the precompiled templates will be asssigned. *Use dot notation (e.g. App.Templates) for nested namespaces.*
#### processName #### processName
Type: ```function``` Type: `function`
Default: null 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. 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 #### templateSettings
Type: ```Object``` Type: `Object`
Default: null Default: null
The settings passed to underscore when compiling templates. The settings passed to underscore when compiling templates.
@ -67,27 +73,27 @@ jst: {
``` ```
#### prettify #### prettify
Type: ```boolean``` Type: `boolean`
Default: false Default: false
When doing a quick once-over of your compiled template file, it's nice to see 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 an easy-to-read format that has one line per template. This will accomplish
that. that.
```javascript ```js
options: { options: {
prettify: true prettify: true
} }
``` ```
#### amdWrapper #### amdWrapper
Type: ```boolean``` Type: `boolean`
Default: false Default: false
With Require.js and a pre-compiled template.js you want the templates to be 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: wrapped in a define. This will wrap the output in:
``` javascript ```js
define(function() { define(function() {
//Templates //Templates
return this["NAMESPACE"]; return this["NAMESPACE"];
@ -95,21 +101,21 @@ define(function() {
``` ```
Example: Example:
``` javascript ```js
options: { options: {
amdWrapper: true amdWrapper: true
} }
``` ```
#### processContent #### processContent
Type: ```function``` Type: `function`
This option accepts a function which takes one argument (the file content) and This option accepts a function which takes one argument (the file content) and
returns a string which will be used as template string. returns a string which will be used as template string.
The example below strips whitespace characters from the beginning and the end of The example below strips whitespace characters from the beginning and the end of
each line. each line.
```javascript ```js
options: { options: {
processContent: function(src) { processContent: function(src) {
return src.replace(/(^\s+|\s+$)/gm, ''); return src.replace(/(^\s+|\s+$)/gm, '');
@ -137,7 +143,7 @@ jst: {
## Release History ## Release History
* 2013-01-08v0.4.0rc5Updating to work with grunt v0.4.0rc5. Switching to this.filesSrc api. * 2013-01-08v0.4.0rc5Updating to work with grunt v0.4.0rc5. Switching to this.files api.
* 2012-10-11v0.3.1Rename grunt-contrib-lib dep to grunt-lib-contrib. * 2012-10-11v0.3.1Rename grunt-contrib-lib dep to grunt-lib-contrib.
* 2012-08-22v0.3.0Options no longer accepted from global config key. * 2012-08-22v0.3.0Options no longer accepted from global config key.
* 2012-08-15v0.2.3Support for nested namespaces. * 2012-08-15v0.2.3Support for nested namespaces.
@ -148,4 +154,4 @@ jst: {
Task submitted by [Tim Branyen](http://tbranyen.com) 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.*

View File

@ -1,5 +1,11 @@
# Options # Options
## separator
Type: `String`
Default: linefeed + linefeed
Concatenated files will be joined on this string.
## namespace ## namespace
Type: `String` Type: `String`
Default: 'JST' 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.* The namespace in which the precompiled templates will be asssigned. *Use dot notation (e.g. App.Templates) for nested namespaces.*
## processName ## processName
Type: ```function``` Type: `function`
Default: null 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. 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 ## templateSettings
Type: ```Object``` Type: `Object`
Default: null Default: null
The settings passed to underscore when compiling templates. The settings passed to underscore when compiling templates.
@ -42,27 +48,27 @@ jst: {
``` ```
## prettify ## prettify
Type: ```boolean``` Type: `boolean`
Default: false Default: false
When doing a quick once-over of your compiled template file, it's nice to see 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 an easy-to-read format that has one line per template. This will accomplish
that. that.
```javascript ```js
options: { options: {
prettify: true prettify: true
} }
``` ```
## amdWrapper ## amdWrapper
Type: ```boolean``` Type: `boolean`
Default: false Default: false
With Require.js and a pre-compiled template.js you want the templates to be 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: wrapped in a define. This will wrap the output in:
``` javascript ```js
define(function() { define(function() {
//Templates //Templates
return this["NAMESPACE"]; return this["NAMESPACE"];
@ -70,21 +76,21 @@ define(function() {
``` ```
Example: Example:
``` javascript ```js
options: { options: {
amdWrapper: true amdWrapper: true
} }
``` ```
## processContent ## processContent
Type: ```function``` Type: `function`
This option accepts a function which takes one argument (the file content) and This option accepts a function which takes one argument (the file content) and
returns a string which will be used as template string. returns a string which will be used as template string.
The example below strips whitespace characters from the beginning and the end of The example below strips whitespace characters from the beginning and the end of
each line. each line.
```javascript ```js
options: { options: {
processContent: function(src) { processContent: function(src) {
return src.replace(/(^\s+|\s+$)/gm, ''); return src.replace(/(^\s+|\s+$)/gm, '');

View File

@ -29,7 +29,7 @@
}, },
"dependencies": { "dependencies": {
"lodash": "~1.0.0", "lodash": "~1.0.0",
"grunt-lib-contrib": "~0.3.0" "grunt-lib-contrib": "~0.5.1"
}, },
"devDependencies": { "devDependencies": {
"grunt-contrib-jshint": "~0.1.1rc5", "grunt-contrib-jshint": "~0.1.1rc5",

View File

@ -16,12 +16,13 @@ module.exports = function(grunt) {
var defaultProcessName = function(name) { return name; }; var defaultProcessName = function(name) { return name; };
grunt.registerMultiTask('jst', 'Compile underscore templates to JST file', function() { grunt.registerMultiTask('jst', 'Compile underscore templates to JST file', function() {
var lf = grunt.util.linefeed;
var helpers = require('grunt-lib-contrib').init(grunt); var helpers = require('grunt-lib-contrib').init(grunt);
var options = this.options({ var options = this.options({
namespace: 'JST', namespace: 'JST',
templateSettings: {}, templateSettings: {},
processContent: function (src) { return src; } processContent: function (src) { return src; },
separator: lf + lf
}); });
// assign filename transformation functions // assign filename transformation functions
@ -29,12 +30,21 @@ module.exports = function(grunt) {
grunt.verbose.writeflags(options, 'Options'); grunt.verbose.writeflags(options, 'Options');
var compiled, src, filename, output;
var nsInfo = helpers.getNamespaceDeclaration(options.namespace); var nsInfo = helpers.getNamespaceDeclaration(options.namespace);
this.files.forEach(function(f) { this.files.forEach(function(f) {
output = f.src.map(function(file) { var output = f.src.filter(function(filepath) {
src = options.processContent(grunt.file.read(file)); // 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 { try {
compiled = _.template(src, false, options.templateSettings).source; compiled = _.template(src, false, options.templateSettings).source;
@ -44,14 +54,16 @@ module.exports = function(grunt) {
} }
if (options.prettify) { 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+';'; 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); output.unshift(nsInfo.declaration);
if (options.amdWrapper) { if (options.amdWrapper) {
if (options.prettify) { if (options.prettify) {
@ -60,9 +72,9 @@ module.exports = function(grunt) {
}); });
} }
output.unshift("define(function(){"); 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.'); grunt.log.writeln('File "' + f.dest + '" created.');
} }
}); });