UNPKG

27.6 kBMarkdownView Raw
1# Haml Coffee Templates [![Build Status](https://secure.travis-ci.org/netzpirat/haml-coffee.png)](http://travis-ci.org/netzpirat/haml-coffee)
2
3Haml Coffee est un moteur de template en JavaScript utilisant la syntaxe [Haml](http://haml-lang.com/), tout en comprenant
4[CoffeeScript](http://jashkenas.github.com/coffee-script/) pour générer une fonction function qui donnera du HTML.
5Il est possible de l'utiliser dans des applications JavaScript côté client, par exemple avec
6[Backbone.js](http://documentcloud.github.com/backbone/), [Spine.js](http://spinejs.com/),
7[JavaScriptMVC](http://javascriptmvc.com/), [KnockoutJS](http://knockoutjs.com/) ou d'autres, ou côté serveur avec des frameworks comme [Express](http://expressjs.com/).
8
9Vous pouvez essayer Haml Coffee en ligne en visitant [Haml Coffee Online](http://haml-coffee-online.herokuapp.com/).
10
11## Installation
12
13Haml Coffee est disponible via npm et peut être installé par la commande:
14
15```bash
16$ npm install haml-coffee
17```
18
19Pensez à vérifier le [CHANGELOG](https://github.com/netzpirat/haml-coffee/blob/master/CHANGELOG.md) lorsque vous mettez à jour votre version d'Haml Coffee avec `npm update`.
20
21## Intégration
22
23Il existe différent packages pour intégrer Haml-Coffee dans votre environnement de travail:
24
25* [grunt-haml](https://github.com/concordusapps/grunt-haml) pour les projets utilisants [Grunt](http://gruntjs.com/).
26* [hem-haml-coffee](https://github.com/vojto/hem-haml-coffee) pour les projets utilisants [Hem](https://github.com/maccman/hem/).
27* [haml_coffee_assets](https://github.com/netzpirat/haml_coffee_assets) pour les projets utilisants Rails.
28* [stitch-haml-coffee](https://github.com/jnbt/stitch-haml-coffee) pour les projets utilisants [Stitch](https://github.com/sstephenson/stitch).
29* [guard-haml-coffee](https://github.com/ouvrages/guard-haml-coffee) pour les projets utilisants [Guard](https://github.com/guard/guard).
30* [Haml Coffee compiler](https://raw.github.com/netzpirat/haml-coffee/master/dist/compiler/hamlcoffee.js)
31 ([minified](https://raw.github.com/netzpirat/haml-coffee/master/dist/compiler/hamlcoffee.min.js))
32 pour le navigateur.
33
34Veuillez noter que cette dernière version (navigateur) n'inclue pas CoffeeScript, vous devrez vous assurer de l'avoir inclus avant d'inclure haml-coffee.
35
36## Compilateur Haml Coffee
37
38### Via l'API
39
40Vous pouvez compiler un template Haml Coffee à une fonction JavaScript en lui passant les variables locales à utiliser pour générer le HTML.
41Le code suivant
42
43```coffeescript
44hamlc = require 'haml-coffee'
45tmpl = hamlc.compile '%h1= @title'
46html = tmpl title: 'Haml Coffee rocks!'
47```
48
49donnera `<h1>Haml Coffee rocks!</h1>`.
50
51La fonction `compile` peut prendre les options comme second paramètre pour personnaliser la fonction :
52
53```coffeescript
54hamlc.compile '%h1= @title'
55 cleanValue: false
56 escapeHtml: false
57```
58
59Référez-vous aux [options](#compiler-options) pour avoir des informations plus détaillées sur les options disponibles et n'hésitez pas à naviguer dans le [codo](https://github.com/netzpirat/codo) généré depuis l'[Haml-Coffee API documentation](http://coffeedoc.info/github/netzpirat/haml-coffee/master/).
60
61### Avec Express
62
63Vous pouvez configurer [Express](http://expressjs.com/) pour utiliser Haml Coffee comme moteur de template.
64
65#### Express 3
66
67Depuis la version 1.4.0, Haml Coffee supporte Express 3 et peut être enregistré comme moteur de thème comme il suit :
68
69```coffeescript
70express = require 'express'
71app = express()
72
73app.engine 'hamlc', require('haml-coffee').__express
74```
75
76Vous pouvez aussi utiliser [consolidate.js](https://github.com/visionmedia/consolidate.js) pour l'inclure :
77
78```coffeescript
79express = require 'express'
80cons = require 'consolidate'
81app = express()
82
83app.engine 'hamlc', cons['haml-coffee']
84```
85
86#### Express 2
87
88Depuis la version 0.5.0, Haml Coffee supporte Express 2 et peut être enregistré comme moteur de thème comme il suit :
89
90```coffeescript
91express = require 'express'
92
93app = express.createServer()
94app.register '.hamlc', require('haml-coffee')
95```
96
97Vous pouvez aussi utiliser [consolidate.js](https://github.com/visionmedia/consolidate.js) pour l'inclure :
98
99```coffeescript
100express = require 'express'
101cons = require 'consolidate'
102
103app = express.createServer()
104app.register '.hamlc', cons['haml-coffee']
105```
106
107#### Utilisation avec Express
108
109##### Agencements
110
111Express 2 utilise un fichier d'agencement `layout.hamlc` par défaut, dans lequel vous pouvez insérer la vue de cette manière :
112
113```haml
114!!!
115%head
116 %title Application Express
117%body
118 != @body
119```
120
121Maintenant, vous pouvez créer une vue avec Haml Coffee
122
123```haml
124%h1= "Welcome #{ @name }"
125%p You've rendered your first Haml Coffee view.
126```
127
128que vous pouvez exécuter comme ceci :
129
130```coffeescript
131app.get '/', (req, res) ->
132 res.render 'index.hamlc', name: 'Express user'
133```
134
135Express 3 a retiré les agencements (layouts), mais vous pouvez installer
136[express-partials](https://github.com/publicclass/express-partials) et le configurer comme middleware :
137
138```
139partials = require 'express-partials'
140app.use partials()
141```
142
143##### Moteur de thème par défaut
144
145Il est possible d'utiliser Haml Coffee comme moteur de template en modifiant l'option `view engine` :
146
147```coffeescript
148app.configure ->
149 app.set 'view engine', 'hamlc'
150```
151
152Qui vous permet d'omettre l'extension `.hamlc` quand vous exécutez une vue :
153
154```coffeescript
155app.get '/', (req, res) ->
156 res.render 'index', name: 'Express user'
157```
158
159##### Options compilateur
160
161Avec Express 3, vous pouvez passer des options au compilateur en utilisant `app.locals`:
162
163```
164app.locals.uglify = true
165```
166
167qui équivaut à faire :
168
169```
170res.render view, { uglify: true }
171```
172Référez-vous aux [options](#compiler-options) pour avoir des informations plus détaillées sur les options disponibles.
173
174### Via l'outil en ligne de commande
175
176Après l'installation, vous aurez un fichier binaire `haml-coffee` que vous pourrez utiliser pour compiler des fichiers templates voire plusieurs fichiers templates dans un seul fichier JavaScript.
177
178```bash
179$ haml-coffee
180Usage: node haml-coffee
181
182Options:
183 -i, --input Either a file or a directory name to be compiled
184 -o, --output Set the output filename
185 -n, --namespace Set a custom template namespace
186 -t, --template Set a custom template name
187 -b, --basename Ignore file path when generate the template name
188 -e, --extend Extend the template scope with the context
189```
190
191_La section suivante ne fait que décrire les options qui sont uniques à l'outil en ligne de commande._
192
193Vous pouvez obtenir la liste des options en exécutant `haml-coffee --help` et vous référez aux [options](#compiler-options) pour avoir des informations plus détaillées sur les options disponibles
194
195`input` et `output` sont optionnels et vous pouvez directement rediriger les flux (streams).
196
197#### Nom du fichier d'entrée
198
199Vous pouvez donner un fichier simple ou un nom de dossier avec l'option `-i`/`--input`.
200Si vous passez un dossier, les fichier sont cherchés de manière récursive :
201
202```bash
203$ haml-coffee -i template.haml
204```
205
206Cette commande générera un fichier avec le même nom que celui donné mais avec `.jst` comme extension.
207La commande ci-dessus par exemple produirait un fichier `template.jst`.
208
209Un fichier Haml Coffee valide a l'une de ces extensions : `.haml`, `.html.haml`, `.hamlc` or
210`.html.hamlc`.
211
212#### Nom du fichier de sortie
213
214Vous pouvez spécifier le fichier de sortie (unique) qui sera utilisé plutôt que laisser Haml Coffee le déduire via l'option `-o`/`--output` :
215
216```bash
217$ haml-coffee -i template.haml -o t.js
218```
219
220Cette commande générera un fichier nommé `t.js`. Vous pouvez aussi vus servir de cette commande et donner un dossier en entrée pour n'avoir qu'un fichier en sortie :
221
222```bash
223$ haml-coffee -i templates -o all.js
224```
225
226Cela compilera tous les fichiers templates dans le dossier `templates` dans un unique fichier `all.js`.
227
228#### Espace de nom
229
230Par défaut, chaque template est disponible dans `window.HAML` mais vous pouvez changer l'espace de nom avec l'option `-n`/`--namespace` :
231
232```bash
233$ haml-coffee -i template.haml -n exports.JST
234```
235
236#### Nom du template
237
238Chaque template a un nom unique. Le nom est déduit depuis le fichier source en retirant l'extension et tous les caractères illégaux. Les noms des dossiers sont utilisés en plus de l'espace de nom. Par exemple, un template nommé `user/show-admin.html.haml` sera compilé dans une fonction accessible via `window.HAML['user/show_admin']`.
239
240Via l'option `-b`/`--basename`, le nom déduit n'incluera pas le chemin vers le thème. Par exemple, un template nommé `user/show-admin.html.haml` sera compilé dans une fonction accessible via `window.HAML['show_admin']` au lieu de `window.HAML['user/show_admin']`.
241
242L'option `-t`/`--template` vous permet de manuellement changer le nom du template :
243
244```bash
245$ haml-coffee -i template.haml -n exports.JST -t other
246```
247
248La fonction sera accessible via `exports.JST['other']`.
249
250#### Extension de la portée (scope)
251
252En étandant la portée (scope), vous pouvez accéder directement à vos variables locales sans utiliser `@` ou `this`:
253
254```Haml
255%h2= title
256```
257
258Ceci est possible grace au [with](https://developer.mozilla.org/en/JavaScript/Reference/Statements/with)
259de JavaScript. Utiliser `with` est interdit en Mode Strict (ECMAScript 5).
260
261#### Redirection de flux (streams)
262
263Vous pouvez utiliser Haml Coffee en ligne de commande pour entrer un template et arrêtez via Ctrl+D :
264
265```bash
266$ haml-coffee -p amd
267%h1 Hello AMD
268^D
269```
270
271qui produira un module AMD dans la console. Vous devez utiliser le placement `amd` ou donner un nom au template comme par exemple
272
273```bash
274$ haml-coffee -t name
275%p JST rocks!
276^D
277```
278
279qui donnera le code source JST. Vous pouvez aussi rediriger les flux (streams) comme il suit :
280
281```bash
282$ haml-coffee -t name < input.hamlc > output.jst
283```
284
285## Support de Haml
286
287Haml Coffee implémente la [Spécification Haml (EN)](https://github.com/haml/haml-spec) pour assurer un degré de compatibilité avec les autres implémentations HAML. Les sections suivantes sont parfaitement compatibles :
288
289* Texte seul
290* Multilignes : `|`
291* Balises : `%`
292* Attributs : `{}` or `()`
293* Classes et ID : `.` et `#` (balise `div` implicite)
294* Balises auto-fermantes : `/`
295* Doctype : `!!!`
296* Commentaires HTML : `/`, commentaires conditionnels : `/[]`, commentaires Haml : `-#`
297* Code CoffeeScript: `-`, insertion de CoffeeScript: `=`
298* Interpolation : `#{}`
299* Préservation d'espaces : `~`
300* Suppression d'espaces : `>` et `<`
301* Échappement `\`
302* Échappement HTML : `&=`, dé-échappement HTML : `!=`
303* Filtres : `:plain`, `:javascript`, `:css`, `:cdata`, `:escaped`, `:preserve`
304* Conversion des attributs booléens
305* Syntaxe de référencement d'objets : `[]`
306
307Consultez la [Référence Haml (EN)](http://haml-lang.com/docs/yardoc/file.HAML_REFERENCE.html) pour plus de détails.
308
309Haml Coffee supporte les attributs style Ruby 1.8 et Ruby 1.9. Les attributs (style Ruby 1.8)
310
311```haml
312%a{ :href => 'http://haml-lang.com/', :title => 'Haml home' } Haml
313```
314
315peuvent aussi être écrits comme il suit (style Ruby 1.9) :
316
317```haml
318%a{ href: 'http://haml-lang.com/', title: 'Haml home' } Haml
319```
320
321Le style HTML est aussi
322
323```haml
324%a( href='http://haml-lang.com/' title='Haml home') Haml
325```
326
327### Aides (helpers)
328
329Haml Coffee supporte certain des fonctions incluses dans les [aides (EN)](http://haml-lang.com/docs/yardoc/Haml/Helpers.html) de Ruby Haml.
330Les aides existantes gardent le contexte, il n'est pas nécessaire d'utiliser `=>`.
331
332#### Surround ("entoure")
333
334Entoure un block de Haml avec des chaînes, sans espaces entre.
335
336```haml
337!= surround '(', ')', ->
338 %a{:href => "food"} chicken
339```
340
341produit
342
343```html
344(<a href='food'>chicken</a>)
345```
346
347#### Succeed ("succès")
348
349Ajoute un bloc à la fin d'un bloc Haml, sans espace entre.
350
351```haml
352click
353!= succeed '.', ->
354 %a{:href=>"thing"} here
355```
356
357produit
358
359```html
360click
361<a href='thing'>here</a>.
362```
363
364#### Precede ("précède")
365
366Précède un bloc HAML d'une chaîne, sans espace entre.
367
368```haml
369!= precede '*', ->
370 %span.small Not really
371```
372
373produit
374
375```html
376*<span class='small'>Not really</span>
377```
378
379### Syntaxe de référencement d'objets
380
381Haml Coffee supporte le référencement d'objets, mais implémenté d'une manière différente à cause de la manière dont fonctionne CoffeeScript et du moteur.
382
383Les crochets contiennent l'objet CoffeeScript object ou la classe qui sera utilisé pour la classe et l'ID.
384La classe utilise le nom du constructeur de l'objet (transformé pour utiliser des underscores plutôt que du camelCase) et l'ID utilise le nom du constructor, suivi de la valeur de propriété `id` ou de la valeur de la fonction `#to_key` ou de la fonction `#id` (dans cet ordre).
385Le second argument permet de spécifier un préfixe.
386
387Par exemple :
388
389```haml
390%div[@user, 'greeting']
391 Hello
392```
393
394produit
395
396```html
397<div class='greeting_user' id='greeting_user_15'>
398 Hello!
399</div>
400```
401
402Si vous avez besoin d'utiliser autre chose que le nom du constructeur, vous pouvez utiliser la fonction `#hamlObjectRef` sur l'objet :
403
404```haml
405:coffeescript
406 class User
407 id: 23
408 hamlObjectRef: -> 'custom'
409
410%div[new User()]
411 Hello
412```
413
414produit
415
416```html
417<div class='custom' id='custom_23'>
418 Hello!
419</div>
420```
421
422### Directives
423
424Haml Coffee supporte uniquement une directive qui étend la syntaxe Haml
425
426### Include
427
428Vous pouvez utiliser la directive `+include` pour inclure un autre fichier :
429
430```haml
431%h1 Include
432+include 'partials/test'
433```
434
435Cela cherchera le fichier template et l'incluera.
436En imaginant que `partials/test` contient
437
438```haml
439%p Partial content
440```
441
442Le résultat final sera
443
444```html
445<h1>Include</h1>
446<p>Partial content</p>
447```
448
449## CoffeeScript
450
451Haml & CoffeeScript forment une équipe gagnante, utilisant tous les deux l'indentation pour les blocs et se complètement parfaitement pour cette raison.
452
453**Il n'est pas conseillé d'avoir beaucoup de complexité dans vos fichiers templates.**
454
455### Attributs
456
457Quand vous définissez un attribut sans l'entourer de guillemets (ou d'apostrophes), Haml-Coffee considérera que c'est du CoffeeScript à exécuter au moment du rendu.
458
459Par défaut, ces attributs sont échappés avant d'être insérés dans le document. Vous pouvez changer ce comportement avec l'option adéquate du compilateur.
460
461Les attributs style HTML sont les plus limités et ne peuvent utiliser qu'au plus une variable simple :
462
463```haml
464%img(src='/images/demo.png' width=@width height=@height alt=alt)
465```
466
467Les variables `@width` et `@height` doivent être passées au rendu et `alt` doit être défini avant ce bout de code.
468
469Les attributs styles Ruby peuvent être plus complexes et appeler des fonctions :
470
471```haml
472%header
473 %user{ :class => App.currentUser.get('status') }= App.currentUser.getDisplayName()
474```
475
476Vous pouvez aussi utiliser le style Ruby 1.9 :
477
478```haml
479%header
480 %user{ class: App.currentUser.get('status') }= App.currentUser.getDisplayName()
481```
482
483Vous pouvez aller encore plus loin en utilisant une interpolation entre guillemets :
484
485```haml
486%header
487 %user{ class: "#{ if ~@user.get('roles').indexOf('admin') then 'normal' else 'admin' }" }= @user.getDisplayName()
488```
489
490_Réflechissez à deux fois avant d'utiliser des attributs complexes dans votre fichier template. Il y a d'autres places plus adaptées pour ça, comme vos modèles, vos objets vues ou vos helpers._
491
492Vous pouvez définir vos attributs sur plusieurs avec l'indentation qui vous plait, ce qui vous permet par exemple de faire :
493
494```haml
495%input#password.hint{ type: 'password', name: 'registration[password]',
496 data: { hint: 'Something very important', align: 'left' } }
497```
498
499L'exemple ci-dessus vous montre aussi l'utilisation de l'attribut `data-` HTML5.
500
501### Exécuter du code
502
503Vous pouvez exécuter n'importe quel code CoffeeScript dans vos templates :
504
505```haml
506- for project in @projects
507 - if project.visible
508 .project
509 %h1= project.name
510 %p&= project.description
511```
512
513Il y a plusieurs formats pour exécuter du code :
514
515* Exécuter du code sans rien insérer dans le document : `-`
516* Exécuter du code et insérer le résultat : `=`
517
518Toute insertion dans le document est échappée par défaut. Vous pouvez changer ce comportement avec l'option du compilateur adéquate.
519
520Il y a trois variations pour exécuter le code et l'insérer dans le document, dont deux qui changent l'échappement :
521
522* Exécute le code et n'échappe pas le résultat : `!=`
523* Exécute le code et échappe le résultat : `&=`
524* Préservation des espaces à l'insertion : `~`
525
526Encore une fois, référez-vous à la [référence Haml](http://haml-lang.com/docs/yardoc/file.HAML_REFERENCE.html) pour plus de détails.
527
528#### Blocs de code multi-lignes
529
530Le code à exécuter doit être palcé sur une seul ligne et contrairement à Ruby Haml, vous ne pouvez pas exécuter du code multi-lignes en ajoutant une virgule à la fin de votre ligne.
531
532Cependant, vous pouvez utiliser la notation multi-lignes `|` :
533
534```Haml
535- links = { |
536 home: '/', |
537 docs: '/docs', |
538 about: '/about' |
539 } |
540
541%ul
542 - for name, link of links
543 %li
544 %a{ href: link }= name
545```
546
547Notez bien que la ligne est concaténée à la compilation, vous ne pouvez donc pas omettre les crochets comme vous le feriez en CoffeeScript.
548Il est donc recommandé d'utiliser le filtre CoffeeScript pour avoir des vrais blocs de code multi-lignes :
549
550```Haml
551:coffeescript
552 links =
553 home: '/'
554 docs: '/docs'
555 about: '/about'
556
557%ul
558 - for name, link of links
559 %li
560 %a{ href: link }= name
561```
562
563#### Fonctions
564
565Vous pouvez aussi créer des functions qui génèrent du HAML
566
567```haml
568- sum = (a, b) ->
569 %div
570 %span= a
571 %span= b
572 %span= a+b
573= sum(1,2)
574= sum(3,4)
575```
576
577Ou passer le résultat HTML généré à une fonction
578
579```haml
580= postProcess ->
581 %a{ href: '/' }
582```
583
584Le contenu des filtres `:coffeescript` est exécuté lors du rendu et n'insère rien dans le document.
585C'est pratique pour exécuter du code sur plusieurs lignes sans avoir à préfixer chaque ligne avec `-` :
586
587```haml
588%body
589 :coffeescript
590 tags = ['CoffeeScript', 'Haml']
591 project = 'Haml Coffee'
592 %h2= project
593 %ul
594 - for tag in tags
595 %li= tag
596```
597
598## Options du compilateur
599
600La section suivante décrit les options disponibles depuis l'API JavaScript & en tant que vue Express.
601
602Les options en ligne de commande peuvent être différentes. Par exemple, au lieu de passer `--escape-html=false` vous devez passer l'argument `--disable-html-escaping`.
603Vous pouvez voir la liste des arguments via `haml-coffee --help`.
604
605### Options de génération HTML
606
607#### Format
608
609* Nom 'format'
610* Type: `String`
611* Défaut: `html5`
612
613The Haml parser knows different HTML formats to which a given template can be rendered and it must be one of:
614
615* xhtml
616* html4
617* html5
618
619Doctype, self-closing tags and attributes handling depends on this setting. Please consult the official
620[Haml reference](http://haml-lang.com/docs/yardoc/file.HAML_REFERENCE.html) for more details.
621
622#### Uglify output
623
624* Nom: `uglify`
625* Type: `Boolean`
626* Défaut: `false`
627
628All generated HTML tags are properly indented by default, so the output looks nice. This can be helpful when debugging.
629You can skip the indention by setting the `uglify` option to false. This save you some bytes and you'll have increased
630rendering speed.
631
632#### HTML escape
633
634* Nom: `escapeHtml`
635* Type: `Boolean`
636* Défaut: `true`
637
638The reserved HTML characters `"`, `'`, `&`, `<` and `>` are converted to their HTML entities by default when they are
639inserted into the HTML document from evaluated CoffeeScript.
640
641You can always change the escaping mode within the template to either force escaping with `&=` or force unescaping with
642`!=`.
643
644#### Attributes escape
645
646* Nom: `escapeAttributes`
647* Type: `Boolean`
648* Défaut: `true`
649
650All HTML attributes that are generated by evaluating CoffeeScript are also escaped by default. You can turn of HTML
651escaping of the attributes only by setting `escapeAttributes` to false. You can't change this behaviour in the template
652since there is no Haml markup for this to instruct the compiler to change the escaping mode.
653
654#### Clean CoffeeScript values
655
656* Nom: `cleanValue`
657* Type: `Boolean`
658* Défaut: `true`
659
660Every output that is generated from evaluating CoffeeScript code is cleaned before inserting into the document. The
661default implementation converts `null` or `undefined` values into an empty string and marks real boolean values with a
662hidden marker character. The hidden marker character is necessary to distinguish between String values like `'true'`,
663`'false'` and real boolean values `true`, `false` in the markup, so that a boolean attribute conversion can quickly
664convert these values to the correct HTML5/XHTML/HTML4 representation.
665
666#### Preserve whitespace tags
667
668* Nom: `preserve`
669* Type: `String`
670* Défaut: `textarea,pre`
671
672The `preserve` option defines a list of comma separated HTML tags that are whitespace sensitive. Content from these tags
673must be preserved, so that the indention has no influence on the displayed content. This is simply done by converting
674the newline characters to their equivalent HTML entity.
675
676#### Autoclose tags
677
678* Nom: `autoclose`
679* Type: `String`
680* Défaut: `meta,img,link,br,hr,input,area,param,col,base`
681
682The autoclose option defines a list of tag names that should be automatically closed if they have no content.
683
684#### Module loader support
685
686* Nom: `placement`
687* Type: `String`
688* Défaut: `global`
689
690The `placement` option defines where the template function is inserted
691upon compilation.
692
693Possible values are:
694
695* `global` <br />
696 Inserts the optionally namespaced template function into `window.HAML`.
697
698* 'standalone' <br />
699 Returns the template function without wrapping it
700
701* `amd` <br />
702 Wraps the template function into a `define()` statement to allow async
703 loading via AMD.
704
705See AMD support for more information.
706
707### Module dependencies
708
709* Nom: `dependencies`
710* Type: `Object`
711* Défaut: `{ hc: 'hamlcoffee' }`
712
713The `dependencies` option allows you to define the modules that must be required for the AMD template `define` function.
714The object key will be the function parameter name of the module the object value defines. See AMD support for more
715information.
716
717### Custom helper function options
718
719Haml Coffee provides helper functions for HTML escaping, value cleaning and whitespace preservation, which must be
720available at render time. By default every generated template function is self-contained and includes all of the helper
721functions.
722
723However you can change the reference to each helper function by providing the appropriate compiler option and there
724are good reasons to do so:
725
726* You want to reduce the template size and provide all the helpers from a central place.
727* You want to customize a helper function to better fit your needs.
728
729To change these functions, simply assign the new function name to one of the following options:
730
731 * `customHtmlEscape`: Escape the reserved HTML characters into their equivalent HTML entity.
732 * `customPreserve`: Converting newlines into their HTML entity.
733 * `customFindAndPreserve`: Find whitespace sensitive tags and preserve their content.
734 * `customCleanValue`: Clean the value that is returned after evaluating some inline CoffeeScript.
735 * `customSurround`: Surrounds a block of Haml code with strings, with no whitespace in between.
736 * `customSucceed`: Appends a string to the end of a Haml block, with no whitespace between.
737 * `customPrecede`: Prepends a string to the beginning of a Haml block, with no whitespace between.
738 * `customReference`: Creates the Haml object reference.
739
740The `customSurround`, `customSucceed` and `customPrecede` are bound to the template context.
741
742You can find a default implementation for all these helper functions in
743[Haml Coffee Assets](https://github.com/netzpirat/haml_coffee_assets/blob/master/vendor/assets/javascripts/hamlcoffee.js.coffee.erb).
744
745## AMD support
746
747* Global dependencies
748* Trivial dependency detection
749
750Haml Coffee has built in AMD support by setting the `placement` option to `amd`. This will generate a module definition
751for the JavaScript template. The `dependencies` options can be used to provide a mapping of module names to parameters.
752To illustrate this, the default value will result in the following module declaration:
753
754```CoffeeScript
755define ['hamlcoffee'], (hc) ->
756```
757
758When the template contains a require call in the form of
759
760```CoffeeScript
761 - require 'module'
762 - require 'deep/nested/other'
763```
764
765it will be added to the module definition list
766
767```CoffeeScript
768define ['hamlcoffee', 'module', 'deep/nested/other'], (hc, module, other) ->
769```
770
771allowing you to render a partial template:
772
773```CoffeeScript
774!= module()
775!= other()
776```
777
778Of course the require call can have different quotes or parenthesises, allowing you to directly require and render:
779
780```CoffeeScript
781!= require("another/other")()
782```
783
784## Development information
785
786Haml-Coffee uses [Guard](https://github.com/guard/guard) for development, which you can install Guard with the Ruby
787[Bundler](http://gembundler.com/):
788
789```bash
790$ bundle install
791```
792
793Install the Node modules with [NPM](https://npmjs.org/):
794
795```bash
796$ npm install
797```
798
799and run Guard to automatically compile your CoffeeScripts and run the Jasmine specs on file modification:
800
801```bash
802$ bundle exec guard
803```
804
805## Changelog
806
807Feel free to take a look at the crispy [changelog](https://github.com/netzpirat/haml-coffee/blob/master/CHANGELOG.md)
808instead of crawling through the commit history.
809
810## Related projects
811
812Haml Coffee in the Rails asset pipeline:
813
814* [haml-coffee-assets](https://github.com/netzpirat/haml_coffee_assets)
815
816## Authors
817
818* [Michael Kessler](https://github.com/netzpirat) ([@netzpirat](http://twitter.com/#!/netzpirat), [mksoft.ch](https://mksoft.ch))
819* [Sebastion Deutsch](https://github.com/sebastiandeutsch) ([@sippndipp](http://twitter.com/#!/sippndipp), [9elements](http://9elements.com))
820* [Jan Varwig](https://github.com/janv) ([@agento](http://twitter.com/#!/agento), [9elements](http://9elements.com))
821
822## Contributors
823
824See all contributors on [the contributor page](https://github.com/netzpirat/haml-coffee/contributors).
825
826## Traduction
827
828Traduction par [Vendethiel](https://github.com/Nami-Doc).
829
830## License
831
832(The MIT License)
833
834Copyright (c) 2011 9elements, 2011-2013 Michael Kessler
835
836Permission is hereby granted, free of charge, to any person obtaining
837a copy of this software and associated documentation files (the
838'Software'), to deal in the Software without restriction, including
839without limitation the rights to use, copy, modify, merge, publish,
840distribute, sublicense, and/or sell copies of the Software, and to
841permit persons to whom the Software is furnished to do so, subject to
842the following conditions:
843
844The above copyright notice and this permission notice shall be
845included in all copies or substantial portions of the Software.
846
847THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
848EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
849MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
850IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
851CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
852TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
853SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.