bodoni / svg

Composer and parser for SVG
Other
304 stars 44 forks source link

Add the ability to disable escaping the content of `Text` nodes #78

Closed flxzt closed 9 months ago

flxzt commented 9 months ago

I (ab)used the Text node to insert Svg content into Svg nodes to make nested Svg's. This is very useful when the content comes from users.

With v0.15 this does not work anymore because the text node now escapes it's content.

I think adding an additional method to the Svg Node to insert an arbitrary string would be enough to make this use case work again. Alternatively, add the ability to turn off escaping when creating new Text nodes.

IvanUkhov commented 9 months ago

Can you please show an example of the final content?

flxzt commented 9 months ago

Sure, for example:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
    width="100"
    height="100"
    viewBox="0 0 100 100"
    xmlns="http://www.w3.org/2000/svg"
    xmlns:svg="http://www.w3.org/2000/svg">
    <svg
        x="10"
        y="10"
        width="50"
        height="50"
        version="1.1"
        xmlns="http://www.w3.org/2000/svg"
        xmlns:svg="http://www.w3.org/2000/svg">
        <rect
            fill="red"
            stroke="black"
            stroke-width="1"
            width="50"
            height="50"
        />
    </svg>
    <svg
        x="40"
        y="40"
        width="50"
        height="50"
        xmlns="http://www.w3.org/2000/svg"
        xmlns:svg="http://www.w3.org/2000/svg">
        <ellipse
            fill="green"
            stroke="black"
            stroke-width="1"
            cx="25"
            cy="25"
            rx="24"
            ry="24"
        />
    </svg>
</svg>

Think that the svg's containing the Rectangle and Ellipse are coming from the user. Actually, in my app I am inserting Text nodes into Group's as well, so this is not only specific to Svg elements.

Whats the reason behind escaping content when creating Text nodes anyway? Or could there be a separate Content node type that does not escape it

IvanUkhov commented 9 months ago

But you cannot append them as usual elements? Or it comes in text form, and you would not want to parse?

flxzt commented 9 months ago

Or it comes in text form, and you would not want to parse?

Yes, exactly. It's essentially an arbitrary Svg string which needs to be inserted

IvanUkhov commented 9 months ago

In general, it would make sense to have a nonescaping node. Perhaps we don't want to abuse node::Text and instead could introduce node::Blob or something as you suggested.