From 76bb67bc6d7a2a164ffad84f41f96051e4424986 Mon Sep 17 00:00:00 2001 From: Vicente Date: Fri, 22 Sep 2023 11:27:08 +0200 Subject: [PATCH] Added optional Text Selectable option --- flutter_highlight/lib/flutter_highlight.dart | 17 +++++++++++++---- highlight/lib/languages/accesslog.dart | 1 - highlight/lib/languages/clojure-repl.dart | 1 - highlight/lib/languages/csp.dart | 1 - highlight/lib/languages/diff.dart | 1 - highlight/lib/languages/fix.dart | 1 - highlight/lib/languages/http.dart | 1 - highlight/lib/languages/inform7.dart | 1 - highlight/lib/languages/julia-repl.dart | 1 - highlight/lib/languages/leaf.dart | 1 - highlight/lib/languages/markdown.dart | 1 - highlight/lib/languages/mojolicious.dart | 1 - highlight/lib/languages/plaintext.dart | 1 - highlight/lib/languages/shell.dart | 1 - highlight/lib/languages/subunit.dart | 1 - highlight/lib/languages/taggerscript.dart | 1 - highlight/lib/languages/vbscript-html.dart | 1 - highlight/lib/languages/xquery.dart | 1 - highlight/lib/src/highlight.dart | 2 +- 19 files changed, 14 insertions(+), 22 deletions(-) diff --git a/flutter_highlight/lib/flutter_highlight.dart b/flutter_highlight/lib/flutter_highlight.dart index 9afbc47..c70d73f 100644 --- a/flutter_highlight/lib/flutter_highlight.dart +++ b/flutter_highlight/lib/flutter_highlight.dart @@ -27,12 +27,16 @@ class HighlightView extends StatelessWidget { /// Specify text styles such as font family and font size final TextStyle? textStyle; + /// Text selectable + final bool textSelectable; + HighlightView( String input, { this.language, this.theme = const {}, this.padding, this.textStyle, + this.textSelectable = false, int tabSize = 8, // TODO: https://github.com/flutter/flutter/issues/50087 }) : source = input.replaceAll('\t', ' ' * tabSize); @@ -48,7 +52,8 @@ class HighlightView extends StatelessWidget { : TextSpan(text: node.value, style: theme[node.className!])); } else if (node.children != null) { List tmp = []; - currentSpans.add(TextSpan(children: tmp, style: theme[node.className!])); + currentSpans + .add(TextSpan(children: tmp, style: theme[node.className!])); stack.add(currentSpans); currentSpans = tmp; @@ -90,12 +95,16 @@ class HighlightView extends StatelessWidget { return Container( color: theme[_rootKey]?.backgroundColor ?? _defaultBackgroundColor, padding: padding, - child: RichText( - text: TextSpan( + child: _buildRichText( + child: TextSpan( style: _textStyle, - children: _convert(highlight.parse(source, language: language).nodes!), + children: + _convert(highlight.parse(source, language: language).nodes!), ), ), ); } + + Widget _buildRichText({required TextSpan child}) => + textSelectable ? SelectableText.rich(child) : RichText(text: child); } diff --git a/highlight/lib/languages/accesslog.dart b/highlight/lib/languages/accesslog.dart index a1c5642..98a5fe5 100644 --- a/highlight/lib/languages/accesslog.dart +++ b/highlight/lib/languages/accesslog.dart @@ -1,7 +1,6 @@ // GENERATED CODE - DO NOT MODIFY BY HAND import '../src/mode.dart'; -import '../src/common_modes.dart'; final accesslog = Mode(refs: {}, contains: [ Mode( diff --git a/highlight/lib/languages/clojure-repl.dart b/highlight/lib/languages/clojure-repl.dart index f2f46f5..ac6dff8 100644 --- a/highlight/lib/languages/clojure-repl.dart +++ b/highlight/lib/languages/clojure-repl.dart @@ -1,7 +1,6 @@ // GENERATED CODE - DO NOT MODIFY BY HAND import '../src/mode.dart'; -import '../src/common_modes.dart'; final clojureRepl = Mode(refs: {}, contains: [ Mode( diff --git a/highlight/lib/languages/csp.dart b/highlight/lib/languages/csp.dart index a09f1ff..6e11cac 100644 --- a/highlight/lib/languages/csp.dart +++ b/highlight/lib/languages/csp.dart @@ -1,7 +1,6 @@ // GENERATED CODE - DO NOT MODIFY BY HAND import '../src/mode.dart'; -import '../src/common_modes.dart'; final csp = Mode( refs: {}, diff --git a/highlight/lib/languages/diff.dart b/highlight/lib/languages/diff.dart index 544ba9e..9152e4c 100644 --- a/highlight/lib/languages/diff.dart +++ b/highlight/lib/languages/diff.dart @@ -1,7 +1,6 @@ // GENERATED CODE - DO NOT MODIFY BY HAND import '../src/mode.dart'; -import '../src/common_modes.dart'; final diff = Mode(refs: {}, aliases: [ "patch" diff --git a/highlight/lib/languages/fix.dart b/highlight/lib/languages/fix.dart index 68157bb..7940c58 100644 --- a/highlight/lib/languages/fix.dart +++ b/highlight/lib/languages/fix.dart @@ -1,7 +1,6 @@ // GENERATED CODE - DO NOT MODIFY BY HAND import '../src/mode.dart'; -import '../src/common_modes.dart'; final fix = Mode(refs: {}, contains: [ Mode( diff --git a/highlight/lib/languages/http.dart b/highlight/lib/languages/http.dart index a39f8d8..362a692 100644 --- a/highlight/lib/languages/http.dart +++ b/highlight/lib/languages/http.dart @@ -1,7 +1,6 @@ // GENERATED CODE - DO NOT MODIFY BY HAND import '../src/mode.dart'; -import '../src/common_modes.dart'; final http = Mode( refs: {}, diff --git a/highlight/lib/languages/inform7.dart b/highlight/lib/languages/inform7.dart index b6cdada..f471238 100644 --- a/highlight/lib/languages/inform7.dart +++ b/highlight/lib/languages/inform7.dart @@ -1,7 +1,6 @@ // GENERATED CODE - DO NOT MODIFY BY HAND import '../src/mode.dart'; -import '../src/common_modes.dart'; final inform7 = Mode( refs: {}, diff --git a/highlight/lib/languages/julia-repl.dart b/highlight/lib/languages/julia-repl.dart index b9b3fe9..524e5b6 100644 --- a/highlight/lib/languages/julia-repl.dart +++ b/highlight/lib/languages/julia-repl.dart @@ -1,7 +1,6 @@ // GENERATED CODE - DO NOT MODIFY BY HAND import '../src/mode.dart'; -import '../src/common_modes.dart'; final juliaRepl = Mode(refs: {}, contains: [ Mode( diff --git a/highlight/lib/languages/leaf.dart b/highlight/lib/languages/leaf.dart index 3ca65b0..5ae48d5 100644 --- a/highlight/lib/languages/leaf.dart +++ b/highlight/lib/languages/leaf.dart @@ -1,7 +1,6 @@ // GENERATED CODE - DO NOT MODIFY BY HAND import '../src/mode.dart'; -import '../src/common_modes.dart'; final leaf = Mode(refs: {}, contains: [ Mode( diff --git a/highlight/lib/languages/markdown.dart b/highlight/lib/languages/markdown.dart index 3d6a82d..bf86e02 100644 --- a/highlight/lib/languages/markdown.dart +++ b/highlight/lib/languages/markdown.dart @@ -1,7 +1,6 @@ // GENERATED CODE - DO NOT MODIFY BY HAND import '../src/mode.dart'; -import '../src/common_modes.dart'; final markdown = Mode(refs: {}, aliases: [ "md", diff --git a/highlight/lib/languages/mojolicious.dart b/highlight/lib/languages/mojolicious.dart index fd322a1..9481efd 100644 --- a/highlight/lib/languages/mojolicious.dart +++ b/highlight/lib/languages/mojolicious.dart @@ -1,7 +1,6 @@ // GENERATED CODE - DO NOT MODIFY BY HAND import '../src/mode.dart'; -import '../src/common_modes.dart'; final mojolicious = Mode(refs: {}, subLanguage: [ "xml" diff --git a/highlight/lib/languages/plaintext.dart b/highlight/lib/languages/plaintext.dart index 01117df..8e08f62 100644 --- a/highlight/lib/languages/plaintext.dart +++ b/highlight/lib/languages/plaintext.dart @@ -1,6 +1,5 @@ // GENERATED CODE - DO NOT MODIFY BY HAND import '../src/mode.dart'; -import '../src/common_modes.dart'; final plaintext = Mode(refs: {}, disableAutodetect: true); diff --git a/highlight/lib/languages/shell.dart b/highlight/lib/languages/shell.dart index aa0be03..922ae33 100644 --- a/highlight/lib/languages/shell.dart +++ b/highlight/lib/languages/shell.dart @@ -1,7 +1,6 @@ // GENERATED CODE - DO NOT MODIFY BY HAND import '../src/mode.dart'; -import '../src/common_modes.dart'; final shell = Mode(refs: {}, aliases: [ "console" diff --git a/highlight/lib/languages/subunit.dart b/highlight/lib/languages/subunit.dart index 68a2ced..95ff27f 100644 --- a/highlight/lib/languages/subunit.dart +++ b/highlight/lib/languages/subunit.dart @@ -1,7 +1,6 @@ // GENERATED CODE - DO NOT MODIFY BY HAND import '../src/mode.dart'; -import '../src/common_modes.dart'; final subunit = Mode( refs: {}, diff --git a/highlight/lib/languages/taggerscript.dart b/highlight/lib/languages/taggerscript.dart index da63a22..4cf1970 100644 --- a/highlight/lib/languages/taggerscript.dart +++ b/highlight/lib/languages/taggerscript.dart @@ -1,7 +1,6 @@ // GENERATED CODE - DO NOT MODIFY BY HAND import '../src/mode.dart'; -import '../src/common_modes.dart'; final taggerscript = Mode(refs: {}, contains: [ Mode( diff --git a/highlight/lib/languages/vbscript-html.dart b/highlight/lib/languages/vbscript-html.dart index 6607b82..6bd9f61 100644 --- a/highlight/lib/languages/vbscript-html.dart +++ b/highlight/lib/languages/vbscript-html.dart @@ -1,7 +1,6 @@ // GENERATED CODE - DO NOT MODIFY BY HAND import '../src/mode.dart'; -import '../src/common_modes.dart'; final vbscriptHtml = Mode(refs: {}, subLanguage: [ "xml" diff --git a/highlight/lib/languages/xquery.dart b/highlight/lib/languages/xquery.dart index 7e36edf..82e99d7 100644 --- a/highlight/lib/languages/xquery.dart +++ b/highlight/lib/languages/xquery.dart @@ -1,7 +1,6 @@ // GENERATED CODE - DO NOT MODIFY BY HAND import '../src/mode.dart'; -import '../src/common_modes.dart'; final xquery = Mode( refs: {}, diff --git a/highlight/lib/src/highlight.dart b/highlight/lib/src/highlight.dart index fdab3dc..efeb134 100644 --- a/highlight/lib/src/highlight.dart +++ b/highlight/lib/src/highlight.dart @@ -459,7 +459,7 @@ class Highlight { while (true) { match = top!.terminators ?.allMatches(source, index) - ?.firstWhereOrNull((m) => true); + .firstWhereOrNull((m) => true); if (match == null) break; // print(top.terminators);