Add the package's contents. (#1)

diff --git a/README.md b/README.md
index 44458b0..5459994 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,42 @@
-This library contains getters for useful semantic symbols. Because `cmd.exe` on
-Windows can't display Unicode, it also provides a mode where the symbols are
-replaced with plain-ASCII equivalents.
+This library contains getters for useful Unicode glyphs as well as plain ASCII
+alternatives. It's intended to be used in command-line applications that may run
+on Windows and libraries that may be used by those applications.
+
+We recommend that you import this library with the prefix "glyph". For example:
+
+```dart
+import 'package:term_glyph/term_glyph.dart' as glyph;
+
+/// Formats [items] into a bulleted list, with one item per line.
+String bulletedList(List<String> items) =>
+    items.map((item) => "${glyph.bullet} $item").join("\n");
+```
+
+## ASCII Mode
+
+The default Windows `cmd.exe` shell is unable to display Unicode characters, so
+this package is able to transparently switch its glyphs to ASCII alternatives by
+setting [the `ascii` attribute][ascii]. When this attribute is `true`, all
+glyphs use ASCII characters instead. It currently defaults to `false`, although
+in the future it may default to `true` for applications running on the Dart VM
+on Windows. For example:
+
+[ascii]: https://www.dartdocs.org/documentation/term_glyph/latest/term_glyph/ascii.html
+
+```dart
+import 'dart:io';
+
+import 'package:term_glyph/term_glyph.dart' as glyph;
+
+void main() {
+  glyph.ascii = Platform.isWindows;
+
+  // Prints "Unicode => ASCII" on Windows, "Unicode ━▶ ASCII" everywhere else.
+  print("Unicode ${glyph.rightArrow} ASCII");
+}
+```
+
+All ASCII glyphs are guaranteed to be the same number of characters as the
+corresponding Unicode glyphs, so that they line up properly when printed on a
+terminal. The specific ASCII text for a given Unicode glyph may change over
+time; this is not considered a breaking change.
diff --git a/data.csv b/data.csv
new file mode 100644
index 0000000..92a72f7
--- /dev/null
+++ b/data.csv
@@ -0,0 +1,85 @@
+# Miscellaneous
+bullet,•,*,A bullet point.
+
+# Arrows
+leftArrow,←,<,"A left-pointing arrow.
+
+Note that the Unicode arrow glyphs may overlap with adjacent characters in some
+terminal fonts, and should generally be surrounding by spaces."
+rightArrow,→,>,"A right-pointing arrow.
+
+Note that the Unicode arrow glyphs may overlap with adjacent characters in some
+terminal fonts, and should generally be surrounding by spaces."
+upArrow,↑,^,An upwards-pointing arrow.
+downArrow,↓,v,A downwards-pointing arrow.
+longLeftArrow,◀━,<=,A two-character left-pointing arrow.
+longRightArrow,━▶,=>,A two-character right-pointing arrow.
+
+# Box drawing characters
+
+## Normal
+horizontalLine,─,-,A horizontal line that can be used to draw a box.
+verticalLine,│,|,A vertical line that can be used to draw a box.
+topLeftCorner,┌,",",The upper left-hand corner of a box.
+topRightCorner,┐,",",The upper right-hand corner of a box.
+bottomLeftCorner,└,',The lower left-hand corner of a box.
+bottomRightCorner,┘,',The lower right-hand corner of a box.
+cross,┼,+,An intersection of vertical and horizontal box lines.
+teeUp,┴,+,A horizontal box line with a vertical line going up from the middle.
+teeDown,┬,+,A horizontal box line with a vertical line going down from the middle.
+teeLeft,┤,+,A vertical box line with a horizontal line going left from the middle.
+teeRight,├,+,A vertical box line with a horizontal line going right from the middle.
+upEnd,╵,',The top half of a vertical box line.
+downEnd,╷,",",The bottom half of a vertical box line.
+leftEnd,╴,-,The left half of a horizontal box line.
+rightEnd,╶,-,The right half of a horizontal box line.
+
+## Bold
+horizontalLineBold,━,=,A bold horizontal line that can be used to draw a box.
+verticalLineBold,┃,|,A bold vertical line that can be used to draw a box.
+topLeftCornerBold,┏,",",The bold upper left-hand corner of a box.
+topRightCornerBold,┓,",",The bold upper right-hand corner of a box.
+bottomLeftCornerBold,┗,',The bold lower left-hand corner of a box.
+bottomRightCornerBold,┛,',The bold lower right-hand corner of a box.
+crossBold,╋,+,An intersection of bold vertical and horizontal box lines.
+teeUpBold,┻,+,A bold horizontal box line with a vertical line going up from the middle.
+teeDownBold,┳,+,A bold horizontal box line with a vertical line going down from the middle.
+teeLeftBold,┫,+,A bold vertical box line with a horizontal line going left from the middle.
+teeRightBold,┣,+,A bold vertical box line with a horizontal line going right from the middle.
+upEndBold,╹,',The top half of a bold vertical box line.
+downEndBold,╻,",",The bottom half of a bold vertical box line.
+leftEndBold,╸,-,The left half of a bold horizontal box line.
+rightEndBold,╺,-,The right half of a bold horizontal box line.
+
+## Double
+horizontalLineDouble,═,=,A double horizontal line that can be used to draw a box.
+verticalLineDouble,║,|,A double vertical line that can be used to draw a box.
+topLeftCornerDouble,╔,",",The double upper left-hand corner of a box.
+topRightCornerDouble,╗,",",The double upper right-hand corner of a box.
+bottomLeftCornerDouble,╚,"""",The double lower left-hand corner of a box.
+bottomRightCornerDouble,╝,"""",The double lower right-hand corner of a box.
+crossDouble,╬,+,An intersection of double vertical and horizontal box lines.
+teeUpDouble,╩,+,A double horizontal box line with a vertical line going up from the middle.
+teeDownDouble,╦,+,A double horizontal box line with a vertical line going down from the middle.
+teeLeftDouble,╣,+,A double vertical box line with a horizontal line going left from the middle.
+teeRightDouble,╠,+,A double vertical box line with a horizontal line going right from the middle.
+
+## Dashed
+
+### Double
+horizontalLineDoubleDash,╌,-,A dashed horizontal line that can be used to draw a box.
+horizontalLineDoubleDashBold,╍,-,A bold dashed horizontal line that can be used to draw a box.
+verticalLineDoubleDash,╎,|,A dashed vertical line that can be used to draw a box.
+verticalLineDoubleDashBold,╏,|,A bold dashed vertical line that can be used to draw a box.
+
+### Triple
+horizontalLineTripleDash,┄,-,A dashed horizontal line that can be used to draw a box.
+horizontalLineTripleDashBold,┅,-,A bold dashed horizontal line that can be used to draw a box.
+verticalLineTripleDash,┆,|,A dashed vertical line that can be used to draw a box.
+verticalLineTripleDashBold,┇,|,A bold dashed vertical line that can be used to draw a box.
+
+### Quadruple
+horizontalLineQuadrupleDash,┈,-,A dashed horizontal line that can be used to draw a box.
+horizontalLineQuadrupleDashBold,┉,-,A bold dashed horizontal line that can be used to draw a box.
+verticalLineQuadrupleDash,┊,|,A dashed vertical line that can be used to draw a box.
+verticalLineQuadrupleDashBold,┋,|,A bold dashed vertical line that can be used to draw a box.
diff --git a/lib/src/generated.dart b/lib/src/generated.dart
new file mode 100644
index 0000000..e1b83d1
--- /dev/null
+++ b/lib/src/generated.dart
@@ -0,0 +1,564 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Don't modify this file by hand! It's generated by tool/generate.dart.
+
+/// Whether the glyph getters return plain ASCII, as opposed to Unicode
+/// characters or sequences.
+///
+/// Defaults to `false`.
+bool get ascii => _ascii;
+var _ascii = false;
+set ascii(bool value) {
+  _ascii = value;
+  if (value) {
+    _bullet = "*";
+    _leftArrow = "<";
+    _rightArrow = ">";
+    _upArrow = "^";
+    _downArrow = "v";
+    _longLeftArrow = "<=";
+    _longRightArrow = "=>";
+    _horizontalLine = "-";
+    _verticalLine = "|";
+    _topLeftCorner = ",";
+    _topRightCorner = ",";
+    _bottomLeftCorner = "'";
+    _bottomRightCorner = "'";
+    _cross = "+";
+    _teeUp = "+";
+    _teeDown = "+";
+    _teeLeft = "+";
+    _teeRight = "+";
+    _upEnd = "'";
+    _downEnd = ",";
+    _leftEnd = "-";
+    _rightEnd = "-";
+    _horizontalLineBold = "=";
+    _verticalLineBold = "|";
+    _topLeftCornerBold = ",";
+    _topRightCornerBold = ",";
+    _bottomLeftCornerBold = "'";
+    _bottomRightCornerBold = "'";
+    _crossBold = "+";
+    _teeUpBold = "+";
+    _teeDownBold = "+";
+    _teeLeftBold = "+";
+    _teeRightBold = "+";
+    _upEndBold = "'";
+    _downEndBold = ",";
+    _leftEndBold = "-";
+    _rightEndBold = "-";
+    _horizontalLineDouble = "=";
+    _verticalLineDouble = "|";
+    _topLeftCornerDouble = ",";
+    _topRightCornerDouble = ",";
+    _bottomLeftCornerDouble = '"';
+    _bottomRightCornerDouble = '"';
+    _crossDouble = "+";
+    _teeUpDouble = "+";
+    _teeDownDouble = "+";
+    _teeLeftDouble = "+";
+    _teeRightDouble = "+";
+    _horizontalLineDoubleDash = "-";
+    _horizontalLineDoubleDashBold = "-";
+    _verticalLineDoubleDash = "|";
+    _verticalLineDoubleDashBold = "|";
+    _horizontalLineTripleDash = "-";
+    _horizontalLineTripleDashBold = "-";
+    _verticalLineTripleDash = "|";
+    _verticalLineTripleDashBold = "|";
+    _horizontalLineQuadrupleDash = "-";
+    _horizontalLineQuadrupleDashBold = "-";
+    _verticalLineQuadrupleDash = "|";
+    _verticalLineQuadrupleDashBold = "|";
+  } else {
+    _bullet = "•";
+    _leftArrow = "←";
+    _rightArrow = "→";
+    _upArrow = "↑";
+    _downArrow = "↓";
+    _longLeftArrow = "◀━";
+    _longRightArrow = "━▶";
+    _horizontalLine = "─";
+    _verticalLine = "│";
+    _topLeftCorner = "┌";
+    _topRightCorner = "┐";
+    _bottomLeftCorner = "└";
+    _bottomRightCorner = "┘";
+    _cross = "┼";
+    _teeUp = "┴";
+    _teeDown = "┬";
+    _teeLeft = "┤";
+    _teeRight = "├";
+    _upEnd = "╵";
+    _downEnd = "╷";
+    _leftEnd = "╴";
+    _rightEnd = "╶";
+    _horizontalLineBold = "━";
+    _verticalLineBold = "┃";
+    _topLeftCornerBold = "┏";
+    _topRightCornerBold = "┓";
+    _bottomLeftCornerBold = "┗";
+    _bottomRightCornerBold = "┛";
+    _crossBold = "╋";
+    _teeUpBold = "┻";
+    _teeDownBold = "┳";
+    _teeLeftBold = "┫";
+    _teeRightBold = "┣";
+    _upEndBold = "╹";
+    _downEndBold = "╻";
+    _leftEndBold = "╸";
+    _rightEndBold = "╺";
+    _horizontalLineDouble = "═";
+    _verticalLineDouble = "║";
+    _topLeftCornerDouble = "╔";
+    _topRightCornerDouble = "╗";
+    _bottomLeftCornerDouble = "╚";
+    _bottomRightCornerDouble = "╝";
+    _crossDouble = "╬";
+    _teeUpDouble = "╩";
+    _teeDownDouble = "╦";
+    _teeLeftDouble = "╣";
+    _teeRightDouble = "╠";
+    _horizontalLineDoubleDash = "╌";
+    _horizontalLineDoubleDashBold = "╍";
+    _verticalLineDoubleDash = "╎";
+    _verticalLineDoubleDashBold = "╏";
+    _horizontalLineTripleDash = "┄";
+    _horizontalLineTripleDashBold = "┅";
+    _verticalLineTripleDash = "┆";
+    _verticalLineTripleDashBold = "┇";
+    _horizontalLineQuadrupleDash = "┈";
+    _horizontalLineQuadrupleDashBold = "┉";
+    _verticalLineQuadrupleDash = "┊";
+    _verticalLineQuadrupleDashBold = "┋";
+  }
+}
+
+/// A bullet point.
+///
+/// If [ascii] is `false`, this is "•". If it's `true`, this is
+/// "*" instead.
+String get bullet => _bullet;
+var _bullet = "•";
+
+/// A left-pointing arrow.
+///
+/// Note that the Unicode arrow glyphs may overlap with adjacent characters in some
+/// terminal fonts, and should generally be surrounding by spaces.
+///
+/// If [ascii] is `false`, this is "←". If it's `true`, this is
+/// "<" instead.
+String get leftArrow => _leftArrow;
+var _leftArrow = "←";
+
+/// A right-pointing arrow.
+///
+/// Note that the Unicode arrow glyphs may overlap with adjacent characters in some
+/// terminal fonts, and should generally be surrounding by spaces.
+///
+/// If [ascii] is `false`, this is "→". If it's `true`, this is
+/// ">" instead.
+String get rightArrow => _rightArrow;
+var _rightArrow = "→";
+
+/// An upwards-pointing arrow.
+///
+/// If [ascii] is `false`, this is "↑". If it's `true`, this is
+/// "^" instead.
+String get upArrow => _upArrow;
+var _upArrow = "↑";
+
+/// A downwards-pointing arrow.
+///
+/// If [ascii] is `false`, this is "↓". If it's `true`, this is
+/// "v" instead.
+String get downArrow => _downArrow;
+var _downArrow = "↓";
+
+/// A two-character left-pointing arrow.
+///
+/// If [ascii] is `false`, this is "◀━". If it's `true`, this is
+/// "<=" instead.
+String get longLeftArrow => _longLeftArrow;
+var _longLeftArrow = "◀━";
+
+/// A two-character right-pointing arrow.
+///
+/// If [ascii] is `false`, this is "━▶". If it's `true`, this is
+/// "=>" instead.
+String get longRightArrow => _longRightArrow;
+var _longRightArrow = "━▶";
+
+/// A horizontal line that can be used to draw a box.
+///
+/// If [ascii] is `false`, this is "─". If it's `true`, this is
+/// "-" instead.
+String get horizontalLine => _horizontalLine;
+var _horizontalLine = "─";
+
+/// A vertical line that can be used to draw a box.
+///
+/// If [ascii] is `false`, this is "│". If it's `true`, this is
+/// "|" instead.
+String get verticalLine => _verticalLine;
+var _verticalLine = "│";
+
+/// The upper left-hand corner of a box.
+///
+/// If [ascii] is `false`, this is "┌". If it's `true`, this is
+/// "," instead.
+String get topLeftCorner => _topLeftCorner;
+var _topLeftCorner = "┌";
+
+/// The upper right-hand corner of a box.
+///
+/// If [ascii] is `false`, this is "┐". If it's `true`, this is
+/// "," instead.
+String get topRightCorner => _topRightCorner;
+var _topRightCorner = "┐";
+
+/// The lower left-hand corner of a box.
+///
+/// If [ascii] is `false`, this is "└". If it's `true`, this is
+/// "'" instead.
+String get bottomLeftCorner => _bottomLeftCorner;
+var _bottomLeftCorner = "└";
+
+/// The lower right-hand corner of a box.
+///
+/// If [ascii] is `false`, this is "┘". If it's `true`, this is
+/// "'" instead.
+String get bottomRightCorner => _bottomRightCorner;
+var _bottomRightCorner = "┘";
+
+/// An intersection of vertical and horizontal box lines.
+///
+/// If [ascii] is `false`, this is "┼". If it's `true`, this is
+/// "+" instead.
+String get cross => _cross;
+var _cross = "┼";
+
+/// A horizontal box line with a vertical line going up from the middle.
+///
+/// If [ascii] is `false`, this is "┴". If it's `true`, this is
+/// "+" instead.
+String get teeUp => _teeUp;
+var _teeUp = "┴";
+
+/// A horizontal box line with a vertical line going down from the middle.
+///
+/// If [ascii] is `false`, this is "┬". If it's `true`, this is
+/// "+" instead.
+String get teeDown => _teeDown;
+var _teeDown = "┬";
+
+/// A vertical box line with a horizontal line going left from the middle.
+///
+/// If [ascii] is `false`, this is "┤". If it's `true`, this is
+/// "+" instead.
+String get teeLeft => _teeLeft;
+var _teeLeft = "┤";
+
+/// A vertical box line with a horizontal line going right from the middle.
+///
+/// If [ascii] is `false`, this is "├". If it's `true`, this is
+/// "+" instead.
+String get teeRight => _teeRight;
+var _teeRight = "├";
+
+/// The top half of a vertical box line.
+///
+/// If [ascii] is `false`, this is "╵". If it's `true`, this is
+/// "'" instead.
+String get upEnd => _upEnd;
+var _upEnd = "╵";
+
+/// The bottom half of a vertical box line.
+///
+/// If [ascii] is `false`, this is "╷". If it's `true`, this is
+/// "," instead.
+String get downEnd => _downEnd;
+var _downEnd = "╷";
+
+/// The left half of a horizontal box line.
+///
+/// If [ascii] is `false`, this is "╴". If it's `true`, this is
+/// "-" instead.
+String get leftEnd => _leftEnd;
+var _leftEnd = "╴";
+
+/// The right half of a horizontal box line.
+///
+/// If [ascii] is `false`, this is "╶". If it's `true`, this is
+/// "-" instead.
+String get rightEnd => _rightEnd;
+var _rightEnd = "╶";
+
+/// A bold horizontal line that can be used to draw a box.
+///
+/// If [ascii] is `false`, this is "━". If it's `true`, this is
+/// "=" instead.
+String get horizontalLineBold => _horizontalLineBold;
+var _horizontalLineBold = "━";
+
+/// A bold vertical line that can be used to draw a box.
+///
+/// If [ascii] is `false`, this is "┃". If it's `true`, this is
+/// "|" instead.
+String get verticalLineBold => _verticalLineBold;
+var _verticalLineBold = "┃";
+
+/// The bold upper left-hand corner of a box.
+///
+/// If [ascii] is `false`, this is "┏". If it's `true`, this is
+/// "," instead.
+String get topLeftCornerBold => _topLeftCornerBold;
+var _topLeftCornerBold = "┏";
+
+/// The bold upper right-hand corner of a box.
+///
+/// If [ascii] is `false`, this is "┓". If it's `true`, this is
+/// "," instead.
+String get topRightCornerBold => _topRightCornerBold;
+var _topRightCornerBold = "┓";
+
+/// The bold lower left-hand corner of a box.
+///
+/// If [ascii] is `false`, this is "┗". If it's `true`, this is
+/// "'" instead.
+String get bottomLeftCornerBold => _bottomLeftCornerBold;
+var _bottomLeftCornerBold = "┗";
+
+/// The bold lower right-hand corner of a box.
+///
+/// If [ascii] is `false`, this is "┛". If it's `true`, this is
+/// "'" instead.
+String get bottomRightCornerBold => _bottomRightCornerBold;
+var _bottomRightCornerBold = "┛";
+
+/// An intersection of bold vertical and horizontal box lines.
+///
+/// If [ascii] is `false`, this is "╋". If it's `true`, this is
+/// "+" instead.
+String get crossBold => _crossBold;
+var _crossBold = "╋";
+
+/// A bold horizontal box line with a vertical line going up from the middle.
+///
+/// If [ascii] is `false`, this is "┻". If it's `true`, this is
+/// "+" instead.
+String get teeUpBold => _teeUpBold;
+var _teeUpBold = "┻";
+
+/// A bold horizontal box line with a vertical line going down from the middle.
+///
+/// If [ascii] is `false`, this is "┳". If it's `true`, this is
+/// "+" instead.
+String get teeDownBold => _teeDownBold;
+var _teeDownBold = "┳";
+
+/// A bold vertical box line with a horizontal line going left from the middle.
+///
+/// If [ascii] is `false`, this is "┫". If it's `true`, this is
+/// "+" instead.
+String get teeLeftBold => _teeLeftBold;
+var _teeLeftBold = "┫";
+
+/// A bold vertical box line with a horizontal line going right from the middle.
+///
+/// If [ascii] is `false`, this is "┣". If it's `true`, this is
+/// "+" instead.
+String get teeRightBold => _teeRightBold;
+var _teeRightBold = "┣";
+
+/// The top half of a bold vertical box line.
+///
+/// If [ascii] is `false`, this is "╹". If it's `true`, this is
+/// "'" instead.
+String get upEndBold => _upEndBold;
+var _upEndBold = "╹";
+
+/// The bottom half of a bold vertical box line.
+///
+/// If [ascii] is `false`, this is "╻". If it's `true`, this is
+/// "," instead.
+String get downEndBold => _downEndBold;
+var _downEndBold = "╻";
+
+/// The left half of a bold horizontal box line.
+///
+/// If [ascii] is `false`, this is "╸". If it's `true`, this is
+/// "-" instead.
+String get leftEndBold => _leftEndBold;
+var _leftEndBold = "╸";
+
+/// The right half of a bold horizontal box line.
+///
+/// If [ascii] is `false`, this is "╺". If it's `true`, this is
+/// "-" instead.
+String get rightEndBold => _rightEndBold;
+var _rightEndBold = "╺";
+
+/// A double horizontal line that can be used to draw a box.
+///
+/// If [ascii] is `false`, this is "═". If it's `true`, this is
+/// "=" instead.
+String get horizontalLineDouble => _horizontalLineDouble;
+var _horizontalLineDouble = "═";
+
+/// A double vertical line that can be used to draw a box.
+///
+/// If [ascii] is `false`, this is "║". If it's `true`, this is
+/// "|" instead.
+String get verticalLineDouble => _verticalLineDouble;
+var _verticalLineDouble = "║";
+
+/// The double upper left-hand corner of a box.
+///
+/// If [ascii] is `false`, this is "╔". If it's `true`, this is
+/// "," instead.
+String get topLeftCornerDouble => _topLeftCornerDouble;
+var _topLeftCornerDouble = "╔";
+
+/// The double upper right-hand corner of a box.
+///
+/// If [ascii] is `false`, this is "╗". If it's `true`, this is
+/// "," instead.
+String get topRightCornerDouble => _topRightCornerDouble;
+var _topRightCornerDouble = "╗";
+
+/// The double lower left-hand corner of a box.
+///
+/// If [ascii] is `false`, this is "╚". If it's `true`, this is
+/// """ instead.
+String get bottomLeftCornerDouble => _bottomLeftCornerDouble;
+var _bottomLeftCornerDouble = "╚";
+
+/// The double lower right-hand corner of a box.
+///
+/// If [ascii] is `false`, this is "╝". If it's `true`, this is
+/// """ instead.
+String get bottomRightCornerDouble => _bottomRightCornerDouble;
+var _bottomRightCornerDouble = "╝";
+
+/// An intersection of double vertical and horizontal box lines.
+///
+/// If [ascii] is `false`, this is "╬". If it's `true`, this is
+/// "+" instead.
+String get crossDouble => _crossDouble;
+var _crossDouble = "╬";
+
+/// A double horizontal box line with a vertical line going up from the middle.
+///
+/// If [ascii] is `false`, this is "╩". If it's `true`, this is
+/// "+" instead.
+String get teeUpDouble => _teeUpDouble;
+var _teeUpDouble = "╩";
+
+/// A double horizontal box line with a vertical line going down from the middle.
+///
+/// If [ascii] is `false`, this is "╦". If it's `true`, this is
+/// "+" instead.
+String get teeDownDouble => _teeDownDouble;
+var _teeDownDouble = "╦";
+
+/// A double vertical box line with a horizontal line going left from the middle.
+///
+/// If [ascii] is `false`, this is "╣". If it's `true`, this is
+/// "+" instead.
+String get teeLeftDouble => _teeLeftDouble;
+var _teeLeftDouble = "╣";
+
+/// A double vertical box line with a horizontal line going right from the middle.
+///
+/// If [ascii] is `false`, this is "╠". If it's `true`, this is
+/// "+" instead.
+String get teeRightDouble => _teeRightDouble;
+var _teeRightDouble = "╠";
+
+/// A dashed horizontal line that can be used to draw a box.
+///
+/// If [ascii] is `false`, this is "╌". If it's `true`, this is
+/// "-" instead.
+String get horizontalLineDoubleDash => _horizontalLineDoubleDash;
+var _horizontalLineDoubleDash = "╌";
+
+/// A bold dashed horizontal line that can be used to draw a box.
+///
+/// If [ascii] is `false`, this is "╍". If it's `true`, this is
+/// "-" instead.
+String get horizontalLineDoubleDashBold => _horizontalLineDoubleDashBold;
+var _horizontalLineDoubleDashBold = "╍";
+
+/// A dashed vertical line that can be used to draw a box.
+///
+/// If [ascii] is `false`, this is "╎". If it's `true`, this is
+/// "|" instead.
+String get verticalLineDoubleDash => _verticalLineDoubleDash;
+var _verticalLineDoubleDash = "╎";
+
+/// A bold dashed vertical line that can be used to draw a box.
+///
+/// If [ascii] is `false`, this is "╏". If it's `true`, this is
+/// "|" instead.
+String get verticalLineDoubleDashBold => _verticalLineDoubleDashBold;
+var _verticalLineDoubleDashBold = "╏";
+
+/// A dashed horizontal line that can be used to draw a box.
+///
+/// If [ascii] is `false`, this is "┄". If it's `true`, this is
+/// "-" instead.
+String get horizontalLineTripleDash => _horizontalLineTripleDash;
+var _horizontalLineTripleDash = "┄";
+
+/// A bold dashed horizontal line that can be used to draw a box.
+///
+/// If [ascii] is `false`, this is "┅". If it's `true`, this is
+/// "-" instead.
+String get horizontalLineTripleDashBold => _horizontalLineTripleDashBold;
+var _horizontalLineTripleDashBold = "┅";
+
+/// A dashed vertical line that can be used to draw a box.
+///
+/// If [ascii] is `false`, this is "┆". If it's `true`, this is
+/// "|" instead.
+String get verticalLineTripleDash => _verticalLineTripleDash;
+var _verticalLineTripleDash = "┆";
+
+/// A bold dashed vertical line that can be used to draw a box.
+///
+/// If [ascii] is `false`, this is "┇". If it's `true`, this is
+/// "|" instead.
+String get verticalLineTripleDashBold => _verticalLineTripleDashBold;
+var _verticalLineTripleDashBold = "┇";
+
+/// A dashed horizontal line that can be used to draw a box.
+///
+/// If [ascii] is `false`, this is "┈". If it's `true`, this is
+/// "-" instead.
+String get horizontalLineQuadrupleDash => _horizontalLineQuadrupleDash;
+var _horizontalLineQuadrupleDash = "┈";
+
+/// A bold dashed horizontal line that can be used to draw a box.
+///
+/// If [ascii] is `false`, this is "┉". If it's `true`, this is
+/// "-" instead.
+String get horizontalLineQuadrupleDashBold => _horizontalLineQuadrupleDashBold;
+var _horizontalLineQuadrupleDashBold = "┉";
+
+/// A dashed vertical line that can be used to draw a box.
+///
+/// If [ascii] is `false`, this is "┊". If it's `true`, this is
+/// "|" instead.
+String get verticalLineQuadrupleDash => _verticalLineQuadrupleDash;
+var _verticalLineQuadrupleDash = "┊";
+
+/// A bold dashed vertical line that can be used to draw a box.
+///
+/// If [ascii] is `false`, this is "┋". If it's `true`, this is
+/// "|" instead.
+String get verticalLineQuadrupleDashBold => _verticalLineQuadrupleDashBold;
+var _verticalLineQuadrupleDashBold = "┋";
diff --git a/lib/term_glyph.dart b/lib/term_glyph.dart
new file mode 100644
index 0000000..8582175
--- /dev/null
+++ b/lib/term_glyph.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+export 'src/generated.dart';
+
+import 'src/generated.dart';
+
+/// Returns [glyph] if Unicode glyph are allowed, and [alternative] if they
+/// aren't.
+String glyphOrAscii(String glyph, String alternative) =>
+    ascii ? alternative : glyph;
diff --git a/pubspec.yaml b/pubspec.yaml
index 275c2bf..4ba1efb 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,8 +1,13 @@
-name: symbol
-version: 1.0.0-dev
-description: Useful symbols and Windows-safe equivalents.
+name: term_glyph
+version: 1.0.0
+description: Useful glyphs and Windows-safe equivalents.
 author: Dart Team <misc@dartlang.org>
