111 lines
2.6 KiB
JavaScript
111 lines
2.6 KiB
JavaScript
/*
|
|
* grunt-less
|
|
* https://github.com/jachardi/grunt-less
|
|
*
|
|
* Copyright (c) 2012 Jake Harding
|
|
* Licensed under the MIT license.
|
|
*/
|
|
|
|
module.exports = function(grunt) {
|
|
// Grunt utilities.
|
|
var task = grunt.task;
|
|
var file = grunt.file;
|
|
var utils = grunt.utils;
|
|
var log = grunt.log;
|
|
var verbose = grunt.verbose;
|
|
var fail = grunt.fail;
|
|
var option = grunt.option;
|
|
var config = grunt.config;
|
|
var template = grunt.template;
|
|
|
|
// external dependencies
|
|
var fs = require('fs');
|
|
var path = require('path');
|
|
var less = require('less');
|
|
|
|
// ==========================================================================
|
|
// TASKS
|
|
// ==========================================================================
|
|
|
|
grunt.registerMultiTask('less', 'Compile LESS files.', function() {
|
|
var src = this.file.src;
|
|
var dest = this.file.dest;
|
|
var options = this.data.options || {};
|
|
|
|
if (!src) {
|
|
grunt.warn('Missing src property.');
|
|
return false;
|
|
}
|
|
|
|
if (!dest) {
|
|
grunt.warn('Missing dest property');
|
|
return false;
|
|
}
|
|
|
|
var srcFiles = file.expandFiles(src);
|
|
|
|
var done = this.async();
|
|
|
|
grunt.helper('less', srcFiles, options, function(err, css) {
|
|
if (err) {
|
|
grunt.warn(err);
|
|
done(false);
|
|
|
|
return;
|
|
}
|
|
|
|
file.write(dest, css);
|
|
done();
|
|
});
|
|
});
|
|
|
|
// ==========================================================================
|
|
// HELPERS
|
|
// ==========================================================================
|
|
|
|
grunt.registerHelper('less', function(srcFiles, options, callback) {
|
|
var compileLESSFile = function(src, callback) {
|
|
var parser = new less.Parser({
|
|
paths: [path.dirname(src)]
|
|
});
|
|
|
|
// read source file
|
|
fs.readFile(src, 'utf8', function(err, data) {
|
|
if (err) {
|
|
callback(err);
|
|
}
|
|
|
|
// send data from source file to LESS parser to get CSS
|
|
verbose.writeln('Parsing ' + src);
|
|
parser.parse(data, function(err, tree) {
|
|
if (err) {
|
|
callback(err);
|
|
}
|
|
|
|
var css = null;
|
|
try {
|
|
css = tree.toCSS({
|
|
compress: options.compress,
|
|
yuicompress: options.yuicompress
|
|
});
|
|
} catch(e) {
|
|
callback(e);
|
|
return;
|
|
}
|
|
|
|
callback(null, css);
|
|
});
|
|
});
|
|
};
|
|
|
|
utils.async.map(srcFiles, compileLESSFile, function(err, results) {
|
|
if (err) {
|
|
callback(err);
|
|
return;
|
|
}
|
|
|
|
callback(null, results.join(utils.linefeed));
|
|
});
|
|
});
|
|
};
|