Add bin/ files.
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..49ce72d
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+.dart_tool/
+.packages
+pubspec.lock
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..38bc356
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,7 @@
+Lasse R.H. Nielsen, https://github.com/lrhn
+
+Contributors:
+
+Kevin Moore, https://github.com/kevmoo
+Phil Quitslund, https://github.com/pq
+Greg Lowe, https://github.com/xxgreg
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..a1e50f5
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,24 @@
+## 1.2.0
+
+- Release with null safety.
+
+## 1.2.0-nullsafety
+
+- Opt in to null safety experimentally.
+
+## 1.1.3
+
+- Added example, changed lints.
+
+## 1.1.2
+
+- Updated the SDK constraint.
+
+## 1.1.1
+
+- Spelling and linting fixes.
+- Linting fixes.
+
+## 1.1.0
+
+- Initial version
\ No newline at end of file
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..c709cf2
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,30 @@
+# How to Contribute
+
+We'd love to accept your patches and contributions to this project,
+but any larger change should be discussed using the issue tracker
+before submitting a pull request.
+There are a few other guidelines you need to follow.
+
+## Contributor License Agreement
+
+Contributions to this project must be accompanied by a Contributor License
+Agreement. You (or your employer) retain the copyright to your contribution;
+this simply gives us permission to use and redistribute your contributions as
+part of the project. Head over to <https://cla.developers.google.com/> to see
+your current agreements on file or to sign a new one.
+
+You generally only need to submit a CLA once, so if you've already submitted one
+(even if it was for a different project), you probably don't need to do it
+again.
+
+## Code reviews
+
+All submissions by non project members require review.
+We use GitHub pull requests for this purpose. Consult
+[GitHub Help](https://help.github.com/articles/about-pull-requests/) for more
+information on using pull requests.
+
+## Community Guidelines
+
+This project follows
+[Google's Open Source Community Guidelines](https://opensource.google/conduct/).
\ No newline at end of file
diff --git a/README.md b/README.md
index 35c4818..2bba63e 100644
--- a/README.md
+++ b/README.md
@@ -1,51 +1,60 @@
-Character code constants.
+-[![Build Status](https://travis-ci.org/lrhn/charcode.svg?branch=master)](https://travis-ci.org/lrhn/charcode)
+-[![Pub](https://img.shields.io/pub/v/charcode.svg)](https://pub.dev/packages/charcode) -
 
-These libraries define symbolic names for some character codes.
+# Character code constants
 
-This is not an official Goggle package, and is not supported by Google.
+This package defines symbolic names for some character codes (aka. code points).
 
-## Using
+They can used when working directly with characters as integers,
+to make the code more readable: `if (firstChar == $A) ...`.
+
+This is not an official Google package, and is not supported by Google.
+
+## Usage
 
 Import either one of the libraries:
-
-    import "package:charcode/ascii.dart"
-    import "package:charcode/html_entity.dart"
-
+```dart
+import "package:charcode/ascii.dart";
+import "package:charcode/html_entity.dart";
+```
 or import both libraries using the `charcode.dart` library:
+```dart
+import "package:charcode/charcode.dart";
+```
 
-    import "package:charcode/charcode.dart"
-
-# Naming
+## Naming
 
 The character names are preceded by a `$` to avoid conflicting with other
-variables due to the short and common names (for example "$i").
+variables, due to their short and common names (for example "$i").
 
-The characters that are valid in a Dart identifier directly follow the `$`.
+Characters that are valid in a Dart identifier directly follow the `$`.
 Examples: `$_`, `$a`, `$B` and `$3`. Other characters are given symbolic names.
 
-The names of letters are lower-case for lower-case letters, and mixed- or
-upper-case for upper-case letters. The names of symbols are all lower-case,
-and omit suffixes like "sign", "symbol" and "mark". E
-xamples: `$plus`, `$exclamation`
+The names of letters are lower-case for lower-case letters (`$sigma` for `σ`),
+and mixed- or upper-case for upper-case letters (`$Sigma` for `Σ`).
+The names of symbols and punctuation are all lower-case,
+and omit suffixes like "sign", "symbol" and "mark".
+Examples: `$plus`, `$exclamation`, `$tilde`.
 
 The `ascii.dart` library defines a symbolic name for each ASCII character.
-For some chraceters, it has more than one name. For example the common `$tab`
-and the official `$ht` for the horisontal tab.
+Some characters have more than one name. For example the common name `$tab`
+and the official abbreviation `$ht` for the horisontal tab.
 
 The `html_entity.dart` library defines a constant for each HTML 4.01 character
-entity, using the standard entity abbreviation, incluing its case.
+entity using their standard entity abbreviation, including case.
 Examples: `$nbsp` for `&nbps;`, `$aring` for the lower-case `&aring;`
 and `$Aring` for the upper-case `&Aring;`.
 
-The HTML entities includes all characters in the Latin-1 code page, greek
+The HTML entities include all characters in the Latin-1 code page, greek
 letters and some mathematical symbols.
 
-The `charcode.dart` library just exports both `ascii.dart` and
-`html_entity.dart`.
+The `charcode.dart` library exports both `ascii.dart` and
+`html_entity.dart`. Where both libraries define the same name,
+the HTML entity name is preferred.
 
-# Rationale
+## Rationale
 
-The Dart language doesn't have character literals. If that ever happens, this
-library will be irrelevant. Until then, this library can be used for the most
-common characters.
+The Dart language doesn't have character literals.
+If that ever changes, this package will become irrelevant.
+Until then, this package can be used for the most common characters.
 See [http://dartbug.com/4415](request for character literals).
diff --git a/analysis_options.yaml b/analysis_options.yaml
new file mode 100644
index 0000000..86f07d0
--- /dev/null
+++ b/analysis_options.yaml
@@ -0,0 +1,16 @@
+# Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+# for details. All rights reserved. Use of this source is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+include: package:pedantic/analysis_options.1.9.0.yaml
+analyzer:
+  errors:
+    annotate_overrides: ignore
+    prefer_single_quotes: ignore
+    use_function_type_syntax_for_parameters: ignore
+  enable-experiment:
+    - non-nullable
+
+#linter:
+#   rules:
+#    - prefer_double_quotes
\ No newline at end of file
diff --git a/bin/charcode.dart b/bin/charcode.dart
new file mode 100644
index 0000000..7db4a1d
--- /dev/null
+++ b/bin/charcode.dart
@@ -0,0 +1,913 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file

+// for details. All rights reserved. Use of this source is governed by a

+// BSD-style license that can be found in the LICENSE file.

+

+import "dart:io"; // For writing directly to file.

+

+import 'package:charcode/ascii.dart';

+

+import "src/uflags.dart";

+

+/// Generates Dart constant declarations for character codes.

+///

+/// Usage:

+/// ```text

+///   charcode (character-range | rename | flags)*

+/// ```

+///

+/// ## Character ranges

+///

+/// A `character-range` is either

+/// * a single charater,

+/// * an escaped character `\n`, `\r`, `\t`, `\xHH`, `\uHHHH` or `\DD*`,

+///   where `H` is a hexadecimal digit and `D` is a decimal digit.

+/// * two characters separated by `-` or the `\d`, `\w` or `\s` escapes, or

+/// * a sequence of character ranges.

+/// Examples include `a`, `a-z`, or `abe-gz`.

+/// Accepts `\n`, `\r`, `\t`, `\`, `\-`, `\xHH` and `\uHHHHHH` escapes.

+///

+/// A (re)name declaration is a single or escaped character, a `=` and an

+/// identifier name, optionally followed by a `:` and a description

+/// Example: `x=cross:"A cross product."`.

+/// The naming names or renames the character and adds or changes

+/// the associated description.

+/// It will not add the character to the output.

+/// Following occurrences of the character will use the new name.

+/// Example: `y y=why x-z` will generate `$y` for the character

+/// code of "y", then `$x`, `$why` and `$z` as well.

+///

+/// ## Flags

+///

+/// `-o` followed by a file name makes output be written to that file

+/// instead of to stdout.

+///

+/// `-f` followed by a file name will read declarations from that file

+/// as well as from the command line. Each line in the file is handled

+/// like a command line argument (not including flags.)

+/// Intended for importing a set of name declarations.

+/// The line is not split on spaces, so it allows comments with spaces

+/// like:

+/// ```text

+/// x=cross:The cross character.

+/// ```

+///

+/// `-p` followed by zero more characters makes those characters be

+/// used as prefix for later generated names. The default is the `$`

+/// character. If setting an empty prefix, names starting with digits

+/// will still use the previously configured prefix character since

+/// identifiers cannot start with a digit.

+///

+/// `-h` includes declarations for HTML entity names.

+///

+/// `--` disables flags in the following command line arguments.

+void main(List<String> args) {

+  String? outputFile;

+  var declarations = CharcodeBuilder();

+  addAscii(declarations);

+

+  var flags = Flags<String>()

+    ..add(FlagConfig('?', null, 'help',

+        description: "Display this usage information"))

+    ..add(FlagConfig.optionalParameter("p", "p", "prefix", r"$",

+        description: "Sets prefix for later generated constants",

+        valueDescription: "PREFIX"))

+    ..add(FlagConfig.requiredParameter("o", "o", "output",

+        description: "Write generated code to file instead of stdout",

+        valueDescription: "FILE"))

+    ..add(FlagConfig.requiredParameter("f", "f", "input",

+        description:

+            "Read instructions from file. Each line of the file is treated as a non-flag command line entry.",

+        valueDescription: "FILE"))

+    ..add(FlagConfig("h", "h", "html",

+        description: "Include HTML entity names in predefined names"));

+

+  for (var arg in parseFlags(flags, args, stderr.writeln)) {

+    var key = arg.key;

+    if (key == null) {

+      // Not a flag, value is command line argument.

+      declarations.parse(arg.value!);

+    } else {

+      switch (key) {

+        case "p":

+          var prefix = arg.value!;

+          if (prefix.isNotEmpty &&

+              (!_isIdentifierPart(prefix) || !_startsWithNonDigit(prefix))) {

+            warn("Invalid prefix, must be valid identifier: $prefix");

+            continue;

+          }

+          declarations.prefix = prefix;

+          break;

+        case "o":

+          if (arg.value != null) {

+            outputFile = arg.value;

+          } else {

+            warn("No file name after `-o` option");

+          }

+          break;

+        case "f":

+          var inputFile = arg.value;

+          if (inputFile != null) {

+            var input = File(inputFile).readAsLinesSync();

+            for (var line in input) {

+              line = line.trimRight();

+              if (line.isNotEmpty) declarations.parse(line);

+            }

+          } else {

+            warn("No file name after `-f` option");

+          }

+          break;

+        case "h":

+          addHtmlEntities(declarations);

+          break;

+        case "?":

+          var buffer = StringBuffer(usageString);

+

+          flags.writeUsage(buffer);

+          stdout

+            ..write(buffer)

+            ..flush();

+          return;

+      }

+    }

+  }

+

+  IOSink output = stdout;

+  if (outputFile != null) {

+    output = File(outputFile).openWrite();

+  }

+  declarations.writeTo(output);

+  if (outputFile != null) {

+    output.close();

+  }

+}

+

+void warn(String warning) {

+  stderr.writeln(warning);

+}

+/// A single declaration to be written to the output.

+class Entry implements Comparable<Entry> {

+

+  /// The code point.

+  final int charCode;

+

+  /// The non-prefixed name to be given

+  final String name;

+

+  /// The prefix to put before the name.

+  ///

+  /// The prefix may be empty, but it won't be if

+  /// the name be used as an identifier by itself

+  /// (which means it starts with a digit).

+  final String prefix;

+

+  /// Any documentation to add to the declaration.

+  final String? comment;

+

+  Entry(this.charCode, this.name, this.prefix, this.comment);

+

+  /// Emits a declaration to [output].

+  ///

+  /// The constant declaration declares the identifier [prefix]+[name]

+  /// to have the value [codePoint].

+  void writeTo(IOSink output) {

+    var hex = charCode.toRadixString(16).padLeft(2, "0");

+    if (comment != null) {

+      output.writeln("/// $comment");

+    }

+    output.writeln("const int $prefix$name = 0x$hex;");

+  }

+

+  /// Orders entries by [charCode] first, then by

+  /// prefixed and name.

+  int compareTo(Entry other) {

+    var delta = charCode - other.charCode;

+    if (delta == 0) {

+      delta = prefix.compareTo(other.prefix);

+      if (delta == 0) {

+        delta = name.compareTo(other.name);

+      }

+    }

+    return delta;

+  }

+}

+

+/// A name and optional description currently assigned to a code point.

+class CharacterDeclaration {

+  /// The unprefixed name to use for the code point.

+  final String name;

+  /// An optional description.

+  final String? description;

+  CharacterDeclaration(this.name, this.description);

+}

+

+/// Character code declaration builder.

+///

+/// Remembers names and descriptions assigned to code points,

+/// and accumulates requestes for declarations for a number

+/// of those.

+/// Allows the prefix to be changed between declaration

+/// requests.

+class CharcodeBuilder {

+  /// Prefix used for all characters being added.

+  String _prefix = r"$";

+

+  /// Reserve prefix used for digits when [_prefix] is empty.

+  String _reservePrefix = r"$";

+

+  final Map<int, CharacterDeclaration> _declarations = {};

+

+  final Set<String> _entryNames = {};

+

+  final List<Entry> _entries = [];

+

+  void parse(String arg) {

+    var scanner = CharScanner(arg);

+    var allowRename = true;

+    while (true) {

+      var start = scanner.index;

+

+      var char = scanner.next();

+      if (char < 0) break;

+      if (char == $backslash) {

+        var escape = interpretCharEscape(scanner);

+        if (escape >= 0) {

+          char == escape;

+        } else if (interpretRangeEscape(scanner)) {

+          allowRename = false;

+          continue;

+        }

+      }

+      var peek = scanner.peek;

+      if (allowRename && peek == $equal) {

+        // A rename.

+        scanner.skip();

+        var newName = scanner.rest;

+        if (newName.isEmpty || !_isIdentifierPart(newName)) {

+          warn("Invalid name: $arg");

+        } else {

+          var colon = newName.indexOf(":");

+          if (colon >= 0) {

+            var description = newName.substring(colon + 1);

+            newName = newName.substring(0, colon);

+            rename(char, newName, description);

+          } else {

+            rename(char, newName);

+          }

+        }

+        break;

+      }

+      allowRename = false;

+      if (peek != $minus) {

+        addChar(char);

+      } else {

+        var afterChar = scanner.index;

+        scanner.skip();

+        var secondChar = scanner.next();

+        if (secondChar < 0) {

+          // Trailing `-`.

+          addChar(char);

+          addChar(peek);

+          continue;

+        }

+        if (secondChar == $backslash) {

+          var escape = interpretCharEscape(scanner);

+          if (escape >= 0) secondChar = escape;

+        }

+        if (char <= secondChar) {

+          addCharRange(char, secondChar);

+        } else {

+          warn(

+              "Invalid range, end befroe start: ${scanner.input.substring(start, scanner.index)}");

+          addChar(char);

+          scanner.index = afterChar;

+        }

+      }

+    }

+  }

+

+  /// Recognize single-character escapes.

+  ///

+  /// - `\n`: Line feed

+  /// - `\r`: Carriage return

+  /// - `\t`: Tab

+  /// - `\x..`: Hex escape, up to two digits.

+  /// - `\u......`: Hex escape, up to six digits.

+  /// - `\[0-9]+`: Decimal escape.

+  /// - `\-` and `\\`: Identitiy escapes.

+  static int interpretCharEscape(CharScanner scanner) {

+    if (scanner.hasNext) {

+      var char = scanner.next();

+      if (char == $n) return $lf;

+      if (char == $r) return $cr;

+      if (char == $t) return $tab;

+      if (char == $u) return scanner.hex(6);

+      if (char == $x) return scanner.hex(2);

+      if (char == $backslash) return char;

+      if (char == $minus) return char;

+      if (_isDigit(char)) return scanner.dec(char);

+      scanner.index--;

+    }

+    return -1;

+  }

+

+  /// Renames `charCode` to `name` in following declarations.

+  ///

+  /// Returns whether the name is valid as an identifier.

+  /// If it is not valid, no change is made.

+  bool rename(int charCode, String name, [String? description]) {

+    if (!_isIdentifierPart(name)) return false;

+    _declarations.putIfAbsent(

+        charCode, () => CharacterDeclaration(name, description));

+    return true;

+  }

+

+  /// Adds a single character to the output.

+  bool addChar(int charCode) {

+    var declaration = _declarations[charCode];

+    if (declaration == null) return false;

+    var name = declaration.name;

+    if (_entryNames.contains(name)) {

+      warn("Existing declaration with name \"$name\" for character "

+          "'${String.fromCharCode(charCode)}' "

+          "(U+${charCode.toRadixString(16).toUpperCase().padLeft(4, "0")})");

+      return false;

+    }

+    var prefix = _prefix;

+    if (!_startsWithNonDigit(declaration.name)) prefix = _reservePrefix;

+    _entries.add(Entry(charCode, name, prefix, declaration.description));

+    _entryNames.add(name);

+    return true;

+  }

+

+  /// Adds a range of characters, both ends inclusive.

+  ///

+  /// If a character in the range has no name, nothing is emitted fo rit.

+  void addCharRange(int start, int end) {

+    for (var charCode = start; charCode <= end; charCode++) {

+      addChar(charCode); // Ignore return value.

+    }

+  }

+

+  /// The current prefix used to prefix declarations.

+  ///

+  /// May be emtpy, otherwise needs to be a valid identifier.

+  String get prefix => _prefix;

+  set prefix(String prefix) {

+    if (!_isIdentifierPart(prefix) ||

+        (prefix.isNotEmpty && !_startsWithNonDigit(prefix))) {

+      throw ArgumentError.value(prefix, "Not a valid identifier start");

+    }

+    _prefix = prefix;

+    if (prefix.isNotEmpty) {

+      _reservePrefix = prefix;

+    }

+  }

+

+  void writeTo(IOSink output) {

+    _entries.sort((a, b) => a.charCode - b.charCode);

+    var separator = "";

+    for (var entry in _entries) {

+      output.write(separator);

+      entry.writeTo(output);

+      separator = "\n";

+    }

+  }

+

+  bool interpretRangeEscape(CharScanner scanner) {

+    if (!scanner.hasNext) return false;

+    var char = scanner.peek;

+    if (char == $d) {

+      addCharRange($0, $9);

+    } else if (char == $s) {

+      addChar($space);

+      addChar($tab);

+      addChar($cr);

+      addChar($lf);

+    } else if (char == $w) {

+      addCharRange($0, $9);

+      addCharRange($A, $Z);

+      addCharRange($a, $z);

+      addChar($_);

+      addChar($$);

+    } else {

+      return false;

+    }

+    scanner.skip();

+    return true;

+  }

+}

+

+/// Whether the string starts with a non-digit.

+///

+/// Only used on strings that have passed [_isIdentifierPart],

+/// and if those start with a non-digit, the string is a valid identifier.

+bool _startsWithNonDigit(String string) =>

+    string.isNotEmpty && (string.codeUnitAt(0) ^ $0) > 9;

+

+/// Whether [string] contains only characters that can be in an identifier.

+bool _isIdentifierPart(String string) {

+  for (var i = 0; i < string.length; i++) {

+    var char = string.codeUnitAt(i);

+    if (char ^ $0 <= 9) continue;

+    var lowerCaseChar = char | 0x20;

+    if (lowerCaseChar >= $a && lowerCaseChar <= $z) continue;

+    if (char == $$ || char == $_) continue;

+    return false;

+  }

+  return true;

+}

+

+class CharScanner {

+  final String input;

+  int index = 0;

+  CharScanner(this.input);

+  // The next character of input.

+  int get peek => index < input.length ? input.codeUnitAt(index) : -1;

+

+  bool get hasNext => index < input.length;

+

+  void skip() {

+    if (index >= input.length) throw StateError("Nothing to skip");

+    index++;

+  }

+

+  String get rest => input.substring(index);

+

+  int next() => index < input.length ? input.codeUnitAt(index++) : -1;

+

+  /// Parses a hex number with at most [maxDigits] digits.

+  int hex(int maxDigits) {

+    var result = 0;

+    while (maxDigits > 0 && index < input.length) {

+      var char = input.codeUnitAt(index);

+      var hexValue = _hexValue(char);

+      if (hexValue < 0) break;

+      result = result * 16 + hexValue;

+      maxDigits--;

+      index++;

+    }

+    return result;

+  }

+

+  /// Parses a decimal number with the first digit already read.

+  int dec(int firstDigit) {

+    var result = firstDigit ^ 0x30;

+    while (index < input.length) {

+      var char = input.codeUnitAt(index);

+      var digit = char ^ 0x30;

+      if (digit > 9) break;

+      result = result * 10 + digit;

+      index++;

+    }

+    return result;

+  }

+

+  static int _hexValue(int char) {

+    var digit = char ^ 0x30;

+    if (digit <= 9) return digit;

+    var lc = (char | 0x20);

+    if (lc >= 0x61 && lc <= 0x66) return lc - (0x61 - 10);

+    return -1;

+  }

+}

+

+bool _isDigit(int char) => (char ^ 0x30) <= 9;

+

+void addAscii(CharcodeBuilder descriptions) {

+  // ASCII character comments and default names.

+  descriptions

+    // Control characters

+    ..rename(0x00, "nul", '"Null character" control character.')

+    ..rename(0x01, "soh", '"Start of Header" control character.')

+    ..rename(0x02, "stx", '"Start of Text" control character.')

+    ..rename(0x03, "etx", '"End of Text" control character.')

+    ..rename(0x04, "eot", '"End of Transmission" control character.')

+    ..rename(0x05, "enq", '"Enquiry" control character.')

+    ..rename(0x06, "ack", '"Acknowledgment" control character.')

+    ..rename(0x07, "bel", '"Bell" control character.')

+    ..rename(0x08, "bs", '"Backspace" control character.')

+    ..rename(0x09, "tab", '"Horizontal Tab" control character, common name.')

+    ..rename(0x0A, "lf", '"Line feed" control character.')

+    ..rename(0x0B, "vt", '"Vertical Tab" control character.')

+    ..rename(0x0C, "ff", '"Form feed" control character.')

+    ..rename(0x0D, "cr", '"Carriage return" control character.')

+    ..rename(0x0E, "so", '"Shift Out" control character.')

+    ..rename(0x0F, "si", '"Shift In" control character.')

+    ..rename(0x10, "dle", '"Data Link Escape" control character.')

+    ..rename(0x11, "dc1", '"Device Control 1" control character (oft. XON).')

+    ..rename(0x12, "dc2", '"Device Control 2" control character.')

+    ..rename(0x13, "dc3", '"Device Control 3" control character (oft. XOFF).')

+    ..rename(0x14, "dc4", '"Device Control 4" control character.')

+    ..rename(0x15, "nak", '"Negative Acknowledgment" control character.')

+    ..rename(0x16, "syn", '"Synchronous idle" control character.')

+    ..rename(0x17, "etb", '"End of Transmission Block" control character.')

+    ..rename(0x18, "can", '"Cancel" control character.')

+    ..rename(0x19, "em", '"End of Medium" control character.')

+    ..rename(0x1A, "sub", '"Substitute" control character.')

+    ..rename(0x1B, "esc", '"Escape" control character.')

+    ..rename(0x1C, "fs", '"File Separator" control character.')

+    ..rename(0x1D, "gs", '"Group Separator" control character.')

+    ..rename(0x1E, "rs", '"Record Separator" control character.')

+    ..rename(0x1F, "us", '"Unit Separator" control character.')

+    // Visible characters.

+    ..rename(0x20, "space", 'Space character.')

+    ..rename(0x21, "exclamation", 'Character `!`.')

+    ..rename(0x22, "quot", 'Character `"`, short name.')

+    ..rename(0x23, "hash", 'Character `#`.')

+    ..rename(0x24, "\$", 'Character `\$`.')

+    ..rename(0x25, "percent", 'Character `%`.')

+    ..rename(0x26, "amp", 'Character `&`, short name.')

+    ..rename(0x27, "apos", 'Character "\'".')

+    ..rename(0x28, "lparen", 'Character `(`.')

+    ..rename(0x29, "rparen", 'Character `)`.')

+    ..rename(0x2A, "asterisk", 'Character `*`.')

+    ..rename(0x2B, "plus", 'Character `+`.')

+    ..rename(0x2C, "comma", 'Character `,`.')

+    ..rename(0x2D, "minus", 'Character `-`.')

+    ..rename(0x2E, "dot", 'Character `.`.')

+    ..rename(0x2F, "slash", 'Character `/`.')

+    ..rename(0x30, "0", 'Character `0`.')

+    ..rename(0x31, "1", 'Character `1`.')

+    ..rename(0x32, "2", 'Character `2`.')

+    ..rename(0x33, "3", 'Character `3`.')

+    ..rename(0x34, "4", 'Character `4`.')

+    ..rename(0x35, "5", 'Character `5`.')

+    ..rename(0x36, "6", 'Character `6`.')

+    ..rename(0x37, "7", 'Character `7`.')

+    ..rename(0x38, "8", 'Character `8`.')

+    ..rename(0x39, "9", 'Character `9`.')

+    ..rename(0x3A, "colon", 'Character `:`.')

+    ..rename(0x3B, "semicolon", 'Character `;`.')

+    ..rename(0x3C, "lt", 'Character `<`.')

+    ..rename(0x3D, "equal", 'Character `<`.')

+    ..rename(0x3E, "gt", 'Character `>`.')

+    ..rename(0x3F, "question", 'Character `?`.')

+    ..rename(0x40, "at", 'Character `@`.')

+    ..rename(0x41, "A", 'Character `A`.')

+    ..rename(0x42, "B", 'Character `B`.')

+    ..rename(0x43, "C", 'Character `C`.')

+    ..rename(0x44, "D", 'Character `D`.')

+    ..rename(0x45, "E", 'Character `E`.')

+    ..rename(0x46, "F", 'Character `F`.')

+    ..rename(0x47, "G", 'Character `G`.')

+    ..rename(0x48, "H", 'Character `H`.')

+    ..rename(0x49, "I", 'Character `I`.')

+    ..rename(0x4A, "J", 'Character `J`.')

+    ..rename(0x4B, "K", 'Character `K`.')

+    ..rename(0x4C, "L", 'Character `L`.')

+    ..rename(0x4D, "M", 'Character `M`.')

+    ..rename(0x4E, "N", 'Character `N`.')

+    ..rename(0x4F, "O", 'Character `O`.')

+    ..rename(0x50, "P", 'Character `P`.')

+    ..rename(0x51, "Q", 'Character `Q`.')

+    ..rename(0x52, "R", 'Character `R`.')

+    ..rename(0x53, "S", 'Character `S`.')

+    ..rename(0x54, "T", 'Character `T`.')

+    ..rename(0x55, "U", 'Character `U`.')

+    ..rename(0x56, "V", 'Character `V`.')

+    ..rename(0x57, "W", 'Character `W`.')

+    ..rename(0x58, "X", 'Character `X`.')

+    ..rename(0x59, "Y", 'Character `Y`.')

+    ..rename(0x5A, "Z", 'Character `Z`.')

+    ..rename(0x5B, "lbracket", 'Character `[`.')

+    ..rename(0x5C, "backslash", r'Character `\`.')

+    ..rename(0x5D, "rbracket", 'Character `]`.')

+    ..rename(0x5E, "caret", 'Character `^`.')

+    ..rename(0x5F, "_", 'Character `_`.')

+    ..rename(0x60, "backquote", 'Character `` ` ``.')

+    ..rename(0x61, "a", 'Character `a`.')

+    ..rename(0x62, "b", 'Character `b`.')

+    ..rename(0x63, "c", 'Character `c`.')

+    ..rename(0x64, "d", 'Character `d`.')

+    ..rename(0x65, "e", 'Character `e`.')

+    ..rename(0x66, "f", 'Character `f`.')

+    ..rename(0x67, "g", 'Character `g`.')

+    ..rename(0x68, "h", 'Character `h`.')

+    ..rename(0x69, "i", 'Character `i`.')

+    ..rename(0x6A, "j", 'Character `j`.')

+    ..rename(0x6B, "k", 'Character `k`.')

+    ..rename(0x6C, "l", 'Character `l`.')

+    ..rename(0x6D, "m", 'Character `m`.')

+    ..rename(0x6E, "n", 'Character `n`.')

+    ..rename(0x6F, "o", 'Character `o`.')

+    ..rename(0x70, "p", 'Character `p`.')

+    ..rename(0x71, "q", 'Character `q`.')

+    ..rename(0x72, "r", 'Character `r`.')

+    ..rename(0x73, "s", 'Character `s`.')

+    ..rename(0x74, "t", 'Character `t`.')

+    ..rename(0x75, "u", 'Character `u`.')

+    ..rename(0x76, "v", 'Character `v`.')

+    ..rename(0x77, "w", 'Character `w`.')

+    ..rename(0x78, "x", 'Character `x`.')

+    ..rename(0x79, "y", 'Character `y`.')

+    ..rename(0x7A, "z", 'Character `z`.')

+    ..rename(0x7B, "lbrace", 'Character `{`.')

+    ..rename(0x7C, "bar", 'Character `|`.')

+    ..rename(0x7D, "rbrace", 'Character `}`.')

+    ..rename(0x7E, "tilde", 'Character `~`.')

+    // Control character

+    ..rename(0x7F, "del", '"Delete" control character.');

+}

+

+void addHtmlEntities(CharcodeBuilder descriptions) {

+  descriptions

+    ..rename(0x22, "quot", "Character '\"', short name.")

+    ..rename(0x27, "apos", "Character \"'\".")

+    ..rename(0x3C, "lt", "Character '<'.")

+    ..rename(0x3E, "gt", "Character '>'.")

+    ..rename(0x00A0, "nbsp", "no-break space (non-breaking space)")

+    ..rename(0x00A1, "iexcl", "inverted exclamation mark ('¡')")

+    ..rename(0x00A2, "cent", "cent sign ('¢')")

+    ..rename(0x00A3, "pound", "pound sign ('£')")

+    ..rename(0x00A4, "curren", "currency sign ('¤')")

+    ..rename(0x00A5, "yen", "yen sign (yuan sign) ('¥')")

+    ..rename(0x00A6, "brvbar", "broken bar (broken vertical bar) ('¦')")

+    ..rename(0x00A7, "sect", "section sign ('§')")

+    ..rename(

+        0x00A8, "uml", "diaeresis (spacing diaeresis); see Germanic umlaut ('¨')")

+    ..rename(0x00A9, "copy", "copyright symbol ('©')")

+    ..rename(0x00AA, "ordf", "feminine ordinal indicator ('ª')")

+    ..rename(0x00AB, "laquo",

+        "left-pointing double angle quotation mark (left pointing guillemet) ('«')")

+    ..rename(0x00AC, "not", "not sign ('¬')")

+    ..rename(0x00AD, "shy", "soft hyphen (discretionary hyphen)")

+    ..rename(

+        0x00AE, "reg", "registered sign (registered trademark symbol) ('®')")

+    ..rename(

+        0x00AF, "macr", "macron (spacing macron, overline, APL overbar) ('¯')")

+    ..rename(0x00B0, "deg", "degree symbol ('°')")

+    ..rename(0x00B1, "plusmn", "plus-minus sign (plus-or-minus sign) ('±')")

+    ..rename(

+        0x00B2, "sup2", "superscript two (superscript digit two, squared) ('²')")

+    ..rename(0x00B3, "sup3",

+        "superscript three (superscript digit three, cubed) ('³')")

+    ..rename(0x00B4, "acute", "acute accent (spacing acute) ('´')")

+    ..rename(0x00B5, "micro", "micro sign ('µ')")

+    ..rename(0x00B6, "para", "pilcrow sign (paragraph sign) ('¶')")

+    ..rename(

+        0x00B7, "middot", "middle dot (Georgian comma, Greek middle dot) ('·')")

+    ..rename(0x00B8, "cedil", "cedilla (spacing cedilla) ('¸')")

+    ..rename(0x00B9, "sup1", "superscript one (superscript digit one) ('¹')")

+    ..rename(0x00BA, "ordm", "masculine ordinal indicator ('º')")

+    ..rename(0x00BB, "raquo",

+        "right-pointing double angle quotation mark (right pointing guillemet) ('»')")

+    ..rename(0x00BC, "frac14",

+        "vulgar fraction one quarter (fraction one quarter) ('¼')")

+    ..rename(

+        0x00BD, "frac12", "vulgar fraction one half (fraction one half) ('½')")

+    ..rename(0x00BE, "frac34",

+        "vulgar fraction three quarters (fraction three quarters) ('¾')")

+    ..rename(

+        0x00BF, "iquest", "inverted question mark (turned question mark) ('¿')")

+    ..rename(0x00C0, "Agrave",

+        "Latin capital letter A with grave accent (Latin capital letter A grave) ('À')")

+    ..rename(0x00C1, "Aacute", "Latin capital letter A with acute accent ('Á')")

+    ..rename(0x00C2, "Acirc", "Latin capital letter A with circumflex ('Â')")

+    ..rename(0x00C3, "Atilde", "Latin capital letter A with tilde ('Ã')")

+    ..rename(0x00C4, "Auml", "Latin capital letter A with diaeresis ('Ä')")

+    ..rename(0x00C5, "Aring",

+        "Latin capital letter A with ring above (Latin capital letter A ring) ('Å')")

+    ..rename(0x00C6, "AElig",

+        "Latin capital letter AE (Latin capital ligature AE) ('Æ')")

+    ..rename(0x00C7, "Ccedil", "Latin capital letter C with cedilla ('Ç')")

+    ..rename(0x00C8, "Egrave", "Latin capital letter E with grave accent ('È')")

+    ..rename(0x00C9, "Eacute", "Latin capital letter E with acute accent ('É')")

+    ..rename(0x00CA, "Ecirc", "Latin capital letter E with circumflex ('Ê')")

+    ..rename(0x00CB, "Euml", "Latin capital letter E with diaeresis ('Ë')")

+    ..rename(0x00CC, "Igrave", "Latin capital letter I with grave accent ('Ì')")

+    ..rename(0x00CD, "Iacute", "Latin capital letter I with acute accent ('Í')")

+    ..rename(0x00CE, "Icirc", "Latin capital letter I with circumflex ('Î')")

+    ..rename(0x00CF, "Iuml", "Latin capital letter I with diaeresis ('Ï')")

+    ..rename(0x00D0, "ETH", "Latin capital letter Eth ('Ð')")

+    ..rename(0x00D1, "Ntilde", "Latin capital letter N with tilde ('Ñ')")

+    ..rename(0x00D2, "Ograve", "Latin capital letter O with grave accent ('Ò')")

+    ..rename(0x00D3, "Oacute", "Latin capital letter O with acute accent ('Ó')")

+    ..rename(0x00D4, "Ocirc", "Latin capital letter O with circumflex ('Ô')")

+    ..rename(0x00D5, "Otilde", "Latin capital letter O with tilde ('Õ')")

+    ..rename(0x00D6, "Ouml", "Latin capital letter O with diaeresis ('Ö')")

+    ..rename(0x00D7, "times", "multiplication sign ('×')")

+    ..rename(0x00D8, "Oslash",

+        "Latin capital letter O with stroke (Latin capital letter O slash) ('Ø')")

+    ..rename(0x00D9, "Ugrave", "Latin capital letter U with grave accent ('Ù')")

+    ..rename(0x00DA, "Uacute", "Latin capital letter U with acute accent ('Ú')")

+    ..rename(0x00DB, "Ucirc", "Latin capital letter U with circumflex ('Û')")

+    ..rename(0x00DC, "Uuml", "Latin capital letter U with diaeresis ('Ü')")

+    ..rename(0x00DD, "Yacute", "Latin capital letter Y with acute accent ('Ý')")

+    ..rename(0x00DE, "THORN", "Latin capital letter THORN ('Þ')")

+    ..rename(0x00DF, "szlig",

+        "Latin small letter sharp s (ess-zed); see German Eszett ('ß')")

+    ..rename(0x00E0, "agrave", "Latin small letter a with grave accent ('à')")

+    ..rename(0x00E1, "aacute", "Latin small letter a with acute accent ('á')")

+    ..rename(0x00E2, "acirc", "Latin small letter a with circumflex ('â')")

+    ..rename(0x00E3, "atilde", "Latin small letter a with tilde ('ã')")

+    ..rename(0x00E4, "auml", "Latin small letter a with diaeresis ('ä')")

+    ..rename(0x00E5, "aring", "Latin small letter a with ring above ('å')")

+    ..rename(

+        0x00E6, "aelig", "Latin small letter ae (Latin small ligature ae) ('æ')")

+    ..rename(0x00E7, "ccedil", "Latin small letter c with cedilla ('ç')")

+    ..rename(0x00E8, "egrave", "Latin small letter e with grave accent ('è')")

+    ..rename(0x00E9, "eacute", "Latin small letter e with acute accent ('é')")

+    ..rename(0x00EA, "ecirc", "Latin small letter e with circumflex ('ê')")

+    ..rename(0x00EB, "euml", "Latin small letter e with diaeresis ('ë')")

+    ..rename(0x00EC, "igrave", "Latin small letter i with grave accent ('ì')")

+    ..rename(0x00ED, "iacute", "Latin small letter i with acute accent ('í')")

+    ..rename(0x00EE, "icirc", "Latin small letter i with circumflex ('î')")

+    ..rename(0x00EF, "iuml", "Latin small letter i with diaeresis ('ï')")

+    ..rename(0x00F0, "eth", "Latin small letter eth ('ð')")

+    ..rename(0x00F1, "ntilde", "Latin small letter n with tilde ('ñ')")

+    ..rename(0x00F2, "ograve", "Latin small letter o with grave accent ('ò')")

+    ..rename(0x00F3, "oacute", "Latin small letter o with acute accent ('ó')")

+    ..rename(0x00F4, "ocirc", "Latin small letter o with circumflex ('ô')")

+    ..rename(0x00F5, "otilde", "Latin small letter o with tilde ('õ')")

+    ..rename(0x00F6, "ouml", "Latin small letter o with diaeresis ('ö')")

+    ..rename(0x00F7, "divide", "division sign (obelus) ('÷')")

+    ..rename(0x00F8, "oslash",

+        "Latin small letter o with stroke (Latin small letter o slash) ('ø')")

+    ..rename(0x00F9, "ugrave", "Latin small letter u with grave accent ('ù')")

+    ..rename(0x00FA, "uacute", "Latin small letter u with acute accent ('ú')")

+    ..rename(0x00FB, "ucirc", "Latin small letter u with circumflex ('û')")

+    ..rename(0x00FC, "uuml", "Latin small letter u with diaeresis ('ü')")

+    ..rename(0x00FD, "yacute", "Latin small letter y with acute accent ('ý')")

+    ..rename(0x00FE, "thorn", "Latin small letter thorn ('þ')")

+    ..rename(0x00FF, "yuml", "Latin small letter y with diaeresis ('ÿ')")

+    ..rename(0x0152, "OElig", "Latin capital ligature oe ('Œ')")

+    ..rename(0x0153, "oelig", "Latin small ligature oe ('œ')")

+    ..rename(0x0160, "Scaron", "Latin capital letter s with caron ('Š')")

+    ..rename(0x0161, "scaron", "Latin small letter s with caron ('š')")

+    ..rename(0x0178, "Yuml", "Latin capital letter y with diaeresis ('Ÿ')")

+    ..rename(0x0192, "fnof",

+        "Latin small letter f with hook (function, florin) ('ƒ')")

+    ..rename(0x02C6, "circ", "modifier letter circumflex accent ('ˆ')")

+    ..rename(0x02DC, "tilde", "small tilde ('˜')")

+    ..rename(0x0391, "Alpha", "Greek capital letter Alpha ('Α')")

+    ..rename(0x0392, "Beta", "Greek capital letter Beta ('Β')")

+    ..rename(0x0393, "Gamma", "Greek capital letter Gamma ('Γ')")

+    ..rename(0x0394, "Delta", "Greek capital letter Delta ('Δ')")

+    ..rename(0x0395, "Epsilon", "Greek capital letter Epsilon ('Ε')")

+    ..rename(0x0396, "Zeta", "Greek capital letter Zeta ('Ζ')")

+    ..rename(0x0397, "Eta", "Greek capital letter Eta ('Η')")

+    ..rename(0x0398, "Theta", "Greek capital letter Theta ('Θ')")

+    ..rename(0x0399, "Iota", "Greek capital letter Iota ('Ι')")

+    ..rename(0x039A, "Kappa", "Greek capital letter Kappa ('Κ')")

+    ..rename(0x039B, "Lambda", "Greek capital letter Lambda ('Λ')")

+    ..rename(0x039C, "Mu", "Greek capital letter Mu ('Μ')")

+    ..rename(0x039D, "Nu", "Greek capital letter Nu ('Ν')")

+    ..rename(0x039E, "Xi", "Greek capital letter Xi ('Ξ')")

+    ..rename(0x039F, "Omicron", "Greek capital letter Omicron ('Ο')")

+    ..rename(0x03A0, "Pi", "Greek capital letter Pi ('Π')")

+    ..rename(0x03A1, "Rho", "Greek capital letter Rho ('Ρ')")

+    ..rename(0x03A3, "Sigma", "Greek capital letter Sigma ('Σ')")

+    ..rename(0x03A4, "Tau", "Greek capital letter Tau ('Τ')")

+    ..rename(0x03A5, "Upsilon", "Greek capital letter Upsilon ('Υ')")

+    ..rename(0x03A6, "Phi", "Greek capital letter Phi ('Φ')")

+    ..rename(0x03A7, "Chi", "Greek capital letter Chi ('Χ')")

+    ..rename(0x03A8, "Psi", "Greek capital letter Psi ('Ψ')")

+    ..rename(0x03A9, "Omega", "Greek capital letter Omega ('Ω')")

+    ..rename(0x03B1, "alpha", "Greek small letter alpha ('α')")

+    ..rename(0x03B2, "beta", "Greek small letter beta ('β')")

+    ..rename(0x03B3, "gamma", "Greek small letter gamma ('γ')")

+    ..rename(0x03B4, "delta", "Greek small letter delta ('δ')")

+    ..rename(0x03B5, "epsilon", "Greek small letter epsilon ('ε')")

+    ..rename(0x03B6, "zeta", "Greek small letter zeta ('ζ')")

+    ..rename(0x03B7, "eta", "Greek small letter eta ('η')")

+    ..rename(0x03B8, "theta", "Greek small letter theta ('θ')")

+    ..rename(0x03B9, "iota", "Greek small letter iota ('ι')")

+    ..rename(0x03BA, "kappa", "Greek small letter kappa ('κ')")

+    ..rename(0x03BB, "lambda", "Greek small letter lambda ('λ')")

+    ..rename(0x03BC, "mu", "Greek small letter mu ('μ')")

+    ..rename(0x03BD, "nu", "Greek small letter nu ('ν')")

+    ..rename(0x03BE, "xi", "Greek small letter xi ('ξ')")

+    ..rename(0x03BF, "omicron", "Greek small letter omicron ('ο')")

+    ..rename(0x03C0, "pi", "Greek small letter pi ('π')")

+    ..rename(0x03C1, "rho", "Greek small letter rho ('ρ')")

+    ..rename(0x03C2, "sigmaf", "Greek small letter final sigma ('ς')")

+    ..rename(0x03C3, "sigma", "Greek small letter sigma ('σ')")

+    ..rename(0x03C4, "tau", "Greek small letter tau ('τ')")

+    ..rename(0x03C5, "upsilon", "Greek small letter upsilon ('υ')")

+    ..rename(0x03C6, "phi", "Greek small letter phi ('φ')")

+    ..rename(0x03C7, "chi", "Greek small letter chi ('χ')")

+    ..rename(0x03C8, "psi", "Greek small letter psi ('ψ')")

+    ..rename(0x03C9, "omega", "Greek small letter omega ('ω')")

+    ..rename(0x03D1, "thetasym", "Greek theta symbol ('ϑ')")

+    ..rename(0x03D2, "upsih", "Greek Upsilon with hook symbol ('ϒ')")

+    ..rename(0x03D6, "piv", "Greek pi symbol ('ϖ')")

+    ..rename(0x2002, "ensp", "en space")

+    ..rename(0x2003, "emsp", "em space")

+    ..rename(0x2009, "thinsp", "thin space")

+    ..rename(0x200C, "zwnj", "zero-width non-joiner")

+    ..rename(0x200D, "zwj", "zero-width joiner")

+    ..rename(0x200E, "lrm", "left-to-right mark")

+    ..rename(0x200F, "rlm", "right-to-left mark")

+    ..rename(0x2013, "ndash", "en dash ('–')")

+    ..rename(0x2014, "mdash", "em dash ('—')")

+    ..rename(0x2018, "lsquo", "left single quotation mark ('‘')")

+    ..rename(0x2019, "rsquo", "right single quotation mark ('’')")

+    ..rename(0x201A, "sbquo", "single low-9 quotation mark ('‚')")

+    ..rename(0x201C, "ldquo", "left double quotation mark ('“')")

+    ..rename(0x201D, "rdquo", "right double quotation mark ('”')")

+    ..rename(0x201E, "bdquo", "double low-9 quotation mark ('„')")

+    ..rename(0x2020, "dagger", "dagger, obelisk ('†')")

+    ..rename(0x2021, "Dagger", "double dagger, double obelisk ('‡')")

+    ..rename(0x2022, "bull", "bullet (black small circle) ('•')")

+    ..rename(0x2026, "hellip", "horizontal ellipsis (three dot leader) ('…')")

+    ..rename(0x2030, "permil", "per mille sign ('‰')")

+    ..rename(0x2032, "prime", "prime (minutes, feet) ('′')")

+    ..rename(0x2033, "Prime", "double prime (seconds, inches) ('″')")

+    ..rename(

+        0x2039, "lsaquo", "single left-pointing angle quotation mark ('‹')")

+    ..rename(0x203A, "rsaquo", "single right-pointing angle quotation mark ('›')")

+    ..rename(0x203E, "oline", "overline (spacing overscore) ('‾')")

+    ..rename(0x2044, "frasl", "fraction slash (solidus) ('⁄')")

+    ..rename(0x20AC, "euro", "euro sign ('€')")

+    ..rename(0x2111, "image", "black-letter capital I (imaginary part) ('ℑ')")

+    ..rename(0x2118, "weierp", "script capital P (power set, Weierstrass p) ('℘')")

+    ..rename(0x211C, "real", "black-letter capital R (real part symbol) ('ℜ')")

+    ..rename(0x2122, "trade", "trademark symbol ('™')")

+    ..rename(0x2135, "alefsym", "alef symbol (first transfinite cardinal) ('ℵ')")

+    ..rename(0x2190, "larr", "leftwards arrow ('←')")

+    ..rename(0x2191, "uarr", "upwards arrow ('↑')")

+    ..rename(0x2192, "rarr", "rightwards arrow ('→')")

+    ..rename(0x2193, "darr", "downwards arrow ('↓')")

+    ..rename(0x2194, "harr", "left right arrow ('↔')")

+    ..rename(0x21B5, "crarr", "downwards arrow with corner leftwards (carriage return) ('↵')")

+    ..rename(0x21D0, "lArr", "leftwards double arrow ('⇐')")

+    ..rename(0x21D1, "uArr", "upwards double arrow ('⇑')")

+    ..rename(0x21D2, "rArr", "rightwards double arrow ('⇒')")

+    ..rename(0x21D3, "dArr", "downwards double arrow ('⇓')")

+    ..rename(0x21D4, "hArr", "left right double arrow ('⇔')")

+    ..rename(0x2200, "forall", "for all ('∀')")

+    ..rename(0x2202, "part", "partial differential ('∂')")

+    ..rename(0x2203, "exist", "there exists ('∃')")

+    ..rename(0x2205, "empty", "empty set (null set); see also U+8960, ⌀ ('∅')")

+    ..rename(0x2207, "nabla", "del or nabla (vector differential operator) ('∇')")

+    ..rename(0x2208, "isin", "element of ('∈')")

+    ..rename(0x2209, "notin", "not an element of ('∉')")

+    ..rename(0x220B, "ni", "contains as member ('∋')")

+    ..rename(0x220F, "prod", "n-ary product (product sign) ('∏')")

+    ..rename(0x2211, "sum", "n-ary summation ('∑')")

+    ..rename(0x2212, "minus", "minus sign ('−')")

+    ..rename(0x2217, "lowast", "asterisk operator ('∗')")

+    ..rename(0x221A, "radic", "square root (radical sign) ('√')")

+    ..rename(0x221D, "prop", "proportional to ('∝')")

+    ..rename(0x221E, "infin", "infinity ('∞')")

+    ..rename(0x2220, "ang", "angle ('∠')")

+    ..rename(0x2227, "and", "logical and (wedge) ('∧')")

+    ..rename(0x2228, "or", "logical or (vee) ('∨')")

+    ..rename(0x2229, "cap", "intersection (cap) ('∩')")

+    ..rename(0x222A, "cup", "union (cup) ('∪')")

+    ..rename(0x222B, "int", "integral ('∫')")

+    ..rename(0x2234, "there4", "therefore sign ('∴')")

+    ..rename(0x223C, "sim", "tilde operator (varies with, similar to) ('∼')")

+    ..rename(0x2245, "cong", "congruent to ('≅')")

+    ..rename(0x2248, "asymp", "almost equal to (asymptotic to) ('≈')")

+    ..rename(0x2260, "ne", "not equal to ('≠')")

+    ..rename(0x2261, "equiv", "identical to; sometimes used for 'equivalent to' ('≡')")

+    ..rename(0x2264, "le", "less-than or equal to ('≤')")

+    ..rename(0x2265, "ge", "greater-than or equal to ('≥')")

+    ..rename(0x2282, "sub", "subset of ('⊂')")

+    ..rename(0x2283, "sup", "superset of ('⊃')")

+    ..rename(0x2284, "nsub", "not a subset of ('⊄')")

+    ..rename(0x2286, "sube", "subset of or equal to ('⊆')")

+    ..rename(0x2287, "supe", "superset of or equal to ('⊇')")

+    ..rename(0x2295, "oplus", "circled plus (direct sum) ('⊕')")

+    ..rename(0x2297, "otimes", "circled times (vector product) ('⊗')")

+    ..rename(0x22A5, "perp", "up tack (orthogonal to, perpendicular) ('⊥')")

+    ..rename(0x22C5, "sdot", "dot operator ('⋅')")

+    ..rename(0x22EE, "vellip", "vertical ellipsis ('⋮')")

+    ..rename(0x2308, "lceil", "left ceiling (APL upstile) ('⌈')")

+    ..rename(0x2309, "rceil", "right ceiling ('⌉')")

+    ..rename(0x230A, "lfloor", "left floor (APL downstile) ('⌊')")

+    ..rename(0x230B, "rfloor", "right floor ('⌋')")

+    ..rename(0x2329, "lang", "left-pointing angle bracket (bra) ('⟨')")

+    ..rename(0x232A, "rang", "right-pointing angle bracket (ket) ('⟩')")

+    ..rename(0x25CA, "loz", "lozenge ('◊')")

+    ..rename(0x2660, "spades", "black spade suit ('♠')")

+    ..rename(0x2663, "clubs", "black club suit (shamrock) ('♣')")

+    ..rename(0x2665, "hearts", "black heart suit (valentine) ('♥')")

+    ..rename(0x2666, "diams", "black diamond suit ('♦')");

+}

+

+const String usageString = r"""

+Usage:

+  charcode [-h] [-oFILE] (<character-range> | <rename> | -pPREFIX | -fFILE)*

+

+  A <character-range> is either

+   - A literal character,

+   - An escaped character `\n`, `\r`, `\t`, `\xhh`, `\uhhhh` or `\dd*`,

+       where `h` is a hexadecimal digit and `d` is a decimal digit.

+   - Two characters separated by `-`,

+   - The `\d`, `\w` or `\s` escapes, or

+   - A sequence of character ranges.

+  Examples: `a`, `a-z`, `\da-fA-F`, `\x00-\uFFFF`.

+

+  A <rename> declaration is a single or escaped character, a `=` and an

+  identifier name, optionally followed by a `:` and a description

+  Example:  x=cross:\"a cross product.\"

+  The declaration names or renames the character and adds or changes

+  the associated description.

+  It will not add the character to the output.

+  Following occurrences of the character will use the new name.

+  Example: `charcode y y=why x-z` will generate `$y` for the character

+    code of "y", then `$x`, `$why` and `$z` as well.

+

+""";

diff --git a/bin/src/uflags.dart b/bin/src/uflags.dart
new file mode 100644
index 0000000..84ed299
--- /dev/null
+++ b/bin/src/uflags.dart
@@ -0,0 +1,418 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:typed_data';
+
+import 'package:charcode/ascii.dart';
+
+/// Parses argument lists based on a [Flags] configuration.
+///
+/// Arguments are either literals or flags.
+///
+/// Flags start with `-` or `--`
+/// Flags starting with `-` are single-character flags, like `-x`.
+/// Single character flag names must be ASCII.
+/// Flags starting with `--` are named, like `--expand`.
+/// They extend to the end of the argument, or until a `=`.
+///
+/// Flags can have parameters.
+///
+/// Single-character flags can have an parameter:
+/// * immediately after the charcter, `-ofilename`,
+/// * with a `=` between them, `-o=filename`,
+/// * or as the next argument, `-o filename`.
+///
+/// Named flags cannot be directly concatenated with the parameter,
+/// but must be one of `--output=filename` or `--output filename`.
+/// Named flags conflate non-ASCII alphanumeric characters, like `-` and `_`
+/// (but not `=` which delimites a parameter value).
+/// Any non-letter, non-digit character sequence is matched by any other,
+/// so `--foo-bar`, `--foo_bar` and `--foo.<!>.bar` are all the same.
+///
+/// Flags can have *optional* parameters. A flag with an optional parameter
+/// cannot have its value in the next argument, it *must* use `=` or have
+/// the value immediately after a single character flag.
+/// It has a default value to use if the parameter is omitted.
+///
+/// An unrecognized or malformed flag is reported using the [warn]
+/// function.
+Iterable<CmdLineArg<T>> parseFlags<T>(
+    Flags<T> flags, Iterable<String> arguments,
+    [void warn(String warning)?]) sync* {
+  warn ??= _printWarning;
+  var args = arguments.iterator;
+  while (args.moveNext()) {
+    var arg = args.current;
+    if (arg.startsWith("-")) {
+      if (arg.startsWith("-", 1)) {
+        // Named flags.
+        if (arg.length == 2) {
+          // Found `--`. Stop parsing flags.
+          break;
+        }
+        var equals = arg.indexOf("=", 2);
+        if (equals >= 0) {
+          var name = arg.substring(2, equals);
+          var value = arg.substring(equals + 1);
+          var flag = flags.byName(name);
+          if (flag != null) {
+            if (!flag.hasParameter) {
+              warn("Flag $name should not have a parameter: $arg");
+              continue;
+            }
+            yield CmdLineArg<T>(flag.key, value);
+            continue;
+          }
+          warn("Unknown flag: $arg");
+          continue;
+        }
+        var name = arg.substring(2);
+        var flag = flags.byName(name);
+        if (flag != null) {
+          var value = flag.value;
+          if (flag.hasParameter &&
+              !flag.hasOptionalParameter &&
+              args.moveNext()) {
+            value = args.current;
+          }
+          yield CmdLineArg<T>(flag.key, value);
+          continue;
+        }
+        warn("Unknown flag: $arg");
+        continue;
+      }
+      // Character flag(s).
+      for (var i = 1; i < arg.length; i++) {
+        var char = arg.codeUnitAt(i);
+        var flag = flags.byChar(char);
+        if (flag == null) {
+          warn("Unknown flag: ${arg.substring(i, i + 1)}");
+          continue;
+        }
+        var value = flag.value;
+        if (arg.startsWith("=", i + 1)) {
+          value = arg.substring(i + 2);
+          if (!flag.hasParameter) {
+            warn(
+                "Flag ${arg.substring(i, i + 1)} should not have a parameter: ${arg.substring(i)}");
+            break;
+          }
+          yield CmdLineArg<T>(flag.key, value);
+          break;
+        }
+        if (flag.hasParameter) {
+          if (i + 1 < arg.length) {
+            value = arg.substring(i + 1);
+          } else if (!flag.hasOptionalParameter && args.moveNext()) {
+            value = args.current;
+          }
+          yield CmdLineArg<T>(flag.key, value);
+          break;
+        }
+        yield CmdLineArg<T>(flag.key, value);
+      }
+      continue;
+    }
+    yield CmdLineArg<Never>(null, arg);
+  }
+  // Handle entries after `--`.
+  while (args.moveNext()) {
+    yield CmdLineArg<Never>(null, args.current);
+  }
+}
+
+/// A part of the arguments list recognized as a flag or not.
+///
+/// If [key] is `null`, the [value] is a plain argument list entry.
+/// Otherwise they key corresponds to the flag that was recognized,
+/// and [value] is its parameter or default value, if any.
+///
+class CmdLineArg<T> {
+  final T? key;
+  final String? value;
+  CmdLineArg(this.key, this.value);
+  bool get isFlag => key != null;
+}
+
+/// A flag configuration.
+///
+/// Collects one or more [FlagConfig] objects and allows quick look-up
+/// on character or name.
+class Flags<T> {
+  final List<FlagConfig<T>?> _charFlags =
+      List<FlagConfig<T>?>.filled(128, null, growable: false);
+  final Map<String, FlagConfig<T>> _namedFlags = {};
+
+  void add(FlagConfig<T> flag) {
+    var char = flag.flagChar;
+    if (char != null) {
+      _charFlags[char] = flag;
+    }
+    var name = flag.flagName;
+    if (name != null) {
+      _namedFlags[name] = flag;
+    }
+  }
+
+  void addBoolFlag(T key, String flagChar, String flagName,
+      [String? description]) {
+    add(FlagConfig.optionalParameter(key, flagChar, flagName, "true",
+        description: description, valueDescription: "true"));
+    add(FlagConfig.optionalParameter(key, null, "no-" + flagName, "false"));
+  }
+
+  FlagConfig<T>? byName(String name) => _namedFlags[name];
+  FlagConfig<T>? byChar(int char) =>
+      0 <= char && char <= 217 ? _charFlags[char] : null;
+
+  void writeUsage(StringSink buffer) {
+    const descriptionStart = 28;
+    var allFlags = [
+      ...{
+        for (var flag in _namedFlags.values)
+          if (!flag.flagName!.startsWith("no-") || flag.value != "false") flag,
+        for (var flag in _charFlags)
+          if (flag != null && flag.flagName == null) flag
+      }
+    ]..sort(_flagOrder);
+    for (var flag in allFlags) {
+      var name = flag.flagName;
+      var char = flag.flagChar;
+      var parameter = flag.valueDescription ?? "VALUE";
+      var description = flag.description;
+      var lineLength = 0;
+      if (char != null) {
+        buffer
+          ..write("  -")
+          ..writeCharCode(char);
+        lineLength = 4;
+        if (name != null) {
+          buffer..write(', --')..write(name);
+          lineLength = name.length + 8;
+        }
+      } else if (name != null) {
+        buffer..write("      --")..write(name);
+        lineLength = name.length + 8;
+      } else {
+        continue;
+      }
+      if (flag.hasParameter) {
+        var end = "";
+        if (flag.hasOptionalParameter) {
+          buffer.write('[=');
+          lineLength += 2;
+          end = "]";
+        } else {
+          buffer.write('=');
+          lineLength += 1;
+        }
+        buffer.write(parameter);
+        lineLength += parameter.length;
+        buffer.write(end);
+        lineLength += end.length;
+      }
+      if (description != null) {
+        if (lineLength < descriptionStart) {
+          do {
+            buffer.write(' ');
+            lineLength += 1;
+          } while (lineLength < descriptionStart);
+        } else {
+          buffer.write(' ');
+          lineLength += 1;
+        }
+        var indent = "                              "; // 30 spaces.
+        _writeSplitDescription(buffer, description, lineLength, 80, indent);
+      } else {
+        buffer.writeln();
+      }
+    }
+  }
+
+  void _writeSplitDescription(StringSink output, String description, int indent,
+      int maxLength, String newLineIndent) {
+    var index = 0;
+    var end = index + (maxLength - indent);
+    end:
+    while (end < description.length) {
+      line:
+      while (description.codeUnitAt(end) != $space) {
+        end--;
+        if (end == index) {
+          end = index + (maxLength - indent) + 1;
+          while (end < description.length) {
+            if (description.codeUnitAt(end) == $space) {
+              break line;
+            }
+            end++;
+          }
+          break end;
+        }
+      }
+      output.writeln(description.substring(index, end));
+      index = end + 1;
+      output.write(newLineIndent);
+      indent = newLineIndent.length;
+      end = index + (maxLength - indent);
+    }
+    if (index < description.length) {
+      output.writeln(description.substring(index));
+    }
+  }
+
+  static int _flagOrder(FlagConfig a, FlagConfig b) {
+    var aName = a.flagName;
+    var bName = b.flagName;
+    if (aName != null) {
+      if (bName != null) return aName.compareTo(bName);
+      return aName.codeUnitAt(0) < b.flagChar! ? -1 : 1;
+    }
+    if (bName != null) {
+      return a.flagChar! < bName.codeUnitAt(0) ? -1 : 1;
+    }
+    return a.flagChar! - b.flagChar!;
+  }
+}
+
+/// Configuration of a single flag.
+class FlagConfig<T> {
+  /// The user designated key linked to this flag.
+  final T key;
+
+  /// ASCII character code for the single-character flag.
+  ///
+  /// Must be a digit or letter. Does distinguish case.
+  final int? flagChar;
+
+  /// Flag name.
+  ///
+  /// Canonicalized to lower-case letters, digits and single `-` characters.
+  final String? flagName;
+
+  /// Whether the flag expects a parameter.
+  ///
+  /// A flag expecting a parameter which is not optional ([hasOptionalParameter])
+  /// will require a value in the argument list to be well-formed.
+  final bool hasParameter;
+
+  /// Whether the parameter is optional.
+  ///
+  /// An optional parameter can be omitted.
+  final bool hasOptionalParameter;
+
+  /// A name for the parameter, if there is a parameter.
+  ///
+  /// Traditionally an all-upper-case name.
+  final String? valueDescription;
+
+  /// The value associated with the flag.
+  ///
+  /// A flag without parameters can have a value configured, which allows the same
+  /// [key] to be used for different flags.
+  ///
+  /// A flag with an optional parameter will have a default value, which may be
+  /// null.
+  final String? value;
+
+  /// Description for documentation purposes.
+  final String? description;
+
+  FlagConfig._(
+      this.key,
+      String? flagChar,
+      String? flagName,
+      this.hasParameter,
+      this.hasOptionalParameter,
+      this.value,
+      this.description,
+      this.valueDescription)
+      : flagChar = _checkFlagChar(flagChar),
+        flagName = canonicalizeName(flagName);
+  FlagConfig(T key, String? flagChar, String? flagName,
+      {String? value, String? description, String valueDescription = "VALUE"})
+      : this._(key, flagChar, flagName, false, false, value, description,
+            valueDescription);
+  FlagConfig.requiredParameter(T key, String? flagChar, String? flagName,
+      {String? description, String valueDescription = "VALUE"})
+      : this._(key, flagChar, flagName, true, false, null, description,
+            valueDescription);
+  FlagConfig.optionalParameter(
+      T key, String? flagChar, String? flagName, String defaultValue,
+      {String? description, String valueDescription = "VALUE"})
+      : this._(key, flagChar, flagName, true, true, defaultValue, description,
+            valueDescription);
+
+  static int? _checkFlagChar(String? flagChar) {
+    if (flagChar == null) return null;
+    if (flagChar.length == 1) {
+      var char = flagChar.codeUnitAt(0);
+      if (char ^ 0x30 <= 9) return char;
+      var lc = char | 0x20;
+      if (lc >= 0x61 && lc <= 0x7b) return char;
+    }
+    throw ArgumentError.value(flagChar, "flagChar",
+        "Must be a single ASCII digit or letter character");
+  }
+}
+
+String? canonicalizeName(String? name) {
+  if (name == null) return name;
+  const $dash = 0x2d;
+  var wasDash = false;
+  var i = 0;
+  while (i < name.length) {
+    var char = name.codeUnitAt(i++);
+    if (char ^ 0x30 <= 9 || char >= 0x61 && char <= 0x7b) {
+      wasDash = false;
+      continue;
+    }
+    if (char == $dash && !wasDash) {
+      wasDash = true;
+      continue;
+    }
+
+    var bytes = Uint8List(name.length);
+    var j = 0;
+    for (; j < i - 1; j++) {
+      bytes[j] = name.codeUnitAt(j);
+    }
+
+    // Convert all letters to lower-case, all non letter/digits to a single `-`.
+    outer:
+    do {
+      if (char >= 0x41 && char <= 0x5b) {
+        bytes[j++] = char | 0x20;
+        i++;
+        wasDash = false;
+      } else {
+        if (!wasDash) {
+          bytes[j++] = $dash;
+          i++;
+          wasDash = true;
+        }
+      }
+      while (i < name.length) {
+        char = name.codeUnitAt(i++);
+        if (char ^ 0x30 <= 9 || char >= 0x61 && char <= 0x7b) {
+          bytes[j++] = char;
+          wasDash = false;
+          continue;
+        }
+        if (char == $dash && !wasDash) {
+          bytes[j++] = char;
+          wasDash = true;
+          continue;
+        }
+        continue outer;
+      }
+      break;
+    } while (true);
+    return String.fromCharCodes(bytes);
+  }
+  return name;
+}
+
+void _printWarning(String message) {
+  print(message);
+}
diff --git a/example/example.dart b/example/example.dart
new file mode 100644
index 0000000..fc7542c
--- /dev/null
+++ b/example/example.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:charcode/charcode.dart';
+
+void main() {
+  print(String.fromCharCodes([
+    $E,
+    $x,
+    $a,
+    $m,
+    $p,
+    $l,
+    $e,
+    $exclamation,
+  ]));
+}
+
+/// Check whether `(` and `)` are balanced in [input].
+bool checkBalancedParentheses(String input) {
+  var openParenCount = 0;
+  for (var i = 0; i < input.length; i++) {
+    var char = input.codeUnitAt(i);
+    if (char == $lparen) {
+      openParenCount++;
+    } else if (char == $rparen) {
+      openParenCount--;
+      if (openParenCount < 0) return false;
+    }
+  }
+  return openParenCount == 0;
+}
diff --git a/lib/ascii.dart b/lib/ascii.dart
index 48b51d0..0d31444 100644
--- a/lib/ascii.dart
+++ b/lib/ascii.dart
@@ -2,353 +2,507 @@
 // for details. All rights reserved. Use of this source is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * Declare integer constants for each ASCII character.
- *
- * The constants all start with "$" to avoid conflicting with other constants.
- *
- * For characters that are valid in an identifier, the character iteself
- * follows the "$". For other characters, a symbolic name is used.
- * In some cases, multiple alternative symbolic names are provided.
- * Please stick to using one name per character in your code.
- *
- * The symbolic names are, where applicable, the name of the symbol without
- * any "mark", "symbol" "sign" or "accent" suffix.
- * Examples: [$exclamation], [$pipe], [$dollar] and [$grave].
- * For less common symbols, a selection of common names are used.
- *
- * For parenthetical markers, there is both a short name, [$lparen]/[$rparen],
- * and a long name, [$open_paren]/ [$close_paren].
- *
- * For common HTML entities, the entity names are also useable as symbolic
- * names: [$apos], [$quot], [$lt], [$gt], and [$amp].
- */
+/// Declare integer constants for each ASCII character.
+///
+/// The constants all start with "$" to avoid conflicting with other constants.
+///
+/// For characters that are valid in an identifier, the character iteself
+/// follows the "$". For other characters, a symbolic name is used.
+/// In some cases, multiple alternative symbolic names are provided.
+/// Please stick to using one name per character in your code.
+///
+/// The symbolic names are, where applicable, the name of the symbol without
+/// any "mark", "symbol" "sign" or "accent" suffix.
+/// Examples: [$exclamation], [$pipe], [$dollar] and [$grave].
+/// For less common symbols, a selection of common names are used.
+///
+/// For parenthetical markers, there is both a short name, [$lparen]/[$rparen],
+/// and a long name, [$open_paren]/ [$close_paren].
+///
+/// For common HTML entities, the entity names are also useable as symbolic
+/// names: [$apos], [$quot], [$lt], [$gt], and [$amp].
 library charcode.ascii.dollar_lowercase;
 
 // Control characters.
 
 /// "Null character" control character.
-const int $nul               = 0x00;
+const int $nul = 0x00;
+
 /// "Start of Header" control character.
-const int $soh               = 0x01;
+const int $soh = 0x01;
+
 /// "Start of Text" control character.
-const int $stx               = 0x02;
+const int $stx = 0x02;
+
 /// "End of Text" control character.
-const int $etx               = 0x03;
+const int $etx = 0x03;
+
 /// "End of Transmission" control character.
-const int $eot               = 0x04;
+const int $eot = 0x04;
+
 /// "Enquiry" control character.
-const int $enq               = 0x05;
+const int $enq = 0x05;
+
 /// "Acknowledgment" control character.
-const int $ack               = 0x06;
+const int $ack = 0x06;
+
 /// "Bell" control character.
-const int $bel               = 0x07;
+const int $bel = 0x07;
+
 /// "Backspace" control character.
-const int $bs                = 0x08;
+const int $bs = 0x08;
+
 /// "Horizontal Tab" control character.
-const int $ht                = 0x09;
+const int $ht = 0x09;
+
 /// "Horizontal Tab" control character, common name.
-const int $tab               = 0x09;
+const int $tab = 0x09;
+
 /// "Line feed" control character.
-const int $lf                = 0x0A;
+const int $lf = 0x0A;
+
 /// "Vertical Tab" control character.
-const int $vt                = 0x0B;
+const int $vt = 0x0B;
+
 /// "Form feed" control character.
-const int $ff                = 0x0C;
+const int $ff = 0x0C;
+
 /// "Carriage return" control character.
-const int $cr                = 0x0D;
+const int $cr = 0x0D;
+
 /// "Shift Out" control character.
-const int $so                = 0x0E;
+const int $so = 0x0E;
+
 /// "Shift In" control character.
-const int $si                = 0x0F;
+const int $si = 0x0F;
+
 /// "Data Link Escape" control character.
-const int $dle               = 0x10;
+const int $dle = 0x10;
+
 /// "Device Control 1" control character (oft. XON).
-const int $dc1               = 0x11;
+const int $dc1 = 0x11;
+
 /// "Device Control 2" control character.
-const int $dc2               = 0x12;
+const int $dc2 = 0x12;
+
 /// "Device Control 3" control character (oft. XOFF).
-const int $dc3               = 0x13;
+const int $dc3 = 0x13;
+
 /// "Device Control 4" control character.
-const int $dc4               = 0x14;
+const int $dc4 = 0x14;
+
 /// "Negative Acknowledgment" control character.
-const int $nak               = 0x15;
+const int $nak = 0x15;
+
 /// "Synchronous idle" control character.
-const int $syn               = 0x16;
+const int $syn = 0x16;
+
 /// "End of Transmission Block" control character.
-const int $etb               = 0x17;
+const int $etb = 0x17;
+
 /// "Cancel" control character.
-const int $can               = 0x18;
+const int $can = 0x18;
+
 /// "End of Medium" control character.
-const int $em                = 0x19;
+const int $em = 0x19;
+
 /// "Substitute" control character.
-const int $sub               = 0x1A;
+const int $sub = 0x1A;
+
 /// "Escape" control character.
-const int $esc               = 0x1B;
+const int $esc = 0x1B;
+
 /// "File Separator" control character.
-const int $fs                = 0x1C;
+const int $fs = 0x1C;
+
 /// "Group Separator" control character.
-const int $gs                = 0x1D;
+const int $gs = 0x1D;
+
 /// "Record Separator" control character.
-const int $rs                = 0x1E;
+const int $rs = 0x1E;
+
 /// "Unit Separator" control character.
-const int $us                = 0x1F;
+const int $us = 0x1F;
+
 /// "Delete" control character.
-const int $del               = 0x7F;
+const int $del = 0x7F;
 
 // Visible characters.
 
 /// Space character.
-const int $space             = 0x20;
+const int $space = 0x20;
+
 /// Character '!'.
-const int $exclamation       = 0x21;
+const int $exclamation = 0x21;
+
 /// Character '"', short name.
-const int $quot              = 0x22;
+const int $quot = 0x22;
+
 /// Character '"'.
-const int $quote             = 0x22;
+const int $quote = 0x22;
+
 /// Character '"'.
-const int $double_quote      = 0x22;
+const int $double_quote = 0x22;
+
 /// Character '"'.
-const int $quotation         = 0x22;
+const int $quotation = 0x22;
+
 /// Character '#'.
-const int $hash              = 0x23;
+const int $hash = 0x23;
+
 /// Character '$'.
-const int $$                 = 0x24;
+const int $$ = 0x24;
+
 /// Character '$'.
-const int $dollar            = 0x24;
+const int $dollar = 0x24;
+
 /// Character '%'.
-const int $percent           = 0x25;
+const int $percent = 0x25;
+
 /// Character '&', short name.
-const int $amp               = 0x26;
+const int $amp = 0x26;
+
 /// Character '&'.
-const int $ampersand         = 0x26;
+const int $ampersand = 0x26;
+
 /// Character "'".
-const int $apos              = 0x27;
+const int $apos = 0x27;
+
 /// Character '''.
-const int $apostrophe        = 0x27;
+const int $apostrophe = 0x27;
+
 /// Character '''.
-const int $single_quote      = 0x27;
+const int $single_quote = 0x27;
+
 /// Character '('.
-const int $lparen            = 0x28;
+const int $lparen = 0x28;
+
 /// Character '('.
-const int $open_paren        = 0x28;
+const int $open_paren = 0x28;
+
 /// Character '('.
-const int $open_parenthesis  = 0x28;
+const int $open_parenthesis = 0x28;
+
 /// Character ')'.
-const int $rparen            = 0x29;
+const int $rparen = 0x29;
+
 /// Character ')'.
-const int $close_paren       = 0x29;
+const int $close_paren = 0x29;
+
 /// Character ')'.
 const int $close_parenthesis = 0x29;
+
 /// Character '*'.
-const int $asterisk          = 0x2A;
+const int $asterisk = 0x2A;
+
 /// Character '+'.
-const int $plus              = 0x2B;
+const int $plus = 0x2B;
+
 /// Character ','.
-const int $comma             = 0x2C;
+const int $comma = 0x2C;
+
 /// Character '-'.
-const int $minus             = 0x2D;
+const int $minus = 0x2D;
+
 /// Character '-'.
-const int $dash              = 0x2D;
+const int $dash = 0x2D;
+
 /// Character '.'.
-const int $dot               = 0x2E;
+const int $dot = 0x2E;
+
 /// Character '.'.
-const int $fullstop          = 0x2E;
+const int $fullstop = 0x2E;
+
 /// Character '/'.
-const int $slash             = 0x2F;
+const int $slash = 0x2F;
+
 /// Character '/'.
-const int $solidus           = 0x2F;
+const int $solidus = 0x2F;
+
 /// Character '/'.
-const int $division          = 0x2F;
+const int $division = 0x2F;
+
 /// Character '0'.
-const int $0                 = 0x30;
+const int $0 = 0x30;
+
 /// Character '1'.
-const int $1                 = 0x31;
+const int $1 = 0x31;
+
 /// Character '2'.
-const int $2                 = 0x32;
+const int $2 = 0x32;
+
 /// Character '3'.
-const int $3                 = 0x33;
+const int $3 = 0x33;
+
 /// Character '4'.
-const int $4                 = 0x34;
+const int $4 = 0x34;
+
 /// Character '5'.
-const int $5                 = 0x35;
+const int $5 = 0x35;
+
 /// Character '6'.
-const int $6                 = 0x36;
+const int $6 = 0x36;
+
 /// Character '7'.
-const int $7                 = 0x37;
+const int $7 = 0x37;
+
 /// Character '8'.
-const int $8                 = 0x38;
+const int $8 = 0x38;
+
 /// Character '9'.
-const int $9                 = 0x39;
+const int $9 = 0x39;
+
 /// Character ':'.
-const int $colon             = 0x3A;
+const int $colon = 0x3A;
+
 /// Character ';'.
-const int $semicolon         = 0x3B;
+const int $semicolon = 0x3B;
+
 /// Character '<'.
-const int $lt                = 0x3C;
+const int $lt = 0x3C;
+
 /// Character '<'.
-const int $less_than         = 0x3C;
+const int $less_than = 0x3C;
+
 /// Character '<'.
-const int $langle            = 0x3C;
+const int $langle = 0x3C;
+
 /// Character '<'.
-const int $open_angle        = 0x3C;
+const int $open_angle = 0x3C;
+
 /// Character '='.
-const int $equal             = 0x3D;
+const int $equal = 0x3D;
+
 /// Character '>'.
-const int $gt                = 0x3E;
+const int $gt = 0x3E;
+
 /// Character '>'.
-const int $greater_than      = 0x3E;
+const int $greater_than = 0x3E;
+
 /// Character '>'.
-const int $rangle            = 0x3E;
+const int $rangle = 0x3E;
+
 /// Character '>'.
-const int $close_angle       = 0x3E;
+const int $close_angle = 0x3E;
+
 /// Character '?'.
-const int $question          = 0x3F;
+const int $question = 0x3F;
 
 /// Character '@'.
-const int $at                = 0x40;
+const int $at = 0x40;
+
 /// Character 'A'.
-const int $A                 = 0x41;
+const int $A = 0x41;
+
 /// Character 'B'.
-const int $B                 = 0x42;
+const int $B = 0x42;
+
 /// Character 'C'.
-const int $C                 = 0x43;
+const int $C = 0x43;
+
 /// Character 'D'.
-const int $D                 = 0x44;
+const int $D = 0x44;
+
 /// Character 'E'.
-const int $E                 = 0x45;
+const int $E = 0x45;
+
 /// Character 'F'.
-const int $F                 = 0x46;
+const int $F = 0x46;
+
 /// Character 'G'.
-const int $G                 = 0x47;
+const int $G = 0x47;
+
 /// Character 'H'.
-const int $H                 = 0x48;
+const int $H = 0x48;
+
 /// Character 'I'.
-const int $I                 = 0x49;
+const int $I = 0x49;
+
 /// Character 'J'.
-const int $J                 = 0x4A;
+const int $J = 0x4A;
+
 /// Character 'K'.
-const int $K                 = 0x4B;
+const int $K = 0x4B;
+
 /// Character 'L'.
-const int $L                 = 0x4C;
+const int $L = 0x4C;
+
 /// Character 'M'.
-const int $M                 = 0x4D;
+const int $M = 0x4D;
+
 /// Character 'N'.
-const int $N                 = 0x4E;
+const int $N = 0x4E;
+
 /// Character 'O'.
-const int $O                 = 0x4F;
+const int $O = 0x4F;
+
 /// Character 'P'.
-const int $P                 = 0x50;
+const int $P = 0x50;
+
 /// Character 'Q'.
-const int $Q                 = 0x51;
+const int $Q = 0x51;
+
 /// Character 'R'.
-const int $R                 = 0x52;
+const int $R = 0x52;
+
 /// Character 'S'.
-const int $S                 = 0x53;
+const int $S = 0x53;
+
 /// Character 'T'.
-const int $T                 = 0x54;
+const int $T = 0x54;
+
 /// Character 'U'.
-const int $U                 = 0x55;
+const int $U = 0x55;
+
 /// Character 'V'.
-const int $V                 = 0x56;
+const int $V = 0x56;
+
 /// Character 'W'.
-const int $W                 = 0x57;
+const int $W = 0x57;
+
 /// Character 'X'.
-const int $X                 = 0x58;
+const int $X = 0x58;
+
 /// Character 'Y'.
-const int $Y                 = 0x59;
+const int $Y = 0x59;
+
 /// Character 'Z'.
-const int $Z                 = 0x5A;
+const int $Z = 0x5A;
+
 /// Character '['.
-const int $lbracket          = 0x5B;
+const int $lbracket = 0x5B;
+
 /// Character '['.
-const int $open_bracket      = 0x5B;
+const int $open_bracket = 0x5B;
+
 /// Character '\'.
-const int $backslash         = 0x5C;
+const int $backslash = 0x5C;
+
 /// Character ']'.
-const int $rbracket          = 0x5D;
+const int $rbracket = 0x5D;
+
 /// Character ']'.
-const int $close_bracket     = 0x5D;
+const int $close_bracket = 0x5D;
+
 /// Character '^'.
-const int $circumflex        = 0x5E;
+const int $circumflex = 0x5E;
+
 /// Character '^'.
-const int $caret             = 0x5E;
+const int $caret = 0x5E;
+
 /// Character '^'.
-const int $hat               = 0x5E;
+const int $hat = 0x5E;
+
 /// Character '_'.
-const int $_                 = 0x5F;
+const int $_ = 0x5F;
+
 /// Character '_'.
-const int $underscore        = 0x5F;
+const int $underscore = 0x5F;
+
 /// Character '_'.
-const int $underline         = 0x5F;
+const int $underline = 0x5F;
 
 /// Character '`'.
-const int $backquote         = 0x60;
+const int $backquote = 0x60;
+
 /// Character '`'.
-const int $grave             = 0x60;
+const int $grave = 0x60;
+
 /// Character 'a'.
-const int $a                 = 0x61;
+const int $a = 0x61;
+
 /// Character 'b'.
-const int $b                 = 0x62;
+const int $b = 0x62;
+
 /// Character 'c'.
-const int $c                 = 0x63;
+const int $c = 0x63;
+
 /// Character 'd'.
-const int $d                 = 0x64;
+const int $d = 0x64;
+
 /// Character 'e'.
-const int $e                 = 0x65;
+const int $e = 0x65;
+
 /// Character 'f'.
-const int $f                 = 0x66;
+const int $f = 0x66;
+
 /// Character 'g'.
-const int $g                 = 0x67;
+const int $g = 0x67;
+
 /// Character 'h'.
-const int $h                 = 0x68;
+const int $h = 0x68;
+
 /// Character 'i'.
-const int $i                 = 0x69;
+const int $i = 0x69;
+
 /// Character 'j'.
-const int $j                 = 0x6A;
+const int $j = 0x6A;
+
 /// Character 'k'.
-const int $k                 = 0x6B;
+const int $k = 0x6B;
+
 /// Character 'l'.
-const int $l                 = 0x6C;
+const int $l = 0x6C;
+
 /// Character 'm'.
-const int $m                 = 0x6D;
+const int $m = 0x6D;
+
 /// Character 'n'.
-const int $n                 = 0x6E;
+const int $n = 0x6E;
+
 /// Character 'o'.
-const int $o                 = 0x6F;
+const int $o = 0x6F;
+
 /// Character 'p'.
-const int $p                 = 0x70;
+const int $p = 0x70;
+
 /// Character 'q'.
-const int $q                 = 0x71;
+const int $q = 0x71;
+
 /// Character 'r'.
-const int $r                 = 0x72;
+const int $r = 0x72;
+
 /// Character 's'.
-const int $s                 = 0x73;
+const int $s = 0x73;
+
 /// Character 't'.
-const int $t                 = 0x74;
+const int $t = 0x74;
+
 /// Character 'u'.
-const int $u                 = 0x75;
+const int $u = 0x75;
+
 /// Character 'v'.
-const int $v                 = 0x76;
+const int $v = 0x76;
+
 /// Character 'w'.
-const int $w                 = 0x77;
+const int $w = 0x77;
+
 /// Character 'x'.
-const int $x                 = 0x78;
+const int $x = 0x78;
+
 /// Character 'y'.
-const int $y                 = 0x79;
+const int $y = 0x79;
+
 /// Character 'z'.
-const int $z                 = 0x7A;
+const int $z = 0x7A;
+
 /// Character '{'.
-const int $lbrace            = 0x7B;
+const int $lbrace = 0x7B;
+
 /// Character '{'.
-const int $open_brace        = 0x7B;
+const int $open_brace = 0x7B;
+
 /// Character '|'.
-const int $pipe              = 0x7C;
+const int $pipe = 0x7C;
+
 /// Character '|'.
-const int $bar               = 0x7C;
+const int $bar = 0x7C;
+
 /// Character '}'.
-const int $rbrace            = 0x7D;
+const int $rbrace = 0x7D;
+
 /// Character '}'.
-const int $close_brace       = 0x7D;
+const int $close_brace = 0x7D;
+
 /// Character '~'.
-const int $tilde             = 0x7E;
+const int $tilde = 0x7E;
diff --git a/lib/charcode.dart b/lib/charcode.dart
index a47fc19..6a702d7 100644
--- a/lib/charcode.dart
+++ b/lib/charcode.dart
@@ -2,17 +2,15 @@
 // for details. All rights reserved. Use of this source is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * Defines symbolic names for character code points.
- *
- * Includes all ASCII and Latin-1 characters.
- *
- * Exports the libraries `ascii.dart` and `html_entity.dart`.
- *
- * Hides the characters `$minus`, `$sub` and `$tilde` from
- * `html_entities.dart`, since other characters have the same name in
- * `ascii.dart`.
- */
+/// Defines symbolic names for character code points.
+///
+/// Includes all ASCII and Latin-1 characters.
+///
+/// Exports the libraries `ascii.dart` and `html_entity.dart`.
+///
+/// Hides the characters `$minus`, `$sub` and `$tilde` from
+/// `html_entities.dart`, since other characters have the same name in
+/// `ascii.dart`.
 library charcode;
 
 export "ascii.dart";
diff --git a/lib/html_entity.dart b/lib/html_entity.dart
index 507afd4..fa7c493 100644
--- a/lib/html_entity.dart
+++ b/lib/html_entity.dart
@@ -2,522 +2,768 @@
 // for details. All rights reserved. Use of this source is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * Character codes based on HTML 4.01 character entity names.
- *
- * For each entity name, e.g., `nbsp`,
- * a constant with that name prefixed by `$` is defined
- * for that entity's code point.
- *
- * The HTML entities include the non-ASCII Latin-1 characters and
- * symbols, mathematical symbols and Greek litters.
- *
- * The five characters that are ASCII
- * are exported from the `ascii.dart` library.
- *
- * Three names conflict with `ascii.dart`: `$minus`, `$sub` and `$tilde`.
- * If importing both libraries, these three should be hidden from one of the
- * libraries.
- */
+/// Character codes based on HTML 4.01 character entity names.
+///
+/// For each entity name, e.g., `nbsp`,
+/// a constant with that name prefixed by `$` is defined
+/// for that entity's code point.
+///
+/// The HTML entities include the non-ASCII Latin-1 characters and
+/// symbols, mathematical symbols and Greek litters.
+///
+/// The five characters that are ASCII
+/// are exported from the `ascii.dart` library.
+///
+/// Three names conflict with `ascii.dart`: `$minus`, `$sub` and `$tilde`.
+/// If importing both libraries, these three should be hidden from one of the
+/// libraries.
 library charcode.htmlentity.dollar_lowercase;
 
 export "ascii.dart" show $quot, $amp, $apos, $lt, $gt;
 
 /// no-break space (non-breaking space)
-const int $nbsp     = 0x00A0;
+const int $nbsp = 0x00A0;
+
 /// inverted exclamation mark ('¡')
-const int $iexcl    = 0x00A1;
+const int $iexcl = 0x00A1;
+
 /// cent sign ('¢')
-const int $cent     = 0x00A2;
+const int $cent = 0x00A2;
+
 /// pound sign ('£')
-const int $pound    = 0x00A3;
+const int $pound = 0x00A3;
+
 /// currency sign ('¤')
-const int $curren   = 0x00A4;
+const int $curren = 0x00A4;
+
 /// yen sign (yuan sign) ('¥')
-const int $yen      = 0x00A5;
+const int $yen = 0x00A5;
+
 /// broken bar (broken vertical bar) ('¦')
-const int $brvbar   = 0x00A6;
+const int $brvbar = 0x00A6;
+
 /// section sign ('§')
-const int $sect     = 0x00A7;
+const int $sect = 0x00A7;
+
 /// diaeresis (spacing diaeresis); see Germanic umlaut ('¨')
-const int $uml      = 0x00A8;
+const int $uml = 0x00A8;
+
 /// copyright symbol ('©')
-const int $copy     = 0x00A9;
+const int $copy = 0x00A9;
+
 /// feminine ordinal indicator ('ª')
-const int $ordf     = 0x00AA;
+const int $ordf = 0x00AA;
+
 /// left-pointing double angle quotation mark (left pointing guillemet) ('«')
-const int $laquo    = 0x00AB;
+const int $laquo = 0x00AB;
+
 /// not sign ('¬')
-const int $not      = 0x00AC;
+const int $not = 0x00AC;
+
 /// soft hyphen (discretionary hyphen)
-const int $shy      = 0x00AD;
+const int $shy = 0x00AD;
+
 /// registered sign (registered trademark symbol) ('®')
-const int $reg      = 0x00AE;
+const int $reg = 0x00AE;
+
 /// macron (spacing macron, overline, APL overbar) ('¯')
-const int $macr     = 0x00AF;
+const int $macr = 0x00AF;
+
 /// degree symbol ('°')
-const int $deg      = 0x00B0;
+const int $deg = 0x00B0;
+
 /// plus-minus sign (plus-or-minus sign) ('±')
-const int $plusmn   = 0x00B1;
+const int $plusmn = 0x00B1;
+
 /// superscript two (superscript digit two, squared) ('²')
-const int $sup2     = 0x00B2;
+const int $sup2 = 0x00B2;
+
 /// superscript three (superscript digit three, cubed) ('³')
-const int $sup3     = 0x00B3;
+const int $sup3 = 0x00B3;
+
 /// acute accent (spacing acute) ('´')
-const int $acute    = 0x00B4;
+const int $acute = 0x00B4;
+
 /// micro sign ('µ')
-const int $micro    = 0x00B5;
+const int $micro = 0x00B5;
+
 /// pilcrow sign (paragraph sign) ('¶')
-const int $para     = 0x00B6;
+const int $para = 0x00B6;
+
 /// middle dot (Georgian comma, Greek middle dot) ('·')
-const int $middot   = 0x00B7;
+const int $middot = 0x00B7;
+
 /// cedilla (spacing cedilla) ('¸')
-const int $cedil    = 0x00B8;
+const int $cedil = 0x00B8;
+
 /// superscript one (superscript digit one) ('¹')
-const int $sup1     = 0x00B9;
+const int $sup1 = 0x00B9;
+
 /// masculine ordinal indicator ('º')
-const int $ordm     = 0x00BA;
+const int $ordm = 0x00BA;
+
 /// right-pointing double angle quotation mark (right pointing guillemet) ('»')
-const int $raquo    = 0x00BB;
+const int $raquo = 0x00BB;
+
 /// vulgar fraction one quarter (fraction one quarter) ('¼')
-const int $frac14   = 0x00BC;
+const int $frac14 = 0x00BC;
+
 /// vulgar fraction one half (fraction one half) ('½')
-const int $frac12   = 0x00BD;
+const int $frac12 = 0x00BD;
+
 /// vulgar fraction three quarters (fraction three quarters) ('¾')
-const int $frac34   = 0x00BE;
+const int $frac34 = 0x00BE;
+
 /// inverted question mark (turned question mark) ('¿')
-const int $iquest   = 0x00BF;
+const int $iquest = 0x00BF;
+
 /// Latin capital letter A with grave accent (Latin capital letter A grave) ('À')
-const int $Agrave   = 0x00C0;
+const int $Agrave = 0x00C0;
+
 /// Latin capital letter A with acute accent ('Á')
-const int $Aacute   = 0x00C1;
+const int $Aacute = 0x00C1;
+
 /// Latin capital letter A with circumflex ('Â')
-const int $Acirc    = 0x00C2;
+const int $Acirc = 0x00C2;
+
 /// Latin capital letter A with tilde ('Ã')
-const int $Atilde   = 0x00C3;
+const int $Atilde = 0x00C3;
+
 /// Latin capital letter A with diaeresis ('Ä')
-const int $Auml     = 0x00C4;
+const int $Auml = 0x00C4;
+
 /// Latin capital letter A with ring above (Latin capital letter A ring) ('Å')
-const int $Aring    = 0x00C5;
+const int $Aring = 0x00C5;
+
 /// Latin capital letter AE (Latin capital ligature AE) ('Æ')
-const int $AElig    = 0x00C6;
+const int $AElig = 0x00C6;
+
 /// Latin capital letter C with cedilla ('Ç')
-const int $Ccedil   = 0x00C7;
+const int $Ccedil = 0x00C7;
+
 /// Latin capital letter E with grave accent ('È')
-const int $Egrave   = 0x00C8;
+const int $Egrave = 0x00C8;
+
 /// Latin capital letter E with acute accent ('É')
-const int $Eacute   = 0x00C9;
+const int $Eacute = 0x00C9;
+
 /// Latin capital letter E with circumflex ('Ê')
-const int $Ecirc    = 0x00CA;
+const int $Ecirc = 0x00CA;
+
 /// Latin capital letter E with diaeresis ('Ë')
-const int $Euml     = 0x00CB;
+const int $Euml = 0x00CB;
+
 /// Latin capital letter I with grave accent ('Ì')
-const int $Igrave   = 0x00CC;
+const int $Igrave = 0x00CC;
+
 /// Latin capital letter I with acute accent ('Í')
-const int $Iacute   = 0x00CD;
+const int $Iacute = 0x00CD;
+
 /// Latin capital letter I with circumflex ('Î')
-const int $Icirc    = 0x00CE;
+const int $Icirc = 0x00CE;
+
 /// Latin capital letter I with diaeresis ('Ï')
-const int $Iuml     = 0x00CF;
+const int $Iuml = 0x00CF;
+
 /// Latin capital letter Eth ('Ð')
-const int $ETH      = 0x00D0;
+const int $ETH = 0x00D0;
+
 /// Latin capital letter N with tilde ('Ñ')
-const int $Ntilde   = 0x00D1;
+const int $Ntilde = 0x00D1;
+
 /// Latin capital letter O with grave accent ('Ò')
-const int $Ograve   = 0x00D2;
+const int $Ograve = 0x00D2;
+
 /// Latin capital letter O with acute accent ('Ó')
-const int $Oacute   = 0x00D3;
+const int $Oacute = 0x00D3;
+
 /// Latin capital letter O with circumflex ('Ô')
-const int $Ocirc    = 0x00D4;
+const int $Ocirc = 0x00D4;
+
 /// Latin capital letter O with tilde ('Õ')
-const int $Otilde   = 0x00D5;
+const int $Otilde = 0x00D5;
+
 /// Latin capital letter O with diaeresis ('Ö')
-const int $Ouml     = 0x00D6;
+const int $Ouml = 0x00D6;
+
 /// multiplication sign ('×')
-const int $times    = 0x00D7;
+const int $times = 0x00D7;
+
 /// Latin capital letter O with stroke (Latin capital letter O slash) ('Ø')
-const int $Oslash   = 0x00D8;
+const int $Oslash = 0x00D8;
+
 /// Latin capital letter U with grave accent ('Ù')
-const int $Ugrave   = 0x00D9;
+const int $Ugrave = 0x00D9;
+
 /// Latin capital letter U with acute accent ('Ú')
-const int $Uacute   = 0x00DA;
+const int $Uacute = 0x00DA;
+
 /// Latin capital letter U with circumflex ('Û')
-const int $Ucirc    = 0x00DB;
+const int $Ucirc = 0x00DB;
+
 /// Latin capital letter U with diaeresis ('Ü')
-const int $Uuml     = 0x00DC;
+const int $Uuml = 0x00DC;
+
 /// Latin capital letter Y with acute accent ('Ý')
-const int $Yacute   = 0x00DD;
+const int $Yacute = 0x00DD;
+
 /// Latin capital letter THORN ('Þ')
-const int $THORN    = 0x00DE;
+const int $THORN = 0x00DE;
+
 /// Latin small letter sharp s (ess-zed); see German Eszett ('ß')
-const int $szlig    = 0x00DF;
+const int $szlig = 0x00DF;
+
 /// Latin small letter a with grave accent ('à')
-const int $agrave   = 0x00E0;
+const int $agrave = 0x00E0;
+
 /// Latin small letter a with acute accent ('á')
-const int $aacute   = 0x00E1;
+const int $aacute = 0x00E1;
+
 /// Latin small letter a with circumflex ('â')
-const int $acirc    = 0x00E2;
+const int $acirc = 0x00E2;
+
 /// Latin small letter a with tilde ('ã')
-const int $atilde   = 0x00E3;
+const int $atilde = 0x00E3;
+
 /// Latin small letter a with diaeresis ('ä')
-const int $auml     = 0x00E4;
+const int $auml = 0x00E4;
+
 /// Latin small letter a with ring above ('å')
-const int $aring    = 0x00E5;
+const int $aring = 0x00E5;
+
 /// Latin small letter ae (Latin small ligature ae) ('æ')
-const int $aelig    = 0x00E6;
+const int $aelig = 0x00E6;
+
 /// Latin small letter c with cedilla ('ç')
-const int $ccedil   = 0x00E7;
+const int $ccedil = 0x00E7;
+
 /// Latin small letter e with grave accent ('è')
-const int $egrave   = 0x00E8;
+const int $egrave = 0x00E8;
+
 /// Latin small letter e with acute accent ('é')
-const int $eacute   = 0x00E9;
+const int $eacute = 0x00E9;
+
 /// Latin small letter e with circumflex ('ê')
-const int $ecirc    = 0x00EA;
+const int $ecirc = 0x00EA;
+
 /// Latin small letter e with diaeresis ('ë')
-const int $euml     = 0x00EB;
+const int $euml = 0x00EB;
+
 /// Latin small letter i with grave accent ('ì')
-const int $igrave   = 0x00EC;
+const int $igrave = 0x00EC;
+
 /// Latin small letter i with acute accent ('í')
-const int $iacute   = 0x00ED;
+const int $iacute = 0x00ED;
+
 /// Latin small letter i with circumflex ('î')
-const int $icirc    = 0x00EE;
+const int $icirc = 0x00EE;
+
 /// Latin small letter i with diaeresis ('ï')
-const int $iuml     = 0x00EF;
+const int $iuml = 0x00EF;
+
 /// Latin small letter eth ('ð')
-const int $eth      = 0x00F0;
+const int $eth = 0x00F0;
+
 /// Latin small letter n with tilde ('ñ')
-const int $ntilde   = 0x00F1;
+const int $ntilde = 0x00F1;
+
 /// Latin small letter o with grave accent ('ò')
-const int $ograve   = 0x00F2;
+const int $ograve = 0x00F2;
+
 /// Latin small letter o with acute accent ('ó')
-const int $oacute   = 0x00F3;
+const int $oacute = 0x00F3;
+
 /// Latin small letter o with circumflex ('ô')
-const int $ocirc    = 0x00F4;
+const int $ocirc = 0x00F4;
+
 /// Latin small letter o with tilde ('õ')
-const int $otilde   = 0x00F5;
+const int $otilde = 0x00F5;
+
 /// Latin small letter o with diaeresis ('ö')
-const int $ouml     = 0x00F6;
+const int $ouml = 0x00F6;
+
 /// division sign (obelus) ('÷')
-const int $divide   = 0x00F7;
+const int $divide = 0x00F7;
+
 /// Latin small letter o with stroke (Latin small letter o slash) ('ø')
-const int $oslash   = 0x00F8;
+const int $oslash = 0x00F8;
+
 /// Latin small letter u with grave accent ('ù')
-const int $ugrave   = 0x00F9;
+const int $ugrave = 0x00F9;
+
 /// Latin small letter u with acute accent ('ú')
-const int $uacute   = 0x00FA;
+const int $uacute = 0x00FA;
+
 /// Latin small letter u with circumflex ('û')
-const int $ucirc    = 0x00FB;
+const int $ucirc = 0x00FB;
+
 /// Latin small letter u with diaeresis ('ü')
-const int $uuml     = 0x00FC;
+const int $uuml = 0x00FC;
+
 /// Latin small letter y with acute accent ('ý')
-const int $yacute   = 0x00FD;
+const int $yacute = 0x00FD;
+
 /// Latin small letter thorn ('þ')
-const int $thorn    = 0x00FE;
+const int $thorn = 0x00FE;
+
 /// Latin small letter y with diaeresis ('ÿ')
-const int $yuml     = 0x00FF;
+const int $yuml = 0x00FF;
+
 /// Latin capital ligature oe ('Œ')
-const int $OElig    = 0x0152;
+const int $OElig = 0x0152;
+
 /// Latin small ligature oe ('œ')
-const int $oelig    = 0x0153;
+const int $oelig = 0x0153;
+
 /// Latin capital letter s with caron ('Š')
-const int $Scaron   = 0x0160;
+const int $Scaron = 0x0160;
+
 /// Latin small letter s with caron ('š')
-const int $scaron   = 0x0161;
+const int $scaron = 0x0161;
+
 /// Latin capital letter y with diaeresis ('Ÿ')
-const int $Yuml     = 0x0178;
+const int $Yuml = 0x0178;
+
 /// Latin small letter f with hook (function, florin) ('ƒ')
-const int $fnof     = 0x0192;
+const int $fnof = 0x0192;
+
 /// modifier letter circumflex accent ('ˆ')
-const int $circ     = 0x02C6;
+const int $circ = 0x02C6;
+
 /// small tilde ('˜')
-const int $tilde    = 0x02DC;
+const int $tilde = 0x02DC;
+
 /// Greek capital letter Alpha ('Α')
-const int $Alpha    = 0x0391;
+const int $Alpha = 0x0391;
+
 /// Greek capital letter Beta ('Β')
-const int $Beta     = 0x0392;
+const int $Beta = 0x0392;
+
 /// Greek capital letter Gamma ('Γ')
-const int $Gamma    = 0x0393;
+const int $Gamma = 0x0393;
+
 /// Greek capital letter Delta ('Δ')
-const int $Delta    = 0x0394;
+const int $Delta = 0x0394;
+
 /// Greek capital letter Epsilon ('Ε')
-const int $Epsilon  = 0x0395;
+const int $Epsilon = 0x0395;
+
 /// Greek capital letter Zeta ('Ζ')
-const int $Zeta     = 0x0396;
+const int $Zeta = 0x0396;
+
 /// Greek capital letter Eta ('Η')
-const int $Eta      = 0x0397;
+const int $Eta = 0x0397;
+
 /// Greek capital letter Theta ('Θ')
-const int $Theta    = 0x0398;
+const int $Theta = 0x0398;
+
 /// Greek capital letter Iota ('Ι')
-const int $Iota     = 0x0399;
+const int $Iota = 0x0399;
+
 /// Greek capital letter Kappa ('Κ')
-const int $Kappa    = 0x039A;
+const int $Kappa = 0x039A;
+
 /// Greek capital letter Lambda ('Λ')
-const int $Lambda   = 0x039B;
+const int $Lambda = 0x039B;
+
 /// Greek capital letter Mu ('Μ')
-const int $Mu       = 0x039C;
+const int $Mu = 0x039C;
+
 /// Greek capital letter Nu ('Ν')
-const int $Nu       = 0x039D;
+const int $Nu = 0x039D;
+
 /// Greek capital letter Xi ('Ξ')
-const int $Xi       = 0x039E;
+const int $Xi = 0x039E;
+
 /// Greek capital letter Omicron ('Ο')
-const int $Omicron  = 0x039F;
+const int $Omicron = 0x039F;
+
 /// Greek capital letter Pi ('Π')
-const int $Pi       = 0x03A0;
+const int $Pi = 0x03A0;
+
 /// Greek capital letter Rho ('Ρ')
-const int $Rho      = 0x03A1;
+const int $Rho = 0x03A1;
+
 /// Greek capital letter Sigma ('Σ')
-const int $Sigma    = 0x03A3;
+const int $Sigma = 0x03A3;
+
 /// Greek capital letter Tau ('Τ')
-const int $Tau      = 0x03A4;
+const int $Tau = 0x03A4;
+
 /// Greek capital letter Upsilon ('Υ')
-const int $Upsilon  = 0x03A5;
+const int $Upsilon = 0x03A5;
+
 /// Greek capital letter Phi ('Φ')
-const int $Phi      = 0x03A6;
+const int $Phi = 0x03A6;
+
 /// Greek capital letter Chi ('Χ')
-const int $Chi      = 0x03A7;
+const int $Chi = 0x03A7;
+
 /// Greek capital letter Psi ('Ψ')
-const int $Psi      = 0x03A8;
+const int $Psi = 0x03A8;
+
 /// Greek capital letter Omega ('Ω')
-const int $Omega    = 0x03A9;
+const int $Omega = 0x03A9;
+
 /// Greek small letter alpha ('α')
-const int $alpha    = 0x03B1;
+const int $alpha = 0x03B1;
+
 /// Greek small letter beta ('β')
-const int $beta     = 0x03B2;
+const int $beta = 0x03B2;
+
 /// Greek small letter gamma ('γ')
-const int $gamma    = 0x03B3;
+const int $gamma = 0x03B3;
+
 /// Greek small letter delta ('δ')
-const int $delta    = 0x03B4;
+const int $delta = 0x03B4;
+
 /// Greek small letter epsilon ('ε')
-const int $epsilon  = 0x03B5;
+const int $epsilon = 0x03B5;
+
 /// Greek small letter zeta ('ζ')
-const int $zeta     = 0x03B6;
+const int $zeta = 0x03B6;
+
 /// Greek small letter eta ('η')
-const int $eta      = 0x03B7;
+const int $eta = 0x03B7;
+
 /// Greek small letter theta ('θ')
-const int $theta    = 0x03B8;
+const int $theta = 0x03B8;
+
 /// Greek small letter iota ('ι')
-const int $iota     = 0x03B9;
+const int $iota = 0x03B9;
+
 /// Greek small letter kappa ('κ')
-const int $kappa    = 0x03BA;
+const int $kappa = 0x03BA;
+
 /// Greek small letter lambda ('λ')
-const int $lambda   = 0x03BB;
+const int $lambda = 0x03BB;
+
 /// Greek small letter mu ('μ')
-const int $mu       = 0x03BC;
+const int $mu = 0x03BC;
+
 /// Greek small letter nu ('ν')
-const int $nu       = 0x03BD;
+const int $nu = 0x03BD;
+
 /// Greek small letter xi ('ξ')
-const int $xi       = 0x03BE;
+const int $xi = 0x03BE;
+
 /// Greek small letter omicron ('ο')
-const int $omicron  = 0x03BF;
+const int $omicron = 0x03BF;
+
 /// Greek small letter pi ('π')
-const int $pi       = 0x03C0;
+const int $pi = 0x03C0;
+
 /// Greek small letter rho ('ρ')
-const int $rho      = 0x03C1;
+const int $rho = 0x03C1;
+
 /// Greek small letter final sigma ('ς')
-const int $sigmaf   = 0x03C2;
+const int $sigmaf = 0x03C2;
+
 /// Greek small letter sigma ('σ')
-const int $sigma    = 0x03C3;
+const int $sigma = 0x03C3;
+
 /// Greek small letter tau ('τ')
-const int $tau      = 0x03C4;
+const int $tau = 0x03C4;
+
 /// Greek small letter upsilon ('υ')
-const int $upsilon  = 0x03C5;
+const int $upsilon = 0x03C5;
+
 /// Greek small letter phi ('φ')
-const int $phi      = 0x03C6;
+const int $phi = 0x03C6;
+
 /// Greek small letter chi ('χ')
-const int $chi      = 0x03C7;
+const int $chi = 0x03C7;
+
 /// Greek small letter psi ('ψ')
-const int $psi      = 0x03C8;
+const int $psi = 0x03C8;
+
 /// Greek small letter omega ('ω')
-const int $omega    = 0x03C9;
+const int $omega = 0x03C9;
+
 /// Greek theta symbol ('ϑ')
 const int $thetasym = 0x03D1;
+
 /// Greek Upsilon with hook symbol ('ϒ')
-const int $upsih    = 0x03D2;
+const int $upsih = 0x03D2;
+
 /// Greek pi symbol ('ϖ')
-const int $piv      = 0x03D6;
+const int $piv = 0x03D6;
+
 /// en space
-const int $ensp     = 0x2002;
+const int $ensp = 0x2002;
+
 /// em space
-const int $emsp     = 0x2003;
+const int $emsp = 0x2003;
+
 /// thin space
-const int $thinsp   = 0x2009;
+const int $thinsp = 0x2009;
+
 /// zero-width non-joiner
-const int $zwnj     = 0x200C;
+const int $zwnj = 0x200C;
+
 /// zero-width joiner
-const int $zwj      = 0x200D;
+const int $zwj = 0x200D;
+
 /// left-to-right mark
-const int $lrm      = 0x200E;
+const int $lrm = 0x200E;
+
 /// right-to-left mark
-const int $rlm      = 0x200F;
+const int $rlm = 0x200F;
+
 /// en dash ('–')
-const int $ndash    = 0x2013;
+const int $ndash = 0x2013;
+
 /// em dash ('—')
-const int $mdash    = 0x2014;
+const int $mdash = 0x2014;
+
 /// left single quotation mark ('‘')
-const int $lsquo    = 0x2018;
+const int $lsquo = 0x2018;
+
 /// right single quotation mark ('’')
-const int $rsquo    = 0x2019;
+const int $rsquo = 0x2019;
+
 /// single low-9 quotation mark ('‚')
-const int $sbquo    = 0x201A;
+const int $sbquo = 0x201A;
+
 /// left double quotation mark ('“')
-const int $ldquo    = 0x201C;
+const int $ldquo = 0x201C;
+
 /// right double quotation mark ('”')
-const int $rdquo    = 0x201D;
+const int $rdquo = 0x201D;
+
 /// double low-9 quotation mark ('„')
-const int $bdquo    = 0x201E;
+const int $bdquo = 0x201E;
+
 /// dagger, obelisk ('†')
-const int $dagger   = 0x2020;
+const int $dagger = 0x2020;
+
 /// double dagger, double obelisk ('‡')
-const int $Dagger   = 0x2021;
+const int $Dagger = 0x2021;
+
 /// bullet (black small circle) ('•')
-const int $bull     = 0x2022;
+const int $bull = 0x2022;
+
 /// horizontal ellipsis (three dot leader) ('…')
-const int $hellip   = 0x2026;
+const int $hellip = 0x2026;
+
 /// per mille sign ('‰')
-const int $permil   = 0x2030;
+const int $permil = 0x2030;
+
 /// prime (minutes, feet) ('′')
-const int $prime    = 0x2032;
+const int $prime = 0x2032;
+
 /// double prime (seconds, inches) ('″')
-const int $Prime    = 0x2033;
+const int $Prime = 0x2033;
+
 /// single left-pointing angle quotation mark ('‹')
-const int $lsaquo   = 0x2039;
+const int $lsaquo = 0x2039;
+
 /// single right-pointing angle quotation mark ('›')
-const int $rsaquo   = 0x203A;
+const int $rsaquo = 0x203A;
+
 /// overline (spacing overscore) ('‾')
-const int $oline    = 0x203E;
+const int $oline = 0x203E;
+
 /// fraction slash (solidus) ('⁄')
-const int $frasl    = 0x2044;
+const int $frasl = 0x2044;
+
 /// euro sign ('€')
-const int $euro     = 0x20AC;
+const int $euro = 0x20AC;
+
 /// black-letter capital I (imaginary part) ('ℑ')
-const int $image    = 0x2111;
+const int $image = 0x2111;
+
 /// script capital P (power set, Weierstrass p) ('℘')
-const int $weierp   = 0x2118;
+const int $weierp = 0x2118;
+
 /// black-letter capital R (real part symbol) ('ℜ')
-const int $real     = 0x211C;
+const int $real = 0x211C;
+
 /// trademark symbol ('™')
-const int $trade    = 0x2122;
+const int $trade = 0x2122;
+
 /// alef symbol (first transfinite cardinal) ('ℵ')
-const int $alefsym  = 0x2135;
+const int $alefsym = 0x2135;
+
 /// leftwards arrow ('←')
-const int $larr     = 0x2190;
+const int $larr = 0x2190;
+
 /// upwards arrow ('↑')
-const int $uarr     = 0x2191;
+const int $uarr = 0x2191;
+
 /// rightwards arrow ('→')
-const int $rarr     = 0x2192;
+const int $rarr = 0x2192;
+
 /// downwards arrow ('↓')
-const int $darr     = 0x2193;
+const int $darr = 0x2193;
+
 /// left right arrow ('↔')
-const int $harr     = 0x2194;
+const int $harr = 0x2194;
+
 /// downwards arrow with corner leftwards (carriage return) ('↵')
-const int $crarr    = 0x21B5;
+const int $crarr = 0x21B5;
+
 /// leftwards double arrow ('⇐')
-const int $lArr     = 0x21D0;
+const int $lArr = 0x21D0;
+
 /// upwards double arrow ('⇑')
-const int $uArr     = 0x21D1;
+const int $uArr = 0x21D1;
+
 /// rightwards double arrow ('⇒')
-const int $rArr     = 0x21D2;
+const int $rArr = 0x21D2;
+
 /// downwards double arrow ('⇓')
-const int $dArr     = 0x21D3;
+const int $dArr = 0x21D3;
+
 /// left right double arrow ('⇔')
-const int $hArr     = 0x21D4;
+const int $hArr = 0x21D4;
+
 /// for all ('∀')
-const int $forall   = 0x2200;
+const int $forall = 0x2200;
+
 /// partial differential ('∂')
-const int $part     = 0x2202;
+const int $part = 0x2202;
+
 /// there exists ('∃')
-const int $exist    = 0x2203;
+const int $exist = 0x2203;
+
 /// empty set (null set); see also U+8960, ⌀ ('∅')
-const int $empty    = 0x2205;
+const int $empty = 0x2205;
+
 /// del or nabla (vector differential operator) ('∇')
-const int $nabla    = 0x2207;
+const int $nabla = 0x2207;
+
 /// element of ('∈')
-const int $isin     = 0x2208;
+const int $isin = 0x2208;
+
 /// not an element of ('∉')
-const int $notin    = 0x2209;
+const int $notin = 0x2209;
+
 /// contains as member ('∋')
-const int $ni       = 0x220B;
+const int $ni = 0x220B;
+
 /// n-ary product (product sign) ('∏')
-const int $prod     = 0x220F;
+const int $prod = 0x220F;
+
 /// n-ary summation ('∑')
-const int $sum      = 0x2211;
+const int $sum = 0x2211;
+
 /// minus sign ('−')
-const int $minus    = 0x2212;
+const int $minus = 0x2212;
+
 /// asterisk operator ('∗')
-const int $lowast   = 0x2217;
+const int $lowast = 0x2217;
+
 /// square root (radical sign) ('√')
-const int $radic    = 0x221A;
+const int $radic = 0x221A;
+
 /// proportional to ('∝')
-const int $prop     = 0x221D;
+const int $prop = 0x221D;
+
 /// infinity ('∞')
-const int $infin    = 0x221E;
+const int $infin = 0x221E;
+
 /// angle ('∠')
-const int $ang      = 0x2220;
+const int $ang = 0x2220;
+
 /// logical and (wedge) ('∧')
-const int $and      = 0x2227;
+const int $and = 0x2227;
+
 /// logical or (vee) ('∨')
-const int $or       = 0x2228;
+const int $or = 0x2228;
+
 /// intersection (cap) ('∩')
-const int $cap      = 0x2229;
+const int $cap = 0x2229;
+
 /// union (cup) ('∪')
-const int $cup      = 0x222A;
+const int $cup = 0x222A;
+
 /// integral ('∫')
-const int $int      = 0x222B;
+const int $int = 0x222B;
+
 /// therefore sign ('∴')
-const int $there4   = 0x2234;
+const int $there4 = 0x2234;
+
 /// tilde operator (varies with, similar to) ('∼')
-const int $sim      = 0x223C;
+const int $sim = 0x223C;
+
 /// congruent to ('≅')
-const int $cong     = 0x2245;
+const int $cong = 0x2245;
+
 /// almost equal to (asymptotic to) ('≈')
-const int $asymp    = 0x2248;
+const int $asymp = 0x2248;
+
 /// not equal to ('≠')
-const int $ne       = 0x2260;
+const int $ne = 0x2260;
+
 /// identical to; sometimes used for 'equivalent to' ('≡')
-const int $equiv    = 0x2261;
+const int $equiv = 0x2261;
+
 /// less-than or equal to ('≤')
-const int $le       = 0x2264;
+const int $le = 0x2264;
+
 /// greater-than or equal to ('≥')
-const int $ge       = 0x2265;
+const int $ge = 0x2265;
+
 /// subset of ('⊂')
-const int $sub      = 0x2282;
+const int $sub = 0x2282;
+
 /// superset of ('⊃')
-const int $sup      = 0x2283;
+const int $sup = 0x2283;
+
 /// not a subset of ('⊄')
-const int $nsub     = 0x2284;
+const int $nsub = 0x2284;
+
 /// subset of or equal to ('⊆')
-const int $sube     = 0x2286;
+const int $sube = 0x2286;
+
 /// superset of or equal to ('⊇')
-const int $supe     = 0x2287;
+const int $supe = 0x2287;
+
 /// circled plus (direct sum) ('⊕')
-const int $oplus    = 0x2295;
+const int $oplus = 0x2295;
+
 /// circled times (vector product) ('⊗')
-const int $otimes   = 0x2297;
+const int $otimes = 0x2297;
+
 /// up tack (orthogonal to, perpendicular) ('⊥')
-const int $perp     = 0x22A5;
+const int $perp = 0x22A5;
+
 /// dot operator ('⋅')
-const int $sdot     = 0x22C5;
+const int $sdot = 0x22C5;
+
 /// vertical ellipsis ('⋮')
-const int $vellip   = 0x22EE;
+const int $vellip = 0x22EE;
+
 /// left ceiling (APL upstile) ('⌈')
-const int $lceil    = 0x2308;
+const int $lceil = 0x2308;
+
 /// right ceiling ('⌉')
-const int $rceil    = 0x2309;
+const int $rceil = 0x2309;
+
 /// left floor (APL downstile) ('⌊')
-const int $lfloor   = 0x230A;
+const int $lfloor = 0x230A;
+
 /// right floor ('⌋')
-const int $rfloor   = 0x230B;
+const int $rfloor = 0x230B;
+
 /// left-pointing angle bracket (bra) ('⟨')
-const int $lang     = 0x2329;
+const int $lang = 0x2329;
+
 /// right-pointing angle bracket (ket) ('⟩')
-const int $rang     = 0x232A;
+const int $rang = 0x232A;
+
 /// lozenge ('◊')
-const int $loz      = 0x25CA;
+const int $loz = 0x25CA;
+
 /// black spade suit ('♠')
-const int $spades   = 0x2660;
+const int $spades = 0x2660;
+
 /// black club suit (shamrock) ('♣')
-const int $clubs    = 0x2663;
+const int $clubs = 0x2663;
+
 /// black heart suit (valentine) ('♥')
-const int $hearts   = 0x2665;
+const int $hearts = 0x2665;
+
 /// black diamond suit ('♦')
-const int $diams    = 0x2666;
+const int $diams = 0x2666;
diff --git a/pubspec.yaml b/pubspec.yaml
index 6494810..2a13d51 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,6 +1,5 @@
 name: charcode
-version: 1.1.0
-author: Dart Team <misc@dartlang.org>
+version: 1.2.0
 description: >
   Constants for ASCII and common non-ASCII character codes.
 
@@ -9,4 +8,7 @@
   This library declares readable symbolic names for character codes.
 homepage: http://www.dartlang.org
 environment:
-  sdk: '>=1.0.0 <2.0.0'
+  sdk: '>=2.9.0-18.0 <2.9.0'
+
+dependencies:
+  pedantic: '>=1.9.0 <2.0.0'