Haml

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作為命令行工具**
%p{:class => "sample", :id => "welcome"} Hello, World!
得到這樣的HTML代碼：
Hello, World!
為運行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 - file: app/views/messages/index.html.haml
#welcome
%p= @message
將得到：
Hello, World!

**Haml作為Ruby模塊**
要獨立於Rails和 ActionViewdate=20170528044224 使用Haml，安裝haml gem，在Gemfile中包含它，然後簡單的在Ruby腳本中導入Usage: require 'haml'，或者以-rubygems標誌調用Ruby直譯器。
welcome = Haml::Engine.new("%p Hello, World!")
welcome.render
輸出：
Hello, World!
Haml::Enginedate=20170602094319 是一個Haml類。

**基本例子**
Haml使用空格縮進（兩個空格）來表示標籤的嵌套和識別給定標籤的範圍。這取代打開、閉合的標籤對系統，從而符合DRY並使其看上去更清晰（容易閱讀）。下列例子展示了Haml與eRuby（嵌入式Ruby）的差異。
由上述代碼示例呈現的HTML代碼如下所示：

Cookie
Desserts


Made from dough and sugar. Usually circular in shape and has about 400 calories.

兩者的關鍵差異是：- 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：

BoBlog





BoBlog
Bob's Blog



Halloween
Tuesday, October 31, 2006

Happy Halloween, glorious readers! I'm going to a party this evening... I'm very excited.



New Rails Templating Engine
Friday, August 11, 2006

There's a very cool new Templating Engine out for Ruby on Rails. It's called Haml.





All content copyright © Bob




**實現**
Haml的官方實現已經以Ruby插件形式內置在Ruby on Rails和Merb中，該Ruby實現也能夠獨立使用。Haml可以輕鬆配合其他語言使用。下列是各種語言對Haml的實現：-  hamlit (Ruby)date=20170421232751 -  HamlPy (Python)date=20180611022049 -  LuaHaml (Lua)date=20180610232412 -  MonoRail NHaml (ASP.NET)-  NHaml (.NET)date=20160316090641 -  Fammel (PHP)-  HAML-TO-PHP (PHP5)-  pHAML (PHP)date=20170610115013 -  phamlp (PHP)date=20160821080435 -  phpHaml (PHP5)date=20170619012015 -  Multi target HAML (PHP5.3)date=20180611022532 -  haml-js (JavaScript)date=20161004160128 -  Text::Haml (Perl)date=20191017071318 -  Scalate (Scala)-  JHaml (Java)date=20180611031908 -  Hart (Dart)date=20180610234115 -  cl-haml (Common Lisp)date=20180611002643 

**參見**
 BBCode- eRuby- Markaby- Ruby- Ruby on Rails- YAML- Sass – 一種類似的面向CSS的系統，也是由Catlin設計。- 網站元語言 – 另一種有類似功能的模板語言- Web模板

**參考資料**

**外部鏈接**-  Haml tutorialdate=20170529062037 -  Learn Haml (basic)date=20170423221617 - Haml-  phpHamldate=20170619012015 ，面向PHP的Haml實現-  Haml Google討論組date=20180130014044 -  Haml 1.0date=20170519062131 ，Ruby on Rails博客上的公告