diff --git a/plugins/mergePaths.js b/plugins/mergePaths.js index 66243514..dd45ee01 100644 --- a/plugins/mergePaths.js +++ b/plugins/mergePaths.js @@ -17,7 +17,13 @@ exports.fn = function(item) { if (item.isElem() && !item.isEmpty()) { var prevContentItem, - delim = ''; + delim = '', + prevContentItemKeys = null, + prevItemPathClosed = false, + contentItemKeys = null, + contentItemPathClosed = false, + equalData, + attrName; item.content = item.content.filter(function(contentItem) { @@ -25,25 +31,65 @@ exports.fn = function(item) { if (prevContentItem && prevContentItem.isElem('path') && prevContentItem.hasAttr('d') && - Object.keys(prevContentItem.attrs).length === 1 && - prevContentItem.attr('d').value.charAt(prevContentItem.attr('d').value.length - 1) === 'z' && contentItem.isElem('path') && - contentItem.hasAttr('d') && - Object.keys(contentItem.attrs).length === 1 + contentItem.hasAttr('d') ) { + + prevItemPathClosed = prevContentItem.attr('d').value.charAt(prevContentItem.attr('d').value.length-1) === 'z'; + contentItemPathClosed = contentItem.attr('d').value.charAt(contentItem.attr('d').value.length-1) === 'z'; + + if (!prevItemPathClosed && contentItemPathClosed){ + //console.log('Previous path not closed, current plath closed', prevContentItem.attr('d').value, contentItem.attr('d').value); + prevContentItem = contentItem; + prevContentItemKeys = null; + return true; + } + + if (prevContentItemKeys === null){ + prevContentItemKeys = Object.keys(prevContentItem.attrs); + } + + contentItemKeys = Object.keys(contentItem.attrs); + if (contentItemKeys.length !== 1 || prevContentItemKeys.length !== 1){ + if (contentItemKeys.length !== prevContentItemKeys.length){ + prevContentItem = contentItem; + prevContentItemKeys = null; + return true; + } + + equalData = true; + for(var i = 0, I = contentItemKeys.length; i < I; i++){ + attrName = contentItemKeys[i]; + if (attrName != 'd'){ + if(typeof prevContentItem.attrs[attrName] === "undefined"){ + equalData = false; + break; + } else if (prevContentItem.attrs[attrName].value !== contentItem.attrs[attrName].value){ + equalData = false; + break; + } + } + } + if (!equalData){ + prevContentItem = contentItem; + prevContentItemKeys = null; + return true; + } + } // "zM", but "z m" // looks like a FontForge parsing bug if (contentItem.attr('d').value.charAt(0) === 'm') { delim = ' '; + } else { + delim = ''; // reset delim from looping } prevContentItem.attr('d').value += delim + contentItem.attr('d').value; - return false; } prevContentItem = contentItem; - + prevContentItemKeys = null; return true; }); diff --git a/test/plugins/mergePaths.02.svg b/test/plugins/mergePaths.02.svg new file mode 100644 index 00000000..d791884e --- /dev/null +++ b/test/plugins/mergePaths.02.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + +@@@ + + + + + + + + +