From 9124bf809ee88b0d91dd2ff66d2e03b0ce09fbf4 Mon Sep 17 00:00:00 2001 From: deepsweet Date: Thu, 11 Apr 2013 21:15:41 +0300 Subject: [PATCH] plugins/mergePaths: new plugin --- .svgo.yml | 5 +++- README.md | 1 + README.ru.md | 1 + plugins/mergePaths.js | 45 ++++++++++++++++++++++++++++++++++ test/plugins/mergePaths.01.svg | 17 +++++++++++++ 5 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 plugins/mergePaths.js create mode 100644 test/plugins/mergePaths.01.svg diff --git a/.svgo.yml b/.svgo.yml index 85c8fa9b..30704fe3 100644 --- a/.svgo.yml +++ b/.svgo.yml @@ -1,3 +1,6 @@ +# replace default config +# full: true + plugins: # - name @@ -35,6 +38,6 @@ plugins: - convertTransform - removeEmptyAttrs - removeEmptyContainers + - mergePaths - cleanupIDs - removeUnusedNS - - cropAndCenterAlongPath diff --git a/README.md b/README.md index d168e319..da2a8fbf 100644 --- a/README.md +++ b/README.md @@ -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/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/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). diff --git a/README.ru.md b/README.ru.md index 0ce75a78..93aa472b 100644 --- a/README.ru.md +++ b/README.ru.md @@ -43,6 +43,7 @@ SVGO имеет расширяемую архитектуру, в которой * [ [>](https://github.com/svg/svgo/blob/master/plugins/moveGroupAttrsToElems.js) ] перемещение некоторых атрибутов группы на элементы внутри * [ [>](https://github.com/svg/svgo/blob/master/plugins/collapseGroups.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). diff --git a/plugins/mergePaths.js b/plugins/mergePaths.js new file mode 100644 index 00000000..73d34c0e --- /dev/null +++ b/plugins/mergePaths.js @@ -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 + 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; + + }); + } + +}; diff --git a/test/plugins/mergePaths.01.svg b/test/plugins/mergePaths.01.svg new file mode 100644 index 00000000..357add91 --- /dev/null +++ b/test/plugins/mergePaths.01.svg @@ -0,0 +1,17 @@ + + + + + + + + + +@@@ + + + + + + +