Haml

**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 作為命令列工具

得到這樣的 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 部落格上的公告