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。[3][4]Haml可以在命令行界面中使用,也可以作为一个单独的Ruby模块或在一个Ruby on Rails应用程序中使用,这使Haml可用于广泛的应用程序。
模板引擎 | |
設計者 | Nick Walsh |
實作者 | |
当前版本 |
|
實作語言 | Ruby |
操作系统 | 跨平台 |
許可證 | |
文件扩展名 | .haml |
網站 | haml |
历史
Haml最早由Hampton Catlin于2006年发布,它的成果领先于其他几个人。他的动机是使HTML更简单、清晰和易于使用。自2006年以来,它已随新版本发布而多次修订。2012年4月,Haml的维护由Norman Clarke接手。[5]Natalie Weizenbaum致力于使Haml可以在Ruby应用程序中使用,而品牌与设计则由Nick Walsh完成。目前的维护团队中还有Matt Wildig、Akira Matsuda和Tee Parham。[2]
版本历史
特性
Haml的发展有四项原则。
精巧缩进
有良好缩进的标记语言可以改善外观、使阅读器易于读取,并有助确定元素的开始与结束位置。
清晰结构
有清晰结构的标记语言有助于代码维护和理解最终结果的逻辑。Haml在这方面是否提供了有差异的优势,这点尚不清晰。
例子
Haml标记在语法上类似CSS。例如,Haml同样使用.
(点)表示CSS的类,使开发人员可以轻松使用这种标记。
Hello, World例子
Haml的最简单的Hello World实现像是这样:
Haml作为命令行工具
%p{:class => "sample", :id => "welcome"} Hello, World!
得到这样的HTML代码:
<p class="sample" id="welcome">Hello, World!</p>
为运行Haml代码,必须已安装,如使用下列命令 Haml
以gem安装:[6]
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 < ApplicationController def index @message = "Hello, World!" end end
- file: app/views/messages/index.html.haml
#welcome %p= @message
将得到:
<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
输出:
<p>Hello, World!</p>
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>
两者的关键差异是:
嵌入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的实现:
- 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)(页面存档备份,存于)
参见
参考资料
外部链接
- 官方网站
- Haml tutorial(页面存档备份,存于)
- Learn Haml (basic)(页面存档备份,存于)
- GitHub上的Haml
- phpHaml(页面存档备份,存于),面向PHP的Haml实现
- Haml Google讨论组(页面存档备份,存于)
- Haml 1.0(页面存档备份,存于),Ruby on Rails博客上的公告