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 6b3bc06f..b9d48c78 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1234,6 +1234,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: diff --git a/pubspec.yaml b/pubspec.yaml index 65daca1e..617b0c7d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -149,6 +149,8 @@ dependencies: bottom_sheet: ^4.0.4 web_socket_channel: ^2.4.5 brotli: ^0.6.0 + # 文本语法高亮 + re_highlight: ^0.0.3 dev_dependencies: flutter_test: