어떤 페이지를 출력할 때, 지정한 템플릿 페이지를 읽어서 그 템플릿 페이지 안에 내용을 넣은 후 마크업한다.
OrzWiki에 적힌 아이디어를 구현
#TEMPLATE 템플릿페이지이름 또는 #TEMPLATE [[템플릿페이지이름]] 둘 중 어느 쪽이든 상관없으니, 한글페이지라고 해서 굳이 대괄호를 붙여줄 필요는 없다. 그렇지만 대괄호를 써 주면 링크를 건 것으로 처리가 되니 역링크 보기 등에서 볼 수 있어 더 좋음
주저리주저리 <template_text> 이러쿵저러쿵
(게다가 더 큰 문제는, header나 footer 페이지 자체를 볼 때 와자작 깨지는 걸 막으려고, header페이지에는 footer의 역할을 해 줄 내용을 또 적어주고, 그걸 Noinclude로 감싸주고, footer는 반대로 header 역할을 할 내용을 noinclude로 감싸서 적어주는 식으로 해야 했다는 것. 이것 때문에 한번 고치려면 머리가 아프다)
그러나 동적 템플릿을 쓰면,
(지금 구현되어 있는 /TemplateMacro들이 단순하게 이름이나 날짜 출력하는 정도라서, 그냥 새 페이지를 만들때 쓰이는 매크로를 공유를 하는데, 나중에라도 복잡한 매크로가 추가되면 둘을 구분해야 할지도)
내가 고치거나 새로 만들면서 스스로도 헷갈릴 지경이라, 다른페이지의내용을포함하여출력하기에 정리함
순전히 Diary를 위해 태어난 (사실 이곳의 많은 매크로들이 다 그렇지만) 패치가 될 듯. :-)
일기의 경우, 모든 개별 일기에는 /Comments매크로와 /TrackBackReceived매크로가 들어 있다. 이것도 템플릿 페이지에 넣을 수 있으면 정말 좋겠는데...
넣는 것 자체는 문제가 없다. 제대로 출력될 것이다. 그런데 그 코멘트를 입력하고 저장 버튼을 누르면, 코멘트를 저장하기 위해서 해당 일기 페이지를 열고 comments매크로가 있는 자리에 치환을 하는데... 일기 페이지에는 매크로가 없으니 치환할 자리를 찾을 수가 없다 -_-;
'''div class="diary"... 비슷한 맥락으로, Diary/동적템플릿을 보면 div.diary 태그도 빼지 못한다. 이 div 태그를 템플릿으로 옮기면 개별 일기를 출력할 때는 상관이 없는데, Diary나 Diary/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를 쓸 수 있게 할까 생각했는데, 이런 식으로 다시 예외 처리를 신경쓰면 한도끝도 없고, 애초에 개별 일기 페이지에는 내용만 집중하자는 취지였는데 이런 매크로를 쓰게 되면 의미가 없어질 듯 하여서 말았다)
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"); ... }
이 패치의 가장 큰 미덕은... 기존의 일기 페이지들을 고치지 않고 새 페이지부터만 적용해 주어도 똑같이 보이게 할 수 있다는 것이죠. 뭐, 나중에 일기 레이아웃을 바꾸고 싶다면 그때는 동적템플릿 페이지만 고쳐주어도 되고, 기존 일기들도 새로운 레이아웃으로 보이게 하고 싶다면 그땐 할수 없이 Header와 Footer를 고쳐주어야...