[첫화면으로]UseModWiki소스수정/Include매크로모듈화

마지막으로 [b]

include* 매크로 모듈화

/매크로모듈화와 유사하게, 다른 페이지를 include하는 매크로들도 모듈로 추가, 삭제, 수정이 쉽도록 함.

sub includeday {         # 매크로이름과 함수이름을 똑같이
    my ($txt) = @_;
                         # 여기는 어떤 스트링을 치환할 지 인터페이스를 적어주고,
### 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 {     # 어떻게 치환할지 구체적인 동작을 하는 함수
    ...
        $temp = &MacroInclude($page);   # 최종적으로는 MacroInclude 를 불러서 원하는 페이지를 읽어와 합친다.
    ...
    return $result;
}

1;      # 마지막 줄은 항상 이렇게

wiki.pl 수정

MacroIncludeSubst()함수를 고친다.

sub MacroIncludeSubst {
    my ($txt) = @_;

    $txt =~ s/(^|\n)<include\((.*)\)>([\r\f]*\n)/$1 . &MacroInclude($2) . $3/geim;
### toc 를 포함하지 않는 includenotoc 매크로 추가
    $txt =~ s/(^|\n)<includenotoc\((.*)\)>([\r\f]*\n)/$1 . &MacroInclude($2, "notoc") . $3/geim;

### include 매크로 시리즈 모듈화
    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) = @_;

### 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;
}

1;

추가 업데이트 내역

사용자 의견

이름:  
Homepage:
내용:
 

위키위키분류

마지막 편집일: 2007-4-19 10:09 am (변경사항 [d])
834 hits | Permalink | 변경내역 보기 [h] | 페이지 소스 보기