来源:http://ningandjiao.iteye.com/blog/1772845

一个技术能够风靡,一定是有它的原因的,在熟悉之前,我们没有资格去对它做任何的判断。

Haml 是一种简洁优美的模板语言,使用它之后可以大大缩减模板代码,减少冗余,提高可读性。并且Haml是一种完备的模板语言,没有牺牲当前模板语言的任何特性。

Haml的使用通常有两种方式: 
    一是作为Ruby on Rails的插件来使用; 
    二是作为一个独立的Ruby module来使用。 
因为Haml可以提升我们编写HTML文件的速度,同时避免一些不必要的语法错误,因此还可以使用Haml作为一个加速HTML编写的工具,当然前提条件是有一个能够快速的把HAML编译成HTML的工具。

Haml的语法 

从Html到Haml 
Html文件如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>订餐</title>
<link rel="stylesheet" href="lib/jquery.mobile-1.2.0/jquery.mobile-1.2.0.min.css"/> <script src="lib/jquery.js"></script>
<script src="lib/jquery.mobile-1.2.0/jquery.mobile-1.2.0.min.js"></script> <script src='data/foods.json' type='text/javascript'></script>
<script src='data/restaurants.json' type='text/javascript'></script>
<script src='data/users.json' type='text/javascript'></script>
<script src="js/application.js"></script>
<link rel="stylesheet" href="css/application.css" type="text/css">
</head>
<body>
<div data-role="page" id="main">
<div data-role="header">
<h1>订餐</h1>
</div>
<!-- /header --> <div data-role="content">
<a href="#order" data-role="button">帮订餐</a>
<a href="#orders" data-role="button">看订单</a>
</div>
<!-- /content -->
</div> <div data-role="page" id="order">
<div data-role="header">
<a href="#main" data-icon="back">Back</a>
<h1>订餐</h1>
</div>
<!-- /header --> <div data-role="content">
<label>人:</label>
<input type="text" name="name" id="user" value="" readonly/>
<a href="#peoples" data-role="button">选人</a> <label>餐厅:</label>
<input type="text" name="name" id="restaurant" value="" readonly/>
<a href="#restaurants" data-role="button">选餐厅</a> <label>套餐:</label>
<input type="text" name="name" id="food" value="" readonly/>
<a href="#foods" data-role="button" id="choose-food">选套餐</a>
<a id="confirm" href="#" data-role="button">确定</a>
</div>
<!-- /content -->
</div> <div data-role="page" data-add-back-btn="true" id="orders">
<div data-role="header">
<h1>订单显示</h1>
</div>
<ul id="orderList" data-role="listview" data-theme="c"/>
</div> <div data-role="page" data-add-back-btn="true" id="peoples">
<div data-role="header">
<h1>选人</h1>
</div>
<ul id="userList" data-role="listview" data-theme="c"/>
</div> <div data-role="page" data-add-back-btn="true" id="restaurants">
<div data-role="header">
<h1>选餐厅</h1>
</div>
<ul id="restaurantList" data-role="listview" data-theme="c"/>
</div> <div data-role="page" data-add-back-btn="true" id="foods">
<div data-role="header">
<h1>选套餐</h1>
</div>
<ul id="foodList" data-role="listview" data-theme="c"/>
</div>
</body>
</body>
</html>

改写后的HAML文件如下:

