1 |
|
2 |
|
3 | 'use strict';
|
4 |
|
5 | var express = require('express');
|
6 | var app = express();
|
7 | var hbs = require('..');
|
8 | var fs = require('fs');
|
9 | var fp = require('path');
|
10 |
|
11 | function relative(path) {
|
12 | return fp.join(__dirname, path);
|
13 | }
|
14 | var viewsDir = relative('views');
|
15 |
|
16 | app.use(express.static(relative('public')));
|
17 |
|
18 |
|
19 | app.engine('hbs', hbs.express4({
|
20 | partialsDir: [relative('views/partials'), relative('views/partials-other')],
|
21 | layoutsDir: relative('views/layout'),
|
22 | defaultLayout: relative('views/layout/default.hbs')
|
23 | }));
|
24 | app.set('view engine', 'hbs');
|
25 | app.set('views', relative('views'));
|
26 |
|
27 |
|
28 |
|
29 | hbs.registerHelper('link', function(text, options) {
|
30 | var attrs = [];
|
31 | for (var prop in options.hash) {
|
32 | attrs.push(prop + '="' + options.hash[prop] + '"');
|
33 | }
|
34 | return new hbs.SafeString('<a ' + attrs.join(' ') + '>' + text + '</a>');
|
35 | });
|
36 |
|
37 |
|
38 | hbs.registerAsyncHelper('readFile', function(filename, cb) {
|
39 | fs.readFile(fp.join(viewsDir, filename), 'utf8', function(err, content) {
|
40 | if (err) console.error(err);
|
41 | cb(new hbs.SafeString(content));
|
42 | });
|
43 | });
|
44 |
|
45 | var fruits = [
|
46 | {name: 'apple'},
|
47 | {name: 'orange'},
|
48 | {name: 'pear'}
|
49 | ];
|
50 |
|
51 |
|
52 | var veggies = [
|
53 | {name: 'asparagus'},
|
54 | {name: 'carrot'},
|
55 | {name: 'spinach'}
|
56 | ];
|
57 |
|
58 | app.get('/', function(req, res) {
|
59 | res.render('index', {
|
60 | title: 'express-hbs example'
|
61 | });
|
62 | });
|
63 |
|
64 | app.get('/fruits', function(req, res) {
|
65 | res.render('fruits/index-layoutsDir', {
|
66 | title: 'My favorite fruits',
|
67 | fruits: fruits
|
68 | });
|
69 | });
|
70 |
|
71 | app.get('/fruits/:name', function(req, res) {
|
72 | res.render('fruits/details-layoutsDir', {
|
73 | fruit: req.params.name
|
74 | });
|
75 | });
|
76 |
|
77 | app.get('/veggies', function(req, res) {
|
78 | res.render('veggies', {
|
79 | title: 'My favorite veggies',
|
80 | veggies: veggies,
|
81 | layout: 'veggie'
|
82 | });
|
83 | });
|
84 |
|
85 | app.get('/veggies/explicit-dir', function(req, res) {
|
86 | res.render('veggies', {
|
87 | title: 'My favorite veggies',
|
88 | veggies: veggies,
|
89 | layout: relative('views/layout/veggie')
|
90 | });
|
91 | });
|
92 |
|
93 | app.get('/veggies/:name', function(req, res) {
|
94 | res.render('veggies/details', {
|
95 | veggie: req.params.name,
|
96 | layout: 'veggie-details'
|
97 | });
|
98 | });
|
99 |
|
100 | if (require.main === module) {
|
101 | app.listen(3000);
|
102 | console.log('Express server listening on port 3000');
|
103 | } else {
|
104 | module.exports = app;
|
105 | }
|