include* 매크로 모듈화
/매크로모듈화와 유사하게, 다른 페이지를 include하는 매크로들도 모듈로 추가, 삭제, 수정이 쉽도록 함.
- 사용법:
- /매크로모듈화와 유사. 새로운 매크로를 만드는 법은 UseModWiki매크로를 보라.
- mymacros 또는 macros 디렉토리 안에 "매크로이름.pl"로 집어넣을 것.
- 매크로이름은 반드시 include라는 문자열을 포함해야 한다
- 제일 기본적인 MacroInclude 함수는 그냥 wiki.pl 안에 있다. 따라서 다른 include*** 매크로들은 이 MacroInclude를 최종적으로 부르는 것을 권장함.
- 예: /IncludeDay매크로의 경우, macros/includeday.pl 이라는 이름으로 저장하고, 그 내용은 다음과 같다.
sub includeday {
my ($txt) = @_;
$txt =~ s/(^|\n)(<includeday\(([^,\n]+,)?([-+]?\d+)\)>)([\r\f]*\n)/$1 . &MacroIncludeDay($2, $3, $4) . $5/geim;
$txt =~ s/(^|\n)(<includedays\(([^,\n]+,)?([-+]?\d+),([-+]?\d+)\)>)([\r\f]*\n)/$1 . &MacroIncludeDay($2, $3, $4, $5) . $6/geim;
return $txt;
}
sub MacroIncludeDay {
...
$temp = &MacroInclude($page);
...
return $result;
}
1;
- 부작용: 없으리라 생각함.
- 주의: /매크로모듈화에서는 &__LT__;와 &__GT__;가 구분자이지만, include의 경우는 부등호가 치환되기 전에 불리는 것이니 <와 >를 구분자로 해야 한다. (이 페이지에 관심을 가질 만한 사람이라면 무슨 말인지 알 것이다)
wiki.pl 수정
MacroIncludeSubst()함수를 고친다.
sub MacroIncludeSubst {
my ($txt) = @_;
$txt =~ s/(^|\n)<include\((.*)\)>([\r\f]*\n)/$1 . &MacroInclude($2) . $3/geim;
$txt =~ s/(^|\n)<includenotoc\((.*)\)>([\r\f]*\n)/$1 . &MacroInclude($2, "notoc") . $3/geim;
my $macroname;
my ($MacrosDir, $MyMacrosDir) = ("./macros/", "./mymacros/");
foreach my $dir ($MacrosDir, $MyMacrosDir) {
foreach my $macrofile (glob("$dir/*include*.pl")) {
if ($macrofile =~ m|$dir/([^/]*).pl|) {
$macroname = $1;
$MacroFile{"$macroname"} = $macrofile;
}
}
}
foreach my $macro (sort keys %MacroFile) {
if ($txt =~ /(&__LT__;|<)$macro/i) {
require "$MacroFile{$macro}";
$txt = &{\&$macro}($txt);
}
}
return $txt;
}
기존에 /IncludeDay매크로를 담당했던 MacroIncludeDay() 함수는 통채로 삭제해준다.
macros/includeday.pl 추가
기존에 /IncludeDay매크로를 담당했던 부분을 별도의 파일로 옮김.
sub includeday {
my ($txt) = @_;
$txt =~ s/(^|\n)(<includeday\(([^,\n]+,)?([-+]?\d+)\)>)([\r\f]*\n)/$1 . &MacroIncludeDay($2, $3, $4) . $5/geim;
$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;
}
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;
}
1;
추가 업데이트 내역
사용자 의견
위키위키분류