in src/beautify/esm/beautify-html.js [2403:2495]
Beautifier.prototype._set_tag_position = function(printer, raw_token, parser_token, last_tag_token, last_token) {
if (!parser_token.is_empty_element) {
if (parser_token.is_end_tag) { //this tag is a double tag so check for tag-ending
parser_token.start_tag_token = this._tag_stack.try_pop(parser_token.tag_name); //remove it and all ancestors
} else { // it's a start-tag
// check if this tag is starting an element that has optional end element
// and do an ending needed
if (this._do_optional_end_element(parser_token)) {
if (!parser_token.is_inline_element) {
printer.print_newline(false);
}
}
this._tag_stack.record_tag(parser_token); //push it on the tag stack
if ((parser_token.tag_name === 'script' || parser_token.tag_name === 'style') &&
!(parser_token.is_unformatted || parser_token.is_content_unformatted)) {
parser_token.custom_beautifier_name = get_custom_beautifier_name(parser_token.tag_check, raw_token);
}
}
}
if (in_array(parser_token.tag_check, this._options.extra_liners)) { //check if this double needs an extra line
printer.print_newline(false);
if (!printer._output.just_added_blankline()) {
printer.print_newline(true);
}
}
if (parser_token.is_empty_element) { //if this tag name is a single tag type (either in the list or has a closing /)
// if you hit an else case, reset the indent level if you are inside an:
// 'if', 'unless', or 'each' block.
if (parser_token.tag_start_char === '{' && parser_token.tag_check === 'else') {
this._tag_stack.indent_to_tag(['if', 'unless', 'each']);
parser_token.indent_content = true;
// Don't add a newline if opening {{#if}} tag is on the current line
var foundIfOnCurrentLine = printer.current_line_has_match(/{{#if/);
if (!foundIfOnCurrentLine) {
printer.print_newline(false);
}
}
// Don't add a newline before elements that should remain where they are.
if (parser_token.tag_name === '!--' && last_token.type === TOKEN.TAG_CLOSE &&
last_tag_token.is_end_tag && parser_token.text.indexOf('\n') === -1) {
//Do nothing. Leave comments on same line.
} else {
if (!(parser_token.is_inline_element || parser_token.is_unformatted)) {
printer.print_newline(false);
}
this._calcluate_parent_multiline(printer, parser_token);
}
} else if (parser_token.is_end_tag) { //this tag is a double tag so check for tag-ending
var do_end_expand = false;
// deciding whether a block is multiline should not be this hard
do_end_expand = parser_token.start_tag_token && parser_token.start_tag_token.multiline_content;
do_end_expand = do_end_expand || (!parser_token.is_inline_element &&
!(last_tag_token.is_inline_element || last_tag_token.is_unformatted) &&
!(last_token.type === TOKEN.TAG_CLOSE && parser_token.start_tag_token === last_tag_token) &&
last_token.type !== 'TK_CONTENT'
);
if (parser_token.is_content_unformatted || parser_token.is_unformatted) {
do_end_expand = false;
}
if (do_end_expand) {
printer.print_newline(false);
}
} else { // it's a start-tag
parser_token.indent_content = !parser_token.custom_beautifier_name;
if (parser_token.tag_start_char === '<') {
if (parser_token.tag_name === 'html') {
parser_token.indent_content = this._options.indent_inner_html;
} else if (parser_token.tag_name === 'head') {
parser_token.indent_content = this._options.indent_head_inner_html;
} else if (parser_token.tag_name === 'body') {
parser_token.indent_content = this._options.indent_body_inner_html;
}
}
if (!(parser_token.is_inline_element || parser_token.is_unformatted) &&
(last_token.type !== 'TK_CONTENT' || parser_token.is_content_unformatted)) {
printer.print_newline(false);
}
this._calcluate_parent_multiline(printer, parser_token);
}
};