zafu 0.6.3 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,11 @@
1
+ == 0.7.0 2010-09-14
2
+
3
+ * Major enhancements
4
+ * Using latest API from RubyLess and better NodeContext parameter transparency.
5
+ * Added get_type_from_query_select to resolve RubyLess with QueryBuilder select.
6
+ * Added 'opts' attribute to pass information in the compiler.
7
+ * Removed bad '#{foo}' resolution to r_show (this is syntactically wrong Ruby). Using a fallback on r_show instead.
8
+
1
9
  == 0.6.3 2010-08-25
2
10
 
3
11
  * Minor enhancement
data/Rakefile CHANGED
@@ -14,7 +14,7 @@ begin
14
14
  gem.authors = ["Gaspard Bucher"]
15
15
  gem.add_development_dependency "shoulda", ">= 0"
16
16
  gem.add_development_dependency "yamltest", ">= 0.5.0"
17
- gem.add_dependency "rubyless", ">= 0.5.0"
17
+ gem.add_dependency "rubyless", ">= 0.7.0"
18
18
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
19
19
  end
20
20
  Jeweler::GemcutterTasks.new
data/lib/zafu/info.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Zafu
2
- VERSION = '0.6.3'
2
+ VERSION = '0.7.0'
3
3
  end
4
4
 
data/lib/zafu/markup.rb CHANGED
@@ -100,9 +100,9 @@ module Zafu
100
100
  if value =~ /^(.*)\#\{(.*)\}(.*)$/
101
101
  @params.delete(key)
102
102
  if $1 == '' && $3 == ''
103
- append_dyn_param(key, "<%= #{RubyLess.translate($2, helper)} %>")
103
+ append_dyn_param(key, "<%= #{RubyLess.translate(helper, $2)} %>")
104
104
  else
105
- append_dyn_param(key, "<%= #{RubyLess.translate_string(value, helper)} %>")
105
+ append_dyn_param(key, "<%= #{RubyLess.translate_string(helper, value)} %>")
106
106
  end
107
107
  end
108
108
  end
@@ -13,12 +13,16 @@ module Zafu
13
13
  # it has a name or dom id defined ('main', 'related', 'list', etc).
14
14
  attr_writer :dom_prefix
15
15
 
16
- def initialize(name, klass, up = nil)
17
- @name, @klass, @up = name, klass, up
16
+ # Any kind of information that the compiler might need to use (QueryBuilder query used
17
+ # to fetch the node for example).
18
+ attr_reader :opts
19
+
20
+ def initialize(name, klass, up = nil, opts = {})
21
+ @name, @klass, @up, @opts = name, klass, up, opts
18
22
  end
19
23
 
20
- def move_to(name, klass)
21
- NodeContext.new(name, klass, self)
24
+ def move_to(name, klass, opts={})
25
+ NodeContext.new(name, klass, self, opts)
22
26
  end
23
27
 
24
28
  # Since the idiom to write the node context name is the main purpose of this class, it
@@ -11,7 +11,7 @@ module Zafu
11
11
  out "<% #{node}.each_with_index do |#{var},#{var}_index| -%>"
12
12
 
13
13
  if join = @params[:join]
14
- join = RubyLess.translate_string(join, self)
14
+ join = RubyLess.translate_string(self, join)
15
15
  #if join_clause = @params[:join_if]
16
16
  # set_stored(Node, 'prev', "#{var}_prev")
17
17
  # cond = get_test_condition(var, :test=>join_clause)
@@ -22,7 +22,7 @@ module Zafu
22
22
  end
23
23
 
24
24
  if alt_class = @params[:alt_class]
25
- alt_class = RubyLess.translate_string(alt_class, self)
25
+ alt_class = RubyLess.translate_string(self, alt_class)
26
26
  alt_test = @params[:alt_reverse] == 'true' ? "(#{var}_max_index - #{var}_index) % 2 != 0" : "#{var}_index % 2 != 0"
27
27
  @markup.append_dyn_param(:class, "<%= #{alt_test} ? #{alt_class} : '' %>")
28
28
  @markup.tag ||= 'div'
@@ -32,7 +32,9 @@ module Zafu
32
32
  end
33
33
 
34
34
 
35
- with_context(:node => node.move_to(var, node.klass.first)) do
35
+ with_context(:node => node.move_to(var, node.klass.first, :query => node.opts[:query])) do
36
+ # We pass the :query option for RubyLess resolution by using the QueryBuilder finder
37
+
36
38
  # The id set here should be used as prefix for sub-nodes to ensure uniqueness of generated DOM ids
37
39
  if node.list_context?
38
40
  # we are still in a list (example: previous context was [[Node]], current is [Node])
@@ -100,12 +102,12 @@ module Zafu
100
102
  def expand_with_finder(finder)
101
103
  if finder[:nil]
102
104
  open_node_context(finder, :form => nil) do # do not propagate :form
