From 9320c04c1c115e35d2ef0dd3bc6dcf88909b8b33 Mon Sep 17 00:00:00 2001 From: guozhigq Date: Fri, 27 Sep 2024 16:38:47 +0800 Subject: [PATCH] =?UTF-8?q?opt:=20=E4=B8=93=E6=A0=8F=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E5=9D=97=E6=B8=B2=E6=9F=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/common/widgets/html_render.dart | 15 +++++++++++++++ lib/utils/highlight.dart | 14 ++++++++++++++ pubspec.lock | 8 ++++++++ 3 files changed, 37 insertions(+) create mode 100644 lib/utils/highlight.dart diff --git a/lib/common/widgets/html_render.dart b/lib/common/widgets/html_render.dart index 0a728f86..c626978e 100644 --- a/lib/common/widgets/html_render.dart +++ b/lib/common/widgets/html_render.dart @@ -4,6 +4,7 @@ import 'package:flutter_html/flutter_html.dart'; import 'package:get/get.dart'; import 'package:pilipala/plugin/pl_gallery/hero_dialog_route.dart'; import 'package:pilipala/plugin/pl_gallery/interactiveviewer_gallery.dart'; +import 'package:pilipala/utils/highlight.dart'; import 'network_img_layer.dart'; // ignore: must_be_immutable @@ -25,6 +26,20 @@ class HtmlRender extends StatelessWidget { data: htmlContent, onLinkTap: (String? url, Map buildContext, attributes) {}, extensions: [ + TagExtension( + tagsToExtend: {'pre'}, + builder: (ExtensionContext extensionContext) { + final Map attributes = extensionContext.attributes; + final String lang = attributes['data-lang'] as String; + final String code = attributes['codecontent'] as String; + List selectedLanguages = [lang.split('@').first]; + TextSpan? result = highlightExistingText(code, selectedLanguages); + if (result == null) { + return const Center(child: Text('代码块渲染失败')); + } + return SelectableText.rich(result); + }, + ), TagExtension( tagsToExtend: {'img'}, builder: (ExtensionContext extensionContext) { diff --git a/lib/utils/highlight.dart b/lib/utils/highlight.dart new file mode 100644 index 00000000..c19b2f43 --- /dev/null +++ b/lib/utils/highlight.dart @@ -0,0 +1,14 @@ +import 'package:flutter/material.dart'; +import 'package:re_highlight/languages/all.dart'; +import 'package:re_highlight/re_highlight.dart'; +import 'package:re_highlight/styles/all.dart'; + +TextSpan? highlightExistingText(String text, List languages) { + final Highlight highlight = Highlight(); + highlight.registerLanguages(builtinAllLanguages); + final HighlightResult result = highlight.highlightAuto(text, languages); + final TextSpanRenderer renderer = + TextSpanRenderer(const TextStyle(), builtinAllThemes['github']!); + result.render(renderer); + return renderer.span; +} diff --git a/pubspec.lock b/pubspec.lock index 51d97f66..1eac70f7 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1226,6 +1226,14 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "4.1.0" + re_highlight: + dependency: "direct main" + description: + name: re_highlight + sha256: "6c4ac3f76f939fb7ca9df013df98526634e17d8f7460e028bd23a035870024f2" + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.0.3" rxdart: dependency: transitive description: