如何将长HTML拆分为“函数”

时间:2015-07-06 09:33:15

标签: html templates

在编写一个非平凡的静态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似乎正在寻找我正在寻找的东西,但有几点需要注意:

  1. 宏定义必须在它们被使用之前出现,而我宁愿它们被追随。

  2. M4的语法与HTML混淆得很厉害。由于该文件不再是HTML,因此无法轻松检查语法是否存在错误。 M4处理器非常宽容和灵活,有时很难找到M4文件中的错误 - 解析器不会抱怨,甚至不会注意到,当你写的东西不是你可能想要的东西时。

  3. 没有办法正确缩进HTML,使输出变得难以理解。 (由于生产HTML无论如何都可能会缩小,这不是一个主要问题,如果它需要可读,它总是可以通过格式化程序运行。)

1 个答案:

答案 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能够让你进入模板。