mnemo_cards/lib/widgets/mnemo_text.dart
2024-05-22 23:48:44 +03:00

84 lines
2.1 KiB
Dart

import 'package:auto_size_text/auto_size_text.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:mnemo_cards/utils/string_helper.dart';
class MnemoText extends StatelessWidget {
final String? mnemo;
final TextStyle? textStyle;
final TextAlign? textAlign;
final Color? color;
final AutoSizeGroup? group;
final int? maxLines;
final bool? softWrap;
const MnemoText(
this.mnemo, {
this.textStyle,
this.textAlign,
this.color,
this.group,
this.maxLines,
this.softWrap,
super.key,
});
@override
Widget build(BuildContext context) {
if (mnemo == null) return SizedBox.shrink();
final matches = RegExp(r'\{(.*?)\}').allMatches(mnemo!);
Color? color = this.color;
color ??= Colors.red;
List<TextSpan> spans = [];
RegExpMatch? lastMatch;
for (final match in matches) {
var mnemoText = matches.isEmpty
? ''
: mnemo!
.substring(match.start, match.end)
.replaceAll(RegExp(r'[\}\{]'), '');
if (mnemoText.startsWith('#')) {
// #123456mnemo
color = mnemoText.substring(0, 7).asColor;
mnemoText = mnemoText.substring(7);
}
spans.addAll([
if (lastMatch == null)
TextSpan(text: mnemo!.substring(0, match.start), style: textStyle)
else
TextSpan(
text: mnemo!.substring(lastMatch.end, match.start),
style: textStyle),
TextSpan(
text: mnemoText,
style: textStyle?.copyWith(color: color) ?? TextStyle(color: color),
),
]);
lastMatch = match;
}
if (lastMatch == null) {
spans.add(
TextSpan(text: mnemo, style: textStyle),
);
} else {
spans.add(TextSpan(
text: mnemo!.substring(lastMatch.end),
style: textStyle,
));
}
return AutoSizeText.rich(
maxLines: maxLines,
softWrap: softWrap,
TextSpan(
children: spans,
),
textAlign: textAlign ?? TextAlign.center,
group: group,
);
}
}