mergePaths.js 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. 'use strict';
  2. exports.type = 'perItem';
  3. exports.active = true;
  4. exports.description = 'merges multiple paths in one if possible';
  5. exports.params = {
  6. collapseRepeated: true,
  7. leadingZero: true,
  8. negativeExtraSpace: true
  9. };
  10. var path2js = require('./_path.js').path2js,
  11. js2path = require('./_path.js').js2path,
  12. intersects = require('./_path.js').intersects;
  13. /**
  14. * Merge multiple Paths into one.
  15. *
  16. * @param {Object} item current iteration item
  17. * @return {Boolean} if false, item will be filtered out
  18. *
  19. * @author Kir Belevich, Lev Solntsev
  20. */
  21. exports.fn = function(item, params) {
  22. if (!item.isElem() || item.isEmpty()) return;
  23. var prevContentItem = null,
  24. prevContentItemKeys = null;
  25. item.content = item.content.filter(function(contentItem) {
  26. if (prevContentItem &&
  27. prevContentItem.isElem('path') &&
  28. prevContentItem.isEmpty() &&
  29. prevContentItem.hasAttr('d') &&
  30. contentItem.isElem('path') &&
  31. contentItem.isEmpty() &&
  32. contentItem.hasAttr('d')
  33. ) {
  34. if (!prevContentItemKeys) {
  35. prevContentItemKeys = Object.keys(prevContentItem.attrs);
  36. }
  37. var contentItemAttrs = Object.keys(contentItem.attrs),
  38. equalData = prevContentItemKeys.length == contentItemAttrs.length &&
  39. contentItemAttrs.every(function(key) {
  40. return key == 'd' ||
  41. prevContentItem.hasAttr(key) &&
  42. prevContentItem.attr(key).value == contentItem.attr(key).value;
  43. }),
  44. prevPathJS = path2js(prevContentItem),
  45. curPathJS = path2js(contentItem);
  46. if (equalData && !intersects(prevPathJS, curPathJS)) {
  47. js2path(prevContentItem, prevPathJS.concat(curPathJS), params);
  48. return false;
  49. }
  50. }
  51. prevContentItem = contentItem;
  52. prevContentItemKeys = null;
  53. return true;
  54. });
  55. };