sub GetDiff { ... &WriteStringToFile($newName, $new); ############### ### replaced by gypark ### diff 출력 개선 # $diff_out = `diff $oldName $newName`; $diff_out = `diff -u $oldName $newName`; if ($diff_out eq "") { $diff_out = `diff $oldName $newName`; } ### ############### &ReleaseDiffLock() if ($lock); ... }
############### ### replaced by gypark ### diff 출력 개선 # sub DiffToHTML { sub DiffToHTMLplain { ### ############### my ($html) = @_; my ($tChanged, $tRemoved, $tAdded); $tChanged = T('Changed:'); ... }
############### ### added by gypark ### diff 출력 개선 sub DiffToHTMLunified { my ($html) = @_; my (@lines, $line, $result, $row, $td_option, $in_table, $output_exist); @lines = split("\n", $html); shift(@lines); shift(@lines); $output_exist = 0; $in_table = 0; foreach $line (@lines) { $row = ""; $line =~ s/&/&/g; $line =~ s/</</g; $line =~ s/>/>/g; if ($line =~ /^@@ (.*)@@.*$/) { if ($in_table) { $in_table = 0; $result .= "</table>\n"; } $result .= "\n<br><table style='border: solid 1' width='95%'>\n"; $output_exist = 1; $in_table = 1; $row = "<b>$1</b>"; $td_option = "align='center' bgcolor='#d0d0d0'"; } elsif ($line =~ /^ (.*)$/) { $row = $1; $row =~ s/ / /g; $td_option=""; } elsif ($line =~ /^-(.*)$/) { $row = $1; $row =~ s/ / /g; $td_option="bgcolor='#ffffaf'"; } elsif ($line =~ /^\+(.*)$/) { $row = $1; $row =~ s/ / /g; $td_option="bgcolor='#cfffcf'"; } $result .= "<tr><td style='border: 0;' $td_option>$row</td></tr>\n"; } $result .= "</table>\n" if ($output_exist); return $result; } ### ###############
############### ### added by gypark ### diff 출력 개선 ### 함수를 통채로 추가 sub DiffToHTML { my ($html) = @_; if ($html =~ /^---/) { return &DiffToHTMLunified($html); } else { return &DiffToHTMLplain($html); } } ### ###############
ext1.60d - diff 출력 테이블의 각 라인 앞에 붙는 "+ ", "- ", "= " 마크를 없앰. 마우스로 긁어서 복사할 때 불편하기 때문이다. 빈 줄의 경우 테이블에서 셀이 제대로 출력되지 않기 때문에, UseModWiki스타일쉬트에서 TD.diff, diffrange, diffadd, diffremove 네 가지 클래스에 height: 17pt; 속성을 부여함
$diff_out = `diff -u $oldName $newName`; if ($diff_out eq "") { $diff_out = `diff $oldName $newName`; }
이 경우 -u 옵션을 지원하지 않아서 diff 가 에러를 내면 매번 그 에러 메세지가 웹서버 로그에 남게 됩니다. (서버 에러가 나지 않고 동작을 계속하는게 다행이라면 다행이죠) "2> /dev/null" 을 뒤에 붙여 줄까 했는데, 윈도우에서는 이것도 안 되겠더군요. 저 상태에서 에러 메시지가 나오지 않게 할 방법이 있을까요?
diff 출력의 html 을 보면 테이블 제일 마지막에 내용이 없는 한 줄이 더 들어가 있더군요. IE 에서는 내용이 없는 셀을 아예 표시를 하지 않아서 지금껏 몰랐군요. 아래를 수정했습니다.
# @lines = split("\n", $html, -1); @lines = split("\n", $html);
현재 떠오른 안은,
눈물을 머금고, 그냥 셀의 높이를 고정 크기로 잡아 버리기로 했습니다. (기존에 IE 에서 보이던 높이와 동일하게 맞추려고 17pt 로 잡았습니다) 스타일쉬트만 슬쩍 고치면 되니까 쉽고, 확대나 축소했을 때 좀 높이가 안 맞는 것은 그냥 참고 넘어갈 만 하겠죠.