opt: 专栏代码块渲染

This commit is contained in:
guozhigq
2024-09-27 16:38:47 +08:00
parent feaec8fc30
commit 9541d7a4ea
4 changed files with 39 additions and 0 deletions

View File

@ -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<String, String> buildContext, attributes) {},
extensions: [
TagExtension(
tagsToExtend: <String>{'pre'},
builder: (ExtensionContext extensionContext) {
final Map<String, dynamic> attributes = extensionContext.attributes;
final String lang = attributes['data-lang'] as String;
final String code = attributes['codecontent'] as String;
List<String> selectedLanguages = [lang.split('@').first];
TextSpan? result = highlightExistingText(code, selectedLanguages);
if (result == null) {
return const Center(child: Text('代码块渲染失败'));
}
return SelectableText.rich(result);
},
),
TagExtension(
tagsToExtend: <String>{'img'},
builder: (ExtensionContext extensionContext) {

14
lib/utils/highlight.dart Normal file
View File

@ -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<String> 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;
}

View File

@ -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:

View File

@ -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: