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