import 'package:comunic/utils/bbcode_parser.dart'; import 'package:comunic/utils/input_utils.dart'; import 'package:flutter/material.dart'; import 'package:flutter_emoji/flutter_emoji.dart'; import 'package:url_launcher/url_launcher.dart'; /// Text widget /// /// The content passed to this widget is automatically parsed /// /// @author Pierre Hubert class TextWidget extends StatelessWidget { final String content; final bool parseBBcode; final TextStyle style; const TextWidget({ Key key, @required this.content, this.parseBBcode = false, this.style, }) : assert(content != null), assert(parseBBcode != null), super(key: key); @override Widget build(BuildContext context) { var content = EmojiParser().emojify(this.content); // Parse BBcode if (this.parseBBcode) return BBCodeParsedWidget( text: content, parseCallback: (style, text) => _parseLinks(text, style), ); // Just parse link return RichText( text: TextSpan(children: _parseLinks(content, style)), ); } /// Sub parse function List _parseLinks(String text, TextStyle style) { var buff = StringBuffer(); final list = new List(); // Change word function final changeWordType = () { list.add(TextSpan(style: style, text: buff.toString())); buff.clear(); }; for (final word in text.replaceAll("\n", " \n ").split(" ")) { // Line break if (word == "\n") { buff.write("\n"); continue; } // Check if it is an URL if (validateUrl(word)) { changeWordType(); list.add( WidgetSpan( child: InkWell( child: Text( word, style: style.copyWith(color: Colors.blueAccent), ), onTap: () => launch(word), ), ), ); buff.write(" "); } // Simple word else { buff.write(word); buff.write(" "); } } if (buff.isNotEmpty) changeWordType(); return list; } }