[첫화면으로]UseModWiki소스수정/diff출력개선

마지막으로 [b]

변경 사항의 출력 개선

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);
    ...
}

기존에 있던 DiffToHTML 함수의 이름만 DiffToHTMLplain 으로 바꿔준다. diff 가 -u 를 지원하지 않거나 기존에 저장된 diff 를 보는 경우를 위해서 이 함수가 여전히 필요하다.
###############
### replaced by gypark
### diff 출력 개선
# sub DiffToHTML {
sub DiffToHTMLplain {
###
###############
    my ($html) = @_;
    my ($tChanged, $tRemoved, $tAdded);

    $tChanged = T('Changed:');
    ...
}

새로운 출력을 처리하는 DiffToHTMLunified 함수를 추가한다.
###############
### 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/</&lt;/g;
        $line =~ s/>/&gt;/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/ /&nbsp;/g;
            $td_option="";
        } elsif ($line =~ /^-(.*)$/) {
            $row = $1;
            $row =~ s/ /&nbsp;/g;
            $td_option="bgcolor='#ffffaf'";
        } elsif ($line =~ /^\+(.*)$/) {
            $row = $1;
            $row =~ s/ /&nbsp;/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 의 출력물을 보고 예전의 함수를 부를지 새로운 함수를 부를지를 결정한다.
###############
### added by gypark
### diff 출력 개선
### 함수를 통채로 추가
sub DiffToHTML {
    my ($html) = @_;
    if ($html =~ /^---/) {
        return &DiffToHTMLunified($html);
    } else {
        return &DiffToHTMLplain($html);
    }
}
###
###############

추가 업데이트 내역

ext1.46e 에서 수정되었습니다. 사용자가 "<" 를 입력한 경우와 "&lt;" 를 입력한 경우에 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" 을 뒤에 붙여 줄까 했는데, 윈도우에서는 이것도 안 되겠더군요. 저 상태에서 에러 메시지가 나오지 않게 할 방법이 있을까요?

-- Raymundo 2003-2-27 1:16 am

diff 출력의 html 을 보면 테이블 제일 마지막에 내용이 없는 한 줄이 더 들어가 있더군요. IE 에서는 내용이 없는 셀을 아예 표시를 하지 않아서 지금껏 몰랐군요. 아래를 수정했습니다.

#   @lines = split("\n", $html, -1);
    @lines = split("\n", $html);
-- Raymundo 2003-3-10 1:07 am


이런, 문제가 생겼습니다. 라인 앞에 +,-,= 마크가 나오지 않게 했더니만, 빈 줄의 경우는 테이블에서 아예 출력이 되지 않는군요. 따라서 빈 줄이 보이지 않습니다. 마우스로 긁어서 붙여넣기 해 보면 빈 줄이 들어가긴 하는군요... 빈 줄의 경우만 "&nbsp ;" 를 넣어서 스페이스 하나를 삽입하면 테이블은 제대로 보이긴 하겠지만, 마우스로 긁어서 붙일 경우 원래 페이지 소스에는 없는 스페이스가 추가로 삽입된다는 것이 매우 기분 나쁘네요. 해결 방법이 없을까요?
-- Raymundo 2004-4-26 10:53 pm

현재 떠오른 안은,

+ , - , = 마크를 항상 그림으로 찍는다?(스페이스 포함)
-- 조프 2004-4-27 8:58 am

푸하, 발상의 전환이로군요. 근데 여전히 문제가... 글꼴 확대나 축소를 하면 빈 라인만 높이가 고정되어 버리는게 싫은 거죠.
-- Raymundo 2004-4-27 9:18 am

눈물을 머금고, 그냥 셀의 높이를 고정 크기로 잡아 버리기로 했습니다. (기존에 IE 에서 보이던 높이와 동일하게 맞추려고 17pt 로 잡았습니다) 스타일쉬트만 슬쩍 고치면 되니까 쉽고, 확대나 축소했을 때 좀 높이가 안 맞는 것은 그냥 참고 넘어갈 만 하겠죠.

-- Raymundo 2004-4-27 12:52 pm
이름:  
Homepage:
내용:
 


위키위키분류

마지막 편집일: 2007-1-8 12:19 pm (변경사항 [d])
1268 hits | Permalink | 변경내역 보기 [h] | 페이지 소스 보기