diff options
Diffstat (limited to 'node_modules/stylus/lib/convert')
| -rw-r--r-- | node_modules/stylus/lib/convert/css.js | 307 |
1 files changed, 307 insertions, 0 deletions
diff --git a/node_modules/stylus/lib/convert/css.js b/node_modules/stylus/lib/convert/css.js new file mode 100644 index 00000000..3fb8b536 --- /dev/null +++ b/node_modules/stylus/lib/convert/css.js @@ -0,0 +1,307 @@ +/*! + * Stylus - CSS to Stylus conversion + * Copyright (c) Automattic <developer.wordpress.com> + * MIT Licensed + */ + +/** + * Convert the given `css` to Stylus source. + * + * @param {String} css + * @return {String} + * @api public + */ + +module.exports = function(css){ + return new Converter(css).stylus(); +}; + +/** + * Initialize a new `Converter` with the given `css`. + * + * @param {String} css + * @api private + */ + +function Converter(css) { + var parse = require('css-parse'); + this.css = css; + this.root = parse(css, { position: false }); + this.indents = 0; +} + +/** + * Convert to Stylus. + * + * @return {String} + * @api private + */ + +Converter.prototype.stylus = function(){ + return this.visitRules(this.root.stylesheet.rules); +}; + +/** + * Return indent string. + * + * @return {String} + * @api private + */ + +Converter.prototype.__defineGetter__('indent', function(){ + return Array(this.indents + 1).join(' '); +}); + +/** + * Visit `node`. + * + * @param {*} node + * @return {String} + * @api private + */ + +Converter.prototype.visit = function(node){ + switch (node.type) { + case 'rule': + case 'comment': + case 'charset': + case 'namespace': + case 'media': + case 'import': + case 'document': + case 'keyframes': + case 'page': + case 'host': + case 'supports': + var name = node.type[0].toUpperCase() + node.type.slice(1); + return this['visit' + name](node); + } +}; + +/** + * Visit the rules on `node`. + * + * @param {Array} node + * @return {String} + * @api private + */ + +Converter.prototype.visitRules = function(node){ + var buf = ''; + for (var i = 0, len = node.length; i < len; ++i) { + buf += this.visit(node[i]); + } + return buf; +}; + +/** + * Visit Media `node`. + * + * @param {Media} node + * @return {String} + * @api private + */ + +Converter.prototype.visitMedia = function(node){ + var buf = this.indent + '@media ' + node.media; + buf += '\n'; + ++this.indents; + buf += this.visitRules(node.rules); + --this.indents; + return buf; +}; + +/** + * Visit Declaration `node`. + * + * @param {Declaration} node + * @return {String} + * @api private + */ + +Converter.prototype.visitDeclaration = function(node){ + if ('comment' == node.type) { + return this.visitComment(node); + } else { + var buf = this.indent + node.property + ': ' + node.value + '\n'; + return buf; + } +}; + +/** + * Visit Rule `node`.` + * + * @param {Rule} node + * @return {String} + * @api private + */ + +Converter.prototype.visitRule = function(node){ + var buf = this.indent + node.selectors.join(',\n' + this.indent) + '\n'; + ++this.indents; + for (var i = 0, len = node.declarations.length; i < len; ++i) { + buf += this.visitDeclaration(node.declarations[i]); + } + --this.indents; + return buf + '\n'; +}; + +/** + * Visit Comment `node`.` + * + * @param {Comment} node + * @return {String} + * @api private + */ + +Converter.prototype.visitComment = function(node){ + var buf = this.indent + '/*' + node.comment + '*/'; + return buf + '\n'; +}; + +/** + * Visit Charset `node`.` + * + * @param {Charset} node + * @return {String} + * @api private + */ + +Converter.prototype.visitCharset = function(node){ + var buf = this.indent + '@charset ' + node.charset; + return buf + '\n'; +}; + +/** + * Visit Namespace `node`.` + * + * @param {Namespace} node + * @return {String} + * @api private + */ + +Converter.prototype.visitNamespace = function(node){ + var buf = this.indent + '@namespace ' + node.namespace; + return buf + '\n'; +}; + +/** + * Visit Import `node`.` + * + * @param {Import} node + * @return {String} + * @api private + */ + +Converter.prototype.visitImport = function(node){ + var buf = this.indent + '@import ' + node.import; + return buf + '\n'; +}; + +/** + * Visit Document `node`.` + * + * @param {Document} node + * @return {String} + * @api private + */ + +Converter.prototype.visitDocument = function(node){ + var buf = this.indent + '@' + node.vendor + 'document ' + node.document; + buf += '\n'; + ++this.indents; + buf += this.visitRules(node.rules); + --this.indents; + return buf; +}; + +/** + * Visit Keyframes `node`.` + * + * @param {Keyframes} node + * @return {String} + * @api private + */ + +Converter.prototype.visitKeyframes = function(node){ + var buf = this.indent + '@keyframes ' + node.name; + buf += '\n'; + ++this.indents; + for (var i = 0, len = node.keyframes.length; i < len; ++i) { + buf += this.visitKeyframe(node.keyframes[i]); + } + --this.indents; + return buf; +}; + +/** + * Visit Keyframe `node`.` + * + * @param {Keyframe} node + * @return {String} + * @api private + */ + +Converter.prototype.visitKeyframe = function(node){ + var buf = this.indent + node.values.join(', '); + buf += '\n'; + ++this.indents; + for (var i = 0, len = node.declarations.length; i < len; ++i) { + buf += this.visitDeclaration(node.declarations[i]); + } + --this.indents; + return buf; +}; + +/** + * Visit Page `node`.` + * + * @param {Page} node + * @return {String} + * @api private + */ + +Converter.prototype.visitPage = function(node){ + var buf = this.indent + '@page' + (node.selectors.length ? ' ' + node.selectors.join(', ') : ''); + buf += '\n'; + ++this.indents; + for (var i = 0, len = node.declarations.length; i < len; ++i) { + buf += this.visitDeclaration(node.declarations[i]); + } + --this.indents; + return buf; +}; + +/** + * Visit Supports `node`.` + * + * @param {Supports} node + * @return {String} + * @api private + */ + +Converter.prototype.visitSupports = function(node){ + var buf = this.indent + '@supports ' + node.supports; + buf += '\n'; + ++this.indents; + buf += this.visitRules(node.rules); + --this.indents; + return buf; +}; + +/** + * Visit Host `node`.` + * + * @param {Host} node + * @return {String} + * @api private + */ + +Converter.prototype.visitHost = function(node){ + var buf = this.indent + '@host'; + buf += '\n'; + ++this.indents; + buf += this.visitRules(node.rules); + --this.indents; + return buf; +}; |
