UseModWiki소스수정/IncludeDay매크로 페이지의 소스 보기
마지막으로 [b]
-- Loading page list... --
내용출력
로그인[l]
Diary
[f]
최근변경내역
[r]
페이지목록[i]
횡설수설[2]
게시판[3]
링크
수정할 수 없습니다: UseModWiki소스수정/IncludeDay매크로 는 읽기 전용 페이지입니다.
== IncludeDay 매크로, IncludeDays 매크로 추가 == See also [[다른페이지의내용을포함하여출력하기]] 오늘의 날짜를 기준으로 자동으로 계산한 날짜에 해당되는 페이지를 include 하는 매크로. 이를 사용한 유용한 활용법의 예로 Jof:위키의일기장화프로젝트 가 있다. '''include day 매크로''' * 사용법 - <includeday([페이지이름,] [+/-]숫자)> ** 숫자는 오늘 날짜로부터의 간격을 의미한다. 0 은 오늘, 2 또는 +2 는 이틀 후, -3 은 사흘 전... ** 페이지 이름이 없을 경우는 위에서 계산한 날짜에 해당되는 페이지를 include 한다. ** 페이지 이름을 인자로 주면, "페이지이름/계산된날짜" 에 해당하는 페이지를 include 한다. ** 페이지 이름이 올바르지 않은 문자열일 경우는 치환되지 않는다. ** 예: 오늘이 2003년 9월 8일일 경우, includeday(일기,-3) 은 "일기/2003-09-05" 페이지를 include 하게 된다. 내일이 되면 이 매크로는 "일기/2003-09-06" 페이지를 include 할 것이다. ** 매크로의 앞뒤에는 공백을 비롯한 다른 문자가 오면 안 된다. '''include days 매크로''' includeday(0), includeday(-1), ... ,includeday(-4) 와 같이 하여 '최근 5일 동안'의 일기를 한 페이지에 표시하게 할 경우를 생각해 보자. 매일 일기를 쓴다면 (즉 모든 날짜에 해당하는 페이지들이 전부 존재한다면) 이 페이지는 최근 다섯 편의 일기를 출력할 것이다. 그렇지만 만일 5일에 한 번 일기를 쓴다면? 그럼 저 페이지는 언제나 한 편의 일기밖에 출력할 수 없을 것이다. 일기 날짜의 간격에 관계없이, 항상 "최근 다섯 편"의 일기를 표시하게 할 수 없을까... 의 대답이 이 매크로의 제작 동기이다. :-) * 사용법 - <includedays([페이지이름,] [+/-]숫자, [+/-]숫자)> ** 페이지 이름과 첫번째 숫자는 includeday 매크로와 동일하다 ** 세번째 인자인 숫자의 갯수만큼의 "존재하는" 페이지를 include 한다. ** 세번째 인자의 부호가 "-" 이면 이전 날짜로, "+" 또는 부호가 없으면 이후 날짜로 이동하며 탐색한다. ** 예를 들어 두 숫자가 0,-5 라면, "오늘부터 시작해서 과거로 거슬러가며 존재하는 날짜 페이지 5개를 각각 include" 하게 된다. ** 세번째 인자의 숫자만큼의 페이지를 찾아내지 못했을 경우에도 시작 날짜를 중심으로 전후 100 일 이내의 페이지들만을 검사한다. (무한정 검색할 수는 없기 때문) ** 만일 날짜 페이지 중에 "페이지는 존재하지만 내용은 아무것도 없는" 페이지의 경우는 "존재하는" 페이지로 간주한다. ** 매크로의 앞뒤에는 공백을 비롯한 다른 문자가 오면 안 된다. * 부작용: 아직 모름 ** include 되는 대상 페이지 내에 또다시 include 문이 들어 있지 않도록 주의하라. 현재 테스트해 본 바로는 큰 문제는 없으나, 나중에라도 include 관련 루틴이 변경될 경우 무한루프에 빠질 가능성이 있다. === wiki.pl 수정 == : {{{#!vim perl sub MacroIncludeSubst { my ($txt) = @_; $txt =~ s/
/&MacroInclude($1)/gei; $txt =~ s/
/&MacroInclude($1, "notoc")/gei; ### includeday 매크로 $txt =~ s/(^|\n)(
)([\r\f]*\n)/$1 . &MacroIncludeDay($2, $3, $4) . $5/geim; ### includedays 매크로 $txt =~ s/(^|\n)(
)([\r\f]*\n)/$1 . &MacroIncludeDay($2, $3, $4, $5) . $6/geim; return $txt; } }}} : {{{#!vim perl ### 다음 함수를 통채로 추가 sub MacroIncludeDay { my ($itself, $mainpage, $day_offset, $num_days) = @_; my $page = ""; my $temp; my $result = ""; my ($sign, $num); if ($num_days =~ /([-+]?(\d+))/) { $num = $2; $sign = $1 / $num if ($num != 0); } else { $num = -1; } # main page 처리 if ($mainpage ne "") { $temp = $mainpage; $temp =~ s/,$//; $temp = &RemoveLink($temp); $temp = &FreeToNormal($temp); if (&ValidId($temp) ne "") { return $itself; } $temp =~ s/\/.*$//; $mainpage = $temp . "/"; } # 날짜의 변위 계산 my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst); my $maximum_count = 100; while (($num != 0) && ($maximum_count > 0)) { $temp = $Now + ($day_offset * 86400); ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($temp+$TimeZoneOffset); $page = $mainpage . ($year + 1900) . "-"; if ($mon + 1 < 10) { $page .= "0"; } $page .= ($mon + 1) . "-"; if ($mday < 10) { $page .= "0"; } $page .= "$mday"; $temp = &MacroInclude($page); if ($num == -1) { $result .= $temp; last; } else { if ($temp ne "") { $num--; $result .= $temp . "\n"; } $day_offset += $sign; } $maximum_count--; } return $result; } }}} == Notes == 2003-02-14 일자로 수정되었습니다. 사용자별로 timezone 을 처리하지 못하던 것을 고쳤습니다. 이미 적용한 경우는 다음 한 줄만 바꾸면 됩니다. {{{#!vim perl ... # 날짜의 변위 계산 $temp = $Now + ($day_offset * 86400); my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($temp+$TimeZoneOffset); # 끝에 +$TimeZoneOffset 추가 ... }}}
---- ext1.48 - includedays 매크로를 추가했습니다.
---- 멋지네요..근데 한가지 더..추가해주셨으면 하는 기능이..\\ 예를 들어 (2003-08-01,2003-08-31) 이렇게 하면 8월1일부터 31일까지의 페이지를 다 인클루드하는 기능은 힘든가요?
: 그 생각을 안 한 것은 아닙니다만, 말씀하신 것같이 날짜가 고정되어 있는 경우는 include 를, 날짜는 자동으로 변하되 기간이 정해진 경우는 includeday 를 반복해서 적어주면 되기 때문에 (물론 31 번 반복해서 적어주려면 귀찮기는 하겠습니다만) 필요가 없다고 생각했습니다. 괜히 옥상옥을 만드는 느낌이 들어서요. 다음 번 업데이트때 includeperiod (? 좋은 이름을 지어주세요. ^^) 정도로 만들어 보지요.
: 음.. 방금 잠깐 작성해 보았는데... 예상 외로 신경써야 될 것들이 많네요. 머리가 아파서 포기... :-) 그냥 include 나 includedays 를 주욱 나열하는 게 낫겠습니다. ^^;;;
== 추가 업데이트 내역 == ext1.48a - includedays 에서 페이지이름으로 쓸 수 없는 스트링을 인자로 주었을 때 includeday 라고 출력되는 것을 고쳤습니다.
ext1.48c - 재수정되었습니다.
ext1.80 에서 별도의 파일로 분리되었습니다. [[/Include매크로모듈화]]
ext1.90 - [[/매크로파라메터에이중대괄호허용]]함
=== 사용자 의견 ===
---- [[위키위키분류]]
UseModWiki소스수정/IncludeDay매크로
페이지로 돌아가기 |
다른 수정본 보기