svg.js icon indicating copy to clipboard operation
svg.js copied to clipboard

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

Open Perlkonig opened this issue 3 years ago • 2 comments

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.

Perlkonig avatar Dec 14 '21 20:12 Perlkonig

.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.

Sphinxxxx avatar Dec 14 '21 20:12 Sphinxxxx

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 avatar Dec 14 '21 20:12 Fuzzyma

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

Fuzzyma avatar Sep 03 '23 06:09 Fuzzyma