' . Ts('Page generated %s', &TimeToText($Now)), "\n"; if (0 == $rcType) { print &GetRcRss(@fullrc); } else { print &GetRcHtml(@fullrc); } } if ($showHTML) { print '
' . Ts('Page generated %s', &TimeToText($Now)), "\n"; } ### ############### } }}} 기존의 GetOldPageLink 를 수정하고, 새로운 함수 GetOldPageParameters 를 추가한다. {{{#!vim perl ############### ### replaced by gypark ### from usemod1.0 # sub GetOldPageLink { # my ($kind, $id, $revision, $name) = @_; # # if ($FreeLinks) { # $id = &FreeToNormal($id); # $name =~ s/_/ /g; # } # return &ScriptLink("action=$kind&id=$id&revision=$revision", $name); # } sub GetOldPageParameters { my ($kind, $id, $revision) = @_; $id = &FreeToNormal($id) if $FreeLinks; return "action=$kind&id=$id&revision=$revision"; } sub GetOldPageLink { my ($kind, $id, $revision, $name) = @_; $name =~ s/_/ /g if $FreeLinks; return &ScriptLink(&GetOldPageParameters($kind, $id, $revision), $name); } ### ############### }}} action=rss 이면 DoRss 를 부르게 한다. {{{#!vim perl sub DoOtherRequest { ... ### comment from Jof } elsif (($action eq "comments") || ($action eq "longcomments")) { &DoComments($id) if &ValidIdOrDie($id); ### rss from usemod1.0 } elsif ($action eq "rss") { &DoRss(); ### ############### } else { # Later improve error reporting &ReportError(Ts('Invalid action parameter %s', $action)); ... } }}} 이제는 페이지를 저장할 때 rclog 화일에 페이지 revision 번호도 저장한다. {{{#!vim perl sub DoPostMain { # 원래 DoPost 였는데 코멘트 매크로 달면서 바뀌었다. ... # &WriteRcLog($id, $summary, $isEdit, $editTime, $user, $Section{'host'}); &WriteRcLog($id, $summary, $isEdit, $editTime, $user, $Section{'host'}, $Section{'revision'}); ### ... } }}} {{{#!vim perl sub WriteRcLog { ############### ### replaced by gypark ### rss from usemod1.0 # my ($id, $summary, $isEdit, $editTime, $name, $rhost) = @_; my ($id, $summary, $isEdit, $editTime, $name, $rhost, $revision) = @_; ### ############### my ($extraTemp, %extra); %extra = (); $extra{'id'} = $UserID if ($UserID ne ""); $extra{'name'} = $name if ($name ne ""); ############### ### added by gypark ### 최근변경내역에 북마크 기능 도입 $extra{'tscreate'} = $Page{'tscreate'}; ### rss from usemod 1.0 $extra{'revision'} = $revision if ($revision ne ""); ############### $extraTemp = join($FS2, %extra); # The two fields at the end of a line are kind and extension-hash ... } }}} 이하의 함수들은 통채로 추가. DoRss 본체는 xml 헤더만 출력하고 DoRc(0) 을 부른다. {{{#!vim perl sub DoRss { print "Content-type: text/xml\n\n"; &DoRc(0); } }}} DoRc 는 인자 0 을 받았다면 GetRcRss 를 부른다. {{{#!vim perl sub GetRcRss { my ($rssHeader, $headList, $items); # Normally get URL from script, but allow override $FullUrl = $q->url(-full=>1) if ($FullUrl eq ""); $QuotedFullUrl = &QuoteHtml($FullUrl); $SiteDescription = &QuoteHtml($SiteDescription); my $ChannelAbout = &QuoteHtml($FullUrl . &ScriptLinkChar() . $ENV{QUERY_STRING}); $rssHeader = < ${\(&QuoteHtml($SiteName))} ${\($QuotedFullUrl . &QuoteHtml("?$RCName"))} ${\(&QuoteHtml($SiteDescription))} $InterWikiMoniker RSS ($headList, $items) = &GetRc(0, @_); $rssHeader .= $headList; return < ${\(&QuoteHtml($SiteName))} $RssLogoUrl $QuotedFullUrl $items RSS } }}} GetRcRss 는 다시 GetRc(0) 을 부른다. 또 DoRc 가 html 출력을 할 때는 GetRcHtml 을 부르는데 이녀석은 별 하는 일 없이 GetRc(1) 을 부른다. 0.92의 GetRcHtml 이 1.0 에서는 GetRc 로 바뀌고 인자에 따라 다르게 동작하게 한 건데... ext 버전에서는 GetRcHtml 이 워낙 많이 수정되어서 그냥 함수를 별개로 두기로 한다. 즉, {{{ 0.92 : HTML: DoRc ------> GetRcHtml 1.0 : RSS: --------+-> DoRc ---+---> GetRcRss ----------+-> GetRc ---------------+--> GetRssRcLine DoRc(0) | | GetRc(0) | (기존 GetRcHtml 수정) | | | | | | | | | | | | | HTML: --------+ +---> GetRcHtml ---------+ +--> GetHtmlRcLine DoRc(1) (이건 그냥 더미) GetRc(1) ext 버전 : RSS: --------+-> DoRc ---+---> GetRcRss ----------+-> GetRc ---------------+--> GetRssRcLine DoRc(0) | | GetRc(0) (1.0의 것을 사용) | | | | | | | | | | HTML: --------+ +---> GetRcHtml +--> GetHtmlRcLine DoRc(1) (기존 것 계속 사용) (결과적으로 사용되지 않음) }}} 따라서 GetRcHtml 과 GetRc 는 비슷한 코드가 반복된다. GetRc(1) 을 호출하는 부분이 없기 때문에 GetRc 에서 해당 경로를 죄다 삭제해 주면 좀 보기에 좋겠지만... 첫째로 귀찮고 둘째로 나중에 다시 필요해질지 모르니 그냥 두기로 함. 어쨌거나, 그래서 이것이 통채로 추가해 버린 GetRc 함수 {{{#!vim perl sub GetRc { my $rcType = shift; my @outrc = @_; my ($rcline, $date, $newtop, $author, $inlist, $result); my ($showedit, $link, $all, $idOnly, $headItem, $item); my ($ts, $pagename, $summary, $isEdit, $host, $kind, $extraTemp); my ($rcchangehist, $tEdit, $tChanges, $tDiff); my ($headList, $historyPrefix, $diffPrefix); my %extra = (); my %changetime = (); my %pagecount = (); # Slice minor edits $showedit = &GetParam("rcshowedit", $ShowEdits); $showedit = &GetParam("showedit", $showedit); if ($showedit != 1) { my @temprc = (); foreach $rcline (@outrc) { ($ts, $pagename, $summary, $isEdit, $host) = split(/$FS3/, $rcline); if ($showedit == 0) { # 0 = No edits push(@temprc, $rcline) if (!$isEdit); } else { # 2 = Only edits push(@temprc, $rcline) if ($isEdit); } } @outrc = @temprc; } # Optimize param fetches out of main loop $rcchangehist = &GetParam("rcchangehist", 1); # Optimize translations out of main loop $tEdit = T('(edit)'); $tDiff = T('(diff)'); $tChanges = T('changes'); $diffPrefix = $QuotedFullUrl . &QuoteHtml("?action=browse\&diff=5\&id="); $historyPrefix = $QuotedFullUrl . &QuoteHtml("?action=history\&id="); foreach $rcline (@outrc) { ($ts, $pagename) = split(/$FS3/, $rcline); $pagecount{$pagename}++; $changetime{$pagename} = $ts; } $date = ""; $all = &GetParam("rcall", 0); $all = &GetParam("all", $all); $newtop = &GetParam("rcnewtop", $RecentTop); $newtop = &GetParam("newtop", $newtop); $idOnly = &GetParam("rcidonly", ""); $inlist = 0; $headList = ''; $result = ''; @outrc = reverse @outrc if ($newtop); foreach $rcline (@outrc) { ($ts, $pagename, $summary, $isEdit, $host, $kind, $extraTemp) = split(/$FS3/, $rcline); next if ((!$all) && ($ts < $changetime{$pagename})); next if (($idOnly ne "") && ($idOnly ne $pagename)); ### hide page next if (&PageIsHidden($pagename)); %extra = split(/$FS2/, $extraTemp, -1); if ($date ne &CalcDay($ts)) { $date = &CalcDay($ts); if (1 == $rcType) { # HTML # add date, properly closing lists first if ($inlist) { $result .= "\n"; $inlist = 0; } $result .= "" . $date . "\n"; if (!$inlist) { $result .= "\n"; $inlist = 1; } } } if (0 == $rcType) { # RSS ($headItem, $item) = &GetRssRcLine($pagename, $ts, $host, $extra{'name'}, $extra{'id'}, $summary, $isEdit, $pagecount{$pagename}, $extra{'revision'}, $diffPrefix, $historyPrefix); $headList .= $headItem; $result .= $item; } else { # HTML $result .= &GetHtmlRcLine($pagename, $ts, $host, $extra{'name'}, $extra{'id'}, $summary, $isEdit, $pagecount{$pagename}, $extra{'revision'}, $tEdit, $tDiff, $tChanges, $all, $rcchangehist); } } if (1 == $rcType) { $result .= "\n" if ($inlist); # Close final tag } return ($headList, $result); # Just ignore headList for HTML } }}} GetRc 함수 안에서 불려서 rss 출력의 각 라인을 생성하는 함수 {{{#!vim perl sub GetRssRcLine { my ($pagename, $timestamp, $host, $userName, $userID, $summary, $isEdit, $pagecount, $revision, $diffPrefix, $historyPrefix) = @_; my ($itemID, $description, $authorLink, $author, $status, $importance, $date, $item, $headItem); # encode pagename for URL (ext1.88) my $encoded_pagename = &EncodeUrl($pagename); # Add to list of items in the $itemID = $FullUrl . &ScriptLinkChar() . &GetOldPageParameters('browse', $encoded_pagename, $revision); $itemID = &QuoteHtml($itemID); $headItem = " \n"; # Add to list of items proper. if (($summary ne "") && ($summary ne "*")) { $description = &QuoteHtml($summary); } $host = &QuoteHtml($host); $host =~ s/\d+$/xxx/; if ($userName) { $author = &QuoteHtml($userName); $authorLink = "link=\"$QuotedFullUrl?$author\""; } else { $author = $host; } $status = (1 == $revision) ? 'new' : 'updated'; $importance = $isEdit ? 'minor' : 'major'; $timestamp += $TimeZoneOffset; my ($sec, $min, $hour, $mday, $mon, $year) = localtime($timestamp); $year += 1900; $date = sprintf("%4d-%02d-%02dT%02d:%02d:%02d+%02d:00", $year, $mon+1, $mday, $hour, $min, $sec, ($TimeZoneOffset/(60*60) + $RssTimeZone)); $pagename = &QuoteHtml($pagename); # Write it out longhand $item = < $pagename $QuotedFullUrl?$encoded_pagename $description $date $author $author $status $importance $diffPrefix$encoded_pagename $revision $historyPrefix$encoded_pagename RSS return ($headItem, $item); } }}} 마찬가지로 GetRc 함수 안에서 불려서, html 출력의 각 라인을 생성하는 함수. 그렇지만 현재는 호출될 일이 없기 때문에 내용은 비워둔다. 호출되면 서버에러를 낸다. {{{#!vim perl sub GetHtmlRcLine { ### 현재는 사용되지 않음 die "GetHtmlRcLine -- must not be executed!!!"; } }}} ext1.65에서 추가로 수정된 부분. html 헤더에 RSS를 얻을 수 있는 URL을 넣어서 출력한다. {{{#!vim perl sub GetHtmlHeader { ... $html .= qq(\n); $html .= qq(\n); # 이 아래 줄 추가 $html .= qq(\n); $html .= qq(); ... } }}} === 추가 업데이트 내역 === ext1.53a - 관리자가 감춘 페이지도 RSS 출력에 포함되어 나오는 문제를 수정했습니다. 오타 수정... DoRc 함수 안에 다음 줄이 오타가 있네요. 거의 호출되지 않는 부분이라 알아채지 못했었군요. {{{ if ($idOnly && &showHTML) { 를 if ($idOnly && $showHTML) { 으로 (showHTML 앞의 & 를 $ 로) 고칠 것 }}} [[/최근변경내역아이템갯수지정]] 패치를 적용하면 '최근 몇 개'의 엔트리를 출력할 지 지정할 수 있음. ext1.54a - 출력 항목에 dc:creator 를 추가하고, wiki:diff 에는 diff=4 대신에 diff=5 가 출력되게 하였습니다. 로그인 한 사용자의 경우는 rss 리더에서 바로 diff 링크를 갈 경우 [[/북마크]]가 적용됩니다. (그런데 wiki:diff 항목을 지원하는 리더가 있는지 모르는 상태입니다 -_-) ext1.65 - Jof:UseModWiki소스수정/라이브북마크 의 내용을 반영합니다. 제 홈페이지를 FireFox에서 볼 때 제대로 동작하는 것을 확인했습니다만, 안 되면 알려 주세요. 참고로 [http://sparcs.kaist.ac.kr/~ari/each/article.each.341.html RSS에 대한 잡담]도 읽어 볼만 하군요. 후자의 글에서 주장하는 "RSS는 미리 (정적으로) 생성되어 있어야 한다"는 말도 일리가 있긴 한데 언제 반영할지 모르겠습니다. ext1.88 * RSS에서 author 항목에 나오는 IP주소의 마지막 자리를 xxx 로 감추게 함 * 페이지 이름에 한글이 들어간 경우 인코딩함 === 관련 링크 === * [http://www.ihelpers.co.kr/programming/lec.php?CMD=view&TYPE=1&KEY=&SC=S&&CC=&PAGE=1&IDX=245 RSS강좌] === Notes === '최근 며칠 동안의 변경내역' 옵션 말고 갯수를 지정하는 옵션도 추가하는 게 좋지 않을까 생각합니다. [[RSS]]를 뽑았는데 항목이 텅 비어 있으면 당황할 것 같네요. 참고로 WikiX는 갯수지정 옵션만 있고요, 야후! 뉴스 같은 곳도 [[RSS]]로 뽑아주는 뉴스의 갯수가 정해져 있군요. : 갯수로 옵션을 주는 사이트들을 봤습니다만 도저히 수긍이 안 가던데요.. 스무개 출력하게 했는데 하루 사이에 50개 글이 올라오면... 반대의 경우는 뭐 보통은 자기가 사이트를 방문하는 주기보다는 days 값을 크게 줄 테니 별 상관없을거라는 생각입니다. 애초에 UseMod:WikiPatches/XmlRss 에서는 그래서 rsslimit 라는 갯수 지정 인자를 줄 수 있게 했는데.. 거기서도 days 를 "more useful option" 이라고 표현하고 있고, 1.0에서는 rsslimit 은 빼 버렸더라고요. 고로 갯수지정을 하려면 코드를 별도로 고쳐야 한다는 얘기... 일단 시도는 해 보도록 하지요. : 반영했습니다. [http://www.activerefresh.com/download.php Abilon]이라는 프로그램을 설치해서 써보고 있습니다만... author가 안나오니 좀 허전하군요. dc:creator 를 $author로 채워주면 잘 나옵니다. 그리고... description에 페이지 diff가 같이 나오게 할 수는 없을까요? 보통 description을 안 적기 마련인데 좀 휑하네요. : UseModWiki 1.0 에서는 dc:contributor 를 사용하던데, 왜 그러는지 의문이네요. 그냥 슬쩍 dc:creator 를 추가해 넣을까요? 그리고 어차피 마지막 수정자의 이름만 보는 거니까 큰 의미도 없다고 생각합니다. \\ \\ diff 출력을 따로 볼 방법이 없어서, 저도 정작 위키 사이트는 다시 웹브라우저로 봅니다. 그리고 abilon 은 summary 가 없으면 빈 칸으로 나와서 다시 클릭을 해야 하지만 제가 쓰는 SharpReader 는 (이것도 예상대로 동작하지 않아서 좀 문제가 있는 듯 합니다만) summary 가 없으면 바로 페이지를 보여주니 더 낫더군요. \\ \\ rss 출력 내에 diff 를 보는 링크의 정보도 있는데 (wiki:diff) 정작 그 링크를 지원하는 리더를 못 찾았네요. 매우 아쉬운 부분입니다. http://jof4002.net/?action=rss 땜빵으로 넣어봤습니다. Jof:FireFox 에 라ㅤㅅㅠㅂ님이 적은 문제에 대해서 좀 시도를 해봤습니다만, 제가 Abilon을 안쓰기 때문에 [http://bloglines.com Blogline]에 대해서 해봤습니다. \\ 1. item rdf:about에 대해서 URLEncode 를 호출해서 넣어주면 Bloglines에서는 잘 열립니다. 뭐. 아빌론에서도 되지 않을까 싶네요. \\ 2. 그런데 그게 문제가 되는지 모르겠는데 현재 Jof:FireFox 에서 라이브 북마크를 보면 오히려 영어로 된 페이지 이름만 표시되고 있습니다. \\ 현재 회사고, 회사에서는 FTP가 안되는 관계로 더이상 테스트 불가입니다. -_-;;; \\ \\ 그리고 페이지 내용에 대해 걸리는 링크가 제대로 안되는 문제는 보니 블록라인이 utf-8을 쓰고 있고, 한글을 utf-8로 처리해서 링크를 보내기 때문에 생기는 문제더군요. 뭐 이것도 URLEncode 를 불러주면 될 것 같습니다만, 매우 귀찮습니다. : 2번 문제를 해결했습니다. \\ sub GetRssRcLine에서 $itemID = &QuoteHtml($itemID);를 $itemID = &URLEncode(&QuoteHtml($itemID));로 바꿔주기만 하면 양쪽 다 잘 될 것 같다는 것입니다. (원래는 URLEncode를 $headitem 업데이트 한 다음에 호출했었는데, 그것 때문에 문제가 됐었던 것 같네요.) \\ 확인 후 반영 부탁드립니다. :: 그러니까... 저 한 줄 수정만 하면 불여우 문제와 위 1번2번 전부 다 해결이란 건가요? 아니면 저 1번에 적힌 "URLEncode를 호출해서 넣어주면.."은 따로 하고 그와 별도로 위 한 줄 수정도 해야 한다는 건가요? 올불로그나 블로그코리아나 RSS수집이 안되서 올블로그에서 테스트를 해보니 에러가 나는군요. 뭔가 문제가 있는지.. 잘은 모르겠지만, 한RSS가 잘 해주고 있는 걸로봐서 올블로그가 이 버전의 RSS를 제대로 처리하지 못하는게 아닌가 생각됩니다. blog_rss 매크로의 출력과, 위키 자체의 action=rss 출력의 양식이 서로 다르거든요. 올블로그 쪽에 RSS주소를 알려주고 문의해 보시죠. : 쳇, 올블로그에 열심히 문의를 적었고 확인 버튼을 눌렀더니만 글쓰기 권한이 없다고 나오는군요. :-/ ::저런.. 허탈감이라니. 어디선가 괄호를 안닫은듯. 페이지가 이상하게 표시되요. {{{#!vim perl }}} 에서 사용했던 source-highlight 패키지가 버전업이 되면서 출력이 바뀌어 버리는 바람에... -_-;;; 이 페이지 뿐 아니라 저렇게 소스 코드를 표시한 페이지들은 지금 난리가 아닙니다. ㅠ,.ㅠ :아 그런거였군요. 저런~ 올블로그에 전체RSS등록하면, 한글이 깨져버리고 모노로그의 RSS를 등록하면 페이지가 제대로 표시가 되네요. 뭐가 차이가 나는 걸까요. : 음 글쎄요 전 올블로그는 등록을 안해서... 근데 예전부터 전체RSS(유즈모드에 단 RSS형식이... 전체RSS의 경우와 다이어리RSS가 버전과 형식이 다른 건 아시죠?)는 좀 이상했던것 같기도 하고... 잘 모르겠네요 ^^;;; :: 역시.. 그렇군요. 감사합니다. ---- [[위키위키분류]]
" . $date . "