在编写一个非平凡的静态HTML页面时,大型结构很难看到,精细的结构和内容都混合在一起。滚动多个页面以查找与给定开始标记匹配的结束标记令人沮丧。一般来说,它感觉凌乱,笨拙,难以维护...就像编写一个没有功能的大型程序一样。
当然,当我编写一个大型程序时,我将其分层次地分解为更小的函数。有没有办法用大型HTML文件做到这一点?
基本上我正在寻找一个模板系统,其中要插入模板的内容只是更多的HTML,可选择(这里是重要的部分)位于同一个文件中。
也就是说,我希望能够做出类似于这个假设语法所暗示的内容:
<html>
<head>{{head}}</head>
<body>
<div class="header">{{header}}</div>
<div class="navbar">{{navbar}}</div>
<div class="content">{{content}}</div>
<div class="footer">{{footer}}</div>
</body>
</html>
{{head}} =
<title>Hello World!</title>
{{styles}}
{{scripts}}
{{styles}} =
<link rel="stylesheet" type="text/css" href="style.css">
{{navbar}} =
...
...
... and so on...
然后可能会有一种简单的方法来“编译”它以制作标准的HTML文件。
是否有任何工具允许以这种方式编写HTML?
大多数模板引擎要求每个include都是一个单独的文件,这是无用的。
更新:Gnu M4似乎正在寻找我正在寻找的东西,但有几点需要注意:
宏定义必须在它们被使用之前出现,而我宁愿它们被追随。
M4的语法与HTML混淆得很厉害。由于该文件不再是HTML,因此无法轻松检查语法是否存在错误。 M4处理器非常宽容和灵活,有时很难找到M4文件中的错误 - 解析器不会抱怨,甚至不会注意到,当你写的东西不是你可能想要的东西时。
没有办法正确缩进HTML,使输出变得难以理解。 (由于生产HTML无论如何都可能会缩小,这不是一个主要问题,如果它需要可读,它总是可以通过格式化程序运行。)
答案 0 :(得分:0)
这将解析您的模板示例并执行您想要的操作。
perl -E 'my $pre.=join("",<>); my ($body,%h)=split(/^\{\{(\w+)\}\}\s*=\s*$/m, $pre); while ($body =~ s/\{\{(\w+)\}\}/$h{$1}/ge) { if ($rec++>200) {die("Max recursion (200)!")}};$body =~ s/({{)-/$1/sg; $body =~ s/({{)-/$1/sg; print $body' htmlfiletoparse.html
这是脚本版本。 档案joshTplEngine;)
#!/usr/bin/perl
## get/read lines from files. Multiple input files are supported
my $pre.=join("",<>);
## split files to body and variables %h = hash
## variable is [beginning of the line]{{somestring}} = [newline]
my ($body,%h)=split(/^\{\{# split on variable line and
(\w+) ## save name
\}\}
\s*=\s*$/xm, $pre);
## replace recursively all variables defined as {{somestring}}
while ($body =~ s/
\{\{
(\w+) ## name of the variable
\}\}
/ ##
$h{$1} ## all variables have been read to hash %h and $1 contens variable name from mach
/gxe) {
## check for number of recursions, limit to 200
if ($rec++>200) {
die("Max recursion (200)!")
}
}
## replace {{- to {{ and -}} to }}
$body =~ s/({{)-/$1/sg;
$body =~ s/-(}})/$1/sg;
## end, print
print $body;
用法:
joshTplEngine.pl /some/html/file.html [/some/other/file] | tee /result/dir/out.html
我希望这个小小的perl能够让你进入模板。