<calendar> 매크로 추가
- WikiX 에 있는 Calendar 매크로가 너무 부러워서... UseModWiki 에서 구현해 보았음.
- PHP 소스는 도저히 봐도 모르겠는터라.. ^^ 겉모양은 비슷하게 꾸몄지만 실제 코딩은 백지에서 시작했기 때문에, complexity 라던가 퍼포먼스에 자신이 없지만.. 그래도 그럭저럭 쓸만할 듯
- 일종의 subcalendar 를 지원할 수 있게 수정하였다.
- 필수 요구 사항 :
- /Comments매크로가 되어 있어야 한다.
- 안 되어 있을 경우, 아래 소스코드에서 $pageid 라는 변수를 $OpenPageName 으로 바꾸면 되는데, 완전히 동일하게 동작하는지 보장은 하지 못함
- 사용법 - <calendar([페이지이름,] [+/-]년,[+/-]월)>
- 자세한 내용은 Calendar매크로 를 참조하라.
- 2002년11월27일자로 인터페이스가 변경되었다. 원래는 페이지이름이 제일 마지막이었는데, 제일 앞에 두는 것이 직관적이라는 생각으로 옮겼다. (조프님께 감사)
- 부작용: 모름 (없다고 장담을 못하겠다)
- 이 홈페이지에서 보기 좋도록 적당히 꾸몄기 때문에, 이 홈페이지와 다른 스타일쉬트 화일을 사용하는 곳에서는 흉칙하게 보일 수 있다. html 문서를 꾸밀 때 스타일쉬트로 줄 수 있는 옵션과 태그 자체에 있는 옵션들이 제각각이라 주인장도 뭐가 뭔지 모른다. 좀 더 일관성 있게 (이왕이면 스타일쉬트를 쓰는 쪽으로 통일하는 것이 나을 듯) 태그 옵션을 주는 방향으로 고치는 게 좋겠다. 제보 환영. :-)
- "페이지이름"에 제일 뒤에 오는 기존의 패치를 이미 적용한 경우는 다음 라인만 바꿔주면 된다.
-
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 "<calendar($cal_year,$cal_month$cal_mainpage)>";
> return "<calendar($cal_mainpage$cal_year,$cal_month)>";
< $temp =~ s/^,//;
> $temp =~ s/,$//;
< return "<calendar($cal_year,$cal_month$cal_mainpage)>";
> return "<calendar($cal_mainpage$cal_year,$cal_month)>";
- 전체 소스
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;
if (!($cal_month =~ /[-+]/) && ($cal_month > 12)) {
return "<calendar($cal_mainpage$cal_year,$cal_month)>";
}
if (length($cal_mainpage) != 0) {
$temp = $cal_mainpage;
$temp =~ s/,$//;
$temp = &RemoveLink($temp);
$temp = &FreeToNormal($temp);
if (&ValidId($temp) ne "") {
return "<calendar($cal_mainpage$cal_year,$cal_month)>";
}
$temp =~ s/\/.*$//;
$cal_mainpage = "$temp/";
}
$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--;
}
}
$cal_year = 2037 if ($cal_year > 2037);
$cal_year = 1902 if ($cal_year < 1902);
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>";
$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) {
($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>";
last if (($mon+1 > $cal_month) || ($year+1900 > $cal_year));
}
$result .= "</table>";
return $result;
}
- Time::Local 모듈이 설치되어 있어야 한다. 아마 설치되어 있을 것이다. 만일 모듈이 없다고 에러가 난다면.. 재주껏 설치하도록.. 어떻게 설치하는지 본인도 모름. :-)
- 위에 보면 &RemoveLink 라는 함수가 있다. 이 함수를 새로 만들어 주어야 한다. 별도의 섹션에서 다루겠다.
추가 업데이트 내역
- ext1.57a - 날짜 페이지를 /페이지숨김으로 숨겼을 경우에도 달력에 녹색으로 표시되는 문제를 수정.
- ext1.60f - 조프님 홈페이지처럼, 현재 보고 있는 페이지 이름이 달력의 날짜일 경우 그 날짜 부분을 별도로 표시하게 했습니다. 그리고 언제부터인가 MacroCalendar 함수가 바뀌었는데도 여기에는 이전 소스가 나와 있길래 함수 부분의 소스를 통채로 다시 올렸습니다. 실제로 1.60f 에서 바뀐 것은 아래 세 줄이 추가된 것 뿐입니다. UseModWiki스타일쉬트에 calendarthispage 와 calendartodaythispage 두 가지가 추가되어야 합니다.
if ($pageid eq $cal_mainpage.$cal_page) {
$td_class .= "thispage";
}
ext1.90 - /매크로파라메터에이중대괄호허용함
Notes
2003-02-08 일자로 MacroCalendar 함수를 약간 바꿨습니다. 달이나 일이 한 자리수일 때, 2003-2-8 과 같은 식으로 링크를 거니까 페이지 정렬시에 아무래도 불편한 듯 하여서, 2003-02-08 과 같이 두 자리로 맞춰서 링크를 걸도록 하였습니다. 위의 함수를 통채로 다시 덮어 쓰던가, 아니면 주석문에 "(새로 추가)" 라고 되어 있는 부분을 찾아서 그 단락만 추가해 주시면 됩니다. 그리고, 소스를 수정한 후에는 기존의 2003-2-8 페이지는 달력을 통해 들어갈 수도 없고, 페이지가 있다 하더라도 달력에 표시도 되지 않게 됩니다. 따라서 관리 메뉴에 들어가서 수작업으로 바꾸어 주셔야 합니다.
2003-02-14 일자로 다시 수정되었습니다. 사용자 별로 환경설정에서 timezone 을 지정한 것이 적용되지 않던 것을 고쳤습니다. 위의 패치를 이미 적용한 경우는 다음 한 줄만 다시 바꾸시면 됩니다.
...
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);
...
위키위키분류