2009-03-31 18:45:37 -04:00
|
|
|
# Haml and Sass
|
2006-06-30 11:14:44 -04:00
|
|
|
|
2006-12-18 21:56:49 -05:00
|
|
|
Haml and Sass are templating engines
|
|
|
|
for the two most common types of documents on the web:
|
|
|
|
HTML and CSS, respectively.
|
|
|
|
They are designed to make it both easier and more pleasant
|
2007-01-02 02:45:29 -05:00
|
|
|
to code HTML and CSS documents,
|
2006-12-18 21:56:49 -05:00
|
|
|
by eliminating redundancy,
|
|
|
|
reflecting the underlying structure that the document represents,
|
|
|
|
and providing elegant, easily understandable, and powerful syntax.
|
2006-09-12 09:54:22 -04:00
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
## Using
|
2007-02-23 02:54:57 -05:00
|
|
|
|
2007-11-17 14:55:26 -05:00
|
|
|
There are several ways to use Haml and Sass.
|
2008-09-28 20:54:58 -04:00
|
|
|
They can be used as a plugin for Rails or Merb,
|
2007-11-17 14:55:26 -05:00
|
|
|
or embedded on their own in other applications.
|
|
|
|
The first step of all of these is to install the Haml gem:
|
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
gem install haml
|
2007-11-17 14:55:26 -05:00
|
|
|
|
|
|
|
To install Haml and Sass as a Rails plugin,
|
2009-03-31 18:45:37 -04:00
|
|
|
just run `haml --rails path/to/rails/app`
|
2007-02-23 02:54:57 -05:00
|
|
|
and both Haml and Sass will be installed.
|
2009-03-31 18:45:37 -04:00
|
|
|
Views with the `.haml` (or `.html.haml` for edge)
|
2007-11-17 14:55:26 -05:00
|
|
|
extension will automatically use Haml.
|
2007-02-23 02:54:57 -05:00
|
|
|
Sass is a little more complicated;
|
2009-03-31 18:45:37 -04:00
|
|
|
`.sass` files should be placed in public/stylesheets/sass,
|
2007-02-23 02:54:57 -05:00
|
|
|
where they'll be automatically compiled
|
|
|
|
to corresponding CSS files in public/stylesheets when needed
|
|
|
|
(the Sass template directory is customizable...
|
|
|
|
see the Sass module docs for details).
|
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
For Merb, `.html.haml` views will work without any further modification.
|
2008-11-24 21:35:14 -05:00
|
|
|
To enable Sass, you also need to add a dependency.
|
2007-11-17 14:55:26 -05:00
|
|
|
To do so, just add
|
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
dependency "merb-haml"
|
2007-11-17 14:55:26 -05:00
|
|
|
|
2008-11-24 20:14:22 -05:00
|
|
|
to config/dependencies.rb (or config/init.rb in a flat/very flat Merb application).
|
2007-11-17 14:55:26 -05:00
|
|
|
Then it'll work just like it does in Rails.
|
|
|
|
|
|
|
|
To use Haml and Sass programatically,
|
|
|
|
check out the RDocs for the Haml and Sass modules.
|
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
## Formatting
|
2006-09-12 09:05:28 -04:00
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
### Haml
|
2006-11-04 01:36:16 -05:00
|
|
|
|
2006-12-18 21:56:49 -05:00
|
|
|
The most basic element of Haml
|
2009-03-31 18:45:37 -04:00
|
|
|
is a shorthand for creating HTML
|
2006-11-04 01:36:16 -05:00
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
%tagname{:attr1 => 'value1', :attr2 => 'value2'} Contents
|
2006-11-04 01:36:16 -05:00
|
|
|
|
2006-12-18 21:56:49 -05:00
|
|
|
No end-tag is needed; Haml handles that automatically.
|
2009-03-31 18:45:37 -04:00
|
|
|
Adding `class` and `id` attributes is even easier.
|
2006-12-18 21:56:49 -05:00
|
|
|
Haml uses the same syntax as the CSS that styles the document:
|
2006-10-27 16:36:34 -04:00
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
%tagname#id.class
|
2006-11-04 01:36:16 -05:00
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
In fact, when you're using the `<div>` tag,
|
|
|
|
it becomes _even easier_.
|
|
|
|
Because `<div>` is such a common element,
|
2006-12-18 21:56:49 -05:00
|
|
|
a tag without a name defaults to a div. So
|
2006-10-27 16:36:34 -04:00
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
#foo Hello!
|
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
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
<div id='foo'>Hello!</div>
|
2008-04-08 02:09:17 -04:00
|
|
|
|
2006-12-18 21:56:49 -05:00
|
|
|
Haml uses indentation
|
|
|
|
to bring the individual elements to represent the HTML structure.
|
2008-06-01 00:43:38 -04:00
|
|
|
A tag's children are indented beneath than the parent tag.
|
2006-12-18 21:56:49 -05:00
|
|
|
Again, a closing tag is automatically added.
|
2006-11-13 20:58:55 -05:00
|
|
|
For example:
|
2006-10-14 18:24:53 -04:00
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
%ul
|
|
|
|
%li Salt
|
|
|
|
%li Pepper
|
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
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
<ul>
|
|
|
|
<li>Salt</li>
|
|
|
|
<li>Pepper</li>
|
|
|
|
</ul>
|
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
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
%p
|
|
|
|
Hello,
|
|
|
|
World!
|
2006-11-18 04:48:34 -05:00
|
|
|
|
2009-02-25 17:05:59 -05:00
|
|
|
It's also possible to embed Ruby code into Haml documents.
|
2009-03-31 18:45:37 -04:00
|
|
|
An equals sign, `=`, will output the result of the code.
|
|
|
|
A hyphen, `-`, will run the code but not output the result.
|
2006-12-18 21:56:49 -05:00
|
|
|
You can even use control statements
|
2009-03-31 18:45:37 -04:00
|
|
|
like `if` and `while`:
|
2006-10-14 18:24:53 -04:00
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
%p
|
|
|
|
Date/Time:
|
|
|
|
- now = DateTime.now
|
|
|
|
%strong= now
|
|
|
|
- if now > DateTime.parse("December 31, 2006")
|
|
|
|
= "Happy new " + "year!"
|
2006-09-12 09:05:28 -04:00
|
|
|
|
2006-12-18 21:56:49 -05:00
|
|
|
Haml provides far more tools than those presented here.
|
|
|
|
Check out the reference documentation in the Haml module.
|
2006-09-10 13:02:52 -04:00
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
### Sass
|
2006-11-04 01:36:16 -05:00
|
|
|
|
2007-02-23 02:54:57 -05:00
|
|
|
At its most basic,
|
|
|
|
Sass is just another way of writing CSS.
|
|
|
|
Although it's very much like normal CSS,
|
|
|
|
the basic syntax offers a few helpful features:
|
2009-06-19 06:33:03 -04:00
|
|
|
indentation indicates the properties in a rule,
|
2007-02-23 02:54:57 -05:00
|
|
|
rather than non-DRY brackets;
|
2009-06-19 06:33:03 -04:00
|
|
|
and newlines indicate the end of a properties,
|
2007-02-23 02:54:57 -05:00
|
|
|
rather than a semicolon.
|
|
|
|
For example:
|
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
#main
|
2009-06-19 06:20:48 -04:00
|
|
|
background-color: #f00
|
|
|
|
width: 98%
|
2007-02-23 02:54:57 -05:00
|
|
|
|
|
|
|
becomes:
|
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
#main {
|
|
|
|
background-color: #f00;
|
|
|
|
width: 98% }
|
2007-02-23 02:54:57 -05:00
|
|
|
|
|
|
|
However, Sass provides much more than a way to make CSS look nice.
|
|
|
|
In CSS, it's important to have accurate selectors,
|
|
|
|
so your styles don't just apply to everything.
|
|
|
|
However, in order to do this,
|
|
|
|
you need to use nested element selectors.
|
|
|
|
These get very ugly very quickly.
|
|
|
|
I'm sure everyone's had to write something like
|
|
|
|
"#main .sidebar .top p h1 a",
|
|
|
|
followed by
|
|
|
|
"#main .sidebar .top p h1 a:visited" and
|
|
|
|
"#main .sidebar .top p h1 a:hover".
|
|
|
|
Well, Sass gets rid of that.
|
|
|
|
Like Haml, it uses indentation to indicate the structure of the document.
|
|
|
|
So, what was:
|
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
#main {
|
|
|
|
width: 90%;
|
|
|
|
}
|
|
|
|
#main p {
|
|
|
|
border-style: solid;
|
|
|
|
border-width: 1px;
|
|
|
|
border-color: #00f;
|
|
|
|
}
|
|
|
|
#main p a {
|
|
|
|
text-decoration: none;
|
|
|
|
font-weight: bold;
|
|
|
|
}
|
|
|
|
#main p a:hover {
|
|
|
|
text-decoration: underline;
|
|
|
|
}
|
2007-02-23 02:54:57 -05:00
|
|
|
|
|
|
|
becomes:
|
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
#main
|
2009-06-19 06:20:48 -04:00
|
|
|
width: 90%
|
2009-03-31 18:45:37 -04:00
|
|
|
p
|
2009-06-19 06:20:48 -04:00
|
|
|
border-style: solid
|
|
|
|
border-width: 1px
|
|
|
|
border-color: #00f
|
2009-03-31 18:45:37 -04:00
|
|
|
a
|
2009-06-19 06:20:48 -04:00
|
|
|
text-decoration: none
|
|
|
|
font-weight: bold
|
2009-03-31 18:45:37 -04:00
|
|
|
a:hover
|
2009-06-19 06:20:48 -04:00
|
|
|
text-decoration: underline
|
2007-02-23 02:54:57 -05:00
|
|
|
|
|
|
|
Pretty nice, no? Well, it gets better.
|
2008-10-12 22:03:06 -04:00
|
|
|
One of the main complaints against CSS is that it doesn't allow variables.
|
2007-02-23 02:54:57 -05:00
|
|
|
What if have a color or a width you re-use all the time?
|
|
|
|
In CSS, you just have to re-type it each time,
|
|
|
|
which is a nightmare when you decide to change it later.
|
|
|
|
Not so for Sass!
|
2009-03-31 18:45:37 -04:00
|
|
|
You can use the `!` character to set variables.
|
2009-06-19 06:33:03 -04:00
|
|
|
Then, if you put `=` after your property name,
|
2008-10-12 22:03:06 -04:00
|
|
|
you can set it to a variable.
|
2007-02-23 02:54:57 -05:00
|
|
|
For example:
|
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
!note_bg= #55aaff
|
2007-02-23 02:54:57 -05:00
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
#main
|
2009-06-19 06:20:48 -04:00
|
|
|
width: 70%
|
2009-03-31 18:45:37 -04:00
|
|
|
.note
|
2009-06-19 06:20:48 -04:00
|
|
|
background-color = !note_bg
|
2009-03-31 18:45:37 -04:00
|
|
|
p
|
2009-06-19 06:20:48 -04:00
|
|
|
width: 5em
|
|
|
|
background-color = !note_bg
|
2007-02-23 02:54:57 -05:00
|
|
|
|
|
|
|
becomes:
|
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
#main {
|
|
|
|
width: 70%; }
|
|
|
|
#main .note {
|
|
|
|
background-color: #55aaff; }
|
|
|
|
#main p {
|
|
|
|
width: 5em;
|
|
|
|
background-color: #55aaff; }
|
2007-02-23 02:54:57 -05:00
|
|
|
|
2008-10-12 22:03:06 -04:00
|
|
|
You can even do simple arithmetic operations with variables,
|
2007-02-23 02:54:57 -05:00
|
|
|
adding numbers and even colors together:
|
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
!main_bg= #46ar12
|
|
|
|
!main_width= 40em
|
2007-02-23 02:54:57 -05:00
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
#main
|
2009-06-19 06:20:48 -04:00
|
|
|
background-color = !main_bg
|
|
|
|
width = !main_width
|
2009-03-31 18:45:37 -04:00
|
|
|
.sidebar
|
2009-06-19 06:20:48 -04:00
|
|
|
background-color = !main_bg + #333333
|
|
|
|
width = !main_width - 25em
|
2007-02-23 02:54:57 -05:00
|
|
|
|
|
|
|
becomes:
|
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
#main {
|
|
|
|
background-color: #46a312;
|
|
|
|
width: 40em; }
|
|
|
|
#main .sidebar {
|
|
|
|
background-color: #79d645;
|
|
|
|
width: 15em; }
|
2007-02-23 02:54:57 -05:00
|
|
|
|
2008-10-12 22:03:06 -04:00
|
|
|
Taking the idea of variables a bit further are mixins.
|
2009-06-19 06:33:03 -04:00
|
|
|
These let you group whole bunches of CSS properties into a single
|
2008-04-09 05:21:49 -04:00
|
|
|
directive and then include those anywhere you want:
|
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
=blue-border
|
2009-06-19 06:20:48 -04:00
|
|
|
border:
|
|
|
|
color: blue
|
|
|
|
width: 2px
|
|
|
|
style: dotted
|
2008-04-09 05:21:49 -04:00
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
.comment
|
|
|
|
+blue-border
|
2009-06-19 06:20:48 -04:00
|
|
|
padding: 2px
|
|
|
|
margin: 10px 0
|
2008-04-09 05:21:49 -04:00
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
.reply
|
|
|
|
+blue-border
|
2008-04-09 05:21:49 -04:00
|
|
|
|
|
|
|
becomes:
|
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
.comment {
|
|
|
|
border-color: blue;
|
|
|
|
border-width: 2px;
|
|
|
|
border-style: dotted;
|
|
|
|
padding: 2px;
|
|
|
|
margin: 10px 0;
|
|
|
|
}
|
2008-05-02 23:56:27 -04:00
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
.reply {
|
|
|
|
border-color: blue;
|
|
|
|
border-width: 2px;
|
|
|
|
border-style: dotted;
|
|
|
|
}
|
2008-04-09 05:21:49 -04:00
|
|
|
|
2007-02-23 02:54:57 -05:00
|
|
|
A comprehensive list of features is in
|
|
|
|
the documentation for the Sass module.
|
2006-09-10 13:02:52 -04:00
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
## Indentation
|
2008-06-01 01:06:42 -04:00
|
|
|
|
|
|
|
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.
|
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
## Executables
|
2008-04-04 17:51:41 -04:00
|
|
|
|
|
|
|
The Haml gem includes several executables that are useful
|
|
|
|
for dealing with Haml and Sass from the command line.
|
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
### `haml`
|
2008-04-04 17:51:41 -04:00
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
The `haml` executable transforms a source Haml file into HTML.
|
|
|
|
See `haml --help` for further information and options.
|
2008-04-04 17:51:41 -04:00
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
### `sass`
|
2008-04-04 17:51:41 -04:00
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
The `sass` executable transforms a source Sass file into CSS.
|
|
|
|
See `sass --help` for further information and options.
|
2008-04-04 17:51:41 -04:00
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
### `html2haml`
|
2008-04-04 17:51:41 -04:00
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
The `html2haml` executable attempts to transform HTML,
|
2008-04-04 17:51:41 -04:00
|
|
|
optionally with ERB markup, into Haml code.
|
|
|
|
Since HTML is so variable, this transformation is not always perfect;
|
|
|
|
it's a good idea to have a human check the output of this tool.
|
2009-03-31 18:45:37 -04:00
|
|
|
See `html2haml --help` for further information and options.
|
2008-04-04 17:51:41 -04:00
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
### `css2sass`
|
2008-04-04 17:51:41 -04:00
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
The `css2sass` executable attempts to transform CSS into Sass code.
|
2008-04-04 17:51:41 -04:00
|
|
|
This transformation attempts to use Sass nesting where possible.
|
2009-03-31 18:45:37 -04:00
|
|
|
See `css2sass --help` for further information and options.
|
2008-04-04 17:51:41 -04:00
|
|
|
|
2009-03-31 18:45:37 -04:00
|
|
|
## Authors
|
2006-09-10 13:02:52 -04:00
|
|
|
|
2009-06-21 18:09:10 -04:00
|
|
|
Haml and Sass were created by [Hampton Catlin](http://hamptoncatlin.com)
|
|
|
|
(hcatlin) and he is the author of the original implementation. However, Hampton
|
|
|
|
doesn't even know his way around the code anymore and now occasionally consults
|
|
|
|
on the language issues. Hampton lives in Jacksonville, Florida and is the lead
|
|
|
|
mobile developer for Wikimedia.
|
|
|
|
|
|
|
|
[Nathan Weizenbaum](http://nex-3.com) is the primary developer and architect of
|
|
|
|
the "modern" Ruby implementation of Haml. His hard work has kept the project
|
|
|
|
alive by endlessly answering forum posts, fixing bugs, refactoring, finding
|
|
|
|
speed improvements, writing documentation, implementing new features, and
|
|
|
|
getting Hampton coffee (a fitting task for a boy-genius). Nathan lives in
|
|
|
|
Seattle, Washington and while not being a student at the University of
|
|
|
|
Washington or working at an internship, he consults for Unspace Interactive.
|
|
|
|
|
|
|
|
[Chris Eppstein](http://acts-as-architect.blogspot.com) is a core contributor to
|
|
|
|
Sass and the creator of Compass, the first Sass-based framework. Chris focuses
|
|
|
|
on making Sass more powerful, easy to use, and on ways to speed its adoption
|
|
|
|
through the web development community. Chris lives in San Jose, California with
|
|
|
|
his wife and daughter. He is the Software Architect for
|
|
|
|
[Caring.com](http://caring.com), a website devoted to the 34 Million caregivers
|
|
|
|
whose parents are sick or elderly, that uses Haml and Sass.
|
2009-01-25 02:12:27 -05:00
|
|
|
|
2007-11-30 19:54:19 -05:00
|
|
|
If you use this software, you must pay Hampton a compliment. And
|
|
|
|
buy Nathan some jelly beans. Maybe pet a kitten. Yeah. Pet that kitty.
|
|
|
|
|
|
|
|
Some of the 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.
|
2009-03-31 18:45:37 -04:00
|
|
|
Okay, fine, I guess that means compliments aren't __required__.
|