Showing
14 changed files
with
496 additions
and
452 deletions
@@ -16,30 +16,29 @@ class _CodeFieldState extends State<CodeField> { | @@ -16,30 +16,29 @@ class _CodeFieldState extends State<CodeField> { | ||
16 | Widget build(BuildContext context) { | 16 | Widget build(BuildContext context) { |
17 | return Material( | 17 | return Material( |
18 | color: Theme.of(context).colorScheme.onInverseSurface, | 18 | color: Theme.of(context).colorScheme.onInverseSurface, |
19 | - shape: RoundedRectangleBorder( | ||
20 | - borderRadius: BorderRadius.circular(8), | ||
21 | - ), | 19 | + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), |
22 | child: Column( | 20 | child: Column( |
23 | crossAxisAlignment: CrossAxisAlignment.stretch, | 21 | crossAxisAlignment: CrossAxisAlignment.stretch, |
24 | children: [ | 22 | children: [ |
25 | Row( | 23 | Row( |
26 | children: [ | 24 | children: [ |
27 | Padding( | 25 | Padding( |
28 | - padding: | ||
29 | - const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8), | 26 | + padding: const EdgeInsets.symmetric( |
27 | + horizontal: 16.0, | ||
28 | + vertical: 8, | ||
29 | + ), | ||
30 | child: Text(widget.name), | 30 | child: Text(widget.name), |
31 | ), | 31 | ), |
32 | const Spacer(), | 32 | const Spacer(), |
33 | TextButton.icon( | 33 | TextButton.icon( |
34 | style: TextButton.styleFrom( | 34 | style: TextButton.styleFrom( |
35 | foregroundColor: Theme.of(context).colorScheme.onSurface, | 35 | foregroundColor: Theme.of(context).colorScheme.onSurface, |
36 | - textStyle: const TextStyle( | ||
37 | - fontWeight: FontWeight.normal, | ||
38 | - ), | 36 | + textStyle: const TextStyle(fontWeight: FontWeight.normal), |
39 | ), | 37 | ), |
40 | onPressed: () async { | 38 | onPressed: () async { |
41 | - await Clipboard.setData(ClipboardData(text: widget.codes)) | ||
42 | - .then((value) { | 39 | + await Clipboard.setData( |
40 | + ClipboardData(text: widget.codes), | ||
41 | + ).then((value) { | ||
43 | setState(() { | 42 | setState(() { |
44 | _copied = true; | 43 | _copied = true; |
45 | }); | 44 | }); |
@@ -57,15 +56,11 @@ class _CodeFieldState extends State<CodeField> { | @@ -57,15 +56,11 @@ class _CodeFieldState extends State<CodeField> { | ||
57 | ), | 56 | ), |
58 | ], | 57 | ], |
59 | ), | 58 | ), |
60 | - const Divider( | ||
61 | - height: 1, | ||
62 | - ), | 59 | + const Divider(height: 1), |
63 | SingleChildScrollView( | 60 | SingleChildScrollView( |
64 | scrollDirection: Axis.horizontal, | 61 | scrollDirection: Axis.horizontal, |
65 | padding: const EdgeInsets.all(16), | 62 | padding: const EdgeInsets.all(16), |
66 | - child: Text( | ||
67 | - widget.codes, | ||
68 | - ), | 63 | + child: Text(widget.codes), |
69 | ), | 64 | ), |
70 | ], | 65 | ], |
71 | ), | 66 | ), |
@@ -16,7 +16,9 @@ class CustomDivider extends LeafRenderObjectWidget { | @@ -16,7 +16,9 @@ class CustomDivider extends LeafRenderObjectWidget { | ||
16 | 16 | ||
17 | @override | 17 | @override |
18 | void updateRenderObject( | 18 | void updateRenderObject( |
19 | - BuildContext context, covariant RenderDivider renderObject) { | 19 | + BuildContext context, |
20 | + covariant RenderDivider renderObject, | ||
21 | + ) { | ||
20 | renderObject.color = color ?? Theme.of(context).colorScheme.outline; | 22 | renderObject.color = color ?? Theme.of(context).colorScheme.outline; |
21 | renderObject.height = height ?? 2; | 23 | renderObject.height = height ?? 2; |
22 | renderObject.width = MediaQuery.sizeOf(context).width; | 24 | renderObject.width = MediaQuery.sizeOf(context).width; |
@@ -25,9 +27,9 @@ class CustomDivider extends LeafRenderObjectWidget { | @@ -25,9 +27,9 @@ class CustomDivider extends LeafRenderObjectWidget { | ||
25 | 27 | ||
26 | class RenderDivider extends RenderBox { | 28 | class RenderDivider extends RenderBox { |
27 | RenderDivider(Color color, double width, double height) | 29 | RenderDivider(Color color, double width, double height) |
28 | - : _color = color, | ||
29 | - _height = height, | ||
30 | - _width = width; | 30 | + : _color = color, |
31 | + _height = height, | ||
32 | + _width = width; | ||
31 | Color _color; | 33 | Color _color; |
32 | double _height; | 34 | double _height; |
33 | double _width; | 35 | double _width; |
@@ -57,9 +59,10 @@ class RenderDivider extends RenderBox { | @@ -57,9 +59,10 @@ class RenderDivider extends RenderBox { | ||
57 | 59 | ||
58 | @override | 60 | @override |
59 | Size computeDryLayout(BoxConstraints constraints) { | 61 | Size computeDryLayout(BoxConstraints constraints) { |
60 | - return BoxConstraints.tightFor(width: null, height: _height) | ||
61 | - .enforce(constraints) | ||
62 | - .smallest; | 62 | + return BoxConstraints.tightFor( |
63 | + width: null, | ||
64 | + height: _height, | ||
65 | + ).enforce(constraints).smallest; | ||
63 | } | 66 | } |
64 | 67 | ||
65 | @override | 68 | @override |
@@ -69,7 +72,9 @@ class RenderDivider extends RenderBox { | @@ -69,7 +72,9 @@ class RenderDivider extends RenderBox { | ||
69 | 72 | ||
70 | @override | 73 | @override |
71 | void paint(PaintingContext context, Offset offset) { | 74 | void paint(PaintingContext context, Offset offset) { |
72 | - context.canvas.drawRect(offset & Size(Rect.largest.size.width, _height), | ||
73 | - Paint()..color = _color); | 75 | + context.canvas.drawRect( |
76 | + offset & Size(Rect.largest.size.width, _height), | ||
77 | + Paint()..color = _color, | ||
78 | + ); | ||
74 | } | 79 | } |
75 | } | 80 | } |
@@ -25,8 +25,11 @@ class CustomImageError extends LeafRenderObjectWidget { | @@ -25,8 +25,11 @@ class CustomImageError extends LeafRenderObjectWidget { | ||
25 | 25 | ||
26 | @override | 26 | @override |
27 | void updateRenderObject( | 27 | void updateRenderObject( |
28 | - BuildContext context, covariant RenderCustomImageError renderObject) { | ||
29 | - renderObject._backgroundColor = backgroundColor ?? | 28 | + BuildContext context, |
29 | + covariant RenderCustomImageError renderObject, | ||
30 | + ) { | ||
31 | + renderObject._backgroundColor = | ||
32 | + backgroundColor ?? | ||
30 | Theme.of(context).colorScheme.surfaceContainerHighest; | 33 | Theme.of(context).colorScheme.surfaceContainerHighest; |
31 | renderObject._iconColor = | 34 | renderObject._iconColor = |
32 | iconColor ?? Theme.of(context).colorScheme.onSurfaceVariant; | 35 | iconColor ?? Theme.of(context).colorScheme.onSurfaceVariant; |
@@ -37,7 +40,10 @@ class CustomImageError extends LeafRenderObjectWidget { | @@ -37,7 +40,10 @@ class CustomImageError extends LeafRenderObjectWidget { | ||
37 | 40 | ||
38 | class RenderCustomImageError extends RenderProxyBox { | 41 | class RenderCustomImageError extends RenderProxyBox { |
39 | RenderCustomImageError( | 42 | RenderCustomImageError( |
40 | - this._iconColor, this._backgroundColor, this._outlineColor); | 43 | + this._iconColor, |
44 | + this._backgroundColor, | ||
45 | + this._outlineColor, | ||
46 | + ); | ||
41 | Color _iconColor; | 47 | Color _iconColor; |
42 | Color _outlineColor; | 48 | Color _outlineColor; |
43 | Color _backgroundColor; | 49 | Color _backgroundColor; |
@@ -68,29 +74,29 @@ class RenderCustomImageError extends RenderProxyBox { | @@ -68,29 +74,29 @@ class RenderCustomImageError extends RenderProxyBox { | ||
68 | @override | 74 | @override |
69 | void performLayout() { | 75 | void performLayout() { |
70 | if (constraints.hasBoundedHeight && constraints.hasBoundedWidth) { | 76 | if (constraints.hasBoundedHeight && constraints.hasBoundedWidth) { |
71 | - size = constraints.constrain(Size( | 77 | + size = constraints.constrain( |
78 | + Size( | ||
72 | min(constraints.maxWidth, constraints.maxHeight), | 79 | min(constraints.maxWidth, constraints.maxHeight), |
73 | - min(constraints.maxHeight, constraints.maxWidth))); | 80 | + min(constraints.maxHeight, constraints.maxWidth), |
81 | + ), | ||
82 | + ); | ||
74 | return; | 83 | return; |
75 | } | 84 | } |
76 | if (constraints.hasBoundedHeight || constraints.hasBoundedWidth) { | 85 | if (constraints.hasBoundedHeight || constraints.hasBoundedWidth) { |
77 | - size = constraints.constrain(Size( | ||
78 | - min(constraints.maxHeight, constraints.maxWidth), | ||
79 | - min(constraints.maxHeight, constraints.maxWidth), | ||
80 | - )); | 86 | + size = constraints.constrain( |
87 | + Size( | ||
88 | + min(constraints.maxHeight, constraints.maxWidth), | ||
89 | + min(constraints.maxHeight, constraints.maxWidth), | ||
90 | + ), | ||
91 | + ); | ||
81 | return; | 92 | return; |
82 | } | 93 | } |
83 | - size = constraints.constrain( | ||
84 | - const Size(80, 80), | ||
85 | - ); | 94 | + size = constraints.constrain(const Size(80, 80)); |
86 | } | 95 | } |
87 | 96 | ||
88 | @override | 97 | @override |
89 | void paint(PaintingContext context, Offset offset) { | 98 | void paint(PaintingContext context, Offset offset) { |
90 | - context.canvas.drawRect( | ||
91 | - offset & size, | ||
92 | - Paint()..color = _backgroundColor, | ||
93 | - ); | 99 | + context.canvas.drawRect(offset & size, Paint()..color = _backgroundColor); |
94 | context.canvas.drawRect( | 100 | context.canvas.drawRect( |
95 | offset & size, | 101 | offset & size, |
96 | Paint() | 102 | Paint() |
@@ -102,16 +108,19 @@ class RenderCustomImageError extends RenderProxyBox { | @@ -102,16 +108,19 @@ class RenderCustomImageError extends RenderProxyBox { | ||
102 | textPainter.text = TextSpan( | 108 | textPainter.text = TextSpan( |
103 | text: String.fromCharCode(icon.codePoint), | 109 | text: String.fromCharCode(icon.codePoint), |
104 | style: TextStyle( | 110 | style: TextStyle( |
105 | - fontSize: min(min(size.width, size.height), 35), | ||
106 | - fontFamily: icon.fontFamily, | ||
107 | - color: _iconColor), | 111 | + fontSize: min(min(size.width, size.height), 35), |
112 | + fontFamily: icon.fontFamily, | ||
113 | + color: _iconColor, | ||
114 | + ), | ||
108 | ); | 115 | ); |
109 | textPainter.layout(); | 116 | textPainter.layout(); |
110 | textPainter.paint( | 117 | textPainter.paint( |
111 | context.canvas, | 118 | context.canvas, |
112 | offset + | 119 | offset + |
113 | - Offset(size.width / 2 - textPainter.size.width / 2, | ||
114 | - size.height / 2 - textPainter.size.height / 2), | 120 | + Offset( |
121 | + size.width / 2 - textPainter.size.width / 2, | ||
122 | + size.height / 2 - textPainter.size.height / 2, | ||
123 | + ), | ||
115 | ); | 124 | ); |
116 | } | 125 | } |
117 | } | 126 | } |
@@ -141,8 +150,11 @@ class CustomImageLoading extends LeafRenderObjectWidget { | @@ -141,8 +150,11 @@ class CustomImageLoading extends LeafRenderObjectWidget { | ||
141 | 150 | ||
142 | @override | 151 | @override |
143 | void updateRenderObject( | 152 | void updateRenderObject( |
144 | - BuildContext context, covariant RenderCustomImageLoading renderObject) { | ||
145 | - renderObject._backgroundColor = backgroundColor ?? | 153 | + BuildContext context, |
154 | + covariant RenderCustomImageLoading renderObject, | ||
155 | + ) { | ||
156 | + renderObject._backgroundColor = | ||
157 | + backgroundColor ?? | ||
146 | Theme.of(context).colorScheme.surfaceContainerHighest; | 158 | Theme.of(context).colorScheme.surfaceContainerHighest; |
147 | renderObject._iconColor = | 159 | renderObject._iconColor = |
148 | iconColor ?? Theme.of(context).colorScheme.onSurfaceVariant; | 160 | iconColor ?? Theme.of(context).colorScheme.onSurfaceVariant; |
@@ -153,8 +165,12 @@ class CustomImageLoading extends LeafRenderObjectWidget { | @@ -153,8 +165,12 @@ class CustomImageLoading extends LeafRenderObjectWidget { | ||
153 | } | 165 | } |
154 | 166 | ||
155 | class RenderCustomImageLoading extends RenderProxyBox { | 167 | class RenderCustomImageLoading extends RenderProxyBox { |
156 | - RenderCustomImageLoading(this._iconColor, this._backgroundColor, | ||
157 | - this._outlineColor, this._progress); | 168 | + RenderCustomImageLoading( |
169 | + this._iconColor, | ||
170 | + this._backgroundColor, | ||
171 | + this._outlineColor, | ||
172 | + this._progress, | ||
173 | + ); | ||
158 | Color _iconColor; | 174 | Color _iconColor; |
159 | Color _outlineColor; | 175 | Color _outlineColor; |
160 | Color _backgroundColor; | 176 | Color _backgroundColor; |
@@ -194,29 +210,29 @@ class RenderCustomImageLoading extends RenderProxyBox { | @@ -194,29 +210,29 @@ class RenderCustomImageLoading extends RenderProxyBox { | ||
194 | @override | 210 | @override |
195 | void performLayout() { | 211 | void performLayout() { |
196 | if (constraints.hasBoundedHeight && constraints.hasBoundedWidth) { | 212 | if (constraints.hasBoundedHeight && constraints.hasBoundedWidth) { |
197 | - size = constraints.constrain(Size( | 213 | + size = constraints.constrain( |
214 | + Size( | ||
198 | min(constraints.maxWidth, constraints.maxHeight), | 215 | min(constraints.maxWidth, constraints.maxHeight), |
199 | - min(constraints.maxHeight, constraints.maxWidth))); | 216 | + min(constraints.maxHeight, constraints.maxWidth), |
217 | + ), | ||
218 | + ); | ||
200 | return; | 219 | return; |
201 | } | 220 | } |
202 | if (constraints.hasBoundedHeight || constraints.hasBoundedWidth) { | 221 | if (constraints.hasBoundedHeight || constraints.hasBoundedWidth) { |
203 | - size = constraints.constrain(Size( | ||
204 | - min(constraints.maxHeight, constraints.maxWidth), | ||
205 | - min(constraints.maxHeight, constraints.maxWidth), | ||
206 | - )); | 222 | + size = constraints.constrain( |
223 | + Size( | ||
224 | + min(constraints.maxHeight, constraints.maxWidth), | ||
225 | + min(constraints.maxHeight, constraints.maxWidth), | ||
226 | + ), | ||
227 | + ); | ||
207 | return; | 228 | return; |
208 | } | 229 | } |
209 | - size = constraints.constrain( | ||
210 | - const Size(80, 80), | ||
211 | - ); | 230 | + size = constraints.constrain(const Size(80, 80)); |
212 | } | 231 | } |
213 | 232 | ||
214 | @override | 233 | @override |
215 | void paint(PaintingContext context, Offset offset) { | 234 | void paint(PaintingContext context, Offset offset) { |
216 | - context.canvas.drawRect( | ||
217 | - offset & size, | ||
218 | - Paint()..color = _backgroundColor, | ||
219 | - ); | 235 | + context.canvas.drawRect(offset & size, Paint()..color = _backgroundColor); |
220 | context.canvas.drawRect( | 236 | context.canvas.drawRect( |
221 | offset & size, | 237 | offset & size, |
222 | Paint() | 238 | Paint() |
@@ -228,19 +244,23 @@ class RenderCustomImageLoading extends RenderProxyBox { | @@ -228,19 +244,23 @@ class RenderCustomImageLoading extends RenderProxyBox { | ||
228 | textPainter.text = TextSpan( | 244 | textPainter.text = TextSpan( |
229 | text: String.fromCharCode(icon.codePoint), | 245 | text: String.fromCharCode(icon.codePoint), |
230 | style: TextStyle( | 246 | style: TextStyle( |
231 | - fontSize: min(min(size.width, size.height), 35), | ||
232 | - fontFamily: icon.fontFamily, | ||
233 | - color: _iconColor), | 247 | + fontSize: min(min(size.width, size.height), 35), |
248 | + fontFamily: icon.fontFamily, | ||
249 | + color: _iconColor, | ||
250 | + ), | ||
234 | ); | 251 | ); |
235 | textPainter.layout(); | 252 | textPainter.layout(); |
236 | context.canvas.drawRect( | 253 | context.canvas.drawRect( |
237 | - (offset + Offset(0, size.height - 5)) & Size(size.width * _progress, 5), | ||
238 | - Paint()..color = _iconColor); | 254 | + (offset + Offset(0, size.height - 5)) & Size(size.width * _progress, 5), |
255 | + Paint()..color = _iconColor, | ||
256 | + ); | ||
239 | textPainter.paint( | 257 | textPainter.paint( |
240 | context.canvas, | 258 | context.canvas, |
241 | offset + | 259 | offset + |
242 | - Offset(size.width / 2 - textPainter.size.width / 2, | ||
243 | - size.height / 2 - textPainter.size.height / 2), | 260 | + Offset( |
261 | + size.width / 2 - textPainter.size.width / 2, | ||
262 | + size.height / 2 - textPainter.size.height / 2, | ||
263 | + ), | ||
244 | ); | 264 | ); |
245 | } | 265 | } |
246 | } | 266 | } |
@@ -25,8 +25,10 @@ class CustomRb extends StatelessWidget { | @@ -25,8 +25,10 @@ class CustomRb extends StatelessWidget { | ||
25 | WidgetSpan( | 25 | WidgetSpan( |
26 | alignment: PlaceholderAlignment.middle, | 26 | alignment: PlaceholderAlignment.middle, |
27 | child: Padding( | 27 | child: Padding( |
28 | - padding: | ||
29 | - EdgeInsetsDirectional.only(start: spacing, end: spacing), | 28 | + padding: EdgeInsetsDirectional.only( |
29 | + start: spacing, | ||
30 | + end: spacing, | ||
31 | + ), | ||
30 | child: Radio( | 32 | child: Radio( |
31 | value: value, | 33 | value: value, |
32 | groupValue: true, | 34 | groupValue: true, |
@@ -36,9 +38,7 @@ class CustomRb extends StatelessWidget { | @@ -36,9 +38,7 @@ class CustomRb extends StatelessWidget { | ||
36 | ), | 38 | ), |
37 | ), | 39 | ), |
38 | ), | 40 | ), |
39 | - Expanded( | ||
40 | - child: child, | ||
41 | - ) | 41 | + Expanded(child: child), |
42 | ], | 42 | ], |
43 | ), | 43 | ), |
44 | ); | 44 | ); |
@@ -70,15 +70,15 @@ class CustomCb extends StatelessWidget { | @@ -70,15 +70,15 @@ class CustomCb extends StatelessWidget { | ||
70 | WidgetSpan( | 70 | WidgetSpan( |
71 | alignment: PlaceholderAlignment.middle, | 71 | alignment: PlaceholderAlignment.middle, |
72 | child: Padding( | 72 | child: Padding( |
73 | - padding: | ||
74 | - EdgeInsetsDirectional.only(start: spacing, end: spacing), | 73 | + padding: EdgeInsetsDirectional.only( |
74 | + start: spacing, | ||
75 | + end: spacing, | ||
76 | + ), | ||
75 | child: Checkbox(value: value, onChanged: (value) {}), | 77 | child: Checkbox(value: value, onChanged: (value) {}), |
76 | ), | 78 | ), |
77 | ), | 79 | ), |
78 | ), | 80 | ), |
79 | - Expanded( | ||
80 | - child: child, | ||
81 | - ) | 81 | + Expanded(child: child), |
82 | ], | 82 | ], |
83 | ), | 83 | ), |
84 | ); | 84 | ); |
@@ -11,15 +11,16 @@ class LinkButton extends StatefulWidget { | @@ -11,15 +11,16 @@ class LinkButton extends StatefulWidget { | ||
11 | final Color color; | 11 | final Color color; |
12 | final Color hoverColor; | 12 | final Color hoverColor; |
13 | 13 | ||
14 | - const LinkButton( | ||
15 | - {super.key, | ||
16 | - required this.text, | ||
17 | - required this.config, | ||
18 | - required this.color, | ||
19 | - required this.hoverColor, | ||
20 | - this.onPressed, | ||
21 | - this.textStyle, | ||
22 | - this.url}); | 14 | + const LinkButton({ |
15 | + super.key, | ||
16 | + required this.text, | ||
17 | + required this.config, | ||
18 | + required this.color, | ||
19 | + required this.hoverColor, | ||
20 | + this.onPressed, | ||
21 | + this.textStyle, | ||
22 | + this.url, | ||
23 | + }); | ||
23 | 24 | ||
24 | @override | 25 | @override |
25 | State<LinkButton> createState() => _LinkButtonState(); | 26 | State<LinkButton> createState() => _LinkButtonState(); |
@@ -44,12 +45,7 @@ class _LinkButtonState extends State<LinkButton> { | @@ -44,12 +45,7 @@ class _LinkButtonState extends State<LinkButton> { | ||
44 | onTapUp: (_) => _handlePress(false), | 45 | onTapUp: (_) => _handlePress(false), |
45 | onTapCancel: () => _handlePress(false), | 46 | onTapCancel: () => _handlePress(false), |
46 | onTap: widget.onPressed, | 47 | onTap: widget.onPressed, |
47 | - child: widget.config.getRich( | ||
48 | - TextSpan( | ||
49 | - text: widget.text, | ||
50 | - style: style, | ||
51 | - ), | ||
52 | - ), | 48 | + child: widget.config.getRich(TextSpan(text: widget.text, style: style)), |
53 | ), | 49 | ), |
54 | ); | 50 | ); |
55 | } | 51 | } |
@@ -24,21 +24,37 @@ class GptMarkdownConfig { | @@ -24,21 +24,37 @@ class GptMarkdownConfig { | ||
24 | final void Function(String url, String title)? onLinkTab; | 24 | final void Function(String url, String title)? onLinkTab; |
25 | final String Function(String tex)? latexWorkaround; | 25 | final String Function(String tex)? latexWorkaround; |
26 | final Widget Function( | 26 | final Widget Function( |
27 | - BuildContext context, String tex, TextStyle textStyle, bool inline)? | ||
28 | - latexBuilder; | 27 | + BuildContext context, |
28 | + String tex, | ||
29 | + TextStyle textStyle, | ||
30 | + bool inline, | ||
31 | + )? | ||
32 | + latexBuilder; | ||
29 | final Widget Function( | 33 | final Widget Function( |
30 | - BuildContext context, String content, TextStyle textStyle)? | ||
31 | - sourceTagBuilder; | 34 | + BuildContext context, |
35 | + String content, | ||
36 | + TextStyle textStyle, | ||
37 | + )? | ||
38 | + sourceTagBuilder; | ||
32 | final bool followLinkColor; | 39 | final bool followLinkColor; |
33 | final Widget Function( | 40 | final Widget Function( |
34 | - BuildContext context, String name, String code, bool closed)? codeBuilder; | 41 | + BuildContext context, |
42 | + String name, | ||
43 | + String code, | ||
44 | + bool closed, | ||
45 | + )? | ||
46 | + codeBuilder; | ||
35 | final int? maxLines; | 47 | final int? maxLines; |
36 | final TextOverflow? overflow; | 48 | final TextOverflow? overflow; |
37 | final Widget Function(BuildContext context, String text, TextStyle style)? | 49 | final Widget Function(BuildContext context, String text, TextStyle style)? |
38 | - highlightBuilder; | 50 | + highlightBuilder; |
39 | final Widget Function( | 51 | final Widget Function( |
40 | - BuildContext context, String text, String url, TextStyle style)? | ||
41 | - linkBuilder; | 52 | + BuildContext context, |
53 | + String text, | ||
54 | + String url, | ||
55 | + TextStyle style, | ||
56 | + )? | ||
57 | + linkBuilder; | ||
42 | 58 | ||
43 | GptMarkdownConfig copyWith({ | 59 | GptMarkdownConfig copyWith({ |
44 | TextStyle? style, | 60 | TextStyle? style, |
@@ -48,22 +64,37 @@ class GptMarkdownConfig { | @@ -48,22 +64,37 @@ class GptMarkdownConfig { | ||
48 | final TextScaler? textScaler, | 64 | final TextScaler? textScaler, |
49 | final String Function(String tex)? latexWorkaround, | 65 | final String Function(String tex)? latexWorkaround, |
50 | final Widget Function( | 66 | final Widget Function( |
51 | - BuildContext context, String tex, TextStyle textStyle, bool inline)? | ||
52 | - latexBuilder, | 67 | + BuildContext context, |
68 | + String tex, | ||
69 | + TextStyle textStyle, | ||
70 | + bool inline, | ||
71 | + )? | ||
72 | + latexBuilder, | ||
53 | final Widget Function( | 73 | final Widget Function( |
54 | - BuildContext context, String content, TextStyle textStyle)? | ||
55 | - sourceTagBuilder, | 74 | + BuildContext context, |
75 | + String content, | ||
76 | + TextStyle textStyle, | ||
77 | + )? | ||
78 | + sourceTagBuilder, | ||
56 | bool? followLinkColor, | 79 | bool? followLinkColor, |
57 | final Widget Function( | 80 | final Widget Function( |
58 | - BuildContext context, String name, String code, bool closed)? | ||
59 | - codeBuilder, | 81 | + BuildContext context, |
82 | + String name, | ||
83 | + String code, | ||
84 | + bool closed, | ||
85 | + )? | ||
86 | + codeBuilder, | ||
60 | final int? maxLines, | 87 | final int? maxLines, |
61 | final TextOverflow? overflow, | 88 | final TextOverflow? overflow, |
62 | final Widget Function(BuildContext context, String text, TextStyle style)? | 89 | final Widget Function(BuildContext context, String text, TextStyle style)? |
63 | - highlightBuilder, | 90 | + highlightBuilder, |
64 | final Widget Function( | 91 | final Widget Function( |
65 | - BuildContext context, String text, String url, TextStyle style)? | ||
66 | - linkBuilder, | 92 | + BuildContext context, |
93 | + String text, | ||
94 | + String url, | ||
95 | + TextStyle style, | ||
96 | + )? | ||
97 | + linkBuilder, | ||
67 | }) { | 98 | }) { |
68 | return GptMarkdownConfig( | 99 | return GptMarkdownConfig( |
69 | style: style ?? this.style, | 100 | style: style ?? this.style, |
@@ -2,8 +2,11 @@ import 'package:flutter/material.dart'; | @@ -2,8 +2,11 @@ import 'package:flutter/material.dart'; | ||
2 | import 'package:flutter/rendering.dart'; | 2 | import 'package:flutter/rendering.dart'; |
3 | 3 | ||
4 | class SelectableAdapter extends StatelessWidget { | 4 | class SelectableAdapter extends StatelessWidget { |
5 | - const SelectableAdapter( | ||
6 | - {super.key, required this.child, required this.selectedText}); | 5 | + const SelectableAdapter({ |
6 | + super.key, | ||
7 | + required this.child, | ||
8 | + required this.selectedText, | ||
9 | + }); | ||
7 | 10 | ||
8 | final Widget child; | 11 | final Widget child; |
9 | final String selectedText; | 12 | final String selectedText; |
@@ -17,31 +20,37 @@ class SelectableAdapter extends StatelessWidget { | @@ -17,31 +20,37 @@ class SelectableAdapter extends StatelessWidget { | ||
17 | return MouseRegion( | 20 | return MouseRegion( |
18 | cursor: SystemMouseCursors.text, | 21 | cursor: SystemMouseCursors.text, |
19 | child: _SelectableAdapter( | 22 | child: _SelectableAdapter( |
20 | - registrar: registrar, selectedText: selectedText, child: child), | 23 | + registrar: registrar, |
24 | + selectedText: selectedText, | ||
25 | + child: child, | ||
26 | + ), | ||
21 | ); | 27 | ); |
22 | } | 28 | } |
23 | } | 29 | } |
24 | 30 | ||
25 | class _SelectableAdapter extends SingleChildRenderObjectWidget { | 31 | class _SelectableAdapter extends SingleChildRenderObjectWidget { |
26 | - const _SelectableAdapter( | ||
27 | - {required this.registrar, | ||
28 | - required Widget child, | ||
29 | - required this.selectedText}) | ||
30 | - : super(child: child); | 32 | + const _SelectableAdapter({ |
33 | + required this.registrar, | ||
34 | + required Widget child, | ||
35 | + required this.selectedText, | ||
36 | + }) : super(child: child); | ||
31 | 37 | ||
32 | final SelectionRegistrar registrar; | 38 | final SelectionRegistrar registrar; |
33 | final String selectedText; | 39 | final String selectedText; |
34 | @override | 40 | @override |
35 | _RenderSelectableAdapter createRenderObject(BuildContext context) { | 41 | _RenderSelectableAdapter createRenderObject(BuildContext context) { |
36 | return _RenderSelectableAdapter( | 42 | return _RenderSelectableAdapter( |
37 | - DefaultSelectionStyle.of(context).selectionColor!, | ||
38 | - registrar, | ||
39 | - selectedText); | 43 | + DefaultSelectionStyle.of(context).selectionColor!, |
44 | + registrar, | ||
45 | + selectedText, | ||
46 | + ); | ||
40 | } | 47 | } |
41 | 48 | ||
42 | @override | 49 | @override |
43 | void updateRenderObject( | 50 | void updateRenderObject( |
44 | - BuildContext context, _RenderSelectableAdapter renderObject) { | 51 | + BuildContext context, |
52 | + _RenderSelectableAdapter renderObject, | ||
53 | + ) { | ||
45 | renderObject | 54 | renderObject |
46 | ..selectionColor = DefaultSelectionStyle.of(context).selectionColor! | 55 | ..selectionColor = DefaultSelectionStyle.of(context).selectionColor! |
47 | ..registrar = registrar; | 56 | ..registrar = registrar; |
@@ -51,9 +60,11 @@ class _SelectableAdapter extends SingleChildRenderObjectWidget { | @@ -51,9 +60,11 @@ class _SelectableAdapter extends SingleChildRenderObjectWidget { | ||
51 | class _RenderSelectableAdapter extends RenderProxyBox | 60 | class _RenderSelectableAdapter extends RenderProxyBox |
52 | with Selectable, SelectionRegistrant { | 61 | with Selectable, SelectionRegistrant { |
53 | _RenderSelectableAdapter( | 62 | _RenderSelectableAdapter( |
54 | - Color selectionColor, SelectionRegistrar registrar, this.selectedText) | ||
55 | - : _selectionColor = selectionColor, | ||
56 | - _geometry = ValueNotifier<SelectionGeometry>(_noSelection) { | 63 | + Color selectionColor, |
64 | + SelectionRegistrar registrar, | ||
65 | + this.selectedText, | ||
66 | + ) : _selectionColor = selectionColor, | ||
67 | + _geometry = ValueNotifier<SelectionGeometry>(_noSelection) { | ||
57 | this.registrar = registrar; | 68 | this.registrar = registrar; |
58 | _geometry.addListener(markNeedsPaint); | 69 | _geometry.addListener(markNeedsPaint); |
59 | } | 70 | } |
@@ -152,13 +163,20 @@ class _RenderSelectableAdapter extends RenderProxyBox | @@ -152,13 +163,20 @@ class _RenderSelectableAdapter extends RenderProxyBox | ||
152 | switch (event.type) { | 163 | switch (event.type) { |
153 | case SelectionEventType.startEdgeUpdate: | 164 | case SelectionEventType.startEdgeUpdate: |
154 | case SelectionEventType.endEdgeUpdate: | 165 | case SelectionEventType.endEdgeUpdate: |
155 | - final Rect renderObjectRect = | ||
156 | - Rect.fromLTWH(0, 0, size.width, size.height); | 166 | + final Rect renderObjectRect = Rect.fromLTWH( |
167 | + 0, | ||
168 | + 0, | ||
169 | + size.width, | ||
170 | + size.height, | ||
171 | + ); | ||
157 | // Normalize offset in case it is out side of the rect. | 172 | // Normalize offset in case it is out side of the rect. |
158 | - final Offset point = | ||
159 | - globalToLocal((event as SelectionEdgeUpdateEvent).globalPosition); | ||
160 | - final Offset adjustedPoint = | ||
161 | - SelectionUtils.adjustDragOffset(renderObjectRect, point); | 173 | + final Offset point = globalToLocal( |
174 | + (event as SelectionEdgeUpdateEvent).globalPosition, | ||
175 | + ); | ||
176 | + final Offset adjustedPoint = SelectionUtils.adjustDragOffset( | ||
177 | + renderObjectRect, | ||
178 | + point, | ||
179 | + ); | ||
162 | if (event.type == SelectionEventType.startEdgeUpdate) { | 180 | if (event.type == SelectionEventType.startEdgeUpdate) { |
163 | _start = adjustedPoint; | 181 | _start = adjustedPoint; |
164 | } else { | 182 | } else { |
@@ -189,16 +207,18 @@ class _RenderSelectableAdapter extends RenderProxyBox | @@ -189,16 +207,18 @@ class _RenderSelectableAdapter extends RenderProxyBox | ||
189 | extendSelectionEvent.forward ? Offset.infinite : Offset.zero; | 207 | extendSelectionEvent.forward ? Offset.infinite : Offset.zero; |
190 | if (extendSelectionEvent.isEnd) { | 208 | if (extendSelectionEvent.isEnd) { |
191 | if (newOffset == _end) { | 209 | if (newOffset == _end) { |
192 | - result = extendSelectionEvent.forward | ||
193 | - ? SelectionResult.next | ||
194 | - : SelectionResult.previous; | 210 | + result = |
211 | + extendSelectionEvent.forward | ||
212 | + ? SelectionResult.next | ||
213 | + : SelectionResult.previous; | ||
195 | } | 214 | } |
196 | _end = newOffset; | 215 | _end = newOffset; |
197 | } else { | 216 | } else { |
198 | if (newOffset == _start) { | 217 | if (newOffset == _start) { |
199 | - result = extendSelectionEvent.forward | ||
200 | - ? SelectionResult.next | ||
201 | - : SelectionResult.previous; | 218 | + result = |
219 | + extendSelectionEvent.forward | ||
220 | + ? SelectionResult.next | ||
221 | + : SelectionResult.previous; | ||
202 | } | 222 | } |
203 | _start = newOffset; | 223 | _start = newOffset; |
204 | } | 224 | } |
@@ -296,18 +316,22 @@ class _RenderSelectableAdapter extends RenderProxyBox | @@ -296,18 +316,22 @@ class _RenderSelectableAdapter extends RenderProxyBox | ||
296 | return; | 316 | return; |
297 | } | 317 | } |
298 | // Draw the selection highlight. | 318 | // Draw the selection highlight. |
299 | - final Paint selectionPaint = Paint() | ||
300 | - ..style = PaintingStyle.fill | ||
301 | - ..color = _selectionColor; | ||
302 | - context.canvas | ||
303 | - .drawRect(_getSelectionHighlightRect().shift(offset), selectionPaint); | 319 | + final Paint selectionPaint = |
320 | + Paint() | ||
321 | + ..style = PaintingStyle.fill | ||
322 | + ..color = _selectionColor; | ||
323 | + context.canvas.drawRect( | ||
324 | + _getSelectionHighlightRect().shift(offset), | ||
325 | + selectionPaint, | ||
326 | + ); | ||
304 | 327 | ||
305 | // Push the layer links if any. | 328 | // Push the layer links if any. |
306 | if (_startHandle != null) { | 329 | if (_startHandle != null) { |
307 | context.pushLayer( | 330 | context.pushLayer( |
308 | LeaderLayer( | 331 | LeaderLayer( |
309 | - link: _startHandle!, | ||
310 | - offset: offset + value.startSelectionPoint!.localPosition), | 332 | + link: _startHandle!, |
333 | + offset: offset + value.startSelectionPoint!.localPosition, | ||
334 | + ), | ||
311 | (PaintingContext context, Offset offset) {}, | 335 | (PaintingContext context, Offset offset) {}, |
312 | Offset.zero, | 336 | Offset.zero, |
313 | ); | 337 | ); |
@@ -315,8 +339,9 @@ class _RenderSelectableAdapter extends RenderProxyBox | @@ -315,8 +339,9 @@ class _RenderSelectableAdapter extends RenderProxyBox | ||
315 | if (_endHandle != null) { | 339 | if (_endHandle != null) { |
316 | context.pushLayer( | 340 | context.pushLayer( |
317 | LeaderLayer( | 341 | LeaderLayer( |
318 | - link: _endHandle!, | ||
319 | - offset: offset + value.endSelectionPoint!.localPosition), | 342 | + link: _endHandle!, |
343 | + offset: offset + value.endSelectionPoint!.localPosition, | ||
344 | + ), | ||
320 | (PaintingContext context, Offset offset) {}, | 345 | (PaintingContext context, Offset offset) {}, |
321 | Offset.zero, | 346 | Offset.zero, |
322 | ); | 347 | ); |
@@ -26,16 +26,16 @@ class UnorderedListView extends StatelessWidget { | @@ -26,16 +26,16 @@ class UnorderedListView extends StatelessWidget { | ||
26 | crossAxisAlignment: CrossAxisAlignment.baseline, | 26 | crossAxisAlignment: CrossAxisAlignment.baseline, |
27 | children: [ | 27 | children: [ |
28 | if (bulletSize == 0) | 28 | if (bulletSize == 0) |
29 | - SizedBox( | ||
30 | - width: spacing + padding, | ||
31 | - ) | 29 | + SizedBox(width: spacing + padding) |
32 | else | 30 | else |
33 | Text.rich( | 31 | Text.rich( |
34 | WidgetSpan( | 32 | WidgetSpan( |
35 | alignment: PlaceholderAlignment.middle, | 33 | alignment: PlaceholderAlignment.middle, |
36 | child: Padding( | 34 | child: Padding( |
37 | - padding: | ||
38 | - EdgeInsetsDirectional.only(start: padding, end: spacing), | 35 | + padding: EdgeInsetsDirectional.only( |
36 | + start: padding, | ||
37 | + end: spacing, | ||
38 | + ), | ||
39 | child: Container( | 39 | child: Container( |
40 | width: bulletSize, | 40 | width: bulletSize, |
41 | height: bulletSize, | 41 | height: bulletSize, |
@@ -47,9 +47,7 @@ class UnorderedListView extends StatelessWidget { | @@ -47,9 +47,7 @@ class UnorderedListView extends StatelessWidget { | ||
47 | ), | 47 | ), |
48 | ), | 48 | ), |
49 | ), | 49 | ), |
50 | - Expanded( | ||
51 | - child: child, | ||
52 | - ) | 50 | + Expanded(child: child), |
53 | ], | 51 | ], |
54 | ), | 52 | ), |
55 | ); | 53 | ); |
@@ -60,15 +58,15 @@ class OrderedListView extends StatelessWidget { | @@ -60,15 +58,15 @@ class OrderedListView extends StatelessWidget { | ||
60 | final String no; | 58 | final String no; |
61 | final double spacing; | 59 | final double spacing; |
62 | final double padding; | 60 | final double padding; |
63 | - const OrderedListView( | ||
64 | - {super.key, | ||
65 | - this.spacing = 6, | ||
66 | - this.padding = 6, | ||
67 | - TextStyle? style, | ||
68 | - required this.child, | ||
69 | - this.textDirection = TextDirection.ltr, | ||
70 | - required this.no}) | ||
71 | - : _style = style; | 61 | + const OrderedListView({ |
62 | + super.key, | ||
63 | + this.spacing = 6, | ||
64 | + this.padding = 6, | ||
65 | + TextStyle? style, | ||
66 | + required this.child, | ||
67 | + this.textDirection = TextDirection.ltr, | ||
68 | + required this.no, | ||
69 | + }) : _style = style; | ||
72 | final TextStyle? _style; | 70 | final TextStyle? _style; |
73 | final TextDirection textDirection; | 71 | final TextDirection textDirection; |
74 | final Widget child; | 72 | final Widget child; |
@@ -83,16 +81,9 @@ class OrderedListView extends StatelessWidget { | @@ -83,16 +81,9 @@ class OrderedListView extends StatelessWidget { | ||
83 | children: [ | 81 | children: [ |
84 | Padding( | 82 | Padding( |
85 | padding: EdgeInsetsDirectional.only(start: padding, end: spacing), | 83 | padding: EdgeInsetsDirectional.only(start: padding, end: spacing), |
86 | - child: Text.rich( | ||
87 | - TextSpan( | ||
88 | - text: no, | ||
89 | - ), | ||
90 | - style: _style, | ||
91 | - ), | 84 | + child: Text.rich(TextSpan(text: no), style: _style), |
92 | ), | 85 | ), |
93 | - Expanded( | ||
94 | - child: child, | ||
95 | - ) | 86 | + Expanded(child: child), |
96 | ], | 87 | ], |
97 | ), | 88 | ), |
98 | ); | 89 | ); |
@@ -48,44 +48,52 @@ class GptMarkdown extends StatelessWidget { | @@ -48,44 +48,52 @@ class GptMarkdown extends StatelessWidget { | ||
48 | final int? maxLines; | 48 | final int? maxLines; |
49 | final TextOverflow? overflow; | 49 | final TextOverflow? overflow; |
50 | final Widget Function( | 50 | final Widget Function( |
51 | - BuildContext context, String tex, TextStyle style, bool inline)? | ||
52 | - latexBuilder; | 51 | + BuildContext context, |
52 | + String tex, | ||
53 | + TextStyle style, | ||
54 | + bool inline, | ||
55 | + )? | ||
56 | + latexBuilder; | ||
53 | final bool followLinkColor; | 57 | final bool followLinkColor; |
54 | final Widget Function( | 58 | final Widget Function( |
55 | - BuildContext context, String name, String code, bool closed)? codeBuilder; | 59 | + BuildContext context, |
60 | + String name, | ||
61 | + String code, | ||
62 | + bool closed, | ||
63 | + )? | ||
64 | + codeBuilder; | ||
56 | final Widget Function(BuildContext, String, TextStyle)? sourceTagBuilder; | 65 | final Widget Function(BuildContext, String, TextStyle)? sourceTagBuilder; |
57 | final Widget Function(BuildContext context, String text, TextStyle style)? | 66 | final Widget Function(BuildContext context, String text, TextStyle style)? |
58 | - highlightBuilder; | 67 | + highlightBuilder; |
59 | final Widget Function( | 68 | final Widget Function( |
60 | - BuildContext context, String text, String url, TextStyle style)? | ||
61 | - linkBuilder; | 69 | + BuildContext context, |
70 | + String text, | ||
71 | + String url, | ||
72 | + TextStyle style, | ||
73 | + )? | ||
74 | + linkBuilder; | ||
62 | String _removeExtraLinesInsideBlockLatex(String text) { | 75 | String _removeExtraLinesInsideBlockLatex(String text) { |
63 | return text.replaceAllMapped( | 76 | return text.replaceAllMapped( |
64 | - RegExp( | ||
65 | - r"\\\[(.*?)\\\]", | ||
66 | - multiLine: true, | ||
67 | - dotAll: true, | ||
68 | - ), (match) { | ||
69 | - String content = match[0] ?? ""; | ||
70 | - return content.replaceAllMapped(RegExp(r"\n[\n\ ]+"), (match) => "\n"); | ||
71 | - }); | 77 | + RegExp(r"\\\[(.*?)\\\]", multiLine: true, dotAll: true), |
78 | + (match) { | ||
79 | + String content = match[0] ?? ""; | ||
80 | + return content.replaceAllMapped(RegExp(r"\n[\n\ ]+"), (match) => "\n"); | ||
81 | + }, | ||
82 | + ); | ||
72 | } | 83 | } |
73 | 84 | ||
74 | @override | 85 | @override |
75 | Widget build(BuildContext context) { | 86 | Widget build(BuildContext context) { |
76 | String tex = data.trim(); | 87 | String tex = data.trim(); |
77 | tex = tex.replaceAllMapped( | 88 | tex = tex.replaceAllMapped( |
78 | - RegExp( | ||
79 | - r"(?<!\\)\$\$(.*?)(?<!\\)\$\$", | ||
80 | - dotAll: true, | ||
81 | - ), | ||
82 | - (match) => "\\[${match[1] ?? ""}\\]"); | 89 | + RegExp(r"(?<!\\)\$\$(.*?)(?<!\\)\$\$", dotAll: true), |
90 | + (match) => "\\[${match[1] ?? ""}\\]", | ||
91 | + ); | ||
83 | if (!tex.contains(r"\(")) { | 92 | if (!tex.contains(r"\(")) { |
84 | tex = tex.replaceAllMapped( | 93 | tex = tex.replaceAllMapped( |
85 | - RegExp( | ||
86 | - r"(?<!\\)\$(.*?)(?<!\\)\$", | ||
87 | - ), | ||
88 | - (match) => "\\(${match[1] ?? ""}\\)"); | 94 | + RegExp(r"(?<!\\)\$(.*?)(?<!\\)\$"), |
95 | + (match) => "\\(${match[1] ?? ""}\\)", | ||
96 | + ); | ||
89 | tex = tex.splitMapJoin( | 97 | tex = tex.splitMapJoin( |
90 | RegExp(r"\[.*?\]|\(.*?\)"), | 98 | RegExp(r"\[.*?\]|\(.*?\)"), |
91 | onNonMatch: (p0) { | 99 | onNonMatch: (p0) { |
@@ -95,24 +103,25 @@ class GptMarkdown extends StatelessWidget { | @@ -95,24 +103,25 @@ class GptMarkdown extends StatelessWidget { | ||
95 | } | 103 | } |
96 | tex = _removeExtraLinesInsideBlockLatex(tex); | 104 | tex = _removeExtraLinesInsideBlockLatex(tex); |
97 | return ClipRRect( | 105 | return ClipRRect( |
98 | - child: MdWidget( | ||
99 | - tex, | ||
100 | - config: GptMarkdownConfig( | ||
101 | - textDirection: textDirection, | ||
102 | - style: style, | ||
103 | - onLinkTab: onLinkTab, | ||
104 | - textAlign: textAlign, | ||
105 | - textScaler: textScaler, | ||
106 | - followLinkColor: followLinkColor, | ||
107 | - latexWorkaround: latexWorkaround, | ||
108 | - latexBuilder: latexBuilder, | ||
109 | - codeBuilder: codeBuilder, | ||
110 | - maxLines: maxLines, | ||
111 | - overflow: overflow, | ||
112 | - sourceTagBuilder: sourceTagBuilder, | ||
113 | - highlightBuilder: highlightBuilder, | ||
114 | - linkBuilder: linkBuilder, | 106 | + child: MdWidget( |
107 | + tex, | ||
108 | + config: GptMarkdownConfig( | ||
109 | + textDirection: textDirection, | ||
110 | + style: style, | ||
111 | + onLinkTab: onLinkTab, | ||
112 | + textAlign: textAlign, | ||
113 | + textScaler: textScaler, | ||
114 | + followLinkColor: followLinkColor, | ||
115 | + latexWorkaround: latexWorkaround, | ||
116 | + latexBuilder: latexBuilder, | ||
117 | + codeBuilder: codeBuilder, | ||
118 | + maxLines: maxLines, | ||
119 | + overflow: overflow, | ||
120 | + sourceTagBuilder: sourceTagBuilder, | ||
121 | + highlightBuilder: highlightBuilder, | ||
122 | + linkBuilder: linkBuilder, | ||
123 | + ), | ||
115 | ), | 124 | ), |
116 | - )); | 125 | + ); |
117 | } | 126 | } |
118 | } | 127 | } |
@@ -3,27 +3,27 @@ part of 'gpt_markdown.dart'; | @@ -3,27 +3,27 @@ part of 'gpt_markdown.dart'; | ||
3 | /// Markdown components | 3 | /// Markdown components |
4 | abstract class MarkdownComponent { | 4 | abstract class MarkdownComponent { |
5 | static List<MarkdownComponent> get components => [ | 5 | static List<MarkdownComponent> get components => [ |
6 | - CodeBlockMd(), | ||
7 | - NewLines(), | ||
8 | - IndentMd(), | ||
9 | - ImageMd(), | ||
10 | - TableMd(), | ||
11 | - HTag(), | ||
12 | - UnOrderedList(), | ||
13 | - OrderedList(), | ||
14 | - RadioButtonMd(), | ||
15 | - CheckBoxMd(), | ||
16 | - HrLine(), | ||
17 | - LatexMath(), | ||
18 | - LatexMathMultiLine(), | ||
19 | - ImageMd(), | ||
20 | - HighlightedText(), | ||
21 | - StrikeMd(), | ||
22 | - BoldMd(), | ||
23 | - ItalicMd(), | ||
24 | - ATagMd(), | ||
25 | - SourceTag(), | ||
26 | - ]; | 6 | + CodeBlockMd(), |
7 | + NewLines(), | ||
8 | + IndentMd(), | ||
9 | + ImageMd(), | ||
10 | + TableMd(), | ||
11 | + HTag(), | ||
12 | + UnOrderedList(), | ||
13 | + OrderedList(), | ||
14 | + RadioButtonMd(), | ||
15 | + CheckBoxMd(), | ||
16 | + HrLine(), | ||
17 | + LatexMath(), | ||
18 | + LatexMathMultiLine(), | ||
19 | + ImageMd(), | ||
20 | + HighlightedText(), | ||
21 | + StrikeMd(), | ||
22 | + BoldMd(), | ||
23 | + ItalicMd(), | ||
24 | + ATagMd(), | ||
25 | + SourceTag(), | ||
26 | + ]; | ||
27 | 27 | ||
28 | /// Generate widget for markdown widget | 28 | /// Generate widget for markdown widget |
29 | static List<InlineSpan> generate( | 29 | static List<InlineSpan> generate( |
@@ -46,11 +46,7 @@ abstract class MarkdownComponent { | @@ -46,11 +46,7 @@ abstract class MarkdownComponent { | ||
46 | for (var each in components) { | 46 | for (var each in components) { |
47 | if (each.exp.hasMatch(element)) { | 47 | if (each.exp.hasMatch(element)) { |
48 | if (each.inline) { | 48 | if (each.inline) { |
49 | - spans.add(each.span( | ||
50 | - context, | ||
51 | - element, | ||
52 | - config, | ||
53 | - )); | 49 | + spans.add(each.span(context, element, config)); |
54 | } else { | 50 | } else { |
55 | spans.addAll([ | 51 | spans.addAll([ |
56 | TextSpan( | 52 | TextSpan( |
@@ -61,11 +57,7 @@ abstract class MarkdownComponent { | @@ -61,11 +57,7 @@ abstract class MarkdownComponent { | ||
61 | color: config.style?.color, | 57 | color: config.style?.color, |
62 | ), | 58 | ), |
63 | ), | 59 | ), |
64 | - each.span( | ||
65 | - context, | ||
66 | - element, | ||
67 | - config, | ||
68 | - ), | 60 | + each.span(context, element, config), |
69 | TextSpan( | 61 | TextSpan( |
70 | text: "\n ", | 62 | text: "\n ", |
71 | style: TextStyle( | 63 | style: TextStyle( |
@@ -82,12 +74,7 @@ abstract class MarkdownComponent { | @@ -82,12 +74,7 @@ abstract class MarkdownComponent { | ||
82 | return ""; | 74 | return ""; |
83 | }, | 75 | }, |
84 | onNonMatch: (p0) { | 76 | onNonMatch: (p0) { |
85 | - spans.add( | ||
86 | - TextSpan( | ||
87 | - text: p0, | ||
88 | - style: config.style, | ||
89 | - ), | ||
90 | - ); | 77 | + spans.add(TextSpan(text: p0, style: config.style)); |
91 | return ""; | 78 | return ""; |
92 | }, | 79 | }, |
93 | ); | 80 | ); |
@@ -124,11 +111,7 @@ abstract class BlockMd extends MarkdownComponent { | @@ -124,11 +111,7 @@ abstract class BlockMd extends MarkdownComponent { | ||
124 | bool get inline => false; | 111 | bool get inline => false; |
125 | 112 | ||
126 | @override | 113 | @override |
127 | - RegExp get exp => RegExp( | ||
128 | - r'^\ *?' + expString, | ||
129 | - dotAll: true, | ||
130 | - multiLine: true, | ||
131 | - ); | 114 | + RegExp get exp => RegExp(r'^\ *?' + expString, dotAll: true, multiLine: true); |
132 | 115 | ||
133 | String get expString; | 116 | String get expString; |
134 | 117 | ||
@@ -141,22 +124,12 @@ abstract class BlockMd extends MarkdownComponent { | @@ -141,22 +124,12 @@ abstract class BlockMd extends MarkdownComponent { | ||
141 | var matches = RegExp(r'^(?<spaces>\ \ +).*').firstMatch(text); | 124 | var matches = RegExp(r'^(?<spaces>\ \ +).*').firstMatch(text); |
142 | var spaces = matches?.namedGroup('spaces'); | 125 | var spaces = matches?.namedGroup('spaces'); |
143 | var length = spaces?.length ?? 0; | 126 | var length = spaces?.length ?? 0; |
144 | - var child = build( | ||
145 | - context, | ||
146 | - text, | ||
147 | - config, | ||
148 | - ); | 127 | + var child = build(context, text, config); |
149 | length = min(length, 4); | 128 | length = min(length, 4); |
150 | if (length > 0) { | 129 | if (length > 0) { |
151 | - child = UnorderedListView( | ||
152 | - spacing: length * 6.0, | ||
153 | - child: child, | ||
154 | - ); | 130 | + child = UnorderedListView(spacing: length * 6.0, child: child); |
155 | } | 131 | } |
156 | - return WidgetSpan( | ||
157 | - child: child, | ||
158 | - alignment: PlaceholderAlignment.middle, | ||
159 | - ); | 132 | + return WidgetSpan(child: child, alignment: PlaceholderAlignment.middle); |
160 | } | 133 | } |
161 | 134 | ||
162 | Widget build( | 135 | Widget build( |
@@ -186,10 +159,7 @@ class HTag extends BlockMd { | @@ -186,10 +159,7 @@ class HTag extends BlockMd { | ||
186 | theme.h4, | 159 | theme.h4, |
187 | theme.h5, | 160 | theme.h5, |
188 | theme.h6, | 161 | theme.h6, |
189 | - ][match![1]!.length - 1] | ||
190 | - ?.copyWith( | ||
191 | - color: config.style?.color, | ||
192 | - ), | 162 | + ][match![1]!.length - 1]?.copyWith(color: config.style?.color), |
193 | ); | 163 | ); |
194 | return config.getRich( | 164 | return config.getRich( |
195 | TextSpan( | 165 | TextSpan( |
@@ -207,7 +177,8 @@ class HTag extends BlockMd { | @@ -207,7 +177,8 @@ class HTag extends BlockMd { | ||
207 | WidgetSpan( | 177 | WidgetSpan( |
208 | child: CustomDivider( | 178 | child: CustomDivider( |
209 | height: theme.hrLineThickness, | 179 | height: theme.hrLineThickness, |
210 | - color: config.style?.color ?? | 180 | + color: |
181 | + config.style?.color ?? | ||
211 | Theme.of(context).colorScheme.outline, | 182 | Theme.of(context).colorScheme.outline, |
212 | ), | 183 | ), |
213 | ), | 184 | ), |
@@ -229,10 +200,7 @@ class NewLines extends InlineMd { | @@ -229,10 +200,7 @@ class NewLines extends InlineMd { | ||
229 | ) { | 200 | ) { |
230 | return TextSpan( | 201 | return TextSpan( |
231 | text: "\n\n\n\n", | 202 | text: "\n\n\n\n", |
232 | - style: TextStyle( | ||
233 | - fontSize: 6, | ||
234 | - color: config.style?.color, | ||
235 | - ), | 203 | + style: TextStyle(fontSize: 6, color: config.style?.color), |
236 | ); | 204 | ); |
237 | } | 205 | } |
238 | } | 206 | } |
@@ -272,10 +240,7 @@ class CheckBoxMd extends BlockMd { | @@ -272,10 +240,7 @@ class CheckBoxMd extends BlockMd { | ||
272 | return CustomCb( | 240 | return CustomCb( |
273 | value: ("${match?[1]}" == "x"), | 241 | value: ("${match?[1]}" == "x"), |
274 | textDirection: config.textDirection, | 242 | textDirection: config.textDirection, |
275 | - child: MdWidget( | ||
276 | - "${match?[2]}", | ||
277 | - config: config, | ||
278 | - ), | 243 | + child: MdWidget("${match?[2]}", config: config), |
279 | ); | 244 | ); |
280 | } | 245 | } |
281 | } | 246 | } |
@@ -296,10 +261,7 @@ class RadioButtonMd extends BlockMd { | @@ -296,10 +261,7 @@ class RadioButtonMd extends BlockMd { | ||
296 | return CustomRb( | 261 | return CustomRb( |
297 | value: ("${match?[1]}" == "x"), | 262 | value: ("${match?[1]}" == "x"), |
298 | textDirection: config.textDirection, | 263 | textDirection: config.textDirection, |
299 | - child: MdWidget( | ||
300 | - "${match?[2]}", | ||
301 | - config: config, | ||
302 | - ), | 264 | + child: MdWidget("${match?[2]}", config: config), |
303 | ); | 265 | ); |
304 | } | 266 | } |
305 | } | 267 | } |
@@ -310,8 +272,8 @@ class IndentMd extends InlineMd { | @@ -310,8 +272,8 @@ class IndentMd extends InlineMd { | ||
310 | bool get inline => false; | 272 | bool get inline => false; |
311 | @override | 273 | @override |
312 | RegExp get exp => | 274 | RegExp get exp => |
313 | - // RegExp(r"(?<=\n\n)(\ +)(.+?)(?=\n\n)", dotAll: true, multiLine: true); | ||
314 | - RegExp(r"^>([^\n]+)$", dotAll: true, multiLine: true); | 275 | + // RegExp(r"(?<=\n\n)(\ +)(.+?)(?=\n\n)", dotAll: true, multiLine: true); |
276 | + RegExp(r"^>([^\n]+)$", dotAll: true, multiLine: true); | ||
315 | 277 | ||
316 | @override | 278 | @override |
317 | InlineSpan span( | 279 | InlineSpan span( |
@@ -324,11 +286,7 @@ class IndentMd extends InlineMd { | @@ -324,11 +286,7 @@ class IndentMd extends InlineMd { | ||
324 | // data = data.replaceAll(RegExp(r'\n\ {' '$spaces' '}'), '\n').trim(); | 286 | // data = data.replaceAll(RegExp(r'\n\ {' '$spaces' '}'), '\n').trim(); |
325 | data = data.trim(); | 287 | data = data.trim(); |
326 | var child = TextSpan( | 288 | var child = TextSpan( |
327 | - children: MarkdownComponent.generate( | ||
328 | - context, | ||
329 | - data, | ||
330 | - config, | ||
331 | - ), | 289 | + children: MarkdownComponent.generate(context, data, config), |
332 | ); | 290 | ); |
333 | return TextSpan( | 291 | return TextSpan( |
334 | children: [ | 292 | children: [ |
@@ -370,15 +328,13 @@ class UnOrderedList extends BlockMd { | @@ -370,15 +328,13 @@ class UnOrderedList extends BlockMd { | ||
370 | (config.style?.color ?? DefaultTextStyle.of(context).style.color), | 328 | (config.style?.color ?? DefaultTextStyle.of(context).style.color), |
371 | padding: 7, | 329 | padding: 7, |
372 | spacing: 10, | 330 | spacing: 10, |
373 | - bulletSize: 0.3 * | 331 | + bulletSize: |
332 | + 0.3 * | ||
374 | (config.style?.fontSize ?? | 333 | (config.style?.fontSize ?? |
375 | DefaultTextStyle.of(context).style.fontSize ?? | 334 | DefaultTextStyle.of(context).style.fontSize ?? |
376 | kDefaultFontSize), | 335 | kDefaultFontSize), |
377 | textDirection: config.textDirection, | 336 | textDirection: config.textDirection, |
378 | - child: MdWidget( | ||
379 | - "${match?[1]?.trim()}", | ||
380 | - config: config, | ||
381 | - ), | 337 | + child: MdWidget("${match?[1]?.trim()}", config: config), |
382 | ); | 338 | ); |
383 | } | 339 | } |
384 | } | 340 | } |
@@ -398,12 +354,10 @@ class OrderedList extends BlockMd { | @@ -398,12 +354,10 @@ class OrderedList extends BlockMd { | ||
398 | return OrderedListView( | 354 | return OrderedListView( |
399 | no: "${match?[1]}", | 355 | no: "${match?[1]}", |
400 | textDirection: config.textDirection, | 356 | textDirection: config.textDirection, |
401 | - style: (config.style ?? const TextStyle()) | ||
402 | - .copyWith(fontWeight: FontWeight.w100), | ||
403 | - child: MdWidget( | ||
404 | - "${match?[2]?.trim()}", | ||
405 | - config: config, | 357 | + style: (config.style ?? const TextStyle()).copyWith( |
358 | + fontWeight: FontWeight.w100, | ||
406 | ), | 359 | ), |
360 | + child: MdWidget("${match?[2]?.trim()}", config: config), | ||
407 | ); | 361 | ); |
408 | } | 362 | } |
409 | } | 363 | } |
@@ -432,25 +386,25 @@ class HighlightedText extends InlineMd { | @@ -432,25 +386,25 @@ class HighlightedText extends InlineMd { | ||
432 | ); | 386 | ); |
433 | } | 387 | } |
434 | 388 | ||
435 | - var style = config.style?.copyWith( | 389 | + var style = |
390 | + config.style?.copyWith( | ||
436 | fontWeight: FontWeight.bold, | 391 | fontWeight: FontWeight.bold, |
437 | - background: Paint() | ||
438 | - ..color = GptMarkdownTheme.of(context).highlightColor | ||
439 | - ..strokeCap = StrokeCap.round | ||
440 | - ..strokeJoin = StrokeJoin.round, | 392 | + background: |
393 | + Paint() | ||
394 | + ..color = GptMarkdownTheme.of(context).highlightColor | ||
395 | + ..strokeCap = StrokeCap.round | ||
396 | + ..strokeJoin = StrokeJoin.round, | ||
441 | ) ?? | 397 | ) ?? |
442 | TextStyle( | 398 | TextStyle( |
443 | fontWeight: FontWeight.bold, | 399 | fontWeight: FontWeight.bold, |
444 | - background: Paint() | ||
445 | - ..color = GptMarkdownTheme.of(context).highlightColor | ||
446 | - ..strokeCap = StrokeCap.round | ||
447 | - ..strokeJoin = StrokeJoin.round, | 400 | + background: |
401 | + Paint() | ||
402 | + ..color = GptMarkdownTheme.of(context).highlightColor | ||
403 | + ..strokeCap = StrokeCap.round | ||
404 | + ..strokeJoin = StrokeJoin.round, | ||
448 | ); | 405 | ); |
449 | 406 | ||
450 | - return TextSpan( | ||
451 | - text: highlightedText, | ||
452 | - style: style, | ||
453 | - ); | 407 | + return TextSpan(text: highlightedText, style: style); |
454 | } | 408 | } |
455 | } | 409 | } |
456 | 410 | ||
@@ -467,14 +421,12 @@ class BoldMd extends InlineMd { | @@ -467,14 +421,12 @@ class BoldMd extends InlineMd { | ||
467 | ) { | 421 | ) { |
468 | var match = exp.firstMatch(text.trim()); | 422 | var match = exp.firstMatch(text.trim()); |
469 | var conf = config.copyWith( | 423 | var conf = config.copyWith( |
470 | - style: config.style?.copyWith(fontWeight: FontWeight.bold) ?? | ||
471 | - const TextStyle(fontWeight: FontWeight.bold)); | 424 | + style: |
425 | + config.style?.copyWith(fontWeight: FontWeight.bold) ?? | ||
426 | + const TextStyle(fontWeight: FontWeight.bold), | ||
427 | + ); | ||
472 | return TextSpan( | 428 | return TextSpan( |
473 | - children: MarkdownComponent.generate( | ||
474 | - context, | ||
475 | - "${match?[1]}", | ||
476 | - conf, | ||
477 | - ), | 429 | + children: MarkdownComponent.generate(context, "${match?[1]}", conf), |
478 | style: conf.style, | 430 | style: conf.style, |
479 | ); | 431 | ); |
480 | } | 432 | } |
@@ -492,19 +444,15 @@ class StrikeMd extends InlineMd { | @@ -492,19 +444,15 @@ class StrikeMd extends InlineMd { | ||
492 | ) { | 444 | ) { |
493 | var match = exp.firstMatch(text.trim()); | 445 | var match = exp.firstMatch(text.trim()); |
494 | var conf = config.copyWith( | 446 | var conf = config.copyWith( |
495 | - style: config.style?.copyWith( | ||
496 | - decoration: TextDecoration.lineThrough, | ||
497 | - decorationColor: config.style?.color, | ||
498 | - ) ?? | ||
499 | - const TextStyle( | ||
500 | - decoration: TextDecoration.lineThrough, | ||
501 | - )); | 447 | + style: |
448 | + config.style?.copyWith( | ||
449 | + decoration: TextDecoration.lineThrough, | ||
450 | + decorationColor: config.style?.color, | ||
451 | + ) ?? | ||
452 | + const TextStyle(decoration: TextDecoration.lineThrough), | ||
453 | + ); | ||
502 | return TextSpan( | 454 | return TextSpan( |
503 | - children: MarkdownComponent.generate( | ||
504 | - context, | ||
505 | - "${match?[1]}", | ||
506 | - conf, | ||
507 | - ), | 455 | + children: MarkdownComponent.generate(context, "${match?[1]}", conf), |
508 | style: conf.style, | 456 | style: conf.style, |
509 | ); | 457 | ); |
510 | } | 458 | } |
@@ -513,9 +461,10 @@ class StrikeMd extends InlineMd { | @@ -513,9 +461,10 @@ class StrikeMd extends InlineMd { | ||
513 | /// Italic text component | 461 | /// Italic text component |
514 | class ItalicMd extends InlineMd { | 462 | class ItalicMd extends InlineMd { |
515 | @override | 463 | @override |
516 | - RegExp get exp => | ||
517 | - RegExp(r"(?<!\*)\*(?<!\s)(.+?)(?<!\s)\*(?!\*)|\_(?<!\s)(.+?)(?<!\s)\_", | ||
518 | - dotAll: true); | 464 | + RegExp get exp => RegExp( |
465 | + r"(?<!\*)\*(?<!\s)(.+?)(?<!\s)\*(?!\*)|\_(?<!\s)(.+?)(?<!\s)\_", | ||
466 | + dotAll: true, | ||
467 | + ); | ||
519 | 468 | ||
520 | @override | 469 | @override |
521 | InlineSpan span( | 470 | InlineSpan span( |
@@ -526,14 +475,12 @@ class ItalicMd extends InlineMd { | @@ -526,14 +475,12 @@ class ItalicMd extends InlineMd { | ||
526 | var match = exp.firstMatch(text.trim()); | 475 | var match = exp.firstMatch(text.trim()); |
527 | var data = match?[1] ?? match?[2]; | 476 | var data = match?[1] ?? match?[2]; |
528 | var conf = config.copyWith( | 477 | var conf = config.copyWith( |
529 | - style: (config.style ?? const TextStyle()) | ||
530 | - .copyWith(fontStyle: FontStyle.italic)); | ||
531 | - return TextSpan( | ||
532 | - children: MarkdownComponent.generate( | ||
533 | - context, | ||
534 | - "$data", | ||
535 | - conf, | 478 | + style: (config.style ?? const TextStyle()).copyWith( |
479 | + fontStyle: FontStyle.italic, | ||
536 | ), | 480 | ), |
481 | + ); | ||
482 | + return TextSpan( | ||
483 | + children: MarkdownComponent.generate(context, "$data", conf), | ||
537 | style: conf.style, | 484 | style: conf.style, |
538 | ); | 485 | ); |
539 | } | 486 | } |
@@ -555,7 +502,8 @@ class LatexMathMultiLine extends BlockMd { | @@ -555,7 +502,8 @@ class LatexMathMultiLine extends BlockMd { | ||
555 | String mathText = p0?[1] ?? p0?[2] ?? ""; | 502 | String mathText = p0?[1] ?? p0?[2] ?? ""; |
556 | var workaround = config.latexWorkaround ?? (String tex) => tex; | 503 | var workaround = config.latexWorkaround ?? (String tex) => tex; |
557 | 504 | ||
558 | - var builder = config.latexBuilder ?? | 505 | + var builder = |
506 | + config.latexBuilder ?? | ||
559 | (BuildContext context, String tex, TextStyle textStyle, bool inline) => | 507 | (BuildContext context, String tex, TextStyle textStyle, bool inline) => |
560 | SelectableAdapter( | 508 | SelectableAdapter( |
561 | selectedText: tex, | 509 | selectedText: tex, |
@@ -564,14 +512,14 @@ class LatexMathMultiLine extends BlockMd { | @@ -564,14 +512,14 @@ class LatexMathMultiLine extends BlockMd { | ||
564 | textStyle: textStyle, | 512 | textStyle: textStyle, |
565 | mathStyle: MathStyle.display, | 513 | mathStyle: MathStyle.display, |
566 | textScaleFactor: 1, | 514 | textScaleFactor: 1, |
567 | - settings: const TexParserSettings( | ||
568 | - strict: Strict.ignore, | ||
569 | - ), | 515 | + settings: const TexParserSettings(strict: Strict.ignore), |
570 | options: MathOptions( | 516 | options: MathOptions( |
571 | sizeUnderTextStyle: MathSize.large, | 517 | sizeUnderTextStyle: MathSize.large, |
572 | - color: config.style?.color ?? | 518 | + color: |
519 | + config.style?.color ?? | ||
573 | Theme.of(context).colorScheme.onSurface, | 520 | Theme.of(context).colorScheme.onSurface, |
574 | - fontSize: config.style?.fontSize ?? | 521 | + fontSize: |
522 | + config.style?.fontSize ?? | ||
575 | Theme.of(context).textTheme.bodyMedium?.fontSize, | 523 | Theme.of(context).textTheme.bodyMedium?.fontSize, |
576 | mathFontOptions: FontOptions( | 524 | mathFontOptions: FontOptions( |
577 | fontFamily: "Main", | 525 | fontFamily: "Main", |
@@ -590,15 +538,21 @@ class LatexMathMultiLine extends BlockMd { | @@ -590,15 +538,21 @@ class LatexMathMultiLine extends BlockMd { | ||
590 | workaround(mathText), | 538 | workaround(mathText), |
591 | textDirection: config.textDirection, | 539 | textDirection: config.textDirection, |
592 | style: textStyle.copyWith( | 540 | style: textStyle.copyWith( |
593 | - color: (!kDebugMode) | ||
594 | - ? null | ||
595 | - : Theme.of(context).colorScheme.error), | 541 | + color: |
542 | + (!kDebugMode) | ||
543 | + ? null | ||
544 | + : Theme.of(context).colorScheme.error, | ||
545 | + ), | ||
596 | ); | 546 | ); |
597 | }, | 547 | }, |
598 | ), | 548 | ), |
599 | ); | 549 | ); |
600 | - return builder(context, workaround(mathText), | ||
601 | - config.style ?? const TextStyle(), false); | 550 | + return builder( |
551 | + context, | ||
552 | + workaround(mathText), | ||
553 | + config.style ?? const TextStyle(), | ||
554 | + false, | ||
555 | + ); | ||
602 | } | 556 | } |
603 | } | 557 | } |
604 | 558 | ||
@@ -606,12 +560,12 @@ class LatexMathMultiLine extends BlockMd { | @@ -606,12 +560,12 @@ class LatexMathMultiLine extends BlockMd { | ||
606 | class LatexMath extends InlineMd { | 560 | class LatexMath extends InlineMd { |
607 | @override | 561 | @override |
608 | RegExp get exp => RegExp( | 562 | RegExp get exp => RegExp( |
609 | - [ | ||
610 | - r"\\\((.*?)\\\)", | ||
611 | - // r"(?<!\\)\$((?:\\.|[^$])*?)\$(?!\\)", | ||
612 | - ].join("|"), | ||
613 | - dotAll: true, | ||
614 | - ); | 563 | + [ |
564 | + r"\\\((.*?)\\\)", | ||
565 | + // r"(?<!\\)\$((?:\\.|[^$])*?)\$(?!\\)", | ||
566 | + ].join("|"), | ||
567 | + dotAll: true, | ||
568 | + ); | ||
615 | 569 | ||
616 | @override | 570 | @override |
617 | InlineSpan span( | 571 | InlineSpan span( |
@@ -623,7 +577,8 @@ class LatexMath extends InlineMd { | @@ -623,7 +577,8 @@ class LatexMath extends InlineMd { | ||
623 | p0?.group(0); | 577 | p0?.group(0); |
624 | String mathText = p0?[1]?.toString() ?? ""; | 578 | String mathText = p0?[1]?.toString() ?? ""; |
625 | var workaround = config.latexWorkaround ?? (String tex) => tex; | 579 | var workaround = config.latexWorkaround ?? (String tex) => tex; |
626 | - var builder = config.latexBuilder ?? | 580 | + var builder = |
581 | + config.latexBuilder ?? | ||
627 | (BuildContext context, String tex, TextStyle textStyle, bool inline) => | 582 | (BuildContext context, String tex, TextStyle textStyle, bool inline) => |
628 | SelectableAdapter( | 583 | SelectableAdapter( |
629 | selectedText: tex, | 584 | selectedText: tex, |
@@ -632,14 +587,14 @@ class LatexMath extends InlineMd { | @@ -632,14 +587,14 @@ class LatexMath extends InlineMd { | ||
632 | textStyle: textStyle, | 587 | textStyle: textStyle, |
633 | mathStyle: MathStyle.display, | 588 | mathStyle: MathStyle.display, |
634 | textScaleFactor: 1, | 589 | textScaleFactor: 1, |
635 | - settings: const TexParserSettings( | ||
636 | - strict: Strict.ignore, | ||
637 | - ), | 590 | + settings: const TexParserSettings(strict: Strict.ignore), |
638 | options: MathOptions( | 591 | options: MathOptions( |
639 | sizeUnderTextStyle: MathSize.large, | 592 | sizeUnderTextStyle: MathSize.large, |
640 | - color: config.style?.color ?? | 593 | + color: |
594 | + config.style?.color ?? | ||
641 | Theme.of(context).colorScheme.onSurface, | 595 | Theme.of(context).colorScheme.onSurface, |
642 | - fontSize: config.style?.fontSize ?? | 596 | + fontSize: |
597 | + config.style?.fontSize ?? | ||
643 | Theme.of(context).textTheme.bodyMedium?.fontSize, | 598 | Theme.of(context).textTheme.bodyMedium?.fontSize, |
644 | mathFontOptions: FontOptions( | 599 | mathFontOptions: FontOptions( |
645 | fontFamily: "Main", | 600 | fontFamily: "Main", |
@@ -658,9 +613,11 @@ class LatexMath extends InlineMd { | @@ -658,9 +613,11 @@ class LatexMath extends InlineMd { | ||
658 | workaround(mathText), | 613 | workaround(mathText), |
659 | textDirection: config.textDirection, | 614 | textDirection: config.textDirection, |
660 | style: textStyle.copyWith( | 615 | style: textStyle.copyWith( |
661 | - color: (!kDebugMode) | ||
662 | - ? null | ||
663 | - : Theme.of(context).colorScheme.error), | 616 | + color: |
617 | + (!kDebugMode) | ||
618 | + ? null | ||
619 | + : Theme.of(context).colorScheme.error, | ||
620 | + ), | ||
664 | ); | 621 | ); |
665 | }, | 622 | }, |
666 | ), | 623 | ), |
@@ -668,8 +625,12 @@ class LatexMath extends InlineMd { | @@ -668,8 +625,12 @@ class LatexMath extends InlineMd { | ||
668 | return WidgetSpan( | 625 | return WidgetSpan( |
669 | alignment: PlaceholderAlignment.baseline, | 626 | alignment: PlaceholderAlignment.baseline, |
670 | baseline: TextBaseline.alphabetic, | 627 | baseline: TextBaseline.alphabetic, |
671 | - child: builder(context, workaround(mathText), | ||
672 | - config.style ?? const TextStyle(), true), | 628 | + child: builder( |
629 | + context, | ||
630 | + workaround(mathText), | ||
631 | + config.style ?? const TextStyle(), | ||
632 | + true, | ||
633 | + ), | ||
673 | ); | 634 | ); |
674 | } | 635 | } |
675 | } | 636 | } |
@@ -694,8 +655,12 @@ class SourceTag extends InlineMd { | @@ -694,8 +655,12 @@ class SourceTag extends InlineMd { | ||
694 | alignment: PlaceholderAlignment.middle, | 655 | alignment: PlaceholderAlignment.middle, |
695 | child: Padding( | 656 | child: Padding( |
696 | padding: const EdgeInsets.all(2), | 657 | padding: const EdgeInsets.all(2), |
697 | - child: config.sourceTagBuilder | ||
698 | - ?.call(context, content, const TextStyle()) ?? | 658 | + child: |
659 | + config.sourceTagBuilder?.call( | ||
660 | + context, | ||
661 | + content, | ||
662 | + const TextStyle(), | ||
663 | + ) ?? | ||
699 | SizedBox( | 664 | SizedBox( |
700 | width: 20, | 665 | width: 20, |
701 | height: 20, | 666 | height: 20, |
@@ -784,8 +749,9 @@ class ImageMd extends InlineMd { | @@ -784,8 +749,9 @@ class ImageMd extends InlineMd { | ||
784 | double? height; | 749 | double? height; |
785 | double? width; | 750 | double? width; |
786 | if (match?[1] != null) { | 751 | if (match?[1] != null) { |
787 | - var size = RegExp(r"^([0-9]+)?x?([0-9]+)?") | ||
788 | - .firstMatch(match![1].toString().trim()); | 752 | + var size = RegExp( |
753 | + r"^([0-9]+)?x?([0-9]+)?", | ||
754 | + ).firstMatch(match![1].toString().trim()); | ||
789 | width = double.tryParse(size?[1]?.toString().trim() ?? 'a'); | 755 | width = double.tryParse(size?[1]?.toString().trim() ?? 'a'); |
790 | height = double.tryParse(size?[2]?.toString().trim() ?? 'a'); | 756 | height = double.tryParse(size?[2]?.toString().trim() ?? 'a'); |
791 | } | 757 | } |
@@ -795,19 +761,21 @@ class ImageMd extends InlineMd { | @@ -795,19 +761,21 @@ class ImageMd extends InlineMd { | ||
795 | width: width, | 761 | width: width, |
796 | height: height, | 762 | height: height, |
797 | child: Image( | 763 | child: Image( |
798 | - image: NetworkImage( | ||
799 | - "${match?[2]}", | ||
800 | - ), | ||
801 | - loadingBuilder: (BuildContext context, Widget child, | ||
802 | - ImageChunkEvent? loadingProgress) { | 764 | + image: NetworkImage("${match?[2]}"), |
765 | + loadingBuilder: ( | ||
766 | + BuildContext context, | ||
767 | + Widget child, | ||
768 | + ImageChunkEvent? loadingProgress, | ||
769 | + ) { | ||
803 | if (loadingProgress == null) { | 770 | if (loadingProgress == null) { |
804 | return child; | 771 | return child; |
805 | } | 772 | } |
806 | return CustomImageLoading( | 773 | return CustomImageLoading( |
807 | - progress: loadingProgress.expectedTotalBytes != null | ||
808 | - ? loadingProgress.cumulativeBytesLoaded / | ||
809 | - loadingProgress.expectedTotalBytes! | ||
810 | - : 1, | 774 | + progress: |
775 | + loadingProgress.expectedTotalBytes != null | ||
776 | + ? loadingProgress.cumulativeBytesLoaded / | ||
777 | + loadingProgress.expectedTotalBytes! | ||
778 | + : 1, | ||
811 | ); | 779 | ); |
812 | }, | 780 | }, |
813 | fit: BoxFit.fill, | 781 | fit: BoxFit.fill, |
@@ -831,16 +799,18 @@ class TableMd extends BlockMd { | @@ -831,16 +799,18 @@ class TableMd extends BlockMd { | ||
831 | String text, | 799 | String text, |
832 | final GptMarkdownConfig config, | 800 | final GptMarkdownConfig config, |
833 | ) { | 801 | ) { |
834 | - final List<Map<int, String>> value = text | ||
835 | - .split('\n') | ||
836 | - .map<Map<int, String>>( | ||
837 | - (e) => e | ||
838 | - .split('|') | ||
839 | - .where((element) => element.isNotEmpty) | ||
840 | - .toList() | ||
841 | - .asMap(), | ||
842 | - ) | ||
843 | - .toList(); | 802 | + final List<Map<int, String>> value = |
803 | + text | ||
804 | + .split('\n') | ||
805 | + .map<Map<int, String>>( | ||
806 | + (e) => | ||
807 | + e | ||
808 | + .split('|') | ||
809 | + .where((element) => element.isNotEmpty) | ||
810 | + .toList() | ||
811 | + .asMap(), | ||
812 | + ) | ||
813 | + .toList(); | ||
844 | bool heading = RegExp( | 814 | bool heading = RegExp( |
845 | r"^\|.*?\|\n\|-[-\\ |]*?-\|$", | 815 | r"^\|.*?\|\n\|-[-\\ |]*?-\|$", |
846 | multiLine: true, | 816 | multiLine: true, |
@@ -868,45 +838,47 @@ class TableMd extends BlockMd { | @@ -868,45 +838,47 @@ class TableMd extends BlockMd { | ||
868 | width: 1, | 838 | width: 1, |
869 | color: Theme.of(context).colorScheme.onSurface, | 839 | color: Theme.of(context).colorScheme.onSurface, |
870 | ), | 840 | ), |
871 | - children: value | ||
872 | - .asMap() | ||
873 | - .entries | ||
874 | - .map<TableRow>( | ||
875 | - (entry) => TableRow( | ||
876 | - decoration: (heading) | ||
877 | - ? BoxDecoration( | ||
878 | - color: (entry.key == 0) | ||
879 | - ? Theme.of(context) | ||
880 | - .colorScheme | ||
881 | - .surfaceContainerHighest | 841 | + children: |
842 | + value | ||
843 | + .asMap() | ||
844 | + .entries | ||
845 | + .map<TableRow>( | ||
846 | + (entry) => TableRow( | ||
847 | + decoration: | ||
848 | + (heading) | ||
849 | + ? BoxDecoration( | ||
850 | + color: | ||
851 | + (entry.key == 0) | ||
852 | + ? Theme.of( | ||
853 | + context, | ||
854 | + ).colorScheme.surfaceContainerHighest | ||
855 | + : null, | ||
856 | + ) | ||
882 | : null, | 857 | : null, |
883 | - ) | ||
884 | - : null, | ||
885 | - children: List.generate( | ||
886 | - maxCol, | ||
887 | - (index) { | ||
888 | - var e = entry.value; | ||
889 | - String data = e[index] ?? ""; | ||
890 | - if (RegExp(r"^--+$").hasMatch(data.trim()) || | ||
891 | - data.trim().isEmpty) { | ||
892 | - return const SizedBox(); | ||
893 | - } | ||
894 | - | ||
895 | - return Center( | ||
896 | - child: Padding( | ||
897 | - padding: const EdgeInsets.symmetric( | ||
898 | - horizontal: 8, vertical: 4), | ||
899 | - child: MdWidget( | ||
900 | - (e[index] ?? "").trim(), | ||
901 | - config: config, | 858 | + children: List.generate(maxCol, (index) { |
859 | + var e = entry.value; | ||
860 | + String data = e[index] ?? ""; | ||
861 | + if (RegExp(r"^--+$").hasMatch(data.trim()) || | ||
862 | + data.trim().isEmpty) { | ||
863 | + return const SizedBox(); | ||
864 | + } | ||
865 | + | ||
866 | + return Center( | ||
867 | + child: Padding( | ||
868 | + padding: const EdgeInsets.symmetric( | ||
869 | + horizontal: 8, | ||
870 | + vertical: 4, | ||
871 | + ), | ||
872 | + child: MdWidget( | ||
873 | + (e[index] ?? "").trim(), | ||
874 | + config: config, | ||
875 | + ), | ||
902 | ), | 876 | ), |
903 | - ), | ||
904 | - ); | ||
905 | - }, | ||
906 | - ), | ||
907 | - ), | ||
908 | - ) | ||
909 | - .toList(), | 877 | + ); |
878 | + }), | ||
879 | + ), | ||
880 | + ) | ||
881 | + .toList(), | ||
910 | ), | 882 | ), |
911 | ), | 883 | ), |
912 | ); | 884 | ); |
@@ -2,11 +2,7 @@ part of 'gpt_markdown.dart'; | @@ -2,11 +2,7 @@ part of 'gpt_markdown.dart'; | ||
2 | 2 | ||
3 | /// It creates a markdown widget closed to each other. | 3 | /// It creates a markdown widget closed to each other. |
4 | class MdWidget extends StatelessWidget { | 4 | class MdWidget extends StatelessWidget { |
5 | - const MdWidget( | ||
6 | - this.exp, { | ||
7 | - super.key, | ||
8 | - required this.config, | ||
9 | - }); | 5 | + const MdWidget(this.exp, {super.key, required this.config}); |
10 | final String exp; | 6 | final String exp; |
11 | final GptMarkdownConfig config; | 7 | final GptMarkdownConfig config; |
12 | 8 | ||
@@ -31,10 +27,7 @@ class MdWidget extends StatelessWidget { | @@ -31,10 +27,7 @@ class MdWidget extends StatelessWidget { | ||
31 | ), | 27 | ), |
32 | ); | 28 | ); |
33 | return config.getRich( | 29 | return config.getRich( |
34 | - TextSpan( | ||
35 | - children: list, | ||
36 | - style: config.style?.copyWith(), | ||
37 | - ), | 30 | + TextSpan(children: list, style: config.style?.copyWith()), |
38 | ); | 31 | ); |
39 | } | 32 | } |
40 | } | 33 | } |
@@ -39,8 +39,9 @@ class GptMarkdownThemeData extends ThemeExtension<GptMarkdownThemeData> { | @@ -39,8 +39,9 @@ class GptMarkdownThemeData extends ThemeExtension<GptMarkdownThemeData> { | ||
39 | displayMedium: Typography.tall2021.displayMedium?.copyWith(inherit: true), | 39 | displayMedium: Typography.tall2021.displayMedium?.copyWith(inherit: true), |
40 | displaySmall: Typography.tall2021.displaySmall?.copyWith(inherit: true), | 40 | displaySmall: Typography.tall2021.displaySmall?.copyWith(inherit: true), |
41 | headlineLarge: Typography.tall2021.headlineLarge?.copyWith(inherit: true), | 41 | headlineLarge: Typography.tall2021.headlineLarge?.copyWith(inherit: true), |
42 | - headlineMedium: | ||
43 | - Typography.tall2021.headlineMedium?.copyWith(inherit: true), | 42 | + headlineMedium: Typography.tall2021.headlineMedium?.copyWith( |
43 | + inherit: true, | ||
44 | + ), | ||
44 | headlineSmall: Typography.tall2021.headlineSmall?.copyWith(inherit: true), | 45 | headlineSmall: Typography.tall2021.headlineSmall?.copyWith(inherit: true), |
45 | titleLarge: Typography.tall2021.titleLarge?.copyWith(inherit: true), | 46 | titleLarge: Typography.tall2021.titleLarge?.copyWith(inherit: true), |
46 | titleMedium: Typography.tall2021.titleMedium?.copyWith(inherit: true), | 47 | titleMedium: Typography.tall2021.titleMedium?.copyWith(inherit: true), |
@@ -52,9 +53,7 @@ class GptMarkdownThemeData extends ThemeExtension<GptMarkdownThemeData> { | @@ -52,9 +53,7 @@ class GptMarkdownThemeData extends ThemeExtension<GptMarkdownThemeData> { | ||
52 | labelMedium: Typography.tall2021.labelMedium?.copyWith(inherit: true), | 53 | labelMedium: Typography.tall2021.labelMedium?.copyWith(inherit: true), |
53 | labelSmall: Typography.tall2021.labelSmall?.copyWith(inherit: true), | 54 | labelSmall: Typography.tall2021.labelSmall?.copyWith(inherit: true), |
54 | ); | 55 | ); |
55 | - themeData = themeData.copyWith( | ||
56 | - textTheme: typography, | ||
57 | - ); | 56 | + themeData = themeData.copyWith(textTheme: typography); |
58 | TextTheme textTheme = themeData.textTheme; | 57 | TextTheme textTheme = themeData.textTheme; |
59 | return GptMarkdownThemeData._fromTheme(themeData, textTheme).copyWith( | 58 | return GptMarkdownThemeData._fromTheme(themeData, textTheme).copyWith( |
60 | highlightColor: highlightColor, | 59 | highlightColor: highlightColor, |
@@ -72,7 +71,9 @@ class GptMarkdownThemeData extends ThemeExtension<GptMarkdownThemeData> { | @@ -72,7 +71,9 @@ class GptMarkdownThemeData extends ThemeExtension<GptMarkdownThemeData> { | ||
72 | } | 71 | } |
73 | 72 | ||
74 | factory GptMarkdownThemeData._fromTheme( | 73 | factory GptMarkdownThemeData._fromTheme( |
75 | - ThemeData theme, TextTheme textTheme) { | 74 | + ThemeData theme, |
75 | + TextTheme textTheme, | ||
76 | + ) { | ||
76 | return GptMarkdownThemeData._( | 77 | return GptMarkdownThemeData._( |
77 | highlightColor: theme.colorScheme.onSurfaceVariant.withAlpha(50), | 78 | highlightColor: theme.colorScheme.onSurfaceVariant.withAlpha(50), |
78 | h1: textTheme.headlineLarge, | 79 | h1: textTheme.headlineLarge, |
@@ -144,8 +145,10 @@ class GptMarkdownThemeData extends ThemeExtension<GptMarkdownThemeData> { | @@ -144,8 +145,10 @@ class GptMarkdownThemeData extends ThemeExtension<GptMarkdownThemeData> { | ||
144 | h4: TextStyle.lerp(h4, other.h4, t) ?? h4, | 145 | h4: TextStyle.lerp(h4, other.h4, t) ?? h4, |
145 | h5: TextStyle.lerp(h5, other.h5, t) ?? h5, | 146 | h5: TextStyle.lerp(h5, other.h5, t) ?? h5, |
146 | h6: TextStyle.lerp(h6, other.h6, t) ?? h6, | 147 | h6: TextStyle.lerp(h6, other.h6, t) ?? h6, |
147 | - hrLineThickness: Tween(begin: hrLineThickness, end: other.hrLineThickness) | ||
148 | - .transform(t), | 148 | + hrLineThickness: Tween( |
149 | + begin: hrLineThickness, | ||
150 | + end: other.hrLineThickness, | ||
151 | + ).transform(t), | ||
149 | hrLineColor: Color.lerp(hrLineColor, other.hrLineColor, t) ?? hrLineColor, | 152 | hrLineColor: Color.lerp(hrLineColor, other.hrLineColor, t) ?? hrLineColor, |
150 | linkColor: Color.lerp(linkColor, other.linkColor, t) ?? linkColor, | 153 | linkColor: Color.lerp(linkColor, other.linkColor, t) ?? linkColor, |
151 | linkHoverColor: | 154 | linkHoverColor: |
1 | name: gpt_markdown | 1 | name: gpt_markdown |
2 | description: "Powerful Markdown & LaTeX Renderer for Flutter: Rich Text, Math, Tables, Links, and Text Selection. Ideal for ChatGPT, Gemini, and more." | 2 | description: "Powerful Markdown & LaTeX Renderer for Flutter: Rich Text, Math, Tables, Links, and Text Selection. Ideal for ChatGPT, Gemini, and more." |
3 | -version: 1.0.10 | 3 | +version: 1.0.11 |
4 | homepage: https://github.com/Infinitix-LLC/gpt_markdown | 4 | homepage: https://github.com/Infinitix-LLC/gpt_markdown |
5 | 5 | ||
6 | environment: | 6 | environment: |
-
Please register or login to post a comment