+
+ my @all_elems = $svg->getElements;
+ my @duplicate_ids;
+ for my $elem (@all_elems) {
+ my $id = $elem->attr('id');
+ next unless $id;
+ if ($ids{$id}) {
+ push @duplicate_ids, $id;
+ } else {
+ $ids{$id} = 1;
+ }
+ }
+
+ warn <<"EOF" if @duplicate_ids && !$ENV{SVG_SPRITEMAKER_NO_DUPLICATE_WARNINGS};
+Some IDs (@duplicate_ids) in $img also exist in previous images.
+Trying to fix automatically, but this might produce a broken SVG.
+Fix IDs manually to avoid incorrect output.
+EOF
+
+ for my $oid (@duplicate_ids) {
+ my $nid = $oid;
+ $nid .= '_' while $ids{$nid};
+ $svg->getElementByID($oid)->attr(id => $nid);
+ for my $elem (@all_elems) {
+ my %attribs = %{$elem->getAttributes};
+ for my $key (keys %attribs) {
+ if ($attribs{$key} =~ /#$oid\b/) {
+ $attribs{$key} =~ s/#$oid\b/#$nid/g;
+ $elem->attr($key => $attribs{$key});
+ }
+ }
+ if ($elem->cdata =~ /#$oid\b/) {
+ $elem->cdata($elem->cdata =~ s/#$oid\b/#$nid/gr);
+ }
+ }
+ }
+