fifty 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/fifty.rb +91 -69
- metadata +2 -2
data/lib/fifty.rb
CHANGED
@@ -2,32 +2,27 @@ module Fifty
|
|
2
2
|
|
3
3
|
require 'handlebars'
|
4
4
|
require 'haml'
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
|
6
|
+
VERSION = '0.0.2'
|
7
|
+
|
9
8
|
class << self
|
10
9
|
attr_accessor :views
|
11
10
|
attr_accessor :compiled
|
11
|
+
attr_accessor :context
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
self.views = ['./views/**/*.haml']
|
15
15
|
self.compiled = false
|
16
|
-
|
17
|
-
def self.cdn(name)
|
18
|
-
if name == :handlebars
|
19
|
-
'https://cdnjs.cloudflare.com/ajax/libs/' +
|
20
|
-
'handlebars.js/1.0.0-rc.3/handlebars.min.js'
|
21
|
-
elsif name == :jquery
|
22
|
-
'https://cdnjs.cloudflare.com/' +
|
23
|
-
'ajax/libs/jquery/1.9.1/jquery.min.js'
|
24
|
-
end
|
25
|
-
end
|
26
16
|
|
27
17
|
@@handlebars = Handlebars::Context.new
|
18
|
+
|
19
|
+
@@handlebars.partial_missing do |a|
|
20
|
+
Fifty.hbs2html(Fifty.render_haml(a, context), @@current)
|
21
|
+
end
|
22
|
+
|
28
23
|
@@helpers, @@shared, @@partials = {}, {}, {}
|
29
24
|
@@view_paths = []
|
30
|
-
|
25
|
+
|
31
26
|
def self.helper(name, fn)
|
32
27
|
code = self.register_helper(name, fn)
|
33
28
|
@@helpers[name] = code
|
@@ -39,7 +34,7 @@ module Fifty
|
|
39
34
|
@@shared[name] = code
|
40
35
|
self.eval_js(code)
|
41
36
|
end
|
42
|
-
|
37
|
+
|
43
38
|
def self.compile
|
44
39
|
self.compile_statics
|
45
40
|
self.compile_inlines
|
@@ -50,24 +45,32 @@ module Fifty
|
|
50
45
|
views = self.views.map { |p| Dir[p] }.flatten
|
51
46
|
context = binding.of_caller(3)
|
52
47
|
views.each do |file|
|
48
|
+
|
49
|
+
puts "Trying to register #{file}"
|
50
|
+
next if file.index('layout')
|
53
51
|
path = File.dirname(file)
|
52
|
+
|
53
|
+
name = '_' + file.gsub('./', '')
|
54
|
+
.gsub('.haml', '')
|
55
|
+
.split('/')[1..-1].join('-')
|
56
|
+
|
54
57
|
unless @@view_paths.include?(path)
|
58
|
+
puts path.inspect
|
55
59
|
@@view_paths << path
|
56
60
|
end
|
57
61
|
template = File.read(file)
|
58
|
-
|
59
|
-
next if name == '_layout'
|
62
|
+
|
60
63
|
partial = Haml::Engine.
|
61
|
-
|
62
|
-
context, layout: false)
|
64
|
+
new(template).render(context, layout: false)
|
63
65
|
partial = self.escape_hbs(partial)
|
64
66
|
@@partials[name] = partial
|
67
|
+
puts "Registered #{name}"
|
68
|
+
|
65
69
|
end
|
66
70
|
end
|
67
71
|
|
68
72
|
def self.compile_inlines
|
69
73
|
inlines = Sinatra::Application.templates
|
70
|
-
context = binding.of_caller(3)
|
71
74
|
inlines.each do |name, info|
|
72
75
|
next if name == :layout
|
73
76
|
partial = Haml::Engine.
|
@@ -76,7 +79,7 @@ module Fifty
|
|
76
79
|
@@partials[name] = partial
|
77
80
|
end
|
78
81
|
end
|
79
|
-
|
82
|
+
|
80
83
|
def self.register_helper(name, fn)
|
81
84
|
"Handlebars.registerHelper('#{name}', #{fn});"
|
82
85
|
end
|
@@ -86,7 +89,7 @@ module Fifty
|
|
86
89
|
@js.runtime.eval(code)
|
87
90
|
end
|
88
91
|
end
|
89
|
-
|
92
|
+
|
90
93
|
def self.escape_hbs(partial)
|
91
94
|
2.times do
|
92
95
|
partial.gsub!("{{", "{%{")
|
@@ -94,68 +97,71 @@ module Fifty
|
|
94
97
|
end
|
95
98
|
partial
|
96
99
|
end
|
97
|
-
|
100
|
+
|
98
101
|
def self.included(base)
|
99
102
|
base.class_eval {
|
100
103
|
Fifty::Helpers::Locales.compile }
|
101
104
|
end
|
102
105
|
|
103
|
-
def fifty(view, data)
|
106
|
+
def fifty(view, data, globals = {})
|
104
107
|
Fifty.compile unless Fifty.compiled
|
105
|
-
hbs2html(haml2hbs(view), data)
|
108
|
+
Fifty.hbs2html(Fifty.haml2hbs(view, globals), data)
|
106
109
|
end
|
107
110
|
|
108
111
|
alias :fu :fifty
|
109
|
-
|
110
|
-
def self.
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
112
|
+
|
113
|
+
def self.core_js
|
114
|
+
|
115
|
+
core_js = ''
|
116
|
+
@@helpers.each do |name, code|
|
117
|
+
core_js += code + "\n"
|
115
118
|
end
|
119
|
+
script_tag('helpers', core_js)
|
120
|
+
|
121
|
+
end
|
122
|
+
|
123
|
+
def self.partials_js
|
116
124
|
partials_js = ''
|
117
125
|
@@partials.each do |name, code|
|
118
|
-
partials_js += register_partial(name) + "\n"
|
126
|
+
partials_js += register_partial(name, code) + "\n"
|
119
127
|
end
|
120
|
-
|
121
|
-
[partials_hbs, partials_js].join
|
128
|
+
script_tag('partials', partials_js)
|
122
129
|
end
|
123
130
|
|
124
|
-
def self.
|
125
|
-
|
126
|
-
@@helpers.each do |name, code|
|
127
|
-
scripts_js += code + "\n"
|
128
|
-
end
|
129
|
-
scripts_js = script_tag('helpers', scripts_js)
|
131
|
+
def self.shared_js
|
132
|
+
|
130
133
|
shared_js = "\n"
|
131
134
|
@@shared.each do |name, code|
|
132
135
|
shared_js += code + "\n"
|
133
136
|
end
|
134
|
-
|
135
|
-
|
137
|
+
script_tag('shared', shared_js)
|
138
|
+
|
139
|
+
end
|
140
|
+
|
141
|
+
def self.helpers
|
142
|
+
[core_js, partials_js, shared_js].join
|
136
143
|
end
|
137
144
|
|
138
145
|
require_relative 'fifty/helpers'
|
139
146
|
|
140
147
|
private
|
141
148
|
|
142
|
-
def haml2hbs(name)
|
143
|
-
|
149
|
+
def self.haml2hbs(name, options = {})
|
150
|
+
puts "Rendering #{name} from HAML to HBS"
|
144
151
|
result = render_haml(name, context, layout: false)
|
145
|
-
while data = result.match(/{{> ([^}]*)}}/)
|
152
|
+
while data = result.match(/{{> ([^}]*)}}/)
|
146
153
|
partial = render_haml($1, context, layout: false)
|
147
154
|
result = result.gsub(data[0], partial)
|
148
155
|
end
|
149
|
-
render_layout(context, result)
|
156
|
+
render_layout(context, result, options)
|
150
157
|
end
|
151
|
-
|
152
|
-
def render_layout(context, insert)
|
153
|
-
|
154
|
-
|
155
|
-
end
|
158
|
+
|
159
|
+
def self.render_layout(context, insert, options)
|
160
|
+
!options[:layout] ? insert :
|
161
|
+
render_haml(:layout, context) { insert }
|
156
162
|
end
|
157
163
|
|
158
|
-
def get_template(name)
|
164
|
+
def self.get_template(name)
|
159
165
|
inlines = Sinatra::Application.templates
|
160
166
|
if path = find_haml_template(name)
|
161
167
|
File.read(path)
|
@@ -165,24 +171,25 @@ module Fifty
|
|
165
171
|
raise "No template for #{name}."
|
166
172
|
end
|
167
173
|
end
|
168
|
-
|
169
|
-
def find_haml_template(name)
|
170
|
-
|
171
|
-
|
172
|
-
return file if File.readable?(file)
|
173
|
-
end
|
174
|
-
nil
|
174
|
+
|
175
|
+
def self.find_haml_template(name)
|
176
|
+
file = './views/' + name.to_s.gsub('-', '/') + '.haml'
|
177
|
+
return file if File.readable?(file)
|
175
178
|
end
|
176
179
|
|
177
|
-
def render_haml(name, context = nil, options = {}, &block)
|
178
|
-
|
180
|
+
def self.render_haml(name, context = nil, options = {}, &block)
|
181
|
+
puts "Rendering HAML template #{name}"
|
182
|
+
Haml::Engine.new(get_template(name),
|
183
|
+
options).render(context, &block)
|
179
184
|
end
|
180
|
-
|
181
|
-
def hbs2html(html, data)
|
185
|
+
|
186
|
+
def self.hbs2html(html, data)
|
187
|
+
@@current = data
|
188
|
+
puts "-> with partials #{data}"
|
182
189
|
unescape_hbs(@@handlebars.compile(html).call(data))
|
183
190
|
end
|
184
191
|
|
185
|
-
def unescape_hbs(html)
|
192
|
+
def self.unescape_hbs(html)
|
186
193
|
html.gsub("{%{", "{{").gsub("}%}", "}}")
|
187
194
|
end
|
188
195
|
|
@@ -190,9 +197,24 @@ module Fifty
|
|
190
197
|
"\n<script id='#{id}' type='#{type}'>#{code}</script>\n"
|
191
198
|
end
|
192
199
|
|
193
|
-
def self.register_partial(name)
|
194
|
-
"Handlebars.registerPartial('#{name[1..-1]}'," +
|
195
|
-
"
|
200
|
+
def self.register_partial(name, code)
|
201
|
+
"Handlebars.registerPartial('#{name[1..-1]}', " +
|
202
|
+
"'#{escape_javascript(code)}');"
|
203
|
+
end
|
204
|
+
|
205
|
+
JS_ESCAPE_MAP = {
|
206
|
+
'\\' => '\\\\',
|
207
|
+
'</' => '<\/',
|
208
|
+
"\r\n" => '\n',
|
209
|
+
"\n" => '\n',
|
210
|
+
"\r" => '\n',
|
211
|
+
'"' => '\\"',
|
212
|
+
"'" => "\\'"
|
213
|
+
}
|
214
|
+
|
215
|
+
def self.escape_javascript(javascript)
|
216
|
+
regexp = /(\\|<\/|\r\n|\342\200\250|[\n\r"'])/u
|
217
|
+
javascript.gsub(regexp) {|match| JS_ESCAPE_MAP[match] }
|
196
218
|
end
|
197
219
|
|
198
220
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fifty
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-03-
|
12
|
+
date: 2013-03-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: json
|