Skip to content

Commit 8dca91b

Browse files
committed
Improve linking support to (hopefully) all elements
1 parent 9a43e15 commit 8dca91b

File tree

7 files changed

+36
-23
lines changed

7 files changed

+36
-23
lines changed

lib/html_parser.dart

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,7 @@ class HtmlParser extends StatelessWidget {
419419
//Requires special layout features not available in the TextStyle API.
420420
return WidgetSpan(
421421
child: Transform.translate(
422+
key: AnchorKey.of(key, tree),
422423
offset: Offset(0, verticalOffset),
423424
child: StyledText(
424425
textSpan: TextSpan(
@@ -434,10 +435,15 @@ class HtmlParser extends StatelessWidget {
434435
);
435436
} else {
436437
///[tree] is an inline element.
437-
return TextSpan(
438-
style: newContext.style.generateTextStyle(),
439-
children:
440-
tree.children.map((tree) => parseTree(newContext, tree)).toList(),
438+
return WidgetSpan(
439+
child: StyledText(
440+
key: AnchorKey.of(key, tree),
441+
textSpan: TextSpan(
442+
style: newContext.style.generateTextStyle(),
443+
children:
444+
tree.children.map((tree) => parseTree(newContext, tree)).toList(),
445+
), renderContext: context, style: newContext.style,
446+
)
441447
);
442448
}
443449
}
@@ -809,13 +815,15 @@ class StyledText extends StatelessWidget {
809815
final Style style;
810816
final double textScaleFactor;
811817
final RenderContext renderContext;
818+
final AnchorKey? key;
812819

813820
const StyledText({
814821
required this.textSpan,
815822
required this.style,
816823
this.textScaleFactor = 1.0,
817824
required this.renderContext,
818-
});
825+
this.key,
826+
}) : super(key: key);
819827

820828
@override
821829
Widget build(BuildContext context) {

lib/src/interactable_element.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ class InteractableElement extends StyledElement {
1313
required Style style,
1414
required this.href,
1515
required dom.Node node,
16-
}) : super(name: name, children: children, style: style, node: node as dom.Element?);
16+
required String elementId,
17+
}) : super(name: name, children: children, style: style, node: node as dom.Element?, elementId: elementId);
1718
}
1819

1920
/// A [Gesture] indicates the type of interaction by a user.
@@ -34,6 +35,7 @@ InteractableElement parseInteractableElement(
3435
textDecoration: TextDecoration.underline,
3536
),
3637
node: element,
38+
elementId: element.id
3739
);
3840
/// will never be called, just to suppress missing return warning
3941
default:
@@ -43,6 +45,7 @@ InteractableElement parseInteractableElement(
4345
node: element,
4446
href: '',
4547
style: Style(),
48+
elementId: "[[No ID]]"
4649
);
4750
}
4851
}

lib/src/layout_element.dart

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@ abstract class LayoutElement extends StyledElement {
1515
LayoutElement({
1616
String name = "[[No Name]]",
1717
required List<StyledElement> children,
18+
String? elementId,
1819
dom.Element? node,
19-
}) : super(name: name, children: children, style: Style(), node: node);
20+
}) : super(name: name, children: children, style: Style(), node: node, elementId: elementId ?? "[[No ID]]");
2021

2122
Widget? toWidget(RenderContext context);
2223
}
@@ -26,7 +27,7 @@ class TableLayoutElement extends LayoutElement {
2627
required String name,
2728
required List<StyledElement> children,
2829
required dom.Element node,
29-
}) : super(name: name, children: children, node: node);
30+
}) : super(name: name, children: children, node: node, elementId: node.id);
3031

3132
@override
3233
Widget toWidget(RenderContext context) {
@@ -265,7 +266,7 @@ class DetailsContentElement extends LayoutElement {
265266
required List<StyledElement> children,
266267
required dom.Element node,
267268
required this.elementList,
268-
}) : super(name: name, node: node, children: children);
269+
}) : super(name: name, node: node, children: children, elementId: node.id);
269270

270271
@override
271272
Widget toWidget(RenderContext context) {

lib/src/replaced_element.dart

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,10 @@ abstract class ReplacedElement extends StyledElement {
2828
ReplacedElement({
2929
required String name,
3030
required Style style,
31+
required String elementId,
3132
dom.Element? node,
32-
this.alignment = PlaceholderAlignment.aboveBaseline
33-
}) : super(name: name, children: [], style: style, node: node);
33+
this.alignment = PlaceholderAlignment.aboveBaseline,
34+
}) : super(name: name, children: [], style: style, node: node, elementId: elementId);
3435

