如何使整洁忽略html.tt模板中的TT代码?

时间:2011-07-25 20:17:18

标签: php perl xhtml tidy template-toolkit

我有一些TT模板,我想整理一下。我在命令行上使用整洁。

我的命令如下:

$ tidy -utf8  --preserve-entities y -indent -wrap 120 file.html.tt

不幸的是,如果我的代码如下:

[% aoh.unshift({ label => '', value => 'All types' }); %]

它最终在结果文件中:

[% aoh.unshift({ label => '', value => 'All types' }); %]

标签属性中的Template Toolkit代码也是如此,例如:

<a href="[%%20%20c.url_for('/content/edit').query('data_type'%20=%3Edata_type%20)%20%]" >

整理所需的选项会忽略“[%”和“%]”之间的所有内容? 对于PHP开始和结束标记,同样的问题也适用。

感谢。

2 个答案:

答案 0 :(得分:3)

如果您暂时伪装TT标签怎么办?

$ perl -pie 's/\[%/<!--\[ %/g; s/%\]/% \]-->/g' file.html.tt
$ tidy -utf8  --preserve-entities y -indent -wrap 120 file.html.tt
$ perl -pie 's/<!--\[ %/\[%/g; s/% \]-->/%\]/g' file.html.tt

第一个命令会将所有TT元素转换为HTML注释,最后一个命令会将它们更改回来。

答案 1 :(得分:2)

在某种程度上扩展了这里的想法,为什么不将TT片段替换为完全无害的东西,并在整理完原始的东西之后。在下面的代码中,我正在替换<!-- sn20 -->之类的评论:

use File::Slurp;
my $template = read_file(shift);

# replace TT snippets with <!-- snNN -->
my %snip = ();
my $id   = 0;
$template =~ s/ \[% (.*?) %\] / $snip{++$id} = $1; "<!-- sn$id -->" /gxse;

# run tidy
open my $tidy_fh, '|-', 'tidy -utf8  --preserve-entities y -indent -wrap 120 >tidy_out'
    or die;
print $tidy_fh $template;
close $tidy_fh;

# fix code back
my $template_tidied = read_file('tidy_out');
$template_tidied =~ s/<!-- sn(\d+) -->/ "[%$snip{$1}%]" /ge;

# print the result
print $template_tidied;