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();
/// 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<void> process(
Document document,
String message,
{
Map<String, String>? mapUrlDownloadCID,
DioClient? dioClient,
@@ -12,7 +12,6 @@ class AddTooltipLinkTransformer extends DomTransformer {
@override
Future<void> process(
Document document,
String message,
{
Map<String, String>? mapUrlDownloadCID,
DioClient? dioClient
@@ -10,7 +10,6 @@ class BlockCodeTransformer extends DomTransformer {
@override
Future<void> process(
Document document,
String message,
{
Map<String, String>? mapUrlDownloadCID,
DioClient? dioClient
@@ -10,7 +10,6 @@ class BlockQuotedTransformer extends DomTransformer {
@override
Future<void> process(
Document document,
String message,
{
Map<String, String>? mapUrlDownloadCID,
DioClient? dioClient
@@ -14,7 +14,6 @@ class ImageTransformer extends DomTransformer {
@override
Future<void> process(
Document document,
String message,
{
Map<String, String>? mapUrlDownloadCID,
DioClient? dioClient
@@ -10,7 +10,6 @@ class RemoveScriptTransformer extends DomTransformer {
@override
Future<void> process(
Document document,
String message,
{
Map<String, String>? mapUrlDownloadCID,
DioClient? dioClient
@@ -10,7 +10,6 @@ class SignatureTransformer extends DomTransformer {
@override
Future<void> process(
Document document,
String message,
{
Map<String, String>? mapUrlDownloadCID,
DioClient? dioClient
@@ -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<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;
}
/// Transforms this message to Document.
Future<Document> 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;
}
}
@@ -9,26 +9,48 @@ class MessageContentTransformer {
MessageContentTransformer(this.configuration);
Future<void> transformDocument(
Future<void> _transformDocument(
Document document,
String message,
{
Map<String, String>? 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<Document> toDocument(String message, {Map<String, String>? mapUrlDownloadCID, DioClient? dioClient}) async {
var html = message;
final document = parse(html);
await transformDocument(document, message, mapUrlDownloadCID: mapUrlDownloadCID, dioClient: dioClient);
Future<Document> toDocument(
String message,
{
Map<String, String>? 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);
}
}
@@ -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/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;
@@ -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';