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
#### 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-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-08-22v0.3.0Options no longer accepted from global config key.
* 2012-08-15v0.2.3Support 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.*

View File

@ -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, '');

View File

@ -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",

View File

@ -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.');
}
});