anchor.diff:    // TODO paragraph could be ended by other block types
     Parser get para => new Parser((s, pos) {
       // TODO replace codeBlockFenced with starting fence test
  -    Parser end = blankline | hrule | atxHeader | codeBlockFenced | (skipNonindentSpaces > oneOf('>+-*'));
  +    Parser end = blankline
  +      | hrule
  +      | atxHeader
  +      | codeBlockFenced
  +      | (skipNonindentSpaces > (
  +        char('>')
  +        | (oneOf('+-*') > char(' '))));
       ParseResult res = (end.notAhead > anyLine).many1.run(s, pos);
       if (!res.isSuccess) {
         return res;
       }
   
       _UnparsedInlines inlines = new _UnparsedInlines(res.value.join("\n").trim());
  -    _unparsedInlines.add(inlines);
  -    return (blankline.many ^ (_) => [new Para(inlines)]).run(s, res.position);
  +    return res.copy(value: [new Para(inlines)]);
  +    //return (blankline.many ^ (_) => [new Para(inlines)]).run(s, res.position);
     });
   
     //
  
positive.code:     List<Block> blocks = [];
  
      bool closeParagraph = false;
      bool acceptLazy(List<Block> blocks, String s) {
        if (blocks.length > 0) {
          if (blocks.last is Para) {
            blocks.last.contents.raw += "\n" + s;
            return true;
          } else if (blocks.last is Blockquote) {
            return acceptLazy(blocks.last.contents, s);
          }
          // TODO add list support
        }
  
        return false;
      }
  
      void buildBuffer() {
        String s = buffer.map((l) => l + "\n").join();
  
negative.code:     }
  
      Position position = firstLineRes.position;
      loop: while (true) {
        ParseResult res = listLine(indent, marker).run(s, position);
        if (!res.isSuccess) {
  