zafu 0.6.3 → 0.7.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.
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