오늘의 날짜를 기준으로 자동으로 계산한 날짜에 해당되는 페이지를 include 하는 매크로. 이를 사용한 유용한 활용법의 예로 위키의일기장화프로젝트 가 있다.
include day 매크로
include days 매크로
includeday(0), includeday(-1), ... ,includeday(-4) 와 같이 하여 '최근 5일 동안'의 일기를 한 페이지에 표시하게 할 경우를 생각해 보자. 매일 일기를 쓴다면 (즉 모든 날짜에 해당하는 페이지들이 전부 존재한다면) 이 페이지는 최근 다섯 편의 일기를 출력할 것이다. 그렇지만 만일 5일에 한 번 일기를 쓴다면? 그럼 저 페이지는 언제나 한 편의 일기밖에 출력할 수 없을 것이다. 일기 날짜의 간격에 관계없이, 항상 "최근 다섯 편"의 일기를 표시하게 할 수 없을까... 의 대답이 이 매크로의 제작 동기이다. :-)
sub MacroIncludeSubst { my ($txt) = @_; $txt =~ s/<include\((.*)\)>/&MacroInclude($1)/gei; $txt =~ s/<includenotoc\((.*)\)>/&MacroInclude($1, "notoc")/gei; ### includeday 매크로 $txt =~ s/(^|\n)(<includeday\(([^,\n]+,)?([-+]?\d+)\)>)([\r\f]*\n)/$1 . &MacroIncludeDay($2, $3, $4) . $5/geim; ### includedays 매크로 $txt =~ s/(^|\n)(<includedays\(([^,\n]+,)?([-+]?\d+),([-+]?\d+)\)>)([\r\f]*\n)/$1 . &MacroIncludeDay($2, $3, $4, $5) . $6/geim; return $txt; }
### 다음 함수를 통채로 추가 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; }
... # 날짜의 변위 계산 $temp = $Now + ($day_offset * 86400); my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($temp+$TimeZoneOffset); # 끝에 +$TimeZoneOffset 추가 ...
ext1.48c - 재수정되었습니다.
ext1.80 에서 별도의 파일로 분리되었습니다. /Include매크로모듈화
ext1.90 - /매크로파라메터에이중대괄호허용함