saminsohag

Update version to 1.0.14 and add list rendering customization. Introduced `order…

…edListBuilder` and `unOrderedListBuilder` parameters for enhanced list rendering in GptMarkdown.
## 1.0.14
* Added `orderedListBuilder` and `unOrderedListBuilder` parameters to customize list rendering.
## 1.0.13
* Fixed issue [#49](https://github.com/Infinitix-LLC/gpt_markdown/issues/49).
... ...
import 'package:flutter/material.dart';
/// A builder function for the ordered list.
typedef OrderedListBuilder =
Widget Function(
BuildContext context,
String no,
Widget child,
GptMarkdownConfig config,
);
/// A builder function for the unordered list.
typedef UnOrderedListBuilder =
Widget Function(
BuildContext context,
Widget child,
GptMarkdownConfig config,
);
/// A builder function for the source tag.
typedef SourceTagBuilder =
Widget Function(BuildContext context, String content, TextStyle textStyle);
/// A builder function for the code block.
typedef CodeBlockBuilder =
Widget Function(
BuildContext context,
String name,
String code,
bool closed,
);
/// A builder function for the LaTeX.
typedef LatexBuilder =
Widget Function(
BuildContext context,
String tex,
TextStyle textStyle,
bool inline,
);
/// A builder function for the link.
typedef LinkBuilder =
Widget Function(
BuildContext context,
String text,
String url,
TextStyle style,
);
/// A builder function for the highlight.
typedef HighlightBuilder =
Widget Function(BuildContext context, String text, TextStyle style);
/// A builder function for the image.
typedef ImageBuilder = Widget Function(BuildContext context, String imageUrl);
/// A configuration class for the GPT Markdown component.
///
/// The [GptMarkdownConfig] class is used to configure the GPT Markdown component.
... ... @@ -19,6 +74,8 @@ class GptMarkdownConfig {
this.codeBuilder,
this.sourceTagBuilder,
this.highlightBuilder,
this.orderedListBuilder,
this.unOrderedListBuilder,
this.linkBuilder,
this.imageBuilder,
this.maxLines,
... ... @@ -44,33 +101,22 @@ class GptMarkdownConfig {
final String Function(String tex)? latexWorkaround;
/// The LaTeX builder.
final Widget Function(
BuildContext context,
String tex,
TextStyle textStyle,
bool inline,
)?
latexBuilder;
final LatexBuilder? latexBuilder;
/// The source tag builder.
final Widget Function(
BuildContext context,
String content,
TextStyle textStyle,
)?
sourceTagBuilder;
final SourceTagBuilder? sourceTagBuilder;
/// Whether to follow the link color.
final bool followLinkColor;
/// The code builder.
final Widget Function(
BuildContext context,
String name,
String code,
bool closed,
)?
codeBuilder;
final CodeBlockBuilder? codeBuilder;
/// The Ordered List builder.
final OrderedListBuilder? orderedListBuilder;
/// The Unordered List builder.
final UnOrderedListBuilder? unOrderedListBuilder;
/// The maximum number of lines.
final int? maxLines;
... ... @@ -79,18 +125,13 @@ class GptMarkdownConfig {
final TextOverflow? overflow;
/// The highlight builder.
final Widget Function(BuildContext context, String text, TextStyle style)?
highlightBuilder;
final Widget Function(
BuildContext context,
String text,
String url,
TextStyle style,
)?
linkBuilder;
final HighlightBuilder? highlightBuilder;
/// The link builder.
final LinkBuilder? linkBuilder;
/// The image builder.
final Widget Function(BuildContext, String imageUrl)? imageBuilder;
final ImageBuilder? imageBuilder;
/// A copy of the configuration with the specified parameters.
GptMarkdownConfig copyWith({
... ... @@ -100,39 +141,17 @@ class GptMarkdownConfig {
final TextAlign? textAlign,
final TextScaler? textScaler,
final String Function(String tex)? latexWorkaround,
final Widget Function(
BuildContext context,
String tex,
TextStyle textStyle,
bool inline,
)?
latexBuilder,
final Widget Function(
BuildContext context,
String content,
TextStyle textStyle,
)?
sourceTagBuilder,
bool? followLinkColor,
final Widget Function(
BuildContext context,
String name,
String code,
bool closed,
)?
codeBuilder,
final LatexBuilder? latexBuilder,
final SourceTagBuilder? sourceTagBuilder,
final bool? followLinkColor,
final CodeBlockBuilder? codeBuilder,
final int? maxLines,
final TextOverflow? overflow,
final Widget Function(BuildContext context, String text, TextStyle style)?
highlightBuilder,
final Widget Function(
BuildContext context,
String text,
String url,
TextStyle style,
)?
linkBuilder,
final Widget Function(BuildContext, String imageUrl)? imageBuilder,
final HighlightBuilder? highlightBuilder,
final LinkBuilder? linkBuilder,
final ImageBuilder? imageBuilder,
final OrderedListBuilder? orderedListBuilder,
final UnOrderedListBuilder? unOrderedListBuilder,
}) {
return GptMarkdownConfig(
style: style ?? this.style,
... ... @@ -150,6 +169,8 @@ class GptMarkdownConfig {
highlightBuilder: highlightBuilder ?? this.highlightBuilder,
linkBuilder: linkBuilder ?? this.linkBuilder,
imageBuilder: imageBuilder ?? this.imageBuilder,
orderedListBuilder: orderedListBuilder ?? this.orderedListBuilder,
unOrderedListBuilder: unOrderedListBuilder ?? this.unOrderedListBuilder,
);
}
... ...
... ... @@ -38,6 +38,8 @@ class GptMarkdown extends StatelessWidget {
this.linkBuilder,
this.maxLines,
this.overflow,
this.orderedListBuilder,
this.unOrderedListBuilder,
});
/// The direction of the text.
... ... @@ -66,44 +68,31 @@ class GptMarkdown extends StatelessWidget {
final TextOverflow? overflow;
/// The LaTeX builder.
final Widget Function(
BuildContext context,
String tex,
TextStyle style,
bool inline,
)?
latexBuilder;
final LatexBuilder? latexBuilder;
/// Whether to follow the link color.
final bool followLinkColor;
/// The code builder.
final Widget Function(
BuildContext context,
String name,
String code,
bool closed,
)?
codeBuilder;
final CodeBlockBuilder? codeBuilder;
/// The source tag builder.
final Widget Function(BuildContext, String, TextStyle)? sourceTagBuilder;
final SourceTagBuilder? sourceTagBuilder;
/// The highlight builder.
final Widget Function(BuildContext context, String text, TextStyle style)?
highlightBuilder;
final HighlightBuilder? highlightBuilder;
/// The link builder.
final Widget Function(
BuildContext context,
String text,
String url,
TextStyle style,
)?
linkBuilder;
final LinkBuilder? linkBuilder;
/// The image builder.
final Widget Function(BuildContext, String imageUrl)? imageBuilder;
final ImageBuilder? imageBuilder;
/// The ordered list builder.
final OrderedListBuilder? orderedListBuilder;
/// The unordered list builder.
final UnOrderedListBuilder? unOrderedListBuilder;
/// A method to remove extra lines inside block LaTeX.
String _removeExtraLinesInsideBlockLatex(String text) {
... ... @@ -155,6 +144,8 @@ class GptMarkdown extends StatelessWidget {
highlightBuilder: highlightBuilder,
linkBuilder: linkBuilder,
imageBuilder: imageBuilder,
orderedListBuilder: orderedListBuilder,
unOrderedListBuilder: unOrderedListBuilder,
),
),
);
... ...
... ... @@ -329,26 +329,30 @@ class UnOrderedList extends BlockMd {
final GptMarkdownConfig config,
) {
var match = this.exp.firstMatch(text);
return UnorderedListView(
bulletColor:
(config.style?.color ?? DefaultTextStyle.of(context).style.color),
padding: 7,
spacing: 10,
bulletSize:
0.3 *
(config.style?.fontSize ??
DefaultTextStyle.of(context).style.fontSize ??
kDefaultFontSize),
textDirection: config.textDirection,
child: MdWidget("${match?[1]?.trim()}", config: config),
);
var child = MdWidget("${match?[1]?.trim()}", config: config);
return config.unOrderedListBuilder?.call(context, child, config) ??
UnorderedListView(
bulletColor:
(config.style?.color ?? DefaultTextStyle.of(context).style.color),
padding: 7,
spacing: 10,
bulletSize:
0.3 *
(config.style?.fontSize ??
DefaultTextStyle.of(context).style.fontSize ??
kDefaultFontSize),
textDirection: config.textDirection,
child: child,
);
}
}
/// Ordered list component
class OrderedList extends BlockMd {
@override
String get expString => (r"([0-9]+\.)\ ([^\n]+)$");
String get expString => (r"([0-9]+)\.\ ([^\n]+)$");
@override
Widget build(
... ... @@ -357,14 +361,24 @@ class OrderedList extends BlockMd {
final GptMarkdownConfig config,
) {
var match = this.exp.firstMatch(text.trim());
return OrderedListView(
no: "${match?[1]}",
textDirection: config.textDirection,
style: (config.style ?? const TextStyle()).copyWith(
fontWeight: FontWeight.w100,
),
child: MdWidget("${match?[2]?.trim()}", config: config),
);
var no = "${match?[1]}";
var child = MdWidget("${match?[2]?.trim()}", config: config);
return config.orderedListBuilder?.call(
context,
no,
child,
config.copyWith(),
) ??
OrderedListView(
no: "$no.",
textDirection: config.textDirection,
style: (config.style ?? const TextStyle()).copyWith(
fontWeight: FontWeight.w100,
),
child: child,
);
}
}
... ... @@ -426,7 +440,6 @@ class BoldMd extends InlineMd {
final GptMarkdownConfig config,
) {
var match = exp.firstMatch(text.trim());
print(match);
var conf = config.copyWith(
style:
config.style?.copyWith(fontWeight: FontWeight.bold) ??
... ...
name: gpt_markdown
description: "Powerful Markdown & LaTeX Renderer for Flutter: Rich Text, Math, Tables, Links, and Text Selection. Ideal for ChatGPT, Gemini, and more."
version: 1.0.13
version: 1.0.14
homepage: https://github.com/Infinitix-LLC/gpt_markdown
environment:
... ...