103
- expand_if("#{var} = #{finder[:method]}", node.move_to(var, finder[:class]))
105
+ expand_if("#{var} = #{finder[:method]}", node.move_to(var, finder[:class], finder.merge(:nil => false)))
104
106
  end
105
107
  else
106
108
  res = ''
107
109
  res << "<% #{var} = #{finder[:method]} -%>"
108
- open_node_context(finder, :node => node.move_to(var, finder[:class]), :form => nil) do
110
+ open_node_context(finder, :node => node.move_to(var, finder[:class], finder), :form => nil) do
109
111
  res << wrap(expand_with)
110
112
  end
111
113
  res
@@ -20,7 +20,7 @@ module Zafu
20
20
  # Actual method resolution. The lookup first starts in the current helper. If nothing is found there, it
21
21
  # searches inside a 'helpers' module and finally looks into the current node_context.
22
22
  # If nothing is found at this stage, we prepend the method with the current node and start over again.
23
- def safe_method_type(signature)
23
+ def safe_method_type(signature, receiver = nil)
24
24
  #puts [node.name, node.klass, signature].inspect
25
25
  super || get_method_type(signature, false)
26
26
  end
@@ -32,12 +32,7 @@ module Zafu
32
32
  return rubyless_class_scope(@method)
33
33
  end
34
34
 
35
- if code = @method[/^\#\{(.+)\}$/, 1]
36
- params[:eval] = $1
37
- r_show
38
- else
39
- rubyless_render(@method, params)
40
- end
35
+ rubyless_render(@method, params)
41
36
  rescue RubyLess::NoMethodError => err
42
37
  parser_continue("#{err.error_message} <span class='type'>#{err.method_with_arguments}</span> for #{err.receiver_with_class}")
43
38
  rescue RubyLess::Error => err
@@ -73,15 +68,25 @@ module Zafu
73
68
  def rubyless_render(method, params)
74
69
  # We need to set this here because we cannot pass options to RubyLess or get them back
75
70
  # when we evaluate the method to see if we can use blocks as arguments.
76
- @rendering_block_owner = true
77
- code = method_with_arguments(method, params)
78
- rubyless_expand RubyLess.translate(code, self)
79
- ensure
80
- @rendering_block_owner = false
71
+ begin
72
+ @rendering_block_owner = true
73
+ code = method_with_arguments(method, params)
74
+ rubyless_expand RubyLess.translate(self, code)
75
+ rescue RubyLess::Error => err
76
+ if !@params.empty?
77
+ # try to use r_show without using params as arguments
78
+ params[:eval] = @method
79
+ r_show
80
+ else
81
+ raise err
82
+ end
83
+ ensure
84
+ @rendering_block_owner = false
85
+ end
81
86
  end
82
87
 
83
88
  def set_markup_attr(markup, key, value)
84
- value = value.kind_of?(RubyLess::TypedString) ? value : RubyLess.translate_string(value, self)
89
+ value = value.kind_of?(RubyLess::TypedString) ? value : RubyLess.translate_string(self, value)
85
90
  if value.literal
86
91
  markup.set_param(key, value.literal)
87
92
  else
@@ -90,7 +95,7 @@ module Zafu
90
95
  end
91
96
 
92
97
  def append_markup_attr(markup, key, value)
93
- value = RubyLess.translate_string(value, self)
98
+ value = RubyLess.translate_string(self, value)
94
99
  if value.literal
95
100
  markup.append_param(key, value.literal)
96
101
  else
@@ -110,7 +115,7 @@ module Zafu
110
115
  return parser_continue("Missing attribute/eval parameter")
111
116
  end
112
117
 
113
- RubyLess.translate(code, self)
118
+ RubyLess.translate(self, code)
114
119
  rescue RubyLess::Error => err
115
120
  return parser_continue(err.message, code)
116
121
  end
@@ -122,14 +127,21 @@ module Zafu
122
127
 
123
128
  keys.each do |key|
124
129
  next unless value = @params[key.to_sym]
125
- res << ":#{key} => #{RubyLess.translate_string(value, self)}"
130
+ res << ":#{key} => #{RubyLess.translate_string(self, value)}"
126
131
  end
127
132
 
128
133
  res.empty? ? nil : res
129
134
  end
130
135
 
131
- # block_owner should be set to true when we are resolving <r:xxx>...</r:xxx> or <div do='xxx'>...</div>
136
+ # Method resolution. The first matching method is returned. Order of evaluation is
137
+ # 1. find node_context (@page, @image, self)
138
+ # 2. set var (set_xxx = '...')
139
+ # 3. template helper methods
140
+ # 4. contextual node methods (var1.xxx)
141
+ # 5. contextual first node of list method ([...].first.xxx)
142
+ # 6. append block as argument (restart 1-5 with xxx(block_string))
132
143
  def get_method_type(signature, added_options = false)
144
+ node = self.node
133
145
  raise "#{node.klass.class}" unless node.klass.kind_of?(Array) || node.klass.kind_of?(Class)
134
146
 
135
147
  if type = node_context_from_signature(signature)
@@ -144,10 +156,11 @@ module Zafu
144
156
  elsif helper.respond_to?(:helpers) && type = safe_method_from(helper.helpers, signature)
145
157
  # Resolve by looking at the included helpers
146
158
  type
147
- elsif node && node.klass.kind_of?(Class) && type = safe_method_from(node.klass, signature)
159
+ elsif node && !node.list_context? && type = safe_method_from(node.klass, signature, node)
160
+ # not a list_contex
148
161
  # Resolve node context methods: xxx.foo, xxx.bar
149
162
  type.merge(:method => "#{node.name}.#{type[:method]}")
150
- elsif node && node.klass.kind_of?(Array) && type = safe_method_from(node.klass.first, signature)
163
+ elsif node && node.list_context? && type = safe_method_from(node.klass.first, signature, node)
151
164
  type.merge(:method => "#{node.name}.first.#{type[:method]}")
152
165
  elsif @rendering_block_owner && @blocks.first.kind_of?(String) && !added_options
153
166
  # Insert the block content into the method: <r:trans>blah</r:trans> becomes trans("blah")
@@ -248,11 +261,11 @@ module Zafu
248
261
  if node.list_context?
249
262
  raise RubyLess::Error.new("Cannot use 'this' in list_context.")
250
263
  else
251
- {:class => node.klass, :method => node.name}
264
+ node.opts.merge(:class => node.klass, :method => node.name)
252
265
  end
253
266
  elsif ivar[0..0] == '@' && klass = get_class(ivar[1..-1].capitalize)
254
267
  if node = self.node(klass)
255
- {:class => node.klass, :method => node.name}
268
+ node.opts.merge(:class => node.klass, :method => node.name)
256
269
  else
257
270
  nil
258
271
  end
@@ -271,12 +284,12 @@ module Zafu
271
284
  end
272
285
  end
273
286
 
274
- def safe_method_from(context, signature)
287
+ def safe_method_from(solver, signature, receiver = nil)
275
288
 
276
- if context.respond_to?(:safe_method_type)
277
- context.safe_method_type(signature)
289
+ if solver.respond_to?(:safe_method_type)
290
+ solver.safe_method_type(signature, receiver)
278
291
  else
279
- RubyLess::SafeClass.safe_method_type_for(context, signature)
292
+ RubyLess::SafeClass.safe_method_type_for(solver, signature)
280
293
  end
281
294
  end
282
295
 
data/zafu.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{zafu}
8
- s.version = "0.6.3"
8
+ s.version = "0.7.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Gaspard Bucher"]
12
- s.date = %q{2010-08-25}
12
+ s.date = %q{2010-09-14}
13
13
  s.description = %q{Provides a powerful templating language based on xhtml for rails}
