diff --git a/.github/ISSUE_TEMPLATE/term_glyph.md b/.github/ISSUE_TEMPLATE/term_glyph.md new file mode 100644 index 000000000..b6a47669c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/term_glyph.md @@ -0,0 +1,5 @@ +--- +name: "package:term_glyph" +about: "Create a bug or file a feature request against package:term_glyph." +labels: "package:term_glyph" +--- \ No newline at end of file diff --git a/.github/labeler.yml b/.github/labeler.yml index fd072d2aa..87232f5be 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -108,6 +108,10 @@ - changed-files: - any-glob-to-any-file: 'pkgs/sse/**' +'package:term_glyph': + - changed-files: + - any-glob-to-any-file: 'pkgs/term_glyph/**' + 'package:test_reflective_loader': - changed-files: - any-glob-to-any-file: 'pkgs/test_reflective_loader/**' diff --git a/.github/workflows/term_glyph.yaml b/.github/workflows/term_glyph.yaml new file mode 100644 index 000000000..5b3b3209b --- /dev/null +++ b/.github/workflows/term_glyph.yaml @@ -0,0 +1,72 @@ +name: package:term_glyph + +on: + # Run on PRs and pushes to the default branch. + push: + branches: [ main ] + paths: + - '.github/workflows/term_glyph.yaml' + - 'pkgs/term_glyph/**' + pull_request: + branches: [ main ] + paths: + - '.github/workflows/term_glyph.yaml' + - 'pkgs/term_glyph/**' + schedule: + - cron: "0 0 * * 0" + +env: + PUB_ENVIRONMENT: bot.github + + +defaults: + run: + working-directory: pkgs/term_glyph/ + +jobs: + # Check code formatting and static analysis on a single OS (linux) + # against Dart dev. + analyze: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + sdk: [dev] + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 + - uses: dart-lang/setup-dart@e630b99d28a3b71860378cafdc2a067c71107f94 + with: + sdk: ${{ matrix.sdk }} + - id: install + name: Install dependencies + run: dart pub get + - name: Check formatting + run: dart format --output=none --set-exit-if-changed . + if: always() && steps.install.outcome == 'success' + - name: Analyze code + run: dart analyze --fatal-infos + if: always() && steps.install.outcome == 'success' + + # Run tests on a matrix consisting of two dimensions: + # 1. OS: ubuntu-latest, (macos-latest, windows-latest) + # 2. release channel: dev + test: + needs: analyze + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + # Add macos-latest and/or windows-latest if relevant for this package. + os: [ubuntu-latest] + sdk: [3.1, dev] + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 + - uses: dart-lang/setup-dart@e630b99d28a3b71860378cafdc2a067c71107f94 + with: + sdk: ${{ matrix.sdk }} + - id: install + name: Install dependencies + run: dart pub get + - name: Run VM tests + run: dart test --platform vm + if: always() && steps.install.outcome == 'success' diff --git a/README.md b/README.md index 140d6e876..ddf2b52db 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,7 @@ don't naturally belong to other topic monorepos (like | [source_maps](pkgs/source_maps/) | A library to programmatically manipulate source map files. | [![package issues](https://img.shields.io/badge/package:source_maps-4774bc)](https://github.com/dart-lang/tools/issues?q=is%3Aissue+is%3Aopen+label%3Apackage%3Asource_maps) | [![pub package](https://img.shields.io/pub/v/source_maps.svg)](https://pub.dev/packages/source_maps) | | [source_span](pkgs/source_span/) | Provides a standard representation for source code locations and spans. | [![package issues](https://img.shields.io/badge/package:source_span-4774bc)](https://github.com/dart-lang/tools/issues?q=is%3Aissue+is%3Aopen+label%3Apackage%3Asource_span) | [![pub package](https://img.shields.io/pub/v/source_span.svg)](https://pub.dev/packages/source_span) | | [sse](pkgs/sse/) | Provides client and server functionality for setting up bi-directional communication through Server Sent Events (SSE) and corresponding POST requests. | [![package issues](https://img.shields.io/badge/package:sse-4774bc)](https://github.com/dart-lang/tools/issues?q=is%3Aissue+is%3Aopen+label%3Apackage%3Asse) | [![pub package](https://img.shields.io/pub/v/sse.svg)](https://pub.dev/packages/sse) | +| [term_glyph](pkgs/term_glyph/) | Useful Unicode glyphs and ASCII substitutes. | [![package issues](https://img.shields.io/badge/package:term_glyph-4774bc)](https://github.com/dart-lang/tools/issues?q=is%3Aissue+is%3Aopen+label%3Apackage%3Aterm_glyph) | [![pub package](https://img.shields.io/pub/v/term_glyph.svg)](https://pub.dev/packages/term_glyph) | | [test_reflective_loader](pkgs/test_reflective_loader/) | Support for discovering tests and test suites using reflection. | [![package issues](https://img.shields.io/badge/package:test_reflective_loader-4774bc)](https://github.com/dart-lang/tools/issues?q=is%3Aissue+is%3Aopen+label%3Apackage%3Atest_reflective_loader) | [![pub package](https://img.shields.io/pub/v/test_reflective_loader.svg)](https://pub.dev/packages/test_reflective_loader) | | [timing](pkgs/timing/) | A simple package for tracking the performance of synchronous and asynchronous actions. | [![package issues](https://img.shields.io/badge/package:timing-4774bc)](https://github.com/dart-lang/tools/issues?q=is%3Aissue+is%3Aopen+label%3Apackage%3Atiming) | [![pub package](https://img.shields.io/pub/v/timing.svg)](https://pub.dev/packages/timing) | | [unified_analytics](pkgs/unified_analytics/) | A package for logging analytics for all Dart and Flutter related tooling to Google Analytics. | [![package issues](https://img.shields.io/badge/package:unified_analytics-4774bc)](https://github.com/dart-lang/tools/issues?q=is%3Aissue+is%3Aopen+label%3Apackage%3Aunified_analytics) | [![pub package](https://img.shields.io/pub/v/unified_analytics.svg)](https://pub.dev/packages/unified_analytics) | diff --git a/pkgs/term_glyph/.gitignore b/pkgs/term_glyph/.gitignore new file mode 100644 index 000000000..01d42c084 --- /dev/null +++ b/pkgs/term_glyph/.gitignore @@ -0,0 +1,4 @@ +.dart_tool/ +.pub/ +.packages +pubspec.lock diff --git a/pkgs/term_glyph/AUTHORS b/pkgs/term_glyph/AUTHORS new file mode 100644 index 000000000..e8063a8cd --- /dev/null +++ b/pkgs/term_glyph/AUTHORS @@ -0,0 +1,6 @@ +# Below is a list of people and organizations that have contributed +# to the project. Names should be added to the list like so: +# +# Name/Organization + +Google Inc. diff --git a/pkgs/term_glyph/CHANGELOG.md b/pkgs/term_glyph/CHANGELOG.md new file mode 100644 index 000000000..b7359cfb7 --- /dev/null +++ b/pkgs/term_glyph/CHANGELOG.md @@ -0,0 +1,31 @@ +## 1.2.2 + +* Require Dart 3.1 +* Move to `dart-lang/tools` monorepo. + +## 1.2.1 + +* Migrate to `package:lints`. +* Populate the pubspec `repository` field. + +## 1.2.0 + +* Stable release for null safety. +* Update SDK constraints to `>=2.12.0-0 <3.0.0` based on beta release + guidelines. + +## 1.1.0 + +* Add a `GlyphSet` class that can be used to easily choose which set of glyphs + to use for a particular chunk of code. + +* Add `asciiGlyphs`, `unicodeGlyphs`, and `glyphs` getters that provide access + to `GlyphSet`s. + +## 1.0.1 + +* Set max SDK version to `<3.0.0`. + +## 1.0.0 + +* Initial version. diff --git a/pkgs/term_glyph/LICENSE b/pkgs/term_glyph/LICENSE new file mode 100644 index 000000000..03af64abe --- /dev/null +++ b/pkgs/term_glyph/LICENSE @@ -0,0 +1,27 @@ +Copyright 2017, the Dart project authors. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google LLC nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/pkgs/term_glyph/README.md b/pkgs/term_glyph/README.md new file mode 100644 index 000000000..75039aaeb --- /dev/null +++ b/pkgs/term_glyph/README.md @@ -0,0 +1,47 @@ +[![Build Status](https://github.com/dart-lang/tools/actions/workflows/term_glyph.yaml/badge.svg)](https://github.com/dart-lang/tools/actions/workflows/term_glyph.yaml) +[![pub package](https://img.shields.io/pub/v/term_glyph.svg)](https://pub.dev/packages/term_glyph) +[![package publisher](https://img.shields.io/pub/publisher/term_glyph.svg)](https://pub.dev/packages/term_glyph/publisher) + +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 +in places where Unicode isn't well-supported 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 items) => + items.map((item) => "${glyph.bullet} $item").join("\n"); +``` + +## ASCII Mode + +Some shells are 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://pub.dev/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/pkgs/term_glyph/analysis_options.yaml b/pkgs/term_glyph/analysis_options.yaml new file mode 100644 index 000000000..6d74ee93f --- /dev/null +++ b/pkgs/term_glyph/analysis_options.yaml @@ -0,0 +1,32 @@ +# https://dart.dev/guides/language/analysis-options +include: package:dart_flutter_team_lints/analysis_options.yaml + +analyzer: + language: + strict-casts: true + strict-inference: true + strict-raw-types: true + +linter: + rules: + - avoid_bool_literals_in_conditional_expressions + - avoid_classes_with_only_static_members + - avoid_private_typedef_functions + - avoid_redundant_argument_values + - avoid_returning_this + - avoid_unused_constructor_parameters + - avoid_void_async + - cancel_subscriptions + - join_return_with_assignment + - literal_only_boolean_expressions + - missing_whitespace_between_adjacent_strings + - no_adjacent_strings_in_list + - no_runtimeType_toString + - prefer_const_declarations + - prefer_expression_function_bodies + - prefer_final_locals + - unnecessary_await_in_return + - unnecessary_breaks + - use_if_null_to_convert_nulls_to_bools + - use_raw_strings + - use_string_buffers diff --git a/pkgs/term_glyph/data.csv b/pkgs/term_glyph/data.csv new file mode 100644 index 000000000..92a72f7bc --- /dev/null +++ b/pkgs/term_glyph/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/pkgs/term_glyph/lib/src/generated/ascii_glyph_set.dart b/pkgs/term_glyph/lib/src/generated/ascii_glyph_set.dart new file mode 100644 index 000000000..7c97d7f29 --- /dev/null +++ b/pkgs/term_glyph/lib/src/generated/ascii_glyph_set.dart @@ -0,0 +1,137 @@ +// Copyright (c) 2018, 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. + +import 'glyph_set.dart'; + +/// A [GlyphSet] that includes only ASCII glyphs. +class AsciiGlyphSet implements GlyphSet { + const AsciiGlyphSet(); + + /// Returns [glyph] if `this` supports Unicode glyphs and [alternative] + /// otherwise. + @override + String glyphOrAscii(String glyph, String alternative) => alternative; + @override + String get bullet => '*'; + @override + String get leftArrow => '<'; + @override + String get rightArrow => '>'; + @override + String get upArrow => '^'; + @override + String get downArrow => 'v'; + @override + String get longLeftArrow => '<='; + @override + String get longRightArrow => '=>'; + @override + String get horizontalLine => '-'; + @override + String get verticalLine => '|'; + @override + String get topLeftCorner => ','; + @override + String get topRightCorner => ','; + @override + String get bottomLeftCorner => "'"; + @override + String get bottomRightCorner => "'"; + @override + String get cross => '+'; + @override + String get teeUp => '+'; + @override + String get teeDown => '+'; + @override + String get teeLeft => '+'; + @override + String get teeRight => '+'; + @override + String get upEnd => "'"; + @override + String get downEnd => ','; + @override + String get leftEnd => '-'; + @override + String get rightEnd => '-'; + @override + String get horizontalLineBold => '='; + @override + String get verticalLineBold => '|'; + @override + String get topLeftCornerBold => ','; + @override + String get topRightCornerBold => ','; + @override + String get bottomLeftCornerBold => "'"; + @override + String get bottomRightCornerBold => "'"; + @override + String get crossBold => '+'; + @override + String get teeUpBold => '+'; + @override + String get teeDownBold => '+'; + @override + String get teeLeftBold => '+'; + @override + String get teeRightBold => '+'; + @override + String get upEndBold => "'"; + @override + String get downEndBold => ','; + @override + String get leftEndBold => '-'; + @override + String get rightEndBold => '-'; + @override + String get horizontalLineDouble => '='; + @override + String get verticalLineDouble => '|'; + @override + String get topLeftCornerDouble => ','; + @override + String get topRightCornerDouble => ','; + @override + String get bottomLeftCornerDouble => '"'; + @override + String get bottomRightCornerDouble => '"'; + @override + String get crossDouble => '+'; + @override + String get teeUpDouble => '+'; + @override + String get teeDownDouble => '+'; + @override + String get teeLeftDouble => '+'; + @override + String get teeRightDouble => '+'; + @override + String get horizontalLineDoubleDash => '-'; + @override + String get horizontalLineDoubleDashBold => '-'; + @override + String get verticalLineDoubleDash => '|'; + @override + String get verticalLineDoubleDashBold => '|'; + @override + String get horizontalLineTripleDash => '-'; + @override + String get horizontalLineTripleDashBold => '-'; + @override + String get verticalLineTripleDash => '|'; + @override + String get verticalLineTripleDashBold => '|'; + @override + String get horizontalLineQuadrupleDash => '-'; + @override + String get horizontalLineQuadrupleDashBold => '-'; + @override + String get verticalLineQuadrupleDash => '|'; + @override + String get verticalLineQuadrupleDashBold => '|'; +} diff --git a/pkgs/term_glyph/lib/src/generated/glyph_set.dart b/pkgs/term_glyph/lib/src/generated/glyph_set.dart new file mode 100644 index 000000000..be1a668a1 --- /dev/null +++ b/pkgs/term_glyph/lib/src/generated/glyph_set.dart @@ -0,0 +1,227 @@ +// Copyright (c) 2018, 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. + +/// A class that provides access to every configurable glyph. +/// +/// This is provided as a class so that individual chunks of code can choose +/// between `ascii` and `unicode` glyphs. For example: +/// +/// ```dart +/// import 'package:term_glyph/term_glyph.dart' as glyph; +/// +/// /// Adds a vertical line to the left of [text]. +/// /// +/// /// If [unicode] is `true`, this uses Unicode for the line. If it's +/// /// `false`, this uses plain ASCII characters. If it's `null`, it +/// /// defaults to [glyph.ascii]. +/// void addVerticalLine(String text, {bool unicode}) { +/// var glyphs = +/// (unicode ?? !glyph.ascii) ? glyph.unicodeGlyphs : glyph.asciiGlyphs; +/// +/// return text +/// .split('\n') +/// .map((line) => '${glyphs.verticalLine} $line') +/// .join('\n'); +/// } +/// ``` +abstract class GlyphSet { + /// Returns [glyph] if `this` supports Unicode glyphs and [alternative] + /// otherwise. + String glyphOrAscii(String glyph, String alternative); + + /// A bullet point. + String get 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. + String get 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. + String get rightArrow; + + /// An upwards-pointing arrow. + String get upArrow; + + /// A downwards-pointing arrow. + String get downArrow; + + /// A two-character left-pointing arrow. + String get longLeftArrow; + + /// A two-character right-pointing arrow. + String get longRightArrow; + + /// A horizontal line that can be used to draw a box. + String get horizontalLine; + + /// A vertical line that can be used to draw a box. + String get verticalLine; + + /// The upper left-hand corner of a box. + String get topLeftCorner; + + /// The upper right-hand corner of a box. + String get topRightCorner; + + /// The lower left-hand corner of a box. + String get bottomLeftCorner; + + /// The lower right-hand corner of a box. + String get bottomRightCorner; + + /// An intersection of vertical and horizontal box lines. + String get cross; + + /// A horizontal box line with a vertical line going up from the middle. + String get teeUp; + + /// A horizontal box line with a vertical line going down from the middle. + String get teeDown; + + /// A vertical box line with a horizontal line going left from the middle. + String get teeLeft; + + /// A vertical box line with a horizontal line going right from the middle. + String get teeRight; + + /// The top half of a vertical box line. + String get upEnd; + + /// The bottom half of a vertical box line. + String get downEnd; + + /// The left half of a horizontal box line. + String get leftEnd; + + /// The right half of a horizontal box line. + String get rightEnd; + + /// A bold horizontal line that can be used to draw a box. + String get horizontalLineBold; + + /// A bold vertical line that can be used to draw a box. + String get verticalLineBold; + + /// The bold upper left-hand corner of a box. + String get topLeftCornerBold; + + /// The bold upper right-hand corner of a box. + String get topRightCornerBold; + + /// The bold lower left-hand corner of a box. + String get bottomLeftCornerBold; + + /// The bold lower right-hand corner of a box. + String get bottomRightCornerBold; + + /// An intersection of bold vertical and horizontal box lines. + String get crossBold; + + /// A bold horizontal box line with a vertical line going up from the middle. + String get teeUpBold; + + /// A bold horizontal box line with a vertical line going down from the + /// middle. + String get teeDownBold; + + /// A bold vertical box line with a horizontal line going left from the + /// middle. + String get teeLeftBold; + + /// A bold vertical box line with a horizontal line going right from the + /// middle. + String get teeRightBold; + + /// The top half of a bold vertical box line. + String get upEndBold; + + /// The bottom half of a bold vertical box line. + String get downEndBold; + + /// The left half of a bold horizontal box line. + String get leftEndBold; + + /// The right half of a bold horizontal box line. + String get rightEndBold; + + /// A double horizontal line that can be used to draw a box. + String get horizontalLineDouble; + + /// A double vertical line that can be used to draw a box. + String get verticalLineDouble; + + /// The double upper left-hand corner of a box. + String get topLeftCornerDouble; + + /// The double upper right-hand corner of a box. + String get topRightCornerDouble; + + /// The double lower left-hand corner of a box. + String get bottomLeftCornerDouble; + + /// The double lower right-hand corner of a box. + String get bottomRightCornerDouble; + + /// An intersection of double vertical and horizontal box lines. + String get crossDouble; + + /// A double horizontal box line with a vertical line going up from the + /// middle. + String get teeUpDouble; + + /// A double horizontal box line with a vertical line going down from the + /// middle. + String get teeDownDouble; + + /// A double vertical box line with a horizontal line going left from the + /// middle. + String get teeLeftDouble; + + /// A double vertical box line with a horizontal line going right from the + /// middle. + String get teeRightDouble; + + /// A dashed horizontal line that can be used to draw a box. + String get horizontalLineDoubleDash; + + /// A bold dashed horizontal line that can be used to draw a box. + String get horizontalLineDoubleDashBold; + + /// A dashed vertical line that can be used to draw a box. + String get verticalLineDoubleDash; + + /// A bold dashed vertical line that can be used to draw a box. + String get verticalLineDoubleDashBold; + + /// A dashed horizontal line that can be used to draw a box. + String get horizontalLineTripleDash; + + /// A bold dashed horizontal line that can be used to draw a box. + String get horizontalLineTripleDashBold; + + /// A dashed vertical line that can be used to draw a box. + String get verticalLineTripleDash; + + /// A bold dashed vertical line that can be used to draw a box. + String get verticalLineTripleDashBold; + + /// A dashed horizontal line that can be used to draw a box. + String get horizontalLineQuadrupleDash; + + /// A bold dashed horizontal line that can be used to draw a box. + String get horizontalLineQuadrupleDashBold; + + /// A dashed vertical line that can be used to draw a box. + String get verticalLineQuadrupleDash; + + /// A bold dashed vertical line that can be used to draw a box. + String get verticalLineQuadrupleDashBold; +} diff --git a/pkgs/term_glyph/lib/src/generated/top_level.dart b/pkgs/term_glyph/lib/src/generated/top_level.dart new file mode 100644 index 000000000..925903eef --- /dev/null +++ b/pkgs/term_glyph/lib/src/generated/top_level.dart @@ -0,0 +1,383 @@ +// Copyright (c) 2018, 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. + +import '../../term_glyph.dart' as glyph; + +/// A bullet point. +/// +/// If [glyph.ascii] is `false`, this is "•". If it's `true`, this is +/// "*" instead. +String get bullet => glyph.glyphs.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 [glyph.ascii] is `false`, this is "←". If it's `true`, this is +/// "<" instead. +String get leftArrow => glyph.glyphs.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 [glyph.ascii] is `false`, this is "→". If it's `true`, this is +/// ">" instead. +String get rightArrow => glyph.glyphs.rightArrow; + +/// An upwards-pointing arrow. +/// +/// If [glyph.ascii] is `false`, this is "↑". If it's `true`, this is +/// "^" instead. +String get upArrow => glyph.glyphs.upArrow; + +/// A downwards-pointing arrow. +/// +/// If [glyph.ascii] is `false`, this is "↓". If it's `true`, this is +/// "v" instead. +String get downArrow => glyph.glyphs.downArrow; + +/// A two-character left-pointing arrow. +/// +/// If [glyph.ascii] is `false`, this is "◀━". If it's `true`, this is +/// "<=" instead. +String get longLeftArrow => glyph.glyphs.longLeftArrow; + +/// A two-character right-pointing arrow. +/// +/// If [glyph.ascii] is `false`, this is "━▶". If it's `true`, this is +/// "=>" instead. +String get longRightArrow => glyph.glyphs.longRightArrow; + +/// A horizontal line that can be used to draw a box. +/// +/// If [glyph.ascii] is `false`, this is "─". If it's `true`, this is +/// "-" instead. +String get horizontalLine => glyph.glyphs.horizontalLine; + +/// A vertical line that can be used to draw a box. +/// +/// If [glyph.ascii] is `false`, this is "│". If it's `true`, this is +/// "|" instead. +String get verticalLine => glyph.glyphs.verticalLine; + +/// The upper left-hand corner of a box. +/// +/// If [glyph.ascii] is `false`, this is "┌". If it's `true`, this is +/// "," instead. +String get topLeftCorner => glyph.glyphs.topLeftCorner; + +/// The upper right-hand corner of a box. +/// +/// If [glyph.ascii] is `false`, this is "┐". If it's `true`, this is +/// "," instead. +String get topRightCorner => glyph.glyphs.topRightCorner; + +/// The lower left-hand corner of a box. +/// +/// If [glyph.ascii] is `false`, this is "└". If it's `true`, this is +/// "'" instead. +String get bottomLeftCorner => glyph.glyphs.bottomLeftCorner; + +/// The lower right-hand corner of a box. +/// +/// If [glyph.ascii] is `false`, this is "┘". If it's `true`, this is +/// "'" instead. +String get bottomRightCorner => glyph.glyphs.bottomRightCorner; + +/// An intersection of vertical and horizontal box lines. +/// +/// If [glyph.ascii] is `false`, this is "┼". If it's `true`, this is +/// "+" instead. +String get cross => glyph.glyphs.cross; + +/// A horizontal box line with a vertical line going up from the middle. +/// +/// If [glyph.ascii] is `false`, this is "┴". If it's `true`, this is +/// "+" instead. +String get teeUp => glyph.glyphs.teeUp; + +/// A horizontal box line with a vertical line going down from the middle. +/// +/// If [glyph.ascii] is `false`, this is "┬". If it's `true`, this is +/// "+" instead. +String get teeDown => glyph.glyphs.teeDown; + +/// A vertical box line with a horizontal line going left from the middle. +/// +/// If [glyph.ascii] is `false`, this is "┤". If it's `true`, this is +/// "+" instead. +String get teeLeft => glyph.glyphs.teeLeft; + +/// A vertical box line with a horizontal line going right from the middle. +/// +/// If [glyph.ascii] is `false`, this is "├". If it's `true`, this is +/// "+" instead. +String get teeRight => glyph.glyphs.teeRight; + +/// The top half of a vertical box line. +/// +/// If [glyph.ascii] is `false`, this is "╵". If it's `true`, this is +/// "'" instead. +String get upEnd => glyph.glyphs.upEnd; + +/// The bottom half of a vertical box line. +/// +/// If [glyph.ascii] is `false`, this is "╷". If it's `true`, this is +/// "," instead. +String get downEnd => glyph.glyphs.downEnd; + +/// The left half of a horizontal box line. +/// +/// If [glyph.ascii] is `false`, this is "╴". If it's `true`, this is +/// "-" instead. +String get leftEnd => glyph.glyphs.leftEnd; + +/// The right half of a horizontal box line. +/// +/// If [glyph.ascii] is `false`, this is "╶". If it's `true`, this is +/// "-" instead. +String get rightEnd => glyph.glyphs.rightEnd; + +/// A bold horizontal line that can be used to draw a box. +/// +/// If [glyph.ascii] is `false`, this is "━". If it's `true`, this is +/// "=" instead. +String get horizontalLineBold => glyph.glyphs.horizontalLineBold; + +/// A bold vertical line that can be used to draw a box. +/// +/// If [glyph.ascii] is `false`, this is "┃". If it's `true`, this is +/// "|" instead. +String get verticalLineBold => glyph.glyphs.verticalLineBold; + +/// The bold upper left-hand corner of a box. +/// +/// If [glyph.ascii] is `false`, this is "┏". If it's `true`, this is +/// "," instead. +String get topLeftCornerBold => glyph.glyphs.topLeftCornerBold; + +/// The bold upper right-hand corner of a box. +/// +/// If [glyph.ascii] is `false`, this is "┓". If it's `true`, this is +/// "," instead. +String get topRightCornerBold => glyph.glyphs.topRightCornerBold; + +/// The bold lower left-hand corner of a box. +/// +/// If [glyph.ascii] is `false`, this is "┗". If it's `true`, this is +/// "'" instead. +String get bottomLeftCornerBold => glyph.glyphs.bottomLeftCornerBold; + +/// The bold lower right-hand corner of a box. +/// +/// If [glyph.ascii] is `false`, this is "┛". If it's `true`, this is +/// "'" instead. +String get bottomRightCornerBold => glyph.glyphs.bottomRightCornerBold; + +/// An intersection of bold vertical and horizontal box lines. +/// +/// If [glyph.ascii] is `false`, this is "╋". If it's `true`, this is +/// "+" instead. +String get crossBold => glyph.glyphs.crossBold; + +/// A bold horizontal box line with a vertical line going up from the middle. +/// +/// If [glyph.ascii] is `false`, this is "┻". If it's `true`, this is +/// "+" instead. +String get teeUpBold => glyph.glyphs.teeUpBold; + +/// A bold horizontal box line with a vertical line going down from the middle. +/// +/// If [glyph.ascii] is `false`, this is "┳". If it's `true`, this is +/// "+" instead. +String get teeDownBold => glyph.glyphs.teeDownBold; + +/// A bold vertical box line with a horizontal line going left from the middle. +/// +/// If [glyph.ascii] is `false`, this is "┫". If it's `true`, this is +/// "+" instead. +String get teeLeftBold => glyph.glyphs.teeLeftBold; + +/// A bold vertical box line with a horizontal line going right from the middle. +/// +/// If [glyph.ascii] is `false`, this is "┣". If it's `true`, this is +/// "+" instead. +String get teeRightBold => glyph.glyphs.teeRightBold; + +/// The top half of a bold vertical box line. +/// +/// If [glyph.ascii] is `false`, this is "╹". If it's `true`, this is +/// "'" instead. +String get upEndBold => glyph.glyphs.upEndBold; + +/// The bottom half of a bold vertical box line. +/// +/// If [glyph.ascii] is `false`, this is "╻". If it's `true`, this is +/// "," instead. +String get downEndBold => glyph.glyphs.downEndBold; + +/// The left half of a bold horizontal box line. +/// +/// If [glyph.ascii] is `false`, this is "╸". If it's `true`, this is +/// "-" instead. +String get leftEndBold => glyph.glyphs.leftEndBold; + +/// The right half of a bold horizontal box line. +/// +/// If [glyph.ascii] is `false`, this is "╺". If it's `true`, this is +/// "-" instead. +String get rightEndBold => glyph.glyphs.rightEndBold; + +/// A double horizontal line that can be used to draw a box. +/// +/// If [glyph.ascii] is `false`, this is "═". If it's `true`, this is +/// "=" instead. +String get horizontalLineDouble => glyph.glyphs.horizontalLineDouble; + +/// A double vertical line that can be used to draw a box. +/// +/// If [glyph.ascii] is `false`, this is "║". If it's `true`, this is +/// "|" instead. +String get verticalLineDouble => glyph.glyphs.verticalLineDouble; + +/// The double upper left-hand corner of a box. +/// +/// If [glyph.ascii] is `false`, this is "╔". If it's `true`, this is +/// "," instead. +String get topLeftCornerDouble => glyph.glyphs.topLeftCornerDouble; + +/// The double upper right-hand corner of a box. +/// +/// If [glyph.ascii] is `false`, this is "╗". If it's `true`, this is +/// "," instead. +String get topRightCornerDouble => glyph.glyphs.topRightCornerDouble; + +/// The double lower left-hand corner of a box. +/// +/// If [glyph.ascii] is `false`, this is "╚". If it's `true`, this is +/// """ instead. +String get bottomLeftCornerDouble => glyph.glyphs.bottomLeftCornerDouble; + +/// The double lower right-hand corner of a box. +/// +/// If [glyph.ascii] is `false`, this is "╝". If it's `true`, this is +/// """ instead. +String get bottomRightCornerDouble => glyph.glyphs.bottomRightCornerDouble; + +/// An intersection of double vertical and horizontal box lines. +/// +/// If [glyph.ascii] is `false`, this is "╬". If it's `true`, this is +/// "+" instead. +String get crossDouble => glyph.glyphs.crossDouble; + +/// A double horizontal box line with a vertical line going up from the middle. +/// +/// If [glyph.ascii] is `false`, this is "╩". If it's `true`, this is +/// "+" instead. +String get teeUpDouble => glyph.glyphs.teeUpDouble; + +/// A double horizontal box line with a vertical line going down from the +/// middle. +/// +/// If [glyph.ascii] is `false`, this is "╦". If it's `true`, this is +/// "+" instead. +String get teeDownDouble => glyph.glyphs.teeDownDouble; + +/// A double vertical box line with a horizontal line going left from the +/// middle. +/// +/// If [glyph.ascii] is `false`, this is "╣". If it's `true`, this is +/// "+" instead. +String get teeLeftDouble => glyph.glyphs.teeLeftDouble; + +/// A double vertical box line with a horizontal line going right from the +/// middle. +/// +/// If [glyph.ascii] is `false`, this is "╠". If it's `true`, this is +/// "+" instead. +String get teeRightDouble => glyph.glyphs.teeRightDouble; + +/// A dashed horizontal line that can be used to draw a box. +/// +/// If [glyph.ascii] is `false`, this is "╌". If it's `true`, this is +/// "-" instead. +String get horizontalLineDoubleDash => glyph.glyphs.horizontalLineDoubleDash; + +/// A bold dashed horizontal line that can be used to draw a box. +/// +/// If [glyph.ascii] is `false`, this is "╍". If it's `true`, this is +/// "-" instead. +String get horizontalLineDoubleDashBold => + glyph.glyphs.horizontalLineDoubleDashBold; + +/// A dashed vertical line that can be used to draw a box. +/// +/// If [glyph.ascii] is `false`, this is "╎". If it's `true`, this is +/// "|" instead. +String get verticalLineDoubleDash => glyph.glyphs.verticalLineDoubleDash; + +/// A bold dashed vertical line that can be used to draw a box. +/// +/// If [glyph.ascii] is `false`, this is "╏". If it's `true`, this is +/// "|" instead. +String get verticalLineDoubleDashBold => + glyph.glyphs.verticalLineDoubleDashBold; + +/// A dashed horizontal line that can be used to draw a box. +/// +/// If [glyph.ascii] is `false`, this is "┄". If it's `true`, this is +/// "-" instead. +String get horizontalLineTripleDash => glyph.glyphs.horizontalLineTripleDash; + +/// A bold dashed horizontal line that can be used to draw a box. +/// +/// If [glyph.ascii] is `false`, this is "┅". If it's `true`, this is +/// "-" instead. +String get horizontalLineTripleDashBold => + glyph.glyphs.horizontalLineTripleDashBold; + +/// A dashed vertical line that can be used to draw a box. +/// +/// If [glyph.ascii] is `false`, this is "┆". If it's `true`, this is +/// "|" instead. +String get verticalLineTripleDash => glyph.glyphs.verticalLineTripleDash; + +/// A bold dashed vertical line that can be used to draw a box. +/// +/// If [glyph.ascii] is `false`, this is "┇". If it's `true`, this is +/// "|" instead. +String get verticalLineTripleDashBold => + glyph.glyphs.verticalLineTripleDashBold; + +/// A dashed horizontal line that can be used to draw a box. +/// +/// If [glyph.ascii] is `false`, this is "┈". If it's `true`, this is +/// "-" instead. +String get horizontalLineQuadrupleDash => + glyph.glyphs.horizontalLineQuadrupleDash; + +/// A bold dashed horizontal line that can be used to draw a box. +/// +/// If [glyph.ascii] is `false`, this is "┉". If it's `true`, this is +/// "-" instead. +String get horizontalLineQuadrupleDashBold => + glyph.glyphs.horizontalLineQuadrupleDashBold; + +/// A dashed vertical line that can be used to draw a box. +/// +/// If [glyph.ascii] is `false`, this is "┊". If it's `true`, this is +/// "|" instead. +String get verticalLineQuadrupleDash => glyph.glyphs.verticalLineQuadrupleDash; + +/// A bold dashed vertical line that can be used to draw a box. +/// +/// If [glyph.ascii] is `false`, this is "┋". If it's `true`, this is +/// "|" instead. +String get verticalLineQuadrupleDashBold => + glyph.glyphs.verticalLineQuadrupleDashBold; diff --git a/pkgs/term_glyph/lib/src/generated/unicode_glyph_set.dart b/pkgs/term_glyph/lib/src/generated/unicode_glyph_set.dart new file mode 100644 index 000000000..1ddd165d7 --- /dev/null +++ b/pkgs/term_glyph/lib/src/generated/unicode_glyph_set.dart @@ -0,0 +1,137 @@ +// Copyright (c) 2018, 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. + +import 'glyph_set.dart'; + +/// A [GlyphSet] that includes only Unicode glyphs. +class UnicodeGlyphSet implements GlyphSet { + const UnicodeGlyphSet(); + + /// Returns [glyph] if `this` supports Unicode glyphs and [alternative] + /// otherwise. + @override + String glyphOrAscii(String glyph, String alternative) => glyph; + @override + String get bullet => '•'; + @override + String get leftArrow => '←'; + @override + String get rightArrow => '→'; + @override + String get upArrow => '↑'; + @override + String get downArrow => '↓'; + @override + String get longLeftArrow => '◀━'; + @override + String get longRightArrow => '━▶'; + @override + String get horizontalLine => '─'; + @override + String get verticalLine => '│'; + @override + String get topLeftCorner => '┌'; + @override + String get topRightCorner => '┐'; + @override + String get bottomLeftCorner => '└'; + @override + String get bottomRightCorner => '┘'; + @override + String get cross => '┼'; + @override + String get teeUp => '┴'; + @override + String get teeDown => '┬'; + @override + String get teeLeft => '┤'; + @override + String get teeRight => '├'; + @override + String get upEnd => '╵'; + @override + String get downEnd => '╷'; + @override + String get leftEnd => '╴'; + @override + String get rightEnd => '╶'; + @override + String get horizontalLineBold => '━'; + @override + String get verticalLineBold => '┃'; + @override + String get topLeftCornerBold => '┏'; + @override + String get topRightCornerBold => '┓'; + @override + String get bottomLeftCornerBold => '┗'; + @override + String get bottomRightCornerBold => '┛'; + @override + String get crossBold => '╋'; + @override + String get teeUpBold => '┻'; + @override + String get teeDownBold => '┳'; + @override + String get teeLeftBold => '┫'; + @override + String get teeRightBold => '┣'; + @override + String get upEndBold => '╹'; + @override + String get downEndBold => '╻'; + @override + String get leftEndBold => '╸'; + @override + String get rightEndBold => '╺'; + @override + String get horizontalLineDouble => '═'; + @override + String get verticalLineDouble => '║'; + @override + String get topLeftCornerDouble => '╔'; + @override + String get topRightCornerDouble => '╗'; + @override + String get bottomLeftCornerDouble => '╚'; + @override + String get bottomRightCornerDouble => '╝'; + @override + String get crossDouble => '╬'; + @override + String get teeUpDouble => '╩'; + @override + String get teeDownDouble => '╦'; + @override + String get teeLeftDouble => '╣'; + @override + String get teeRightDouble => '╠'; + @override + String get horizontalLineDoubleDash => '╌'; + @override + String get horizontalLineDoubleDashBold => '╍'; + @override + String get verticalLineDoubleDash => '╎'; + @override + String get verticalLineDoubleDashBold => '╏'; + @override + String get horizontalLineTripleDash => '┄'; + @override + String get horizontalLineTripleDashBold => '┅'; + @override + String get verticalLineTripleDash => '┆'; + @override + String get verticalLineTripleDashBold => '┇'; + @override + String get horizontalLineQuadrupleDash => '┈'; + @override + String get horizontalLineQuadrupleDashBold => '┉'; + @override + String get verticalLineQuadrupleDash => '┊'; + @override + String get verticalLineQuadrupleDashBold => '┋'; +} diff --git a/pkgs/term_glyph/lib/term_glyph.dart b/pkgs/term_glyph/lib/term_glyph.dart new file mode 100644 index 000000000..9f2b42293 --- /dev/null +++ b/pkgs/term_glyph/lib/term_glyph.dart @@ -0,0 +1,37 @@ +// 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 'src/generated/ascii_glyph_set.dart'; +import 'src/generated/glyph_set.dart'; +import 'src/generated/unicode_glyph_set.dart'; + +export 'src/generated/glyph_set.dart'; +export 'src/generated/top_level.dart'; + +/// A [GlyphSet] that always returns ASCII glyphs. +const GlyphSet asciiGlyphs = AsciiGlyphSet(); + +/// A [GlyphSet] that always returns Unicode glyphs. +const GlyphSet unicodeGlyphs = UnicodeGlyphSet(); + +/// Returns [asciiGlyphs] if [ascii] is `true` or [unicodeGlyphs] otherwise. +/// +/// Returns [unicodeGlyphs] by default. +GlyphSet get glyphs => _glyphs; +GlyphSet _glyphs = unicodeGlyphs; + +/// Whether the glyph getters return plain ASCII, as opposed to Unicode +/// characters or sequences. +/// +/// Defaults to `false`. +bool get ascii => glyphs == asciiGlyphs; + +set ascii(bool value) { + _glyphs = value ? asciiGlyphs : unicodeGlyphs; +} + +/// Returns [glyph] if Unicode glyph are allowed, and [alternative] if they +/// aren't. +String glyphOrAscii(String glyph, String alternative) => + glyphs.glyphOrAscii(glyph, alternative); diff --git a/pkgs/term_glyph/pubspec.yaml b/pkgs/term_glyph/pubspec.yaml new file mode 100644 index 000000000..c429307b9 --- /dev/null +++ b/pkgs/term_glyph/pubspec.yaml @@ -0,0 +1,13 @@ +name: term_glyph +version: 1.2.2 +description: Useful Unicode glyphs and ASCII substitutes. +repository: https://github.com/dart-lang/tools/tree/main/pkgs/term_glyph + +environment: + sdk: ^3.1.0 + +dev_dependencies: + csv: ^6.0.0 + dart_flutter_team_lints: ^3.0.0 + dart_style: ^2.0.0 + test: ^1.16.6 diff --git a/pkgs/term_glyph/test/symbol_test.dart b/pkgs/term_glyph/test/symbol_test.dart new file mode 100644 index 000000000..b3b4d0937 --- /dev/null +++ b/pkgs/term_glyph/test/symbol_test.dart @@ -0,0 +1,60 @@ +// 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:term_glyph/term_glyph.dart' as glyph; +import 'package:test/test.dart'; + +void main() { + group('with ascii = false', () { + setUpAll(() { + glyph.ascii = false; + }); + + test('glyph getters 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')); + }); + + test('glyphs returns unicodeGlyphs', () { + expect(glyph.glyphs, equals(glyph.unicodeGlyphs)); + }); + + test('asciiGlyphs still returns ASCII characters', () { + expect(glyph.asciiGlyphs.topLeftCorner, equals(',')); + expect(glyph.asciiGlyphs.teeUpBold, equals('+')); + expect(glyph.asciiGlyphs.longLeftArrow, equals('<=')); + }); + }); + + 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')); + }); + + test('glyphs returns asciiGlyphs', () { + expect(glyph.glyphs, equals(glyph.asciiGlyphs)); + }); + + test('unicodeGlyphs still returns Unicode characters', () { + expect(glyph.unicodeGlyphs.topLeftCorner, equals('┌')); + expect(glyph.unicodeGlyphs.teeUpBold, equals('┻')); + expect(glyph.unicodeGlyphs.longLeftArrow, equals('◀━')); + }); + }); +} diff --git a/pkgs/term_glyph/tool/generate.dart b/pkgs/term_glyph/tool/generate.dart new file mode 100644 index 000000000..f5cdade9e --- /dev/null +++ b/pkgs/term_glyph/tool/generate.dart @@ -0,0 +1,153 @@ +// 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() { + final csv = CsvCodec(eol: '\n'); + final data = csv.decoder.convert(File('data.csv').readAsStringSync()); + + // Remove comments and empty lines. + data.removeWhere((row) => row.length < 3); + + Directory('lib/src/generated').createSync(recursive: true); + + _writeGlyphSetInterface(data); + _writeGlyphSet(data, ascii: false); + _writeGlyphSet(data, ascii: true); + _writeTopLevel(data); + + final result = Process.runSync( + 'pub', ['run', 'dart_style:format', '-w', 'lib/src/generated']); + print(result.stderr); + exit(result.exitCode); +} + +/// Writes `lib/src/generated/glyph_set.dart`. +void _writeGlyphSetInterface(List> data) { + final file = + File('lib/src/generated/glyph_set.dart').openSync(mode: FileMode.write); + file.writeStringSync(r''' + // Copyright (c) 2018, 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. + + /// A class that provides access to every configurable glyph. + /// + /// This is provided as a class so that individual chunks of code can choose + /// between `ascii` and `unicode` glyphs. For example: + /// + /// ```dart + /// import 'package:term_glyph/term_glyph.dart' as glyph; + /// + /// /// Adds a vertical line to the left of [text]. + /// /// + /// /// If [unicode] is `true`, this uses Unicode for the line. If it's + /// /// `false`, this uses plain ASCII characters. If it's `null`, it + /// /// defaults to [glyph.ascii]. + /// void addVerticalLine(String text, {bool unicode}) { + /// var glyphs = + /// (unicode ?? !glyph.ascii) ? glyph.unicodeGlyphs : glyph.asciiGlyphs; + /// + /// return text + /// .split('\n') + /// .map((line) => '${glyphs.verticalLine} $line') + /// .join('\n'); + /// } + /// ``` + abstract class GlyphSet { + /// Returns [glyph] if `this` supports Unicode glyphs and [alternative] + /// otherwise. + String glyphOrAscii(String glyph, String alternative); + '''); + + for (var glyph in data) { + for (var line in (glyph[3] as String).split('\n')) { + file.writeStringSync('/// $line\n'); + } + + file.writeStringSync('String get ${glyph[0]};'); + } + + file.writeStringSync('}'); + file.closeSync(); +} + +/// Writes `lib/src/generated/${prefix.toLowerCase()}_glyph_set.dart`. +/// +/// If [ascii] is `true`, this writes the ASCII glyph set. Otherwise it writes +/// the Unicode glyph set. +void _writeGlyphSet(List> data, {required bool ascii}) { + final file = + File('lib/src/generated/${ascii ? "ascii" : "unicode"}_glyph_set.dart') + .openSync(mode: FileMode.write); + + final className = '${ascii ? "Ascii" : "Unicode"}GlyphSet'; + file.writeStringSync(''' + // Copyright (c) 2018, 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. + + import 'glyph_set.dart'; + + /// A [GlyphSet] that includes only ${ascii ? "ASCII" : "Unicode"} glyphs. + class $className implements GlyphSet { + const $className(); + /// Returns [glyph] if `this` supports Unicode glyphs and [alternative] + /// otherwise. + @override + String glyphOrAscii(String glyph, String alternative) => + ${ascii ? "alternative" : "glyph"}; + '''); + + final index = ascii ? 2 : 1; + for (var glyph in data) { + file.writeStringSync(''' + @override + String get ${glyph[0]} => ${_quote(glyph[index] as String)}; + '''); + } + + file.writeStringSync('}'); + file.closeSync(); +} + +/// Writes `lib/src/generated/top_level.dart`. +void _writeTopLevel(List> data) { + final file = + File('lib/src/generated/top_level.dart').openSync(mode: FileMode.write); + + file.writeStringSync(''' + // Copyright (c) 2018, 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. + + import '../../term_glyph.dart' as glyph; + '''); + + for (var glyph in data) { + for (var line in (glyph[3] as String).split('\n')) { + file.writeStringSync('/// $line\n'); + } + + file.writeStringSync(''' + /// + /// If [glyph.ascii] is `false`, this is "${glyph[1]}". If it's `true`, this is + /// "${glyph[2]}" instead. + String get ${glyph[0]} => glyph.glyphs.${glyph[0]}; + '''); + } + + file.closeSync(); +} + +String _quote(String input) => input.contains("'") ? '"$input"' : "'$input'";