**Haml**（**H**TML **A**bstraction **M**arkup **L**anguage，HTML抽象标记语言）是一种模板系统，它可以避免在Web文档中内嵌代码，使HTML更简易和干净。Haml为HTML中提供了一些动态内容的灵活性。类似其他Web语言（如PHP、ASP、JSP）和模板系统（如eRuby），Haml也嵌入一些在运行时执行的代码并生成HTML代码，从而提供一些动态内容。为运行Haml代码，文件需要采用.haml扩展名。这些文件类似.erb或eRuby文件，这有助于在开发网络应用程序时嵌入Ruby代码。在解析代码注释时，Haml采用与Ruby 1.9或之后版本相同的规则。Haml只能理解兼容ASCII的编码（例如UTF-8），而不能理解不兼容ASCII的UTF-16与UTF-32。Haml可以在命令行界面中使用，也可以作为一个单独的Ruby模块或在一个Ruby on Rails应用程序中使用，这使Haml可用于广泛的应用程序。

历史
--

Haml最早由Hampton Catlin（英语：）于2006年发布，它的成果领先于其他几个人。他的动机是使HTML更简单、清晰和易于使用。自2006年以来，它已随新版本发布而多次修订。2012年4月，Haml的维护由Norman Clarke接手。Natalie Weizenbaum致力于使Haml可以在Ruby应用程序中使用，而品牌与设计则由Nick Walsh完成。目前的维护团队中还有Matt Wildig、Akira Matsuda和Tee Parham。

### 版本历史

特性
--

Haml的发展有四项原则。

### 用户友好的标记

置标语言如果遵循下列特征，那么它则用户友好：

* 语言能轻松理解
* 使用便捷（其实现）

### DRY

标记语言应坚持不重复自身（DRY）原则。它应该：

* 避免不必要的重复
* 专注于干净的代码

### 精巧缩进

有良好缩进的标记语言可以改善外观、使阅读器易于读取，并有助确定元素的开始与结束位置。

### 清晰结构

有清晰结构的标记语言有助于代码维护和理解最终结果的逻辑。Haml在这方面是否提供了有差异的优势，这点尚不清晰。

例子
--

Haml标记在语法上类似CSS。例如，Haml同样使用`.`（点）表示CSS的类，使开发人员可以轻松使用这种标记。

### Hello, World例子

Haml的最简单的Hello World实现像是这样：

#### Haml作为命令行工具

```
%p{:class => "sample", :id => "welcome"} Hello, World!

```
得到这样的HTML代码：

```
<p class="sample" id="welcome">Hello, World!</p>

```
为运行Haml代码，必须已安装，如使用下列命令 `Haml`以gem安装：

```
gem install haml
```

Haml代码若以`Hello.haml`为文件名保存，则可以这样运行：

```
haml Hello.haml
```

#### Haml作为Ruby on Rails附加项

要用Ruby使用Haml，Ruby的`Gemfile`应该包含此行：

```
gem 'haml'
```

类似eRuby，Haml也可以访问局部变量（在同一个文件中以Ruby代码声明）。此例子使用一个Ruby控制器文件为例。

* file: app/controllers/messages\_controller.rb
```
class MessagesController < ApplicationController
 def index
 @message = "Hello, World!"
 end
end

```
* file: app/views/messages/index.html.haml
```
#welcome
 %p= @message

```

将得到：

```
<div id="welcome">
    <p>Hello, World!</p>
</div>

```

#### Haml作为Ruby模块

要独立于Rails和ActionView（页面存档备份，存于）使用Haml，安装`haml` gem，在`Gemfile`中包含它，然后简单的在Ruby脚本中导入`[Usage: require 'haml']`，或者以`-rubygems`标志调用Ruby直譯器。

```
welcome = Haml::Engine.new("%p Hello, World!")
welcome.render

```
输出：

```
<p>Hello, World!</p>

```
Haml::Engine（页面存档备份，存于）是一个Haml类。

### 基本例子

Haml使用空格缩进（两个空格）来表示标签的嵌套和识别给定标签的范围。这取代打开、闭合的标签对系统，从而符合DRY并使其看上去更清晰（容易阅读）。下列例子展示了Haml与eRuby（嵌入式Ruby）的差异。

| Haml | ERB |
| --- | --- |
| 
```
%div.category
 %div.recipes
 %h1= recipe.name
 %h3= recipe.category
 %div
 %h4= recipe.description

```
 | 
```
<div class="category">
    <div class="recipes">
        <h1><%= recipe.name %></h1>
        <h3><%= recipe.category %></h3>
    </div>
    <div>
        <h4><%= recipe.description %></h4>
    </div>
</div>

```
 |

由上述代码示例呈现的HTML代码如下所示：

```
<div class="category">
    <div class="recipes">
        <h1>Cookie</h1>
        <h3>Desserts</h3>
    </div>
    <div>
        <h4>Made from dough and sugar. Usually circular in shape and has about 400 calories.</h4>
    </div>
</div>

```
两者的关键差异是：

