Skip to content

Commit 5f85c82

Browse files
committed
diff parser refactoring
1 parent a098c40 commit 5f85c82

File tree

2 files changed

+65
-54
lines changed

2 files changed

+65
-54
lines changed

GLFileView.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
+(BOOL)isBinaryFile:(NSString *)line;
4141
+(NSString*)mimeTypeForFileName:(NSString*)file;
4242
+(BOOL)isImage:(NSString*)file;
43+
+(BOOL)isDiffHeader:(NSString*)line;
4344

4445
@property(retain) NSMutableArray *groups;
4546
@property(retain) NSString *logFormat;

GLFileView.m

Lines changed: 64 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -274,62 +274,27 @@ + (NSString *)parseDiff:(NSString *)txt
274274
NSArray *lines = [txt componentsSeparatedByString:@"\n"];
275275
NSString *line;
276276
NSMutableString *res=[NSMutableString string];
277-
BOOL inDiff=FALSE;
278-
BOOL inBlock=FALSE;
279-
277+
280278
int l_line,l_end;
281279
int r_line,r_end;
282-
int i;
283-
for (i=0; i<[lines count]; i++) {
280+
281+
int i=0;
282+
do {
284283
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]){
325285
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:@"<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]];
328-
[res appendString:[NSString stringWithFormat:@"<p>%@</p>",line]];
329-
}else if(inDiff){
330-
[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+
331297
if([self isBinaryFile:line]){
332-
[res appendString:@"</td></tr></thead><tbody>"];
333298
NSArray *files=[self getFilesNames:line];
334299
if(![[files objectAtIndex:0] isAbsolutePath]){
335300
[res appendString:[NSString stringWithFormat:@"<tr><td colspan='3'>%@</td></tr>",[files objectAtIndex:0]]];
@@ -343,11 +308,50 @@ + (NSString *)parseDiff:(NSString *)txt
343308
[res appendString:[NSString stringWithFormat:@"<tr><td colspan='3'><img src='GitX://{SHA}/%@'/></td></tr>",[files objectAtIndex:1]]];
344309
}
345310
}
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]);
346348
}
349+
[res appendString:@"</tbody></table>"];
350+
}else {
351+
i++;
347352
}
348-
}
349-
if(inDiff)
350-
[res appendString:@"</tbody></table>"];
353+
}while(i<[lines count]);
354+
351355
return res;
352356
}
353357

@@ -396,6 +400,12 @@ +(NSString*)mimeTypeForFileName:(NSString*)name
396400
return mimeType;
397401
}
398402

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+
399409
+(BOOL)isImage:(NSString*)file
400410
{
401411
NSString *mimeType=[GLFileView mimeTypeForFileName:file];

0 commit comments

Comments
 (0)