From 38a525b0607d8723df3b5b3fcc2c087efd9e1c93 Mon Sep 17 00:00:00 2001 From: Elijah Luckey Date: Fri, 16 Sep 2022 12:10:43 -0400 Subject: [PATCH] feat(mason_logger): add `link` (#517) --- packages/mason_logger/example/main.dart | 7 +++- packages/mason_logger/lib/mason_logger.dart | 1 + packages/mason_logger/lib/src/link.dart | 17 ++++++++++ packages/mason_logger/test/src/link_test.dart | 32 +++++++++++++++++++ 4 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 packages/mason_logger/lib/src/link.dart create mode 100644 packages/mason_logger/test/src/link_test.dart diff --git a/packages/mason_logger/example/main.dart b/packages/mason_logger/example/main.dart index d852bf592..0cd4547eb 100644 --- a/packages/mason_logger/example/main.dart +++ b/packages/mason_logger/example/main.dart @@ -46,5 +46,10 @@ Future main() async { final canceling = logger.progress('Trying to cancel now!'); await Future.delayed(const Duration(seconds: 1)); canceling.cancel(); - logger.info('Done!'); + + final repoLink = link( + message: 'GitHub Repository', + uri: Uri.parse('https://github.com/felangel/mason'), + ); + logger.info('To learn more, visit the $repoLink.'); } diff --git a/packages/mason_logger/lib/mason_logger.dart b/packages/mason_logger/lib/mason_logger.dart index d1ed485f9..89f86da1c 100644 --- a/packages/mason_logger/lib/mason_logger.dart +++ b/packages/mason_logger/lib/mason_logger.dart @@ -2,4 +2,5 @@ library mason_logger; export 'src/io.dart'; export 'src/level.dart'; +export 'src/link.dart'; export 'src/mason_logger.dart' show Logger, Progress; diff --git a/packages/mason_logger/lib/src/link.dart b/packages/mason_logger/lib/src/link.dart new file mode 100644 index 000000000..47bdb64fb --- /dev/null +++ b/packages/mason_logger/lib/src/link.dart @@ -0,0 +1,17 @@ +/// Wraps [uri] with an escape sequence so it's recognized as a hyperlink. +/// An optional message can be used in place of the [uri]. +/// If no [message] is provided, the text content will be the full [uri]. +/// +/// ```dart +/// final plainLink = link(uri: Uri.parse('https://dart.dev')); +/// print(plainLink); // Equivalent to `[https://dart.dev](https://dart.dev)` in markdown +/// +/// final richLink = link(uri: Uri.parse('https://dart.dev'), message: 'The Dart Website'); +/// print(richLink); // Equivalent to `[The Dart Website](https://dart.dev)` in markdown +/// ``` +String link({required Uri uri, String? message}) { + const leading = '\x1B]8;;'; + const trailing = '\x1B\\'; + + return '$leading$uri$trailing${message ?? uri}$leading$trailing'; +} diff --git a/packages/mason_logger/test/src/link_test.dart b/packages/mason_logger/test/src/link_test.dart new file mode 100644 index 000000000..38a11adaf --- /dev/null +++ b/packages/mason_logger/test/src/link_test.dart @@ -0,0 +1,32 @@ +import 'package:mason_logger/mason_logger.dart'; +import 'package:test/test.dart'; + +void main() { + group('link', () { + final uri = Uri.parse('https://github.com/felangel/mason/issues/'); + const lead = '\x1B]8;;'; + const trail = '\x1B\\'; + + test( + 'builds output with correct encodings: ' r'\x1B]8;;' ' and ' r'\x1B\\', + () { + const message = 'message'; + final output = link(message: message, uri: uri); + final matcher = stringContainsInOrder( + [lead, '$uri', trail, message, lead, trail], + ); + + expect(output, matcher); + }, + ); + + test('builds String with Uri when message is null: ', () { + final output = link(uri: uri); + final matcher = stringContainsInOrder( + [lead, '$uri', trail, '$uri', lead, trail], + ); + + expect(output, matcher); + }); + }); +}