/*! * Jade - nodes - Tag * Copyright(c) 2010 TJ Holowaychuk * MIT Licensed */ /** * Module dependencies. */ var Attrs = require('./attrs'), Block = require('./block'), inlineTags = require('../inline-tags'); /** * Initialize a `Tag` node with the given tag `name` and optional `block`. * * @param {String} name * @param {Block} block * @api public */ var Tag = module.exports = function Tag(name, block) { this.name = name; this.attrs = []; this.block = block || new Block; }; /** * Inherit from `Attrs`. */ Tag.prototype.__proto__ = Attrs.prototype; /** * Clone this tag. * * @return {Tag} * @api private */ Tag.prototype.clone = function(){ var clone = new Tag(this.name, this.block.clone()); clone.line = this.line; clone.attrs = this.attrs; clone.textOnly = this.textOnly; return clone; }; /** * Check if this tag is an inline tag. * * @return {Boolean} * @api private */ Tag.prototype.isInline = function(){ return ~inlineTags.indexOf(this.name); }; /** * Check if this tag's contents can be inlined. Used for pretty printing. * * @return {Boolean} * @api private */ Tag.prototype.canInline = function(){ var nodes = this.block.nodes; function isInline(node){ // Recurse if the node is a block if (node.isBlock) return node.nodes.every(isInline); return node.isText || (node.isInline && node.isInline()); } // Empty tag if (!nodes.length) return true; // Text-only or inline-only tag if (1 == nodes.length) return isInline(nodes[0]); // Multi-line inline-only tag if (this.block.nodes.every(isInline)) { for (var i = 1, len = nodes.length; i < len; ++i) { if (nodes[i-1].isText && nodes[i].isText) return false; } return true; } // Mixed tag return false; };