-homepage: https://github.com/dart-lang/symbol
+homepage: https://github.com/dart-lang/term_glyph
 
 environment:
   sdk: '>=1.8.0 <2.0.0'
+
+dev_dependencies:
+  csv: '^3.0.0'
+  dart_style: '^0.2.0'
+  test: '^0.12.0'
diff --git a/test/symbol_test.dart b/test/symbol_test.dart
new file mode 100644
index 0000000..e3f94e5
--- /dev/null
+++ b/test/symbol_test.dart
@@ -0,0 +1,41 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test/test.dart';
+
+import 'package:term_glyph/term_glyph.dart' as glyph;
+
+void main() {
+  group("with ascii = false", () {
+    setUpAll(() {
+      glyph.ascii = false;
+    });
+
+    test("glyphs return Unicode versions", () {
+      expect(glyph.topLeftCorner, equals("┌"));
+      expect(glyph.teeUpBold, equals("┻"));
+      expect(glyph.longLeftArrow, equals("◀━"));
+    });
+
+    test("glyphOrAscii returns the first argument", () {
+      expect(glyph.glyphOrAscii("A", "B"), equals("A"));
+    });
+  });
+
+  group("with ascii = true", () {
+    setUpAll(() {
+      glyph.ascii = true;
+    });
+
+    test("glyphs return ASCII versions", () {
+      expect(glyph.topLeftCorner, equals(","));
+      expect(glyph.teeUpBold, equals("+"));
+      expect(glyph.longLeftArrow, equals("<="));
+    });
+
+    test("glyphOrAscii returns the second argument", () {
+      expect(glyph.glyphOrAscii("A", "B"), equals("B"));
+    });
+  });
+}
diff --git a/tool/generate.dart b/tool/generate.dart
new file mode 100644
index 0000000..2e94b4c
--- /dev/null
+++ b/tool/generate.dart
@@ -0,0 +1,67 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+
+import 'package:csv/csv.dart';
+
+void main() {
+  var csv = new CsvCodec(eol: "\n");
+  var data = csv.decode(new File("data.csv").readAsStringSync());
+
+  // Remove comments and empty lines.
+  data.removeWhere((row) => row.length < 3);
+
+  var file = new File("lib/src/generated.dart").openSync(mode: FileMode.WRITE);
+  file.writeStringSync("""
+    // Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+    // for details. All rights reserved. Use of this source code is governed by a
+    // BSD-style license that can be found in the LICENSE file.
+
+    // Don't modify this file by hand! It's generated by tool/generate.dart.
+
+    /// Whether the glyph getters return plain ASCII, as opposed to Unicode
+    /// characters or sequences.
+    ///
+    /// Defaults to `false`.
+    bool get ascii => _ascii;
+    var _ascii = false;
+    set ascii(bool value) {
+      _ascii = value;
+      if (value) {
+  """);
+
+  for (var glyph in data) {
+    file.writeStringSync("_${glyph[0]} = ${_quote(glyph[2])};");
+  }
+
+  file.writeStringSync("} else {");
+
+  for (var glyph in data) {
+    file.writeStringSync("_${glyph[0]} = ${_quote(glyph[1])};");
+  }
+
+  file.writeStringSync("}}");
+
+  for (var glyph in data) {
+    for (var line in glyph[3].split("\n")) {
+      file.writeStringSync("/// $line\n");
+    }
+
+    file.writeStringSync("""
+      ///
+      /// If [ascii] is `false`, this is "${glyph[1]}". If it's `true`, this is
+      /// "${glyph[2]}" instead.
+      String get ${glyph[0]} => _${glyph[0]};
+      var _${glyph[0]} = ${_quote(glyph[1])};
+    """);
+  }
+
+  var result = Process.runSync(
+      "pub", ["run", "dart_style:format", "-w", "lib/src/generated.dart"]);
+  print(result.stderr);
+  exit(result.exitCode);
+}
+
+String _quote(String input) => input.contains('"') ? "'$input'" : '"$input"';