13 번째 수정본 소스 보기 : UseModWiki소스수정/동적Template
마지막으로 [b]
-- Loading page list... --
내용출력
로그인[l]
Diary
[f]
최근변경내역
[r]
페이지목록[i]
횡설수설[2]
게시판[3]
링크
수정할 수 없습니다: UseModWiki소스수정/동적Template 는 읽기 전용 페이지입니다.
== # 출력할 때 적용되는 동적 Template == See also [[다른페이지의내용을포함하여출력하기]] 어떤 페이지를 출력할 때, 지정한 템플릿 페이지를 읽어서 그 템플릿 페이지 안에 내용을 넣은 후 마크업한다. Jof:OrzWiki""에 적힌 아이디어를 구현 * 필수 요구 사항: * 선택 요구 사항: === # 사용법 === ==== # 템플릿을 사용하려는 페이지 쪽에서 ==== REDIRECT나 [[/EXTERN명령어]]처럼, 페이지 제일 처음에 다음과 같이 적어준다. {{{ #TEMPLATE 템플릿페이지이름 또는 #TEMPLATE [[템플릿페이지이름]] 둘 중 어느 쪽이든 상관없으니, 한글페이지라고 해서 굳이 대괄호를 붙여줄 필요는 없다. 그렇지만 대괄호를 써 주면 링크를 건 것으로 처리가 되니 역링크 보기 등에서 볼 수 있어 더 좋음 }}} ==== # 텟플릿 페이지 쪽에서 ==== 템플릿 페이지 쪽에서는, <template_text>매크로를 써서, 다른 페이지가 삽입될 위치를 지정해 준다. {{{ 주저리주저리
이러쿵저러쿵 }}} ==== # 사용예 - [[Diary]]의 경우 ==== 매일매일의 일기는 테이블에 TD 안에 들어가므로, 테이블을 시작하고 TD를 여는 역할을 하는 [[Diary/Header]]와, TD를 닫고 나머지 테이블 항목(날짜니 최근 커멘트니..)을 출력하는 [[Diary/Footer]]를 만들어 준 다음, 개별 일기마다 Header와 Footer를 include시켜주는 구문이 들어가야 했다. 뭐 [[/Template]]을 쓰면 편집할 때 채워주긴 하지만. 나중에 페이지 소스를 볼 때 위아래로 복잡하게 붙은 데다가, 나중에 다이어리 디자인을 바꾸려고 하면 header footer 각각 신경써 주어야 한다. (게다가 더 큰 문제는, header나 footer 페이지 자체를 볼 때 와자작 깨지는 걸 막으려고, header페이지에는 footer의 역할을 해 줄 내용을 또 적어주고, 그걸 Noinclude로 감싸주고, footer는 반대로 header 역할을 할 내용을 noinclude로 감싸서 적어주는 식으로 해야 했다는 것. 이것 때문에 한번 고치려면 머리가 아프다) 그러나 동적 템플릿을 쓰면, * [[Diary/DynamicTemplate]] 여기에 전체 디자인을 다 적어준다. 즉 테이블 전체를 다 적어주고 * 개별 일기는 제일 앞에
#TEMPLATE [[Diary/DynamicTemplate]]
라고 적어주면 된다. 예 - [[Diary/동적템플릿]] * 나중에 디자인을 바꾸고 싶다면 [[Diary/DynamicTemplate]]만 고쳐주면 끝. ==== # template 매크로 ==== 동적 템플릿 페이지에도 [[/TemplateMacro]]를 적어줄 수 있다. (쓸 일이 있겠나 싶긴 한데) 예를 들어 동적템플릿에 <template_pagename>을 적어 두면, 출력할 때 그 자리는 템플릿을 사용하는 페이지 이름이 나온다. <template_date>같은 경우는 출력하는 시점의 날짜가 출력될 것이다. (출력할 때 치환되니까) 즉 <date> 매크로와 동일해짐 (지금 구현되어 있는 [[/TemplateMacro]]들이 단순하게 이름이나 날짜 출력하는 정도라서, 그냥 새 페이지를 만들때 쓰이는 매크로를 공유를 하는데, 나중에라도 복잡한 매크로가 추가되면 둘을 구분해야 할지도) === # include, template, 동적template === 내가 고치거나 새로 만들면서 스스로도 헷갈릴 지경이라, [[다른페이지의내용을포함하여출력하기]]에 정리함 === # 문제점 또는 한계 === ==== # 단순히 본문 전체 삽입밖에 못 함 ==== 템플릿 페이지의 특정한 한 곳에 통채로 삽입하는 수준밖에 안 된다. "첫번째 섹션만 떼어내어 왼쪽에 출력하고 나머지 내용은 오른쪽에 출력하고..." 이런 식으로 템플릿을 구성하는 건 못하니, 결국 include의 역함수(?) 버전 정도로 생각하면 될 듯. 순전히 [[Diary]]를 위해 태어난 (사실 이곳의 많은 매크로들이 다 그렇지만) 패치가 될 듯. :-) ==== # 템플릿으로 옮길 수 없는 것들 ==== '''comments, trackbackreceived''' 일기의 경우, 모든 개별 일기에는 [[/Comments매크로]]와 [[/TrackBackReceived매크로]]가 들어 있다. 이것도 템플릿 페이지에 넣을 수 있으면 정말 좋겠는데... 넣는 것 자체는 문제가 없다. 제대로 출력될 것이다. 그런데 그 코멘트를 입력하고 저장 버튼을 누르면, 코멘트를 저장하기 위해서 해당 일기 페이지를 열고 comments매크로가 있는 자리에 치환을 하는데... 일기 페이지에는 매크로가 없으니 치환할 자리를 찾을 수가 없다 -_-; '''div class="diary"... 비슷한 맥락으로, [[Diary/동적템플릿]]을 보면 div.diary 태그도 빼지 못한다. 이 div 태그를 템플릿으로 옮기면 개별 일기를 출력할 때는 상관이 없는데, [[Diary]]나 [[Diary/2007-03]]처럼 여러 편의 일기를 차례대로 include 할 때는 각각의 일기를 div로 묶어줄 방법이 없다. (그걸 해주는 매크로를 따로 만드는 건 차마 -_-;;;;) 5편만 보여주는 [[Diary]]같은 경우는 굳이 원한다면 {{{
대신에
... 이런 식으로 한 편 한 편 따로 써 주길 다섯 번 반복 }}} 위와 같이 해주면 못할 건 없는데, 월별 아카이브는 순서가 아니라 기간으로 묶는 거니까 대책이 없다. 31번 반복해서 써 주더라도, 하루에 두 편 일기가 있으면 그건 하나로 묶여서 보일 거다. '''...분류''' 모든 개별 일기는 [[주인장분류]]에 속하게 했다. 그런데
[[주인장분류]]
링크를 템플릿으로 옮겨버리면, 출력할 때야 제대로 붙어서 나오겠지만, 실제로 개별 일기에 이 링크가 있는 게 아니니까, 주인장분류 페이지의 역링크를 볼 때 잡히지 않게 된다. 따라서 개별 일기에 이 주인장분류 링크는 꼭 들어가야 하고, 기존에는 이 링크를 noinclude로 감싸서 아카이브에서는 보이지 않게 했는데, 동적템플릿을 쓰면 그게 불가능하니 매 일기마다 이 분류 링크가 보일 것이다. 뭐 큰 문제는 아닌데... (동적템플릿에 삽입할 때, "이 영역은 삽입하지 말아라"라는 의미로 역시 noinclude를 쓸 수 있게 할까 생각했는데, 이런 식으로 다시 예외 처리를 신경쓰면 한도끝도 없고, 애초에 개별 일기 페이지에는 내용만 집중하자는 취지였는데 이런 매크로를 쓰게 되면 의미가 없어질 듯 하여서 말았다) === # wiki.pl 수정 === 페이지를 마크업하기 직전에 include매크로를 처리해주는데, 그 시점에서 템플릿을 먼저 처리 {{{#!vim perl 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)
([\r\f]*\n)/$1 . &MacroInclude($2) . $3/geim; ### toc 를 포함하지 않는 includenotoc 매크로 추가 $txt =~ s/(^|\n)
([\r\f]*\n)/$1 . &MacroInclude($2, "notoc") . $3/geim; ... } }}} 다음 함수 통채로 추가 {{{#!vim perl ### #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/
/$id_text/; return $text; } }}} "#TEMPLATE"이 들어간 페이지를 다른 페이지가 include하는 경우는 이거 삭제 (아 정말 이런 거 신경쓰려니 코드가 지저분..) {{{#!vim perl sub MacroInclude { ... my %TextInclude = split(/$FS3/, $SubSection{'data'}, -1); my $txt = $TextInclude{'text'}; # #TEMPLATE - 아래 한 줄 추가 $txt =~ s/^#TEMPLATE\s+(\[\[.+\]\]|\S+)//; # includenotoc 의 경우 $txt =~ s/
/$FS_lt."toc".$FS_gt/gei if ($opt eq "notoc"); ... } }}} === # 추가 업데이트 내역 === === # 사용자 의견 === 이 패치의 가장 큰 미덕은... 기존의 일기 페이지들을 고치지 않고 새 페이지부터만 적용해 주어도 똑같이 보이게 할 수 있다는 것이죠. 뭐, 나중에 일기 레이아웃을 바꾸고 싶다면 그때는 동적템플릿 페이지만 고쳐주어도 되고, 기존 일기들도 새로운 레이아웃으로 보이게 하고 싶다면 그땐 할수 없이 Header와 Footer를 고쳐주어야...
---- [[위키위키분류]]
UseModWiki소스수정/동적Template
페이지로 돌아가기 |
다른 수정본 보기