@@ -43,83 +43,131 @@ private function stylish(array $differenceContent): array
4343 return array_map (
4444 function ($ differenceItem ) {
4545 $ result = null ;
46+ $ itemLevel = str_repeat (" " , $ differenceItem ["level " ] - 1 );
4647 if (!strcmp ($ differenceItem ["status " ], "not changed " )) {
47- $ result = " " .
48- $ differenceItem ["fileKey " ] .
49- ": " .
50- $ differenceItem ["file1Content " ] .
51- "\n" ;
48+ if (is_array ($ differenceItem ["file1Content " ])) {
49+ $ result = $ itemLevel .
50+ " " . $ differenceItem ["fileKey " ] . ": " .
51+ stylish ($ differenceItem ["file1Content " ]);
52+ } else {
53+ $ result = $ itemLevel .
54+ " " . $ differenceItem ["fileKey " ] . ": " .
55+ $ differenceItem ["file1Content " ];
56+ }
5257 } elseif (!strcmp ($ differenceItem ["status " ], "changed " )) {
53- $ result = " - " .
54- $ differenceItem ["fileKey " ] .
55- ": " .
56- $ differenceItem ["file1Content " ] .
57- "\n" .
58- " + " .
59- $ differenceItem ["fileKey " ] .
60- ": " .
61- $ differenceItem ["file2Content " ] .
62- "\n" ;
58+ if (is_array ($ differenceItem ["file1Content " ])) {
59+ $ result = $ itemLevel .
60+ " - " . $ differenceItem ["fileKey " ] . ": " .
61+ stylish ($ differenceItem ["file1Content " ]) . "\n" .
62+ " + " . $ differenceItem ["fileKey " ] . ": " ;
63+ if (is_array ($ differenceItem ["file2Content " ])) {
64+ $ result = $ result . stylish ($ differenceItem ["file2Content " ]);
65+ } else {
66+ $ result = $ result . $ differenceItem ["file2Content " ];
67+ }
68+ } else {
69+ $ result = $ itemLevel .
70+ " - " . $ differenceItem ["fileKey " ] . ": " .
71+ $ differenceItem ["file1Content " ] . "\n" .
72+ $ itemLevel .
73+ " + " . $ differenceItem ["fileKey " ] . ": " ;
74+ if (is_array ($ differenceItem ["file2Content " ])) {
75+ $ result = $ result . stylish ($ differenceItem ["file2Content " ]);
76+ } else {
77+ $ result = $ result . $ differenceItem ["file2Content " ];
78+ }
79+ }
6380 } elseif (!strcmp ($ differenceItem ["status " ], "added " )) {
64- $ result = " + " .
65- $ differenceItem ["fileKey " ] .
66- ": " .
67- $ differenceItem ["file2Content " ] .
68- "\n" ;
81+ $ result = $ itemLevel .
82+ " + " . $ differenceItem ["fileKey " ] . ": " ;
83+ if (is_array ($ differenceItem ["file2Content " ])) {
84+ $ result = $ result .
85+ stylish ($ differenceItem ["file2Content " ]);
86+ } else {
87+ $ result = $ result . $ differenceItem ["file2Content " ];
88+ }
6989 } elseif (!strcmp ($ differenceItem ["status " ], "deleted " )) {
70- $ result = " - " .
71- $ differenceItem ["fileKey " ] .
72- ": " .
73- $ differenceItem ["file1Content " ] .
74- "\n" ;
90+ $ result = $ itemLevel .
91+ " - " . $ differenceItem ["fileKey " ] . ": " .
92+ $ differenceItem ["file1Content " ];
7593 }
94+ $ result = $ result . "\n" ;
95+
7696 return $ result ;
7797 },
7898 $ differenceContent
7999 );
80100 }
81101
82- private function getDifference ($ contentListKeys , $ file1Content , $ file2Content ): array
102+ private function getDifference ($ fileContentKeys , $ file1Content , $ file2Content ): array
83103 {
84- return array_map (
85- function ($ fileKey ) use ($ file1Content , $ file2Content ) {
86- if (array_key_exists ($ fileKey , $ file2Content )) {
87- if (
88- array_key_exists ($ fileKey , $ file1Content ) &&
89- !strcmp ($ file1Content [$ fileKey ], $ file2Content [$ fileKey ])
90- ) {
91- $ result = [
92- "status " => "not changed " ,
93- "fileKey " => $ fileKey ,
94- "file1Content " => $ file1Content [$ fileKey ],
95- "file2Content " => $ file1Content [$ fileKey ]
96- ];
97- } elseif (array_key_exists ($ fileKey , $ file1Content )) {
98- $ result = [
99- "status " => "changed " ,
100- "fileKey " => $ fileKey ,
101- "file1Content " => $ file1Content [$ fileKey ],
102- "file2Content " => $ file2Content [$ fileKey ]
103- ];
104+ $ contentDescriptor = [];
105+ return array_reduce (
106+ $ fileContentKeys ,
107+ function ($ contentDescriptor , $ fileKey ) {
108+ if (array_key_exists ($ fileKey , $ contentDescriptor ["file2Content " ])) {
109+ if (array_key_exists ($ fileKey , $ contentDescriptor ["file1Content " ])) {
110+ $ descriptorItem = $ contentDescriptor ;
111+ if ($ descriptorItem ["file1Content " ][$ fileKey ] === $ descriptorItem ["file2Content " ][$ fileKey ]) {
112+ if (is_array ($ descriptorItem ["file1Content " ][$ fileKey ])) {
113+ $ mergedFileKeys = array_keys (array_merge (
114+ $ descriptorItem ["file1Content " ][$ fileKey ],
115+ $ descriptorItem ["file2Content " ][$ fileKey ]
116+ ));
117+ $ contentDescriptor ["result " ][] = getDifference (
118+ $ mergedFileKeys ,
119+ $ descriptorItem ["file1Content " ],
120+ $ descriptorItem ["file2Content " ]
121+ );
122+ } else {
123+ $ contentDescriptor ["result " ][] = [
124+ "level " => $ descriptorItem ["level " ] + 1 ,
125+ "status " => "not changed " ,
126+ "fileKey " => $ fileKey ,
127+ "file1Content " => $ descriptorItem ["file1Content " ][$ fileKey ],
128+ "file2Content " => $ descriptorItem ["file1Content " ][$ fileKey ]
129+ ];
130+ }
131+ } else {
132+ $ descriptorItem = $ contentDescriptor ;
133+ $ contentDescriptor ["result " ][] = [
134+ "level " => $ descriptorItem ["level " ] + 1 ,
135+ "status " => "changed " ,
136+ "fileKey " => $ fileKey ,
137+ "file1Content " => $ descriptorItem ["file1Content " ][$ fileKey ],
138+ "file2Content " => $ descriptorItem ["file2Content " ][$ fileKey ]
139+ ];
140+ }
104141 } else {
105- $ result = [
142+ $ descriptorItem = $ contentDescriptor ;
143+ $ contentDescriptor ["result " ][] = [
144+ "level " => $ descriptorItem ["level " ] + 1 ,
106145 "status " => "added " ,
107146 "fileKey " => $ fileKey ,
108147 "file1Content " => null ,
109- "file2Content " => $ file2Content [$ fileKey ]
148+ "file2Content " => $ descriptorItem [ " file2Content " ] [$ fileKey ]
110149 ];
111150 }
112- return $ result ;
113151 } else {
114- return [
152+ $ descriptorItem = $ contentDescriptor ;
153+ $ contentDescriptor ["result " ][] = [
154+ "level " => $ descriptorItem ["level " ] + 1 ,
115155 "status " => "deleted " ,
116156 "fileKey " => $ fileKey ,
117- "file1Content " => $ file1Content [$ fileKey ],
157+ "file1Content " => $ descriptorItem [ " file1Content " ] [$ fileKey ],
118158 "file2Content " => null
119159 ];
120160 }
161+
162+ return $ contentDescriptor ;
121163 },
122- $ contentListKeys
164+ [
165+ "level " => 0 ,
166+ "status " => null ,
167+ "fileKey " => "init " ,
168+ "file1Content " => $ file1Content ,
169+ "file2Content " => $ file2Content
170+ ]
123171 );
124172 }
125173
@@ -178,17 +226,15 @@ public function execute(CommandInterface $command = null): CommandInterface
178226
179227 $ this ->filesContentString = implode ("" , $ this ->filesContent );
180228
181- $ file1Keys = array_keys ($ file1Content );
182- $ file2Keys = array_keys ($ file2Content );
183- $ mergedFileKeys = array_unique (array_merge ($ file1Keys , $ file2Keys ));
184-
185- $ contentAnalysisResult = $ this ->getDifference (
229+ $ mergedFileKeys = array_keys (array_merge ($ file1Content , $ file2Content ));
230+ $ contentDescriptor = $ this ->getDifference (
186231 $ mergedFileKeys ,
187232 $ file1Content ,
188233 $ file2Content
189234 );
190235
191- $ this ->filesDiffs = $ this ->stylish ($ contentAnalysisResult );
236+ $ this ->filesDiffs = $ this ->stylish ($ contentDescriptor ["result " ]);
237+
192238 $ this ->filesDiffsString = "{ \n" . implode ("" , $ this ->filesDiffs ) . "} \n" ;
193239 }
194240
0 commit comments