in inference/src/translator/html.cpp [175:215]
void append(HTML::TagStack const &prev, HTML::TagStack const &curr) {
HTML::TagStack opening, closing;
diffTags(prev, curr, opening, closing);
for (HTML::Tag const *tag : Reversed(closing)) {
assert(tag->type == HTML::Tag::ELEMENT);
std::string closeTag = format("</{}>", tag->name);
html_.insert(offset_ + (closeLeft_ ? 0 : whitespaceSize_), closeTag);
offset_ += closeTag.size();
if (closeLeft_) whitespaceOffset_ += closeTag.size();
}
for (HTML::Tag const *tag : opening) {
std::string openTag;
switch (tag->type) {
case HTML::Tag::ELEMENT:
case HTML::Tag::VOID_ELEMENT:
openTag = format("<{}{}>{}", tag->name, tag->attributes, tag->data);
break;
case HTML::Tag::COMMENT:
openTag = format("<!--{}-->", tag->data);
break;
case HTML::Tag::PROCESSING_INSTRUCTION:
openTag = format("<?{}?>", tag->data);
break;
case HTML::Tag::WHITESPACE: {
// Try to eat two newlines (paragraph break) from our segment
auto pos = html_.find("\n\n", whitespaceOffset_);
if (pos != std::string::npos && pos < whitespaceOffset_ + whitespaceSize_) {
html_.erase(pos, 2);
whitespaceSize_ -= 2;
}
} break;
}
html_.insert(offset_ + whitespaceSize_, openTag);
offset_ += openTag.size();
closeLeft_ = closeLeft_ && openTag.empty();
}
}