code: function processTag(item, profile) {
  		if (!item.parent) { // looks like it's root element
  			return item;
  		}
  		
  		var attrs = makeAttributesString(item, profile); 
  		var cursor = profile.cursor();
  		var isUnary = abbrUtils.isUnary(item);
  		var start = '';
  		var end = '';
  			
  		// define opening and closing tags
  		if (!item.isTextNode()) {
  			var tagName = profile.tagName(item.name());
  			if (isUnary) {
  				start = '<' + tagName + attrs + profile.selfClosing() + '>';
  				item.end = '';
  			} else {
  				start = '<' + tagName + attrs + '>';
  				end = '</' + tagName + '>';
  			}
  		}
  		
  		var placeholder = '%s';
  		// We can't just replace placeholder with new value because
  		// JavaScript will treat double $ character as a single one, assuming
  		// we're using RegExp literal.
  		item.start = utils.replaceSubstring(item.start, start, item.start.indexOf(placeholder), placeholder);
  		item.end = utils.replaceSubstring(item.end, end, item.end.indexOf(placeholder), placeholder);
  		
  		// should we put caret placeholder after opening tag?
  		if (
  				!item.children.length 
  				&& !isUnary 
  				&& !~item.content.indexOf(cursor)
  				&& !tabStops.extract(item.content).tabstops.length
  			) {
  			item.start += cursor;
  		}
  		
  		return item;
  	}
docs: Processes element with <code>tag</code> type
  @param {AbbreviationNode} item
  @param {OutputProfile} profile