svgdotjs / svg.js

The lightweight library for manipulating and animating SVG
https://svgjs.dev
Other
11.07k stars 1.08k forks source link

`use` apparently converting what it thinks are shortened hexadecimal colour strings #1241

Closed Perlkonig closed 1 year ago

Perlkonig commented 2 years ago

Bug report

use() is apparently converting IDs that it thinks are shortened hexadecimal colour strings.

Fiddle

https://jsfiddle.net/krtwhuLb/3/

var canvas = SVG().addTo('#canvas').size('100%', '100%')

// create your example here
const group1 = canvas.defs().group().id("A2");
group1.circle(200).translate(10,10).fill("red");
const group2 = canvas.defs().group().id("A20");
group2.circle(200).translate(50,50).fill("green");
const group3 = canvas.defs().group().id("A200");
group3.circle(200).translate(90,90).fill("blue");
const got1 = canvas.findOne("#A2");
canvas.use(got1);
const got2 = canvas.findOne("#A20");
canvas.use(got2);
const got3 = canvas.findOne("#A200");
canvas.use(got3);

Explanation

If you look at the resulting SVG, you'll see that the <use> tag for #A20 got converted into <use xlink:href="#aa2200"></use>, which of course doesn't exist in defs and so the green circle doesn't display.

Sphinxxxx commented 2 years ago

.use() calls .attr('href', ..., and it's a sanity check in attr() that expands any hex-color-like value to the full hex color, thus an invalid href id.

Fuzzyma commented 2 years ago

Gnaaa I hate to make exceptions in that regard. Maybe I should define attributes that are designed to take colors and only test for those

Fuzzyma commented 1 year ago

Took a while for me to fix but here you go :)

Fuzzyma commented 3 months ago

I am sorry, I somehow forgot to publish all the fixes I made. I just released it: https://github.com/svgdotjs/svg.js/releases/tag/3.2.1