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: