docs: public static MsgHtmlTagNode fromNode(
        int id, HtmlTagNode tagNode, @Nullable VeLogNode velogParent, ErrorReporter errorReporter) {
      RawTextNode userSpecifiedPhExample =
          getAttributeValue(tagNode, MessagePlaceholders.PHEX_ATTR, errorReporter);
      String phExample = null;
  
      if (userSpecifiedPhExample != null) {
        phExample =
            MessagePlaceholders.validatePlaceholderExample(
                userSpecifiedPhExample.getRawText(),
                userSpecifiedPhExample.getSourceLocation(),
                errorReporter);
      }
      RawTextNode userSpecifiedPhName =
          getAttributeValue(tagNode, MessagePlaceholders.PHNAME_ATTR, errorReporter);
      String phName = null;
      if (userSpecifiedPhName != null) {
        phName =
            MessagePlaceholders.validatePlaceholderName(
                userSpecifiedPhName.getRawText(),
                userSpecifiedPhName.getSourceLocation(),
                errorReporter);
      }
      // calculate after removing the attributes, since we don't care about example and the phname is
      // part of the samenesskey
      String fullTagText = getFullTagText(tagNode);
      String lcTagName = getLcTagName(errorReporter, tagNode.getTagName());
      if (tagNode instanceof HtmlCloseTagNode) {
        // TODO(lukes): the lcTagName logic below requires this leading '/' for close tags.  Just make
        // it understand the node type instead.
        lcTagName = "/" + lcTagName;
      }
      // Include the velog node sameness key if we are the open or close tag node of the velog.
      // close tag nodes don't really need the sameness key given our implementations.
      VeLogNode.SamenessKey key = velogParent != null ? velogParent.getSamenessKey() : null;
      return new MsgHtmlTagNode(
          id,
          tagNode.getSourceLocation(),
          phName,
          phExample,
          lcTagName,
          tagNode instanceof HtmlOpenTagNode && ((HtmlOpenTagNode) tagNode).isSelfClosing(),
          fullTagText != null ? SamenessKey.create(phName, fullTagText, key) : null,
          tagNode);
    }