Skip to content

Commit 17a935f

Browse files
author
Jeremie Patonnier
committed
Add Handlebars support for page generation
1 parent a6ade02 commit 17a935f

File tree

5 files changed

+164
-2
lines changed

5 files changed

+164
-2
lines changed

.gsk/docs/html/handlebars.md

+72
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
2+
Handlebars
3+
===============================================================================
4+
5+
Certains projets peuvent vouloir utiliser [Handlebars](handlebarsjs.com) pour
6+
générer les pages statiques du projet.
7+
8+
Configuration:
9+
```json
10+
{
11+
"html": {
12+
"engine": "handlebars"
13+
}
14+
}
15+
```
16+
17+
18+
Configuration standard
19+
-------------------------------------------------------------------------------
20+
21+
### Data
22+
On notera que, par défaut, toutes les variables qui seront utiliser pour
23+
peupler les fichiers lors de la compilation sont dans le dossier `src/data`
24+
25+
Ces données sont sous la forme de fichiers JSON avec un fichier générique
26+
(`src/data/data.json`), plus un fichier spécifique qui doit porter le même nom
27+
que le gabarit Handlebars correspondant (`src/data/mon/fichier/hbs.json`). Les
28+
deux sont amalgamés pour être utilisé par le gabarit Handlebars. Si les deux
29+
fichiers proposent les mêmes variables, celles du fichier spécifique écrase
30+
celles du fichier générique.
31+
32+
### Layout
33+
Le layout par defaut des pages est `src/html/layout/_default.hbs`. Pour le
34+
changer, il suffit de changer la configuration du projet:
35+
```json
36+
{
37+
"html": {
38+
"layout": "_default.hbs"
39+
}
40+
}
41+
```
42+
43+
Un layout specific peut être appliqué à chaque page, il suffit de rajouter une
44+
clé `template` avec le nom du layout à utiliser dans le fichier de data de la
45+
page correspondante.
46+
47+
> **NOTE:** _Tous les layouts doivent être placés dans le dossier
48+
`src/html/layout`_
49+
50+
Helpers
51+
-------------------------------------------------------------------------------
52+
Handlebars peut être etendu par l'usage de helpers.
53+
54+
De manière général, pour rajouter un helpers, il suffit d'écrire un module
55+
CommonJS qui exposera une fonction definisant le helpers. Ce module doit être
56+
placé dans le dossier `.gsk/tools/handlebars/helpers`. Le nom du helper sera
57+
le nom du fichier (sans extention).
58+
59+
Un helper definie de cette façon a cette forme:
60+
61+
```javascript
62+
module.exports = function (/* context, */ options) {
63+
return options.fn(this);
64+
};
65+
```
66+
Pour en savoir plus sur la création de helpers, la
67+
[documentation officiel de handlebars](http://handlebarsjs.com/block_helpers.html)
68+
est là pour vous aider
69+
70+
Pour voir quelques exemples concrets vous pouvez jetez un coup d’œil dans le
71+
repertoire [.gsk/tools/handlebars/helpers](.gsk/tools/handlebars/helpers).
72+

.gsk/pipe/html/handlebars.js

+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
// Définition du LazyPipe pour utiliser Handlebars
2+
'use strict';
3+
4+
var path = require('path');
5+
var _ = require('underscore');
6+
var lazypipe = require('lazypipe');
7+
var gulp = require('gulp');
8+
var gutil = require('gulp-util');
9+
var hbs = require('gulp-hbs');
10+
var data = require('gulp-data');
11+
var dir = require('require-dir');
12+
var ENV = require('../../tools/env');
13+
14+
var DEST = path.resolve(ENV.html['dest-dir']);
15+
var DEST_URL = DEST.replace(path.resolve(ENV.connect.baseDir), '')
16+
.replace(path.sep, '/');
17+
18+
var genericDataFile = path.resolve(path.join(ENV.html['data-dir'], 'data.json'));
19+
20+
var layouts = path.join(ENV.html['src-dir'], 'layout', '**', '*.hbs');
21+
22+
// HBS HELPERS
23+
// ----------------------------------------------------------------------------
24+
var helpers = dir('../../tools/handlebars/helpers');
25+
26+
hbs.registerHelper(helpers);
27+
28+
// UTILS
29+
// ----------------------------------------------------------------------------
30+
function processData(file) {
31+
var base = file.path.replace(ENV.html['src-dir'], ENV.html['data-dir']);
32+
var specificDataFile = base.replace('.hbs', '.json');
33+
var gData = {};
34+
var sData = {};
35+
36+
try {
37+
gData = require(genericDataFile);
38+
} catch (e) {
39+
gutil.log(gutil.colors.yellow('WARN:'),
40+
'Unable to find data from',
41+
genericDataFile.replace(path.resolve('.'), '').slice(1)
42+
);
43+
}
44+
45+
try {
46+
sData = require(specificDataFile);
47+
} catch (e) {
48+
gutil.log(gutil.colors.yellow('WARN:'),
49+
'Unable to find data from',
50+
specificDataFile.replace(path.resolve('.'), '').slice(1)
51+
);
52+
}
53+
54+
var data = _.extend({}, gData, sData);
55+
data.url = file.path.replace(ENV.html['src-dir'], DEST_URL).replace('.hbs', '.html');
56+
data.main = hbs.handlebars.compile(file.contents.toString())(data);
57+
58+
return data;
59+
}
60+
61+
module.exports = function () {
62+
var lazystream = lazypipe()
63+
.pipe(data, processData)
64+
.pipe(hbs, gulp.src(layouts), {
65+
dataSource: 'data',
66+
defaultTemplate: ENV.html.layout || '_default.hbs'
67+
});
68+
69+
return lazystream();
70+
};

.gsk/tasks/html.js

+1-2
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,7 @@ var ENV = require('../tools/env').html;
1515
// On ne va compiler que les fichiers dont le nom ne commence pas par un _
1616
var SRC = [
1717
path.join(ENV['src-dir'], '**', '*.*'),
18-
path.join('!' + ENV['src-dir'], '**', '_*'),
19-
path.join('!' + ENV['src-dir'], '**', '*.js')
18+
path.join('!' + ENV['src-dir'], '**', '_*')
2019
];
2120
var DEST = ENV['dest-dir'];
2221

readme.md

+1
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@ le fichier `.gsk/config.json`, voir les [instructions de configuration](.gsk/rea
209209

210210
### HTML
211211
* [Twig](.gsk/docs/html/twig.md)
212+
* [Handlebars](.gsk/docs/html/handlebars.md)
212213

213214
### JavaScript
214215
* [Simple pipeline](.gsk/docs/js/simple.md)

src/html/layout/_default.hbs

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{{!-- _default.hbs --}}
2+
{{!-- Ce gabarit est utilisé par les pages du projets --}}
3+
<!DOCTYPE html>
4+
<html lang="fr">
5+
<head>
6+
<meta charset="utf-8">
7+
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
8+
<meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no">
9+
10+
<title>{{ title }}</title>
11+
12+
<link href="{{root}}/css/styles.css" rel="stylesheet">
13+
<script src="{{root}}/js/script.js" async></script>
14+
</head>
15+
<body>
16+
<section>
17+
{{{ main }}}
18+
</section>
19+
</body>
20+
</html>

0 commit comments

Comments
 (0)