[첫화면으로]UseModWiki소스수정/IncludeDay매크로

마지막으로 [b]

IncludeDay 매크로, IncludeDays 매크로 추가

See also 다른페이지의내용을포함하여출력하기

오늘의 날짜를 기준으로 자동으로 계산한 날짜에 해당되는 페이지를 include 하는 매크로. 이를 사용한 유용한 활용법의 예로 Jof:위키의일기장화프로젝트 가 있다.

include day 매크로

include days 매크로

includeday(0), includeday(-1), ... ,includeday(-4) 와 같이 하여 '최근 5일 동안'의 일기를 한 페이지에 표시하게 할 경우를 생각해 보자. 매일 일기를 쓴다면 (즉 모든 날짜에 해당하는 페이지들이 전부 존재한다면) 이 페이지는 최근 다섯 편의 일기를 출력할 것이다. 그렇지만 만일 5일에 한 번 일기를 쓴다면? 그럼 저 페이지는 언제나 한 편의 일기밖에 출력할 수 없을 것이다. 일기 날짜의 간격에 관계없이, 항상 "최근 다섯 편"의 일기를 표시하게 할 수 없을까... 의 대답이 이 매크로의 제작 동기이다. :-)

wiki.pl 수정

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

Notes

2003-02-14 일자로 수정되었습니다. 사용자별로 timezone 을 처리하지 못하던 것을 고쳤습니다. 이미 적용한 경우는 다음 한 줄만 바꾸면 됩니다.
    ...
    # 날짜의 변위 계산
    $temp = $Now + ($day_offset * 86400);
    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($temp+$TimeZoneOffset);  # 끝에 +$TimeZoneOffset 추가
    ...
-- Raymundo 2003-2-14 12:33 pm


ext1.48 - includedays 매크로를 추가했습니다.
-- Raymundo 2003-9-8 2:04 am

멋지네요..근데 한가지 더..추가해주셨으면 하는 기능이..
예를 들어 (2003-08-01,2003-08-31) 이렇게 하면 8월1일부터 31일까지의 페이지를 다 인클루드하는 기능은 힘든가요?
-- Nyxity 2003-9-8 2:17 pm

그 생각을 안 한 것은 아닙니다만, 말씀하신 것같이 날짜가 고정되어 있는 경우는 include 를, 날짜는 자동으로 변하되 기간이 정해진 경우는 includeday 를 반복해서 적어주면 되기 때문에 (물론 31 번 반복해서 적어주려면 귀찮기는 하겠습니다만) 필요가 없다고 생각했습니다. 괜히 옥상옥을 만드는 느낌이 들어서요. 다음 번 업데이트때 includeperiod (? 좋은 이름을 지어주세요. ^^) 정도로 만들어 보지요.
-- Raymundo 2003-9-8 2:54 pm

음.. 방금 잠깐 작성해 보았는데... 예상 외로 신경써야 될 것들이 많네요. 머리가 아파서 포기... :-) 그냥 include 나 includedays 를 주욱 나열하는 게 낫겠습니다. ^^;;;
-- Raymundo 2003-9-8 3:25 pm

추가 업데이트 내역

ext1.48a - includedays 에서 페이지이름으로 쓸 수 없는 스트링을 인자로 주었을 때 includeday 라고 출력되는 것을 고쳤습니다.
-- Raymundo 2003-9-8 3:25 pm

ext1.48c - 재수정되었습니다.

-- Raymundo 2003-9-15 8:43 pm

ext1.80 에서 별도의 파일로 분리되었습니다. /Include매크로모듈화

-- Raymundo 2005-3-2 1:45 pm

ext1.90 - /매크로파라메터에이중대괄호허용

-- Raymundo 2005-11-19 6:05 pm

사용자 의견

이름:  
Homepage:
내용:
 

위키위키분류

마지막 편집일: 2007-3-22 12:59 pm (변경사항 [d])
1334 hits | Permalink | 변경내역 보기 [h] | 페이지 소스 보기