11import 'package:flutter/material.dart' ;
22import 'package:flutter_html/flutter_html.dart' ;
3- import 'package:flutter_html_all/flutter_html_all .dart' ;
3+ import 'package:flutter_html_math/flutter_html_math .dart' ;
44
55void main () => runApp (const MyApp ());
66
@@ -203,7 +203,7 @@ const htmlData = r"""
203203 <mn>2</mn>
204204 </msup>
205205 <mo>⋅</mo>
206- <mi>ⅆ </mi><mi>x</mi>
206+ <mi>d </mi><mi>x</mi>
207207 <mo>=</mo>
208208 <mo>[</mo>
209209 <mfrac>
@@ -232,6 +232,7 @@ const htmlData = r"""
232232 <mi>3</mi>
233233 </mfrac>
234234 </math>
235+ <br />
235236 <math>
236237 <msup>
237238 <mo>sin</mo>
@@ -292,73 +293,83 @@ class MyHomePageState extends State<MyHomePage> {
292293 alignment: Alignment .topLeft,
293294 ),
294295 'h5' : Style (maxLines: 2 , textOverflow: TextOverflow .ellipsis),
296+ 'flutter' : Style (
297+ display: Display .block,
298+ fontSize: FontSize (5 , Unit .em),
299+ ),
295300 },
296301 tagsList: Html .tags..addAll (['tex' , 'bird' , 'flutter' ]),
297- customRenders: {
298- tagMatcher ("tex" ): CustomRender .widget (
299- widget: (context, buildChildren) => Math .tex (
300- context.tree.element? .innerHtml ?? '' ,
301- mathStyle: MathStyle .display,
302- textStyle: context.style.generateTextStyle (),
303- onErrorFallback: (FlutterMathException e) {
304- return Text (e.message);
305- },
306- )),
307- tagMatcher ("bird" ): CustomRender .inlineSpan (
308- inlineSpan: (context, buildChildren) =>
309- const TextSpan (text: "🐦" )),
310- tagMatcher ("flutter" ): CustomRender .widget (
311- widget: (context, buildChildren) => FlutterLogo (
312- style: (context.tree.element! .attributes['horizontal' ] !=
313- null )
314- ? FlutterLogoStyle .horizontal
315- : FlutterLogoStyle .markOnly,
316- textColor: context.style.color! ,
317- size: context.style.fontSize! .value * 5 ,
318- )),
319- tagMatcher ("table" ): CustomRender .widget (
320- widget: (context, buildChildren) => SingleChildScrollView (
321- scrollDirection: Axis .horizontal,
322- child: tableRender
323- .call ()
324- .widget!
325- .call (context, buildChildren),
326- )),
327- audioMatcher (): audioRender (),
328- iframeMatcher (): iframeRender (),
329- mathMatcher ():
330- mathRender (onMathError: (error, exception, exceptionWithType) {
331- debugPrint (exception);
332- return Text (exception);
333- }),
334- svgTagMatcher (): svgTagRender (),
335- svgDataUriMatcher (): svgDataImageRender (),
336- svgAssetUriMatcher (): svgAssetImageRender (),
337- svgNetworkSourceMatcher (): svgNetworkImageRender (),
338- networkSourceMatcher (domains: ["flutter.dev" ]):
339- CustomRender .widget (widget: (context, buildChildren) {
340- return const FlutterLogo (size: 36 );
341- }),
342- networkSourceMatcher (domains: ["mydomain.com" ]): networkImageRender (
343- headers: {"Custom-Header" : "some-value" },
344- altWidget: (alt) => Text (alt ?? "" ),
345- loadingWidget: () => const Text ("Loading..." ),
302+ extensions: [
303+ TagExtension (
304+ tagsToExtend: {"h4" },
305+ child: FlutterLogo (),
346306 ),
347- // On relative paths starting with /wiki, prefix with a base url
348- (context) =>
349- context.tree.element? .attributes["src" ] != null &&
350- context.tree.element! .attributes["src" ]!
351- .startsWith ("/wiki" ): networkImageRender (
352- mapUrl: (url) => "https://upload.wikimedia.org${url !}" ),
353- // Custom placeholder image for broken links
354- networkSourceMatcher ():
355- networkImageRender (altWidget: (_) => const FlutterLogo ()),
356- videoMatcher (): videoRender (),
357- },
358- onLinkTap: (url, _, __, ___) {
307+ TagExtension (
308+ tagsToExtend: {"tex" },
309+ builder: (context) => Math .tex (
310+ context.innerHtml,
311+ mathStyle: MathStyle .display,
312+ textStyle: context.styledElement? .style.generateTextStyle (),
313+ onErrorFallback: (FlutterMathException e) {
314+ return Text (e.message);
315+ },
316+ ),
317+ ),
318+ TagExtension .inline (
319+ tagsToExtend: {"bird" },
320+ child: const TextSpan (text: "🐦" ),
321+ ),
322+ TagExtension (
323+ tagsToExtend: {"flutter" },
324+ builder: (context) => FlutterLogo (
325+ style: context.attributes['horizontal' ] != null
326+ ? FlutterLogoStyle .horizontal
327+ : FlutterLogoStyle .markOnly,
328+ textColor: context.styledElement! .style.color! ,
329+ size: context.styledElement! .style.fontSize! .value,
330+ ),
331+ ),
332+ MathHtmlExtension (),
333+ ],
334+ // customRenders: {
335+ // tagMatcher("table"): CustomRender.widget(
336+ // widget: (context, buildChildren) => SingleChildScrollView(
337+ // scrollDirection: Axis.horizontal,
338+ // child: tableRender
339+ // .call()
340+ // .widget!
341+ // .call(context, buildChildren),
342+ // )),
343+ // audioMatcher(): audioRender(),
344+ // iframeMatcher(): iframeRender(),
345+ // svgTagMatcher(): svgTagRender(),
346+ // svgDataUriMatcher(): svgDataImageRender(),
347+ // svgAssetUriMatcher(): svgAssetImageRender(),
348+ // svgNetworkSourceMatcher(): svgNetworkImageRender(),
349+ // networkSourceMatcher(domains: ["flutter.dev"]):
350+ // CustomRender.widget(widget: (context, buildChildren) {
351+ // return const FlutterLogo(size: 36);
352+ // }),
353+ // networkSourceMatcher(domains: ["mydomain.com"]): networkImageRender(
354+ // headers: {"Custom-Header": "some-value"},
355+ // altWidget: (alt) => Text(alt ?? ""),
356+ // loadingWidget: () => const Text("Loading..."),
357+ // ),
358+ // // On relative paths starting with /wiki, prefix with a base url
359+ // (context) =>
360+ // context.tree.element?.attributes["src"] != null &&
361+ // context.tree.element!.attributes["src"]!
362+ // .startsWith("/wiki"): networkImageRender(
363+ // mapUrl: (url) => "https://upload.wikimedia.org${url!}"),
364+ // // Custom placeholder image for broken links
365+ // networkSourceMatcher():
366+ // networkImageRender(altWidget: (_) => const FlutterLogo()),
367+ // videoMatcher(): videoRender(),
368+ // },
369+ onLinkTap: (url, _, __) {
359370 debugPrint ("Opening $url ..." );
360371 },
361- onImageTap: (src, _, __, ___ ) {
372+ onImageTap: (src, _, __) {
362373 debugPrint (src);
363374 },
364375 onImageError: (exception, stackTrace) {
@@ -378,11 +389,11 @@ class MyHomePageState extends State<MyHomePage> {
378389 }
379390}
380391
381- CustomRenderMatcher texMatcher () =>
382- (context) => context.tree.element? .localName == 'tex' ;
392+ // CustomRenderMatcher texMatcher() =>
393+ // (context) => context.tree.element?.localName == 'tex';
383394
384- CustomRenderMatcher birdMatcher () =>
385- (context) => context.tree.element? .localName == 'bird' ;
395+ // CustomRenderMatcher birdMatcher() =>
396+ // (context) => context.tree.element?.localName == 'bird';
386397
387- CustomRenderMatcher flutterMatcher () =>
388- (context) => context.tree.element? .localName == 'flutter' ;
398+ // CustomRenderMatcher flutterMatcher() =>
399+ // (context) => context.tree.element?.localName == 'flutter';
0 commit comments