3536
static List<String?> parseMediaSources(List<dom.Element> elements) {
3637
return elements
@@ -53,7 +54,7 @@ class TextContentElement extends ReplacedElement {
5354
required this.text,
5455
this.node,
5556
dom.Element? element,
56-
}) : super(name: "[text]", style: style, node: element);
57+
}) : super(name: "[text]", style: style, node: element, elementId: "[[No ID]]");
5758

5859
@override
5960
String toString() {
@@ -75,7 +76,7 @@ class ImageContentElement extends ReplacedElement {
7576
required this.src,
7677
required this.alt,
7778
required dom.Element node,
78-
}) : super(name: name, style: Style(), node: node, alignment: PlaceholderAlignment.middle);
79+
}) : super(name: name, style: Style(), node: node, alignment: PlaceholderAlignment.middle, elementId: node.id);
7980

8081
@override
8182
Widget toWidget(RenderContext context) {
@@ -115,7 +116,7 @@ class AudioContentElement extends ReplacedElement {
115116
required this.loop,
116117
required this.muted,
117118
required dom.Element node,
118-
}) : super(name: name, style: Style(), node: node);
119+
}) : super(name: name, style: Style(), node: node, elementId: node.id);
119120

120121
@override
121122
Widget toWidget(RenderContext context) {
@@ -161,7 +162,7 @@ class VideoContentElement extends ReplacedElement {
161162
required this.width,
162163
required this.height,
163164
required dom.Element node,
164-
}) : super(name: name, style: Style(), node: node);
165+
}) : super(name: name, style: Style(), node: node, elementId: node.id);
165166

166167
@override
167168
Widget toWidget(RenderContext context) {
@@ -202,8 +203,8 @@ class SvgContentElement extends ReplacedElement {
202203
required this.data,
203204
required this.width,
204205
required this.height,
205-
required dom.Node node,
206-
}) : super(name: name, style: Style(), node: node as dom.Element?);
206+
required dom.Element node,
207+
}) : super(name: name, style: Style(), node: node, elementId: node.id);
207208

208209
@override
209210
Widget toWidget(RenderContext context) {
@@ -217,7 +218,7 @@ class SvgContentElement extends ReplacedElement {
217218
}
218219

219220
class EmptyContentElement extends ReplacedElement {
220-
EmptyContentElement({String name = "empty"}) : super(name: name, style: Style());
221+
EmptyContentElement({String name = "empty"}) : super(name: name, style: Style(), elementId: "[[No ID]]");
221222

222223
@override
223224
Widget? toWidget(_) => null;
@@ -227,7 +228,7 @@ class RubyElement extends ReplacedElement {
227228
dom.Element element;
228229

229230
RubyElement({required this.element, String name = "ruby"})
230-
: super(name: name, alignment: PlaceholderAlignment.middle, style: Style());
231+
: super(name: name, alignment: PlaceholderAlignment.middle, style: Style(), elementId: element.id);
231232

232233
@override
233234
Widget toWidget(RenderContext context) {
@@ -282,7 +283,7 @@ class MathElement extends ReplacedElement {
282283
required this.element,
283284
this.texStr,
284285
String name = "math",
285-
}) : super(name: name, alignment: PlaceholderAlignment.middle, style: Style());
286+
}) : super(name: name, alignment: PlaceholderAlignment.middle, style: Style(), elementId: element.id);
286287

287288
@override
288289
Widget toWidget(RenderContext context) {

lib/src/widgets/iframe_mobile.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class IframeContentElement extends ReplacedElement {
2222
required this.height,
2323
required dom.Element node,
2424
required this.navigationDelegate,
25-
}) : super(name: name, style: Style(), node: node);
25+
}) : super(name: name, style: Style(), node: node, elementId: node.id);
2626

2727
@override
2828
Widget toWidget(RenderContext context) {

lib/src/widgets/iframe_unsupported.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class IframeContentElement extends ReplacedElement {
2020
required this.height,
2121
required dom.Element node,
2222
required this.navigationDelegate,
23-
}) : super(name: name, style: Style(), node: node);
23+
}) : super(name: name, style: Style(), node: node, elementId: node.id);
2424

2525
@override
2626
Widget toWidget(RenderContext context) {

lib/src/widgets/iframe_web.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class IframeContentElement extends ReplacedElement {
2525
required this.height,
2626
required dom.Element node,
2727
required this.navigationDelegate,
28-
}) : super(name: name, style: Style(), node: node);
28+
}) : super(name: name, style: Style(), node: node, elementId: node.id);
2929

3030
@override
3131
Widget toWidget(RenderContext context) {

0 commit comments

Comments
 (0)