73 lines
2.3 KiB
Dart
73 lines
2.3 KiB
Dart
import 'package:linkfy_text/src/enum.dart';
|
|
|
|
// String urlRegExp =
|
|
|
|
// url regex that accept https, http, www
|
|
String urlRegExp =
|
|
r'[(http(s)?):\/\/(www\.)?a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)';
|
|
|
|
String hashtagRegExp = r'#[a-zA-Z\u00C0-\u01B4\w_\u1EA0-\u1EF9!$%^&]{1,}(?=\s|$)';
|
|
|
|
String userTagRegExp = r'@[a-zA-Z\u00C0-\u01B4\w_\u1EA0-\u1EF9!$%^&]{1,}(?=\s|$)';
|
|
String phoneRegExp =
|
|
r'\s*(?:\+?(\d{1,3}))?[-. (]*(\d{3})[-. )]*(\d{3})[-. ]*(\d{4})(?: *x(\d+))?\s*';
|
|
String emailRegExp =
|
|
r"([a-zA-Z0-9.a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~]+@[a-zA-Z0-9]+\.[a-zA-Z]+)";
|
|
|
|
/// construct regexp. pattern from provided link types
|
|
RegExp constructRegExpFromLinkType(List<LinkType> types) {
|
|
// default case where we always want to match url strings
|
|
final len = types.length;
|
|
if (len == 1 && types.first == LinkType.url) {
|
|
return RegExp(urlRegExp);
|
|
}
|
|
final buffer = StringBuffer();
|
|
for (var i = 0; i < len; i++) {
|
|
final type = types[i];
|
|
final isLast = i == len - 1;
|
|
switch (type) {
|
|
case LinkType.url:
|
|
isLast ? buffer.write("($urlRegExp)") : buffer.write("($urlRegExp)|");
|
|
break;
|
|
case LinkType.hashTag:
|
|
isLast
|
|
? buffer.write("($hashtagRegExp)")
|
|
: buffer.write("($hashtagRegExp)|");
|
|
break;
|
|
case LinkType.userTag:
|
|
isLast
|
|
? buffer.write("($userTagRegExp)")
|
|
: buffer.write("($userTagRegExp)|");
|
|
break;
|
|
case LinkType.email:
|
|
isLast
|
|
? buffer.write("($emailRegExp)")
|
|
: buffer.write("($emailRegExp)|");
|
|
break;
|
|
case LinkType.phone:
|
|
isLast
|
|
? buffer.write("($phoneRegExp)")
|
|
: buffer.write("($phoneRegExp)|");
|
|
break;
|
|
default:
|
|
}
|
|
}
|
|
return RegExp(buffer.toString());
|
|
}
|
|
|
|
LinkType getMatchedType(String match) {
|
|
late LinkType type;
|
|
if (RegExp(emailRegExp).hasMatch(match)) {
|
|
type = LinkType.email;
|
|
} else if (RegExp(urlRegExp).hasMatch(match)) {
|
|
type = LinkType.url;
|
|
}else if (RegExp(phoneRegExp).hasMatch(match)) {
|
|
type = LinkType.phone;
|
|
} else if (RegExp(userTagRegExp).hasMatch(match)) {
|
|
type = LinkType.userTag;
|
|
} else if (RegExp(hashtagRegExp).hasMatch(match)) {
|
|
type = LinkType.hashTag;
|
|
}
|
|
return type;
|
|
}
|