ember 0.0.1 → 0.1.0

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.
Files changed (65) hide show
  1. data/HISTORY +79 -0
  2. data/INSTALL +31 -0
  3. data/MANUAL +25 -0
  4. data/README +54 -0
  5. data/THEORY +151 -0
  6. data/USAGE +250 -0
  7. data/bin/ember +58 -20
  8. data/doc/ann.xml +93 -0
  9. data/doc/api/Ember.html +436 -0
  10. data/doc/api/Ember/Template.html +774 -0
  11. data/doc/api/Ember/Template/Program.html +877 -0
  12. data/doc/api/Ember/Template/Program/Statement.html +181 -0
  13. data/doc/api/_index.html +139 -0
  14. data/doc/api/class_list.html +36 -0
  15. data/doc/api/css/common.css +1 -0
  16. data/doc/api/css/full_list.css +50 -0
  17. data/doc/api/css/style.css +273 -0
  18. data/doc/api/file.LICENSE.html +73 -0
  19. data/doc/api/file_list.html +38 -0
  20. data/doc/api/frames.html +13 -0
  21. data/doc/api/index.html +72 -13
  22. data/doc/api/js/app.js +111 -0
  23. data/doc/api/js/full_list.js +117 -0
  24. data/doc/api/js/{jquery-1.3.2.min.js → jquery.js} +0 -0
  25. data/doc/api/method_list.html +179 -0
  26. data/doc/api/top-level-namespace.html +87 -0
  27. data/doc/index.html +1353 -682
  28. data/inochi.opts +31 -0
  29. data/lib/ember.rb +1 -15
  30. data/lib/ember/inochi.rb +103 -0
  31. data/lib/ember/template.rb +66 -78
  32. data/test/combinatorics.rb +188 -0
  33. data/test/ember/template_test.rb +137 -0
  34. data/test/runner +25 -0
  35. data/test/test_helper.rb +5 -0
  36. metadata +61 -51
  37. data/doc/api/apple-touch-icon.png +0 -0
  38. data/doc/api/classes/Ember.html +0 -61
  39. data/doc/api/classes/Ember/Template.html +0 -413
  40. data/doc/api/classes/Ember/Template/Program.html +0 -60
  41. data/doc/api/created.rid +0 -1
  42. data/doc/api/css/main.css +0 -263
  43. data/doc/api/css/panel.css +0 -383
  44. data/doc/api/css/reset.css +0 -53
  45. data/doc/api/favicon.ico +0 -0
  46. data/doc/api/files/LICENSE.html +0 -76
  47. data/doc/api/files/lib/ember/template_rb.html +0 -66
  48. data/doc/api/files/lib/ember_rb.html +0 -63
  49. data/doc/api/i/arrows.png +0 -0
  50. data/doc/api/i/results_bg.png +0 -0
  51. data/doc/api/i/tree_bg.png +0 -0
  52. data/doc/api/js/jquery-effect.js +0 -593
  53. data/doc/api/js/main.js +0 -22
  54. data/doc/api/js/searchdoc.js +0 -628
  55. data/doc/api/panel/index.html +0 -71
  56. data/doc/api/panel/search_index.js +0 -1
  57. data/doc/api/panel/tree.js +0 -1
  58. data/doc/history.erb +0 -34
  59. data/doc/index.erb +0 -11
  60. data/doc/intro.erb +0 -53
  61. data/doc/setup.erb +0 -78
  62. data/doc/usage.erb +0 -280
  63. data/rakefile +0 -14
  64. data/test/ember.rb +0 -17
  65. data/test/ember/template.rb +0 -141
