reco 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +13 -0
- data/lib/reco/compiler.rb +3 -3
- data/lib/reco/scanner.rb +31 -7
- data/lib/reco/wrapper.js +2 -2
- metadata +13 -2
data/README.md
CHANGED
@@ -6,3 +6,16 @@ Eco is a wonderful javascript template system by [Sam Stephenson](http://twitter
|
|
6
6
|
Reco let you compile Eco templates into Javascript through Ruby like this:
|
7
7
|
|
8
8
|
javascript = Reco.compile File.read('some_template')
|
9
|
+
|
10
|
+
With Rails 3.1 you can serve Eco templates i.e. like this:
|
11
|
+
|
12
|
+
// app/assets/javascripts/templates.js.erb
|
13
|
+
window.templates = {};
|
14
|
+
<% for template_name in [:user, :post] do %>
|
15
|
+
<% template_path = File.join Rails.root, 'app', 'assets', 'templates', "#{template_name}.eco" %>
|
16
|
+
<%= Reco.compile File.read(template_path), identifier: "window.templates.#{template_name}" %>
|
17
|
+
<% end %>
|
18
|
+
|
19
|
+
Javascript that are run after templates.js.erb will now be able to do this:
|
20
|
+
|
21
|
+
window.templates.user({ name: 'Rasmus' }); // returns the rendered HTML
|
data/lib/reco/compiler.rb
CHANGED
@@ -7,15 +7,15 @@ module Reco
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def self.compile(source, options = {})
|
10
|
-
compiled_javascript = CoffeeScript.compile preprocess(source), noWrap
|
10
|
+
compiled_javascript = CoffeeScript.compile preprocess(source), :noWrap => true
|
11
11
|
identifier = options[:identifier] || 'module.exports'
|
12
12
|
identifier = "var #{identifier}" unless identifier.include? '.'
|
13
13
|
|
14
|
-
wrapper %
|
14
|
+
wrapper % [identifier, compiled_javascript]
|
15
15
|
end
|
16
16
|
|
17
17
|
def self.wrapper
|
18
|
-
File.read File.join(File.dirname(__FILE__), 'wrapper.js')
|
18
|
+
@wrapper ||= File.read File.join(File.dirname(__FILE__), 'wrapper.js')
|
19
19
|
end
|
20
20
|
|
21
21
|
end
|
data/lib/reco/scanner.rb
CHANGED
@@ -2,8 +2,9 @@ require 'strscan'
|
|
2
2
|
|
3
3
|
class Reco::Scanner
|
4
4
|
MODE_PATTERNS = {
|
5
|
-
data
|
6
|
-
code
|
5
|
+
:data => /(.*?)(<%%|<%\s*(\#)|<%(([=-])?)|\n|$)/,
|
6
|
+
:code => /(.*?)((((:|(->|=>))\s*))?%>|\n|$)/,
|
7
|
+
:comment => /(.*?)(%>|\n|$)/
|
7
8
|
}
|
8
9
|
DEDENTABLE_PATTERN = /^(end|when|else|catch|finally)(?:\W|$)/
|
9
10
|
|
@@ -30,7 +31,15 @@ class Reco::Scanner
|
|
30
31
|
callback.call @mode == :data ? ["print_string", flush] : ["fail", "unexpected end of template"]
|
31
32
|
else
|
32
33
|
advance
|
33
|
-
|
34
|
+
|
35
|
+
case @mode
|
36
|
+
when :data
|
37
|
+
scan_data callback
|
38
|
+
when :code
|
39
|
+
scan_code callback
|
40
|
+
when :comment
|
41
|
+
scan_comment callback
|
42
|
+
end
|
34
43
|
end
|
35
44
|
end
|
36
45
|
|
@@ -38,8 +47,9 @@ class Reco::Scanner
|
|
38
47
|
@scanner.scan_until MODE_PATTERNS[@mode]
|
39
48
|
@buffer += @scanner[1]
|
40
49
|
@tail = @scanner[2]
|
41
|
-
@
|
42
|
-
@
|
50
|
+
@comment = @scanner[3]
|
51
|
+
@directive = @scanner[5]
|
52
|
+
@arrow = @scanner[6]
|
43
53
|
end
|
44
54
|
|
45
55
|
def scan_data(callback)
|
@@ -50,9 +60,14 @@ class Reco::Scanner
|
|
50
60
|
@buffer += @tail
|
51
61
|
scan callback
|
52
62
|
elsif @tail
|
53
|
-
@mode = :code
|
54
63
|
callback.call ["print_string", flush]
|
55
|
-
|
64
|
+
|
65
|
+
if @comment
|
66
|
+
@mode = :comment
|
67
|
+
else
|
68
|
+
@mode = :code
|
69
|
+
callback.call ["begin_code", {:print => !!@directive, :safe => @directive == '-'}]
|
70
|
+
end
|
56
71
|
end
|
57
72
|
end
|
58
73
|
|
@@ -70,6 +85,15 @@ class Reco::Scanner
|
|
70
85
|
end
|
71
86
|
end
|
72
87
|
|
88
|
+
def scan_comment(callback)
|
89
|
+
if @tail == "\n"
|
90
|
+
callback.call ['fail', 'unexpected newline in code block']
|
91
|
+
elsif @tail
|
92
|
+
@mode = :data
|
93
|
+
@buffer = ''
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
73
97
|
def is_dedentable?(code)
|
74
98
|
code.match DEDENTABLE_PATTERN
|
75
99
|
end
|
data/lib/reco/wrapper.js
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
%
|
1
|
+
%s = function(__obj) {
|
2
2
|
if (!__obj) __obj = {};
|
3
3
|
var __out = [], __capture = function(callback) {
|
4
4
|
var out = __out, result;
|
@@ -36,7 +36,7 @@
|
|
36
36
|
};
|
37
37
|
}
|
38
38
|
(function() {
|
39
|
-
%
|
39
|
+
%s
|
40
40
|
}).call(__obj);
|
41
41
|
__obj.safe = __objSafe, __obj.escape = __escape;
|
42
42
|
return __out.join('');
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: reco
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.1.
|
5
|
+
version: 0.1.2
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- "Rasmus R\xC3\xB8nn Nielsen"
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-05
|
13
|
+
date: 2011-06-05 00:00:00 +02:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -24,6 +24,17 @@ dependencies:
|
|
24
24
|
version: "2.0"
|
25
25
|
type: :runtime
|
26
26
|
version_requirements: *id001
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
prerelease: false
|
30
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
31
|
+
none: false
|
32
|
+
requirements:
|
33
|
+
- - ">="
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: "0"
|
36
|
+
type: :development
|
37
|
+
version_requirements: *id002
|
27
38
|
description: Reco let you compile Eco templates into Javascript through Ruby.
|
28
39
|
email: rasmusrnielsen@gmail.com
|
29
40
|
executables: []
|