| |
| /*! |
| * Jade - nodes - Block |
| * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca> |
| * MIT Licensed |
| */ |
| |
| /** |
| * Module dependencies. |
| */ |
| |
| var Node = require('./node'); |
| |
| /** |
| * Initialize a new `Block` with an optional `node`. |
| * |
| * @param {Node} node |
| * @api public |
| */ |
| |
| var Block = module.exports = function Block(node){ |
| this.nodes = []; |
| if (node) this.push(node); |
| }; |
| |
| /** |
| * Inherit from `Node`. |
| */ |
| |
| Block.prototype.__proto__ = Node.prototype; |
| |
| /** |
| * Block flag. |
| */ |
| |
| Block.prototype.isBlock = true; |
| |
| /** |
| * Replace the nodes in `other` with the nodes |
| * in `this` block. |
| * |
| * @param {Block} other |
| * @api private |
| */ |
| |
| Block.prototype.replace = function(other){ |
| other.nodes = this.nodes; |
| }; |
| |
| /** |
| * Pust the given `node`. |
| * |
| * @param {Node} node |
| * @return {Number} |
| * @api public |
| */ |
| |
| Block.prototype.push = function(node){ |
| return this.nodes.push(node); |
| }; |
| |
| /** |
| * Check if this block is empty. |
| * |
| * @return {Boolean} |
| * @api public |
| */ |
| |
| Block.prototype.isEmpty = function(){ |
| return 0 == this.nodes.length; |
| }; |
| |
| /** |
| * Unshift the given `node`. |
| * |
| * @param {Node} node |
| * @return {Number} |
| * @api public |
| */ |
| |
| Block.prototype.unshift = function(node){ |
| return this.nodes.unshift(node); |
| }; |
| |
| /** |
| * Return the "last" block, or the first `yield` node. |
| * |
| * @return {Block} |
| * @api private |
| */ |
| |
| Block.prototype.includeBlock = function(){ |
| var ret = this |
| , node; |
| |
| for (var i = 0, len = this.nodes.length; i < len; ++i) { |
| node = this.nodes[i]; |
| if (node.yield) return node; |
| else if (node.textOnly) continue; |
| else if (node.includeBlock) ret = node.includeBlock(); |
| else if (node.block && !node.block.isEmpty()) ret = node.block.includeBlock(); |
| } |
| |
| return ret; |
| }; |
| |
| /** |
| * Return a clone of this block. |
| * |
| * @return {Block} |
| * @api private |
| */ |
| |
| Block.prototype.clone = function(){ |
| var clone = new Block; |
| for (var i = 0, len = this.nodes.length; i < len; ++i) { |
| clone.push(this.nodes[i].clone()); |
| } |
| return clone; |
| }; |
| |