Skip to content
This repository was archived by the owner on Jul 19, 2025. It is now read-only.

Commit 4d97b3d

Browse files
committed
fix url regex and add previewBuilder
1 parent 9d1bec5 commit 4d97b3d

File tree

2 files changed

+24
-16
lines changed

2 files changed

+24
-16
lines changed

lib/src/utils.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -262,11 +262,11 @@ Future<PreviewData> getPreviewData(
262262
}
263263

264264
/// Regex to check if text is email.
265-
const regexEmail = r'([a-zA-Z0-9+._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+)';
265+
const regexEmail = r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}';
266266

267267
/// Regex to check if content type is an image.
268268
const regexImageContentType = r'image\/*';
269269

270270
/// Regex to find all links in the text.
271271
const regexLink =
272-
r'((http|ftp|https):\/\/)?([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?';
272+
r'((http|ftp|https):\/\/)?([\w_-]+(?:(?:\.[\w_-]*[a-zA-Z_][\w_-]*)+))([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?[^\.\s]';

lib/src/widgets/link_preview.dart

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class LinkPreview extends StatefulWidget {
2929
this.openOnPreviewImageTap = false,
3030
this.openOnPreviewTitleTap = false,
3131
this.padding,
32+
this.previewBuilder,
3233
required this.previewData,
3334
this.requestTimeout,
3435
required this.text,
@@ -86,6 +87,9 @@ class LinkPreview extends StatefulWidget {
8687
/// Padding around initial text widget.
8788
final EdgeInsets? padding;
8889

90+
/// Function that allows you to build a custom link preview.
91+
final Widget Function(BuildContext, PreviewData)? previewBuilder;
92+
8993
/// Pass saved [PreviewData] here so [LinkPreview] would not fetch preview
9094
/// data again.
9195
final PreviewData? previewData;
@@ -422,20 +426,24 @@ class _LinkPreviewState extends State<LinkPreview>
422426
final previewData = widget.previewData;
423427

424428
if (previewData != null && _hasData(previewData)) {
425-
final aspectRatio = widget.previewData!.image == null
426-
? null
427-
: widget.previewData!.image!.width /
428-
widget.previewData!.image!.height;
429-
430-
final width = aspectRatio == 1 ? widget.width : widget.width - 32;
431-
432-
return _containerWidget(
433-
animate: shouldAnimate,
434-
child: aspectRatio == 1
435-
? _minimizedBodyWidget(previewData)
436-
: _bodyWidget(previewData, width),
437-
withPadding: aspectRatio == 1,
438-
);
429+
if (widget.previewBuilder != null) {
430+
return widget.previewBuilder!(context, previewData);
431+
} else {
432+
final aspectRatio = widget.previewData!.image == null
433+
? null
434+
: widget.previewData!.image!.width /
435+
widget.previewData!.image!.height;
436+
437+
final width = aspectRatio == 1 ? widget.width : widget.width - 32;
438+
439+
return _containerWidget(
440+
animate: shouldAnimate,
441+
child: aspectRatio == 1
442+
? _minimizedBodyWidget(previewData)
443+
: _bodyWidget(previewData, width),
444+
withPadding: aspectRatio == 1,
445+
);
446+
}
439447
} else {
440448
return _containerWidget(animate: false);
441449
}

0 commit comments

Comments
 (0)