Skip to content

Commit a7859eb

Browse files
authored
fix(convertPathData): fix some weird behavior (#1867)
1 parent 2c408ce commit a7859eb

File tree

6 files changed

+61
-33
lines changed

6 files changed

+61
-33
lines changed

plugins/convertPathData.js

Lines changed: 32 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -678,24 +678,6 @@ function filters(
678678
}
679679
}
680680

681-
// convert going home to z
682-
// m 0 0 h 5 v 5 l -5 -5 -> m 0 0 h 5 v 5 z
683-
if (
684-
params.convertToZ &&
685-
(isSafeToUseZ || next?.command === 'Z' || next?.command === 'z') &&
686-
(command === 'l' || command === 'h' || command === 'v')
687-
) {
688-
if (
689-
// @ts-ignore
690-
Math.abs(pathBase[0] - item.coords[0]) < error &&
691-
// @ts-ignore
692-
Math.abs(pathBase[1] - item.coords[1]) < error
693-
) {
694-
command = 'z';
695-
data = [];
696-
}
697-
}
698-
699681
// collapse repeated commands
700682
// h 20 h 30 -> h 50
701683
if (
@@ -733,9 +715,9 @@ function filters(
733715
// @ts-ignore
734716
prev.command === 'c' &&
735717
// @ts-ignore
736-
data[0] === -(prev.args[2] - prev.args[4]) &&
718+
Math.abs(data[0] - -(prev.args[2] - prev.args[4])) < error &&
737719
// @ts-ignore
738-
data[1] === -(prev.args[3] - prev.args[5])
720+
Math.abs(data[1] - -(prev.args[3] - prev.args[5])) < error
739721
) {
740722
command = 's';
741723
data = data.slice(2);
@@ -746,9 +728,9 @@ function filters(
746728
// @ts-ignore
747729
prev.command === 's' &&
748730
// @ts-ignore
749-
data[0] === -(prev.args[0] - prev.args[2]) &&
731+
Math.abs(data[0] - -(prev.args[0] - prev.args[2])) < error &&
750732
// @ts-ignore
751-
data[1] === -(prev.args[1] - prev.args[3])
733+
Math.abs(data[1] - -(prev.args[1] - prev.args[3])) < error
752734
) {
753735
command = 's';
754736
data = data.slice(2);
@@ -760,8 +742,8 @@ function filters(
760742
prev.command !== 'c' &&
761743
// @ts-ignore
762744
prev.command !== 's' &&
763-
data[0] === 0 &&
764-
data[1] === 0
745+
Math.abs(data[0]) < error &&
746+
Math.abs(data[1]) < error
765747
) {
766748
command = 's';
767749
data = data.slice(2);
@@ -775,9 +757,9 @@ function filters(
775757
// @ts-ignore
776758
prev.command === 'q' &&
777759
// @ts-ignore
778-
data[0] === prev.args[2] - prev.args[0] &&
760+
Math.abs(data[0] - (prev.args[2] - prev.args[0])) < error &&
779761
// @ts-ignore
780-
data[1] === prev.args[3] - prev.args[1]
762+
Math.abs(data[1] - (prev.args[3] - prev.args[1])) < error
781763
) {
782764
command = 't';
783765
data = data.slice(2);
@@ -788,9 +770,9 @@ function filters(
788770
// @ts-ignore
789771
prev.command === 't' &&
790772
// @ts-ignore
791-
data[2] === prev.args[0] &&
773+
Math.abs(data[2] - prev.args[0]) < error &&
792774
// @ts-ignore
793-
data[3] === prev.args[1]
775+
Math.abs(data[3] - prev.args[1]) < error
794776
) {
795777
command = 't';
796778
data = data.slice(2);
@@ -826,6 +808,24 @@ function filters(
826808
}
827809
}
828810

811+
// convert going home to z
812+
// m 0 0 h 5 v 5 l -5 -5 -> m 0 0 h 5 v 5 z
813+
if (
814+
params.convertToZ &&
815+
(isSafeToUseZ || next?.command === 'Z' || next?.command === 'z') &&
816+
(command === 'l' || command === 'h' || command === 'v')
817+
) {
818+
if (
819+
// @ts-ignore
820+
Math.abs(pathBase[0] - item.coords[0]) < error &&
821+
// @ts-ignore
822+
Math.abs(pathBase[1] - item.coords[1]) < error
823+
) {
824+
command = 'z';
825+
data = [];
826+
}
827+
}
828+
829829
item.command = command;
830830
item.args = data;
831831
} else {
@@ -870,7 +870,8 @@ function convertToMixed(path, params) {
870870

871871
var command = item.command,
872872
data = item.args,
873-
adata = data.slice();
873+
adata = data.slice(),
874+
rdata = data.slice();
874875

875876
if (
876877
command === 'm' ||
@@ -898,9 +899,10 @@ function convertToMixed(path, params) {
898899
}
899900

900901
roundData(adata);
902+
roundData(rdata);
901903

902904
var absoluteDataStr = cleanupOutData(adata, params),
903-
relativeDataStr = cleanupOutData(data, params);
905+
relativeDataStr = cleanupOutData(rdata, params);
904906

905907
// Convert to absolute coordinates if it's shorter or forceAbsolutePath is true.
906908
// v-20 -> V0

test/coa/testSvg/test.1.svg

Lines changed: 1 addition & 1 deletion
Loading

test/coa/testSvg/test.svg

Lines changed: 1 addition & 1 deletion
Loading

test/plugins/convertPathData.30.svg

Lines changed: 13 additions & 0 deletions
Loading

test/plugins/convertPathData.31.svg

Lines changed: 13 additions & 0 deletions
Loading

test/svgo/plugins-order.svg

Lines changed: 1 addition & 1 deletion
Loading

0 commit comments

Comments
 (0)