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.
199 lines
3.5 KiB
199 lines
3.5 KiB
|
|
/** |
|
* Module dependencies. |
|
*/ |
|
|
|
var Base = require('./compiler'); |
|
var inherits = require('inherits'); |
|
|
|
/** |
|
* Expose compiler. |
|
*/ |
|
|
|
module.exports = Compiler; |
|
|
|
/** |
|
* Initialize a new `Compiler`. |
|
*/ |
|
|
|
function Compiler(options) { |
|
Base.call(this, options); |
|
} |
|
|
|
/** |
|
* Inherit from `Base.prototype`. |
|
*/ |
|
|
|
inherits(Compiler, Base); |
|
|
|
/** |
|
* Compile `node`. |
|
*/ |
|
|
|
Compiler.prototype.compile = function(node){ |
|
return node.stylesheet |
|
.rules.map(this.visit, this) |
|
.join(''); |
|
}; |
|
|
|
/** |
|
* Visit comment node. |
|
*/ |
|
|
|
Compiler.prototype.comment = function(node){ |
|
return this.emit('', node.position); |
|
}; |
|
|
|
/** |
|
* Visit import node. |
|
*/ |
|
|
|
Compiler.prototype.import = function(node){ |
|
return this.emit('@import ' + node.import + ';', node.position); |
|
}; |
|
|
|
/** |
|
* Visit media node. |
|
*/ |
|
|
|
Compiler.prototype.media = function(node){ |
|
return this.emit('@media ' + node.media, node.position) |
|
+ this.emit('{') |
|
+ this.mapVisit(node.rules) |
|
+ this.emit('}'); |
|
}; |
|
|
|
/** |
|
* Visit document node. |
|
*/ |
|
|
|
Compiler.prototype.document = function(node){ |
|
var doc = '@' + (node.vendor || '') + 'document ' + node.document; |
|
|
|
return this.emit(doc, node.position) |
|
+ this.emit('{') |
|
+ this.mapVisit(node.rules) |
|
+ this.emit('}'); |
|
}; |
|
|
|
/** |
|
* Visit charset node. |
|
*/ |
|
|
|
Compiler.prototype.charset = function(node){ |
|
return this.emit('@charset ' + node.charset + ';', node.position); |
|
}; |
|
|
|
/** |
|
* Visit namespace node. |
|
*/ |
|
|
|
Compiler.prototype.namespace = function(node){ |
|
return this.emit('@namespace ' + node.namespace + ';', node.position); |
|
}; |
|
|
|
/** |
|
* Visit supports node. |
|
*/ |
|
|
|
Compiler.prototype.supports = function(node){ |
|
return this.emit('@supports ' + node.supports, node.position) |
|
+ this.emit('{') |
|
+ this.mapVisit(node.rules) |
|
+ this.emit('}'); |
|
}; |
|
|
|
/** |
|
* Visit keyframes node. |
|
*/ |
|
|
|
Compiler.prototype.keyframes = function(node){ |
|
return this.emit('@' |
|
+ (node.vendor || '') |
|
+ 'keyframes ' |
|
+ node.name, node.position) |
|
+ this.emit('{') |
|
+ this.mapVisit(node.keyframes) |
|
+ this.emit('}'); |
|
}; |
|
|
|
/** |
|
* Visit keyframe node. |
|
*/ |
|
|
|
Compiler.prototype.keyframe = function(node){ |
|
var decls = node.declarations; |
|
|
|
return this.emit(node.values.join(','), node.position) |
|
+ this.emit('{') |
|
+ this.mapVisit(decls) |
|
+ this.emit('}'); |
|
}; |
|
|
|
/** |
|
* Visit page node. |
|
*/ |
|
|
|
Compiler.prototype.page = function(node){ |
|
var sel = node.selectors.length |
|
? node.selectors.join(', ') |
|
: ''; |
|
|
|
return this.emit('@page ' + sel, node.position) |
|
+ this.emit('{') |
|
+ this.mapVisit(node.declarations) |
|
+ this.emit('}'); |
|
}; |
|
|
|
/** |
|
* Visit font-face node. |
|
*/ |
|
|
|
Compiler.prototype['font-face'] = function(node){ |
|
return this.emit('@font-face', node.position) |
|
+ this.emit('{') |
|
+ this.mapVisit(node.declarations) |
|
+ this.emit('}'); |
|
}; |
|
|
|
/** |
|
* Visit host node. |
|
*/ |
|
|
|
Compiler.prototype.host = function(node){ |
|
return this.emit('@host', node.position) |
|
+ this.emit('{') |
|
+ this.mapVisit(node.rules) |
|
+ this.emit('}'); |
|
}; |
|
|
|
/** |
|
* Visit custom-media node. |
|
*/ |
|
|
|
Compiler.prototype['custom-media'] = function(node){ |
|
return this.emit('@custom-media ' + node.name + ' ' + node.media + ';', node.position); |
|
}; |
|
|
|
/** |
|
* Visit rule node. |
|
*/ |
|
|
|
Compiler.prototype.rule = function(node){ |
|
var decls = node.declarations; |
|
if (!decls.length) return ''; |
|
|
|
return this.emit(node.selectors.join(','), node.position) |
|
+ this.emit('{') |
|
+ this.mapVisit(decls) |
|
+ this.emit('}'); |
|
}; |
|
|
|
/** |
|
* Visit declaration node. |
|
*/ |
|
|
|
Compiler.prototype.declaration = function(node){ |
|
return this.emit(node.property + ':' + node.value, node.position) + this.emit(';'); |
|
}; |
|
|
|
|