anchor.diff:    int _pos = 0;
   
     /// The collection of built-in block parsers.
  -  final List<BlockSyntax> standardBlockSyntaxes = const [
  +  final List<BlockSyntax> standardBlockSyntaxes = [
       const EmptyBlockSyntax(),
  -    const BlockHtmlSyntax(),
  +    const BlockTagBlockHtmlSyntax(),
  +    new LongBlockHtmlSyntax(r'^ {0,3}<pre(?:\s|>|$)', '</pre>'),
  +    new LongBlockHtmlSyntax(r'^ {0,3}<script(?:\s|>|$)', '</script>'),
  +    new LongBlockHtmlSyntax(r'^ {0,3}<style(?:\s|>|$)', '</style>'),
  +    new LongBlockHtmlSyntax('^ {0,3}<!--', '-->'),
  +    new LongBlockHtmlSyntax('^ {0,3}<\\?', '\\?>'),
  +    new LongBlockHtmlSyntax('^ {0,3}<![A-Z]', '>'),
  +    new LongBlockHtmlSyntax('^ {0,3}<!\\[CDATA\\[', '\\]\\]>'),
  +    const OtherTagBlockHtmlSyntax(),
       const SetextHeaderSyntax(),
       const HeaderSyntax(),
       const CodeBlockSyntax(),
  
positive.code: /// implementations in several ways:
  ///
  /// 1.  This one is way way WAY simpler.
  /// 2.  All HTML tags at the block level will be treated as blocks. If you
  ///     start a paragraph with `<em>`, it will not wrap it in a `<p>` for you.
  ///     As soon as it sees something like HTML, it stops mucking with it until
  ///     it hits the next block.
  /// 3.  Absolutely no HTML parsing or validation is done. We're a Markdown
  ///     parser, not an HTML parser!
  class BlockHtmlSyntax extends BlockSyntax {
    RegExp get pattern => _htmlPattern;
  
    bool get canEndBlock => false;
  
    const BlockHtmlSyntax();
  
    Node parse(BlockParser parser) {
      var childLines = <String>[];
  
negative.code: /// SETEXT should win.
  final _hrPattern = new RegExp(r'^ {0,3}([-*_]) *\1 *\1(?:\1| )*$');
  
  /// A line starting with one of these markers: `-`, `*`, `+`. May have up to
  /// three leading spaces before the marker and any number of spaces or tabs
  /// after.
  