zafu 0.8.5 → 0.8.6

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.
@@ -1,8 +1,9 @@
1
- == 0.8.5
1
+ == 0.8.5 2012-05-01
2
2
 
3
3
  * Enhancements
4
4
  * Fixed add/edit problem in lists.
5
5
  * Added support for RubyLess access to alt_class.
6
+ * Fixed a bug where [block] would alter the current template url.
6
7
 
7
8
  == 0.8.4 2011-11-09
8
9
 
@@ -1,4 +1,4 @@
1
1
  module Zafu
2
- VERSION = '0.8.5'
2
+ VERSION = '0.8.6'
3
3
  end
4
4
 
@@ -112,6 +112,11 @@ module Zafu
112
112
  @dom_prefix || (@up ? @up.dom_prefix : nil)
113
113
  end
114
114
 
115
+ # Return dom_prefix without looking up.
116
+ def raw_dom_prefix
117
+ @dom_prefix
118
+ end
119
+
115
120
  # Mark the current context as being a looping element (each) whose DOM id needs to be propagated to sub-nodes
116
121
  # in order to ensure uniqueness of the dom_id (loops in loops problem).
117
122
  def propagate_dom_scope!
@@ -36,8 +36,6 @@ module Zafu
36
36
  end
37
37
 
38
38
  if need_ajax?(each_block)
39
- node.dom_prefix = dom_name
40
-
41
39
  # 1. Render inline
42
40
  # assign [] to var
43
41
  out "<% if (#{var} = #{finder[:method]}) || (#{node}.#{finder[:class].first <= Comment ? "can_comment?" : "can_write?"} && #{var}=[]) %>"
@@ -48,7 +46,9 @@ module Zafu
48
46
  # Pagination count and other contextual variables exist here.
49
47
 
50
48
  tmplt_node = self.node.move_to(var, finder[:class])
51
- tmplt_node.dom_prefix = node.dom_prefix
49
+ # Own scope
50
+ node.dom_prefix = dom_name
51
+ tmplt_node.dom_prefix = dom_name
52
52
 
53
53
  # INLINE ==========
