-
Notifications
You must be signed in to change notification settings - Fork 2
/
hulk.coffee
80 lines (60 loc) · 1.91 KB
/
hulk.coffee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
{join} = require 'path'
{existsSync} = require 'path'
class HulkHogan
parsePartials : (source)-> # Return list of patial filenames in the source.
{scan} = require 'hogan.js'
result = []
scanned = scan source
for item in scanned
if item.tag is '>'
result.push item.n
return result
_readFile : (path)->
{readFileSync} = require 'fs'
return readFileSync(path).toString() # TODO better way to read file? especially large ones.
getSourcePath : (file)-> # Get full filepath.
join @root, file
getSource : (file)-> # Return source file.
filepath = @getSourcePath file
if existsSync filepath
return @_readFile filepath
else if @ext and existsSync filepath+=".#{@ext}"
return @_readFile filepath
return ''
_makePartials : (partials, list)->
for file in list
sublist = []
source = null
if file not of partials
source = @getSource file
if source
partials[file] = source
sublist = @parsePartials source
if sublist.length
@_makePartials partials, sublist
render : (source, context={})-> # Shortcut for @compile(source, options)()
do @compile source, context
compile : (source='', options={})->
@root = options.root if options.root
@ext = options.defaultEngine if options.defaultEngine
hogan = require 'hogan.js'
compiled = hogan.compile source
partials = {}
# Get Partials #
partial_files = @parsePartials source
if partial_files.length
@_makePartials partials, partial_files
return ->
return compiled.render options, partials
__express : (filename, options, callback) =>
# add support for Express 3.x templating scheme
# in Express use like this:
#
# app.engine 'html', hogan.__express
# app.set 'view engine', 'html'
#
source = @_readFile(filename)
# pass options to compile method to support partials
compiled = @compile(source, options)
callback(null, compiled(options))
module.exports = new HulkHogan