opt: 专栏代码块渲染

This commit is contained in:
guozhigq
2024-09-27 16:38:47 +08:00
parent c24c57a493
commit 9320c04c1c
3 changed files with 37 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;
}