Allow --extension-set to be passed to bin/markdown (#198)

Allow --extension-set to be passed to bin/markdown
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4ab93a9..306b2b1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,16 @@
 * Improve support for tab characters, and horizontal rules.
 * The above fixes raise compliance with the CommonMark specs to 90%, and
   compliance with the GFM specs to 87%.
+* Allow the binary script to take a `--extension-set` option.
+
+  A reminder: You can [run `bin/markdown.dart` from anywhere][pub-global] via:
+
+  ```shell
+  $ pub global activate markdown
+  $ markdown
+  ```
+
+[pub-global]: https://www.dartlang.org/tools/pub/cmd/pub-global#running-a-script-from-your-path
 
 ## 1.1.1
 
diff --git a/bin/markdown.dart b/bin/markdown.dart
index fb6a460..943d28f 100644
--- a/bin/markdown.dart
+++ b/bin/markdown.dart
@@ -1,40 +1,55 @@
 import 'dart:async';
 import 'dart:io';
 
+import 'package:args/args.dart';
 import 'package:markdown/markdown.dart';
 
+final extensionSets = <String, ExtensionSet>{
+  'none': ExtensionSet.none,
+  'CommonMark': ExtensionSet.commonMark,
+  'GitHubFlavored': ExtensionSet.gitHubFlavored,
+  'GitHubWeb': ExtensionSet.gitHubWeb,
+};
+
 Future main(List<String> args) async {
-  if (args.length > 1) {
-    print('Usage: markdown.dart [file]');
+  var parser = new ArgParser()
+    ..addFlag('help', negatable: false, help: 'Print help text and exit')
+    ..addFlag('version', negatable: false, help: 'Print version and exit')
+    ..addOption('extension-set',
+        allowed: ['none', 'CommonMark', 'GitHubFlavored', 'GitHubWeb'],
+        defaultsTo: 'CommonMark',
+        help: 'Specify a set of extensions',
+        allowedHelp: {
+          'none': 'No extensions; similar to Markdown.pl',
+          'CommonMark': 'Parse like CommonMark Markdown (default)',
+          'GitHubFlavored': 'Parse like GitHub Flavored Markdown',
+          'GitHubWeb': 'Parse like GitHub\'s Markdown-enabled web input fields',
+        });
+  var results = parser.parse(args);
+
+  if (results['help'] as bool) {
+    printUsage(parser);
+    return;
+  }
+
+  if (results['version'] as bool) {
+    print(version);
+    return;
+  }
+
+  var extensionSet = extensionSets[results['extension-set']];
+
+  if (results.rest.length > 1) {
+    printUsage(parser);
     exitCode = 1;
     return;
   }
 
-  if (args.length == 1) {
-    switch (args.first) {
-      case '--help':
-        print('''Usage:
-    markdown [markdown file]
-        Convert [markdown-file] from Markdown to HTML. If no file is passed on
-        the commandline, then the Markdown source is read from STDIN.
-
-    markdown --version
-        Print the markdown package version.
-
-    markdown --help
-        Print this help text.
-  ''');
-        return;
-
-      case '--version':
-        print(version);
-        return;
-
-      default:
-        // Read argument as a file path.
-        print(markdownToHtml(new File(args[0]).readAsStringSync()));
-        return;
-    }
+  if (results.rest.length == 1) {
+    // Read argument as a file path.
+    var input = new File(results.rest.first).readAsStringSync();
+    print(markdownToHtml(input, extensionSet: extensionSet));
+    return;
   }
 
   // Read from stdin.
@@ -43,5 +58,18 @@
   while ((line = stdin.readLineSync()) != null) {
     buffer.writeln(line);
   }
-  print(markdownToHtml(buffer.toString()));
+  print(markdownToHtml(buffer.toString(), extensionSet: extensionSet));
+}
+
+void printUsage(ArgParser parser) {
+  print('''Usage: markdown.dart [options] [file]
+
+Parse [file] as Markdown and print resulting HTML. If [file] is omitted,
+use stdin as input.
+
+By default, CommonMark Markdown will be parsed. This can be changed with
+the --extensionSet flag.
+
+${parser.usage}
+''');
 }
diff --git a/pubspec.yaml b/pubspec.yaml
index d7e97b8..031b66a 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -3,10 +3,17 @@
 author: Dart Team <misc@dartlang.org>
 description: A library for converting markdown to HTML.
 homepage: https://github.com/dart-lang/markdown
+
+executables:
+  markdown:
+
 environment:
   sdk: '>=1.12.0 <2.0.0'
+dependencies:
+  args: '^1.0.0'
+
 dev_dependencies:
-  args: '>=0.13.3+1 <2.0.0'
+  args: '^1.0.0'
   # Only for example/app.dart.
   browser: any
   collection: '^1.2.0'