Haml（HTML Abstraction Markup Language，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 作為命令列工具

得到這樣的 HTML 代碼：

為執行 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

* file: app/views/messages/index.html.haml

將得到：

Haml 作為 Ruby 模組

要獨立於 Rails 和 ActionView（頁面存檔備份，存於網際網路檔案館）使用 Haml，安裝 `haml` gem，在 `Gemfile` 中包含它，然後簡單的在 Ruby 指令碼中匯入 `[Usage: require 'haml']`，或者以 `-rubygems` 標誌呼叫 Ruby 直譯器。

輸出：

Haml::Engine（頁面存檔備份，存於網際網路檔案館）是一個 Haml 類。

基本例子

Haml 使用空格縮排（兩個空格）來表示標籤的巢狀和辨識給定標籤的範圍。這取代打開、閉合的標籤對系統，從而符合 DRY 並使其看上去更清晰（容易閱讀）。下列例子展示了 Haml 與 eRuby（嵌入式 Ruby）的差異。

由上述代碼範例呈現的 HTML 代碼如下所示：

兩者的關鍵差異是：


* Haml 不像 eRuby 那樣，每個元素都有開始與結束

* eRuby 語法看上去很像、更像 HTML，而 Haml 更像 CSS。

* Haml 使用縮排來巢狀標籤元素，而 eRuby 使用與 HTML 相同的表示法

* 在 Haml 屬性中，`class`、`id` 可以用 `.` 和 `#` 表示 `class` 和 `id` 關鍵字。Haml 使用 `%` 標示一個 HTML 元素，而 eRuby 中使用 `<>`。

嵌入 Ruby 代碼的例子

注意：這是一個簡單的預覽範例，可能不能體現此語言的目前版本。

上述 Haml 產生這個 XHTML：



實現

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 模板



參考資料



外部連結


* 官方網站
  
* Haml tutorial（頁面存檔備份，存於網際網路檔案館）

* Learn Haml (basic)（頁面存檔備份，存於網際網路檔案館）

* GitHub 上的 Haml

* phpHaml（頁面存檔備份，存於網際網路檔案館），面向 PHP 的 Haml 實現

* Haml Google 討論組（頁面存檔備份，存於網際網路檔案館）

* Haml 1.0（頁面存檔備份，存於網際網路檔案館），Ruby on Rails 部落格上的公告