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博客上的公告