mirror of
https://github.com/svg/svgo.git
synced 2025-07-29 20:21:14 +03:00
plugins/mergePaths: new plugin
This commit is contained in:
@ -1,3 +1,6 @@
|
|||||||
|
# replace default config
|
||||||
|
# full: true
|
||||||
|
|
||||||
plugins:
|
plugins:
|
||||||
|
|
||||||
# - name
|
# - name
|
||||||
@ -35,6 +38,6 @@ plugins:
|
|||||||
- convertTransform
|
- convertTransform
|
||||||
- removeEmptyAttrs
|
- removeEmptyAttrs
|
||||||
- removeEmptyContainers
|
- removeEmptyContainers
|
||||||
|
- mergePaths
|
||||||
- cleanupIDs
|
- cleanupIDs
|
||||||
- removeUnusedNS
|
- removeUnusedNS
|
||||||
- cropAndCenterAlongPath
|
|
||||||
|
@ -43,6 +43,7 @@ Today we have:
|
|||||||
* [ [>](https://github.com/svg/svgo/blob/master/plugins/moveGroupAttrsToElems.js) ] move some group attributes to the content elements
|
* [ [>](https://github.com/svg/svgo/blob/master/plugins/moveGroupAttrsToElems.js) ] move some group attributes to the content elements
|
||||||
* [ [>](https://github.com/svg/svgo/blob/master/plugins/collapseGroups.js) ] collapse useless groups
|
* [ [>](https://github.com/svg/svgo/blob/master/plugins/collapseGroups.js) ] collapse useless groups
|
||||||
* [ [>](https://github.com/svg/svgo/blob/master/plugins/removeRasterImages.js) ] remove raster images (disabled by default)
|
* [ [>](https://github.com/svg/svgo/blob/master/plugins/removeRasterImages.js) ] remove raster images (disabled by default)
|
||||||
|
* [ [>](https://github.com/svg/svgo/blob/master/plugins/mergePath.js) ] merge multiple Paths into one
|
||||||
|
|
||||||
Want to know how it works and how to write your own plugin? [Of course you want to](https://github.com/svg/svgo/blob/master/docs/how-it-works/en.md).
|
Want to know how it works and how to write your own plugin? [Of course you want to](https://github.com/svg/svgo/blob/master/docs/how-it-works/en.md).
|
||||||
|
|
||||||
|
@ -43,6 +43,7 @@ SVGO имеет расширяемую архитектуру, в которой
|
|||||||
* [ [>](https://github.com/svg/svgo/blob/master/plugins/moveGroupAttrsToElems.js) ] перемещение некоторых атрибутов группы на элементы внутри
|
* [ [>](https://github.com/svg/svgo/blob/master/plugins/moveGroupAttrsToElems.js) ] перемещение некоторых атрибутов группы на элементы внутри
|
||||||
* [ [>](https://github.com/svg/svgo/blob/master/plugins/collapseGroups.js) ] схлопывание бесполезных групп `<g>`
|
* [ [>](https://github.com/svg/svgo/blob/master/plugins/collapseGroups.js) ] схлопывание бесполезных групп `<g>`
|
||||||
* [ [>](https://github.com/svg/svgo/blob/master/plugins/removeRasterImages.js) ] удаление растровых изображений (выключено по умолчанию)
|
* [ [>](https://github.com/svg/svgo/blob/master/plugins/removeRasterImages.js) ] удаление растровых изображений (выключено по умолчанию)
|
||||||
|
* [ [>](https://github.com/svg/svgo/blob/master/plugins/mergePath.js) ] склеивание нескольких Path в одну кривую
|
||||||
|
|
||||||
Хотите узнать, как это работает и как написать свой плагин? [Конечно же, да!](https://github.com/svg/svgo/blob/master/docs/how-it-works/ru.md).
|
Хотите узнать, как это работает и как написать свой плагин? [Конечно же, да!](https://github.com/svg/svgo/blob/master/docs/how-it-works/ru.md).
|
||||||
|
|
||||||
|
45
plugins/mergePaths.js
Normal file
45
plugins/mergePaths.js
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
exports.type = 'perItem';
|
||||||
|
|
||||||
|
exports.active = true;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Merge multiple Paths into one.
|
||||||
|
*
|
||||||
|
* @param {Object} item current iteration item
|
||||||
|
* @return {Boolean} if false, item will be filtered out
|
||||||
|
*
|
||||||
|
* @author Kir Belevich
|
||||||
|
*/
|
||||||
|
exports.fn = function(item) {
|
||||||
|
|
||||||
|
if (item.isElem() && !item.isEmpty()) {
|
||||||
|
|
||||||
|
var prevContentItem;
|
||||||
|
|
||||||
|
item.content = item.content.filter(function(contentItem) {
|
||||||
|
|
||||||
|
// merge only <path d="...z" />
|
||||||
|
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
|
||||||
|
) {
|
||||||
|
prevContentItem.attr('d').value += contentItem.attr('d').value;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
prevContentItem = contentItem;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
17
test/plugins/mergePaths.01.svg
Normal file
17
test/plugins/mergePaths.01.svg
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M 0,0 z"/>
|
||||||
|
<path d="M 10,10 z"/>
|
||||||
|
<path d="M 20,20"/>
|
||||||
|
<path d="M 30,30 z"/>
|
||||||
|
<path d="M 30,30 z" fill="#f00"/>
|
||||||
|
<path d="M 40,40 z"/>
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
@@@
|
||||||
|
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M 0,0 zM 10,10 zM 20,20"/>
|
||||||
|
<path d="M 30,30 z"/>
|
||||||
|
<path d="M 30,30 z" fill="#f00"/>
|
||||||
|
<path d="M 40,40 z"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 396 B |
Reference in New Issue
Block a user