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

마지막으로 [b]

<prevupnext(페이지)> 매크로

Diary와 같이 하위페이지들이 날짜별로 소팅되어 있는 경우는 /사용자추가매크로에 있는 <prevnextdiary>를 써서 이전 페이지와 다음 페이지로 가는 링크를 달 수가 있는데, PalmWiki:DateBk5매뉴얼와 같이 하위페이지들의 이름과 순서가 전혀 연관이 없는 경우는 자동으로 링크를 달 수가 없다. 이런 경우 일일이 링크를 달아주거나, 아니면 매번 목차 페이지로 되돌아가서 다음 페이지로 넘어가야 한다.

이 매크로는 목차 페이지를 보고 현재 읽고 있는 페이지의 다음 페이지를 자동으로 찾아준다.

주저리주저리...       <-- 다른 줄은 무시된다.
* [[/서문]]           <-- 왼쪽과 같이, "*"나 "#"로 시작하는 리스트들만이 목차로 사용된다.
# [[/요약]]
# [[/목차]]           <-- 이런 식으로 [[/하위페이지]]의 형태들은 전부 [[목차/하위페이지]]또는
# [[/서론]]입니다.        [[목차페이지의 상위페이지/하위페이지]]로 처리된다.
# [[/본론]]
# 주러지주저리...     <-- 페이지에 대한 링크가 없는 줄도 무시된다.
주저리주저리..        <-- 역시 무시되고
## [[/작은절하나]]    <-- 여기부터 다시 목차에 포함
## /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]";
    }

# "/서브페이지" 형태의 경우 링크가 잘못 걸리는 것을 막기 위해 MainPage
# 변수를 바꿔치기해야 함
    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
위

추가 업데이트 내역

사용자 의견

<이전페이지 | 위 | 목차 | 다음페이지>
이런식으로 표시할 수는 없을까요?
-- Nyxity 2006-4-3 10:21 am

모양을 바꾸고 싶은 거라면 저기 "# 출력"이라고 되어 있는 아래 부분이 html 출력하는 부분이니 적당이 고쳐주시면 되고, 아예 페이지 이름이 나오는게 아니라 "이전페이지"라는 명칭이 나오게 하고 싶은 거라면... 좀 애매하네요.
-- Raymundo 2006-4-3 3:38 pm

알겠습니다. 감사.
-- Nyxity 2006-4-3 3:45 pm
이름:  
Homepage:
내용:
 

위키위키분류

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