anchor.diff:    static Parser listFirstLine(int indent, Parser marker) => (atMostSpaces(indent).notFollowedBy(hrule) + marker + anyLine).list;
     static Parser listStrictLine(int indent) => string(" " * indent) > anyLine;
     static Parser listLazyLine(int indent) => atMostSpaces(indent - 1).notFollowedBy(char(' ')) > anyLine;
  +  static Parser listFencedCodeStartTest(int indent) =>
  +    (string(" " * indent) + char(' ').many + (string('```') | string('~~~')) + anyLine).list.record;
     static Parser listLine(int indent, Parser marker) => // There are three types of lines in list
       (listFirstLine(indent - 1, marker) ^ (l) => [0,  l[0], l[1], l[2]]) // List item start
       | (blankline ^ (l) => [3])                                          // Blank line
  +    | (listFencedCodeStartTest(indent) ^ (l) => [4, l])                 // Special case for fenced code, because it can
  +                                                                        //   have more than 1 blank line inside
       | (listStrictLine(indent) ^ (l) => [1, l])                          // List item strict continuation
  -    | (listLazyLine(indent) ^ (l) => [2, l]);                                   // List item lazy continuation
  -
  +    | (listLazyLine(indent) ^ (l) => [2, l]);                           // List item lazy continuation
  +
  +
  +  int _listStackPosition;
  +  List<int> _listStack;
  +  void _clearListStack() {
  +    _listStackPosition = -1;
  +    _listStack = [];
  +  }
  +  int _getListStackPosition() {
  +    ++_listStackPosition;
  +    return _listStackPosition;
  +  }
  +  void _updateListStack(int position, int indent) {
  +    if (position + 1 > _listStack.length) {
  +      _listStack.add(indent);
  +    }
  +    if (position + 1 < _listStack.length) {
  +      _listStack.removeRange(position, _listStack.length);
  +    }
  +  }
   
     Parser list(Parser marker) => new Parser((s, pos) {
       ParseResult firstLineRes = listFirstLine(TAB_STOP - 1, marker).run(s, pos);
  
positive.code:     // TODO separate preprocess option
  
      _references = {};
  
      var doc = document.parse(preprocess(s) + "\n\n");
  
  
negative.code:       } else if (blocks.last is ListBlock) {
          return acceptLazy(blocks.last.items.last.contents, s);
        }
      }
  
      return false;
  