Skip to content

Commit 9ec289e

Browse files
committed
Support add InlineSpan to end widget
1 parent 81d8988 commit 9ec289e

File tree

2 files changed

+89
-2
lines changed

2 files changed

+89
-2
lines changed

lib/flutter_html.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ class Html extends StatelessWidget {
3131
this.emoteSize,
3232
this.getCodeLanguage,
3333
this.setCodeLanguage,
34+
this.inlineSpanEnd,
3435
}) : super(key: key);
3536

3637
final String data;
@@ -57,6 +58,8 @@ class Html extends StatelessWidget {
5758
final SetCodeLanguage? setCodeLanguage;
5859
final GetCodeLanguage? getCodeLanguage;
5960

61+
final InlineSpan? inlineSpanEnd;
62+
6063
@override
6164
Widget build(BuildContext context) {
6265
final width = shrinkToFit ? null : MediaQuery.of(context).size.width;
@@ -85,6 +88,7 @@ class Html extends StatelessWidget {
8588
defaultTextStyle: defaultTextStyle,
8689
setCodeLanguage: setCodeLanguage,
8790
getCodeLanguage: getCodeLanguage,
91+
inlineSpanEnd: inlineSpanEnd,
8892
),
8993
),
9094
);

lib/text_parser.dart

Lines changed: 85 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ class TextParser extends StatelessWidget {
104104
this.emoteSize,
105105
this.setCodeLanguage,
106106
this.getCodeLanguage,
107+
this.inlineSpanEnd,
107108
});
108109

109110
final double indentSize = 10.0;
@@ -125,6 +126,7 @@ class TextParser extends StatelessWidget {
125126
final double? emoteSize;
126127
final SetCodeLanguage? setCodeLanguage;
127128
final GetCodeLanguage? getCodeLanguage;
129+
final InlineSpan? inlineSpanEnd;
128130

129131
TextSpan _parseTextNode(
130132
BuildContext context, ParseContext parseContext, dom.Text node) {
@@ -948,8 +950,11 @@ class TextParser extends StatelessWidget {
948950
textStyle: defaultTextStyle,
949951
linkStyle: linkStyle,
950952
);
951-
final widget =
952-
_parseNode(context, parseContext, parser.parseFragment(data));
953+
final nodeParsed = _parseNode(context, parseContext, parser.parseFragment(data));
954+
final widget = inlineSpanEnd != null
955+
? _addInlineSpanToNode(inlineSpan: _optimizeTextspan(inlineSpanEnd!), nodeParsed: nodeParsed)
956+
: nodeParsed;
957+
953958
if (shrinkToFit) {
954959
return widget;
955960
}
@@ -958,6 +963,84 @@ class TextParser extends StatelessWidget {
958963
child: widget,
959964
);
960965
}
966+
967+
Widget _addInlineSpanToNode({required InlineSpan inlineSpan, required Widget nodeParsed}) {
968+
if (nodeParsed is CleanRichText) {
969+
return _addInlineSpanToCleanRichText(inlineSpan: inlineSpan, richText: nodeParsed);
970+
} else if (nodeParsed is Column && nodeParsed.children.isNotEmpty) {
971+
return _addInlineSpanToColumn(inlineSpan: inlineSpan, column: nodeParsed);
972+
} else {
973+
return CleanRichText(
974+
TextSpan(
975+
children: [
976+
WidgetSpan(child: nodeParsed),
977+
inlineSpan
978+
]
979+
),
980+
maxLines: maxLines
981+
);
982+
}
983+
}
984+
985+
Widget _addInlineSpanToCleanRichText({required InlineSpan inlineSpan, required CleanRichText richText}) {
986+
final childRichText = richText.child;
987+
if (childRichText is TextSpan) {
988+
return CleanRichText(
989+
TextSpan(
990+
text: childRichText.text,
991+
children: [
992+
if (childRichText.children != null)
993+
...childRichText.children!,
994+
inlineSpan
995+
]
996+
),
997+
maxLines: richText.maxLines,
998+
textAlign: richText.textAlign,
999+
);
1000+
} else {
1001+
return CleanRichText(
1002+
TextSpan(
1003+
children: [
1004+
childRichText,
1005+
inlineSpan
1006+
]
1007+
),
1008+
maxLines: richText.maxLines,
1009+
textAlign: richText.textAlign,
1010+
);
1011+
}
1012+
}
1013+
1014+
Widget _addInlineSpanToColumn({required InlineSpan inlineSpan, required Column column}) {
1015+
final columnChildren = column.children;
1016+
final lastChild = columnChildren.removeLast();
1017+
Widget newLastChild;
1018+
if (lastChild is CleanRichText) {
1019+
newLastChild = _addInlineSpanToCleanRichText(inlineSpan: inlineSpan, richText: lastChild);
1020+
} else {
1021+
newLastChild = CleanRichText(
1022+
TextSpan(
1023+
children: [
1024+
WidgetSpan(child: lastChild),
1025+
inlineSpan
1026+
]
1027+
),
1028+
maxLines: maxLines
1029+
);
1030+
}
1031+
return Column(
1032+
crossAxisAlignment: column.crossAxisAlignment,
1033+
mainAxisAlignment: column.mainAxisAlignment,
1034+
mainAxisSize: column.mainAxisSize,
1035+
textDirection: column.textDirection,
1036+
textBaseline: column.textBaseline,
1037+
verticalDirection: column.verticalDirection,
1038+
children: [
1039+
...columnChildren,
1040+
newLastChild
1041+
]
1042+
);
1043+
}
9611044
}
9621045

9631046
class ParseContext {

0 commit comments

Comments
 (0)