Skip to content

Commit

Permalink
fix: upgraded flutter_html did not work correctly fixes #437
Browse files Browse the repository at this point in the history
  • Loading branch information
lucien144 committed Feb 14, 2024
1 parent 66577a7 commit 3e4b19f
Showing 1 changed file with 40 additions and 80 deletions.
120 changes: 40 additions & 80 deletions lib/components/post/post_html.dart
Original file line number Diff line number Diff line change
Expand Up @@ -24,72 +24,6 @@ import 'package:html/dom.dart' as dom;
import 'package:html_unescape/html_unescape.dart';
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';

class FyxTagWrapExtension extends HtmlExtension {
final Set<String> tagsToWrap;
final Widget Function(Widget child, ExtensionContext context) builder;

/// [TagWrapExtension] allows you to easily wrap a specific tag (or tags)
/// in another element. For example, you could wrap `<table>` in a
/// `SingleChildScrollView`:
///
/// ```dart
/// extensions: [
/// WrapperExtension(
/// tagsToWrap: {"table"},
/// builder: (child) {
/// return SingleChildScrollView(
/// scrollDirection: Axis.horizontal,
/// child: child,
/// );
/// },
/// ),
/// ],
/// ```
FyxTagWrapExtension({
required this.tagsToWrap,
required this.builder,
});

@override
Set<String> get supportedTags => tagsToWrap;

@override
bool matches(ExtensionContext context) {
switch (context.currentStep) {
case CurrentStep.preparing:
return super.matches(context);
case CurrentStep.preStyling:
case CurrentStep.preProcessing:
return false;
case CurrentStep.building:
return context.styledElement is WrapperElement;
}
}

@override
StyledElement prepare(ExtensionContext context, List<StyledElement> children) {
return WrapperElement(
child: context.parser.prepareFromExtension(
context,
children,
extensionsToIgnore: {this},
),
);
}

@override
InlineSpan build(ExtensionContext context) {
final child = CssBoxWidget.withInlineSpanChildren(
children: context.inlineSpanChildren!,
style: context.style!,
);

return WidgetSpan(
child: builder.call(child, context),
);
}
}

class PostHtml extends StatelessWidget {
final fyx.Content? content;
final bool blur;
Expand All @@ -115,7 +49,7 @@ class PostHtml extends StatelessWidget {
'span.eob': Style(display: Display.inline, height: Height(0)),
'body': Style(margin: Margins.all(0)),
'pre': Style(color: Colors.transparent),
'a': Style(color: colors.primary),
'a': Style(color: colors.primary, textDecoration: TextDecoration.underline),
'.fill': Style(textDecoration: TextDecoration.none, display: Display.block, color: colors.text),
'.twitter-header a, .twitter-text a': Style(color: colors.twitter),
'.twitter-header .name': Style(fontWeight: FontWeight.bold),
Expand All @@ -135,7 +69,7 @@ class PostHtml extends StatelessWidget {
child: parsedChild,
);
}

return Padding(
padding: const EdgeInsets.only(right: 2.0),
child: GestureDetector(
Expand Down Expand Up @@ -183,11 +117,11 @@ class PostHtml extends StatelessWidget {
) {
final element = renderContext.element;
final String? thumb = element!.attributes['src'];

if (thumb == null) {
return parsedChild;
}

String src = thumb;
bool openGallery = true;
if (element.parent!.localName == 'a') {
Expand All @@ -198,7 +132,7 @@ class PostHtml extends StatelessWidget {
openGallery = false;
}
}

post.Image img = post.Image(src, thumb: thumb);
return Padding(
padding: const EdgeInsets.only(bottom: 16.0),
Expand Down Expand Up @@ -231,12 +165,12 @@ class PostHtml extends StatelessWidget {
renderContext,
) {
final element = renderContext.element;

// Spoiler
if (element!.classes.contains('spoiler')) {
return Spoiler(parsedChild);
}

// Twitter
if (element.attributes['data-embed-type'] == 'twitter') {
return Padding(
Expand All @@ -253,14 +187,14 @@ class PostHtml extends StatelessWidget {
),
);
}

// Youtube
if (element.attributes['data-embed-type'] == 'youtube') {
var img = element.querySelector('img');
if (img == null) {
return parsedChild;
}

return Padding(
padding: const EdgeInsets.symmetric(vertical: 8.0),
child: PostHeroAttachment(
Expand All @@ -275,7 +209,7 @@ class PostHtml extends StatelessWidget {
),
);
}

return parsedChild;
}),
FyxTagWrapExtension(
Expand All @@ -285,12 +219,12 @@ class PostHtml extends StatelessWidget {
renderContext,
) {
final element = renderContext.element;

// Spoiler
if (element!.classes.contains('spoiler')) {
return Spoiler(parsedChild);
}

return parsedChild;
}),
FyxTagWrapExtension(
Expand All @@ -300,11 +234,11 @@ class PostHtml extends StatelessWidget {
renderContext,
) {
final element = renderContext.element;

if (element == null) {
return parsedChild;
}

if (element.attributes['style'] == 'background-color:#272822') {
final source = HtmlUnescape().convert(element.text);
return SyntaxHighlighter(source);
Expand Down Expand Up @@ -379,3 +313,29 @@ class PostHtml extends StatelessWidget {
T.openLink(link, mode: SettingsProvider().linksMode);
}
}

// flutter_html widget v3 doesn't allow to pass parsedChild -> this is workaround
class FyxTagWrapExtension extends HtmlExtension {
final Set<String> tagsToWrap;
final Widget Function(Widget child, ExtensionContext context) builder;

FyxTagWrapExtension({
required this.tagsToWrap,
required this.builder,
});

@override
Set<String> get supportedTags => tagsToWrap;

@override
InlineSpan build(ExtensionContext context) {
final child = CssBoxWidget.withInlineSpanChildren(
children: context.inlineSpanChildren!,
style: context.style!,
);

return WidgetSpan(
child: builder.call(child, context),
);
}
}

0 comments on commit 3e4b19f

Please sign in to comment.