Haml

维基百科,自由的百科全书
跳转到导航 跳转到搜索
Haml
编程范型模板引擎英语Template engine (web)
设计者Nick Walsh
实现者
当前版本
    Module:EditAtWikidata第29行Lua错误:attempt to index field 'wikibase' (a nil value)
    实现语言Ruby
    操作系统跨平台
    许可证
    文件扩展名.haml
    网站haml.info

    HamlHTML Abstraction Markup Language,HTML抽象标记语言)是一种模板系统,它可以避免在Web文档中内嵌代码,使HTML更简易和干净。Haml为HTML中提供了一些动态内容的灵活性。类似其他Web语言(如PHPASPJSP)和模板系统(如eRuby),Haml也嵌入一些在运行时执行的代码并生成HTML代码,从而提供一些动态内容。为运行Haml代码,文件需要采用.haml扩展名。这些文件类似.erb或eRuby文件,这有助于在开发网络应用程序时嵌入Ruby代码。在解析代码注释时,Haml采用与Ruby 1.9或之后版本相同的规则。Haml只能理解兼容ASCII的编码(例如UTF-8),而不能理解不兼容ASCII的UTF-16UTF-32[3][4]Haml可以在命令行界面中使用,也可以作为一个单独的Ruby模块或在一个Ruby on Rails应用程序中使用,这使Haml可用于广泛的应用程序。

    历史[编辑]

    Haml最早由Hampton Catlin英语Hampton Catlin于2006年发布,它的成果领先于其他几个人。他的动机是使HTML更简单、清晰和易于使用。自2006年以来,它已随新版本发布而多次修订。2012年4月,Haml的维护由Norman Clarke接手。[5]Natalie Weizenbaum致力于使Haml可以在Ruby应用程序中使用,而品牌与设计则由Nick Walsh完成。目前的维护团队中还有Matt Wildig、Akira Matsuda和Tee Parham。[1]

    版本历史[编辑]

    特性[编辑]

    Haml的发展有四项原则。

    用户友好的标记[编辑]

    置标语言如果遵循下列特征,那么它则用户友好:

    • 语言能轻松理解
    • 使用便捷(其实现)

    DRY[编辑]

    标记语言应坚持不重复自身(DRY)原则。它应该:

    • 避免不必要的重复
    • 专注于干净的代码

    精巧缩进[编辑]

    有良好缩进的标记语言可以改善外观、使阅读器易于读取,并有助确定元素的开始与结束位置。

    清晰结构[编辑]

    有清晰结构的标记语言有助于代码维护和理解最终结果的逻辑。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代码,必须已安装,如使用下列命令 Hamlgem安装:[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模块[编辑]

    要独立于RailsActionView页面存档备份,存于互联网档案馆)使用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>
    

    两者的关键差异是:

    • Haml不像eRuby那样,每个元素都有开始与结束
    • eRuby语法看上去很像、更像HTML,而Haml更像CSS
    • Haml使用缩进来嵌套标签元素,而eRuby使用与HTML相同的表示法
    • 在Haml属性中,classid可以用.#表示classid关键字。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 RailsMerb英语Merb中,该Ruby实现也能够独立使用。Haml可以轻松配合其他语言使用。下列是各种语言对Haml的实现:

    参见[编辑]

    参考资料[编辑]

    1. ^ 1.0 1.1 GitHub. [30 January 2016]. (原始内容存档于2017-04-27). 
    2. ^ Change Log. [2020-11-30]. (原始内容存档于2015-01-05). 
    3. ^ Encoding. [29 January 2016]. (原始内容存档于2017-05-29). 
    4. ^ UTF encodings. [7 February 2016]. (原始内容存档于2019-02-16). 
    5. ^ History. [29 January 2016]. (原始内容存档于2017-05-27). 
    6. ^ Using Haml. [7 February 2016]. (原始内容存档于2017-05-29). 

    外部链接[编辑]