You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
2.9 KiB
120 lines
2.9 KiB
/*! |
|
* node-sass: lib/render.js |
|
*/ |
|
|
|
var chalk = require('chalk'), |
|
fs = require('fs'), |
|
path = require('path'), |
|
sass = require('./'); |
|
|
|
/** |
|
* Render |
|
* |
|
* @param {Object} options |
|
* @param {Object} emitter |
|
* @api public |
|
*/ |
|
|
|
module.exports = function(options, emitter) { |
|
var renderOptions = { |
|
includePaths: options.includePath, |
|
omitSourceMapUrl: options.omitSourceMapUrl, |
|
indentedSyntax: options.indentedSyntax, |
|
outFile: options.dest, |
|
outputStyle: options.outputStyle, |
|
precision: options.precision, |
|
sourceComments: options.sourceComments, |
|
sourceMapEmbed: options.sourceMapEmbed, |
|
sourceMapContents: options.sourceMapContents, |
|
sourceMap: options.sourceMap, |
|
sourceMapRoot: options.sourceMapRoot, |
|
importer: options.importer, |
|
functions: options.functions, |
|
indentWidth: options.indentWidth, |
|
indentType: options.indentType, |
|
linefeed: options.linefeed |
|
}; |
|
|
|
if (options.data) { |
|
renderOptions.data = options.data; |
|
} else if (options.src) { |
|
renderOptions.file = options.src; |
|
} |
|
|
|
var sourceMap = options.sourceMap; |
|
var destination = options.dest; |
|
var stdin = options.stdin; |
|
|
|
var success = function(result) { |
|
var todo = 1; |
|
var done = function() { |
|
if (--todo <= 0) { |
|
emitter.emit('done'); |
|
} |
|
}; |
|
|
|
if (!destination || stdin) { |
|
emitter.emit('log', result.css.toString()); |
|
|
|
if (sourceMap && !options.sourceMapEmbed) { |
|
emitter.emit('log', result.map.toString()); |
|
} |
|
|
|
return done(); |
|
} |
|
|
|
emitter.emit('info', chalk.green('Rendering Complete, saving .css file...')); |
|
|
|
fs.mkdir(path.dirname(destination), {recursive: true}, function(err) { |
|
if (err) { |
|
return emitter.emit('error', chalk.red(err)); |
|
} |
|
|
|
fs.writeFile(destination, result.css.toString(), function(err) { |
|
if (err) { |
|
return emitter.emit('error', chalk.red(err)); |
|
} |
|
|
|
emitter.emit('info', chalk.green('Wrote CSS to ' + destination)); |
|
emitter.emit('write', err, destination, result.css.toString()); |
|
done(); |
|
}); |
|
}); |
|
|
|
if (sourceMap) { |
|
todo++; |
|
|
|
fs.mkdir(path.dirname(sourceMap), {recursive: true}, function(err) { |
|
if (err) { |
|
return emitter.emit('error', chalk.red(err)); |
|
} |
|
fs.writeFile(sourceMap, result.map, function(err) { |
|
if (err) { |
|
return emitter.emit('error', chalk.red('Error' + err)); |
|
} |
|
|
|
emitter.emit('info', chalk.green('Wrote Source Map to ' + sourceMap)); |
|
emitter.emit('write-source-map', err, sourceMap, result.map); |
|
done(); |
|
}); |
|
}); |
|
} |
|
|
|
emitter.emit('render', result.css.toString()); |
|
}; |
|
|
|
var error = function(error) { |
|
emitter.emit('error', chalk.red(JSON.stringify(error, null, 2))); |
|
}; |
|
|
|
var renderCallback = function(err, result) { |
|
if (err) { |
|
error(err); |
|
} |
|
else { |
|
success(result); |
|
} |
|
}; |
|
|
|
sass.render(renderOptions, renderCallback); |
|
};
|
|
|