ragtag 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,16 @@
1
+ = RELEASE HISTORY
2
+
3
+ == 0.6.0 | 2010-10-15
4
+
5
+ RTALS has been renamed to RagTag!
6
+
7
+ Along with the name change, RagTag no longer uses namespaces to separate
8
+ attribute names.
9
+
10
+ == 0.5.0 // 2010-04-19
11
+
12
+ This is the first public release of RTALS. The library is
13
+ finally at a point where I think it is generally usable.
14
+ While it still has much room for improvement, all the
15
+ essentially functionality is in place.
16
+
@@ -0,0 +1,205 @@
1
+ .
2
+
3
+ Apache License
4
+ Version 2.0, January 2004
5
+ http://www.apache.org/licenses/
6
+
7
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
8
+
9
+ 1. Definitions.
10
+
11
+ "License" shall mean the terms and conditions for use, reproduction,
12
+ and distribution as defined by Sections 1 through 9 of this document.
13
+
14
+ "Licensor" shall mean the copyright owner or entity authorized by
15
+ the copyright owner that is granting the License.
16
+
17
+ "Legal Entity" shall mean the union of the acting entity and all
18
+ other entities that control, are controlled by, or are under common
19
+ control with that entity. For the purposes of this definition,
20
+ "control" means (i) the power, direct or indirect, to cause the
21
+ direction or management of such entity, whether by contract or
22
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
23
+ outstanding shares, or (iii) beneficial ownership of such entity.
24
+
25
+ "You" (or "Your") shall mean an individual or Legal Entity
26
+ exercising permissions granted by this License.
27
+
28
+ "Source" form shall mean the preferred form for making modifications,
29
+ including but not limited to software source code, documentation
30
+ source, and configuration files.
31
+
32
+ "Object" form shall mean any form resulting from mechanical
33
+ transformation or translation of a Source form, including but
34
+ not limited to compiled object code, generated documentation,
35
+ and conversions to other media types.
36
+
37
+ "Work" shall mean the work of authorship, whether in Source or
38
+ Object form, made available under the License, as indicated by a
39
+ copyright notice that is included in or attached to the work
40
+ (an example is provided in the Appendix below).
41
+
42
+ "Derivative Works" shall mean any work, whether in Source or Object
43
+ form, that is based on (or derived from) the Work and for which the
44
+ editorial revisions, annotations, elaborations, or other modifications
45
+ represent, as a whole, an original work of authorship. For the purposes
46
+ of this License, Derivative Works shall not include works that remain
47
+ separable from, or merely link (or bind by name) to the interfaces of,
48
+ the Work and Derivative Works thereof.
49
+
50
+ "Contribution" shall mean any work of authorship, including
51
+ the original version of the Work and any modifications or additions
52
+ to that Work or Derivative Works thereof, that is intentionally
53
+ submitted to Licensor for inclusion in the Work by the copyright owner
54
+ or by an individual or Legal Entity authorized to submit on behalf of
55
+ the copyright owner. For the purposes of this definition, "submitted"
56
+ means any form of electronic, verbal, or written communication sent
57
+ to the Licensor or its representatives, including but not limited to
58
+ communication on electronic mailing lists, source code control systems,
59
+ and issue tracking systems that are managed by, or on behalf of, the
60
+ Licensor for the purpose of discussing and improving the Work, but
61
+ excluding communication that is conspicuously marked or otherwise
62
+ designated in writing by the copyright owner as "Not a Contribution."
63
+
64
+ "Contributor" shall mean Licensor and any individual or Legal Entity
65
+ on behalf of whom a Contribution has been received by Licensor and
66
+ subsequently incorporated within the Work.
67
+
68
+ 2. Grant of Copyright License. Subject to the terms and conditions of
69
+ this License, each Contributor hereby grants to You a perpetual,
70
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
71
+ copyright license to reproduce, prepare Derivative Works of,
72
+ publicly display, publicly perform, sublicense, and distribute the
73
+ Work and such Derivative Works in Source or Object form.
74
+
75
+ 3. Grant of Patent License. Subject to the terms and conditions of
76
+ this License, each Contributor hereby grants to You a perpetual,
77
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
78
+ (except as stated in this section) patent license to make, have made,
79
+ use, offer to sell, sell, import, and otherwise transfer the Work,
80
+ where such license applies only to those patent claims licensable
81
+ by such Contributor that are necessarily infringed by their
82
+ Contribution(s) alone or by combination of their Contribution(s)
83
+ with the Work to which such Contribution(s) was submitted. If You
84
+ institute patent litigation against any entity (including a
85
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
86
+ or a Contribution incorporated within the Work constitutes direct
87
+ or contributory patent infringement, then any patent licenses
88
+ granted to You under this License for that Work shall terminate
89
+ as of the date such litigation is filed.
90
+
91
+ 4. Redistribution. You may reproduce and distribute copies of the
92
+ Work or Derivative Works thereof in any medium, with or without
93
+ modifications, and in Source or Object form, provided that You
94
+ meet the following conditions:
95
+
96
+ (a) You must give any other recipients of the Work or
97
+ Derivative Works a copy of this License; and
98
+
99
+ (b) You must cause any modified files to carry prominent notices
100
+ stating that You changed the files; and
101
+
102
+ (c) You must retain, in the Source form of any Derivative Works
103
+ that You distribute, all copyright, patent, trademark, and
104
+ attribution notices from the Source form of the Work,
105
+ excluding those notices that do not pertain to any part of
106
+ the Derivative Works; and
107
+
108
+ (d) If the Work includes a "NOTICE" text file as part of its
109
+ distribution, then any Derivative Works that You distribute must
110
+ include a readable copy of the attribution notices contained
111
+ within such NOTICE file, excluding those notices that do not
112
+ pertain to any part of the Derivative Works, in at least one
113
+ of the following places: within a NOTICE text file distributed
114
+ as part of the Derivative Works; within the Source form or
115
+ documentation, if provided along with the Derivative Works; or,
116
+ within a display generated by the Derivative Works, if and
117
+ wherever such third-party notices normally appear. The contents
118
+ of the NOTICE file are for informational purposes only and
119
+ do not modify the License. You may add Your own attribution
120
+ notices within Derivative Works that You distribute, alongside
121
+ or as an addendum to the NOTICE text from the Work, provided
122
+ that such additional attribution notices cannot be construed
123
+ as modifying the License.
124
+
125
+ You may add Your own copyright statement to Your modifications and
126
+ may provide additional or different license terms and conditions
127
+ for use, reproduction, or distribution of Your modifications, or
128
+ for any such Derivative Works as a whole, provided Your use,
129
+ reproduction, and distribution of the Work otherwise complies with
130
+ the conditions stated in this License.
131
+
132
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
133
+ any Contribution intentionally submitted for inclusion in the Work
134
+ by You to the Licensor shall be under the terms and conditions of
135
+ this License, without any additional terms or conditions.
136
+ Notwithstanding the above, nothing herein shall supersede or modify
137
+ the terms of any separate license agreement you may have executed
138
+ with Licensor regarding such Contributions.
139
+
140
+ 6. Trademarks. This License does not grant permission to use the trade
141
+ names, trademarks, service marks, or product names of the Licensor,
142
+ except as required for reasonable and customary use in describing the
143
+ origin of the Work and reproducing the content of the NOTICE file.
144
+
145
+ 7. Disclaimer of Warranty. Unless required by applicable law or
146
+ agreed to in writing, Licensor provides the Work (and each
147
+ Contributor provides its Contributions) on an "AS IS" BASIS,
148
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
149
+ implied, including, without limitation, any warranties or conditions
150
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
151
+ PARTICULAR PURPOSE. You are solely responsible for determining the
152
+ appropriateness of using or redistributing the Work and assume any
153
+ risks associated with Your exercise of permissions under this License.
154
+
155
+ 8. Limitation of Liability. In no event and under no legal theory,
156
+ whether in tort (including negligence), contract, or otherwise,
157
+ unless required by applicable law (such as deliberate and grossly
158
+ negligent acts) or agreed to in writing, shall any Contributor be
159
+ liable to You for damages, including any direct, indirect, special,
160
+ incidental, or consequential damages of any character arising as a
161
+ result of this License or out of the use or inability to use the
162
+ Work (including but not limited to damages for loss of goodwill,
163
+ work stoppage, computer failure or malfunction, or any and all
164
+ other commercial damages or losses), even if such Contributor
165
+ has been advised of the possibility of such damages.
166
+
167
+ 9. Accepting Warranty or Additional Liability. While redistributing
168
+ the Work or Derivative Works thereof, You may choose to offer,
169
+ and charge a fee for, acceptance of support, warranty, indemnity,
170
+ or other liability obligations and/or rights consistent with this
171
+ License. However, in accepting such obligations, You may act only
172
+ on Your own behalf and on Your sole responsibility, not on behalf
173
+ of any other Contributor, and only if You agree to indemnify,
174
+ defend, and hold each Contributor harmless for any liability
175
+ incurred by, or claims asserted against, such Contributor by reason
176
+ of your accepting any such warranty or additional liability.
177
+
178
+ END OF TERMS AND CONDITIONS
179
+
180
+ APPENDIX: How to apply the Apache License to your work.
181
+
182
+ To apply the Apache License to your work, attach the following
183
+ boilerplate notice, with the fields enclosed by brackets "[]"
184
+ replaced with your own identifying information. (Don't include
185
+ the brackets!) The text should be enclosed in the appropriate
186
+ comment syntax for the file format. We also recommend that a
187
+ file or class name and description of purpose be included on the
188
+ same "printed page" as the copyright notice for easier
189
+ identification within third-party archives.
190
+
191
+ Copyright [yyyy] [name of copyright owner]
192
+
193
+ Licensed under the Apache License, Version 2.0 (the "License");
194
+ you may not use this file except in compliance with the License.
195
+ You may obtain a copy of the License at
196
+
197
+ http://www.apache.org/licenses/LICENSE-2.0
198
+
199
+ Unless required by applicable law or agreed to in writing, software
200
+ distributed under the License is distributed on an "AS IS" BASIS,
201
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
202
+ See the License for the specific language governing permissions and
203
+ limitations under the License.
204
+
205
+ .
@@ -0,0 +1,55 @@
1
+ = RagTag
2
+
3
+ Copyright (c)2005 Thomas Sawyer (Apache 2.0 License)
4
+
5
+ * home: http://rubyworks.github.com/ragtag
6
+ * code: http://github.com/rubyworks/ragtag
7
+
8
+
9
+ == OVERVIEW
10
+
11
+ RagTag is a Ruby-based template attribute lanaguage (TAL).
12
+ Yea, it's an acronym. Don't blame me, blame those Zope people ;)
13
+
14
+ RagTag is only loosely based on the Zope TAL sepcification. It's first priority
15
+ has been to provide a good attribute based template system for _Ruby_.
16
+
17
+
18
+ == USAGE
19
+
20
+ For the moment please see the Wiki[http://wiki.github.com/rubyworks/ragtag/].
21
+
22
+
23
+ == HOW TO INSTALL
24
+
25
+ Yea you know the procedure:
26
+
27
+ $ gem install ragtag
28
+
29
+
30
+ == DEVELOPMENT
31
+
32
+ We use GitHub[http://github.com/rubyworks/ragtag] to host the project.
33
+
34
+ We use Syckle[http://github.com/proutils/syckle] to manage the build.
35
+
36
+
37
+ == COPYRIGHT
38
+
39
+ (Apache 2.0 License)
40
+
41
+ Copyright (c) 2005 Thomas Sawyer
42
+
43
+ Licensed under the Apache License, Version 2.0 (the "License");
44
+ you may not use this file except in compliance with the License.
45
+ You may obtain a copy of the License at
46
+
47
+ http://www.apache.org/licenses/LICENSE-2.0
48
+
49
+ Unless required by applicable law or agreed to in writing, software
50
+ distributed under the License is distributed on an "AS IS" BASIS,
51
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
52
+ See the License for the specific language governing permissions and
53
+ limitations under the License.
54
+
55
+ See the included `LICENSE.txt` file for details.
@@ -0,0 +1,50 @@
1
+ require 'ragtag'
2
+
3
+ template = %q{
4
+ <html>
5
+ <body>
6
+ <div attr="class: customer_class">
7
+ <h1 content="customer.name">John Doe</h1>
8
+
9
+ <p>The customer is <span replace="customer.age" /> year old.</p>
10
+
11
+ <ul each="customer.tags" do="tag">
12
+ <li content="tag">Tag</li>
13
+ </ul>
14
+
15
+ <ul each="customer.tags" do="tag">
16
+ <li each="tag.split(//)" do="x">
17
+ <b content="x" />
18
+ </li>
19
+ </ul>
20
+
21
+ <b class="notice" if="customer.age > 60">
22
+ The customer is a senior citizen.
23
+ </b>
24
+
25
+ <div class="notice" if="customer.age > 60" omit="true">
26
+ The customer is a senior citizen.
27
+ </div>
28
+ </div>
29
+ </body>
30
+ </html>
31
+ }
32
+
33
+ require 'ostruct'
34
+
35
+ customer = OpenStruct.new
36
+ customer.name = "John Roberts"
37
+ customer.address = "555 Hobart St"
38
+ customer.city = "Palm Bay"
39
+ customer.state = "FL"
40
+ customer.zip = "32709"
41
+ customer.age = 65
42
+ customer.tags = [ 'ruby', 'javascript' ]
43
+
44
+ customer_class = customer.age > 60 ? 'senior' : 'normal'
45
+
46
+
47
+ xml = RagTag.compile(template, binding)
48
+
49
+ puts xml
50
+
@@ -0,0 +1,264 @@
1
+ require 'nokogiri'
2
+ require 'ragtag/meta/data'
3
+ require 'ragtag/core_ext/opvars'
4
+
5
+ # = RAGTAG - A Tag Attribute Language for Ruby
6
+ #
7
+ # RubyTals is a Ruby variation on Zope Page Templates and it's TAL specification.
8
+ # It differs from TAL in that it is specifically geared for use by Ruby.
9
+ #
10
+ # == Usage
11
+ #
12
+ # s = %q{
13
+ # <html>
14
+ # <body>
15
+ # <h1 r:content="x">[X]</h1>
16
+ # <div r:each="animal" r:do="a">
17
+ # <b r:content="a">[ANIMAL]</b>
18
+ # </div>
19
+ # <div r:if="animal.size > 1">
20
+ # There are <b r:content="animal.size">[ANIMAL SIZE]</b> animals.
21
+ # </div>
22
+ # </body>
23
+ # </html>
24
+ # }
25
+ #
26
+ # x = 'Our Little Zoo'
27
+ # animal = ['Zebra', 'Monkey', 'Tiger' ]
28
+ #
29
+ # puts Ragtag.compile(s, binding)
30
+ #
31
+ # == Note
32
+ #
33
+ # Presently RagTag clauses can run arbitraty Ruby code. Although
34
+ # upping the safety level before executing a compiled template
35
+ # should be sufficiently protective in most cases, perhaps it would
36
+ # be better to limit valid expressions to single object references,
37
+ # ie. 'this.that', and then use a substitution of '.' for '/'.
38
+ # Not only would this be highly protective, it would also be more
39
+ # compatible with the original TAL spec; albeit this isn't exacty
40
+ # how TALs interprets the '/' divider.
41
+ #
42
+ # On the other hand perhaps it is too much restraint. For instance
43
+ # it would require the if-clause in the above exmaple to be
44
+ # something like:
45
+ #
46
+ # <div r:if="animal/plenty">
47
+ #
48
+ # and have a definition in the evaluating code:
49
+ #
50
+ # def animal.plenty
51
+ # size > 1
52
+ # end
53
+ #
54
+ # It's a classic Saftey vs. Usability trade-off. Something to
55
+ # consider for the future.
56
+
57
+ class RagTag
58
+
59
+ #
60
+ attr :xml
61
+
62
+ #
63
+ attr :scope
64
+
65
+ #
66
+ def self.compile(xml, scope=nil)
67
+ new(xml).compile(scope)
68
+ end
69
+
70
+ #def self.execute( script, data )
71
+ # vars.each_pair { |k,v|
72
+ # }
73
+ # eval script
74
+ #end
75
+
76
+ #
77
+ def initialize(xml)
78
+ case xml
79
+ when String
80
+ @xml = Nokogiri::XML(xml)
81
+ else
82
+ @xml = xml
83
+ end
84
+ end
85
+
86
+ #
87
+ def compile(scope=nil)
88
+ scope = scope || $TOPLEVEL_BINDING
89
+ parse(@xml.root, scope)
90
+ xml
91
+ end
92
+
93
+ #def parse_all(node)
94
+ # while node
95
+ # parse(node)
96
+ # node = node.next
97
+ # end
98
+ #end
99
+
100
+ #$rtals_each_stack = []
101
+
102
+ #
103
+ def parse(node, scope)
104
+ case node
105
+ when Nokogiri::XML::Text
106
+ # nothing
107
+ when Nokogiri::XML::NodeSet
108
+ parse_nodeset(node, scope)
109
+ when Nokogiri::XML::Element
110
+ if value = node['define']
111
+ eval(value, scope)
112
+ end
113
+
114
+ if node['if']
115
+ parse_if(node, scope)
116
+ #elsif node['condition']
117
+ # parse_condition(node, scope)
118
+ end
119
+
120
+ if node['content']
121
+ parse_content(node, scope)
122
+ elsif node['replace']
123
+ parse_replace(node, scope)
124
+ end
125
+
126
+ if node['attr'] || node['attributes']
127
+ parse_attributes(node, scope)
128
+ end
129
+
130
+ if node['each']
131
+ parse_each(node, scope)
132
+ return
133
+ elsif node['repeat']
134
+ parse_repeat(node, scope)
135
+ return
136
+ end
137
+
138
+ node.children.each do |child|
139
+ parse(child, scope)
140
+ end
141
+
142
+ if node['omit'] && node['omit'] != 'false'
143
+ parse_omit(node, scope)
144
+ end
145
+ else
146
+ raise node.inspect
147
+ end
148
+ return node
149
+ end
150
+
151
+ #
152
+ def parse_nodeset(nodeset, scope)
153
+ nodeset.each do |node|
154
+ parse(node, scope)
155
+ end
156
+ nodeset
157
+ end
158
+
159
+ #
160
+ def parse_content(node, scope)
161
+ value = node['content']
162
+ node.content = eval(value, scope)
163
+ node.remove_attribute('content')
164
+ end
165
+
166
+ #
167
+ def parse_replace(node, scope)
168
+ value = node['replace']
169
+ node.before(eval(value, scope).to_s)
170
+ node.unlink
171
+ end
172
+
173
+ #
174
+ def parse_attributes(node, scope)
175
+ if attrs = node['attr']
176
+ assoc = attrs.split(',').map{ |e| e.strip.split(':') }
177
+ assoc.each do |(k,v)|
178
+ node[k] = eval(v, scope).to_s
179
+ end
180
+ node.remove_attribute('attr')
181
+ end
182
+ if attrs = node['attributes']
183
+ assoc = attrs.split(',').map{ |e| e.strip.split(':') }
184
+ assoc.each do |(k,v)|
185
+ node[k] = eval(v, scope).to_s
186
+ end
187
+ node.remove_attribute('attributes')
188
+ end
189
+ node
190
+ end
191
+
192
+ #
193
+ def parse_if(node, scope)
194
+ value = node['if']
195
+ if eval(value, scope)
196
+ node.remove_attribute('if')
197
+ parse(node.children, scope)
198
+ else
199
+ node.unlink
200
+ end
201
+ node
202
+ end
203
+
204
+ ## Like #parse_if but does not keep the conditional node.
205
+ #def parse_condition(node, scope)
206
+ # value = node['condition']
207
+ # if eval(value, scope)
208
+ # parse(node.children, scope).each do |x|
209
+ # x.unlink
210
+ # node.add_previous_sibling(x)
211
+ # end
212
+ # node.unlink
213
+ # else
214
+ # node.unlink
215
+ # end
216
+ #end
217
+
218
+ #
219
+ def parse_each(node, scope)
220
+ value = node['each']
221
+ args = node['do'] || 'x'
222
+ copy = node.dup
223
+ node.children.remove
224
+ bindings = eval("#{value}.map{ |#{args}| binding }", scope)
225
+ bindings.each do |each_scope|
226
+ sect = parse(copy.dup.children, each_scope)
227
+ sect.each do |x|
228
+ node << x
229
+ end
230
+ end
231
+ node.remove_attribute('each')
232
+ node.remove_attribute('do')
233
+ value
234
+ end
235
+
236
+ #
237
+ def parse_repeat(node, scope)
238
+ value = node['repeat']
239
+ args = node['do'] || 'x'
240
+ copy = node.dup
241
+ copy.remove_attribute('repeat')
242
+ copy.remove_attribute('do')
243
+ bindings = eval("#{value}.map{ |#{args}| binding }", scope)
244
+ bindings.each do |each_scope|
245
+ sect = parse(copy.dup, each_scope)
246
+ node.add_previous_sibling(sect)
247
+ # parse_omit(sect, scope) if sect['omit'] && sect['omit'] != 'false'
248
+ end
249
+ node.unlink
250
+ value
251
+ end
252
+
253
+ #
254
+ def parse_omit(node, scope)
255
+ #parse(node.children, scope).each do |x|
256
+ node.children.each do |x|
257
+ x.unlink
258
+ node.add_previous_sibling(x)
259
+ end
260
+ node.unlink
261
+ end
262
+
263
+ end
264
+
@@ -0,0 +1,24 @@
1
+ require 'facets/binding/eval'
2
+
3
+ class Binding
4
+
5
+ # Returns the value of some variable.
6
+ #
7
+ # a = 2
8
+ # binding["a"] #=> 2
9
+ #
10
+ def []( x )
11
+ eval( x.to_s )
12
+ end
13
+
14
+ # Set the value of a local variable.
15
+ #
16
+ # binding["a"] = 4
17
+ # a #=> 4
18
+ #
19
+ def []=( l, v )
20
+ eval( "lambda {|v| #{l} = v}").call( v )
21
+ end
22
+
23
+ end
24
+
@@ -0,0 +1,27 @@
1
+ class RagTag
2
+
3
+ DIRECTORY = File.dirname(__FILE__)
4
+
5
+ def self.package
6
+ @package ||= (
7
+ require 'yaml'
8
+ YAML.load(File.new(DIRECTORY + '/package'))
9
+ )
10
+ end
11
+
12
+ def self.profile
13
+ @profile ||= (
14
+ require 'yaml'
15
+ YAML.load(File.new(DIRECTORY + '/profile'))
16
+ )
17
+ end
18
+
19
+ def self.const_missing(name)
20
+ key = name.to_s.downcase
21
+ package[key] || profile[key] || super(name)
22
+ end
23
+
24
+ end
25
+
26
+ # becuase Ruby 1.8~ gets in the way
27
+ Object.__send__(:remove_const, :VERSION) if Object.const_defined?(:VERSION)
@@ -0,0 +1,8 @@
1
+ name : ragtag
2
+ date : 2010-10-25
3
+ version : 0.6.0
4
+
5
+ requires:
6
+ - syckle (test)
7
+ - qed (test)
8
+
@@ -0,0 +1,25 @@
1
+ ---
2
+ title : RagTag
3
+ suite : rubyworks
4
+ summary: A Ruby Template Attribute Language
5
+ contact: Trans <transfire@gmail.com>
6
+ license: Apache 2.0
7
+ created: 2005-11-26
8
+
9
+ authors:
10
+ - Thomas Sawyer
11
+
12
+ description:
13
+ RagTag is a Ruby variation loosely based on Zope Page Templates and it's TAL
14
+ specification. It differs from ZPT in that it is specifically geared for use
15
+ by Ruby.
16
+
17
+ resources:
18
+ home: http://rubyworks.github.com/ragtag
19
+ code: http://github.com/rubyworks/ragtag
20
+ mail: http://groups.google.com/rubyworks-mailinglist
21
+ repo: git://github.com/rubyworks/ragtag.git
22
+
23
+ copyright:
24
+ Copyright (c) 2005 Thomas Sawyer
25
+
@@ -0,0 +1,27 @@
1
+ class RagTag
2
+
3
+ DIRECTORY = File.dirname(__FILE__)
4
+
5
+ def self.package
6
+ @package ||= (
7
+ require 'yaml'
8
+ YAML.load(File.new(DIRECTORY + '/package'))
9
+ )
10
+ end
11
+
12
+ def self.profile
13
+ @profile ||= (
14
+ require 'yaml'
15
+ YAML.load(File.new(DIRECTORY + '/profile'))
16
+ )
17
+ end
18
+
19
+ def self.const_missing(name)
20
+ key = name.to_s.downcase
21
+ package[key] || profile[key] || super(name)
22
+ end
23
+
24
+ end
25
+
26
+ # becuase Ruby 1.8~ gets in the way
27
+ Object.__send__(:remove_const, :VERSION) if Object.const_defined?(:VERSION)
@@ -0,0 +1,8 @@
1
+ name : ragtag
2
+ date : 2010-10-25
3
+ version : 0.6.0
4
+
5
+ requires:
6
+ - syckle (test)
7
+ - qed (test)
8
+
@@ -0,0 +1,25 @@
1
+ ---
2
+ title : RagTag
3
+ suite : rubyworks
4
+ summary: A Ruby Template Attribute Language
5
+ contact: Trans <transfire@gmail.com>
6
+ license: Apache 2.0
7
+ created: 2005-11-26
8
+
9
+ authors:
10
+ - Thomas Sawyer
11
+
12
+ description:
13
+ RagTag is a Ruby variation loosely based on Zope Page Templates and it's TAL
14
+ specification. It differs from ZPT in that it is specifically geared for use
15
+ by Ruby.
16
+
17
+ resources:
18
+ home: http://rubyworks.github.com/ragtag
19
+ code: http://github.com/rubyworks/ragtag
20
+ mail: http://groups.google.com/rubyworks-mailinglist
21
+ repo: git://github.com/rubyworks/ragtag.git
22
+
23
+ copyright:
24
+ Copyright (c) 2005 Thomas Sawyer
25
+
@@ -0,0 +1,14 @@
1
+ When /Given a template/ do |text|
2
+ @template = text
3
+ end
4
+
5
+ When /given a local binding/ do |code|
6
+ @code = code
7
+ end
8
+
9
+ When /The result will be/ do |text|
10
+ eval(@code, binding)
11
+ result = RagTag.compile(@template, binding).to_xhtml
12
+ text.assert.strip == result.strip
13
+ end
14
+
@@ -0,0 +1,102 @@
1
+ = Require RagTag
2
+
3
+ To demonstrate the RagTag syntax we first need to load the library.
4
+
5
+ require 'ragtag'
6
+
7
+
8
+ == Content Rendering
9
+
10
+ Tag content can be rendered using the `content` attribute.
11
+
12
+ Given a template:
13
+
14
+ <h1 content="name">John Doe</h1>
15
+
16
+ And given a local binding:
17
+
18
+ name = 'Bill Hickcock'
19
+
20
+ Then result will be:
21
+
22
+ <h1>Bill Hickcock</h1>
23
+
24
+
25
+ == Replacement
26
+
27
+ A tag can be fully replaced by a rendering using the `replace`
28
+ attribute.
29
+
30
+ Given a template:
31
+
32
+ <p>The customer is <span replace="age" /> years old.</p>
33
+
34
+ And given a local binding:
35
+
36
+ age = 40
37
+
38
+ The result will be:
39
+
40
+ <p>The customer is 40 years old.</p>
41
+
42
+
43
+ == Atrtibute Rendering
44
+
45
+ To render variable attributes use the `attr` attribute.
46
+
47
+ Given a template:
48
+
49
+ <div attr="class: sample" />
50
+
51
+ And given a local binding:
52
+
53
+ sample = 'impressive'
54
+
55
+ The result will be:
56
+
57
+ <div attr="impressive" />
58
+
59
+
60
+ == Conditions
61
+
62
+ Conditional sections can be created using the `if` attribute.
63
+
64
+ Given a template:
65
+
66
+ <b if="age >= 60">
67
+ The customer is a senior citizen.
68
+ </b>
69
+
70
+ And given a local binding:
71
+
72
+ age = 60
73
+
74
+ The result will be:
75
+
76
+ <b>
77
+ The customer is a senior citizen.
78
+ </b>
79
+
80
+
81
+ == Iteration
82
+
83
+ Iterations can be acheived via the `each` attribute.
84
+
85
+ Given a template:
86
+
87
+ <ul each="tags" do="tag">
88
+ <li content="tag">Tag</li>
89
+ </ul>
90
+
91
+ And given a local binding:
92
+
93
+ tags = ['ruby', 'perl', 'lua']
94
+
95
+ The result will be:
96
+
97
+ <ul>
98
+ <li>ruby</li>
99
+ <li>perl</li>
100
+ <li>lua</li>
101
+ </ul>
102
+
metadata ADDED
@@ -0,0 +1,110 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ragtag
3
+ version: !ruby/object:Gem::Version
4
+ hash: 7
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 6
9
+ - 0
10
+ version: 0.6.0
11
+ platform: ruby
12
+ authors:
13
+ - Thomas Sawyer
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-10-25 00:00:00 -04:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: syckle
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ version: "0"
33
+ type: :development
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: qed
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ hash: 3
44
+ segments:
45
+ - 0
46
+ version: "0"
47
+ type: :development
48
+ version_requirements: *id002
49
+ description: RagTag is a Ruby variation loosely based on Zope Page Templates and it's TAL specification. It differs from ZPT in that it is specifically geared for use by Ruby.
50
+ email: transfire@gmail.com
51
+ executables: []
52
+
53
+ extensions: []
54
+
55
+ extra_rdoc_files:
56
+ - README.rdoc
57
+ files:
58
+ - eg/example.rb
59
+ - lib/ragtag/core_ext/opvars.rb
60
+ - lib/ragtag/meta/data.rb
61
+ - lib/ragtag/meta/package
62
+ - lib/ragtag/meta/profile
63
+ - lib/ragtag.rb
64
+ - meta/data.rb
65
+ - meta/package
66
+ - meta/profile
67
+ - qed/applique/examples.rb
68
+ - qed/syntax.rdoc
69
+ - HISTORY.rdoc
70
+ - LICENSE.txt
71
+ - README.rdoc
72
+ has_rdoc: true
73
+ homepage: http://rubyworks.github.com/ragtag
74
+ licenses:
75
+ - Apache 2.0
76
+ post_install_message:
77
+ rdoc_options:
78
+ - --title
79
+ - RagTag API
80
+ - --main
81
+ - README.rdoc
82
+ require_paths:
83
+ - lib
84
+ required_ruby_version: !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ hash: 3
90
+ segments:
91
+ - 0
92
+ version: "0"
93
+ required_rubygems_version: !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ hash: 3
99
+ segments:
100
+ - 0
101
+ version: "0"
102
+ requirements: []
103
+
104
+ rubyforge_project: ragtag
105
+ rubygems_version: 1.3.7
106
+ signing_key:
107
+ specification_version: 3
108
+ summary: A Ruby Template Attribute Language
109
+ test_files: []
110
+