docs: public Node wrap(String html) {
          Validate.notEmpty(html);
  
          Element context = parent() instanceof Element ? (Element) parent() : null;
          List<Node> wrapChildren = NodeUtils.parser(this).parseFragmentInput(html, context, baseUri());
          Node wrapNode = wrapChildren.get(0);
          if (!(wrapNode instanceof Element)) // nothing to wrap with; noop
              return null;
  
          Element wrap = (Element) wrapNode;
          Element deepest = getDeepChild(wrap);
          parentNode.replaceChild(this, wrap);
          deepest.addChildren(this);
  
          // remainder (unbalanced wrap, like <div></div><p></p> -- The <p> is remainder
          if (wrapChildren.size() > 0) {
              //noinspection ForLoopReplaceableByForEach (beacause it allocates an Iterator which is wasteful here)
              for (int i = 0; i < wrapChildren.size(); i++) {
                  Node remainder = wrapChildren.get(i);
                  remainder.parentNode.removeChild(remainder);
                  wrap.appendChild(remainder);
              }
          }
          return this;
      }