code: public Rule BulletList() {
          if (ext(TASKLISTITEMS)) {
              // #185 GFM style task list items [ ] open task, [x] closed task handlings
              SuperNodeTaskItemCreator itemNodeCreator = new SuperNodeTaskItemCreator() {
                  public SuperNode create(Node child) {
                      return new ListItemNode(child);
                  }
  
                  public SuperNode create(Node child, int taskType, String taskListMarker) {
                      return taskType == 0 ? new ListItemNode(child) : new TaskListNode(child, taskType == 2, taskListMarker);
                  }
              };
              return NodeSequence(
                      TaskListItem(Bullet(), itemNodeCreator), push(new BulletListNode(popAsNode())),
                      ZeroOrMore(
                              //vsch: this one will absorb all blank lines but the last one preceding a list item otherwise two blank lines end a list and start a new one
                              ZeroOrMore(Test(BlankLine(), BlankLine()), BlankLine()),
                              TaskListItem(Bullet(), itemNodeCreator), addAsChild()
                      )
              );
          } else {
              SuperNodeCreator itemNodeCreator = new SuperNodeCreator() {
                  public SuperNode create(Node child) {
                      return new ListItemNode(child);
                  }
              };
              return NodeSequence(
                      ListItem(Bullet(), itemNodeCreator), push(new BulletListNode(popAsNode())),
                      ZeroOrMore(
                              //vsch: this one will absorb all blank lines but the last one preceding a list item otherwise two blank lines end a list and start a new one
                              ZeroOrMore(Test(BlankLine(), BlankLine()), BlankLine()),
                              ListItem(Bullet(), itemNodeCreator), addAsChild()
                      )
              );
          }
      }
docs: ************* LISTS ****************