2009-03-31 15:45:37 -07:00
|
|
|
# Haml and Sass
|
2006-06-30 15:14:44 +00:00
|
|
|
|
2006-12-19 02:56:49 +00: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 07:45:29 +00:00
|
|
|
to code HTML and CSS documents,
|
2006-12-19 02:56:49 +00:00
|
|
|
by eliminating redundancy,
|
|
|
|
reflecting the underlying structure that the document represents,
|
|
|
|
and providing elegant, easily understandable, and powerful syntax.
|
2006-09-12 13:54:22 +00:00
|
|
|
|
2009-03-31 15:45:37 -07:00
|
|
|
## Using
|
2007-02-23 07:54:57 +00:00
|
|
|
|
2009-06-21 16:27:00 -07:00
|
|
|
Haml and Sass 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 19:55:26 +00:00
|
|
|
|
2009-03-31 15:45:37 -07:00
|
|
|
gem install haml
|
2007-11-17 19:55:26 +00:00
|
|
|
|
2009-06-21 16:27:00 -07:00
|
|
|
After you convert some HTML to Haml or some CSS to Sass,
|
|
|
|
you can run
|
|
|
|
|
|
|
|
haml document.haml
|
2010-03-30 22:28:20 -07:00
|
|
|
sass style.scss
|
2009-06-21 16:27:00 -07:00
|
|
|
|
|
|
|
to compile them.
|
|
|
|
For more information on these commands, check out
|
|
|
|
|
|
|
|
haml --help
|
|
|
|
sass --help
|
|
|
|
|
2007-11-17 19:55:26 +00:00
|
|
|
To install Haml and Sass as a Rails plugin,
|
2009-03-31 15:45:37 -07:00
|
|
|
just run `haml --rails path/to/rails/app`
|
2007-02-23 07:54:57 +00:00
|
|
|
and both Haml and Sass will be installed.
|
2009-06-21 16:27:00 -07:00
|
|
|
Views with the `.html.haml` extension will automatically use Haml.
|
2007-02-23 07:54:57 +00:00
|
|
|
Sass is a little more complicated;
|
2009-06-21 16:27:00 -07:00
|
|
|
`.sass` files should be placed in `public/stylesheets/sass`,
|
2007-02-23 07:54:57 +00:00
|
|
|
where they'll be automatically compiled
|
2009-06-21 16:27:00 -07:00
|
|
|
to corresponding CSS files in `public/stylesheets` when needed
|
2007-02-23 07:54:57 +00:00
|
|
|
(the Sass template directory is customizable...
|
2010-03-31 00:51:05 -07:00
|
|
|
see [the Sass reference](http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#template_location-option) for details).
|
2007-02-23 07:54:57 +00:00
|
|
|
|
2009-03-31 15:45:37 -07:00
|
|
|
For Merb, `.html.haml` views will work without any further modification.
|
2008-11-24 18:35:14 -08:00
|
|
|
To enable Sass, you also need to add a dependency.
|
2007-11-17 19:55:26 +00:00
|
|
|
To do so, just add
|
|
|
|
|
2009-03-31 15:45:37 -07:00
|
|
|
dependency "merb-haml"
|
2007-11-17 19:55:26 +00:00
|
|
|
|
2009-06-21 16:27:00 -07:00
|
|
|
to `config/dependencies.rb` (or `config/init.rb` in a flat/very flat Merb application).
|
2007-11-17 19:55:26 +00:00
|
|
|
Then it'll work just like it does in Rails.
|
|
|
|
|
2009-11-09 18:35:29 -08:00
|
|
|
Sass can also be used with any Rack-enabled web framework.
|
|
|
|
To do so, just add
|
|
|
|
|
|
|
|
require 'sass/plugin/rack'
|
|
|
|
use Sass::Plugin::Rack
|
|
|
|
|
|
|
|
to `config.ru`.
|
|
|
|
Then any Sass files in `public/stylesheets/sass`
|
|
|
|
will be compiled CSS files in `public/stylesheets` on every request.
|
|
|
|
|
2007-11-17 19:55:26 +00:00
|
|
|
To use Haml and Sass programatically,
|
2009-11-23 13:48:06 -08:00
|
|
|
check out the [YARD documentation](http://haml-lang.com/docs/yardoc/).
|
2007-11-17 19:55:26 +00:00
|
|
|
|
2009-03-31 15:45:37 -07:00
|
|
|
## Formatting
|
2006-09-12 13:05:28 +00:00
|
|
|
|
2009-03-31 15:45:37 -07:00
|
|
|
### Haml
|
2006-11-04 06:36:16 +00:00
|
|
|
|
2006-12-19 02:56:49 +00:00
|
|
|
The most basic element of Haml
|
2009-07-04 15:46:34 -07:00
|
|
|
is a shorthand for creating HTML:
|
2006-11-04 06:36:16 +00:00
|
|
|
|
2009-03-31 15:45:37 -07:00
|
|
|
%tagname{:attr1 => 'value1', :attr2 => 'value2'} Contents
|
2006-11-04 06:36:16 +00:00
|
|
|
|
2006-12-19 02:56:49 +00:00
|
|
|
No end-tag is needed; Haml handles that automatically.
|
2009-07-04 15:46:34 -07:00
|
|
|
If you prefer HTML-style attributes, you can also use:
|
|
|
|
|
|
|
|
%tagname(attr1='value1' attr2='value2') Contents
|
|
|
|
|
2009-03-31 15:45:37 -07:00
|
|
|
Adding `class` and `id` attributes is even easier.
|
2006-12-19 02:56:49 +00:00
|
|
|
Haml uses the same syntax as the CSS that styles the document:
|
2006-10-27 20:36:34 +00:00
|
|
|
|
2009-03-31 15:45:37 -07:00
|
|
|
%tagname#id.class
|
2006-11-04 06:36:16 +00:00
|
|
|
|
2009-03-31 15:45:37 -07:00
|
|
|
In fact, when you're using the `<div>` tag,
|
|
|
|
it becomes _even easier_.
|
|
|
|
Because `<div>` is such a common element,
|
2006-12-19 02:56:49 +00:00
|
|
|
a tag without a name defaults to a div. So
|
2006-10-27 20:36:34 +00:00
|
|
|
|
2009-03-31 15:45:37 -07:00
|
|
|
#foo Hello!
|
2006-11-04 06:36:16 +00:00
|
|
|
|
2006-12-19 02:56:49 +00:00
|
|
|
becomes
|
2006-11-06 00:35:38 +00:00
|
|
|
|
2009-03-31 15:45:37 -07:00
|
|
|
<div id='foo'>Hello!</div>
|
2008-04-07 23:09:17 -07:00
|
|
|
|
2006-12-19 02:56:49 +00:00
|
|
|
Haml uses indentation
|
|
|
|
to bring the individual elements to represent the HTML structure.
|
2008-05-31 21:43:38 -07:00
|
|
|
A tag's children are indented beneath than the parent tag.
|
2006-12-19 02:56:49 +00:00
|
|
|
Again, a closing tag is automatically added.
|
2006-11-14 01:58:55 +00:00
|
|
|
For example:
|
2006-10-14 22:24:53 +00:00
|
|
|
|
2009-03-31 15:45:37 -07:00
|
|
|
%ul
|
|
|
|
%li Salt
|
|
|
|
%li Pepper
|
2006-10-14 22:24:53 +00:00
|
|
|
|
2006-12-19 02:56:49 +00:00
|
|
|
becomes:
|
2006-10-22 21:42:45 +00:00
|
|
|
|
2009-03-31 15:45:37 -07:00
|
|
|
<ul>
|
|
|
|
<li>Salt</li>
|
|
|
|
<li>Pepper</li>
|
|
|
|
</ul>
|
2006-11-17 01:12:50 +00:00
|
|
|
|
2006-12-19 02:56:49 +00:00
|
|
|
You can also put plain text as a child of an element:
|
2006-10-14 22:24:53 +00:00
|
|
|
|
2009-03-31 15:45:37 -07:00
|
|
|
%p
|
|
|
|
Hello,
|
|
|
|
World!
|
2006-11-18 09:48:34 +00:00
|
|
|
|
2009-02-25 14:05:59 -08:00
|
|
|
It's also possible to embed Ruby code into Haml documents.
|
2009-03-31 15:45:37 -07:00
|
|
|
An equals sign, `=`, will output the result of the code.
|
|
|
|
A hyphen, `-`, will run the code but not output the result.
|
2006-12-19 02:56:49 +00:00
|
|
|
You can even use control statements
|
2009-03-31 15:45:37 -07:00
|
|
|
like `if` and `while`:
|
2006-10-14 22:24:53 +00:00
|
|
|
|
2009-03-31 15:45:37 -07:00
|
|
|
%p
|
|
|
|
Date/Time:
|
|
|
|
- now = DateTime.now
|
|
|
|
%strong= now
|
|
|
|
- if now > DateTime.parse("December 31, 2006")
|
|
|
|
= "Happy new " + "year!"
|
2006-09-12 13:05:28 +00:00
|
|
|
|
2006-12-19 02:56:49 +00:00
|
|
|
Haml provides far more tools than those presented here.
|
2010-03-31 00:51:05 -07:00
|
|
|
Check out the [reference documentation](http://beta.haml-lang.com/docs/yardoc/file.HAML_REFERENCE.html)
|
2010-03-30 23:43:35 -07:00
|
|
|
for full details.
|
2006-09-10 17:02:52 +00:00
|
|
|
|
2010-03-30 22:28:20 -07:00
|
|
|
#### Indentation
|
2007-02-23 07:54:57 +00:00
|
|
|
|
2010-03-30 22:28:20 -07: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 07:54:57 +00:00
|
|
|
|
2010-03-30 22:28:20 -07:00
|
|
|
### Sass
|
2007-02-23 07:54:57 +00:00
|
|
|
|
2010-03-30 22:28:20 -07:00
|
|
|
Sass is an extension of CSS
|
|
|
|
that adds power and elegance to the basic language.
|
|
|
|
It allows you to use [variables][vars], [nested rules][nested],
|
|
|
|
[mixins][mixins], [inline imports][imports],
|
|
|
|
and more, all with a fully CSS-compatible syntax.
|
|
|
|
Sass helps keep large stylesheets well-organized,
|
|
|
|
and get small stylesheets up and running quickly,
|
|
|
|
particularly with the help of
|
|
|
|
[the Compass style library](http://compass-style.org).
|
|
|
|
|
2010-03-31 00:51:05 -07:00
|
|
|
[vars]: http://beta.sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#variables_
|
|
|
|
[nested]: http://beta.sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#nested_rules_
|
2010-03-30 22:55:10 -07:00
|
|
|
[mixins]: http://beta.sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#mixins
|
2010-03-31 00:51:05 -07:00
|
|
|
[imports]: http://beta.sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#import
|
2010-03-30 22:28:20 -07:00
|
|
|
|
|
|
|
Sass has two syntaxes.
|
|
|
|
The one presented here, known as "SCSS" (for "Sassy CSS"),
|
|
|
|
is fully CSS-compatible.
|
|
|
|
The other (older) syntax, known as the indented syntax or just "Sass",
|
|
|
|
is whitespace-sensitive and indentation-based.
|
|
|
|
For more information, see the [reference documentation][syntax].
|
|
|
|
|
2010-03-31 00:51:05 -07:00
|
|
|
[syntax]: http://beta.sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#syntax
|
2010-03-30 22:28:20 -07:00
|
|
|
|
|
|
|
To run the following examples and see the CSS they produce,
|
|
|
|
put them in a file called `test.scss` and run `sass test.scss`.
|
|
|
|
|
|
|
|
#### Nesting
|
|
|
|
|
|
|
|
Sass avoids repetition by nesting selectors within one another.
|
|
|
|
The same thing works for properties.
|
|
|
|
|
|
|
|
table.hl {
|
|
|
|
margin: 2em 0;
|
|
|
|
td.ln { text-align: right; }
|
2009-03-31 15:45:37 -07:00
|
|
|
}
|
2007-02-23 07:54:57 +00:00
|
|
|
|
2010-03-30 22:28:20 -07:00
|
|
|
li {
|
|
|
|
font: {
|
|
|
|
family: serif;
|
|
|
|
weight: bold;
|
|
|
|
size: 1.2em;
|
|
|
|
}
|
|
|
|
}
|
2007-02-23 07:54:57 +00:00
|
|
|
|
2010-03-30 22:28:20 -07:00
|
|
|
#### Variables
|
2007-02-23 07:54:57 +00:00
|
|
|
|
2010-03-30 22:28:20 -07:00
|
|
|
Use the same color all over the place?
|
|
|
|
Need to do some math with height and width and text size?
|
|
|
|
Sass supports variables, math operations, and many useful functions.
|
2007-02-23 07:54:57 +00:00
|
|
|
|
2010-03-30 22:28:20 -07:00
|
|
|
$blue: #3bbfce;
|
|
|
|
$margin: 16px;
|
2008-04-09 10:21:49 +01:00
|
|
|
|
2010-03-30 22:28:20 -07:00
|
|
|
.content_navigation {
|
|
|
|
border-color: $blue;
|
|
|
|
color: darken($blue, 10%);
|
|
|
|
}
|
2008-04-09 10:21:49 +01:00
|
|
|
|
2010-03-30 22:28:20 -07:00
|
|
|
.border {
|
|
|
|
padding: $margin / 2;
|
|
|
|
margin: $margin / 2;
|
|
|
|
border-color: $blue;
|
|
|
|
}
|
2008-04-09 10:21:49 +01:00
|
|
|
|
2010-03-30 22:28:20 -07:00
|
|
|
#### Mixins
|
2008-04-09 10:21:49 +01:00
|
|
|
|
2010-03-30 22:28:20 -07:00
|
|
|
Even more powerful than variables,
|
|
|
|
mixins allow you to re-use whole chunks of CSS,
|
|
|
|
properties or selectors.
|
|
|
|
You can even give them arguments.
|
2008-04-09 10:21:49 +01:00
|
|
|
|
2010-03-30 22:28:20 -07:00
|
|
|
@mixin table-scaffolding {
|
|
|
|
th {
|
|
|
|
text-align: center;
|
|
|
|
font-weight: bold;
|
|
|
|
}
|
|
|
|
td, th { padding: 2px; }
|
2009-03-31 15:45:37 -07:00
|
|
|
}
|
2008-05-03 05:56:27 +02:00
|
|
|
|
2010-03-30 22:28:20 -07:00
|
|
|
@mixin left($dist) {
|
|
|
|
float: left;
|
|
|
|
margin-left: $dist;
|
2009-03-31 15:45:37 -07:00
|
|
|
}
|
2008-04-09 10:21:49 +01:00
|
|
|
|
2010-03-30 22:28:20 -07:00
|
|
|
#data {
|
|
|
|
@include left(10px);
|
|
|
|
@include table-scaffolding;
|
|
|
|
}
|
2008-05-31 22:06:42 -07:00
|
|
|
|
2010-03-30 22:28:20 -07:00
|
|
|
A comprehensive list of features is available
|
2010-03-31 00:51:05 -07:00
|
|
|
in the [Sass reference](http://beta.sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html).
|
2008-05-31 22:06:42 -07:00
|
|
|
|
2009-03-31 15:45:37 -07:00
|
|
|
## Executables
|
2008-04-04 14:51:41 -07:00
|
|
|
|
|
|
|
The Haml gem includes several executables that are useful
|
|
|
|
for dealing with Haml and Sass from the command line.
|
|
|
|
|
2009-03-31 15:45:37 -07:00
|
|
|
### `haml`
|
2008-04-04 14:51:41 -07:00
|
|
|
|
2009-03-31 15:45:37 -07:00
|
|
|
The `haml` executable transforms a source Haml file into HTML.
|
|
|
|
See `haml --help` for further information and options.
|
2008-04-04 14:51:41 -07:00
|
|
|
|
2009-03-31 15:45:37 -07:00
|
|
|
### `sass`
|
2008-04-04 14:51:41 -07:00
|
|
|
|
2009-03-31 15:45:37 -07:00
|
|
|
The `sass` executable transforms a source Sass file into CSS.
|
|
|
|
See `sass --help` for further information and options.
|
2008-04-04 14:51:41 -07:00
|
|
|
|
2009-03-31 15:45:37 -07:00
|
|
|
### `html2haml`
|
2008-04-04 14:51:41 -07:00
|
|
|
|
2009-03-31 15:45:37 -07:00
|
|
|
The `html2haml` executable attempts to transform HTML,
|
2008-04-04 14:51:41 -07: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 15:45:37 -07:00
|
|
|
See `html2haml --help` for further information and options.
|
2008-04-04 14:51:41 -07:00
|
|
|
|
2010-03-30 22:29:19 -07:00
|
|
|
### `sass-convert`
|
2008-04-04 14:51:41 -07:00
|
|
|
|
2010-03-30 22:29:19 -07:00
|
|
|
The `sass-convert` executable converts between CSS, Sass, and SCSS.
|
|
|
|
When converting from CSS to Sass or SCSS,
|
|
|
|
nesting is applied where appropriate.
|
2010-03-31 00:28:20 -07:00
|
|
|
See `sass-convert --help` for further information and options.
|
2008-04-04 14:51:41 -07:00
|
|
|
|
2009-03-31 15:45:37 -07:00
|
|
|
## Authors
|
2006-09-10 17:02:52 +00:00
|
|
|
|
2009-06-21 15:09:10 -07: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-24 23:12:27 -08:00
|
|
|
|
2007-12-01 00:54:19 +00: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 08:35:06 +00:00
|
|
|
|
2006-12-19 02:56:49 +00:00
|
|
|
Beyond that, the implementation is licensed under the MIT License.
|
2009-03-31 15:45:37 -07:00
|
|
|
Okay, fine, I guess that means compliments aren't __required__.
|