최근변경내역 화면에 북마크 기능 추가
- 사용법:
- 로그인을 했을 때만 동작한다
- 최근변경내역 에서, 각 페이지 앞에 다음의 아이콘이 출력된다.
- 자신의 북마크 시각 이후에 생성된 페이지. 생성된 이후에 다시 변경되었을 수도 있고 그렇지 않을 수도 있음. 아이콘은 표시만 되고 아무런 기능이 없다.
- 자신의 북마크 시각보다 이전에 생성되었고, 북마크 시각 이후에 수정된 페이지. 아이콘을 클릭하면 북마크 시각 이후에 수정된 내용을 합쳐서 보여준다.
- 자신의 북마크 시각 이후에 변동 사항이 없는 페이지. 아이콘을 클릭하면 패치 이전의 "(변경사항)"과 마찬가지로 마지막으로 변경된 사항을 보여준다.
- 북마크 시각과 관계없이, 삭제된 페이지를 표시한다. 아이콘을 클릭하면 삭제하기 전의 history 화면을 볼 수 있다. 단, 이 기능은 /페이지삭제시keep화일보존 패치가 적용되어 있어야 원하는 결과를 얻을 수 있다.
- "북마크 타임스탬프 갱신"을 클릭하면, 최근변경내역 페이지를 브라우저에 띄운 시각을 자신의 북마크 시각으로 설정한다.
- 각 날짜 옆에 있는 "[북마크 지정]"을 클릭하면, 그 날짜에 가장 마지막으로 변동된 페이지 - 즉, 날짜 바로 아래에 표시된 페이지 - 의 변동시각을 자신의 북마크 시각으로 설정한다.
- 페이지 제목 오른쪽에 있는 변경 횟수 (~번 변경됨) 는, 북마크 시각 이후에 변경된 횟수만을 계산하여 보여준다.
- 이 패치 적용 이후에 한 번도 자신의 북마크를 지정하지 않은 사용자의 경우, 북마크가 1970년 1월 1일 8:59:59 에 맞춰져 있는 것으로 간주하여 출력한다. 따라서 처음에는 모든 페이지에 new 아이콘이 표시된다.
- 로그인하지 않은 사용자의 경우도 북마크는 1970 년으로 설정되나, 북마크를 갱신할 방법이 없기 때문에 new 아이콘 대신에 diff 아이콘이 표시된다.
- 기존에 있던 "이 날 이후의 변경 리스트 보기 (List new changes starting from)" 은, 쓸 일이 없고 복잡하기만 하다고 생각되어서 로그인한 사용자의 경우는 나타나지 않게 하였다.
- wiki.pl 이 있는 디렉토리 아래에 icons 라는 디렉토리를 만들고 그 안에 rc-new.gif, rc-updated.gif, rc-diff.gif, rc-deleted 네 개의 이미지 화일을 두어야 한다. 이 홈페이지에서는 NoSmoke 에 있는 아이콘을 (말도 없이 -_-;) 가져와서 쓰고 있다.
- 관리 메뉴에서 "RecentChanges 갱신" 옵션에 체크한 상태로 페이지를 삭제할 경우 rclog 화일에서 해당 페이지에 관한 내역이 지워져 버리기 때문에 최근변경내역 화면에도 나타나지 않는다. 이 패치에서는 해당 루틴을 주석처리하여, 그 옵션 값에 상관없이 rclog 를 수정하지 않게 하였다.
- 부작용 : 아직 모름.
- 현재까지 테스트한 바로는 별다른 문제는 발생하지 않았다. 다만 아이콘들의 동작이 기존의 동작과 달라져서 혼란스러울 수는 있다.
- 그 외 유의 사항
- new 와 updated - 북마크 시각과 페이지 생성 시각을 비교하는 것은, 페이지를 저장할 때 같이 갱신되는 rclog 화일에다 페이지의 생성시각을 추가로 저장하게 하고, 변경내역을 볼 때 그 저장된 값을 읽어서 비교하는 방식으로 구현하였다. 따라서, 이 패치를 적용한 이후에 한 번 이상 수정한 페이지들만 제대로 비교가 된다. 예를 들어서, 이 패치를 적용한 직후에 북마크를 일부러 7일 전의 날짜로 설정할 경우, 5일 전에 생성된 페이지에는 new 아이콘이 표시되어야 하지만, 실제로는 생성 시각을 읽어올 수 없기 때문에 생성 시각을 1970-1-1 9:00:00 으로 간주한다. 따라서 updated 아이콘이 대신 표시된다. 해당 페이지들이 나중에 다시 수정되면 제대로 출력되며, 일부러 북마크를 예전 날짜로 지정하는 것 자체가 의미없는 동작이기 때문에 따로 해결하지 않고 놔두었다. (해결하려면, 최근변경내역 페이지를 출력할 때 overhead 가 너무 커진다)
- deleted - 위에서도 언급했지만, /페이지삭제시keep화일보존 패치가 적용되어 있어야 한다. 그렇지 않으면 삭제되기 이전의 내용을 볼 수 없다. (사실, 굳이 볼 일도 없어 보이지만..) 문제는.. 저 패치가 부작용을 일으키지 않으리라는 보장이 없다는 것이다. :-)
- 사용자가 환경설정에서 다음과 같이 설정했을때 가장 이상적으로 동작한다.
- "가장 최근 변경을 제일 위에 출력" - 체크
- "각 페이지의 모든 변경 내역을 출력" - 해제
- "소소한 수정(minor edit) 출력" - 보여줌
- "기본적으로 다음 변경사항을 기준으로 보여줌" - 일반적인 수정
-
...
use vars qw(%Page %Section %Text %InterSite %SaveUrl %SaveNumUrl
%KeptRevisions %UserCookie %SetCookie %UserData %IndexHash %Translate
%LinkIndex $InterSiteInit $SaveUrlIndex $SaveNumUrlIndex $MainPage
$OpenPageName @KeptList @IndexList $IndexInit
$q $Now $UserID $TimeZoneOffset $ScriptName $BrowseCode $OtherCode);
use vars qw(%RevisionTs);
...
-
sub BrowsePage {
...
if ($UseDiff && $showDiff) {
$diffRevision = $goodRevision;
$diffRevision = &GetParam('diffrevision', $diffRevision);
&OpenKeptRevisions('text_default') if (!$openKept);
if ($showDiff == 5) {
if (&GetParam('username',"") ne "") {
$diffRevision = $Page{'revision'} - 1;
my $userBookmark = &GetParam('bookmark',-1);
while (($diffRevision > 1) &&
(defined($RevisionTs{$diffRevision})) &&
($RevisionTs{$diffRevision} > $userBookmark)) {
$diffRevision--;
}
}
$showDiff = &GetParam("defaultdiff", 1);
}
$fullHtml .= &GetDiffHTML($showDiff, $id, $diffRevision, "$revision", $newText);
$fullHtml .= "<hr>\n";
}
...
}
-
sub DoRc {
...
}
if (&GetParam("username") eq "") {
print "<br>" . &ScriptLink("action=rc&from=$lastTs",
T('List new changes starting from'));
print " " . &TimeToText($lastTs) . "<br>\n";
} else {
my $bookmark = &GetParam('bookmark',-1);
print "<br>" . &ScriptLink("action=bookmark&time=$Now",
T('Update my bookmark timestamp'));
print " (".
Ts('currently set to %s', &TimeToText($bookmark)).
")<br>\n";
}
$i = 0;
...
}
-
sub GetRcHtml {
...
$showedit = &GetParam("rcshowedit", $ShowEdits);
$showedit = &GetParam("showedit", $showedit);
my $bookmark;
my $bookmarkuser = &GetParam('username', "");
my ($rcnew, $rcupdated, $rcdiff, $rcdeleted) = (
"<img style='border:0' src='icons/rc-new.gif'>",
"<img style='border:0' src='icons/rc-updated.gif'>",
"<img style='border:0' src='icons/rc-diff.gif'>",
"<img style='border:0' src='icons/rc-deleted.gif'>"
);
$bookmark = &GetParam('bookmark',-1);
if ($showedit != 1) {
...
foreach $rcline (@outrc) {
($ts, $pagename) = split(/$FS3/, $rcline);
$pagecount{$pagename}++ if ($ts > $bookmark);
$changetime{$pagename} = $ts;
}
...
if ($date ne &CalcDay($ts)) {
$date = &CalcDay($ts);
if ($inlist) {
$html .= "</ul>\n";
$inlist = 0;
}
if ($bookmarkuser eq "") {
$html .= "<p><strong>" . $date . "</strong><p>\n";
} else {
$html .= "<p><strong>" . $date . "</strong> "." ["
.&ScriptLink("action=bookmark&time=$ts",T('set bookmark'))
."]<p>\n";
}
}
...
$link = "";
if ($UseDiff && &GetParam("diffrclink", 1)) {
if (!(-f &GetPageFile($pagename))) {
$link .= &GetHistoryLink($pagename, $rcdeleted);
} elsif (($bookmarkuser eq "") || ($ts <= $bookmark)) {
$link .= &ScriptLinkDiff(4, $pagename, $rcdiff, "") . " ";
} elsif ($extra{'tscreate'} > $bookmark) {
$link .= $rcnew . " ";
} else {
$link .= &ScriptLinkDiffRevision(5, $pagename, "", $rcupdated) . " ";
}
}
$link .= &GetPageLink($pagename);
$html .= "<li>$link ";
...
}
-
sub OpenKeptRevisions {
my ($name) = @_;
my ($fname, $data, %tempSection);
%KeptRevisions = ();
&OpenKeptList();
%RevisionTs = ();
foreach (@KeptList) {
%tempSection = split(/$FS2/, $_, -1);
next if ($tempSection{'name'} ne $name);
$KeptRevisions{$tempSection{'revision'}} = $_;
$RevisionTs{$tempSection{'revision'}} = $tempSection{'ts'};
}
}
-
sub DoOtherRequest {
...
} elsif ($action eq "version") {
&DoShowVersion();
} elsif ($action eq "bookmark") {
&DoBookmark();
} else {
...
}
-
sub WriteRcLog {
...
$extra{'id'} = $UserID if ($UserID ne "");
$extra{'name'} = $name if ($name ne "");
$extra{'tscreate'} = $Page{'tscreate'};
$extraTemp = join($FS2, %extra);
...
}
-
sub DoBookmark {
if (&GetParam('username') eq "") {
&BrowsePage(T($RCName));
return 1;
}
if (&GetParam('time') ne "") {
$UserData{'bookmark'} = &GetParam('time');
} else {
$UserData{'bookmark'} = $Now;
}
&SaveUserData();
&BrowsePage(T($RCName));
return 1;
}
&DoWikiRequest() if ($RunCGI && ($_ ne 'nocgi'));
1;
추가 업데이트 내역
ext1.54a - URL 에서 diff=5 를 인자로 주었을 때, 로그인한 사용자의 경우만 북마크 처리를 하고 로그인하지 않은 경우는 시스템 값(major, minor, author 중 하나)을 사용하도록 고쳤습니다. 애초에는 로그인하지 않았다면 diff=5 라는 링크가 나올 일이 없기 때문에 클릭할 수도 없었지만, /RSS제공을 통해 RSS 리더로 볼 때 diff=5 가 나오기 때문에...
Notes
북마크 갱신 링크를 누르면 '최근변경내역' 이 아니라 'RecentChanges' 로 이동하는 문제(?)가 있는데.. 이 홈페이지에서는 환경변수 RCName 의 값이 RecentChanges 로 되어 있어서 그런 문제가 발생합니다만.. UseModWiki번역화일을 사용하는 이상 여기도 번역을 하는 게 나을 듯 하네요. DoBookmark 함수에서 두 군데 수정했습니다. 해 줘도 되고 말아도 되는 수정입니다. :-)
&BrowsePage(T($RCName));
펄에서 1970년대 시간이 어떻게 표시되나요? 처음 가입해서 북마크를 한번도 안찍은 사람들한테는 모든 글이 new로 보여서 이걸 바꿨음 좋겠는데요. --
Bab2 2003-3-21 9:45 pm
- 중간에 보면 사용자의 북마크를 사용자 데이타에 설정되어 있지 않으면 기본값을 -1 로 한 것을 볼 수가 있을 겁니다. timestamp 값이 0 일 때가 1970년 1월 1일 9:00:00 이거든요.
sub GetRcHtml {
....
} else {
my $bookmark = &GetParam('bookmark',-1);
print "<br>" . &ScriptLink("action=bookmark&time=$Now",
T('Update my bookmark timestamp'));
if ($bookmark == -1) {
print " (" . T('Not set bookmark yet') . ")<br>\n";
} else {
print " (".
Ts('currently set to %s', &TimeToText($bookmark)).
")<br>\n";
}
}
....
sub GetRcHtml {
....
if (!(-f &GetPageFile($pagename))) {
$link .= &GetHistoryLink($pagename, $rcdeleted);
} elsif (($bookmarkuser eq "") || ($ts <= $bookmark) || ($bookmark == -1)) {
$link .= &ScriptLinkDiff(4, $pagename, $rcdiff, "") . " ";
} elsif ($extra{'tscreate'} > $bookmark) {
$link .= $rcnew . " ";
....
이렇게 하려고 하는데 괜찮을라나 모르겠네요? 별 문젠 없겠죠? --
Bab2 2003-3-21 11:02 pm
- 뭐 별다른 문제가 될 건덕지가 없는 곳이니까요. :-) 로그인을 하고 북마크를 한번도 지정하지 않은경우 new 대신에 diff 가 보이게 하려는 것 같군요. 처음에 이 패치 만들 때 그렇게 할까 하다가, 노스모크가 아마 처음 아이디 만들면 new 로 나왔던 걸로 기억이 나서요. 그런데, 첫번째 박스에서 GetParam('bookmark',-1) 이기 때문에, 뒤에 if 문에서 비교를 == 0 으로 하면 if 문에 걸리지 않습니다. GetParam 에서 0으로 하던가, if 문에서 -1 과 비교하던가 해야겠죠. (두 가지가 동일한 동작일지 아닐지는 생각 좀 해봐야겠지만)
- 그랬군요. 두개다 -1로 수정했습니다.
--
Bab2 2003-3-22 12:08 am
소스수정의 하위페이지에서 Notes 란이 아닌 윗부분을 다른 분이 고치시면 곤란합니다. 저 /UL 은 어차피 지금은 /최근변경내역테이블출력을 적용하면서 주석 처리가 된 부분이긴 합니다만... :-)
- 억~ 노트 위쪽은 안건드렸어염.. ㅡ.ㅡa 어라라? /UL은 본적도 없는데.. 우에에에~ o.O? 자판 치다가 뭘 잘못한 모양이네요. ㅜㅡ
--
Bab2 2003-3-22 3:01 am
위키위키분류