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 。[ 4] [ 5] Haml可以在命令行界面 中使用,也可以作为一个单独的Ruby模块或在一个Ruby on Rails 应用程序中使用,这使Haml可用于广泛的应用程序。
历史
Haml最早由Hampton Catlin 于2006年发布,它的成果领先于其他几个人。他的动机是使HTML 更简单、清晰和易于使用。自2006年以来,它已随新版本发布而多次修订。2012年4月,Haml的维护由Norman Clarke接手。[ 6] Natalie Weizenbaum致力于使Haml可以在Ruby 应用程序中使用,而品牌与设计则由Nick Walsh完成。目前的维护团队中还有Matt Wildig、Akira Matsuda和Tee Parham。[ 2]
版本历史
特性
Haml的发展有四项原则。
用户友好的标记
置标语言 如果遵循下列特征,那么它则用户友好:
DRY
标记语言应坚持不重复自身(DRY )原则。它应该:
精巧缩进
有良好缩进 的标记语言可以改善外观、使阅读器易于读取,并有助确定元素的开始与结束位置。
清晰结构
有清晰结构的标记语言有助于代码维护和理解最终结果的逻辑。Haml在这方面是否提供了有差异的优势,这点尚不清晰。
例子
Haml标记在语法上类似CSS 。例如,Haml同样使用.
(点)表示CSS的类,使开发人员可以轻松使用这种标记。
Hello, World例子
Haml的最简单的Hello World 实现像是这样:
%p { :class => "sample" , :id => "welcome" } Hello, World!
得到这样的HTML 代码:
< p class = "sample" id = "welcome" > Hello, World!</ p >
为运行Haml代码,必须已安装,如使用下列命令 Haml
以gem 安装:[ 7]
gem install haml
Haml代码若以Hello.haml
为文件名保存,则可以这样运行:
haml Hello.haml
要用Ruby 使用Haml,Ruby的Gemfile
应该包含此行:
gem 'haml'
类似eRuby ,Haml也可以访问局部变量(在同一个文件中以Ruby代码声明)。此例子使用一个Ruby控制器文件为例。
file: app/controllers/messages_controller.rbclass MessagesController < ApplicationController
def index
@message = "Hello, World!"
end
end
file: app/views/messages/index.html.haml
将得到:
< 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
输出:
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的实现:
参见
参考资料
外部链接