Merge pull request dart-lang/markdown#98 from srawlins/common-mark-section

Allow section to be specified in common_mark_stats.dart
diff --git a/pkgs/markdown/tool/common_mark_stats.dart b/pkgs/markdown/tool/common_mark_stats.dart
index 454b247..6d50731 100644
--- a/pkgs/markdown/tool/common_mark_stats.dart
+++ b/pkgs/markdown/tool/common_mark_stats.dart
@@ -5,6 +5,7 @@
 import 'dart:io';
 import 'dart:mirrors';
 
+import 'package:args/args.dart' show ArgParser;
 import 'package:collection/collection.dart';
 import 'package:html/parser.dart' show parseFragment;
 import 'package:markdown/markdown.dart';
@@ -20,8 +21,15 @@
     .path);
 
 void main(List<String> args) {
-  var raw = args.any((s) => s == '--raw');
-  var verbose = args.any((s) => s == '--verbose');
+  final parser = new ArgParser()
+    ..addOption('section', help: 'Restrict tests to one section')
+    ..addFlag('raw', defaultsTo: false, help: 'raw JSON format')
+    ..addFlag('verbose', defaultsTo: false, help: 'verbose output');
+  var options = parser.parse(args);
+
+  var specifiedSection = options['section'];
+  var raw = options['raw'];
+  var verbose = options['verbose'];
 
   var sections = loadCommonMarkSections();
 
@@ -31,6 +39,9 @@
   String indent(String s) => s.splitMapJoin('\n', onNonMatch: (n) => '    $n');
 
   sections.forEach((section, examples) {
+    if (specifiedSection != null && section != specifiedSection) {
+      return;
+    }
     for (var e in examples) {
       var output;
       var nestedMap =
@@ -47,7 +58,7 @@
       var actual = parseFragment(output);
       nestedMap[e.example] = compareHtml(expected.children, actual.children);
       if (verbose && !nestedMap[e.example]) {
-        print('FAIL');
+        print('FAIL: http://spec.commonmark.org/0.24/#example-${e.example}');
         print('input:');
         print(indent(e.markdown));
         print('expected:');