2023-04-27 19:19:51 +00:00
|
|
|
import 'dart:async';
|
|
|
|
|
2024-08-31 20:17:46 +00:00
|
|
|
import 'package:cached_network_image/cached_network_image.dart';
|
2023-04-27 19:19:51 +00:00
|
|
|
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-08-31 20:17:46 +00:00
|
|
|
import '../globals.dart';
|
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
|
|
|
Map<String, String> headers = {'user-agent': userAgent};
|
|
|
|
|
|
|
|
return CachedNetworkImage(
|
|
|
|
httpHeaders: headers,
|
|
|
|
errorWidget: (context, _, error) =>
|
|
|
|
onErrorBuilder(context, meta, error, src) ?? widget0,
|
|
|
|
fit: BoxFit.fill,
|
|
|
|
imageUrl: url,
|
|
|
|
progressIndicatorBuilder: (context, _, progress) {
|
|
|
|
final t = progress.totalSize;
|
|
|
|
final v = t != null && t > 0 ? progress.downloaded / t : null;
|
|
|
|
return onLoadingBuilder(context, meta, v, src) ?? widget0;
|
|
|
|
},
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|