* Haml不像eRuby那样，每个元素都有开始与结束
* eRuby语法看上去很像、更像HTML，而Haml更像CSS。
* Haml使用缩进来嵌套标签元素，而eRuby使用与HTML相同的表示法
* 在Haml属性中，`class`、`id`可以用`.`和`#`表示`class`和`id`关键字。Haml使用`%`标示一个HTML元素，而eRuby中使用`<>`。

### 嵌入Ruby代码的例子

注意：这是一个简单的预览示例，可能不能体现此语言的目前版本。

```
!!!
%html{ :xmlns => "http://www.w3.org/1999/xhtml", :lang => "en", "xml:lang" => "en"}
 %head
 %title BoBlog
 %meta{"http-equiv" => "Content-Type", :content => "text/html; charset=utf-8"}
 %link{"rel" => "stylesheet", "href" => "main.css", "type" => "text/css"}
 %body
 #header
 %h1 BoBlog
 %h2 Bob's Blog
 #content
 - @entries.each do |entry|
 .entry
 %h3.title= entry.title
 %p.date= entry.posted.strftime("%A, %B %d, %Y")
 %p.body= entry.body
 #footer
 %p
 All content copyright © Bob

```
上述Haml产生这个XHTML：

```
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang='en' xml:lang='en' xmlns='http://www.w3.org/1999/xhtml'>
  <head>
    <title>BoBlog</title>
    <meta content='text/html; charset=utf-8' http-equiv='Content-Type' />
    <link href="/stylesheets/main.css" media="screen" rel="Stylesheet" type="text/css" />
  </head>
  <body>
    <div id='header'>
      <h1>BoBlog</h1>
      <h2>Bob's Blog</h2>
    </div>
    <div id='content'>
      <div class='entry'>
        <h3 class='title'>Halloween</h3>
        <p class='date'>Tuesday, October 31, 2006</p>
        <p class='body'>
          Happy Halloween, glorious readers! I'm going to a party this evening... I'm very excited.
        </p>
      </div>
      <div class='entry'>
        <h3 class='title'>New Rails Templating Engine</h3>
        <p class='date'>Friday, August 11, 2006</p>
        <p class='body'>
          There's a very cool new Templating Engine out for Ruby on Rails. It's called Haml.
        </p>
      </div>
    </div>
    <div id='footer'>
      <p>
        All content copyright © Bob
      </p>
    </div>
  </body>
</html>

```

实现
--

Haml的官方实现已经以Ruby插件形式内置在Ruby on Rails和Merb（英语：）中，该Ruby实现也能够独立使用。Haml可以轻松配合其他语言使用。下列是各种语言对Haml的实现：

* hamlit (Ruby)（页面存档备份，存于）
* HamlPy (Python)（页面存档备份，存于）
* LuaHaml (Lua)（页面存档备份，存于）
* MonoRail NHaml (ASP.NET)
* NHaml (.NET)（页面存档备份，存于）
* Fammel (PHP)
* HAML-TO-PHP (PHP5)
* pHAML (PHP)（页面存档备份，存于）
* phamlp (PHP)（页面存档备份，存于）
* phpHaml (PHP5)（页面存档备份，存于）
* Multi target HAML (PHP5.3)（页面存档备份，存于）
* haml-js (JavaScript)（页面存档备份，存于）
* Text::Haml (Perl)（页面存档备份，存于）
* Scalate (Scala)
* JHaml (Java)（页面存档备份，存于）
* Hart (Dart)（页面存档备份，存于）
* cl-haml (Common Lisp)（页面存档备份，存于）

参见
--

* BBCode
* eRuby
* Markaby（英语：）
* Ruby
* Ruby on Rails
* YAML
* Sass – 一种类似的面向CSS的系统，也是由Catlin设计。
* 网站元语言（英语：） – 另一种有类似功能的模板语言
* Web模板（英语：）

参考资料
----

1. ↑ . 2023年10月4日  [2023年10月19日].
2. 1 2 .  [30 January 2016]. （原始内容存档于2017-04-27）.
3. ↑ .  [29 January 2016]. （原始内容存档于2017-05-29）.
4. ↑ .  [7 February 2016]. （原始内容存档于2019-02-16）.
5. ↑ .  [29 January 2016]. （原始内容存档于2017-05-27）.
6. ↑ .  [7 February 2016]. （原始内容存档于2017-05-29）.

外部链接
----

* 官方网站 在维基数据上编辑此内容
	+ Haml tutorial（页面存档备份，存于）
* Learn Haml (basic)（页面存档备份，存于）
* GitHub上的Haml
* phpHaml（页面存档备份，存于），面向PHP的Haml实现
* Haml Google讨论组（页面存档备份，存于）
* Haml 1.0（页面存档备份，存于），Ruby on Rails博客上的公告