변경 사항의 출력 개선
- 페이지의 리비전 사이의 변경된 사항을 볼 때, 기존에는 바뀐 내용만을 출력하기 때문에 페이지의 내용이 많은 경우 본문에서 바뀐 부분을 찾기가 힘들다. 이 패치에서는 바뀐 내용의 앞뒤 일부분 (현재는 diff 에 -u 옵션을 주었을 때 기본값으로 설정되는 3 라인) 을 같이 출력하게 하였다.
- diff 출력은 순수하게 페이지 소스 텍스트를 출력하게 하였다. 즉 링크나 테이블, 헤드라인, 이미지 등의 처리를 전혀 하지 않게 하였다. [URL 이름] 링크에서 URL 만 바꾼 경우 등을 명확히 구분할 수 있게 하기 위함이다
- 필수 요구 사항:
- 서버에 설치되어 있는 "diff" 유틸리티가 "-u" 옵션을 지원해야 한다.
- 지원하지 않아도 서버 에러가 나지는 않는다. 이 경우는 패치를 적용하기 이전과 동일하게 출력되며, 웹서버의 로그에 매번 diff 가 출력하는 에러 메시지가 기록될 것이다. :-/
- 현재 확인된, 지원하는 diff
- GNU diffutils version 2.7 [Download] (주로 Linux 머신에 깔려 있는 것들은 GNU 버전일 것이다)
- 현재 확인된, 지원하지 않는 diff
- SunOS 5.8 에 딸려 있는 diff - 여기서 쓸 수 있도록 컴파일한 GNU diff : binary/diff
- 유의 사항:
- UseModWiki 에서는 각 페이지마다 가장 최근의 major diff, minor diff, author diff 세 가지를 페이지 db 화일에 따로 저장하여 cache 처럼 사용한다. 따라서 이 패치를 적용해도 위 세 가지의 diff 를 볼 때는 예전과 동일하게 출력된다. 패치 적용 이후에 변경된 페이지에 대해서만 새로운 출력이 적용된다. 또는 각 페이지의 "변경내역보기(history)" 에 가서 직접 두 리비전을 지정하여 diff 를 출력할 경우에도 새로운 출력이 나온다. (따라서, /북마크를 사용하는 경우 updated 아이콘을 눌렀을 때 나오는 출력은 이 패치가 바로 적용된다.)
- 만일 이 패치를 적용한 상태에서 페이지 history 로 들어가서 diff 를 시켰는데도 예전의 출력이 그대로 나온다면, diff 가 -u 옵션을 지원하지 않아서일 가능성이 높으며, 이때는 계속 웹서버 로그 화일에 에러 메시지가 나오고 있을 것이다. 웬만하면 이 패치 전체를 다시 없애던가, 아래 코드에서 "diff -u ..." 부분의 "-u" 를 제거하라. 괜히 웹서버 관리자를 기겁하게 할 필요가 없다. :-)
-
sub GetDiff {
...
&WriteStringToFile($newName, $new);
$diff_out = `diff -u $oldName $newName`;
if ($diff_out eq "") {
$diff_out = `diff $oldName $newName`;
}
&ReleaseDiffLock() if ($lock);
...
}
- 기존에 있던 DiffToHTML 함수의 이름만 DiffToHTMLplain 으로 바꿔준다. diff 가 -u 를 지원하지 않거나 기존에 저장된 diff 를 보는 경우를 위해서 이 함수가 여전히 필요하다.
sub DiffToHTMLplain {
my ($html) = @_;
my ($tChanged, $tRemoved, $tAdded);
$tChanged = T('Changed:');
...
}
- 새로운 출력을 처리하는 DiffToHTMLunified 함수를 추가한다.
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;
}
- 기존의 DiffToHTML 함수를 대체하는 새로운 함수를 통채로 추가한다. 이 함수는 diff 의 출력물을 보고 예전의 함수를 부를지 새로운 함수를 부를지를 결정한다.
sub DiffToHTML {
my ($html) = @_;
if ($html =~ /^---/) {
return &DiffToHTMLunified($html);
} else {
return &DiffToHTMLplain($html);
}
}
추가 업데이트 내역
ext1.46e 에서 수정되었습니다. 사용자가 "<" 를 입력한 경우와 "<" 를 입력한 경우에 diff 출력에서 구분이 되지 않던 문제를 해결했습니다.
ext1.60d - diff 출력 테이블의 각 라인 앞에 붙는 "+ ", "- ", "= " 마크를 없앰. 마우스로 긁어서 복사할 때 불편하기 때문이다. 빈 줄의 경우 테이블에서 셀이 제대로 출력되지 않기 때문에, UseModWiki스타일쉬트에서 TD.diff, diffrange, diffadd, diffremove 네 가지 클래스에 height: 17pt; 속성을 부여함
Notes
보시면 아시겠지만... 서버에 있는 diff 가 -u 옵션을 지원하는지 아닌지 판단할 방법이 딱히 없어서... 일단 -u 를 넣어서 호출을 하고, 표준출력이 NULL 이면 옵션 없이 다시 호출하도록 했습니다.
$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);
이런, 문제가 생겼습니다. 라인 앞에 +,-,= 마크가 나오지 않게 했더니만, 빈 줄의 경우는 테이블에서 아예 출력이 되지 않는군요. 따라서 빈 줄이 보이지 않습니다. 마우스로 긁어서 붙여넣기 해 보면 빈 줄이 들어가긴 하는군요... 빈 줄의 경우만 "  ;" 를 넣어서 스페이스 하나를 삽입하면 테이블은 제대로 보이긴 하겠지만, 마우스로 긁어서 붙일 경우 원래 페이지 소스에는 없는 스페이스가 추가로 삽입된다는 것이 매우 기분 나쁘네요. 해결 방법이 없을까요?
현재 떠오른 안은,
- "  ;"를 넣는다 - 위에서 말한 스페이스 삽입 문제가 있음
- 스타일쉬트에서 강제로 셀의 높이를 지정한다 - 글꼴 확대, 축소 시에 diff 테이블만 고정되어 버리므로 보기 싫어짐
- 1x1 짜리 이미지 하나를 각 줄에 넣고 이 이미지를 height 를 준다 - 역시 크기가 고정되는 문제가 있음
- html 내에서는 '내용'으로 인식되고, 출력시에는 'null'로 처리되는 그런 문자코드는 없을까요???
- + , - , = 마크를 항상 그림으로 찍는다?(스페이스 포함)
- 푸하, 발상의 전환이로군요. 근데 여전히 문제가... 글꼴 확대나 축소를 하면 빈 라인만 높이가 고정되어 버리는게 싫은 거죠.
눈물을 머금고, 그냥 셀의 높이를 고정 크기로 잡아 버리기로 했습니다. (기존에 IE 에서 보이던 높이와 동일하게 맞추려고 17pt 로 잡았습니다) 스타일쉬트만 슬쩍 고치면 되니까 쉽고, 확대나 축소했을 때 좀 높이가 안 맞는 것은 그냥 참고 넘어갈 만 하겠죠.
위키위키분류