Showing
3 changed files
with
45 additions
and
36 deletions
@@ -106,7 +106,11 @@ $hello$ | @@ -106,7 +106,11 @@ $hello$ | ||
106 | AnimatedBuilder( | 106 | AnimatedBuilder( |
107 | animation: _controller, | 107 | animation: _controller, |
108 | builder: (context, _) { | 108 | builder: (context, _) { |
109 | - return TexMarkdown( | 109 | + return Material( |
110 | + shape: const RoundedRectangleBorder( | ||
111 | + side: BorderSide(width: 1), | ||
112 | + ), | ||
113 | + child: TexMarkdown( | ||
110 | _controller.text, | 114 | _controller.text, |
111 | onLinkTab: (url, title) { | 115 | onLinkTab: (url, title) { |
112 | log(title, name: "title"); | 116 | log(title, name: "title"); |
@@ -115,6 +119,7 @@ $hello$ | @@ -115,6 +119,7 @@ $hello$ | ||
115 | style: const TextStyle( | 119 | style: const TextStyle( |
116 | color: Colors.green, | 120 | color: Colors.green, |
117 | ), | 121 | ), |
122 | + ), | ||
118 | ); | 123 | ); |
119 | }), | 124 | }), |
120 | ], | 125 | ], |
@@ -44,40 +44,28 @@ abstract class MarkdownComponent { | @@ -44,40 +44,28 @@ abstract class MarkdownComponent { | ||
44 | TextStyle? style, | 44 | TextStyle? style, |
45 | final void Function(String url, String title)? onLinkTab, | 45 | final void Function(String url, String title)? onLinkTab, |
46 | ) { | 46 | ) { |
47 | - List<Widget> children = []; | ||
48 | List<InlineSpan> spans = []; | 47 | List<InlineSpan> spans = []; |
49 | text.split(RegExp(r"\n+")).forEach( | 48 | text.split(RegExp(r"\n+")).forEach( |
50 | (element) { | 49 | (element) { |
51 | for (var each in components) { | 50 | for (var each in components) { |
52 | if (each.exp.hasMatch(element.trim())) { | 51 | if (each.exp.hasMatch(element.trim())) { |
53 | if (each is InlineMd) { | 52 | if (each is InlineMd) { |
54 | - if (spans.isNotEmpty) { | ||
55 | - spans.add( | ||
56 | - TextSpan( | ||
57 | - text: " ", | ||
58 | - style: style, | ||
59 | - ), | ||
60 | - ); | ||
61 | - } | ||
62 | - spans.add(each.inlineSpan( | 53 | + spans.add(each.span( |
63 | context, | 54 | context, |
64 | element, | 55 | element, |
65 | style, | 56 | style, |
66 | onLinkTab, | 57 | onLinkTab, |
67 | )); | 58 | )); |
68 | - } else { | ||
69 | - if (spans.isNotEmpty) { | ||
70 | - children.add( | ||
71 | - Text.rich( | ||
72 | - TextSpan(children: List.from(spans)), | ||
73 | - textAlign: TextAlign.left, | 59 | + spans.add( |
60 | + TextSpan( | ||
61 | + text: " ", | ||
62 | + style: style, | ||
74 | ), | 63 | ), |
75 | ); | 64 | ); |
76 | - spans.clear(); | ||
77 | - } | 65 | + } else { |
78 | if (each is BlockMd) { | 66 | if (each is BlockMd) { |
79 | - children.add( | ||
80 | - each.build(context, element, style, onLinkTab), | 67 | + spans.add( |
68 | + each.span(context, element, style, onLinkTab), | ||
81 | ); | 69 | ); |
82 | } | 70 | } |
83 | } | 71 | } |
@@ -86,21 +74,20 @@ abstract class MarkdownComponent { | @@ -86,21 +74,20 @@ abstract class MarkdownComponent { | ||
86 | } | 74 | } |
87 | }, | 75 | }, |
88 | ); | 76 | ); |
89 | - if (spans.isNotEmpty) { | ||
90 | - children.add( | ||
91 | - Text.rich( | 77 | + return Text.rich( |
92 | TextSpan( | 78 | TextSpan( |
93 | children: List.from(spans), | 79 | children: List.from(spans), |
94 | ), | 80 | ), |
95 | textAlign: TextAlign.left, | 81 | textAlign: TextAlign.left, |
96 | - ), | ||
97 | ); | 82 | ); |
98 | } | 83 | } |
99 | - return Column( | ||
100 | - crossAxisAlignment: CrossAxisAlignment.start, | ||
101 | - children: children, | 84 | + |
85 | + InlineSpan span( | ||
86 | + BuildContext context, | ||
87 | + String text, | ||
88 | + TextStyle? style, | ||
89 | + final void Function(String url, String title)? onLinkTab, | ||
102 | ); | 90 | ); |
103 | - } | ||
104 | 91 | ||
105 | RegExp get exp; | 92 | RegExp get exp; |
106 | bool get inline; | 93 | bool get inline; |
@@ -110,7 +97,9 @@ abstract class MarkdownComponent { | @@ -110,7 +97,9 @@ abstract class MarkdownComponent { | ||
110 | abstract class InlineMd extends MarkdownComponent { | 97 | abstract class InlineMd extends MarkdownComponent { |
111 | @override | 98 | @override |
112 | bool get inline => true; | 99 | bool get inline => true; |
113 | - InlineSpan inlineSpan( | 100 | + |
101 | + @override | ||
102 | + InlineSpan span( | ||
114 | BuildContext context, | 103 | BuildContext context, |
115 | String text, | 104 | String text, |
116 | TextStyle? style, | 105 | TextStyle? style, |
@@ -123,6 +112,21 @@ abstract class InlineMd extends MarkdownComponent { | @@ -123,6 +112,21 @@ abstract class InlineMd extends MarkdownComponent { | ||
123 | abstract class BlockMd extends MarkdownComponent { | 112 | abstract class BlockMd extends MarkdownComponent { |
124 | @override | 113 | @override |
125 | bool get inline => false; | 114 | bool get inline => false; |
115 | + @override | ||
116 | + InlineSpan span( | ||
117 | + BuildContext context, | ||
118 | + String text, | ||
119 | + TextStyle? style, | ||
120 | + final void Function(String url, String title)? onLinkTab, | ||
121 | + ) { | ||
122 | + return WidgetSpan( | ||
123 | + child: Align( | ||
124 | + alignment: Alignment.centerLeft, | ||
125 | + child: build(context, text, style, onLinkTab), | ||
126 | + ), | ||
127 | + ); | ||
128 | + } | ||
129 | + | ||
126 | Widget build( | 130 | Widget build( |
127 | BuildContext context, | 131 | BuildContext context, |
128 | String text, | 132 | String text, |
@@ -409,7 +413,7 @@ class BoldMd extends InlineMd { | @@ -409,7 +413,7 @@ class BoldMd extends InlineMd { | ||
409 | final RegExp exp = RegExp(r"^\*{2}(([\S^\*].*)?[\S^\*])\*{2}$"); | 413 | final RegExp exp = RegExp(r"^\*{2}(([\S^\*].*)?[\S^\*])\*{2}$"); |
410 | 414 | ||
411 | @override | 415 | @override |
412 | - InlineSpan inlineSpan( | 416 | + InlineSpan span( |
413 | BuildContext context, | 417 | BuildContext context, |
414 | String text, | 418 | String text, |
415 | TextStyle? style, | 419 | TextStyle? style, |
@@ -443,7 +447,7 @@ class ItalicMd extends InlineMd { | @@ -443,7 +447,7 @@ class ItalicMd extends InlineMd { | ||
443 | final RegExp exp = RegExp(r"^\*{1}(([\S^\*].*)?[\S^\*])\*{1}$"); | 447 | final RegExp exp = RegExp(r"^\*{1}(([\S^\*].*)?[\S^\*])\*{1}$"); |
444 | 448 | ||
445 | @override | 449 | @override |
446 | - InlineSpan inlineSpan( | 450 | + InlineSpan span( |
447 | BuildContext context, | 451 | BuildContext context, |
448 | String text, | 452 | String text, |
449 | TextStyle? style, | 453 | TextStyle? style, |
@@ -475,7 +479,7 @@ class ATagMd extends InlineMd { | @@ -475,7 +479,7 @@ class ATagMd extends InlineMd { | ||
475 | final RegExp exp = RegExp(r"^\[([^\s\*].*[^\s]?)?\]\(([^\s\*]+)?\)$"); | 479 | final RegExp exp = RegExp(r"^\[([^\s\*].*[^\s]?)?\]\(([^\s\*]+)?\)$"); |
476 | 480 | ||
477 | @override | 481 | @override |
478 | - InlineSpan inlineSpan( | 482 | + InlineSpan span( |
479 | BuildContext context, | 483 | BuildContext context, |
480 | String text, | 484 | String text, |
481 | TextStyle? style, | 485 | TextStyle? style, |
@@ -520,7 +524,7 @@ class ImageMd extends InlineMd { | @@ -520,7 +524,7 @@ class ImageMd extends InlineMd { | ||
520 | final RegExp exp = RegExp(r"^\!\[([^\s].*[^\s]?)?\]\(([^\s]+)\)$"); | 524 | final RegExp exp = RegExp(r"^\!\[([^\s].*[^\s]?)?\]\(([^\s]+)\)$"); |
521 | 525 | ||
522 | @override | 526 | @override |
523 | - InlineSpan inlineSpan( | 527 | + InlineSpan span( |
524 | BuildContext context, | 528 | BuildContext context, |
525 | String text, | 529 | String text, |
526 | TextStyle? style, | 530 | TextStyle? style, |
@@ -578,7 +582,7 @@ class TextMd extends InlineMd { | @@ -578,7 +582,7 @@ class TextMd extends InlineMd { | ||
578 | final RegExp exp = RegExp(".*"); | 582 | final RegExp exp = RegExp(".*"); |
579 | 583 | ||
580 | @override | 584 | @override |
581 | - InlineSpan inlineSpan(BuildContext context, String text, TextStyle? style, | 585 | + InlineSpan span(BuildContext context, String text, TextStyle? style, |
582 | void Function(String url, String title)? onLinkTab) { | 586 | void Function(String url, String title)? onLinkTab) { |
583 | return WidgetSpan( | 587 | return WidgetSpan( |
584 | alignment: PlaceholderAlignment.baseline, | 588 | alignment: PlaceholderAlignment.baseline, |
@@ -36,7 +36,7 @@ class TexMarkdown extends StatelessWidget { | @@ -36,7 +36,7 @@ class TexMarkdown extends StatelessWidget { | ||
36 | ) | 36 | ) |
37 | .map<Widget>( | 37 | .map<Widget>( |
38 | (e) => Padding( | 38 | (e) => Padding( |
39 | - padding: const EdgeInsets.all(4), | 39 | + padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 4), |
40 | child: MdWidget( | 40 | child: MdWidget( |
41 | e, | 41 | e, |
42 | style: style, | 42 | style: style, |
-
Please register or login to post a comment