<prevupnext(페이지)> 매크로
Diary와 같이 하위페이지들이 날짜별로 소팅되어 있는 경우는 /사용자추가매크로에 있는 <prevnextdiary>를 써서 이전 페이지와 다음 페이지로 가는 링크를 달 수가 있는데, DateBk5매뉴얼와 같이 하위페이지들의 이름과 순서가 전혀 연관이 없는 경우는 자동으로 링크를 달 수가 없다. 이런 경우 일일이 링크를 달아주거나, 아니면 매번 목차 페이지로 되돌아가서 다음 페이지로 넘어가야 한다.
이 매크로는 목차 페이지를 보고 현재 읽고 있는 페이지의 다음 페이지를 자동으로 찾아준다.
- 필수 요구 사항: 없음
- 선택 요구 사항:
- 이 패치는 /매크로모듈화가 되어 있는 상태에서 작성된 것이다. 모듈화가 되어 있지 않으면 아래 소스를 wiki.pl에 직접 추가해 줄 것
- 사용법: <prevupnext(페이지이름)>
- "페이지이름"은 자신이 목차를 작성해 둔 페이지의 이름을 적어준다.
- 목차 페이지는 다음과 같이 작성한다.
주저리주저리... <-- 다른 줄은 무시된다.
* [[/서문]] <-- 왼쪽과 같이, "*"나 "#"로 시작하는 리스트들만이 목차로 사용된다.
# [[/요약]]
# [[/목차]] <-- 이런 식으로 [[/하위페이지]]의 형태들은 전부 [[목차/하위페이지]]또는
# [[/서론]]입니다. [[목차페이지의 상위페이지/하위페이지]]로 처리된다.
# [[/본론]]
# 주러지주저리... <-- 페이지에 대한 링크가 없는 줄도 무시된다.
주저리주저리.. <-- 역시 무시되고
## [[/작은절하나]] <-- 여기부터 다시 목차에 포함
## /SubSctionTwo <-- [[ ]]형태가 아니라 WikiName을 이용한 링크도 가능
# AnotherPage <-- 반드시 하위페이지가 아니라도 상관없다
# [[/결론]]
- 이 매크로가 들어 있던 페이지로 가는 링크를 해당 목차에서 찾아서, 그 이전 항목과 다음 항목을 출력해준다.
- 부작용: 딱히 부작용의 여지는 없으나, 목차가 복잡할 경우 오동작할 가능성도 있어 보임. 테스트하는 동안은 별 문제 없었음.
wiki.pl 수정
수정할 것 없음
macros/prevupnext.pl 추가
(/매크로모듈화를 적용하지 않은 경우는 기존의 다른 매크로를 참조해서 wiki.pl에 직접 추가해 준다)
$MacroFunc{"prevupnext"} = \&prevupnext;
sub prevupnext {
my ($txt) = @_;
$txt =~ s/(&__LT__;prevupnext\((.*?)\)&__GT__;)/&MacroPrevUpNext($1,$2)/gei;
return $txt;
}
sub MacroPrevUpNext() {
my ($itself, $tocpage) = @_;
my $temp;
my ($mainpage, $subpage);
my $txt;
$temp = $tocpage;
$temp = &RemoveLink($temp);
$temp = &FreeToNormal($temp);
if (&ValidId($temp) ne "") {
return "[Invald id: ".&ValidId($temp)."]";
}
$tocpage = $temp;
my ($toc_mainpage, $toc_subpage);
if ($tocpage =~ m|(.*)/(.*)|) {
($toc_mainpage, $toc_subpage) = ($1,$2);
} else {
$toc_mainpage = $tocpage;
}
my ($fname, $status, $data);
$fname = &GetPageFile($tocpage);
if (!(-f $fname)) {
return "[No such page: $tocpage]";
}
($status, $data) = &ReadFile($fname);
if (!$status) {
return "[Error in read pagefile: $tocpage]";
}
my %temp_Page = split(/$FS1/, $data, -1);
my %temp_Section = split(/$FS2/, $temp_Page{'text_default'}, -1);
my %temp_Text = split(/$FS3/, $temp_Section{'data'}, -1);
my $tocpage_Text = $temp_Text{'text'};
my @tocpage_Lines = split('\n',$tocpage_Text);
my @tocitem_List;
foreach my $line (@tocpage_Lines) {
if ($line =~ m/^(\*|#)+\s*(.*)\s*$/) {
my $item = $2;
if ($item =~ m/$LinkPattern|(\[\[$FreeLinkPattern(|[^]]+)?\]\])/) {
push(@tocitem_List, $item);
}
}
}
if ($OpenPageName =~ m|(.*)/(.*)|) {
($mainpage, $subpage) = ($1,$2);
} else {
$mainpage = $OpenPageName;
}
my $idx = 0;
for ($idx = 0; $idx <= $#tocitem_List; $idx++) {
my $line = $tocitem_List[$idx];
if ($line =~ m/\[\[$FreeLinkPattern(\|[^\]]+)?\]\]/) {
my $link = $1;
$link =~ s/ /_/g;
if (($link eq $OpenPageName) || ($link eq "/$subpage")) {
last;
}
} elsif ($line =~ m/$LinkPattern/) {
my $link = $1;
$link =~ s/ /_/g;
if (($link eq $OpenPageName) || ($link eq "/$subpage")) {
last;
}
}
}
my ($prev, $toc, $next);
if ($idx > $#tocitem_List) {
return "[Not found this page:$OpenPageName in TOC]";
}
my $mainPage_backup = $MainPage;
$MainPage = $toc_mainpage;
$prev = &CommonMarkup($tocitem_List[$idx-1],0,1) if ($idx > 0);
$next = &CommonMarkup($tocitem_List[$idx+1],0,1) if ($idx < $#tocitem_List);
$up = &GetPageLink($mainpage) if ($subpage ne '');
$toc = &GetPageLink($tocpage);
$MainPage = $mainPage_backup;
$txt = "<B>";
$txt .= &T('Prev')." : $prev<BR>";
$txt .= &T('Next')." : $next<BR>";
$txt .= &T('Up')." : $up<BR>" if ($up ne '');
$txt .= &T('TOC')." : $toc";
$txt .= "</B>";
return $txt;
}
1;
translations/korean.pl 수정
다음 항목 추가
Prev
이전
Next
다음
TOC
목차
Up
위
추가 업데이트 내역
사용자 의견
<이전페이지 | 위 | 목차 | 다음페이지>
이런식으로 표시할 수는 없을까요?
모양을 바꾸고 싶은 거라면 저기 "# 출력"이라고 되어 있는 아래 부분이 html 출력하는 부분이니 적당이 고쳐주시면 되고, 아예 페이지 이름이 나오는게 아니라 "이전페이지"라는 명칭이 나오게 하고 싶은 거라면... 좀 애매하네요.
- 알겠습니다. 감사.
위키위키분류