Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TF-2047 [Link] Can not see the link when type is text/plain in email view #2060

Merged
merged 9 commits into from
Aug 3, 2023
8 changes: 8 additions & 0 deletions contact/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -520,6 +520,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "6.6.1"
linkify:
dependency: transitive
description:
name: linkify
sha256: "4139ea77f4651ab9c315b577da2dd108d9aa0bd84b5d03d33323f1970c645832"
url: "https://pub.dev"
source: hosted
version: "5.0.0"
lints:
dependency: transitive
description:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ class AddTargetBlankInTagATransformer extends DomTransformer {
final elements = document.querySelectorAll('a');
await Future.wait(elements.map((element) async {
element.attributes['target'] = '_blank';
final rel = element.attributes['rel'];
if (rel == null || (!rel.contains('noopener') && !rel.contains('noreferrer'))) {
element.attributes['rel'] = 'noreferrer';
}
}));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@

import 'dart:convert';

import 'package:core/utils/app_logger.dart';
import 'package:linkify/linkify.dart';

class SanitizeAutolinkFilter {

final HtmlEscape htmlEscape;
final _linkifyOption = const LinkifyOptions(
humanize: true,
looseUrl: true,
defaultToHttps: true,
removeWww: true
);
final _linkifier = <Linkifier>[
const EmailLinkifier(),
const UrlLinkifier()
];

SanitizeAutolinkFilter(this.htmlEscape);

String process(String inputText) {
if (inputText.isEmpty) {
return '';
}

final elements = linkify(
inputText,
options: _linkifyOption,
linkifiers: _linkifier
);
log('AutolinkFilter::process:elements: $elements');
final htmlTextBuffer = StringBuffer();

for (var element in elements) {
if (element is TextElement) {
final escapedHtml = htmlEscape.convert(element.text);
htmlTextBuffer.write(escapedHtml);
} else if (element is EmailElement) {
final emailLinkTag = _buildEmailLinkTag(
mailToLink: element.url,
value: element.text
);
htmlTextBuffer.write(emailLinkTag);
} else if (element is UrlElement) {
final urlLinkTag = _buildUrlLinkTag(
urlLink: element.url,
value: element.text
);
htmlTextBuffer.write(urlLinkTag);
}
}

return htmlTextBuffer.toString();
}

String _buildUrlLinkTag({required String urlLink, required String value}) {
return '<a href="$urlLink" target="_blank" rel="noreferrer">$value</a>';
}

String _buildEmailLinkTag({required String mailToLink, required String value}) {
return '<a href="$mailToLink">$value</a>';
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@

import 'dart:convert';

import 'package:core/presentation/utils/html_transformer/sanitize_autolink_filter.dart';
import 'package:core/presentation/utils/html_transformer/base/text_transformer.dart';

class SanitizeAutolinkHtmlTransformers extends TextTransformer {

final HtmlEscape htmlEscape;

SanitizeAutolinkHtmlTransformers(this.htmlEscape);

@override
String process(String text) => SanitizeAutolinkFilter(htmlEscape).process(text);
}

This file was deleted.

78 changes: 0 additions & 78 deletions core/lib/utils/linkify_html.dart

This file was deleted.

8 changes: 8 additions & 0 deletions core/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.6.7"
linkify:
dependency: "direct main"
description:
name: linkify
sha256: "4139ea77f4651ab9c315b577da2dd108d9aa0bd84b5d03d33323f1970c645832"
url: "https://pub.dev"
source: hosted
version: "5.0.0"
lints:
dependency: transitive
description:
Expand Down
2 changes: 2 additions & 0 deletions core/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,8 @@ dependencies:

flutter_typeahead: 4.6.0

linkify: 5.0.0

dev_dependencies:
flutter_test:
sdk: flutter
Expand Down
59 changes: 0 additions & 59 deletions core/test/linkify_html_test.dart

This file was deleted.

55 changes: 55 additions & 0 deletions core/test/sanitize_autolink_filter_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import 'dart:convert';

import 'package:core/presentation/utils/html_transformer/sanitize_autolink_filter.dart';
import 'package:flutter_test/flutter_test.dart';

void main() {
group('SanitizeAutolinkFilter test', () {

final sanitizeAutolinkFilter = SanitizeAutolinkFilter(const HtmlEscape());

test(
'SanitizeAutolinkFilter should return html a tag with href="urlLink" when input text contain https',
() {
final htmlValidate = sanitizeAutolinkFilter.process('See https://linagora.com at Hanoi');
expect(
htmlValidate,
equals('See <a href="https://linagora.com" target="_blank" rel="noreferrer">linagora.com</a> at Hanoi')
);
}
);

test(
'SanitizeAutolinkFilter should return html a tag with href="urlLink" when input text contain http',
() {
final htmlValidate = sanitizeAutolinkFilter.process('See http://linagora.com at Hanoi');
expect(
htmlValidate,
equals('See <a href="http://linagora.com" target="_blank" rel="noreferrer">linagora.com</a> at Hanoi')
);
}
);

test(
'SanitizeAutolinkFilter should return html a tag with href="urlLink" when input text contain www',
() {
final htmlValidate = sanitizeAutolinkFilter.process('See www.linagora.com at Hanoi');
expect(
htmlValidate,
equals('See <a href="https://www.linagora.com" target="_blank" rel="noreferrer">linagora.com</a> at Hanoi')
);
}
);

test(
'SanitizeAutolinkFilter should return html a tag with href="mailToLink" when input text contain email address',
() {
final htmlValidate = sanitizeAutolinkFilter.process('See tdvu@linagora.com at Hanoi');
expect(
htmlValidate,
equals('See <a href="mailto:tdvu@linagora.com">tdvu@linagora.com</a> at Hanoi')
);
}
);
});
}
Loading
Loading