code: @Override
    protected void visitPrintNode(PrintNode node) {
      List<Expression> chunks = genJsExprsVisitor.exec(node);
      switch (node.getHtmlContext()) {
        case HTML_TAG:
          getJsCodeBuilder()
              .append(
                  SOY_IDOM_PRINT_DYNAMIC_ATTR.call(
                      INCREMENTAL_DOM, CodeChunkUtils.concatChunks(chunks)));
          break;
        case JS:
          // fall through
        case CSS:
          // fall through
        case HTML_PCDATA:
          if (node.numChildren() > 0
              && node.getChild(node.numChildren() - 1).getPrintDirective()
                  instanceof SanitizedContentOperator
              && ((SanitizedContentOperator)
                          node.getChild(node.numChildren() - 1).getPrintDirective())
                      .getContentKind()
                  == SanitizedContent.ContentKind.HTML) {
            getJsCodeBuilder()
                .append(
                    SOY_IDOM_PRINT.call(
                        INCREMENTAL_DOM,
                        CodeChunkUtils.concatChunks(chunks),
                        Expression.LITERAL_TRUE));
          } else {
            getJsCodeBuilder()
                .append(SOY_IDOM_PRINT.call(INCREMENTAL_DOM, CodeChunkUtils.concatChunks(chunks)));
          }
          break;
        case HTML_RCDATA:
          getJsCodeBuilder()
              .append(
                  INCREMENTAL_DOM_TEXT.call(id("String").call(CodeChunkUtils.concatChunks(chunks))));
          break;
        default:
          super.visitPrintNode(node);
          break;
      }
    }
docs: Visit an {@link PrintNode}, with special cases for a variable being printed within an attribute
  declaration or as HTML content.
  
  <p>For attributes, if the variable is of kind attributes, it is invoked. Any other kind of
  variable is an error.
  
  <p>For HTML, if the variable is of kind HTML, it is invoked. Any other kind of variable gets
  wrapped in a call to {@code incrementalDom.text}, resulting in a Text node.