mirror of
				https://gitlab.com/comunic/comunicmobile
				synced 2025-10-31 10:14:50 +00:00 
			
		
		
		
	Parse URLs
This commit is contained in:
		| @@ -1,6 +1,8 @@ | |||||||
| import 'package:comunic/utils/bbcode_parser.dart'; | import 'package:comunic/utils/bbcode_parser.dart'; | ||||||
|  | import 'package:comunic/utils/input_utils.dart'; | ||||||
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||||
| import 'package:flutter_emoji/flutter_emoji.dart'; | import 'package:flutter_emoji/flutter_emoji.dart'; | ||||||
|  | import 'package:url_launcher/url_launcher.dart'; | ||||||
|  |  | ||||||
| /// Text widget | /// Text widget | ||||||
| /// | /// | ||||||
| @@ -26,12 +28,65 @@ class TextWidget extends StatelessWidget { | |||||||
|   Widget build(BuildContext context) { |   Widget build(BuildContext context) { | ||||||
|     var content = EmojiParser().emojify(this.content); |     var content = EmojiParser().emojify(this.content); | ||||||
|  |  | ||||||
|  |     // Parse BBcode | ||||||
|     if (this.parseBBcode) |     if (this.parseBBcode) | ||||||
|       return BBCodeParsedWidget(text: content); |       return BBCodeParsedWidget( | ||||||
|     else |         text: content, | ||||||
|       return Text( |         parseCallback: (style, text) => _parseLinks(text, style), | ||||||
|         content, |  | ||||||
|         style: style, |  | ||||||
|       ); |       ); | ||||||
|  |  | ||||||
|  |     // Just parse link | ||||||
|  |     return RichText( | ||||||
|  |       text: TextSpan(children: _parseLinks(content, style)), | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /// Sub parse function | ||||||
|  |   List<InlineSpan> _parseLinks(String text, TextStyle style) { | ||||||
|  |     var buff = StringBuffer(); | ||||||
|  |     final list = new List<InlineSpan>(); | ||||||
|  |  | ||||||
|  |     // 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; | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ import 'package:flutter/material.dart'; | |||||||
|  |  | ||||||
| /// This callback return null if the text has to be left as is or a TextSpan | /// This callback return null if the text has to be left as is or a TextSpan | ||||||
| /// if it has been sub parsed... | /// if it has been sub parsed... | ||||||
| typedef ParseCallBack = List<TextSpan> Function(TextStyle, String); | typedef ParseCallBack = List<InlineSpan> Function(TextStyle, String); | ||||||
|  |  | ||||||
| class BBCodeParsedWidget extends StatelessWidget { | class BBCodeParsedWidget extends StatelessWidget { | ||||||
|   final _Element _content; |   final _Element _content; | ||||||
| @@ -241,7 +241,6 @@ class _Element { | |||||||
|  |  | ||||||
|       if (parsed != null && parsed.length > 0) |       if (parsed != null && parsed.length > 0) | ||||||
|         return TextSpan( |         return TextSpan( | ||||||
|           text: text, |  | ||||||
|           style: generatedStyle, |           style: generatedStyle, | ||||||
|           children: parsed, |           children: parsed, | ||||||
|         ); |         ); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user