fn resolve_positions_list(
text_node: SvgNode<'_, '_>,
state: &State<'_>,
) -> Vec<CharacterPosition>
Expand description
Resolves text’s character positions.
This includes: x, y, dx, dy.
§The character
The first problem with this task is that the character itself is basically undefined in the SVG spec. Sometimes it’s an XML character, sometimes a glyph, and sometimes just a character.
There is an ongoing discussion on the SVG working group that addresses this by stating that a character is a Unicode code point. But it’s not final.
Also, according to the SVG 2 spec, character is a Unicode code point.
Anyway, we treat a character as a Unicode code point.
§Algorithm
To resolve positions, we have to iterate over descendant nodes and
if the current node is a tspan
and has x/y/dx/dy attribute,
than the positions from this attribute should be assigned to the characters
of this tspan
and it’s descendants.
Positions list can have more values than characters in the tspan
,
so we have to clamp it, because values should not overlap, e.g.:
(we ignore whitespaces for example purposes,
so the text
content is Text
and not T ex t
)
<text>
a
<tspan x="10 20 30">
bc
</tspan>
d
</text>
In this example, the d
position should not be set to 30
.
And the result should be: [None, 10, 20, None]
Another example:
<text>
<tspan x="100 110 120 130">
a
<tspan x="50">
bc
</tspan>
</tspan>
d
</text>
The result should be: [100, 50, 120, None]