Fix issue with colliding id ranges in SVG Export.

This commit is contained in:
Jürg Lehni 2013-06-18 15:01:18 -07:00
parent db49718015
commit 9633384122

View file

@ -320,7 +320,7 @@ new function() {
function exportPlacedSymbol(item) { function exportPlacedSymbol(item) {
var attrs = getTransform(item, true), var attrs = getTransform(item, true),
symbol = item.getSymbol(), symbol = item.getSymbol(),
symbolNode = getDefinition(symbol); symbolNode = getDefinition(symbol, 'symbol');
definition = symbol.getDefinition(), definition = symbol.getDefinition(),
bounds = definition.getBounds(); bounds = definition.getBounds();
if (!symbolNode) { if (!symbolNode) {
@ -328,7 +328,7 @@ new function() {
viewBox: formatter.rectangle(bounds) viewBox: formatter.rectangle(bounds)
}); });
symbolNode.appendChild(exportSVG(definition)); symbolNode.appendChild(exportSVG(definition));
setDefinition(symbol, symbolNode); setDefinition(symbol, symbolNode, 'symbol');
} }
attrs.href = '#' + symbolNode.id; attrs.href = '#' + symbolNode.id;
attrs.x += bounds.x; attrs.x += bounds.x;
@ -344,7 +344,7 @@ new function() {
// even when they share the same gradient defintion. // even when they share the same gradient defintion.
// http://www.svgopen.org/2011/papers/20-Separating_gradients_from_geometry/ // http://www.svgopen.org/2011/papers/20-Separating_gradients_from_geometry/
// TODO: Implement gradient merging in SVGImport // TODO: Implement gradient merging in SVGImport
var gradientNode = getDefinition(color); var gradientNode = getDefinition(color, 'color');
if (!gradientNode) { if (!gradientNode) {
var gradient = color.getGradient(), var gradient = color.getGradient(),
radial = gradient._radial, radial = gradient._radial,
@ -390,7 +390,7 @@ new function() {
attrs['stop-opacity'] = alpha; attrs['stop-opacity'] = alpha;
gradientNode.appendChild(createElement('stop', attrs)); gradientNode.appendChild(createElement('stop', attrs));
} }
setDefinition(color, gradientNode); setDefinition(color, gradientNode, 'color');
} }
return 'url(#' + gradientNode.id + ')'; return 'url(#' + gradientNode.id + ')';
} }
@ -452,21 +452,22 @@ new function() {
} }
var definitions; var definitions;
function getDefinition(item) { function getDefinition(item, type) {
if (!definitions) if (!definitions)
definitions = { ids: {}, svgs: {} }; definitions = { ids: {}, svgs: {} };
return item && definitions.svgs[item._id]; return item && definitions.svgs[type + '-' + item._id];
} }
function setDefinition(item, node, type) { function setDefinition(item, node, type) {
// Make sure the definitions lookup is created before we use it.
// This is required by 'clip', where getDefinition() is not called.
if (!definitions) if (!definitions)
getDefinition(); getDefinition();
// Have different id ranges per type // Have different id ranges per type
type = type || item._type;
var id = definitions.ids[type] = (definitions.ids[type] || 0) + 1; var id = definitions.ids[type] = (definitions.ids[type] || 0) + 1;
// Give the svg node an ide, and link to it from the item id. // Give the svg node an id, and link to it from the id.
node.id = type + '-' + id; node.id = type + '-' + id;
definitions.svgs[item._id] = node; definitions.svgs[node.id] = node;
} }
function exportDefinitions(node) { function exportDefinitions(node) {