toWidget method
Implementation
@override
Widget toWidget(RenderContext context) {
StyledElement? node;
List<Widget> widgets = <Widget>[];
final rubySize = context.parser.style['rt']?.fontSize?.size ?? max(9.0, context.style.fontSize!.size! / 2);
final rubyYPos = rubySize + rubySize / 2;
List<StyledElement> children = [];
context.tree.children.forEachIndexed((index, element) {
if (!((element is TextContentElement)
&& (element.text ?? "").trim().isEmpty
&& index > 0
&& index + 1 < context.tree.children.length
&& context.tree.children[index - 1] is! TextContentElement
&& context.tree.children[index + 1] is! TextContentElement)) {
children.add(element);
}
});
for (var c in children) {
if (c.name == "rt" && node != null) {
final widget = Stack(
alignment: Alignment.center,
children: <Widget>[
Container(
alignment: Alignment.bottomCenter,
child: Center(
child: Transform(
transform:
Matrix4.translationValues(0, -(rubyYPos), 0),
child: ContainerSpan(
newContext: RenderContext(
buildContext: context.buildContext,
parser: context.parser,
style: c.style,
tree: c,
),
style: c.style,
child: Text(c.element!.innerHtml,
style: c.style
.generateTextStyle()
.copyWith(fontSize: rubySize)),
)))),
ContainerSpan(
newContext: context,
style: context.style,
child: node is TextContentElement ? Text((node).text?.trim() ?? "",
style: context.style.generateTextStyle()) : null,
children: node is TextContentElement ? null : [context.parser.parseTree(context, node)]),
],
);
widgets.add(widget);
} else {
node = c;
}
}
return Padding(
padding: EdgeInsets.only(top: rubySize),
child: Wrap(
key: AnchorKey.of(context.parser.key, this),
runSpacing: rubySize,
children: widgets.map((e) => Row(
crossAxisAlignment: CrossAxisAlignment.end,
textBaseline: TextBaseline.alphabetic,
mainAxisSize: MainAxisSize.min,
children: [e],
)).toList(),
),
);
}