data/HISTORY ADDED
@@ -0,0 +1,79 @@
1
+ %# #%
2
+ %# You can read this document in its full glory by #%
3
+ %# opening ./doc/index.html in your favorite Web browser. #%
4
+ %# #%
5
+
6
+ %#----------------------------------------------------------------------------
7
+ %| section "Version 0.1.0 (2010-04-03)"
8
+ %#----------------------------------------------------------------------------
9
+
10
+ This release improves the handling of eRuby comment directives, fixes a bug
11
+ in the `<%% end %>` inference logic, and performs some minor housekeeping.
12
+
13
+ %#--------------------------------------------------------------------------
14
+ %| paragraph "New features"
15
+ %#--------------------------------------------------------------------------
16
+
17
+ * Single-line comment directives are now ignored (treated like no-ops)
18
+ in input templates. This allows us to surround eRuby block directives
19
+ with section separators made from single-line comment directives:
20
+
21
+ %%|some_block_directive
22
+
23
+ Inside some_block_directive.
24
+
25
+ %%#-----------------------------------------------------------------
26
+
27
+ Still inside some_block_directive!
28
+
29
+ %%#---------------------------------------------------------------
30
+ %%| nested_block_directive
31
+ %%#---------------------------------------------------------------
32
+
33
+ Inside nested_block_directive.
34
+
35
+ %#--------------------------------------------------------------------------
36
+ %| paragraph "Bug fixes"
37
+ %#--------------------------------------------------------------------------
38
+
39
+ * `<%% end %>` inference did not work for blocks
40
+ beginning with `def`, `class`, and `module` keywords.
41
+
42
+ %#--------------------------------------------------------------------------
43
+ %| paragraph "Housekeeping"
44
+ %#--------------------------------------------------------------------------
45
+
46
+ * Upgrade to Inochi 2.0.0-rc3. This project no longer
47
+ depends on the "inochi" or "trollop" gems at runtime.
48
+
49
+ %#----------------------------------------------------------------------------
50
+ %| section "Version 0.0.1 (2009-10-03)"
51
+ %#----------------------------------------------------------------------------
52
+
53
+ This release improves Ruby 1.9 support and revises the user manual.
54
+
55
+ %#--------------------------------------------------------------------------
56
+ %| paragraph "Bug fixes"
57
+ %#--------------------------------------------------------------------------
58
+
59
+ * Nested templates could not access parent's binding in Ruby 1.9
60
+
61
+ %#--------------------------------------------------------------------------
62
+ %| paragraph "Housekeeping"
63
+ %#--------------------------------------------------------------------------
64
+
65
+ * Use simpler Copyright reminder at the top of every file.
66
+
67
+ * Rename internal `Program` class' methods to be self-documenting.
68
+
69
+ * Open source is for fun, so [be nice][1]: speak
70
+ of "related works" instead of "competitors".
71
+
72
+ [1]: http://loiclemeur.com/english/2009/03/never-criticize-your-competitors.html
73
+
74
+ %#----------------------------------------------------------------------------
75
+ %| section "Version 0.0.0 (2009-02-13)"
76
+ %#----------------------------------------------------------------------------
77
+
78
+ This is the first public release of Ember. Enjoy!
79
+
data/INSTALL ADDED
@@ -0,0 +1,31 @@
1
+ %# #%
2
+ %# You can read this document in its full glory by #%
3
+ %# opening ./doc/index.html in your favorite Web browser. #%
4
+ %# #%
5
+
6
+ %#----------------------------------------------------------------------------
7
+ %| section "Prerequisites"
8
+ %#----------------------------------------------------------------------------
9
+
10
+ * [Ruby](http://ruby-lang.org) 1.8.6 or newer.
11
+
12
+ * [RubyGems](http://rubygems.org) 1.3.6 or newer.
13
+
14
+ %#----------------------------------------------------------------------------
15
+ %| section "Installing"
16
+ %#----------------------------------------------------------------------------
17
+
18
+ %|command! "gem install ember"
19
+
20
+ %#----------------------------------------------------------------------------
21
+ %| section "Upgrading"
22
+ %#----------------------------------------------------------------------------
23
+
24
+ %|command! "gem update ember"
25
+
26
+ %#----------------------------------------------------------------------------
27
+ %| section "Uninstalling"
28
+ %#----------------------------------------------------------------------------
29
+
30
+ %|command! "gem uninstall ember"
31
+
data/MANUAL ADDED
@@ -0,0 +1,25 @@
1
+ %# #%
2
+ %# You can read this document in its full glory by #%
3
+ %# opening ./doc/index.html in your favorite Web browser. #%
4
+ %# #%
5
+
6
+ % api_reference_url = 'api/index.html'
7
+ % source_code_tool = '[Git](http://git-scm.com)'
8
+ % source_code_url = 'http://github.com/sunaku/ember'
9
+ % issue_tracker_url = 'http://github.com/sunaku/ember/issues'
10
+
11
+ %|part "Welcome"
12
+ %+ "README"
13
+
14
+ %|part "Setup"
15
+ %+ "INSTALL"
16
+
17
+ %|part "Theory"
18
+ %+ "THEORY"
19
+
20
+ %|part "Usage"
21
+ %+ "USAGE"
22
+
23
+ %|part "History"
24
+ %|project_history
25
+ %+ "HISTORY"
data/README ADDED
@@ -0,0 +1,54 @@
1
+ %# #%
2
+ %# You can read this document in its full glory by #%
3
+ %# opening ./doc/index.html in your favorite Web browser. #%
4
+ %# #%
5
+
6
+ %#----------------------------------------------------------------------------
7
+ %| project_summary
8
+ %#----------------------------------------------------------------------------
9
+
10
+ Ember (*EMBE*dded *R*uby) is an [eRuby template][1] processor that enables
11
+ debugging, reduces markup, and improves composability of eRuby templates.
12
+
13
+ * It reports correct line numbers in error message stack traces.
14
+ * It can infer <tt><%% end %></tt> based on indentation.
15
+ * It can unindent block content hierarchically.
16
+ * It completely silences code-only eRuby directives.
17
+ * It is implemented in <%= `sloccount lib`[/^\d+/] %> lines of pure Ruby.
18
+
19
+ [1]: http://en.wikipedia.org/wiki/ERuby
20
+
21
+ %#----------------------------------------------------------------------------
22
+ %| section "Resources"
23
+ %#----------------------------------------------------------------------------
24
+
25
+ * <%= xref "History", "What's new?" %> ---
26
+ release notes and project history.
27
+
28
+ * [Issue tracker](<%= issue_tracker_url %>) ---
29
+ report bugs, request features, or ask for help.
30
+
31
+ * [Source code](<%= source_code_url %>) ---
32
+ browse online or obtain using <%= source_code_tool %>
33
+
34
+ * [API reference](<%= api_reference_url %>) ---
35
+ documentation for source code.
36
+
37
+ * [Project home](<%= Ember::WEBSITE %>) ---
38
+ the official project home page.
39
+
40
+ %#----------------------------------------------------------------------------
41
+ %| section "License"
42
+ %#----------------------------------------------------------------------------
43
+
44
+ %# See the file named "LICENSE" for details.
45
+ %< "LICENSE"
46
+
47
+ %#----------------------------------------------------------------------------
48
+ %| section "Related works"
49
+ %#----------------------------------------------------------------------------
50
+
51
+ * [ERB](http://www.ruby-doc.org/stdlib/libdoc/erb/rdoc/)
52
+ * [Erubis](http://www.kuwata-lab.com/erubis/)
53
+ * [eruby](http://modruby.net/en/)
54
+
data/THEORY ADDED
@@ -0,0 +1,151 @@
1
+ %#----------------------------------------------------------------------------
2
+ %| section "Directives"
3
+ %#----------------------------------------------------------------------------
4
+
5
+ eRuby templates are plain-text documents that contain special processing
6
+ instructions known as **directives**, which may be expressed using either
7
+ **standard** or **shorthand** notation:
8
+
9
+ %|table
10
+ %|thead
11
+ %|tr
12
+ %|th
13
+ Notation
14
+ %|th
15
+ Directive
16
+ %|th
17
+ Head
18
+ %|th
19
+ Operation
20
+ %|th
21
+ Body
22
+ %|th
23
+ Tail
24
+ %|tbody
25
+ %|tr
26
+ %|td
27
+ Standard
28
+ %|td
29
+ <%%XY%>
30
+ %|td
31
+ <%%
32
+ %|td
33
+ X
34
+ %|td
35
+ Y
36
+ %|td
37
+ %%>
38
+ %|tr
39
+ %|td
40
+ Shorthand
41
+ %|td
42
+ %%XY
43
+ %|td
44
+ %%
45
+ %|td
46
+ X
47
+ %|td
48
+ Y
49
+ %|td
50
+
51
+ In standard notation, the directive is composed of a head, <%= xref \
52
+ "Operations", "an operation" %>, a body, and a tail. In addition, the
53
+ directive may appear anywhere in the text.
54
+
55
+ In shorthand notation, the directive is composed of a head, <%= xref \
56
+ "Operations", "an operation" %> and a body. However, the directive may only
57
+ appear in the text if it occupies an entire line (arbitrary amounts of
58
+ leading whitespace are permitted).
59
+
60
+ In any case, directives are atomic constructs; they cannot be nested.
61
+
62
+ %#--------------------------------------------------------------------------
63
+ %| section "Operations"
64
+ %#--------------------------------------------------------------------------
65
+
66
+ The first character that follows the head of a directive is known as an
67
+ **operation**. It prescribes how the directive should be processed:
68
+
69
+ %|table
70
+ %|thead
71
+ %|tr
72
+ %|th
73
+ Operation
74
+ %|th
75
+ Effect
76
+ %|th
77
+ Example
78
+ %|tbody
79
+ %|tr
80
+ %|td
81
+ `<%= Ember::Template::OPERATION_COMMENT_LINE %>`
82
+ %|td
83
+ The entire directive is omitted from the output.
84
+ %|td
85
+ %= xref "Comment directives"
86
+ %|tr
87
+ %|td
88
+ `<%= Ember::Template::OPERATION_EVAL_EXPRESSION %>`
89
+ %|td
90
+ The body of the directive is evaluated as Ruby code, and the
91
+ result of this evaluation is inserted into the output.
92
+ %|td
93
+ %= xref "Vocal directives"
94
+ %|tr
95
+ %|td
96
+ `<%= Ember::Template::OPERATION_EVAL_TEMPLATE_STRING %>`
97
+ %|td
98
+ The body of the directive is evaluated as an eRuby template, and
99
+ the result of this evaluation is inserted into the output.
100
+ %|td
101
+ %= xref "Dynamic template evaluation"
102
+ %|tr
103
+ %|td
104
+ `<%= Ember::Template::OPERATION_EVAL_TEMPLATE_FILE %>`
105
+ %|td
106
+ The body of the directive is evaluated as Ruby code, and the
107
+ result of this evaluation is assumed to be a string that specifies
108
+ the path (either absolute or relative to the eRuby template file
109
+ in which this directive is found) to a file containing an eRuby
110
+ template. This file is read and its contents are evaluated as an
111
+ eRuby template, and the result of this evaluation is inserted into
112
+ the output.
113
+ %|td
114
+ %= xref "Template file inclusion"
115
+ %|tr
116
+ %|td
117
+ `<%= Ember::Template::OPERATION_INSERT_PLAIN_FILE %>`
118
+ %|td
119
+ The body of the directive is evaluated as Ruby code, and the
120
+ result of this evaluation is assumed to be a string that specifies
121
+ the path (either absolute or relative to the eRuby template file
122
+ in which this directive is found) to a file. This file is read
123
+ and its contents are inserted into the output.
124
+ %|td
125
+ %= xref "Raw file inclusion"
126
+ %|tr
127
+ %|td
128
+ `<%= Ember::Template::OPERATION_BEGIN_LAMBDA %>`
129
+ %|td
130
+ The body of the directive is treated as the beginning of a Ruby
131
+ block. The `do` keyword is automatically appended to the body of
132
+ the directive if missing.
133
+ %|td
134
+ %= xref "Block directives"
135
+ %|tr
136
+ %|td
137
+ `%`
138
+ %|td
139
+ One "%" character is omitted from the head of the directive and
140
+ the entire directive is inserted into the output.
141
+ %|td
142
+ %= xref "Escaped directives"
143
+ %|tr
144
+ %|td
145
+ (none of the above)
146
+ %|td
147
+ The body of the directive is evaluated as Ruby code, but the
148
+ result of this evaluation *is not* inserted into the output.
149
+ %|td
150
+ %= xref "Silent directives"
151
+
data/USAGE ADDED
@@ -0,0 +1,250 @@
1
+ %# #%
2
+ %# You can read this document in its full glory by #%
3
+ %# opening ./doc/index.html in your favorite Web browser. #%
4
+ %# #%
5
+
6
+ %#----------------------------------------------------------------------------
7
+ %| section "Shell command"
8
+ %#----------------------------------------------------------------------------
9
+
10
+ %|command! "ember --help" do |node|
11
+ %|text
12
+ %= verbatim `ruby bin/#{node.title}`
13
+
14
+ %#----------------------------------------------------------------------------
15
+ %| section "Ruby library"
16
+ %#----------------------------------------------------------------------------
17
+
18
+ Begin by loading Ember into Ruby:
19
+
20
+ %|code
21
+ require 'rubygems' # only necessary if you are using Ruby 1.8
22
+ require 'ember'
23
+
24
+ Instantiate an Ember template processor:
25
+
26
+ %|code
27
+ source = "your eRuby template here"
28
+ options = { :unindent => true, :shorthand => true }
29
+ template = Ember::Template.new(source, options)
30
+
31
+ Inspect the Ruby program that was compiled (and is used) by the Ember
32
+ template processor to evaluate the eRuby template given as input:
33
+
34
+ %|code
35
+ puts template.program
36
+
37
+ View the result of evaluating the eRuby template:
38
+
39
+ %|code
40
+ puts template.render
41
+
42
+ See the [API documentation](api/index.html) for more information.
43
+
44
+ %#--------------------------------------------------------------------------
45
+ <%
46
+ standard_directive = lambda do |body|
47
+ '<' + '%' + body + ' %' + '>'
48
+ end
49
+
50
+ shorthand_directive = lambda do |body|
51
+ '%' + body
52
+ end
53
+ %>
54
+
55
+ %|template_example = lambda do |input, options|
56
+ % input = input.strip.gsub(/^ {4}/, '') << "\n" # remove indentation
57
+ % template = Ember::Template.new(input, options)
58
+
59
+ % text { input }
60
+
61
+ <%=
62
+ if options.empty?
63
+ "The"
64
+ else
65
+ "With `#{options.inspect}` options, the"
66
+ end
67
+ %> above template compiles into:
68
+
69
+ % code { template.program }
70
+
71
+ And renders as:
72
+
73
+ % text { template.render }
74
+
75
+ %#--------------------------------------------------------------------------
76
+ %| example! "An empty template"
77
+ %#--------------------------------------------------------------------------
78
+
79
+ Begin with an empty template:
80
+
81
+ %= template_example.call "", {}
82
+
83
+ %#--------------------------------------------------------------------------
84
+ %| example! "Comment directives"
85
+ %#--------------------------------------------------------------------------
86
+
87
+ Add comment directives:
88
+
89
+ <%=
90
+ template_example.call %{
91
+ #{standard_directive.call '# this is a comment'}
92
+ #{shorthand_directive.call '# this is also a comment'}
93
+
94
+ #{standard_directive.call "# this\nis\na\nmulti-line comment"}
95
+ }, :shorthand => true
96
+ %>
97
+
98
+ %#--------------------------------------------------------------------------
99
+ %| example! "Escaped directives"
100
+ %#--------------------------------------------------------------------------
101
+
102
+ Add escaped directives:
103
+
104
+ <%=
105
+ example = '% this is an escaped directive'
106
+
107
+ template_example.call %{
108
+ #{standard_directive.call example}
109
+ #{shorthand_directive.call example}
110
+ }, :shorthand => true
111
+ %>
112
+
113
+ %#--------------------------------------------------------------------------
114
+ %| example! "Vocal directives"
115
+ %#--------------------------------------------------------------------------
116
+
117
+ Add vocal directives, which produce output:
118
+
119
+ <%=
120
+ template_example.call %{
121
+ #{standard_directive.call '= "hello"'}
122
+ #{shorthand_directive.call '= "world"'}
123
+
124
+ }, :shorthand => true
125
+ %>
126
+
127
+ %#--------------------------------------------------------------------------
128
+ %| example! "Silent directives"
129
+ %#--------------------------------------------------------------------------
130
+
131
+ Add silent directives, which do not produce output:
132
+
133
+ <%=
134
+ template_example.call %{
135
+ #{standard_directive.call ' a = "hello"'}
136
+ #{shorthand_directive.call ' b = "world"'}
137
+
138
+ #{standard_directive.call '= a'}
139
+ #{shorthand_directive.call '= b'}
140
+
141
+ }, :shorthand => true
142
+ %>
143
+
144
+ %#--------------------------------------------------------------------------
145
+ %| example! "Block directives"
146
+ %#--------------------------------------------------------------------------
147
+
148
+ Add some Ruby blocks:
149
+
150
+ <%=
151
+ template_example.call %{
152
+ #{shorthand_directive.call ' words = %w[hello world]'}
153
+
154
+ #{standard_directive.call ' words.each do |w|'}
155
+ #{standard_directive.call '= w'}
156
+ #{standard_directive.call ' end'}
157
+
158
+ #{shorthand_directive.call ' words.each do |w|'}
159
+ #{shorthand_directive.call '= w'}
160
+ #{shorthand_directive.call ' end'}
161
+
162
+ #{shorthand_directive.call '|words.each |w|'}
163
+ #{shorthand_directive.call '= w'}
164
+ #{shorthand_directive.call ' end'}
165
+
166
+ }, :shorthand => true
167
+ %>
168
+
169
+ %#--------------------------------------------------------------------------
170
+ %| example! "Infer block endings"
171
+ %#--------------------------------------------------------------------------
172
+
173
+ Omit <tt><%= standard_directive.call ' end' %></tt> directives from the
174
+ template:
175
+
176
+ <%=
177
+ template_example.call %{
178
+ #{shorthand_directive.call ' words = %w[hello world]'}
179
+
180
+ #{standard_directive.call ' words.each do |w|'}
181
+ #{standard_directive.call '= w'}
182
+
183
+ #{shorthand_directive.call ' words.each do |w|'}
184
+ #{shorthand_directive.call '= w'}
185
+
186
+ #{shorthand_directive.call '|words.each |w|'}
187
+ #{shorthand_directive.call '= w'}
188
+
189
+ }, :shorthand => true, :infer_end => true
190
+ %>
191
+
192
+ %#--------------------------------------------------------------------------
193
+ %| example! "Raw file inclusion"
194
+ %#--------------------------------------------------------------------------
195
+
196
+ When <tt>doc/example.txt</tt> contains:
197
+
198
+ %|text
199
+ %< "doc/example.txt"
200
+
201
+ And the eRuby template is:
202
+
203
+ <%=
204
+ example = '< "doc/example.txt"'
205
+
206
+ template_example.call %{
207
+ #{standard_directive.call example}
208
+
209
+ #{shorthand_directive.call example}
210
+
211
+ }, :shorthand => true, :source_file => __FILE__
212
+ %>
213
+
214
+ %#--------------------------------------------------------------------------
215
+ %| example! "Template file inclusion"
216
+ %#--------------------------------------------------------------------------
217
+
218
+ When <tt>doc/example.erb</tt> contains:
219
+
220
+ %|code :rhtml
221
+ %< "doc/example.erb"
222
+
223
+ And the eRuby template is:
224
+
225
+ <%=
226
+ example = '+ "doc/example.erb"'
227
+
228
+ template_example.call %{
229
+ #{standard_directive.call example}
230
+
231
+ #{shorthand_directive.call example}
232
+
233
+ }, :shorthand => true, :source_file => __FILE__
234
+ %>
235
+
236
+ %#--------------------------------------------------------------------------
237
+ %| example! "Dynamic template evaluation"
238
+ %#--------------------------------------------------------------------------
239
+
240
+ <%=
241
+ example = %{~ "#{shorthand_directive.call '= 2 + 2'}"}
242
+
243
+ template_example.call %{
244
+ #{standard_directive.call example}
245
+
246
+ #{shorthand_directive.call example}
247
+
248
+ }, :shorthand => true
249
+ %>
250
+