From 30cb5033d8dcf3ce079a282add6a75d218197b90 Mon Sep 17 00:00:00 2001 From: dab246 Date: Wed, 3 Aug 2022 16:27:42 +0700 Subject: [PATCH] TF-786 Apply linkify html for transform email content --- .../base/dom_transformer.dart | 3 +- .../dom/add_tooltip_link_transformers.dart | 1 - .../dom/blockcode_transformers.dart | 1 - .../dom/blockquoted_transformers.dart | 1 - .../dom/image_transformers.dart | 1 - .../dom/script_transformers.dart | 1 - .../dom/sigature_transformers.dart | 1 - .../html_transformer/html_transform.dart | 15 ++++--- .../message_content_transformer.dart | 42 ++++++++++++++----- ...url_string_to_html_links_transformers.dart | 17 ++++++++ .../email/data/local/html_analyzer.dart | 10 ++++- .../email/presentation/email_controller.dart | 1 - 12 files changed, 69 insertions(+), 25 deletions(-) create mode 100644 core/lib/presentation/utils/html_transformer/text/convert_url_string_to_html_links_transformers.dart diff --git a/core/lib/presentation/utils/html_transformer/base/dom_transformer.dart b/core/lib/presentation/utils/html_transformer/base/dom_transformer.dart index ff1c2a55b..32d0f332c 100644 --- a/core/lib/presentation/utils/html_transformer/base/dom_transformer.dart +++ b/core/lib/presentation/utils/html_transformer/base/dom_transformer.dart @@ -7,12 +7,11 @@ abstract class DomTransformer { const DomTransformer(); - /// Uses the `DOM` [document] and specified [message] to transform the `document`. + /// Uses the `DOM` [document] to transform the `document`. /// /// All changes will be visible to subsequent transformers. Future process( Document document, - String message, { Map? mapUrlDownloadCID, DioClient? dioClient, diff --git a/core/lib/presentation/utils/html_transformer/dom/add_tooltip_link_transformers.dart b/core/lib/presentation/utils/html_transformer/dom/add_tooltip_link_transformers.dart index 67960f895..a085814ea 100644 --- a/core/lib/presentation/utils/html_transformer/dom/add_tooltip_link_transformers.dart +++ b/core/lib/presentation/utils/html_transformer/dom/add_tooltip_link_transformers.dart @@ -12,7 +12,6 @@ class AddTooltipLinkTransformer extends DomTransformer { @override Future process( Document document, - String message, { Map? mapUrlDownloadCID, DioClient? dioClient diff --git a/core/lib/presentation/utils/html_transformer/dom/blockcode_transformers.dart b/core/lib/presentation/utils/html_transformer/dom/blockcode_transformers.dart index 2173e7028..8f7e71026 100644 --- a/core/lib/presentation/utils/html_transformer/dom/blockcode_transformers.dart +++ b/core/lib/presentation/utils/html_transformer/dom/blockcode_transformers.dart @@ -10,7 +10,6 @@ class BlockCodeTransformer extends DomTransformer { @override Future process( Document document, - String message, { Map? mapUrlDownloadCID, DioClient? dioClient diff --git a/core/lib/presentation/utils/html_transformer/dom/blockquoted_transformers.dart b/core/lib/presentation/utils/html_transformer/dom/blockquoted_transformers.dart index 1fefccf8d..7c8df307c 100644 --- a/core/lib/presentation/utils/html_transformer/dom/blockquoted_transformers.dart +++ b/core/lib/presentation/utils/html_transformer/dom/blockquoted_transformers.dart @@ -10,7 +10,6 @@ class BlockQuotedTransformer extends DomTransformer { @override Future process( Document document, - String message, { Map? mapUrlDownloadCID, DioClient? dioClient diff --git a/core/lib/presentation/utils/html_transformer/dom/image_transformers.dart b/core/lib/presentation/utils/html_transformer/dom/image_transformers.dart index df16fa0e2..22d00f12d 100644 --- a/core/lib/presentation/utils/html_transformer/dom/image_transformers.dart +++ b/core/lib/presentation/utils/html_transformer/dom/image_transformers.dart @@ -14,7 +14,6 @@ class ImageTransformer extends DomTransformer { @override Future process( Document document, - String message, { Map? mapUrlDownloadCID, DioClient? dioClient diff --git a/core/lib/presentation/utils/html_transformer/dom/script_transformers.dart b/core/lib/presentation/utils/html_transformer/dom/script_transformers.dart index 11be37cc3..3176f363e 100644 --- a/core/lib/presentation/utils/html_transformer/dom/script_transformers.dart +++ b/core/lib/presentation/utils/html_transformer/dom/script_transformers.dart @@ -10,7 +10,6 @@ class RemoveScriptTransformer extends DomTransformer { @override Future process( Document document, - String message, { Map? mapUrlDownloadCID, DioClient? dioClient diff --git a/core/lib/presentation/utils/html_transformer/dom/sigature_transformers.dart b/core/lib/presentation/utils/html_transformer/dom/sigature_transformers.dart index 2b8fd1f46..a8466c861 100644 --- a/core/lib/presentation/utils/html_transformer/dom/sigature_transformers.dart +++ b/core/lib/presentation/utils/html_transformer/dom/sigature_transformers.dart @@ -10,7 +10,6 @@ class SignatureTransformer extends DomTransformer { @override Future process( Document document, - String message, { Map? mapUrlDownloadCID, DioClient? dioClient diff --git a/core/lib/presentation/utils/html_transformer/html_transform.dart b/core/lib/presentation/utils/html_transformer/html_transform.dart index c85f308f0..1dd8f021a 100644 --- a/core/lib/presentation/utils/html_transformer/html_transform.dart +++ b/core/lib/presentation/utils/html_transformer/html_transform.dart @@ -1,6 +1,5 @@ import 'package:core/core.dart'; import 'package:core/presentation/utils/html_transformer/message_content_transformer.dart'; -import 'package:html/dom.dart'; class HtmlTransform { @@ -18,14 +17,20 @@ class HtmlTransform { /// Transforms this message to HTML code. Future transformToHtml({TransformConfiguration? transformConfiguration}) async { - final document = await transformToDocument(transformConfiguration: transformConfiguration); + transformConfiguration ??= TransformConfiguration.create(); + final transformer = MessageContentTransformer(transformConfiguration); + final document = await transformer.toDocument( + _contentHtml, + mapUrlDownloadCID: mapUrlDownloadCID, + dioClient: dioClient); return document.outerHtml; } - /// Transforms this message to Document. - Future transformToDocument({TransformConfiguration? transformConfiguration}) async { + /// Transforms this message to Text Plain. + String transformToTextPlain({TransformConfiguration? transformConfiguration}) { transformConfiguration ??= TransformConfiguration.create(); final transformer = MessageContentTransformer(transformConfiguration); - return await transformer.toDocument(_contentHtml, mapUrlDownloadCID: mapUrlDownloadCID, dioClient: dioClient); + final message = transformer.toMessage(_contentHtml); + return message; } } \ No newline at end of file diff --git a/core/lib/presentation/utils/html_transformer/message_content_transformer.dart b/core/lib/presentation/utils/html_transformer/message_content_transformer.dart index 875a9e131..3aaff3a75 100644 --- a/core/lib/presentation/utils/html_transformer/message_content_transformer.dart +++ b/core/lib/presentation/utils/html_transformer/message_content_transformer.dart @@ -9,26 +9,48 @@ class MessageContentTransformer { MessageContentTransformer(this.configuration); - Future transformDocument( + Future _transformDocument( Document document, - String message, { Map? mapUrlDownloadCID, DioClient? dioClient } ) async { await Future.wait([ - if (configuration.domTransformers.isNotEmpty) ...configuration.domTransformers.map((domTransformer) async => - domTransformer.process(document, message, mapUrlDownloadCID: mapUrlDownloadCID, dioClient: dioClient)), - if (configuration.textTransformers.isNotEmpty) ...configuration.textTransformers.map((textTransformer) async => - textTransformer.process(message)) + if (configuration.domTransformers.isNotEmpty) + ...configuration.domTransformers.map((domTransformer) async => + domTransformer.process( + document, + mapUrlDownloadCID: mapUrlDownloadCID, + dioClient: dioClient)) ]); } - Future toDocument(String message, {Map? mapUrlDownloadCID, DioClient? dioClient}) async { - var html = message; - final document = parse(html); - await transformDocument(document, message, mapUrlDownloadCID: mapUrlDownloadCID, dioClient: dioClient); + Future toDocument( + String message, + { + Map? mapUrlDownloadCID, + DioClient? dioClient + } + ) async { + final document = parse(message); + await _transformDocument( + document, + mapUrlDownloadCID: mapUrlDownloadCID, + dioClient: dioClient); return document; } + + String _transformMessage(String message) { + if (configuration.textTransformers.isNotEmpty) { + configuration.textTransformers.forEach((transformer) { + message = transformer.process(message); + }); + } + return message; + } + + String toMessage(String message) { + return _transformMessage(message); + } } \ No newline at end of file diff --git a/core/lib/presentation/utils/html_transformer/text/convert_url_string_to_html_links_transformers.dart b/core/lib/presentation/utils/html_transformer/text/convert_url_string_to_html_links_transformers.dart new file mode 100644 index 000000000..96d7c6bcd --- /dev/null +++ b/core/lib/presentation/utils/html_transformer/text/convert_url_string_to_html_links_transformers.dart @@ -0,0 +1,17 @@ + +import 'package:core/presentation/utils/html_transformer/base/text_transformer.dart'; +import 'package:core/utils/app_logger.dart'; +import 'package:core/utils/linkify_html.dart'; + +class ConvertUrlStringToHtmlLinksTransformers extends TextTransformer { + + const ConvertUrlStringToHtmlLinksTransformers(); + + @override + String process(String text) { + log('ConvertUrlStringToHtmlLinksTransformers::process(): BEFORE: $text'); + final texValid = LinkifyHtml().generateLinkify(text); + log('ConvertUrlStringToHtmlLinksTransformers::process(): AFTER: $texValid'); + return texValid; + } +} \ No newline at end of file diff --git a/lib/features/email/data/local/html_analyzer.dart b/lib/features/email/data/local/html_analyzer.dart index d109e8004..9517a38e3 100644 --- a/lib/features/email/data/local/html_analyzer.dart +++ b/lib/features/email/data/local/html_analyzer.dart @@ -1,5 +1,6 @@ import 'package:core/core.dart'; +import 'package:core/presentation/utils/html_transformer/text/convert_url_string_to_html_links_transformers.dart'; import 'package:model/model.dart'; class HtmlAnalyzer { @@ -17,6 +18,12 @@ class HtmlAnalyzer { mapUrlDownloadCID: mapUrlDownloadCID); final htmlContent = await htmlTransform.transformToHtml(); return EmailContent(emailContent.type, htmlContent); + case EmailContentType.textPlain: + final htmlTransform = HtmlTransform(emailContent.content); + final message = htmlTransform.transformToTextPlain( + transformConfiguration: TransformConfiguration.create( + customTextTransformers: [const ConvertUrlStringToHtmlLinksTransformers()])); + return EmailContent(emailContent.type, message); default: return emailContent; } @@ -27,7 +34,8 @@ class HtmlAnalyzer { case EmailContentType.textHtml: final htmlTransform = HtmlTransform(emailContent.content); final htmlContent = await htmlTransform.transformToHtml( - transformConfiguration: TransformConfiguration.create(customDomTransformers: [AddTooltipLinkTransformer()])); + transformConfiguration: TransformConfiguration.create( + customDomTransformers: [const AddTooltipLinkTransformer()])); return EmailContent(emailContent.type, htmlContent); default: return emailContent; diff --git a/lib/features/email/presentation/email_controller.dart b/lib/features/email/presentation/email_controller.dart index 14756ef82..76705a3c4 100644 --- a/lib/features/email/presentation/email_controller.dart +++ b/lib/features/email/presentation/email_controller.dart @@ -4,7 +4,6 @@ import 'package:core/core.dart'; import 'package:dartz/dartz.dart'; import 'package:dio/dio.dart'; import 'package:flutter/cupertino.dart'; -import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_svg/flutter_svg.dart';