ripple-core
Version:
Ripple is an interactive audience response system that allows presenters to survey audience members in real time communication through their mobile devices.
118 lines (99 loc) • 3 kB
JavaScript
var less = require('less')
, fs = require('fs')
, path = require('path')
, util = require('util')
, async = require('async')
, logger = require('../lib/log')
, log = logger.logPair;
var LC = {};
LC.init = function(options){
LC.parsing = false;
// Make sure options defaults to object
options = options || {};
// Set up path variables
var baseDir = options.baseDir || __dirname;
LC.lessDir = options.lessDir || path.join(baseDir, 'public', 'less');
LC.cssDir = options.cssDir || path.join(baseDir, 'public', 'css');;
// Set Options
LC.options = options || {};
// LESS Filename
LC.filenames = options.lessFiles || ['style.less','admin.less','client.less'];
// Compression by defualt
LC.options.compress = options.compress || true;
// By default do not watch for changes
LC.options.watch = options.watch || false;
var watch = LC.options.watch;
// Run now
LC.options.runNow = options.runNow || true;
var runNow = LC.options.runNow;
if( runNow ) LC.run();
if( watch ) LC.watch();
}
LC.watch = function(){
// Continually Watch Folder
log("Watching for LESS changes in", LC.lessDir);
fs.watch(LC.lessDir, function(e, file){
var timer = LC.timer;
if( !LC.parsing ) {
log("---- Detected change & started to parse", file)
// Set parsing to active state
LC.parsing = true;
// Run parser
LC.run();
}
});
}
LC.run = function(){
var filenames = LC.filenames
, lessDir = LC.lessDir
, options = LC.options
, cssDir = LC.cssDir;
async.forEach(
filenames,
function(filename, callback){
// Parses file
var parser, contents;
logger.debugPair('Parsing...', filename);
fullPath = path.join(lessDir, filename);
if(!filename.match(/\.less$/) || !fs.statSync(fullPath).isFile()) return;
// LESS Parser Object
parser = new (less.Parser)({
paths: [ lessDir ],
filename: filename
});
// Check contents of directory
contents = fs.readFileSync(fullPath).toString();
// Parse LESS
parser.parse(contents, function(err, tree){
if(err) {
if( err === Object(err))
callback( util.inspect(err) );
else
callback(err);
return false;
}
var cssFilename = filename.replace(/less$/, 'css')
, outputFile = path.join(cssDir, cssFilename);
fs.writeFile(
outputFile,
tree.toCSS({compress: options.compress}),
function(err){
if(err) callback(err);
else {
logger.debugPair("Parsed LESS into ", cssFilename);
callback && callback();
}
});
});
},
function(err){
LC.parsing = false;
if(err) logger.errorPair("Error parsing LESS",err);
else {
logger.log("---- LESS Parsing Complete");
return true;
}
}
);
}
module.exports = LC;