fifty 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|