!!! Mobile
%html
%head
%meta{:charset=>"utf-8"}
%meta{:name=>"viewport", :content=>"width=device-width, initial-scale=1"}
%title 订餐
%link{:rel=>'stylesheet', :href=>'lib/jquery.mobile-1.2.0/jquery.mobile-1.2.0.min.css'}
%link{:rel=>'stylesheet', :href=>'css/application.css'}
%script{:src=>'lib/jquery.js', :type=>'text/javascript'}
%script{:src=>'lib/jquery.mobile-1.2.0/jquery.mobile-1.2.0.min.js', :type=>'text/javascript'}
%script{:src=>'data/foods.json', :type=>'text/javascript'}
%script{:src=>'data/restaurants.json', :type=>'text/javascript'}
%script{:src=>'data/users.json', :type=>'text/javascript'}
%script{:src=>'js/application.js', :type=>'text/javascript'} %body
%div#main{:data => {:role=>'page'}}
%div{:data=> {:role=>'header'}}
%h1 订餐
%div{:data=> {:role=>'content'}}
%a{:href=>'#order', :data=> {:role=>'button'}} 帮订餐
%a{:href=>'#orders', :data=> {:role=>'button'}} 看订单 %div#order{:data=> {:role=>'page'}}
%div{:data=> {:role=>'header'}}
%a{:href=>'#main', :data=> {:icon=>'back'}} Back
%h1 订餐
%div{:data=> {:role=>'content'}}
%label 人:
%input#user{:type=>'text',:name=>'name',:readonly=>'true'}
%a{:href=>'#peoples', :data=> {:role=>'button'}} 选人 %label 餐厅:
%input#restaurant{:type=>'text',:name=>'name',:readonly=>'true'}
%a{:href=>'#restaurants', :data=> {:role=>'button'}} 选餐厅 %label 套餐:
%input#food{:type=>'text',:name=>'name',:readonly=>'true'}
%a{:href=>'#foods', :data=> {:role=>'button'}} 选人 %a#confirm{:data=> {:role=>'button'}} 确定 %div#orders{:data=> {:role=>'page', :add_back_btn=>'true'}}
%div{:data=> {:role=>'header'}}
%h1 订单显示
%ul#orderList{:data=> {:role=>'listview'},:data=> {:theme=>'c'}} %div#peoples{:data=> {:role=>'page',:add_back_btn=>'true'}}
%div{:data=> {:role=>'header'}}
%h1 选人
%ul#userList{:data=> {:role=>'listview'},:data=> {:theme=>'c'}} %div#restaurants{:data=> {:role=>'page',:add_back_btn=>'true'}}
%div{:data=> {:role=>'header'}}
%h1 选餐厅
%ul#restaurantList{:data=> {:role=>'listview',:theme=>'c'}} %div#foods{:data=> {:role=>'page', :add_back_btn=>'true'}}
%div{:data=> {:role=>'header'}}
%h1 选套餐
%ul#foodList{:data=> {:role=>'listview',:theme=>'c'}}

Haml的确让代码变得更短了,对于编写速度的提升目前还没有感受,因为,对于非常熟悉HTML语法的程序员来说,Haml的一些习惯还是会让我们填不少的坑,但是一个工具一定是在你熟练使用的时候才能提升你的效率,如果,对于Haml和Html5同样熟悉的开发人员,Haml的确是更有效率的工具。

