@@ -274,61 +274,27 @@ + (NSString *)parseDiff:(NSString *)txt
274
274
NSArray *lines = [txt componentsSeparatedByString: @" \n " ];
275
275
NSString *line;
276
276
NSMutableString *res=[NSMutableString string ];
277
- BOOL inDiff=FALSE ;
278
- BOOL inBlock=FALSE ;
279
-
277
+
280
278
int l_line,l_end;
281
279
int r_line,r_end;
282
- int i;
283
- for (i=0 ; i<[lines count ]; i++) {
280
+
281
+ int i=0 ;
282
+ do {
284
283
line=[lines objectAtIndex: i];
285
-
286
- if ([GLFileView isStartBlock: line]){
287
- [res appendString: @" </td></tr></thead><tbody>" ];
288
- inDiff=FALSE ;
289
- NSString *header=[line substringFromIndex: 3 ];
290
- NSRange hr = NSMakeRange (0 , [header rangeOfString: @" @@" ].location );
291
- header=[header substringWithRange: hr];
292
-
293
- NSArray *pos=[header componentsSeparatedByString: @" " ];
294
- NSArray *pos_l=[[pos objectAtIndex: 0 ] componentsSeparatedByString: @" ," ];
295
- NSArray *pos_r=[[pos objectAtIndex: 1 ] componentsSeparatedByString: @" ," ];
296
-
297
- l_end=l_line=abs ([[pos_l objectAtIndex: 0 ]integerValue]);
298
- if ([pos_l count ]>1 ) {
299
- l_end=l_line+[[pos_l objectAtIndex: 1 ]integerValue];
300
- }
301
-
302
- r_end=r_line=[[pos_r objectAtIndex: 0 ]integerValue];
303
- if ([pos_r count ]>1 ) {
304
- r_end=r_line+[[pos_r objectAtIndex: 1 ]integerValue];
305
- }
306
-
307
- [res appendString: [NSString stringWithFormat: @" <tr class='header'><td colspan='3'>%@ </td></tr>" ,line]];
308
- inBlock=TRUE ;
309
- }else if (inBlock){
310
- NSString *s=[line substringToIndex: 1 ];
311
- if ([s isEqualToString: @" " ]){
312
- [res appendString: [NSString stringWithFormat: @" <tr><td class='l'>%d </td><td class='r'>%d </td>" ,l_line++,r_line++]];
313
- }else if ([s isEqualToString: @" -" ]){
314
- [res appendString: [NSString stringWithFormat: @" <tr class='l'><td class='l'>%d </td><td class='r'></td>" ,l_line++]];
315
- }else if ([s isEqualToString: @" +" ]){
316
- [res appendString: [NSString stringWithFormat: @" <tr class='r'><td class='l'></td><td class='r'>%d </td>" ,r_line++]];
317
- }
318
- [res appendString: [NSString stringWithFormat: @" <td class='code'>%@ </td></tr>" ,[line substringFromIndex: 1 ]]];
319
- if (!(l_line<l_end) && !(r_line<r_end))
320
- inBlock=FALSE ;
321
- }else if ([GLFileView isStartDiff: line]){
322
- if (inDiff)
323
- [res appendString: @" </tbody></table>" ];
324
- inDiff=TRUE ;
284
+ if ([GLFileView isStartDiff: line]){
325
285
NSString *fileName=[self getFileName: line];
326
- [res appendString: [NSString stringWithFormat: @" <table id='%@ ' class='diff'><thead><tr><td colspan='3'>" ,fileName]];
327
- [res appendString: [NSString stringWithFormat: @" <p>%@ </p>" ,line]];
328
- }else if (inDiff){
329
- [res appendString: [NSString stringWithFormat: @" <p>%@ </p>" ,line]];
286
+ [res appendString: [NSString stringWithFormat: @" <table id='%@ ' class='diff'><thead><tr><td colspan='3'><div style='float:left;'>" ,fileName]];
287
+ do {
288
+ [res appendString: [NSString stringWithFormat: @" <p>%@ </p>" ,line]];
289
+ line=[lines objectAtIndex: ++i];
290
+ }while ([GLFileView isDiffHeader: line]);
291
+ [res appendString: @" </div>" ];
292
+ if (![self isBinaryFile: line]){
293
+ [res appendString: [NSString stringWithFormat: @" <div class='filemerge'><a href='' onclick='openFileMerge(\" %@ \" ,\" {SHA}\" ); return false;'><img src='GitX://app:/filemerge' width='32' height='32'/><br/>open in<br/>FileMerge</a></div>" ,fileName]];
294
+ }
295
+ [res appendString: @" </td></tr></thead><tbody>" ];
296
+
330
297
if ([self isBinaryFile: line]){
331
- [res appendString: @" </td></tr></thead><tbody>" ];
332
298
NSArray *files=[self getFilesNames: line];
333
299
if (![[files objectAtIndex: 0 ] isAbsolutePath ]){
334
300
[res appendString: [NSString stringWithFormat: @" <tr><td colspan='3'>%@ </td></tr>" ,[files objectAtIndex: 0 ]]];
@@ -342,11 +308,50 @@ + (NSString *)parseDiff:(NSString *)txt
342
308
[res appendString: [NSString stringWithFormat: @" <tr><td colspan='3'><img src='GitX://{SHA}/%@ '/></td></tr>" ,[files objectAtIndex: 1 ]]];
343
309
}
344
310
}
311
+ }else {
312
+ do {
313
+ NSString *header=[line substringFromIndex: 3 ];
314
+ NSRange hr = NSMakeRange (0 , [header rangeOfString: @" @@" ].location );
315
+ header=[header substringWithRange: hr];
316
+
317
+ NSArray *pos=[header componentsSeparatedByString: @" " ];
318
+ NSArray *pos_l=[[pos objectAtIndex: 0 ] componentsSeparatedByString: @" ," ];
319
+ NSArray *pos_r=[[pos objectAtIndex: 1 ] componentsSeparatedByString: @" ," ];
320
+
321
+ l_end=l_line=abs ([[pos_l objectAtIndex: 0 ]integerValue]);
322
+ if ([pos_l count ]>1 ) {
323
+ l_end=l_line+[[pos_l objectAtIndex: 1 ]integerValue];
324
+ }
325
+
326
+ r_end=r_line=[[pos_r objectAtIndex: 0 ]integerValue];
327
+ if ([pos_r count ]>1 ) {
328
+ r_end=r_line+[[pos_r objectAtIndex: 1 ]integerValue];
329
+ }
330
+
331
+ [res appendString: [NSString stringWithFormat: @" <tr class='header'><td colspan='3'>%@ </td></tr>" ,line]];
332
+ do {
333
+ line=[lines objectAtIndex: ++i];
334
+ NSString *s=[line substringToIndex: 1 ];
335
+ if ([s isEqualToString: @" " ]){
336
+ [res appendString: [NSString stringWithFormat: @" <tr><td class='l'>%d </td><td class='r'>%d </td>" ,l_line++,r_line++]];
337
+ }else if ([s isEqualToString: @" -" ]){
338
+ [res appendString: [NSString stringWithFormat: @" <tr class='l'><td class='l'>%d </td><td class='r'></td>" ,l_line++]];
339
+ }else if ([s isEqualToString: @" +" ]){
340
+ [res appendString: [NSString stringWithFormat: @" <tr class='r'><td class='l'></td><td class='r'>%d </td>" ,r_line++]];
341
+ }
342
+ [res appendString: [NSString stringWithFormat: @" <td class='code'>%@ </td></tr>" ,[line substringFromIndex: 1 ]]];
343
+ }while ((l_line<l_end) || (r_line<r_end));
344
+ if (i<([lines count ]-1 )){
345
+ line=[lines objectAtIndex: ++i];
346
+ }
347
+ }while ([GLFileView isStartBlock: line]);
345
348
}
349
+ [res appendString: @" </tbody></table>" ];
350
+ }else {
351
+ i++;
346
352
}
347
- }
348
- if (inDiff)
349
- [res appendString: @" </tbody></table>" ];
353
+ }while (i<[lines count ]);
354
+
350
355
return res;
351
356
}
352
357
@@ -395,6 +400,12 @@ +(NSString*)mimeTypeForFileName:(NSString*)name
395
400
return mimeType;
396
401
}
397
402
403
+ +(BOOL )isDiffHeader : (NSString *)line
404
+ {
405
+ unichar c=[line characterAtIndex: 0 ];
406
+ return (c==' i' ) || (c==' m' ) || (c==' n' ) || (c==' d' ) || (c==' -' ) || (c==' +' );
407
+ }
408
+
398
409
+(BOOL )isImage : (NSString *)file
399
410
{
400
411
NSString *mimeType=[GLFileView mimeTypeForFileName: file];
0 commit comments