1
0
mirror of https://github.com/svg/svgo.git synced 2025-07-29 20:21:14 +03:00

Updated mergePaths to join paths with the same attributes & values.

This commit is contained in:
Nathan Muir
2013-08-27 09:46:16 +10:00
committed by deepsweet
parent 600f37cb2d
commit ad375c8d9c
2 changed files with 80 additions and 7 deletions

View File

@ -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;
});