HAML学习的更多相关文章

  1. emmet,jade,haml, slim,less,sass,coffeescript等的实战优缺点

    摘要: 文章背景,来自于群内周五晚上的一次头脑风暴式的思维碰撞交流活动. 随着前端技术的蓬勃发展, 各种新技术随着生产力的需要不断的涌入我们的视野, 那今天探讨的话题是这些新时代的前端兵器谱: 一. ...

  2. Node.js 学习资源

    这篇文章编译整理自Stack Overflow的一个如何开始学习Node.js的Wiki帖,这份资源列表在SO上面浏览接近60万次,数千个收藏和顶.特意整理发布到这里,其中添加了部分中文参考资料. 学 ...

  3. Github上PHP资源汇总大全,php学习的好资料

    Github上PHP资源汇总大全,php学习的好资料 国外程序员ziadoz 在Github上收集整理了PHP的各种资源,内容包括模板.框架.数据库.安全等方面的库和工具.汇总了各种PHP资源,供各位 ...

  4. 转:Java学习路线图

    作者: nuanyangyang 标  题: Java学习路线图(整理中,欢迎纠正) 发信站: 北邮人论坛 (Mon Aug 11 19:28:16 2014), 站内   [以下肯定是不完整的列表, ...

  5. haml、sass简单的解释

    1. Haml 全名为 HTML Abstract Markup Language,主要就是让开发者能够使用缩排的方式撰写 HTML,做到永不忘记关 Tag 的效果. 例如:%h1= "He ...

  6. sass的学习笔记

    sass初学入门笔记(一) 我本身是个新手,一边学sass一边记下的笔记,可能有点罗嗦,但是复习起来的话还是比较全面直观的.当然,最重要的还是去实践,实践得真理 其它 CSS 预处理器语言: CSS ...

  7. [转]SCSS 和 SASS 和 HAML 和CoffeeScript

    Asset Pipeline 提供了内建直接使用 Sass 撰写 CSS 的功能. 你也许会生出这样的疑惑:什么是 Sass? Why should I care? Sass (Syntactical ...

  8. 从直播编程到直播教育:LiveEdu.tv开启多元化的在线学习直播时代

    2015年9月,一个叫Livecoding.tv的网站在互联网上引起了编程界的注意.缘于Pingwest品玩的一位编辑在上网时无意中发现了这个网站,并写了一篇文章<一个比直播睡觉更奇怪的网站:直 ...

  9. Angular2学习笔记(1)

    Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...

随机推荐

  1. [POJ] 3277 .City Horizon(离散+线段树)

    来自这两篇博客的总结 http://blog.csdn.net/SunnyYoona/article/details/43938355 http://m.blog.csdn.net/blog/mr_z ...

  2. FHS目录配置下,常见的几个问题及解答

    请说明/bin与/usr/bin目录所放置的执行文件有何不同之处? /bin主要放置在开机时,以及进入单人维护模式后还能够被使用的指令,至于/usr/bin则是大部分软件提供的指令放置处. 请说明/b ...

  3. ZPPR016-在制品清单报表

    *&---------------------------------------------------------------------**& Report ZPPR016*&a ...

  4. php 函数积累

    array_slice()<?php $a=array("red","green","blue","yellow" ...

  5. 英语语法最终珍藏版笔记-6“情态动词+have+ done”的含义

    “情态动词+have+ done”的含义 1.Must have done的含义.“must have+过去分词”表示对过去的推测,意思是“一定已经,想必已经,准是已经….”,只用于肯定句中.例如: ...

  6. windows日常软件推荐

    下面的软件都是本人实际使用过的. 我只是推荐,没逼着你用,也没收谁的钱做广告. 操作系统win7 64bits. 不定期更新. [QQ轻聊版] 本人就是一个码畜,上班族,天气好坏都得挤地铁去上班,也没 ...

  7. 在IE地址栏输入JS的有趣效果

    1.编辑网页 在地址栏输入下面的代码按enter,网页上所有元素都能变成可编辑状态,你可以移动.调整元素大小.如果你只是讨厌某个网站想发泄一下,我建议你使用NetDisater. 代码如下: java ...

  8. 5分钟实现Android中更换头像功能

    写在前面:更换头像这个功能在用户界面几乎是100%出现的.通过拍摄照片或者调用图库中的图片,并且进行剪裁,来进行头像的设置.功能相关截图如下: 下面我们直接看看完整代码吧: 1 2 3 4 5 6 7 ...

  9. mysql 1449 : The user specified as a definer ('root'@'%') does not exist ,mysql 赋给用户权限 grant all privileges on

    mysql 1449 : The user specified as a definer ('root'@'%') does not exist 解决方法 遇到了 SQLException: acce ...

  10. ArrayList、linklist、list的区别

    List是一个接口,ArrayList和LinkedList是两个实现类,他们实现的方式不一样,其实LinkedList才是真正的链表(如果不清楚什么是链表,需要了解一下相关数据结构的知识,这不是一两 ...