Sync A World You Want To Explore

関 信浩が2002年から書き続けるブログ。ソーシャルメディア黎明期の日本や米国の話題を、元・記者という視点と、スタートアップ企業の経営者というインサイダーの立場を駆使して、さまざまな切り口で執筆しています

自分の今使っているテンプレート一式を、新しいBLOGを作るときのデフォルトにしたいと思うことがある。これは [MT]/lib/MT/default-templates.pl に保存されているのだが、フォーマットが分かりにくく実際にやろうと思うと、結構大変だったりする。

とりあえずテンプレートを表示するShowTemplatesプラグインというのがあったので、これを使ってみようと思ったのだが、ちょっと意図通り動かない。そこで、とりあえず手直ししてみることに。

まずShowTemplatesには、indexのrebuildのときに一緒にrebuildするかどうかのパラメーターである「rebuild_me」がないので、出力するように追加してやる必要がある。また、最初から<textarea>で出力するようになっており、<や>を\<や\>とエスケープしてしまうので、直接default-templates.plを出力するためには、この部分(HTML::Entitiesのencode_entities)をはずさないといけない(さらにHTML::Entitiesにはunicodeで日本語を扱っているときに、ハイコードなどをちゃんとencodeしてくれないバグ?があるため、encode_entities($text, '<>&"')と明示的にencodeするコードを指定してやらないと変な動作をする模様)。

さらにdefault-templates.plは eval {$xxx = require 'default-templates.pl'}としてテンプレートを作るのだが、

{
'text' => 'templatetext',
'outfile' => 'outfile',
'rebuild_me' => '0',
'type' => 'filetype',
'name' => 'filename'
},

となっており、テンプレート中の「'」をエスケープ(\')してやる必要もあった。

仕方がないので、10年ぶりにO'reillyのPerl本を入手して(知らないうちに第3版になっていた!)、Perl 5について学ぶところから始めてみて、ShowTemplatesのパッチと、default-templates.plを作るテンプレートを作ってみた。

---
このセットは、現時点ではindex,custom,archive,category,individual以外のテンプレート(コンソール画面で「EDIT」というボタンが出るもの。Comment Listing Templateなど)は、default-templates.plの出力の前に一度もセーブしたことがないとMTShowTemplatesで表示されないという不具合がある。

詳細を[MT]/lib/MT/App/CMS.pmで$type eq 'template'がある行を探すと分かるのかもしれないが、とりあえずテンプレートを修正したものを出力するのが今回の目標なので、あまり深入りせずに、これらのテンプレートは忘れずにセーブしてやることで回避することにする。

ということで、新たにMTShowTemplateEscapedTextというタグを作りました。「'」を「\'」とエスケープして、encode_entitiesは省いたMTShowTemplateTextです。

テンプレート(templates.html)はこんな感じでいいでしょう。


<textarea cols="75" name="text" rows="15"> [
<MTShowTemplates blog_id="1" name="all">
{
'text' => '<$MTShowTemplateEscapedText$>
',
'outfile' => '<$MTShowTemplateOutfile$>',
'rebuild_me' => '<$MTShowTemplateRebuildMe$>',
'type' => '<$MTShowTemplateType$>',
'name' => '<$MTShowTemplateName$>'
},
</MTShowTemplates>
]
</textarea>

またMTShowTemplates 0.3からのdiffは、

8,9c8,9
< my $start_wrap = '<textarea cols="75" name="text" rows="15" wrap="virtual" sty
le="background-color: #eee;">';
< my $end_wrap = '</textarea>';
---
> my $start_wrap = '';
> my $end_wrap = '';
17a18,19
> MT::Template::Context->add_tag(ShowTemplateRebuildMe => sub { &_hdlr; });
> MT::Template::Context->add_tag(ShowTemplateEscapedText => sub { &_hdlr; });
34a37
> # my $escape = $args->{escape} if defined($args->{escape});
43,44c46,48
< my $text = $start_wrap.encode_entities($template->text).$end_wrap;
<
---
> ## HTML::Entities doesn't work well for unicode, for '<>&"' provided
> my $text = $start_wrap.encode_entities($template->text, '<>&"').$end_wrap;
> my $escapedtext = join "\\\'", split /'/i, $template->text;
48c52
< $item = { id => $template->id,
---
> $item = { id => $template->id,
52c56,58
< outfile => $outfile,
---
> outfile => $outfile,
> rebuild_me => $template->rebuild_me,
> escapedtext => $escapedtext,
63a70
> $ctx->stash ('mt-showtemplate_rebuildme', $show->{rebuild_me});
64a72
> $ctx->stash ('mt-showtemplate_escapedtext', $show->{escapedtext});