54
54
  out wrap(
@@ -133,42 +133,60 @@ module Zafu
133
133
  return expand_with
134
134
  end
135
135
 
136
- # Since we are using ajax, we will need this object to have an ID set.
137
- node.dom_prefix = dom_name
138
-
139
136
  @markup.done = false
140
137
 
141
138
  if @context[:block] == self
142
- # Storing template (called from within store_block)
143
- # Set id with the template's node context (<%= @node.zip %>).
139
+ # Storing our block template
140
+ #node.dom_prefix = dom_name
144
141
  @markup.set_id(node.dom_id(:list => false))
145
142
  expand_with
143
+ elsif @context[:saved_template]
144
+ # already in a parent's store operation. Reset scope and simply render inline elements
145
+ # reset scope
146
+ with_context(:node => node.dup, :saved_template => nil) do
147
+ node.saved_dom_id = nil
148
+ node.dom_prefix = dom_name
149
+ @markup.set_id(node.dom_id(:list => false))
150
+ expand_with
151
+ end
146
152
  else
147
- # 1. store template
148
- # will wrap with @markup
149
- store_block(self, :ajax_action => 'show')
150
-
151
- if edit_block = descendant('edit')
152
- form_block = descendant('form') || self
153
-
154
- publish_after_save = form_block.params[:publish] ||
155
- (edit_block && edit_block.params[:publish])
156
-
157
- # 2. store form
158
- cont = {
159
- :saved_template => form_url(node.dom_prefix),
160
- :make_form => self == form_block,
161
- :publish_after_save => publish_after_save,
162
- :ajax_action => 'edit',
163
- }
153
+ # Since we are using ajax, we will need this object to have an ID set and
154
+ # have its own template_url and such.
155
+ with_context(:node => node.dup, :saved_template => nil) do
156
+ # reset scope. We only keep current id when we are called from
157
+ # r_drop.
158
+ @markup = @markup.dup
159
+ @markup.set_id(nil)
160
+ node.saved_dom_id = nil
161
+ # our own domain
162
+ node.dom_prefix = dom_name
163
+
164
+ # 1. inline
165
+ # Set id with the current node context (<%= var1.zip %>).
166
+ @markup.set_id(node.dom_id(:list => false))
167
+
168
+ out expand_with
169
+ # 2. store template
170
+ # will wrap with @markup
171
+ store_block(self, :ajax_action => 'show')
172
+
173
+ if edit_block = descendant('edit')
174
+ form_block = descendant('form') || self
175
+
176
+ publish_after_save = form_block.params[:publish] ||
177
+ (edit_block && edit_block.params[:publish])
178
+
179
+ # 3. store form
180
+ cont = {
181
+ :saved_template => form_url(node.dom_prefix),
182
+ :make_form => self == form_block,
183
+ :publish_after_save => publish_after_save,
184
+ :ajax_action => 'edit',
185
+ }
164
186
 
165
- store_block(form_block, cont)
187
+ store_block(form_block, cont)
188
+ end
166
189
  end
167
-
168
- # 3. render
169
- # Set id with the current node context (<%= var1.zip %>).
170
- @markup.set_id(node.dom_id(:list => false))
171
- out expand_with
172
190
  end
173
191
  end
174
192
 
@@ -304,14 +322,14 @@ module Zafu
304
322
  def r_add_btn
305
323
  default = node.will_be?(Comment) ? _("btn_add_comment") : _("btn_add")
306
324
 
307
- out "<a href='#' onclick='#{@context[:onclick]}'>#{text_for_link(default)}</a>"
325
+ out "<a href='javascript:void(0)' onclick='#{@context[:onclick]}'>#{text_for_link(default)}</a>"
308
326
  end
309
327
 
310
328
  def r_each
311
329
  if @context[:saved_template]
312
330
  # render to start a saved template
313
331
  node.saved_dom_id = "\#{ndom_id(#{node})}"
314
- node.dom_prefix ||= dom_name
332
+ node.dom_prefix = dom_name unless node.raw_dom_prefix
315
333
  node.propagate_dom_scope!
316
334
  @markup.set_id(node.dom_id)
317
335
 
@@ -39,6 +39,7 @@ module Zafu
39
39
  out "<% #{node}.each do |#{var}| %>"
40
40
  end
41
41
 
42
+ raw_dom_prefix = node.raw_dom_prefix
42
43
 
43
44
  with_context(:node => node.move_to(var, node.klass.first, :query => node.opts[:query])) do
44
45
  # We pass the :query option for RubyLess resolution by using the QueryBuilder finder
@@ -48,7 +49,8 @@ module Zafu
48
49
  if node.list_context?
49
50
  # we are still in a list (example: previous context was [[Node]], current is [Node])
50
51
  else
51
- node.dom_prefix ||= dom_name
52
+ # Change dom_prefix if it isn't our own (inherited).
53
+ node.dom_prefix = dom_name unless raw_dom_prefix
52
54
  node.propagate_dom_scope!
53
55
 
54
56
  if need_dom_id?
@@ -165,9 +167,9 @@ module Zafu
165
167
  # Change context for a given scope.
166
168
  def with_context(cont, merge = true)
167
169
  raise "Block missing" unless block_given?
168
- cont_bak = @context.dup
170
+ cont_bak = @context
169
171
  if merge
170
- @context.merge!(cont)
172
+ @context = @context.merge(cont)
171
173
  else
172
174
  @context = cont
173
175
  end
@@ -19,7 +19,7 @@ module Zafu
19
19
 
20
20
  if descendant('form_tag')
21
21
  # We have a specific place to insert our form
22
- out expand_with(:form_options => options, :form => self)
22
+ out expand_with(:form_options => options, :form => self, :form_prefix => dom_name)
23
23
  else
24
24
  r_form_tag(options)
25
25
  end
@@ -31,7 +31,7 @@ module Zafu
31
31
  form_error_messages(opts[:form_helper])
32
32
 
33
33
  # Render form elements
34
- out expand_with(opts)
34
+ out expand_with(opts.merge(:form_prefix => dom_name))
35
35
 
36
36
  # Render hidden fields (these must go after normal elements so that focusFirstElement works)
37
37
  hidden_fields = form_hidden_fields(options)
@@ -174,15 +174,16 @@ module Zafu
174
174
  elsif node && !node.list_context? && type = safe_method_from(node.klass, signature, node)
175
175
  # not a list_contex
176
176
  # Resolve node context methods: xxx.foo, xxx.bar
177
+ # All direct methods from nodes should be html escaped:
177
178
  type = type[:class].call(self, node.klass, signature) if type[:class].kind_of?(Proc)
178
- type.merge(:receiver => RubyLess::TypedString.new(node.name, :class => node.klass))
179
+ type.merge(:receiver => RubyLess::TypedString.new(node.name, :class => node.klass, :h => true))
179
180
  elsif node && node.list_context? && type = safe_method_from(Array, signature, node)
180
181
  # FIXME: why do we need this here ? Remove with related code in zafu_safe_definitions ?
181
182
  type = type[:class].call(self, node.klass, signature) if type[:class].kind_of?(Proc)
182
183
  type.merge(:receiver => RubyLess::TypedString.new(node.name, :class => Array, :elem => node.klass.first))
183
184
  elsif node && node.list_context? && type = safe_method_from(node.klass.first, signature, node)
184
185
  type = type[:class].call(self, node.klass, signature) if type[:class].kind_of?(Proc)
185
- type.merge(:receiver => RubyLess::TypedString.new("#{node.name}.first", :class => node.klass.first))
186
+ type.merge(:receiver => RubyLess::TypedString.new("#{node.name}.first", :class => node.klass.first, :h => true))
186
187
  elsif @rendering_block_owner && @blocks.first.kind_of?(String) && !added_options
187
188
  # Insert the block content into the method: <r:trans>blah</r:trans> becomes trans("blah")
188
189
  signature_with_block = signature.dup
@@ -240,6 +241,9 @@ module Zafu
240
241
  if res.klass == String && !@blocks.detect {|b| !b.kind_of?(String)}
241
242
  if lit = res.literal
242
243
  out erb_escape(lit)
244
+ # TODO: Enable this when we have time to ensure tests/functionality work correctly.
245
+ #elsif res.opts[:h]
246
+ # show_string(res)
243
247
  else
244
248
  out "<%= #{res} %>"
245
249
  end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{zafu}
8
- s.version = "0.8.5"
8
+ s.version = "0.8.6"
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{2011-11-30}
12
+ s.date = %q{2012-05-01}
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 = [
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zafu
3
3
  version: !ruby/object:Gem::Version
4
- hash: 53
4
+ hash: 51
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 8
9
- - 5
10
- version: 0.8.5
9
+ - 6
10
+ version: 0.8.6
11
11
  platform: ruby
12
12
  authors:
13
13
  - Gaspard Bucher
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-11-30 00:00:00 +01:00
18
+ date: 2012-05-01 00:00:00 +02:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency