From 0ce43c45a75fcac011eede0ab13bd245afc15775 Mon Sep 17 00:00:00 2001 From: dab246 Date: Wed, 3 Aug 2022 16:25:28 +0700 Subject: [PATCH] TF-786 Converting a series of URL strings to HTML links --- core/lib/utils/linkify_html.dart | 79 ++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 core/lib/utils/linkify_html.dart diff --git a/core/lib/utils/linkify_html.dart b/core/lib/utils/linkify_html.dart new file mode 100644 index 000000000..9c5a56988 --- /dev/null +++ b/core/lib/utils/linkify_html.dart @@ -0,0 +1,79 @@ + +import 'package:collection/collection.dart'; +import 'package:core/utils/app_logger.dart'; + +class LinkifyHtml { + + String generateLinkify(String inputText) { + var replacedText = _linkifyUrlAddress(inputText); + replacedText = _linkifyMailToAddress(replacedText); + return replacedText; + } + + RegExp _generateRegExp(String pattern) { + return RegExp(pattern, multiLine: true, caseSensitive: false); + } + + /// URLs starting with http://, https://, ftp://, or "www." without //. + String _linkifyUrlAddress(String inputText) { + var replacedText = inputText; + + // URLs starting with http://, https://, ftp:// + final regexLinkWithHttp = _generateRegExp(r'(\b(https?|ftp):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])'); + + final listUrlMatch = regexLinkWithHttp.allMatches(replacedText) + .map((regexMatch) => regexMatch.group(1)) + .whereNotNull() + .toSet(); + + log('ConvertUrlStringToHtmlLinksTransformers::_linkifyUrlAddress(): listUrlMatch: $listUrlMatch'); + + if (listUrlMatch.isNotEmpty) { + listUrlMatch.forEach((link) { + replacedText = replacedText.replaceAll( + link, + '$link'); + }); + } + + // URLs starting with "www." without // before it or it'd re-link the ones done above. + final regexLinkWithWWW = _generateRegExp(r'(^|[^\/])(www\.[\S]+(\b|\$))'); + + final listLinkMatch = regexLinkWithWWW.allMatches(replacedText) + .map((regexMatch) => regexMatch.group(2)) + .whereNotNull() + .toSet(); + log('ConvertUrlStringToHtmlLinksTransformers::_linkifyUrlAddress(): listLinkMatch: $listLinkMatch'); + + if (listLinkMatch.isNotEmpty) { + listLinkMatch.forEach((link) { + replacedText = replacedText.replaceAll( + link, + '$link'); + }); + } + + return replacedText; + } + + /// Change email addresses to mailto:: links. + String _linkifyMailToAddress(String inputText) { + final regexMailTo = _generateRegExp(r'(([a-zA-Z0-9\-\_\.])+@[a-zA-Z\_]+?(\.[a-zA-Z]{2,6})+)'); + + final listEmailAddressMatch = regexMailTo.allMatches(inputText) + .map((regexMatch) => regexMatch.group(1)) + .whereNotNull() + .toSet(); + + log('ConvertUrlStringToHtmlLinksTransformers::generateLinkifyHtml(): listEmailAddressMatch: $listEmailAddressMatch'); + + if (listEmailAddressMatch.isNotEmpty) { + listEmailAddressMatch.forEach((emailAddress) { + inputText = inputText.replaceAll( + emailAddress, + '$emailAddress'); + }); + } + return inputText; + } +} \ No newline at end of file