Skip to content

Commit d3dae72

Browse files
committed
Merge branch 'improve/support-no-container' of github.com:dab246/flutter_matrix_html
2 parents 97ab298 + 50e4caf commit d3dae72

File tree

2 files changed

+97
-2
lines changed

2 files changed

+97
-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: 93 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) {
@@ -960,8 +962,11 @@ class TextParser extends StatelessWidget {
960962
textStyle: defaultTextStyle,
961963
linkStyle: linkStyle,
962964
);
963-
final widget =
964-
_parseNode(context, parseContext, parser.parseFragment(data));
965+
final nodeParsed = _parseNode(context, parseContext, parser.parseFragment(data));
966+
final widget = inlineSpanEnd != null
967+
? _addInlineSpanToNode(inlineSpan: _optimizeTextspan(inlineSpanEnd!), nodeParsed: nodeParsed)
968+
: nodeParsed;
969+
965970
if (shrinkToFit) {
966971
return widget;
967972
}
@@ -970,6 +975,92 @@ class TextParser extends StatelessWidget {
970975
child: widget,
971976
);
972977
}
978+
979+
Widget _addInlineSpanToNode({required InlineSpan inlineSpan, required Widget nodeParsed}) {
980+
if (nodeParsed is CleanRichText) {
981+
return _addInlineSpanToCleanRichText(inlineSpan: inlineSpan, richText: nodeParsed);
982+
} else if (nodeParsed is Column && nodeParsed.children.isNotEmpty) {
983+
return _addInlineSpanToColumn(inlineSpan: inlineSpan, column: nodeParsed);
984+
} else {
985+
return CleanRichText(
986+
TextSpan(
987+
children: [
988+
WidgetSpan(child: nodeParsed),
989+
inlineSpan
990+
]
991+
),
992+
maxLines: maxLines
993+
);
994+
}
995+
}
996+
997+
Widget _addInlineSpanToCleanRichText({required InlineSpan inlineSpan, required CleanRichText richText}) {
998+
final childRichText = richText.child;
999+
if (childRichText is TextSpan) {
1000+
return CleanRichText(
1001+
TextSpan(
1002+
text: childRichText.text,
1003+
style: childRichText.style,
1004+
recognizer: childRichText.recognizer,
1005+
mouseCursor: childRichText.mouseCursor,
1006+
onEnter: childRichText.onEnter,
1007+
onExit: childRichText.onExit,
1008+
semanticsLabel: childRichText.semanticsLabel,
1009+
locale: childRichText.locale,
1010+
spellOut: childRichText.spellOut,
1011+
children: [
1012+
if (childRichText.children != null)
1013+
...childRichText.children!,
1014+
inlineSpan
1015+
]
1016+
),
1017+
maxLines: richText.maxLines,
1018+
textAlign: richText.textAlign,
1019+
);
1020+
} else {
1021+
return CleanRichText(
1022+
TextSpan(
1023+
children: [
1024+
childRichText,
1025+
inlineSpan
1026+
]
1027+
),
1028+
maxLines: richText.maxLines,
1029+
textAlign: richText.textAlign,
1030+
);
1031+
}
1032+
}
1033+
1034+
Widget _addInlineSpanToColumn({required InlineSpan inlineSpan, required Column column}) {
1035+
final columnChildren = column.children;
1036+
final lastChild = columnChildren.removeLast();
1037+
Widget newLastChild;
1038+
if (lastChild is CleanRichText) {
1039+
newLastChild = _addInlineSpanToCleanRichText(inlineSpan: inlineSpan, richText: lastChild);
1040+
} else {
1041+
newLastChild = CleanRichText(
1042+
TextSpan(
1043+
children: [
1044+
WidgetSpan(child: lastChild),
1045+
inlineSpan
1046+
]
1047+
),
1048+
maxLines: maxLines
1049+
);
1050+
}
1051+
return Column(
1052+
crossAxisAlignment: column.crossAxisAlignment,
1053+
mainAxisAlignment: column.mainAxisAlignment,
1054+
mainAxisSize: column.mainAxisSize,
1055+
textDirection: column.textDirection,
1056+
textBaseline: column.textBaseline,
1057+
verticalDirection: column.verticalDirection,
1058+
children: [
1059+
...columnChildren,
1060+
newLastChild
1061+
]
1062+
);
1063+
}
9731064
}
9741065

9751066
class ParseContext {

0 commit comments

Comments
 (0)