TF-786 Apply linkify html for transform email content
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
+17
@@ -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';
|
||||
|
||||
Reference in New Issue
Block a user