2023-04-27 19:19:51 +00:00
|
|
|
import 'dart:async';
|
|
|
|
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
import 'package:flutter_widget_from_html_core/flutter_widget_from_html_core.dart';
|
|
|
|
import 'package:html/dom.dart' as dom;
|
|
|
|
|
2024-09-02 16:44:23 +00:00
|
|
|
import 'image_control.dart';
|
2024-08-31 20:17:46 +00:00
|
|
|
|
2023-04-27 19:19:51 +00:00
|
|
|
const _emojiSize = {'width': '20px', 'height': '20px', 'margin-left': '-3px'};
|
|
|
|
|
|
|
|
class HtmlTextViewerControl extends StatelessWidget {
|
|
|
|
final String content;
|
|
|
|
final FutureOr<bool> Function(String)? onTapUrl;
|
|
|
|
|
|
|
|
const HtmlTextViewerControl(
|
|
|
|
{super.key, required this.content, this.onTapUrl});
|
|
|
|
|
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
return HtmlWidget(
|
|
|
|
content,
|
2024-08-31 20:17:46 +00:00
|
|
|
factoryBuilder: () => MyWidgetFactory(),
|
2023-04-27 19:19:51 +00:00
|
|
|
customStylesBuilder: _defaultStylesBuilder,
|
|
|
|
onTapUrl: onTapUrl,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
Map<String, String>? _defaultStylesBuilder(dom.Element element) {
|
|
|
|
if (element.classes.contains('emoji')) {
|
|
|
|
return _emojiSize;
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
2024-08-31 20:17:46 +00:00
|
|
|
|
|
|
|
class MyWidgetFactory extends WidgetFactory {
|
|
|
|
@override
|
|
|
|
Widget? buildImageWidget(BuildMetadata meta, ImageSource src) {
|
|
|
|
final url = src.url;
|
|
|
|
if (!url.startsWith(RegExp('https?://'))) {
|
|
|
|
return super.buildImageWidget(meta, src);
|
|
|
|
}
|
|
|
|
|
2024-09-02 16:44:23 +00:00
|
|
|
return ImageControl(imageUrl: url);
|
2024-08-31 20:17:46 +00:00
|
|
|
}
|
|
|
|
}
|