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