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

마지막으로 [b]

<calendar> 매크로 추가

MacroSubst 안에서
<   $txt =~ s/\&__LT__;calendar\(([-+]?\d+),([-+]?\d+)(,[^\n)]+)?\)\&__GT__;/&MacroCalendar($1, $2, $3)/gei;
>   $txt =~ s/\&__LT__;calendar\(([^,\n]+,)?([-+]?\d+),([-+]?\d+)\)\&__GT__;/&MacroCalendar($1, $2, $3)/gei;

MacroCalendar 안에서
<   my ($cal_year, $cal_month, $cal_mainpage) = @_;
>   my ($cal_mainpage, $cal_year, $cal_month) = @_;

<       return "&lt;calendar($cal_year,$cal_month$cal_mainpage)&gt;";
>       return "&lt;calendar($cal_mainpage$cal_year,$cal_month)&gt;";

<       $temp =~ s/^,//;
>       $temp =~ s/,$//;

<           return "&lt;calendar($cal_year,$cal_month$cal_mainpage)&gt;";
>           return "&lt;calendar($cal_mainpage$cal_year,$cal_month)&gt;";

전체 소스
sub MacroSubst {
    ...
### 다음 라인 추가
    $txt =~ s/\&__LT__;calendar\(([^,\n]+,)?([-+]?\d+),([-+]?\d+)\)\&__GT__;/&MacroCalendar($1, $2, $3)/gei;
###
    return $txt;
}
### 다음 함수를 적당한 곳에 추가
sub MacroCalendar {
    use Time::Local;
    my ($cal_mainpage, $cal_year, $cal_month) = @_;

    my $result='';
    my $cal_result='';
    my $cal_page;
    my @cal_color = ("red", "black", "black", "black", "black", "black", "blue", "green");
    my @cal_dow = (T('Su'), T('Mo'), T('Tu'), T('We'), T('Th'), T('Fr'), T('Sa'));
    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($Now+$TimeZoneOffset);
    my ($this_year, $this_month, $this_day) = ($year, $mon, $mday);
    my $cal_time;
    my ($td_class, $span_style);
    my $temp;

    # 달의 값이 13 이상이면 무효
    if (!($cal_month =~ /[-+]/) && ($cal_month > 12)) {
        return "&lt;calendar($cal_mainpage$cal_year,$cal_month)&gt;";
    }

    # prefix 처리
    if (length($cal_mainpage) != 0) {
        $temp = $cal_mainpage;
        $temp =~ s/,$//;
        $temp = &RemoveLink($temp);
        $temp = &FreeToNormal($temp);
        if (&ValidId($temp) ne "") {
            return "&lt;calendar($cal_mainpage$cal_year,$cal_month)&gt;";
        }
        $temp =~ s/\/.*$//;
        $cal_mainpage = "$temp/";
    }

    # 년도나 달에 0 을 인자로 받으면 올해 또는 이번 달
    $cal_year = $this_year+1900 if ($cal_year == 0);
    $cal_month = $this_month+1 if ($cal_month == 0);

    # 년도에 + 또는 - 가 있으면 올해로부터 변위 계산
    if ($cal_year =~ /\+(\d+)/ ) {
        $cal_year = $this_year+1900 + $1;
    } elsif ($cal_year =~ /-(\d+)/ ) {
        $cal_year = $this_year+1900 - $1;
    }

    # 달에 + 또는 - 가 있으면 이번 달로부터 변위 계산
    if ($cal_month =~ /\+(\d+)/ ) {
        $cal_month = $this_month+1 + $1;
        while ($cal_month > 12)  {
            $cal_month -= 12;
            $cal_year++;
        }
    } elsif ($cal_month =~ /-(\d+)/ ) {
        $cal_month = $this_month+1 - $1;
        while ($cal_month < 1) {
            $cal_month += 12;
            $cal_year--;
        }
    }

    # 1902년부터 2037년 사이만 지원함. 그 범위를 벗어나면 1902년과 2037년으로 계산
    $cal_year = 2037 if ($cal_year > 2037);
    $cal_year = 1902 if ($cal_year < 1902);

    # 1월~9월은 01~09로 만듦
    if ($cal_month < 10) {
        $cal_month = "0" . $cal_month;
    }

    # 달력 제목 출력
    $result .= "<TABLE class='calendar'>";
    $result .= "<CAPTION class='calendar'>"
        ."<a href=\"$ScriptName?$cal_mainpage$cal_year-$cal_month\">"
        .(length($cal_mainpage)?"$cal_mainpage<br>":"")
        ."$cal_year-$cal_month"
        ."</a>"
        ."</CAPTION>";

    # 상단의 요일 출력
    $result .= "<TR class='calendar'>";
    for (0..6) {
        $result .= "<TH class='calendar'>"
            . "<span style='color:$cal_color[$_]'>$cal_dow[$_]</span></TH>";
    }
    $result .= "</TR>";

    # 인자로 주어진 달의 1일날을 찾음
    $cal_time = timelocal(0,0,0,1,$cal_month-1,$cal_year);
    ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($cal_time);
    # 달력의 첫번째 날 찾음
    $cal_time -= $wday * (60 * 60 * 24);
    ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($cal_time);

    # 달력 그림
    my ($temp_month, $temp_day);

    for (1..6) {
        $result .= "<TR class='calendar'>";
        for (0..6) {

            # 1~9는 01~09로 만듦
            ($temp_month, $temp_day) = ($mon + 1, $mday);
            $temp_month = "0".$temp_month if ($temp_month < 10);
            $temp_day = "0".$temp_day if ($temp_day < 10);
            $cal_page = ($year + 1900)."-".($temp_month)."-".($temp_day);

            $cal_result = $mday;
            $span_style = "";
            if (($year == $this_year) && ($mon == $this_month) && ($mday == $this_day)) {
                $td_class = "calendartoday";
                $span_style = "text-decoration: underline; ";
            } else {
                $td_class = "calendar";
            }
            if ($pageid eq $cal_mainpage.$cal_page) {
                $td_class .= "thispage";
            }

            if ((-f &GetPageFile($cal_mainpage . $cal_page)) && (!&PageIsHidden($cal_mainpage . $cal_page))) {
                $span_style .= "font-weight: bold; text-decoration: underline; ";
                $wday = 7;
            }
            if ($cal_month != ($mon+1)) {
                $span_style .= "font-size: 0.9em; ";
            }

            $result .= "<td class='$td_class'>"
                ."<a href=\"$ScriptName?$cal_mainpage$cal_page\">"
                ."<span style='color:$cal_color[$wday]; $span_style'>"
                .$cal_result
                ."</span></a></td>";
            $cal_time += (60 * 60 * 24);
            ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($cal_time);
        }
        $result .= "</TR>";
        # 4 또는 5 줄로 끝낼 수 있으면 끝냄
        last if (($mon+1 > $cal_month) || ($year+1900 > $cal_year));
    }

    $result .= "</table>";
    return $result;
}

