function processTag(item, profile) {
						item.start = item.end = placeholder;
						var isUnary = abbrUtils.isUnary(item);
						var nl = '\n';
						var indent = getIndentation(item);

						// formatting output
						if (profile.tag_nl !== false) {
							var forceNl = profile.tag_nl === true && (profile.tag_nl_leaf || item.children.length);
							if (!forceNl) {
								var forceIndentTags = prefs.getArray('format.forceIndentationForTags') || [];
								forceNl = ~forceIndentTags.indexOf(item.name());
							}

							// formatting block-level elements
							if (!item.isTextNode()) {
								if (shouldAddLineBreak(item, profile)) {
									// - do not indent the very first element
									// - do not indent first child of a snippet
									if (!isVeryFirstChild(item) && (!abbrUtils.isSnippet(item.parent) || item.index()))
										item.start = nl + item.start;

									if (abbrUtils.hasBlockChildren(item) || shouldBreakChild(item, profile) || (forceNl && !isUnary))
										item.end = nl + item.end;

									if (abbrUtils.hasTagsInContent(item) || (forceNl && !item.children.length && !isUnary))
										item.start += nl + indent;
								} else if (abbrUtils.isInline(item) && hasBlockSibling(item) && !isVeryFirstChild(item)) {
									item.start = nl + item.start;
								} else if (abbrUtils.isInline(item) && shouldBreakInsideInline(item, profile)) {
									item.end = nl + item.end;
								}

								item.padding = indent;
							}
						}

						return item;
					}
Processes element with <code>tag</code> type
@param {AbbreviationNode} item
@param {OutputProfile} profile