docs: public static List<Block> parse(final String content, final String baseUri) throws ParseException {
        Document doc = Jsoup.parseBodyFragment(content, baseUri);
        List<Node> blockMarkers = Lists.newArrayList();
        doc.body().traverse(new NodeVisitor() {
           @Override
           public void head(final Node node, final int i) {
              if(node instanceof Comment) {
                 String comment = Strings.nullToEmpty(((Comment)node).getData()).trim();
                 if(comment.startsWith("wp:") || comment.startsWith("/wp:")) {
                    blockMarkers.add(node);
                 }
              }
           }
  
           @Override
           public void tail(final Node node, final int i) {
  
           }
        });
  
        //Parse/tidy of invalid markup may leave markers as children
        //of nested elements. Move them to the body...
  
        for(int i = 0; i < blockMarkers.size(); i++) {
           Node node = blockMarkers.get(i);
           if(node.parent() != doc.body()) {
              Node cloneNode = node.clone();
              node.remove();
              if(i == 0) {
                 doc.body().prependChild(cloneNode);
              } else {
                 blockMarkers.get(i-1).after(cloneNode);
              }
              blockMarkers.set(i, cloneNode);
           }
        }
  
        Set<Node> markerSet = Sets.newIdentityHashSet();
        markerSet.addAll(blockMarkers);
  
        List<Block> blocks = Lists.newArrayList();
        Block currBlock = null;
        List<Node> currNodes = Lists.newArrayList();
  
        for(Node node : doc.body().childNodes()) {
           if(markerSet.contains(node)) {
              String comment = ((Comment)node).getData().trim();
              if(comment.startsWith("wp:")) {
                 if(!currNodes.isEmpty()) {
                    //Default block...
                    blocks.add(new Block("html", currNodes));
                    currNodes.clear();
                 }
                 currBlock = block(comment, 3);
              } else if(comment.startsWith("/wp:")) {
                 Block checkBlock = block(comment, 4);
                 if(currBlock == null) {
                    throw new ParseException(String.format("Missing start block for 'wp:%s'", checkBlock.type), 0);
                 } else if(!currBlock.type.equals(checkBlock.type)) {
                    throw new ParseException(String.format("Start/end block mismatch. Expecting '/wp:%s' but found '/wp:%s",
                            currBlock.type, checkBlock.type), 0);
                 } else {
                    blocks.add(currBlock.withContent(currNodes));
                    currBlock = null;
                    currNodes.clear();
                 }
              } else {
                 currNodes.add(node);
              }
           } else {
              currNodes.add(node);
           }
        }
  
        if(currBlock != null) {
           throw new ParseException(String.format("Expecting end block for 'wp:%s'", currBlock.type), 0);
        }
  
        if(!currNodes.isEmpty()) {
           blocks.add(new Block("html", currNodes));
        }
  
        return removeEmptyBlocks(blocks);
     }