14
14
  s.email = %q{gaspard@teti.ch}
15
15
  s.extra_rdoc_files = [
@@ -90,16 +90,16 @@ Gem::Specification.new do |s|
90
90
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
91
91
  s.add_development_dependency(%q<shoulda>, [">= 0"])
92
92
  s.add_development_dependency(%q<yamltest>, [">= 0.5.0"])
93
- s.add_runtime_dependency(%q<rubyless>, [">= 0.5.0"])
93
+ s.add_runtime_dependency(%q<rubyless>, [">= 0.7.0"])
94
94
  else
95
95
  s.add_dependency(%q<shoulda>, [">= 0"])
96
96
  s.add_dependency(%q<yamltest>, [">= 0.5.0"])
97
- s.add_dependency(%q<rubyless>, [">= 0.5.0"])
97
+ s.add_dependency(%q<rubyless>, [">= 0.7.0"])
98
98
  end
99
99
  else
100
100
  s.add_dependency(%q<shoulda>, [">= 0"])
101
101
  s.add_dependency(%q<yamltest>, [">= 0.5.0"])
102
- s.add_dependency(%q<rubyless>, [">= 0.5.0"])
102
+ s.add_dependency(%q<rubyless>, [">= 0.7.0"])
103
103
  end
104
104
  end
105
105
 
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 6
8
- - 3
9
- version: 0.6.3
7
+ - 7
8
+ - 0
9
+ version: 0.7.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Gaspard Bucher
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-08-25 00:00:00 +02:00
17
+ date: 2010-09-14 00:00:00 +02:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -52,9 +52,9 @@ dependencies:
52
52
  - !ruby/object:Gem::Version
53
53
  segments:
54
54
  - 0
55
- - 5
55
+ - 7
56
56
  - 0
57
- version: 0.5.0
57
+ version: 0.7.0
58
58
  type: :runtime
59
59
  version_requirements: *id003
60
60
  description: Provides a powerful templating language based on xhtml for rails