1
0
mirror of https://gitlab.com/comunic/comunicmobile synced 2024-11-22 12:59:21 +00:00

Parse URLs

This commit is contained in:
Pierre HUBERT 2020-04-16 10:53:09 +02:00
parent 3389ca18f7
commit 7de882338d
2 changed files with 61 additions and 7 deletions

View File

@ -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;
}
} }

View File

@ -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,
); );