2010-08-22 19:04:02 -04:00
|
|
|
# Haml
|
2006-06-30 11:14:44 -04:00
|
|
|
|
2014-04-30 12:10:47 -04:00
|
|
|
[![Gem Version](https://badge.fury.io/rb/haml.svg)](http://rubygems.org/gems/haml)
|
2022-09-22 20:24:45 -04:00
|
|
|
[![test](https://github.com/haml/haml/actions/workflows/test.yml/badge.svg)](https://github.com/haml/haml/actions/workflows/test.yml)
|
2019-05-24 09:00:29 -04:00
|
|
|
[![Code Climate](https://codeclimate.com/github/haml/haml/badges/gpa.svg)](https://codeclimate.com/github/haml/haml)
|
2014-06-03 14:51:28 -04:00
|
|
|
[![Inline docs](http://inch-ci.org/github/haml/haml.png)](http://inch-ci.org/github/haml/haml)
|
2012-05-04 07:10:06 -04:00
|
|
|
|
2012-04-26 17:12:44 -04:00
|
|
|
Haml is a templating engine for HTML. It's designed to make it both easier and
|
|
|
|
more pleasant to write HTML documents, by eliminating redundancy, reflecting the
|
|
|
|
underlying structure that the document represents, and providing an elegant syntax
|
|
|
|
that's both powerful and easy to understand.
|
2006-09-12 09:54:22 -04:00
|
|
|
|
2012-04-26 17:12:44 -04:00
|
|
|
## Basic Usage
|
2007-02-23 02:54:57 -05:00
|
|
|
|
2012-04-26 17:12:44 -04:00
|
|
|
Haml can be used from the command line or as part of a Ruby web framework. The
|
|
|
|
first step is to install the gem:
|
2007-11-17 14:55:26 -05:00
|
|
|
|
2014-02-18 10:03:41 -05:00
|
|
|
~~~sh
|
2014-02-05 16:29:34 -05:00
|
|
|
gem install haml
|
2014-02-18 10:03:41 -05:00
|
|
|
~~~
|
2007-11-17 14:55:26 -05:00
|
|
|
|
2012-04-26 17:12:44 -04:00
|
|
|
After you write some Haml, you can run
|
2009-06-21 19:27:00 -04:00
|
|
|
|
2014-02-18 10:03:41 -05:00
|
|
|
~~~sh
|
2022-09-23 09:14:24 -04:00
|
|
|
haml render document.haml
|
2014-02-18 10:03:41 -05:00
|
|
|
~~~
|
2009-06-21 19:27:00 -04:00
|
|
|
|
2012-04-26 17:12:44 -04:00
|
|
|
to compile it to HTML. For more information on these commands, check out
|
2009-06-21 19:27:00 -04:00
|
|
|
|
2014-02-18 10:03:41 -05:00
|
|
|
~~~sh
|
2014-02-05 16:29:34 -05:00
|
|
|
haml --help
|
2014-02-18 10:03:41 -05:00
|
|
|
~~~
|
2009-06-21 19:27:00 -04:00
|
|
|
|
2020-07-25 14:12:55 -04:00
|
|
|
To use Haml programmatically, check out the [YARD documentation](http://haml.info/docs/yardoc/).
|
2007-02-23 02:54:57 -05:00
|
|
|
|
2012-04-26 17:12:44 -04:00
|
|
|
## Using Haml with Rails
|
|
|
|
|
|
|
|
To use Haml with Rails, simply add Haml to your Gemfile and run `bundle`.
|
|
|
|
|
2014-02-18 10:03:41 -05:00
|
|
|
~~~ruby
|
2014-02-05 16:29:34 -05:00
|
|
|
gem 'haml'
|
2014-02-18 10:03:41 -05:00
|
|
|
~~~
|
2013-12-27 13:54:23 -05:00
|
|
|
|
2022-09-25 03:01:59 -04:00
|
|
|
If you'd like to replace Rails's ERB-based generators with Haml, add
|
2022-09-25 02:59:18 -04:00
|
|
|
[haml-rails](https://github.com/haml/haml-rails) to your Gemfile as well.
|
2007-11-17 14:55:26 -05:00
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
## Formatting
|
2006-09-12 09:05:28 -04:00
|
|
|
|
2012-04-26 17:12:44 -04:00
|
|
|
The most basic element of Haml is a shorthand for creating HTML:
|
2006-11-04 01:36:16 -05:00
|
|
|
|
2014-02-18 10:03:41 -05:00
|
|
|
~~~haml
|
2014-02-05 16:29:34 -05:00
|
|
|
%tagname{:attr1 => 'value1', :attr2 => 'value2'} Contents
|
2014-02-18 10:03:41 -05:00
|
|
|
~~~
|
2006-11-04 01:36:16 -05:00
|
|
|
|
2012-04-26 17:12:44 -04:00
|
|
|
No end-tag is needed; Haml handles that automatically. If you prefer HTML-style
|
|
|
|
attributes, you can also use:
|
2009-07-04 18:46:34 -04:00
|
|
|
|
2014-02-18 10:03:41 -05:00
|
|
|
~~~haml
|
2014-02-05 16:29:34 -05:00
|
|
|
%tagname(attr1='value1' attr2='value2') Contents
|
2014-02-18 10:03:41 -05:00
|
|
|
~~~
|
2009-07-04 18:46:34 -04:00
|
|
|
|
2012-04-26 17:12:44 -04:00
|
|
|
Adding `class` and `id` attributes is even easier. Haml uses the same syntax as
|
|
|
|
the CSS that styles the document:
|
2006-10-27 16:36:34 -04:00
|
|
|
|
2014-02-18 10:03:41 -05:00
|
|
|
~~~haml
|
2014-02-05 16:29:34 -05:00
|
|
|
%tagname#id.class
|
2014-02-18 10:03:41 -05:00
|
|
|
~~~
|
2006-11-04 01:36:16 -05:00
|
|
|
|
2012-04-26 17:12:44 -04:00
|
|
|
In fact, when you're using the `<div>` tag, it becomes _even easier_. Because
|
|
|
|
`<div>` is such a common element, a tag without a name defaults to a div. So
|
2006-10-27 16:36:34 -04:00
|
|
|
|
2014-02-18 10:03:41 -05:00
|
|
|
~~~haml
|
2014-02-05 16:29:34 -05:00
|
|
|
#foo Hello!
|
2014-02-18 10:03:41 -05:00
|
|
|
~~~
|
2006-11-04 01:36:16 -05:00
|
|
|
|
2006-12-18 21:56:49 -05:00
|
|
|
becomes
|
2006-11-05 19:35:38 -05:00
|
|
|
|
2014-02-18 10:03:41 -05:00
|
|
|
~~~html
|
2014-02-05 16:29:34 -05:00
|
|
|
<div id='foo'>Hello!</div>
|
2014-02-18 10:03:41 -05:00
|
|
|
~~~
|
2008-04-08 02:09:17 -04:00
|
|
|
|
2012-04-26 17:12:44 -04:00
|
|
|
Haml uses indentation to bring the individual elements to represent the HTML
|
|
|
|
structure. A tag's children are indented beneath than the parent tag. Again, a
|
|
|
|
closing tag is automatically added. For example:
|
2006-10-14 18:24:53 -04:00
|
|
|
|
2014-02-18 10:03:41 -05:00
|
|
|
~~~haml
|
2014-02-05 16:29:34 -05:00
|
|
|
%ul
|
|
|
|
%li Salt
|
|
|
|
%li Pepper
|
2014-02-18 10:03:41 -05:00
|
|
|
~~~
|
2006-10-14 18:24:53 -04:00
|
|
|
|
2006-12-18 21:56:49 -05:00
|
|
|
becomes:
|
2006-10-22 17:42:45 -04:00
|
|
|
|
2014-02-18 10:03:41 -05:00
|
|
|
~~~html
|
2014-02-05 16:29:34 -05:00
|
|
|
<ul>
|
|
|
|
<li>Salt</li>
|
|
|
|
<li>Pepper</li>
|
|
|
|
</ul>
|
2014-02-18 10:03:41 -05:00
|
|
|
~~~
|
2006-11-16 20:12:50 -05:00
|
|
|
|
2006-12-18 21:56:49 -05:00
|
|
|
You can also put plain text as a child of an element:
|
2006-10-14 18:24:53 -04:00
|
|
|
|
2014-02-18 10:03:41 -05:00
|
|
|
~~~haml
|
2014-02-05 16:29:34 -05:00
|
|
|
%p
|
|
|
|
Hello,
|
|
|
|
World!
|
2014-02-18 10:03:41 -05:00
|
|
|
~~~
|
2006-11-18 04:48:34 -05:00
|
|
|
|
2012-04-26 17:12:44 -04:00
|
|
|
It's also possible to embed Ruby code into Haml documents. An equals sign, `=`,
|
|
|
|
will output the result of the code. A hyphen, `-`, will run the code but not
|
|
|
|
output the result. You can even use control statements like `if` and `while`:
|
2006-10-14 18:24:53 -04:00
|
|
|
|
2014-02-18 10:03:41 -05:00
|
|
|
~~~haml
|
2014-02-05 16:29:34 -05:00
|
|
|
%p
|
|
|
|
Date/Time:
|
|
|
|
- now = DateTime.now
|
|
|
|
%strong= now
|
|
|
|
- if now > DateTime.parse("December 31, 2006")
|
|
|
|
= "Happy new " + "year!"
|
2014-02-18 10:03:41 -05:00
|
|
|
~~~
|
2006-09-12 09:05:28 -04:00
|
|
|
|
2012-04-26 17:12:44 -04:00
|
|
|
Haml provides far more tools than those presented here. Check out the [reference
|
2012-05-01 09:25:56 -04:00
|
|
|
documentation](http://haml.info/docs/yardoc/file.REFERENCE.html)
|
2010-03-31 02:43:35 -04:00
|
|
|
for full details.
|
2006-09-10 13:02:52 -04:00
|
|
|
|
2010-08-22 19:04:02 -04:00
|
|
|
### Indentation
|
2007-02-23 02:54:57 -05:00
|
|
|
|
2012-04-26 17:12:44 -04:00
|
|
|
Haml's indentation can be made up of one or more tabs or spaces. However,
|
|
|
|
indentation must be consistent within a given document. Hard tabs and spaces
|
|
|
|
can't be mixed, and the same number of tabs or spaces must be used throughout.
|
2007-02-23 02:54:57 -05:00
|
|
|
|
2012-04-28 05:40:55 -04:00
|
|
|
## Contributing
|
|
|
|
|
|
|
|
Contributions are welcomed, but before you get started please read the
|
2012-05-01 09:25:56 -04:00
|
|
|
[guidelines](http://haml.info/development.html#contributing).
|
2012-04-28 05:40:55 -04:00
|
|
|
|
2012-04-28 10:02:51 -04:00
|
|
|
After forking and then cloning the repo locally, install Bundler and then use it
|
2014-02-18 18:39:47 -05:00
|
|
|
to install the development gem dependencies:
|
2014-02-18 10:03:41 -05:00
|
|
|
~~~sh
|
2014-02-05 16:29:34 -05:00
|
|
|
gem install bundler
|
|
|
|
bundle install
|
2014-02-18 10:03:41 -05:00
|
|
|
~~~
|
2012-04-28 10:02:51 -04:00
|
|
|
|
|
|
|
Once this is complete, you should be able to run the test suite:
|
2014-02-18 10:03:41 -05:00
|
|
|
~~~sh
|
2014-02-05 16:29:34 -05:00
|
|
|
rake
|
2014-02-18 10:03:41 -05:00
|
|
|
~~~
|
2012-04-28 10:02:51 -04:00
|
|
|
|
|
|
|
You'll get a warning that you need to install haml-spec, so run this:
|
|
|
|
|
2014-02-18 10:03:41 -05:00
|
|
|
~~~sh
|
2014-02-05 16:29:34 -05:00
|
|
|
git submodule update --init
|
2014-02-18 10:03:41 -05:00
|
|
|
~~~
|
2012-04-28 10:02:51 -04:00
|
|
|
|
|
|
|
At this point `rake` should run without error or warning and you are ready to
|
|
|
|
start working on your patch!
|
|
|
|
|
2012-05-01 11:09:15 -04:00
|
|
|
Note that you can also run just one test out of the test suite if you're working
|
|
|
|
on a specific area:
|
|
|
|
|
2014-02-18 10:03:41 -05:00
|
|
|
~~~sh
|
2014-02-05 16:29:34 -05:00
|
|
|
ruby -Itest test/helper_test.rb -n test_buffer_access
|
2014-02-18 10:03:41 -05:00
|
|
|
~~~
|
2012-05-01 11:09:15 -04:00
|
|
|
|
2015-06-08 11:56:04 -04:00
|
|
|
Haml currently supports Ruby 2.0.0 and higher, so please make sure your changes run on 2.0+.
|
2012-05-01 11:09:15 -04:00
|
|
|
|
2013-02-12 21:26:30 -05:00
|
|
|
## Team
|
|
|
|
|
|
|
|
### Current Maintainers
|
|
|
|
|
|
|
|
* [Akira Matsuda](https://github.com/amatsuda)
|
2017-01-24 09:26:21 -05:00
|
|
|
* [Matt Wildig](https://github.com/mattwildig)
|
2013-11-26 12:47:51 -05:00
|
|
|
* [Tee Parham](https://github.com/teeparham)
|
2017-05-02 17:44:05 -04:00
|
|
|
* [Takashi Kokubun](https://github.com/k0kubun)
|
2013-02-12 21:26:30 -05:00
|
|
|
|
|
|
|
### Alumni
|
2006-09-10 13:02:52 -04:00
|
|
|
|
2012-04-26 17:12:44 -04:00
|
|
|
Haml was created by [Hampton Catlin](http://hamptoncatlin.com), the author of
|
2013-02-12 21:26:30 -05:00
|
|
|
the original implementation. Hampton is no longer involved in day-to-day coding,
|
|
|
|
but still consults on language issues.
|
2009-06-21 18:09:10 -04:00
|
|
|
|
2014-07-18 15:37:55 -04:00
|
|
|
[Natalie Weizenbaum](http://nex-3.com) was for many years the primary developer
|
2013-02-12 21:26:30 -05:00
|
|
|
and architect of the "modern" Ruby implementation of Haml.
|
2012-04-27 15:01:06 -04:00
|
|
|
|
2017-01-24 09:26:21 -05:00
|
|
|
[Norman Clarke](http://github.com/norman) was the primary maintainer of Haml from 2012 to 2016.
|
|
|
|
|
2012-04-26 17:12:44 -04:00
|
|
|
## License
|
|
|
|
|
2014-07-18 15:37:55 -04:00
|
|
|
Some of Natalie's work on Haml was supported by Unspace Interactive.
|
2006-11-04 03:35:06 -05:00
|
|
|
|
2006-12-18 21:56:49 -05:00
|
|
|
Beyond that, the implementation is licensed under the MIT License.
|
2012-04-26 17:12:44 -04:00
|
|
|
|
2019-02-18 20:27:56 -05:00
|
|
|
Copyright (c) 2006-2019 Hampton Catlin, Natalie Weizenbaum and the Haml team
|
2012-04-26 17:12:44 -04:00
|
|
|
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
|
|
this software and associated documentation files (the "Software"), to deal in
|
|
|
|
the Software without restriction, including without limitation the rights to
|
|
|
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
|
|
the Software, and to permit persons to whom the Software is furnished to do so,
|
|
|
|
subject to the following conditions:
|
|
|
|
|
|
|
|
The above copyright notice and this permission notice shall be included in all
|
|
|
|
copies or substantial portions of the Software.
|
|
|
|
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
|
|
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
|
|
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
|
|
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
|
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|