[첫화면으로]UseModWiki소스수정/동적Template

마지막으로 [b]

1. 출력할 때 적용되는 동적 Template
1.1. 사용법
1.1.1. 템플릿을 사용하려는 페이지 쪽에서
1.1.2. 텟플릿 페이지 쪽에서
1.1.3. 사용예 - Diary의 경우
1.1.4. template 매크로
1.2. include, template, 동적template
1.3. 문제점 또는 한계
1.3.1. 단순히 본문 전체 삽입밖에 못 함
1.3.2. 템플릿으로 옮길 수 없는 것들
1.4. wiki.pl 수정
1.5. 추가 업데이트 내역
1.6. 사용자 의견

1. 출력할 때 적용되는 동적 Template

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

어떤 페이지를 출력할 때, 지정한 템플릿 페이지를 읽어서 그 템플릿 페이지 안에 내용을 넣은 후 마크업한다.

Jof:OrzWiki에 적힌 아이디어를 구현

1.1. 사용법

1.1.1. 템플릿을 사용하려는 페이지 쪽에서

REDIRECT나 /EXTERN명령어처럼, 페이지 제일 처음에 다음과 같이 적어준다.
#TEMPLATE 템플릿페이지이름
또는
#TEMPLATE [[템플릿페이지이름]]
둘 중 어느 쪽이든 상관없으니, 한글페이지라고 해서 굳이 대괄호를 붙여줄 필요는 없다.
그렇지만 대괄호를 써 주면 링크를 건 것으로 처리가 되니 역링크 보기 등에서 볼 수 있어 더 좋음

1.1.2. 텟플릿 페이지 쪽에서

템플릿 페이지 쪽에서는, <template_text>매크로를 써서, 다른 페이지가 삽입될 위치를 지정해 준다.
주저리주저리
<template_text>
이러쿵저러쿵

1.1.3. 사용예 - Diary의 경우

매일매일의 일기는 테이블에 TD 안에 들어가므로, 테이블을 시작하고 TD를 여는 역할을 하는 Diary/Header와, TD를 닫고 나머지 테이블 항목(날짜니 최근 커멘트니..)을 출력하는 Diary/Footer를 만들어 준 다음, 개별 일기마다 Header와 Footer를 include시켜주는 구문이 들어가야 했다. 뭐 /Template을 쓰면 편집할 때 채워주긴 하지만. 나중에 페이지 소스를 볼 때 위아래로 복잡하게 붙은 데다가, 나중에 다이어리 디자인을 바꾸려고 하면 header footer 각각 신경써 주어야 한다.

(게다가 더 큰 문제는, header나 footer 페이지 자체를 볼 때 와자작 깨지는 걸 막으려고, header페이지에는 footer의 역할을 해 줄 내용을 또 적어주고, 그걸 Noinclude로 감싸주고, footer는 반대로 header 역할을 할 내용을 noinclude로 감싸서 적어주는 식으로 해야 했다는 것. 이것 때문에 한번 고치려면 머리가 아프다)

그러나 동적 템플릿을 쓰면,

1.1.4. template 매크로

동적 템플릿 페이지에도 /TemplateMacro를 적어줄 수 있다. (쓸 일이 있겠나 싶긴 한데) 예를 들어 동적템플릿에 <template_pagename>을 적어 두면, 출력할 때 그 자리는 템플릿을 사용하는 페이지 이름이 나온다. <template_date>같은 경우는 출력하는 시점의 날짜가 출력될 것이다. (출력할 때 치환되니까) 즉 <date> 매크로와 동일해짐

(지금 구현되어 있는 /TemplateMacro들이 단순하게 이름이나 날짜 출력하는 정도라서, 그냥 새 페이지를 만들때 쓰이는 매크로를 공유를 하는데, 나중에라도 복잡한 매크로가 추가되면 둘을 구분해야 할지도)

1.2. include, template, 동적template

내가 고치거나 새로 만들면서 스스로도 헷갈릴 지경이라, 다른페이지의내용을포함하여출력하기에 정리함

1.3. 문제점 또는 한계

1.3.1. 단순히 본문 전체 삽입밖에 못 함

템플릿 페이지의 특정한 한 곳에 통채로 삽입하는 수준밖에 안 된다. "첫번째 섹션만 떼어내어 왼쪽에 출력하고 나머지 내용은 오른쪽에 출력하고..." 이런 식으로 템플릿을 구성하는 건 못하니, 결국 include의 역함수(?) 버전 정도로 생각하면 될 듯.

순전히 Diary를 위해 태어난 (사실 이곳의 많은 매크로들이 다 그렇지만) 패치가 될 듯. :-)

1.3.2. 템플릿으로 옮길 수 없는 것들

comments, trackbackreceived

일기의 경우, 모든 개별 일기에는 /Comments매크로/TrackBackReceived매크로가 들어 있다. 이것도 템플릿 페이지에 넣을 수 있으면 정말 좋겠는데...

넣는 것 자체는 문제가 없다. 제대로 출력될 것이다. 그런데 그 코멘트를 입력하고 저장 버튼을 누르면, 코멘트를 저장하기 위해서 해당 일기 페이지를 열고 comments매크로가 있는 자리에 치환을 하는데... 일기 페이지에는 매크로가 없으니 치환할 자리를 찾을 수가 없다 -_-;

'''div class="diary"... 비슷한 맥락으로, Diary/동적템플릿을 보면 div.diary 태그도 빼지 못한다. 이 div 태그를 템플릿으로 옮기면 개별 일기를 출력할 때는 상관이 없는데, DiaryDiary/2007-03처럼 여러 편의 일기를 차례대로 include 할 때는 각각의 일기를 div로 묶어줄 방법이 없다. (그걸 해주는 매크로를 따로 만드는 건 차마 -_-;;;;)

5편만 보여주는 Diary같은 경우는 굳이 원한다면
 <blog_includeorder(Diary/List,1,5)>
대신에

<div class="diary">
 <blog_includeorder(Diary/List,1,1)>
</div>

<div class="diary">
 <blog_includeorder(Diary/List,2,2)>
</div>
... 이런 식으로 한 편 한 편 따로 써 주길 다섯 번 반복
위와 같이 해주면 못할 건 없는데, 월별 아카이브는 순서가 아니라 기간으로 묶는 거니까 대책이 없다. 31번 반복해서 써 주더라도, 하루에 두 편 일기가 있으면 그건 하나로 묶여서 보일 거다.

...분류

모든 개별 일기는 주인장분류에 속하게 했다. 그런데 [[주인장분류]] 링크를 템플릿으로 옮겨버리면, 출력할 때야 제대로 붙어서 나오겠지만, 실제로 개별 일기에 이 링크가 있는 게 아니니까, 주인장분류 페이지의 역링크를 볼 때 잡히지 않게 된다.

따라서 개별 일기에 이 주인장분류 링크는 꼭 들어가야 하고, 기존에는 이 링크를 noinclude로 감싸서 아카이브에서는 보이지 않게 했는데, 동적템플릿을 쓰면 그게 불가능하니 매 일기마다 이 분류 링크가 보일 것이다. 뭐 큰 문제는 아닌데...

(동적템플릿에 삽입할 때, "이 영역은 삽입하지 말아라"라는 의미로 역시 noinclude를 쓸 수 있게 할까 생각했는데, 이런 식으로 다시 예외 처리를 신경쓰면 한도끝도 없고, 애초에 개별 일기 페이지에는 내용만 집중하자는 취지였는데 이런 매크로를 쓰게 되면 의미가 없어질 듯 하여서 말았다)

1.4. wiki.pl 수정

페이지를 마크업하기 직전에 include매크로를 처리해주는데, 그 시점에서 템플릿을 먼저 처리
sub MacroIncludeSubst {
    my ($txt) = @_;

### #TEMPLATE 여기서부터 추가
    if (substr($txt, 0, 10) eq '#TEMPLATE ') {
        my ($template_line, $template_id);
        if (($FreeLinks) && ($txt =~ /\#TEMPLATE\s+\[\[.+\]\]/)) {
            ($template_line, $template_id) = ($txt =~ /(\#TEMPLATE\s+\[\[(.+)\]\])/);
            $template_id = &FreeToNormal($template_id);
        } else {
            ($template_line, $template_id) = ($txt =~ /(\#TEMPLATE\s+(\S+))/);
        }
        if (&ValidId($template_id) eq '') {
            $txt =~ s/\Q$template_line\E//;
            $txt = &ApplyDynamicTemplate($template_id, $pageid, $txt);
        } else {  # Not a valid target, so continue as normal page
            # 할 거 없음
        }
    }
### 여기까지

    $txt =~ s/(^|\n)<include\((.*)\)>([\r\f]*\n)/$1 . &MacroInclude($2) . $3/geim;
### toc 를 포함하지 않는 includenotoc 매크로 추가
    $txt =~ s/(^|\n)<includenotoc\((.*)\)>([\r\f]*\n)/$1 . &MacroInclude($2, "notoc") . $3/geim;
    ...
}

다음 함수 통채로 추가
### #TEMPLATE
sub ApplyDynamicTemplate {
    my ($template_id, $id, $id_text) = @_;

    my $fname = &GetPageFile($template_id);
    if (!(-f $fname)) {
        return $id_text;
    }

    my ($status, $data) = &ReadFile($fname);
    if (!$status) {
        return $id_text;
    }

    $id_text =~ s/^\s*//s;
    $id_text =~ s/\s*$//s;

    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 $text = &TemplateMacroSubst($id, $temp_Text{'text'});

    $text =~ s/<template_text>/$id_text/;

    return $text;
}

"#TEMPLATE"이 들어간 페이지를 다른 페이지가 include하는 경우는 이거 삭제 (아 정말 이런 거 신경쓰려니 코드가 지저분..)
sub MacroInclude {
    ...
    my %TextInclude = split(/$FS3/, $SubSection{'data'}, -1);
    my $txt = $TextInclude{'text'};

# #TEMPLATE - 아래 한 줄 추가
    $txt =~ s/^#TEMPLATE\s+(\[\[.+\]\]|\S+)//;
    # includenotoc 의 경우
    $txt =~ s/<toc>/$FS_lt."toc".$FS_gt/gei if ($opt eq "notoc");
    ...
}

1.5. 추가 업데이트 내역

1.6. 사용자 의견

이 패치의 가장 큰 미덕은... 기존의 일기 페이지들을 고치지 않고 새 페이지부터만 적용해 주어도 똑같이 보이게 할 수 있다는 것이죠. 뭐, 나중에 일기 레이아웃을 바꾸고 싶다면 그때는 동적템플릿 페이지만 고쳐주어도 되고, 기존 일기들도 새로운 레이아웃으로 보이게 하고 싶다면 그땐 할수 없이 Header와 Footer를 고쳐주어야...
-- Raymundo 2007-3-22 1:17 pm
이름:  
Homepage:
내용:
 

위키위키분류

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