-
Notifications
You must be signed in to change notification settings - Fork 8
/
renderer.coffee
99 lines (85 loc) · 2.68 KB
/
renderer.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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
CoffeeScript = require 'coffee-script'
cjsxTransform = require 'coffee-react-transform'
pug = require 'pug'
sass = require 'node-sass'
VERSION = require('../package.json').version
{ getCacheKey } = require './cache'
compileScriptFile = (script_source) ->
return CoffeeScript.compile(
cjsxTransform(
script_source.toString()
)
)
compileMarkupFile = (markup_source) ->
template = pug.compile(markup_source.toString())
return template()
compileStyleFile = (style_source) ->
output = sass.renderSync
data: style_source.toString()
indentedSyntax: true
return output.css
compileScriptLibraries = (script_libraries) ->
script_libs = ''
for lib in script_libraries
key = getCacheKey(lib)
if key
url = key
cached_from = "data-cached_from='#{ lib }'"
else
url = lib
cached_from = ''
script_libs += "<script src='#{ url }' #{ cached_from }></script>"
return script_libs
compileStyleLibraries = (style_libraries) ->
style_libs = ''
for lib in style_libraries
key = getCacheKey(lib)
if key
url = key
else
url = lib
style_libs += "<link rel='stylesheet' href='#{ url }' type='text/css'>"
return style_libs
compileExtraHeadMarkup = (markup) ->
if not markup
return ''
else
return markup
compositePage = (ctx) ->
page = """
<!-- Generated by http://proto.es v#{ VERSION } -->
<!doctype html>
<html>
<head>
<title>(Proto) #{ ctx.title }</title>
<meta charset="utf-8">
#{ ctx.script_libraries }
#{ ctx.style_libraries }
#{ ctx.extra_head_markup }
<style>
#{ ctx.style }
</style>
</head>
<body>
#{ ctx.markup }
<script>
#{ ctx.script }
</script>
#{ ctx.extra_body_markup }
</body>
</html>
"""
return page
doCompilation = (sources) ->
output = compositePage
title : sources.settings.name
style : compileStyleFile(sources.style)
script : compileScriptFile(sources.script)
markup : compileMarkupFile(sources.markup)
script_libraries : compileScriptLibraries(sources.settings.script_libraries)
style_libraries : compileStyleLibraries(sources.settings.style_libraries)
extra_head_markup : compileExtraHeadMarkup(sources.settings.extra_head_markup)
extra_body_markup : sources.extra_body or ''
return output
module.exports = (sources) ->
return doCompilation(sources)