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