Showing
3 changed files
with
29 additions
and
2 deletions
| @@ -13,6 +13,7 @@ class GptMarkdownConfig { | @@ -13,6 +13,7 @@ class GptMarkdownConfig { | ||
| 13 | this.codeBuilder, | 13 | this.codeBuilder, |
| 14 | this.sourceTagBuilder, | 14 | this.sourceTagBuilder, |
| 15 | this.highlightBuilder, | 15 | this.highlightBuilder, |
| 16 | + this.linkBuilder, | ||
| 16 | this.maxLines, | 17 | this.maxLines, |
| 17 | this.overflow, | 18 | this.overflow, |
| 18 | }); | 19 | }); |
| @@ -34,6 +35,7 @@ class GptMarkdownConfig { | @@ -34,6 +35,7 @@ class GptMarkdownConfig { | ||
| 34 | final int? maxLines; | 35 | final int? maxLines; |
| 35 | final TextOverflow? overflow; | 36 | final TextOverflow? overflow; |
| 36 | final Widget Function(BuildContext context, String text, TextStyle style)? highlightBuilder; | 37 | final Widget Function(BuildContext context, String text, TextStyle style)? highlightBuilder; |
| 38 | + final Widget Function(BuildContext context, String text, String url, TextStyle style)? linkBuilder; | ||
| 37 | 39 | ||
| 38 | GptMarkdownConfig copyWith({ | 40 | GptMarkdownConfig copyWith({ |
| 39 | TextStyle? style, | 41 | TextStyle? style, |
| @@ -54,6 +56,7 @@ class GptMarkdownConfig { | @@ -54,6 +56,7 @@ class GptMarkdownConfig { | ||
| 54 | final int? maxLines, | 56 | final int? maxLines, |
| 55 | final TextOverflow? overflow, | 57 | final TextOverflow? overflow, |
| 56 | final Widget Function(BuildContext context, String text, TextStyle style)? highlightBuilder, | 58 | final Widget Function(BuildContext context, String text, TextStyle style)? highlightBuilder, |
| 59 | + final Widget Function(BuildContext context, String text, String url, TextStyle style)? linkBuilder, | ||
| 57 | }) { | 60 | }) { |
| 58 | return GptMarkdownConfig( | 61 | return GptMarkdownConfig( |
| 59 | style: style ?? this.style, | 62 | style: style ?? this.style, |
| @@ -69,6 +72,7 @@ class GptMarkdownConfig { | @@ -69,6 +72,7 @@ class GptMarkdownConfig { | ||
| 69 | maxLines: maxLines ?? this.maxLines, | 72 | maxLines: maxLines ?? this.maxLines, |
| 70 | overflow: overflow ?? this.overflow, | 73 | overflow: overflow ?? this.overflow, |
| 71 | highlightBuilder: highlightBuilder ?? this.highlightBuilder, | 74 | highlightBuilder: highlightBuilder ?? this.highlightBuilder, |
| 75 | + linkBuilder: linkBuilder ?? this.linkBuilder, | ||
| 72 | ); | 76 | ); |
| 73 | } | 77 | } |
| 74 | 78 |
| @@ -35,6 +35,7 @@ class GptMarkdown extends StatelessWidget { | @@ -35,6 +35,7 @@ class GptMarkdown extends StatelessWidget { | ||
| 35 | this.codeBuilder, | 35 | this.codeBuilder, |
| 36 | this.sourceTagBuilder, | 36 | this.sourceTagBuilder, |
| 37 | this.highlightBuilder, | 37 | this.highlightBuilder, |
| 38 | + this.linkBuilder, | ||
| 38 | this.maxLines, | 39 | this.maxLines, |
| 39 | this.overflow, | 40 | this.overflow, |
| 40 | }); | 41 | }); |
| @@ -55,6 +56,7 @@ class GptMarkdown extends StatelessWidget { | @@ -55,6 +56,7 @@ class GptMarkdown extends StatelessWidget { | ||
| 55 | codeBuilder; | 56 | codeBuilder; |
| 56 | final Widget Function(BuildContext, String, TextStyle)? sourceTagBuilder; | 57 | final Widget Function(BuildContext, String, TextStyle)? sourceTagBuilder; |
| 57 | final Widget Function(BuildContext context, String text, TextStyle style)? highlightBuilder; | 58 | final Widget Function(BuildContext context, String text, TextStyle style)? highlightBuilder; |
| 59 | + final Widget Function(BuildContext context, String text, String url, TextStyle style)? linkBuilder; | ||
| 58 | 60 | ||
| 59 | @override | 61 | @override |
| 60 | Widget build(BuildContext context) { | 62 | Widget build(BuildContext context) { |
| @@ -96,6 +98,7 @@ class GptMarkdown extends StatelessWidget { | @@ -96,6 +98,7 @@ class GptMarkdown extends StatelessWidget { | ||
| 96 | overflow: overflow, | 98 | overflow: overflow, |
| 97 | sourceTagBuilder: sourceTagBuilder, | 99 | sourceTagBuilder: sourceTagBuilder, |
| 98 | highlightBuilder: highlightBuilder, | 100 | highlightBuilder: highlightBuilder, |
| 101 | + linkBuilder: linkBuilder, | ||
| 99 | ), | 102 | ), |
| 100 | )); | 103 | )); |
| 101 | } | 104 | } |
| @@ -733,15 +733,35 @@ class ATagMd extends InlineMd { | @@ -733,15 +733,35 @@ class ATagMd extends InlineMd { | ||
| 733 | if (match?[1] == null && match?[2] == null) { | 733 | if (match?[1] == null && match?[2] == null) { |
| 734 | return const TextSpan(); | 734 | return const TextSpan(); |
| 735 | } | 735 | } |
| 736 | + | ||
| 737 | + final linkText = match?[1] ?? ""; | ||
| 738 | + final url = match?[2] ?? ""; | ||
| 739 | + | ||
| 740 | + // Use custom builder if provided | ||
| 741 | + if (config.linkBuilder != null) { | ||
| 742 | + return WidgetSpan( | ||
| 743 | + child: GestureDetector( | ||
| 744 | + onTap: () => config.onLinkTab?.call(url, linkText), | ||
| 745 | + child: config.linkBuilder!( | ||
| 746 | + context, | ||
| 747 | + linkText, | ||
| 748 | + url, | ||
| 749 | + config.style ?? const TextStyle(), | ||
| 750 | + ), | ||
| 751 | + ), | ||
| 752 | + ); | ||
| 753 | + } | ||
| 754 | + | ||
| 755 | + // Default rendering | ||
| 736 | var theme = GptMarkdownTheme.of(context); | 756 | var theme = GptMarkdownTheme.of(context); |
| 737 | return WidgetSpan( | 757 | return WidgetSpan( |
| 738 | child: LinkButton( | 758 | child: LinkButton( |
| 739 | hoverColor: theme.linkHoverColor, | 759 | hoverColor: theme.linkHoverColor, |
| 740 | color: theme.linkColor, | 760 | color: theme.linkColor, |
| 741 | onPressed: () { | 761 | onPressed: () { |
| 742 | - config.onLinkTab?.call("${match?[2]}", "${match?[1]}"); | 762 | + config.onLinkTab?.call(url, linkText); |
| 743 | }, | 763 | }, |
| 744 | - text: match?[1] ?? "", | 764 | + text: linkText, |
| 745 | config: config, | 765 | config: config, |
| 746 | ), | 766 | ), |
| 747 | ); | 767 | ); |
-
Please register or login to post a comment