enum DocumentTextType { normal, linkText } typedef DocumentTextLinkData = ({String text, String? url, DocumentTextType type}); /// Automatically detects and parses strings with hypertext in a markdown format class DocumentText { DocumentText({required this.content}); final String content; static final _markdownLinkRegex = RegExp(r'\[(.*?)\]\((.*?)\)'); bool get hasLinkMarkup => _markdownLinkRegex.hasMatch(content); List toTextLinkList() { final markdownLinkRegex = RegExp(r'\[(.*?)\]\((.*?)\)'); if (markdownLinkRegex.hasMatch(content)) { final matches = markdownLinkRegex.allMatches(content).toList(); final List stringSections = []; int prevStartIndex = 0; while (matches.isNotEmpty) { final match = matches.removeAt(0); stringSections .add((text: content.substring(prevStartIndex, match.start), url: null, type: DocumentTextType.normal)); stringSections.add((text: match.group(1)!, url: match.group(2), type: DocumentTextType.linkText)); prevStartIndex = match.end; } stringSections .add((text: content.substring(prevStartIndex, content.length), url: null, type: DocumentTextType.normal)); return stringSections; } else { return [(text: content, url: null, type: DocumentTextType.normal)]; // return Text("${bulletString != null ? '$bulletString ' : ''}$content", style: style); } } @override int get hashCode { return Object.hashAll([content]); } @override bool operator ==(Object other) { return super.hashCode == other.hashCode; } }