TF-786 Apply linkify html for transform email content

This commit is contained in:
dab246
2022-08-03 16:27:42 +07:00
committed by Dat H. Pham
parent 3cc74fa69f
commit 30cb5033d8
12 changed files with 69 additions and 25 deletions
@@ -7,12 +7,11 @@ abstract class DomTransformer {
const 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. /// All changes will be visible to subsequent transformers.
Future<void> process( Future<void> process(
Document document, Document document,
String message,
{ {
Map<String, String>? mapUrlDownloadCID, Map<String, String>? mapUrlDownloadCID,
DioClient? dioClient, DioClient? dioClient,
@@ -12,7 +12,6 @@ class AddTooltipLinkTransformer extends DomTransformer {
@override @override
Future<void> process( Future<void> process(
Document document, Document document,
String message,
{ {
Map<String, String>? mapUrlDownloadCID, Map<String, String>? mapUrlDownloadCID,
DioClient? dioClient DioClient? dioClient
@@ -10,7 +10,6 @@ class BlockCodeTransformer extends DomTransformer {
@override @override
Future<void> process( Future<void> process(
Document document, Document document,
String message,
{ {
Map<String, String>? mapUrlDownloadCID, Map<String, String>? mapUrlDownloadCID,
DioClient? dioClient DioClient? dioClient
@@ -10,7 +10,6 @@ class BlockQuotedTransformer extends DomTransformer {
@override @override
Future<void> process( Future<void> process(
Document document, Document document,
String message,
{ {
Map<String, String>? mapUrlDownloadCID, Map<String, String>? mapUrlDownloadCID,
DioClient? dioClient DioClient? dioClient
@@ -14,7 +14,6 @@ class ImageTransformer extends DomTransformer {
@override @override
Future<void> process( Future<void> process(
Document document, Document document,
String message,
{ {
Map<String, String>? mapUrlDownloadCID, Map<String, String>? mapUrlDownloadCID,
DioClient? dioClient DioClient? dioClient
@@ -10,7 +10,6 @@ class RemoveScriptTransformer extends DomTransformer {
@override @override
Future<void> process( Future<void> process(
Document document, Document document,
String message,
{ {
Map<String, String>? mapUrlDownloadCID, Map<String, String>? mapUrlDownloadCID,
DioClient? dioClient DioClient? dioClient
@@ -10,7 +10,6 @@ class SignatureTransformer extends DomTransformer {
@override @override
Future<void> process( Future<void> process(
Document document, Document document,
String message,
{ {
Map<String, String>? mapUrlDownloadCID, Map<String, String>? mapUrlDownloadCID,
DioClient? dioClient DioClient? dioClient
@@ -1,6 +1,5 @@
import 'package:core/core.dart'; import 'package:core/core.dart';
import 'package:core/presentation/utils/html_transformer/message_content_transformer.dart'; import 'package:core/presentation/utils/html_transformer/message_content_transformer.dart';
import 'package:html/dom.dart';
class HtmlTransform { class HtmlTransform {
@@ -18,14 +17,20 @@ class HtmlTransform {
/// Transforms this message to HTML code. /// Transforms this message to HTML code.
Future<String> transformToHtml({TransformConfiguration? transformConfiguration}) async { Future<String> 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; return document.outerHtml;
} }
/// Transforms this message to Document. /// Transforms this message to Text Plain.
Future<Document> transformToDocument({TransformConfiguration? transformConfiguration}) async { String transformToTextPlain({TransformConfiguration? transformConfiguration}) {
transformConfiguration ??= TransformConfiguration.create(); transformConfiguration ??= TransformConfiguration.create();
final transformer = MessageContentTransformer(transformConfiguration); final transformer = MessageContentTransformer(transformConfiguration);
return await transformer.toDocument(_contentHtml, mapUrlDownloadCID: mapUrlDownloadCID, dioClient: dioClient); final message = transformer.toMessage(_contentHtml);
return message;
} }
} }
@@ -9,26 +9,48 @@ class MessageContentTransformer {
MessageContentTransformer(this.configuration); MessageContentTransformer(this.configuration);
Future<void> transformDocument( Future<void> _transformDocument(
Document document, Document document,
String message,
{ {
Map<String, String>? mapUrlDownloadCID, Map<String, String>? mapUrlDownloadCID,
DioClient? dioClient DioClient? dioClient
} }
) async { ) async {
await Future.wait([ await Future.wait([
if (configuration.domTransformers.isNotEmpty) ...configuration.domTransformers.map((domTransformer) async => if (configuration.domTransformers.isNotEmpty)
domTransformer.process(document, message, mapUrlDownloadCID: mapUrlDownloadCID, dioClient: dioClient)), ...configuration.domTransformers.map((domTransformer) async =>
if (configuration.textTransformers.isNotEmpty) ...configuration.textTransformers.map((textTransformer) async => domTransformer.process(
textTransformer.process(message)) document,
mapUrlDownloadCID: mapUrlDownloadCID,
dioClient: dioClient))
]); ]);
} }
Future<Document> toDocument(String message, {Map<String, String>? mapUrlDownloadCID, DioClient? dioClient}) async { Future<Document> toDocument(
var html = message; String message,
final document = parse(html); {
await transformDocument(document, message, mapUrlDownloadCID: mapUrlDownloadCID, dioClient: dioClient); Map<String, String>? mapUrlDownloadCID,
DioClient? dioClient
}
) async {
final document = parse(message);
await _transformDocument(
document,
mapUrlDownloadCID: mapUrlDownloadCID,
dioClient: dioClient);
return document; 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);
}
} }
@@ -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;
}
}
@@ -1,5 +1,6 @@
import 'package:core/core.dart'; 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'; import 'package:model/model.dart';
class HtmlAnalyzer { class HtmlAnalyzer {
@@ -17,6 +18,12 @@ class HtmlAnalyzer {
mapUrlDownloadCID: mapUrlDownloadCID); mapUrlDownloadCID: mapUrlDownloadCID);
final htmlContent = await htmlTransform.transformToHtml(); final htmlContent = await htmlTransform.transformToHtml();
return EmailContent(emailContent.type, htmlContent); 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: default:
return emailContent; return emailContent;
} }
@@ -27,7 +34,8 @@ class HtmlAnalyzer {
case EmailContentType.textHtml: case EmailContentType.textHtml:
final htmlTransform = HtmlTransform(emailContent.content); final htmlTransform = HtmlTransform(emailContent.content);
final htmlContent = await htmlTransform.transformToHtml( final htmlContent = await htmlTransform.transformToHtml(
transformConfiguration: TransformConfiguration.create(customDomTransformers: [AddTooltipLinkTransformer()])); transformConfiguration: TransformConfiguration.create(
customDomTransformers: [const AddTooltipLinkTransformer()]));
return EmailContent(emailContent.type, htmlContent); return EmailContent(emailContent.type, htmlContent);
default: default:
return emailContent; return emailContent;
@@ -4,7 +4,6 @@ import 'package:core/core.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';