추가 업데이트 내역

            if ($pageid eq $cal_mainpage.$cal_page) {
                $td_class .= "thispage";
            }

ext1.90 - /매크로파라메터에이중대괄호허용
-- Raymundo 2005-11-19 6:06 pm

Notes

2003-02-08 일자로 MacroCalendar 함수를 약간 바꿨습니다. 달이나 일이 한 자리수일 때, 2003-2-8 과 같은 식으로 링크를 거니까 페이지 정렬시에 아무래도 불편한 듯 하여서, 2003-02-08 과 같이 두 자리로 맞춰서 링크를 걸도록 하였습니다. 위의 함수를 통채로 다시 덮어 쓰던가, 아니면 주석문에 "(새로 추가)" 라고 되어 있는 부분을 찾아서 그 단락만 추가해 주시면 됩니다. 그리고, 소스를 수정한 후에는 기존의 2003-2-8 페이지는 달력을 통해 들어갈 수도 없고, 페이지가 있다 하더라도 달력에 표시도 되지 않게 됩니다. 따라서 관리 메뉴에 들어가서 수작업으로 바꾸어 주셔야 합니다.
-- Raymundo 2003-2-8 12:01 pm

2003-02-14 일자로 다시 수정되었습니다. 사용자 별로 환경설정에서 timezone 을 지정한 것이 적용되지 않던 것을 고쳤습니다. 위의 패치를 이미 적용한 경우는 다음 한 줄만 다시 바꾸시면 됩니다.
    ...
    my @cal_dow = (T('Su'), T('Mo'), T('Tu'), T('We'), T('Th'), T('Fr'), T('Sa'));
    # 다음 줄 끝에 +$TimeZoneOffset 을 추가
    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($Now+$TimeZoneOffset);
    #
    my ($this_year, $this_month, $this_day) = ($year, $mon, $mday);
    ...
-- Raymundo 2003-2-14 12:30 pm

위키위키분류

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