saminsohag

customizable latex and workarround added

  1 +## 0.0.4
  2 +
  3 +* Customizable latex and workarround added.
  4 +
1 ## 0.0.3 5 ## 0.0.3
2 6
3 * Some latex related fixes. 7 * Some latex related fixes.
1 import 'dart:developer'; 1 import 'dart:developer';
2 -  
3 import 'package:flutter/material.dart'; 2 import 'package:flutter/material.dart';
4 import 'package:flutter_math_fork/flutter_math.dart'; 3 import 'package:flutter_math_fork/flutter_math.dart';
5 import 'package:gpt_markdown/gpt_markdown.dart'; 4 import 'package:gpt_markdown/gpt_markdown.dart';
@@ -123,7 +122,8 @@ Markdown and LaTeX can be powerful tools for formatting text and mathematical ex @@ -123,7 +122,8 @@ Markdown and LaTeX can be powerful tools for formatting text and mathematical ex
123 Column( 122 Column(
124 children: [ 123 children: [
125 Expanded( 124 Expanded(
126 - child: ListView( 125 + child: SingleChildScrollView(
  126 + child: Column(
127 children: [ 127 children: [
128 AnimatedBuilder( 128 AnimatedBuilder(
129 animation: _controller, 129 animation: _controller,
@@ -135,7 +135,8 @@ Markdown and LaTeX can be powerful tools for formatting text and mathematical ex @@ -135,7 +135,8 @@ Markdown and LaTeX can be powerful tools for formatting text and mathematical ex
135 width: 1, 135 width: 1,
136 color: Theme.of(context).colorScheme.outline), 136 color: Theme.of(context).colorScheme.outline),
137 ), 137 ),
138 - child: LayoutBuilder(builder: (context, constraints) { 138 + child:
  139 + LayoutBuilder(builder: (context, constraints) {
139 return Theme( 140 return Theme(
140 data: Theme.of(context).copyWith( 141 data: Theme.of(context).copyWith(
141 textTheme: const TextTheme( 142 textTheme: const TextTheme(
@@ -167,15 +168,27 @@ Markdown and LaTeX can be powerful tools for formatting text and mathematical ex @@ -167,15 +168,27 @@ Markdown and LaTeX can be powerful tools for formatting text and mathematical ex
167 // Regular text font size here. 168 // Regular text font size here.
168 fontSize: 15, 169 fontSize: 15,
169 ), 170 ),
170 - latexWorkaround: (tex) => tex.replaceAllMapped(  
171 - RegExp(r"align\*"), (match) => "aligned"), 171 + latexWorkaround: (tex) =>
  172 + tex.replaceAllMapped(RegExp(r"align\*"),
  173 + (match) => "aligned"),
172 latexBuilder: (contex, tex) { 174 latexBuilder: (contex, tex) {
173 - return SingleChildScrollView( 175 + var controller = ScrollController();
  176 + return Column(
  177 + children: [
  178 + Scrollbar(
  179 + controller: controller,
  180 + child: SingleChildScrollView(
  181 + controller: controller,
174 scrollDirection: Axis.horizontal, 182 scrollDirection: Axis.horizontal,
175 child: Math.tex( 183 child: Math.tex(
176 tex, 184 tex,
177 - textStyle: const TextStyle(fontSize: 17), 185 + textStyle: const TextStyle(
  186 + fontSize: 17,
  187 + ),
  188 + ),
178 ), 189 ),
  190 + ),
  191 + ],
179 ); 192 );
180 }, 193 },
181 ), 194 ),
@@ -188,6 +201,7 @@ Markdown and LaTeX can be powerful tools for formatting text and mathematical ex @@ -188,6 +201,7 @@ Markdown and LaTeX can be powerful tools for formatting text and mathematical ex
188 ], 201 ],
189 ), 202 ),
190 ), 203 ),
  204 + ),
191 ConstrainedBox( 205 ConstrainedBox(
192 constraints: const BoxConstraints(maxHeight: 200), 206 constraints: const BoxConstraints(maxHeight: 200),
193 child: Padding( 207 child: Padding(
@@ -182,7 +182,7 @@ packages: @@ -182,7 +182,7 @@ packages:
182 path: ".." 182 path: ".."
183 relative: true 183 relative: true
184 source: path 184 source: path
185 - version: "0.0.3" 185 + version: "0.0.4"
186 http: 186 http:
187 dependency: transitive 187 dependency: transitive
188 description: 188 description:
@@ -191,6 +191,28 @@ class UnorderedListRenderObject extends RenderProxyBox { @@ -191,6 +191,28 @@ class UnorderedListRenderObject extends RenderProxyBox {
191 offset + _bulletOffset, _bulletSize, Paint()..color = _bulletColor); 191 offset + _bulletOffset, _bulletSize, Paint()..color = _bulletColor);
192 } 192 }
193 } 193 }
  194 +
  195 + @override
  196 + bool hitTestSelf(Offset position) {
  197 + return false;
  198 + }
  199 +
  200 + @override
  201 + bool hitTestChildren(BoxHitTestResult result, {required Offset position}) {
  202 + Offset offset = (child!.parentData as BoxParentData).offset;
  203 + return result.addWithPaintOffset(
  204 + offset: offset,
  205 + position: position,
  206 + hitTest: (result, newOffset) {
  207 + return child?.hitTest(result, position: newOffset) ?? false;
  208 + },
  209 + );
  210 + }
  211 +
  212 + @override
  213 + bool hitTest(BoxHitTestResult result, {required Offset position}) {
  214 + return hitTestChildren(result, position: position);
  215 + }
194 } 216 }
195 217
196 class OrderedListView extends SingleChildRenderObjectWidget { 218 class OrderedListView extends SingleChildRenderObjectWidget {
@@ -249,12 +249,6 @@ class HTag extends BlockMd { @@ -249,12 +249,6 @@ class HTag extends BlockMd {
249 textDirection: textDirection, 249 textDirection: textDirection,
250 ); 250 );
251 } 251 }
252 -  
253 - // @override  
254 - // String toHtml(String text) {  
255 - // var match = exp.firstMatch(text.trim());  
256 - // return "<h${match![1]!.length}>${TexText.toHtmlData(match[2].toString().trim())}<h${match[1]!.length}>";  
257 - // }  
258 } 252 }
259 253
260 /// Horizontal line component 254 /// Horizontal line component
@@ -480,7 +474,7 @@ class BoldMd extends InlineMd { @@ -480,7 +474,7 @@ class BoldMd extends InlineMd {
480 } 474 }
481 } 475 }
482 476
483 -class LatexMathMultyLine extends InlineMd { 477 +class LatexMathMultyLine extends BlockMd {
484 @override 478 @override
485 RegExp get exp => RegExp( 479 RegExp get exp => RegExp(
486 r"\\\[(.*?)\\\]|(\\begin.*?\\end{.*?})", 480 r"\\\[(.*?)\\\]|(\\begin.*?\\end{.*?})",
@@ -488,14 +482,14 @@ class LatexMathMultyLine extends InlineMd { @@ -488,14 +482,14 @@ class LatexMathMultyLine extends InlineMd {
488 ); 482 );
489 483
490 @override 484 @override
491 - InlineSpan span( 485 + Widget build(
492 BuildContext context, 486 BuildContext context,
493 String text, 487 String text,
494 TextStyle? style, 488 TextStyle? style,
495 TextDirection textDirection, 489 TextDirection textDirection,
496 - final void Function(String url, String title)? onLinkTab,  
497 - final String Function(String tex)? latexWorkaround,  
498 - final Widget Function(BuildContext context, String tex)? latexBuilder, 490 + void Function(String url, String title)? onLinkTab,
  491 + String Function(String tex)? latexWorkaround,
  492 + Widget Function(BuildContext context, String tex)? latexBuilder,
499 ) { 493 ) {
500 var p0 = exp.firstMatch(text.trim()); 494 var p0 = exp.firstMatch(text.trim());
501 p0?.group(0); 495 p0?.group(0);
@@ -504,7 +498,7 @@ class LatexMathMultyLine extends InlineMd { @@ -504,7 +498,7 @@ class LatexMathMultyLine extends InlineMd {
504 498
505 var builder = latexBuilder ?? 499 var builder = latexBuilder ??
506 (BuildContext context, String tex) => Math.tex( 500 (BuildContext context, String tex) => Math.tex(
507 - workaround(tex), 501 + tex,
508 textStyle: style?.copyWith( 502 textStyle: style?.copyWith(
509 fontFamily: "SansSerif", 503 fontFamily: "SansSerif",
510 ), 504 ),
@@ -540,12 +534,7 @@ class LatexMathMultyLine extends InlineMd { @@ -540,12 +534,7 @@ class LatexMathMultyLine extends InlineMd {
540 ); 534 );
541 }, 535 },
542 ); 536 );
543 -  
544 - return WidgetSpan(  
545 - alignment: PlaceholderAlignment.baseline,  
546 - baseline: TextBaseline.alphabetic,  
547 - child: builder(context, mathText),  
548 - ); 537 + return builder(context, workaround(mathText));
549 } 538 }
550 } 539 }
551 540
1 -// library tex_text;  
2 -//  
3 -// import 'package:flutter/material.dart';  
4 -// import 'package:flutter_math_fork/flutter_math.dart';  
5 -//  
6 -// /// A LaTex text view.  
7 -// ///  
8 -// /// Example:  
9 -// /// ```dart  
10 -// /// TexText(r"The equation is $x^2+y^2=z^2$") //Output: The equation is <LaTex formatted equation>  
11 -// ///  
12 -// /// // \$ shows $ result  
13 -// /// TexText(r"The equation is \$") //Output: The equation is $  
14 -// /// ```  
15 -// class TexText {  
16 -// const TexText(  
17 -// this.text, {  
18 -// TextStyle? style,  
19 -// this.textDirection = TextDirection.ltr,  
20 -// this.mathStyle = MathStyle.text,  
21 -// }) : _style = style;  
22 -// final String text;  
23 -// final TextStyle? _style;  
24 -// final TextDirection textDirection;  
25 -// final MathStyle mathStyle;  
26 -// // final TexAlignment alignment;  
27 -//  
28 -// List<InlineSpan> getSpans(BuildContext context) {  
29 -// //  
30 -// String e = text;  
31 -// TextStyle? style = _style ?? Theme.of(context).textTheme.bodyMedium;  
32 -// List<InlineSpan> spans = [];  
33 -//  
34 -// e.splitMapJoin(  
35 -// RegExp(  
36 -// r"\\\[(.*?)\\\]|\\\((.*?)\\\)",  
37 -// multiLine: true,  
38 -// dotAll: true,  
39 -// ),  
40 -// onMatch: (p0) {  
41 -// spans.add(  
42 -// WidgetSpan(  
43 -// alignment: PlaceholderAlignment.baseline,  
44 -// baseline: TextBaseline.alphabetic,  
45 -// child: Math.tex(  
46 -// // _newEasySyntax(p0[1].toString().replaceAll(dollar, "\\\$")),  
47 -// p0[1]?.toString() ?? p0[2].toString(),  
48 -// textStyle: style?.copyWith(  
49 -// fontFamily: "SansSerif",  
50 -// ),  
51 -// mathStyle: mathStyle,  
52 -// textScaleFactor: 1,  
53 -// settings: const TexParserSettings(  
54 -// strict: Strict.ignore,  
55 -// ),  
56 -// options: MathOptions(  
57 -// sizeUnderTextStyle: MathSize.large,  
58 -// color: style?.color ?? Theme.of(context).colorScheme.onSurface,  
59 -// fontSize: style?.fontSize ??  
60 -// Theme.of(context).textTheme.bodyMedium?.fontSize,  
61 -// mathFontOptions: FontOptions(  
62 -// fontFamily: "Main",  
63 -// fontWeight: style?.fontWeight ?? FontWeight.normal,  
64 -// fontShape: FontStyle.normal,  
65 -// ),  
66 -// textFontOptions: FontOptions(  
67 -// fontFamily: "Main",  
68 -// fontWeight: style?.fontWeight ?? FontWeight.normal,  
69 -// fontShape: FontStyle.normal,  
70 -// ),  
71 -// style: mathStyle,  
72 -// ),  
73 -// onErrorFallback: (err) {  
74 -// return Text(  
75 -// "\\(${p0[1] ?? p0[2]}\\)",  
76 -// textDirection: textDirection,  
77 -// style: style?.copyWith(  
78 -// color: Theme.of(context).colorScheme.error) ??  
79 -// TextStyle(color: Theme.of(context).colorScheme.error),  
80 -// );  
81 -// },  
82 -// ),  
83 -// ),  
84 -// );  
85 -// return p0[1].toString();  
86 -// },  
87 -// onNonMatch: (p0) {  
88 -// spans.add(  
89 -// TextSpan(  
90 -// text: p0.toString(),  
91 -// style: style,  
92 -// ),  
93 -// );  
94 -// return p0;  
95 -// },  
96 -// );  
97 -// return spans;  
98 -// }  
99 -// }  
1 name: gpt_markdown 1 name: gpt_markdown
2 description: "The purpose of this package is to render the response of ChatGPT into a Flutter app." 2 description: "The purpose of this package is to render the response of ChatGPT into a Flutter app."
3 -version: 0.0.3 3 +version: 0.0.4
4 homepage: https://github.com/saminsohag/flutter_packages/tree/main/gpt_markdown 4 homepage: https://github.com/saminsohag/flutter_packages/tree/main/gpt_markdown
5 5
6 environment: 6 environment: