Showing
6 changed files
with
67 additions
and
23 deletions
| 1 | import 'dart:developer'; | 1 | import 'dart:developer'; |
| 2 | 2 | ||
| 3 | import 'package:flutter/material.dart'; | 3 | import 'package:flutter/material.dart'; |
| 4 | +import 'package:flutter_math_fork/flutter_math.dart'; | ||
| 4 | import 'package:gpt_markdown/gpt_markdown.dart'; | 5 | import 'package:gpt_markdown/gpt_markdown.dart'; |
| 5 | 6 | ||
| 6 | void main() { | 7 | void main() { |
| @@ -134,8 +135,7 @@ Markdown and LaTeX can be powerful tools for formatting text and mathematical ex | @@ -134,8 +135,7 @@ Markdown and LaTeX can be powerful tools for formatting text and mathematical ex | ||
| 134 | width: 1, | 135 | width: 1, |
| 135 | color: Theme.of(context).colorScheme.outline), | 136 | color: Theme.of(context).colorScheme.outline), |
| 136 | ), | 137 | ), |
| 137 | - child: | ||
| 138 | - LayoutBuilder(builder: (context, constraints) { | 138 | + child: LayoutBuilder(builder: (context, constraints) { |
| 139 | return Theme( | 139 | return Theme( |
| 140 | data: Theme.of(context).copyWith( | 140 | data: Theme.of(context).copyWith( |
| 141 | textTheme: const TextTheme( | 141 | textTheme: const TextTheme( |
| @@ -167,15 +167,24 @@ Markdown and LaTeX can be powerful tools for formatting text and mathematical ex | @@ -167,15 +167,24 @@ Markdown and LaTeX can be powerful tools for formatting text and mathematical ex | ||
| 167 | // Regular text font size here. | 167 | // Regular text font size here. |
| 168 | fontSize: 15, | 168 | fontSize: 15, |
| 169 | ), | 169 | ), |
| 170 | - latexWorkaround: (tex) => | ||
| 171 | - tex.replaceAllMapped(RegExp(r"align\*"), | ||
| 172 | - (match) => "aligned"), | 170 | + latexWorkaround: (tex) => tex.replaceAllMapped( |
| 171 | + RegExp(r"align\*"), (match) => "aligned"), | ||
| 172 | + latexBuilder: (contex, tex) { | ||
| 173 | + return SingleChildScrollView( | ||
| 174 | + scrollDirection: Axis.horizontal, | ||
| 175 | + child: Math.tex( | ||
| 176 | + tex, | ||
| 177 | + textStyle: const TextStyle(fontSize: 17), | ||
| 178 | + ), | ||
| 179 | + ); | ||
| 180 | + }, | ||
| 173 | ), | 181 | ), |
| 174 | // child: const Text("Hello"), | 182 | // child: const Text("Hello"), |
| 175 | ); | 183 | ); |
| 176 | }), | 184 | }), |
| 177 | ); | 185 | ); |
| 178 | - }), | 186 | + }, |
| 187 | + ), | ||
| 179 | ], | 188 | ], |
| 180 | ), | 189 | ), |
| 181 | ), | 190 | ), |
| @@ -143,7 +143,7 @@ packages: | @@ -143,7 +143,7 @@ packages: | ||
| 143 | source: hosted | 143 | source: hosted |
| 144 | version: "2.0.3" | 144 | version: "2.0.3" |
| 145 | flutter_math_fork: | 145 | flutter_math_fork: |
| 146 | - dependency: transitive | 146 | + dependency: "direct main" |
| 147 | description: | 147 | description: |
| 148 | name: flutter_math_fork | 148 | name: flutter_math_fork |
| 149 | sha256: "94bee4642892a94939af0748c6a7de0ff8318feee588379dcdfea7dc5cba06c8" | 149 | sha256: "94bee4642892a94939af0748c6a7de0ff8318feee588379dcdfea7dc5cba06c8" |
| @@ -20,6 +20,7 @@ dependencies: | @@ -20,6 +20,7 @@ dependencies: | ||
| 20 | path_provider: ^2.0.14 | 20 | path_provider: ^2.0.14 |
| 21 | permission_handler: ^10.2.0 | 21 | permission_handler: ^10.2.0 |
| 22 | file_picker: ^5.2.10 | 22 | file_picker: ^5.2.10 |
| 23 | + flutter_math_fork: ^0.7.2 | ||
| 23 | 24 | ||
| 24 | dev_dependencies: | 25 | dev_dependencies: |
| 25 | flutter_test: | 26 | flutter_test: |
| @@ -16,6 +16,7 @@ class TexMarkdown extends StatelessWidget { | @@ -16,6 +16,7 @@ class TexMarkdown extends StatelessWidget { | ||
| 16 | this.textAlign, | 16 | this.textAlign, |
| 17 | this.textScaler, | 17 | this.textScaler, |
| 18 | this.onLinkTab, | 18 | this.onLinkTab, |
| 19 | + this.latexBuilder, | ||
| 19 | }); | 20 | }); |
| 20 | final TextDirection textDirection; | 21 | final TextDirection textDirection; |
| 21 | final String data; | 22 | final String data; |
| @@ -24,6 +25,7 @@ class TexMarkdown extends StatelessWidget { | @@ -24,6 +25,7 @@ class TexMarkdown extends StatelessWidget { | ||
| 24 | final TextScaler? textScaler; | 25 | final TextScaler? textScaler; |
| 25 | final void Function(String url, String title)? onLinkTab; | 26 | final void Function(String url, String title)? onLinkTab; |
| 26 | final String Function(String tex)? latexWorkaround; | 27 | final String Function(String tex)? latexWorkaround; |
| 28 | + final Widget Function(BuildContext context, String tex)? latexBuilder; | ||
| 27 | final bool followLinkColor; | 29 | final bool followLinkColor; |
| 28 | 30 | ||
| 29 | @override | 31 | @override |
| @@ -38,6 +40,7 @@ class TexMarkdown extends StatelessWidget { | @@ -38,6 +40,7 @@ class TexMarkdown extends StatelessWidget { | ||
| 38 | textScaler: textScaler, | 40 | textScaler: textScaler, |
| 39 | followLinkColor: followLinkColor, | 41 | followLinkColor: followLinkColor, |
| 40 | latexWorkaround: latexWorkaround, | 42 | latexWorkaround: latexWorkaround, |
| 43 | + latexBuilder: latexBuilder, | ||
| 41 | )); | 44 | )); |
| 42 | } | 45 | } |
| 43 | } | 46 | } |
| @@ -32,6 +32,7 @@ abstract class MarkdownComponent { | @@ -32,6 +32,7 @@ abstract class MarkdownComponent { | ||
| 32 | TextDirection textDirection, | 32 | TextDirection textDirection, |
| 33 | final void Function(String url, String title)? onLinkTab, | 33 | final void Function(String url, String title)? onLinkTab, |
| 34 | final String Function(String tex)? latexWorkaround, | 34 | final String Function(String tex)? latexWorkaround, |
| 35 | + final Widget Function(BuildContext context, String tex)? latexBuilder, | ||
| 35 | ) { | 36 | ) { |
| 36 | List<InlineSpan> spans = []; | 37 | List<InlineSpan> spans = []; |
| 37 | List<String> regexes = | 38 | List<String> regexes = |
| @@ -57,6 +58,7 @@ abstract class MarkdownComponent { | @@ -57,6 +58,7 @@ abstract class MarkdownComponent { | ||
| 57 | textDirection, | 58 | textDirection, |
| 58 | onLinkTab, | 59 | onLinkTab, |
| 59 | latexWorkaround, | 60 | latexWorkaround, |
| 61 | + latexBuilder, | ||
| 60 | )); | 62 | )); |
| 61 | } else { | 63 | } else { |
| 62 | if (each is BlockMd) { | 64 | if (each is BlockMd) { |
| @@ -76,6 +78,7 @@ abstract class MarkdownComponent { | @@ -76,6 +78,7 @@ abstract class MarkdownComponent { | ||
| 76 | textDirection, | 78 | textDirection, |
| 77 | onLinkTab, | 79 | onLinkTab, |
| 78 | latexWorkaround, | 80 | latexWorkaround, |
| 81 | + latexBuilder, | ||
| 79 | ), | 82 | ), |
| 80 | TextSpan( | 83 | TextSpan( |
| 81 | text: "\n ", | 84 | text: "\n ", |
| @@ -114,6 +117,7 @@ abstract class MarkdownComponent { | @@ -114,6 +117,7 @@ abstract class MarkdownComponent { | ||
| 114 | TextDirection textDirection, | 117 | TextDirection textDirection, |
| 115 | final void Function(String url, String title)? onLinkTab, | 118 | final void Function(String url, String title)? onLinkTab, |
| 116 | final String Function(String tex)? latexWorkaround, | 119 | final String Function(String tex)? latexWorkaround, |
| 120 | + final Widget Function(BuildContext context, String tex)? latexBuilder, | ||
| 117 | ); | 121 | ); |
| 118 | 122 | ||
| 119 | RegExp get exp; | 123 | RegExp get exp; |
| @@ -133,6 +137,7 @@ abstract class InlineMd extends MarkdownComponent { | @@ -133,6 +137,7 @@ abstract class InlineMd extends MarkdownComponent { | ||
| 133 | TextDirection textDirection, | 137 | TextDirection textDirection, |
| 134 | final void Function(String url, String title)? onLinkTab, | 138 | final void Function(String url, String title)? onLinkTab, |
| 135 | final String Function(String tex)? latexWorkaround, | 139 | final String Function(String tex)? latexWorkaround, |
| 140 | + final Widget Function(BuildContext context, String tex)? latexBuilder, | ||
| 136 | ); | 141 | ); |
| 137 | } | 142 | } |
| 138 | 143 | ||
| @@ -148,6 +153,7 @@ abstract class BlockMd extends MarkdownComponent { | @@ -148,6 +153,7 @@ abstract class BlockMd extends MarkdownComponent { | ||
| 148 | TextDirection textDirection, | 153 | TextDirection textDirection, |
| 149 | final void Function(String url, String title)? onLinkTab, | 154 | final void Function(String url, String title)? onLinkTab, |
| 150 | final String Function(String tex)? latexWorkaround, | 155 | final String Function(String tex)? latexWorkaround, |
| 156 | + final Widget Function(BuildContext context, String tex)? latexBuilder, | ||
| 151 | ) { | 157 | ) { |
| 152 | return WidgetSpan( | 158 | return WidgetSpan( |
| 153 | child: build( | 159 | child: build( |
| @@ -157,6 +163,7 @@ abstract class BlockMd extends MarkdownComponent { | @@ -157,6 +163,7 @@ abstract class BlockMd extends MarkdownComponent { | ||
| 157 | textDirection, | 163 | textDirection, |
| 158 | onLinkTab, | 164 | onLinkTab, |
| 159 | latexWorkaround, | 165 | latexWorkaround, |
| 166 | + latexBuilder, | ||
| 160 | ), | 167 | ), |
| 161 | alignment: PlaceholderAlignment.middle, | 168 | alignment: PlaceholderAlignment.middle, |
| 162 | ); | 169 | ); |
| @@ -169,6 +176,7 @@ abstract class BlockMd extends MarkdownComponent { | @@ -169,6 +176,7 @@ abstract class BlockMd extends MarkdownComponent { | ||
| 169 | TextDirection textDirection, | 176 | TextDirection textDirection, |
| 170 | final void Function(String url, String title)? onLinkTab, | 177 | final void Function(String url, String title)? onLinkTab, |
| 171 | final String Function(String tex)? latexWorkaround, | 178 | final String Function(String tex)? latexWorkaround, |
| 179 | + final Widget Function(BuildContext context, String tex)? latexBuilder, | ||
| 172 | ); | 180 | ); |
| 173 | } | 181 | } |
| 174 | 182 | ||
| @@ -184,6 +192,7 @@ class HTag extends BlockMd { | @@ -184,6 +192,7 @@ class HTag extends BlockMd { | ||
| 184 | TextDirection textDirection, | 192 | TextDirection textDirection, |
| 185 | final void Function(String url, String title)? onLinkTab, | 193 | final void Function(String url, String title)? onLinkTab, |
| 186 | final String Function(String tex)? latexWorkaround, | 194 | final String Function(String tex)? latexWorkaround, |
| 195 | + final Widget Function(BuildContext context, String tex)? latexBuilder, | ||
| 187 | ) { | 196 | ) { |
| 188 | var match = exp.firstMatch(text.trim()); | 197 | var match = exp.firstMatch(text.trim()); |
| 189 | return Text.rich( | 198 | return Text.rich( |
| @@ -221,6 +230,7 @@ class HTag extends BlockMd { | @@ -221,6 +230,7 @@ class HTag extends BlockMd { | ||
| 221 | textDirection, | 230 | textDirection, |
| 222 | (url, title) {}, | 231 | (url, title) {}, |
| 223 | latexWorkaround, | 232 | latexWorkaround, |
| 233 | + latexBuilder, | ||
| 224 | )), | 234 | )), |
| 225 | if (match[1]!.length == 1) ...[ | 235 | if (match[1]!.length == 1) ...[ |
| 226 | const TextSpan( | 236 | const TextSpan( |
| @@ -259,6 +269,7 @@ class HrLine extends BlockMd { | @@ -259,6 +269,7 @@ class HrLine extends BlockMd { | ||
| 259 | TextDirection textDirection, | 269 | TextDirection textDirection, |
| 260 | final void Function(String url, String title)? onLinkTab, | 270 | final void Function(String url, String title)? onLinkTab, |
| 261 | final String Function(String tex)? latexWorkaround, | 271 | final String Function(String tex)? latexWorkaround, |
| 272 | + final Widget Function(BuildContext context, String tex)? latexBuilder, | ||
| 262 | ) { | 273 | ) { |
| 263 | return CustomDivider( | 274 | return CustomDivider( |
| 264 | height: 2, | 275 | height: 2, |
| @@ -281,6 +292,7 @@ class CheckBoxMd extends BlockMd { | @@ -281,6 +292,7 @@ class CheckBoxMd extends BlockMd { | ||
| 281 | TextDirection textDirection, | 292 | TextDirection textDirection, |
| 282 | final void Function(String url, String title)? onLinkTab, | 293 | final void Function(String url, String title)? onLinkTab, |
| 283 | final String Function(String tex)? latexWorkaround, | 294 | final String Function(String tex)? latexWorkaround, |
| 295 | + final Widget Function(BuildContext context, String tex)? latexBuilder, | ||
| 284 | ) { | 296 | ) { |
| 285 | var match = exp.firstMatch(text.trim()); | 297 | var match = exp.firstMatch(text.trim()); |
| 286 | return CustomCb( | 298 | return CustomCb( |
| @@ -292,6 +304,7 @@ class CheckBoxMd extends BlockMd { | @@ -292,6 +304,7 @@ class CheckBoxMd extends BlockMd { | ||
| 292 | textDirection: textDirection, | 304 | textDirection: textDirection, |
| 293 | style: style, | 305 | style: style, |
| 294 | latexWorkaround: latexWorkaround, | 306 | latexWorkaround: latexWorkaround, |
| 307 | + latexBuilder: latexBuilder, | ||
| 295 | ), | 308 | ), |
| 296 | ); | 309 | ); |
| 297 | } | 310 | } |
| @@ -311,6 +324,7 @@ class RadioButtonMd extends BlockMd { | @@ -311,6 +324,7 @@ class RadioButtonMd extends BlockMd { | ||
| 311 | TextDirection textDirection, | 324 | TextDirection textDirection, |
| 312 | final void Function(String url, String title)? onLinkTab, | 325 | final void Function(String url, String title)? onLinkTab, |
| 313 | final String Function(String tex)? latexWorkaround, | 326 | final String Function(String tex)? latexWorkaround, |
| 327 | + final Widget Function(BuildContext context, String tex)? latexBuilder, | ||
| 314 | ) { | 328 | ) { |
| 315 | var match = exp.firstMatch(text.trim()); | 329 | var match = exp.firstMatch(text.trim()); |
| 316 | return CustomRb( | 330 | return CustomRb( |
| @@ -322,6 +336,7 @@ class RadioButtonMd extends BlockMd { | @@ -322,6 +336,7 @@ class RadioButtonMd extends BlockMd { | ||
| 322 | textDirection: textDirection, | 336 | textDirection: textDirection, |
| 323 | style: style, | 337 | style: style, |
| 324 | latexWorkaround: latexWorkaround, | 338 | latexWorkaround: latexWorkaround, |
| 339 | + latexBuilder: latexBuilder, | ||
| 325 | ), | 340 | ), |
| 326 | ); | 341 | ); |
| 327 | } | 342 | } |
| @@ -341,6 +356,7 @@ class IndentMd extends BlockMd { | @@ -341,6 +356,7 @@ class IndentMd extends BlockMd { | ||
| 341 | TextDirection textDirection, | 356 | TextDirection textDirection, |
| 342 | final void Function(String url, String title)? onLinkTab, | 357 | final void Function(String url, String title)? onLinkTab, |
| 343 | final String Function(String tex)? latexWorkaround, | 358 | final String Function(String tex)? latexWorkaround, |
| 359 | + final Widget Function(BuildContext context, String tex)? latexBuilder, | ||
| 344 | ) { | 360 | ) { |
| 345 | [ | 361 | [ |
| 346 | r"\\\[(.*?)\\\]", | 362 | r"\\\[(.*?)\\\]", |
| @@ -356,14 +372,8 @@ class IndentMd extends BlockMd { | @@ -356,14 +372,8 @@ class IndentMd extends BlockMd { | ||
| 356 | textDirection: textDirection, | 372 | textDirection: textDirection, |
| 357 | child: RichText( | 373 | child: RichText( |
| 358 | text: TextSpan( | 374 | text: TextSpan( |
| 359 | - children: MarkdownComponent.generate( | ||
| 360 | - context, | ||
| 361 | - "${match?[2]}", | ||
| 362 | - style, | ||
| 363 | - textDirection, | ||
| 364 | - onLinkTab, | ||
| 365 | - latexWorkaround, | ||
| 366 | - ), | 375 | + children: MarkdownComponent.generate(context, "${match?[2]}", style, |
| 376 | + textDirection, onLinkTab, latexWorkaround, latexBuilder), | ||
| 367 | )), | 377 | )), |
| 368 | ); | 378 | ); |
| 369 | } | 379 | } |
| @@ -383,6 +393,7 @@ class UnOrderedList extends BlockMd { | @@ -383,6 +393,7 @@ class UnOrderedList extends BlockMd { | ||
| 383 | TextDirection textDirection, | 393 | TextDirection textDirection, |
| 384 | final void Function(String url, String title)? onLinkTab, | 394 | final void Function(String url, String title)? onLinkTab, |
| 385 | final String Function(String tex)? latexWorkaround, | 395 | final String Function(String tex)? latexWorkaround, |
| 396 | + final Widget Function(BuildContext context, String tex)? latexBuilder, | ||
| 386 | ) { | 397 | ) { |
| 387 | var match = exp.firstMatch(text); | 398 | var match = exp.firstMatch(text); |
| 388 | return UnorderedListView( | 399 | return UnorderedListView( |
| @@ -396,6 +407,7 @@ class UnOrderedList extends BlockMd { | @@ -396,6 +407,7 @@ class UnOrderedList extends BlockMd { | ||
| 396 | textDirection: textDirection, | 407 | textDirection: textDirection, |
| 397 | style: style, | 408 | style: style, |
| 398 | latexWorkaround: latexWorkaround, | 409 | latexWorkaround: latexWorkaround, |
| 410 | + latexBuilder: latexBuilder, | ||
| 399 | ), | 411 | ), |
| 400 | ); | 412 | ); |
| 401 | } | 413 | } |
| @@ -416,6 +428,7 @@ class OrderedList extends BlockMd { | @@ -416,6 +428,7 @@ class OrderedList extends BlockMd { | ||
| 416 | TextDirection textDirection, | 428 | TextDirection textDirection, |
| 417 | final void Function(String url, String title)? onLinkTab, | 429 | final void Function(String url, String title)? onLinkTab, |
| 418 | final String Function(String tex)? latexWorkaround, | 430 | final String Function(String tex)? latexWorkaround, |
| 431 | + final Widget Function(BuildContext context, String tex)? latexBuilder, | ||
| 419 | ) { | 432 | ) { |
| 420 | var match = exp.firstMatch(text.trim()); | 433 | var match = exp.firstMatch(text.trim()); |
| 421 | return OrderedListView( | 434 | return OrderedListView( |
| @@ -428,6 +441,7 @@ class OrderedList extends BlockMd { | @@ -428,6 +441,7 @@ class OrderedList extends BlockMd { | ||
| 428 | textDirection: textDirection, | 441 | textDirection: textDirection, |
| 429 | style: style, | 442 | style: style, |
| 430 | latexWorkaround: latexWorkaround, | 443 | latexWorkaround: latexWorkaround, |
| 444 | + latexBuilder: latexBuilder, | ||
| 431 | ), | 445 | ), |
| 432 | ); | 446 | ); |
| 433 | } | 447 | } |
| @@ -446,6 +460,7 @@ class BoldMd extends InlineMd { | @@ -446,6 +460,7 @@ class BoldMd extends InlineMd { | ||
| 446 | TextDirection textDirection, | 460 | TextDirection textDirection, |
| 447 | final void Function(String url, String title)? onLinkTab, | 461 | final void Function(String url, String title)? onLinkTab, |
| 448 | final String Function(String tex)? latexWorkaround, | 462 | final String Function(String tex)? latexWorkaround, |
| 463 | + final Widget Function(BuildContext context, String tex)? latexBuilder, | ||
| 449 | ) { | 464 | ) { |
| 450 | var match = exp.firstMatch(text.trim()); | 465 | var match = exp.firstMatch(text.trim()); |
| 451 | return TextSpan( | 466 | return TextSpan( |
| @@ -457,6 +472,7 @@ class BoldMd extends InlineMd { | @@ -457,6 +472,7 @@ class BoldMd extends InlineMd { | ||
| 457 | textDirection, | 472 | textDirection, |
| 458 | onLinkTab, | 473 | onLinkTab, |
| 459 | latexWorkaround, | 474 | latexWorkaround, |
| 475 | + latexBuilder, | ||
| 460 | ), | 476 | ), |
| 461 | style: style?.copyWith(fontWeight: FontWeight.bold) ?? | 477 | style: style?.copyWith(fontWeight: FontWeight.bold) ?? |
| 462 | const TextStyle(fontWeight: FontWeight.bold), | 478 | const TextStyle(fontWeight: FontWeight.bold), |
| @@ -479,16 +495,16 @@ class LatexMathMultyLine extends InlineMd { | @@ -479,16 +495,16 @@ class LatexMathMultyLine extends InlineMd { | ||
| 479 | TextDirection textDirection, | 495 | TextDirection textDirection, |
| 480 | final void Function(String url, String title)? onLinkTab, | 496 | final void Function(String url, String title)? onLinkTab, |
| 481 | final String Function(String tex)? latexWorkaround, | 497 | final String Function(String tex)? latexWorkaround, |
| 498 | + final Widget Function(BuildContext context, String tex)? latexBuilder, | ||
| 482 | ) { | 499 | ) { |
| 483 | var p0 = exp.firstMatch(text.trim()); | 500 | var p0 = exp.firstMatch(text.trim()); |
| 484 | p0?.group(0); | 501 | p0?.group(0); |
| 485 | String mathText = p0?[1] ?? p0?[2] ?? ""; | 502 | String mathText = p0?[1] ?? p0?[2] ?? ""; |
| 486 | var workaround = latexWorkaround ?? (String tex) => tex; | 503 | var workaround = latexWorkaround ?? (String tex) => tex; |
| 487 | - return WidgetSpan( | ||
| 488 | - alignment: PlaceholderAlignment.baseline, | ||
| 489 | - baseline: TextBaseline.alphabetic, | ||
| 490 | - child: Math.tex( | ||
| 491 | - workaround(mathText), | 504 | + |
| 505 | + var builder = latexBuilder ?? | ||
| 506 | + (BuildContext context, String tex) => Math.tex( | ||
| 507 | + workaround(tex), | ||
| 492 | textStyle: style?.copyWith( | 508 | textStyle: style?.copyWith( |
| 493 | fontFamily: "SansSerif", | 509 | fontFamily: "SansSerif", |
| 494 | ), | 510 | ), |
| @@ -518,12 +534,17 @@ class LatexMathMultyLine extends InlineMd { | @@ -518,12 +534,17 @@ class LatexMathMultyLine extends InlineMd { | ||
| 518 | return Text( | 534 | return Text( |
| 519 | workaround(mathText), | 535 | workaround(mathText), |
| 520 | textDirection: textDirection, | 536 | textDirection: textDirection, |
| 521 | - style: | ||
| 522 | - style?.copyWith(color: Theme.of(context).colorScheme.error) ?? | 537 | + style: style?.copyWith( |
| 538 | + color: Theme.of(context).colorScheme.error) ?? | ||
| 523 | TextStyle(color: Theme.of(context).colorScheme.error), | 539 | TextStyle(color: Theme.of(context).colorScheme.error), |
| 524 | ); | 540 | ); |
| 525 | }, | 541 | }, |
| 526 | - ), | 542 | + ); |
| 543 | + | ||
| 544 | + return WidgetSpan( | ||
| 545 | + alignment: PlaceholderAlignment.baseline, | ||
| 546 | + baseline: TextBaseline.alphabetic, | ||
| 547 | + child: builder(context, mathText), | ||
| 527 | ); | 548 | ); |
| 528 | } | 549 | } |
| 529 | } | 550 | } |
| @@ -547,6 +568,7 @@ class LatexMath extends InlineMd { | @@ -547,6 +568,7 @@ class LatexMath extends InlineMd { | ||
| 547 | TextDirection textDirection, | 568 | TextDirection textDirection, |
| 548 | final void Function(String url, String title)? onLinkTab, | 569 | final void Function(String url, String title)? onLinkTab, |
| 549 | final String Function(String tex)? latexWorkaround, | 570 | final String Function(String tex)? latexWorkaround, |
| 571 | + final Widget Function(BuildContext context, String tex)? latexBuilder, | ||
| 550 | ) { | 572 | ) { |
| 551 | var p0 = exp.firstMatch(text.trim()); | 573 | var p0 = exp.firstMatch(text.trim()); |
| 552 | p0?.group(0); | 574 | p0?.group(0); |
| @@ -609,6 +631,7 @@ class ItalicMd extends InlineMd { | @@ -609,6 +631,7 @@ class ItalicMd extends InlineMd { | ||
| 609 | TextDirection textDirection, | 631 | TextDirection textDirection, |
| 610 | final void Function(String url, String title)? onLinkTab, | 632 | final void Function(String url, String title)? onLinkTab, |
| 611 | final String Function(String tex)? latexWorkaround, | 633 | final String Function(String tex)? latexWorkaround, |
| 634 | + final Widget Function(BuildContext context, String tex)? latexBuilder, | ||
| 612 | ) { | 635 | ) { |
| 613 | var match = exp.firstMatch(text.trim()); | 636 | var match = exp.firstMatch(text.trim()); |
| 614 | return TextSpan( | 637 | return TextSpan( |
| @@ -619,6 +642,7 @@ class ItalicMd extends InlineMd { | @@ -619,6 +642,7 @@ class ItalicMd extends InlineMd { | ||
| 619 | textDirection, | 642 | textDirection, |
| 620 | onLinkTab, | 643 | onLinkTab, |
| 621 | latexWorkaround, | 644 | latexWorkaround, |
| 645 | + latexBuilder, | ||
| 622 | ), | 646 | ), |
| 623 | style: (style ?? const TextStyle()).copyWith(fontStyle: FontStyle.italic), | 647 | style: (style ?? const TextStyle()).copyWith(fontStyle: FontStyle.italic), |
| 624 | ); | 648 | ); |
| @@ -638,6 +662,7 @@ class ATagMd extends InlineMd { | @@ -638,6 +662,7 @@ class ATagMd extends InlineMd { | ||
| 638 | TextDirection textDirection, | 662 | TextDirection textDirection, |
| 639 | final void Function(String url, String title)? onLinkTab, | 663 | final void Function(String url, String title)? onLinkTab, |
| 640 | final String Function(String tex)? latexWorkaround, | 664 | final String Function(String tex)? latexWorkaround, |
| 665 | + final Widget Function(BuildContext context, String tex)? latexBuilder, | ||
| 641 | ) { | 666 | ) { |
| 642 | var match = exp.firstMatch(text.trim()); | 667 | var match = exp.firstMatch(text.trim()); |
| 643 | if (match?[1] == null && match?[2] == null) { | 668 | if (match?[1] == null && match?[2] == null) { |
| @@ -682,6 +707,7 @@ class ImageMd extends InlineMd { | @@ -682,6 +707,7 @@ class ImageMd extends InlineMd { | ||
| 682 | TextDirection textDirection, | 707 | TextDirection textDirection, |
| 683 | final void Function(String url, String title)? onLinkTab, | 708 | final void Function(String url, String title)? onLinkTab, |
| 684 | final String Function(String tex)? latexWorkaround, | 709 | final String Function(String tex)? latexWorkaround, |
| 710 | + final Widget Function(BuildContext context, String tex)? latexBuilder, | ||
| 685 | ) { | 711 | ) { |
| 686 | var match = exp.firstMatch(text.trim()); | 712 | var match = exp.firstMatch(text.trim()); |
| 687 | double? height; | 713 | double? height; |
| @@ -733,6 +759,7 @@ class TableMd extends BlockMd { | @@ -733,6 +759,7 @@ class TableMd extends BlockMd { | ||
| 733 | TextDirection textDirection, | 759 | TextDirection textDirection, |
| 734 | void Function(String url, String title)? onLinkTab, | 760 | void Function(String url, String title)? onLinkTab, |
| 735 | final String Function(String tex)? latexWorkaround, | 761 | final String Function(String tex)? latexWorkaround, |
| 762 | + final Widget Function(BuildContext context, String tex)? latexBuilder, | ||
| 736 | ) { | 763 | ) { |
| 737 | final List<Map<int, String>> value = text | 764 | final List<Map<int, String>> value = text |
| 738 | .split('\n') | 765 | .split('\n') |
| @@ -13,6 +13,7 @@ class MdWidget extends StatelessWidget { | @@ -13,6 +13,7 @@ class MdWidget extends StatelessWidget { | ||
| 13 | this.textAlign, | 13 | this.textAlign, |
| 14 | this.textScaler, | 14 | this.textScaler, |
| 15 | this.latexWorkaround, | 15 | this.latexWorkaround, |
| 16 | + this.latexBuilder, | ||
| 16 | this.followLinkColor = false}); | 17 | this.followLinkColor = false}); |
| 17 | final String exp; | 18 | final String exp; |
| 18 | final TextDirection textDirection; | 19 | final TextDirection textDirection; |
| @@ -21,6 +22,7 @@ class MdWidget extends StatelessWidget { | @@ -21,6 +22,7 @@ class MdWidget extends StatelessWidget { | ||
| 21 | final TextScaler? textScaler; | 22 | final TextScaler? textScaler; |
| 22 | final void Function(String url, String title)? onLinkTab; | 23 | final void Function(String url, String title)? onLinkTab; |
| 23 | final String Function(String tex)? latexWorkaround; | 24 | final String Function(String tex)? latexWorkaround; |
| 25 | + final Widget Function(BuildContext context, String tex)? latexBuilder; | ||
| 24 | final bool followLinkColor; | 26 | final bool followLinkColor; |
| 25 | 27 | ||
| 26 | @override | 28 | @override |
| @@ -94,6 +96,7 @@ class MdWidget extends StatelessWidget { | @@ -94,6 +96,7 @@ class MdWidget extends StatelessWidget { | ||
| 94 | onLinkTab: onLinkTab, | 96 | onLinkTab: onLinkTab, |
| 95 | style: style, | 97 | style: style, |
| 96 | latexWorkaround: latexWorkaround, | 98 | latexWorkaround: latexWorkaround, |
| 99 | + latexBuilder: latexBuilder, | ||
| 97 | ), | 100 | ), |
| 98 | ); | 101 | ); |
| 99 | }, | 102 | }, |
| @@ -128,6 +131,7 @@ class MdWidget extends StatelessWidget { | @@ -128,6 +131,7 @@ class MdWidget extends StatelessWidget { | ||
| 128 | textDirection, | 131 | textDirection, |
| 129 | onLinkTab, | 132 | onLinkTab, |
| 130 | latexWorkaround, | 133 | latexWorkaround, |
| 134 | + latexBuilder, | ||
| 131 | ), | 135 | ), |
| 132 | ); | 136 | ); |
| 133 | } | 137 | } |
-
Please register or login to post a comment