var inherits = require('util').inherits;
var zlib = require('zlib');
var docblock = require('../parse/docblock');
var ResourceLoader = require('./ResourceLoader');
var extractFBSprites = require('../parse/css').extractFBSprites;
var CSS = require('../resource/CSS');
var MessageList = require('../MessageList');
function CSSLoader(options) {
ResourceLoader.call(this, options);
var extractNetworkSize = !!this.options.networkSize;
if (extractNetworkSize) {
this.extractExtra = this.extractNetworkSize;
} else {
this.extractExtra = function(css, sourceCode, messages, callback) {
process.nextTick(function() {
callback(messages, css);
});
};
}
}
inherits(CSSLoader, ResourceLoader);
CSSLoader.prototype.path = __filename;
CSSLoader.prototype.getResourceTypes = function() {
return [CSS];
};
CSSLoader.prototype.getExtensions = function() {
return ['.css'];
};
CSSLoader.prototype.extractNetworkSize =
function(css, sourceCode, messages, callback) {
zlib.deflate(sourceCode, function(err, buffer) {
css.networkSize = buffer.length;
callback(messages, css);
});
};
CSSLoader.prototype.loadFromSource =
function(path, configuration, sourceCode, messages, callback) {
var css = new CSS(path);
var props = docblock.parse(docblock.extract(sourceCode));
props.forEach(function(pair) {
var name = pair[0];
var value = pair[1];
switch (name) {
case 'provides':
css.id = value;
break;
case 'providesModule':
css.isModule = true;
css.id = 'css:' + value;
break;
case 'css':
value.split(/\s+/).forEach(css.addRequiredCSS, css);
break;
case 'requires':
value.split(/\s+/).forEach(css.addRequiredLegacyComponent, css);
break;
case 'nonblocking':
css.isNonblocking = true;
break;
case 'nopackage':
css.isNopackage = true;
break;
case 'permanent':
css.isPermanent = true;
break;
case 'option':
case 'options':
value.split(/\s+/).forEach(function(key) {
css.options[key] = true;
});
break;
case 'author':
case 'deprecated':
break;
case 'nolint':
case 'generated':
case 'preserve-header':
break;
case 'layer':
break;
default:
messages.addClowntownError(css.path, 'docblock',
'Unknown directive ' + name);
}
});
if (this.options.extractFBSprites) {
css.fbSprites = extractFBSprites(sourceCode);
}
css.finalize();
this.extractExtra(css, sourceCode, messages, callback);
};
CSSLoader.prototype.matchPath = function(filePath) {
return filePath.lastIndexOf('.css') === filePath.length - 4;
};
CSSLoader.prototype.postProcess = function(map, resources, callback) {
var messages = MessageList.create();
resources.forEach(function(r) {
var resource, i, required;
required = r.requiredCSS;
for (i = 0; i < required.length; i++) {
resource = map.getResource('CSS', 'css:' + required[i]);
if (resource && resource.isModule) {
required[i] = 'css:' + required[i];
}
}
});
process.nextTick(function() {
callback(messages);
});
};
module.exports = CSSLoader;