zena 1.2.1 → 1.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (202) hide show
  1. data/History.txt +38 -1
  2. data/app/controllers/documents_controller.rb +7 -5
  3. data/app/controllers/nodes_controller.rb +47 -6
  4. data/app/controllers/user_sessions_controller.rb +12 -3
  5. data/app/controllers/virtual_classes_controller.rb +8 -2
  6. data/app/models/acl.rb +5 -2
  7. data/app/models/cached_page.rb +5 -5
  8. data/app/models/column.rb +27 -4
  9. data/app/models/group.rb +1 -1
  10. data/app/models/node.rb +106 -24
  11. data/app/models/note.rb +2 -1
  12. data/app/models/relation.rb +9 -4
  13. data/app/models/relation_proxy.rb +2 -2
  14. data/app/models/role.rb +12 -5
  15. data/app/models/site.rb +10 -9
  16. data/app/models/skin.rb +8 -0
  17. data/app/models/string_hash.rb +65 -0
  18. data/app/models/text_document.rb +1 -1
  19. data/app/models/user.rb +2 -0
  20. data/app/models/virtual_class.rb +43 -10
  21. data/app/views/comments/create.rjs +1 -32
  22. data/app/views/comments/edit.rjs +1 -1
  23. data/app/views/comments/update.rjs +1 -1
  24. data/app/views/documents/show.rhtml +1 -1
  25. data/app/views/groups/_form.rhtml +7 -0
  26. data/app/views/groups/_li.rhtml +1 -1
  27. data/app/views/nodes/500.html +2 -1
  28. data/app/views/nodes/destroy.rjs +2 -0
  29. data/app/views/sites/jobs.erb +2 -3
  30. data/app/views/templates/document_create_tabs/_file.rhtml +1 -1
  31. data/app/views/templates/document_create_tabs/_import.rhtml +4 -1
  32. data/app/views/templates/document_create_tabs/_template.rhtml +3 -0
  33. data/app/views/templates/document_create_tabs/_text_document.rhtml +3 -0
  34. data/app/views/versions/custom_tab.rhtml +1 -1
  35. data/app/views/versions/edit.rhtml +1 -1
  36. data/bricks/acls/lib/bricks/acls.rb +3 -3
  37. data/bricks/acls/zena/test/unit/acl_test.rb +15 -0
  38. data/bricks/fs_skin/lib/bricks/fs_skin.rb +190 -0
  39. data/bricks/fs_skin/zena/init.rb +1 -0
  40. data/bricks/fs_skin/zena/migrate/20110702010330_add_fs_skin_to_idx_templates.rb +12 -0
  41. data/bricks/{static → fs_skin}/zena/skins/blog/Image-edit.zafu +0 -0
  42. data/bricks/{static → fs_skin}/zena/skins/blog/Image.zafu +0 -0
  43. data/bricks/{static → fs_skin}/zena/skins/blog/Node-+index.zafu +0 -0
  44. data/bricks/{static → fs_skin}/zena/skins/blog/Node-+notFound.zafu +0 -0
  45. data/bricks/{static → fs_skin}/zena/skins/blog/Node-+search.zafu +0 -0
  46. data/bricks/{static → fs_skin}/zena/skins/blog/Node.zafu +1 -1
  47. data/bricks/{static → fs_skin}/zena/skins/blog/Post.zafu +0 -0
  48. data/bricks/{static → fs_skin}/zena/skins/blog/Project--kml.zafu +0 -0
  49. data/bricks/{static → fs_skin}/zena/skins/blog/Project.zafu +0 -0
  50. data/bricks/{static → fs_skin}/zena/skins/blog/comments.zafu +0 -0
  51. data/bricks/{static → fs_skin}/zena/skins/blog/dict.yml +0 -0
  52. data/bricks/{static → fs_skin}/zena/skins/blog/img/dateBg.jpg +0 -0
  53. data/bricks/{static → fs_skin}/zena/skins/blog/img/header.png +0 -0
  54. data/bricks/{static → fs_skin}/zena/skins/blog/img/mapPin.png +0 -0
  55. data/bricks/{static → fs_skin}/zena/skins/blog/img/menu.gif +0 -0
  56. data/bricks/{static → fs_skin}/zena/skins/blog/img/menuover.gif +0 -0
  57. data/bricks/{static → fs_skin}/zena/skins/blog/img/style.css +0 -0
  58. data/bricks/fs_skin/zena/tasks.rb +26 -0
  59. data/bricks/{static/zena/test/integration/static_integration_test.rb → fs_skin/zena/test/integration/fs_skin_integration_test.rb} +6 -6
  60. data/bricks/fs_skin/zena/test/unit/fs_skin_test.rb +33 -0
  61. data/bricks/grid/lib/bricks/grid.rb +4 -3
  62. data/bricks/tags/lib/bricks/tags.rb +1 -7
  63. data/bricks/zena/zena/migrate/20120605091558_add_ssl_login_to_site.rb +7 -0
  64. data/bricks/zena/zena/migrate/20120630123551_add_auto_publish_to_group.rb +9 -0
  65. data/config/bricks.yml +3 -3
  66. data/config/gems.yml +2 -3
  67. data/lib/tasks/zena.rake +7 -3
  68. data/lib/zafu.rb +7 -0
  69. data/lib/zafu/all.rb +21 -0
  70. data/lib/zafu/compiler.rb +7 -0
  71. data/lib/zafu/controller_methods.rb +58 -0
  72. data/lib/zafu/handler.rb +57 -0
  73. data/lib/zafu/info.rb +4 -0
  74. data/lib/zafu/markup.rb +309 -0
  75. data/lib/zafu/mock_helper.rb +42 -0
  76. data/lib/zafu/node_context.rb +203 -0
  77. data/lib/zafu/ordered_hash.rb +53 -0
  78. data/lib/zafu/parser.rb +676 -0
  79. data/lib/zafu/parsing_rules.rb +382 -0
  80. data/lib/zafu/process/ajax.rb +530 -0
  81. data/lib/zafu/process/conditional.rb +92 -0
  82. data/lib/zafu/process/context.rb +186 -0
  83. data/lib/zafu/process/forms.rb +143 -0
  84. data/lib/zafu/process/html.rb +186 -0
  85. data/lib/zafu/process/ruby_less_processing.rb +321 -0
  86. data/lib/zafu/security.rb +15 -0
  87. data/lib/zafu/template.rb +25 -0
  88. data/lib/zafu/test_helper.rb +19 -0
  89. data/lib/zafu/view_methods.rb +6 -0
  90. data/lib/zena.rb +1 -1
  91. data/lib/zena/acts/enrollable.rb +1 -1
  92. data/lib/zena/app.rb +4 -17
  93. data/lib/zena/console.rb +18 -1
  94. data/lib/zena/core_ext/file_utils.rb +13 -1
  95. data/lib/zena/core_ext/fixnum.rb +4 -0
  96. data/lib/zena/core_ext/float.rb +7 -0
  97. data/lib/zena/deploy.rb +4 -2
  98. data/lib/zena/deploy/app_init.rhtml +2 -1
  99. data/lib/zena/deploy/database.rhtml +1 -1
  100. data/lib/zena/info.rb +1 -1
  101. data/lib/zena/parser/zazen_rules.rb +4 -4
  102. data/lib/zena/routes.rb +1 -1
  103. data/lib/zena/test_controller.rb +1 -1
  104. data/lib/zena/use.rb +14 -1
  105. data/lib/zena/use/action.rb +4 -2
  106. data/lib/zena/use/ajax.rb +86 -38
  107. data/lib/zena/use/authlogic.rb +16 -1
  108. data/lib/zena/use/calendar.rb +37 -17
  109. data/lib/zena/use/conditional.rb +2 -2
  110. data/lib/zena/use/context.rb +30 -9
  111. data/lib/zena/use/dates.rb +39 -3
  112. data/lib/zena/use/display.rb +6 -19
  113. data/lib/zena/use/forms.rb +100 -79
  114. data/lib/zena/use/i18n.rb +40 -16
  115. data/lib/zena/use/query_builder.rb +0 -6
  116. data/lib/zena/use/query_node.rb +17 -4
  117. data/lib/zena/use/relations.rb +1 -3
  118. data/lib/zena/use/rendering.rb +10 -8
  119. data/lib/zena/use/scope_index.rb +5 -1
  120. data/lib/zena/use/search.rb +2 -1
  121. data/lib/zena/use/urls.rb +82 -77
  122. data/lib/zena/use/workflow.rb +12 -4
  123. data/lib/zena/use/zafu_safe_definitions.rb +37 -9
  124. data/lib/zena/use/zafu_templates.rb +49 -20
  125. data/lib/zena/use/zazen.rb +6 -2
  126. data/locale/it/LC_MESSAGES/zena.mo +0 -0
  127. data/locale/it/zena.mo +0 -0
  128. data/locale/it/zena.po +1982 -0
  129. data/public/images/arrow_back.png +0 -0
  130. data/public/images/remove_tag.png +0 -0
  131. data/public/javascripts/grid.js +800 -199
  132. data/public/javascripts/window.js +1 -1
  133. data/public/javascripts/zena.js +130 -21
  134. data/public/stylesheets/grid.css +11 -2
  135. data/public/stylesheets/zena.css +2 -1
  136. data/test/custom_queries/complex.host.yml +5 -0
  137. data/test/fixtures/files/TestNode.zafu +36 -0
  138. data/test/functional/nodes_controller_test.rb +18 -1
  139. data/test/integration/zafu_compiler/action.yml +2 -2
  140. data/test/integration/zafu_compiler/ajax.yml +44 -26
  141. data/test/integration/zafu_compiler/asset.yml +12 -2
  142. data/test/integration/zafu_compiler/basic.yml +0 -16
  143. data/test/integration/zafu_compiler/calendar.yml +6 -6
  144. data/test/integration/zafu_compiler/complex_ok.yml +23 -1
  145. data/test/integration/zafu_compiler/conditional.yml +5 -5
  146. data/test/integration/zafu_compiler/context.yml +6 -5
  147. data/test/integration/zafu_compiler/dates.yml +23 -2
  148. data/test/integration/zafu_compiler/display.yml +46 -2
  149. data/test/integration/zafu_compiler/errors.yml +2 -2
  150. data/test/integration/zafu_compiler/eval.yml +35 -7
  151. data/test/integration/zafu_compiler/forms.yml +47 -13
  152. data/test/integration/zafu_compiler/i18n.yml +2 -2
  153. data/test/integration/zafu_compiler/meta.yml +35 -1
  154. data/test/integration/zafu_compiler/query.yml +23 -4
  155. data/test/integration/zafu_compiler/relations.yml +10 -6
  156. data/test/integration/zafu_compiler/roles.yml +4 -4
  157. data/test/integration/zafu_compiler/rubyless.yml +11 -1
  158. data/test/integration/zafu_compiler/safe_definitions.yml +23 -5
  159. data/test/integration/zafu_compiler/security.yml +10 -6
  160. data/test/integration/zafu_compiler/urls.yml +23 -6
  161. data/test/integration/zafu_compiler/zafu_attributes.yml +1 -1
  162. data/test/integration/zafu_compiler/zazen.yml +14 -0
  163. data/test/selenium/Add/add3.rsel +8 -8
  164. data/test/selenium/Destroy/0setup.rsel +12 -0
  165. data/test/selenium/Destroy/destroy1.rsel +16 -0
  166. data/test/selenium/Edit/edit2.rsel +9 -9
  167. data/test/selenium/Edit/edit5.rsel +9 -9
  168. data/test/selenium/Edit/edit6.rsel +9 -9
  169. data/test/selenium/Form/form4.rsel +17 -0
  170. data/test/selenium/Toggle/toggle1.rsel +2 -0
  171. data/test/selenium/Toggle/toggle2.rsel +18 -0
  172. data/test/sites/zena/columns.yml +3 -0
  173. data/test/sites/zena/versions.yml +7 -0
  174. data/test/unit/cached_page_test.rb +13 -13
  175. data/test/unit/column_test.rb +26 -0
  176. data/test/unit/node_test.rb +16 -1
  177. data/test/unit/project_test.rb +6 -1
  178. data/test/unit/relation_test.rb +1 -1
  179. data/test/unit/role_test.rb +1 -1
  180. data/test/unit/string_hash_test.rb +30 -0
  181. data/test/unit/virtual_class_test.rb +31 -17
  182. data/test/unit/zafu_markup_test.rb +414 -0
  183. data/test/unit/zafu_node_context_test.rb +375 -0
  184. data/test/unit/zafu_ordered_hash_test.rb +69 -0
  185. data/test/unit/zena/acts/enrollable_test.rb +1 -1
  186. data/test/unit/zena/parser/zafu_asset.yml +0 -10
  187. data/test/unit/zena/parser/zazen.yml +1 -1
  188. data/test/unit/zena/parser_test.rb +1 -72
  189. data/test/unit/zena/use/dates_test.rb +1 -1
  190. data/test/unit/zena/use/rendering_test.rb +24 -7
  191. data/test/unit/zena/use/scope_index_test.rb +17 -0
  192. data/test/unit/zena/use/zazen_test.rb +2 -1
  193. data/zena.gemspec +71 -37
  194. metadata +104 -83
  195. data/app/views/nodes/destroy.erb +0 -0
  196. data/bricks/static/lib/bricks/static.rb +0 -151
  197. data/bricks/static/zena/init.rb +0 -1
  198. data/bricks/static/zena/migrate/20110702010330_add_static_to_idx_templates.rb +0 -12
  199. data/bricks/static/zena/test/unit/static_test.rb +0 -33
  200. data/lib/zena/parser/zafu_rules.rb +0 -244
  201. data/lib/zena/parser/zafu_tags.rb +0 -198
  202. data/lib/zena/parser/zena_rules.rb +0 -23
@@ -10,8 +10,18 @@ default:
10
10
 
11
11
  rename_asset:
12
12
  src: "<link href='/Default skin/style.css' rel='Stylesheet' type='text/css'/>"
13
- tem: "<link href='/en/textdocument54.css?1144713600' rel='Stylesheet' type='text/css'/>"
13
+ tem: "<link rel='Stylesheet' type='text/css' href='/en/textdocument54.css?1144713600'/>"
14
14
 
15
15
  should_not_change_script:
16
16
  src: "<script type='text/javascript' src='http://example.com'></script>"
17
- tem: "<script src='http://example.com' type='text/javascript'></script>"
17
+ tem: "<script type='text/javascript' src='http://example.com'></script>"
18
+
19
+ change_style_url:
20
+ src: |
21
+ <style>
22
+ #super { background:url('<r:image in='site' do='path' format='data'/>');}
23
+ </style>
24
+ res: |
25
+ <style>
26
+ #super { background:url('/oo/image40.jpg?1144713600');}
27
+ </style>
@@ -268,22 +268,6 @@ find_count:
268
268
  src: "<r:nodes in='site' where='name like \"a%\"' find='count'/>"
269
269
  res: "3"
270
270
 
271
- link_page_next:
272
- context:
273
- pak: 2
274
- src: "<r:nodes in='site' limit='3' order='zip' paginate='pak'><r:link page='previous'/> | <r:show var='pak'/> | <r:link page='next'/> || <r:each join=',' do='title'/></r:nodes>"
275
- res: "<a href='/oo/projects-list/Clean-Water-project/page22.html?pak=1'>1</a> | 2 | <a href='/oo/projects-list/Clean-Water-project/page22.html?pak=3'>3</a> || tiger,lion,myLife"
276
-
277
- link_page_next_with_block:
278
- src: "<r:nodes in='site' limit='3' order='zip' paginate='pak'><r:link page='next' do='t'>next</r:link></r:nodes>"
279
- res: "<a href='/oo/projects-list/Clean-Water-project/page22.html?pak=2'>next</a>"
280
-
281
- link_page_list:
282
- context:
283
- pak: 2
284
- src: "<r:nodes in='site' limit='10' order='zip' paginate='pak' do='link' page='list' join=', '/>"
285
- tem: "/set_pak_page != set_pak.*zen_path\(@node,:pak.*elsif true.*set_pak_page/"
286
- res: "/<a href='.*page22.html\?pak=1'>1</a>, 2, .*pak=3'>3</a>.*pak=4'>4</a>.*pak=5'>5</a>/"
287
271
 
288
272
  # TODO:
289
273
  #link_page_list_single_page:
@@ -9,26 +9,26 @@ calendar:
9
9
  context:
10
10
  date: "2006-03-18"
11
11
  src: "<div do='calendar' attr='date' select='posts where #{cal_start} <= date and date < #{cal_end} in project'/>"
12
- res: "/<td><p>15</p><ol><li><a href='/oo/projects-list/Clean-Water-project/post27.html'>parc openi…</a></li></ol><\/td>.*<td class='sat ref'>18</td>/"
12
+ res: "/<td class='events'><p>15</p><ol><li><a href='/oo/projects-list/Clean-Water-project/post27.html'>parc openi…</a></li></ol><\/td>.*<td class='sat ref'>18</td>/"
13
13
 
14
14
  calendar_tz:
15
15
  context:
16
16
  date: "2006-03-18"
17
17
  src: "<div do='calendar' attr='date' tz='America/New_York' select='posts where #{cal_start} <= date and date < #{cal_end} in project'/>"
18
18
  # previous date 00:00 = uses tz in link.
19
- res: "/date=2006-02-18\+00%3A00.*<td><p>14</p><ol><li><a href='/oo/projects-list/Clean-Water-project/post27.html'>parc openi…</a></li></ol><\/td>.*<td class='sat ref'>18</td>/"
19
+ res: "/date=2006-02-18\+00%3A00.*<td class='events'><p>14</p><ol><li><a href='/oo/projects-list/Clean-Water-project/post27.html'>parc openi…</a></li></ol><\/td>.*<td class='sat ref'>18</td>/"
20
20
 
21
21
  calendar_with_blocks:
22
22
  context:
23
23
  date: "2006-03-18"
24
24
  src: "<div do='calendar' attr='date' select='posts where #{cal_start} <= date and date < #{cal_end} in project'>
25
25
  <h3 do='header'>
26
- <r:link date='date.advance(:months =&gt; -1)' text='PREV'/>
26
+ <r:link date='date.advance(:months => -1)' text='PREV'/>
27
27
  <r:date format='%B'/>
28
- <r:link date='date.advance(:months =&gt; 1)' text='NEXT'/>
28
+ <r:link date='date.advance(:months => 1)' text='NEXT'/>
29
29
  </h3><r:cell><b do='date' format='%e.%m'/></r:cell></div>"
30
- # Daylight savings change: Feb = 00:00, Apr 01:00
31
- res: "/date=2006-02-18\+00%3A00'>PREV.*date=2006-04-18\+01%3A00'>NEXT.*<b>15.03</b>/"
30
+ # Daylight savings change: Feb = 00:00, Apr 01:00: Should still be 00:00 because we advance with the LOCAL time.
31
+ res: "/date=2006-02-18\+00%3A00'>PREV.*date=2006-04-18\+00%3A00'>NEXT.*<b>15.03</b>/"
32
32
 
33
33
  calendar_node_attr:
34
34
  context:
@@ -6,9 +6,31 @@ it_should_compile_custom_select:
6
6
  site: complex
7
7
  ref_date: 2004-09-01
8
8
  src: "<r:emp_form_dates do='each' join=', '><r:show attr='title'/>(<r:priority/>)[<r:last_date format='%Y-%m'/>]</r:emp_form_dates>"
9
- tem: '/var2.attributes\["priority"\].*\[<%= format_date\(var2.attributes\["last_date"\], :format => "%Y-%m"\) %>\]/'
9
+ tem: '/var2.attributes\["priority"\].*\[<%= format_date\(var2.rcast\("last_date", :time\), :format => "%Y-%m"\) %>\]/'
10
10
  res: 'how to use the winch(10)[], secure a site(10)[], dangerous transportations(10)[2004-03], engine maintenance(5)[], information transmission(5)[2002-05], fiber junction(5)[2003-03], problem formulation(5)[2006-03], how to use the radio(1)[]'
11
11
 
12
+ type_cast_to_time_using_existing_field:
13
+ context:
14
+ node_name: '@node'
15
+ node: roger
16
+ visitor: complex_admin
17
+ site: complex
18
+ ref_date: 2004-09-01
19
+ src: "<r:emp_form_dates where='idx_datetime1 is not null' do='each' join=', ' do='idx_datetime1' format='%d.%m.%Y %H:%M'/>"
20
+ tem: '/format_date\(var2.idx_datetime1/'
21
+ res: '15.03.2006 01:00, 05.05.2003 02:00, 03.03.2005 01:00'
22
+
23
+ type_cast_to_time_custom_field:
24
+ context:
25
+ node_name: '@node'
26
+ node: roger
27
+ visitor: complex_admin
28
+ site: complex
29
+ ref_date: 2004-09-01
30
+ src: "<r:emp_form_dates where='next_date is not null' do='each' join=', ' do='next_date' format='%d.%m.%Y %H:%M'/>"
31
+ tem: '/format_date\(var2.rcast\("next_date", :time/'
32
+ res: '15.03.2006 01:00, 05.05.2003 02:00, 03.03.2005 01:00'
33
+
12
34
  it_should_group_by_custom_select:
13
35
  context:
14
36
  node_name: '@node'
@@ -149,14 +149,14 @@ if_in_tag_else:
149
149
  res: "not in form"
150
150
 
151
151
  if_or:
152
- src: "<r:if eval='can_write?' or_test='origin'>hello</r:if>"
153
- tem: "/<% if @node.can_write? || !@node.version.prop[\"foo\"].blank? %>hello<% end %>|<% if !@node.version.prop[\"foo\"].blank? || @node.can_write? %>hello<% end %>/"
152
+ src: "<r:if eval='can_write? || origin'>hello</r:if>"
153
+ tem: "/<% if @node.can_write? \|\| !@node.version.prop[\"foo\"].blank? %>hello<% end %>|<% if !@node.version.prop[\"foo\"].blank? || @node.can_write? %>hello<% end %>/"
154
154
  res: "hello"
155
155
 
156
156
  if_or_same:
157
- src: "<r:if test='origin' test='d_bar'>hello</r:if>"
158
- tem: "/<% if !@node.version.prop[\"foo\"].blank? || !@node.version.prop[\"bar\"].blank? %>hello<% end %>|<% if !@node.version.prop[\"bar\"].blank? || !@node.version.prop[\"foo\"].blank? %>hello<% end %>/"
159
- res: ""
157
+ src: "<r:if test='origin || text'>hello</r:if>"
158
+ tem: "/<% if !@node.version.prop[\"foo\"].blank? \|\| !@node.version.prop[\"text\"].blank? %>hello<% end %>|<% if !@node.version.prop[\"bar\"].blank? || !@node.version.prop[\"foo\"].blank? %>hello<% end %>/"
159
+ res: "hello"
160
160
 
161
161
  if_now:
162
162
  src: "<r:if test='log_at &gt; now'>future<r:else>past</r:else></r:if>"
@@ -8,11 +8,7 @@ each_group:
8
8
  src: "<r:nodes do='group' by='kpath'><p do='each_group'><r:kpath/>: <r:each join=', ' do='title'/></p></r:nodes>"
9
9
  res: "<p>NP: crocodiles, status title</p><p>NDI: it's a lake</p><p>NRC: The lake we love</p><p>NNP: parc opening</p><p>ND: water</p>"
10
10
 
11
- set_var:
12
- context:
13
- date: '2011-05-30'
14
- src: "<div do='set' next_date='date.advance(:years =&gt; 1)'><span do='next_date' format='%Y-%m-%d'/></div>"
15
- res: "<div><span>2012-05-30</span></div>"
11
+ # set_var tested in eval.yml
16
12
 
17
13
  dom_id_in_each:
18
14
  src: "<r:pages in='site limit 2'><li do='each'><r:dom_id/> <p id='this#{dom_id}'/></li></r:pages>"
@@ -24,3 +20,8 @@ list_else:
24
20
  node: status
25
21
  src: "<ul do='posts'><li do='each' do='link'/><li do='else'>hop</li></ul>"
26
22
  res: "<ul><li>hop</li></ul>"
23
+
24
+ master_template_on_static_render:
25
+ src: "<r:master_template><r:title/></r:master_template>"
26
+ tem: ''
27
+ # Master template on template rendering is tested in 'find master template', rendering_test.rb
@@ -149,9 +149,15 @@ input_date:
149
149
  context:
150
150
  node: opening
151
151
  src: "<r:Post?><r:input type='date' name='date'/></r:Post?>"
152
- tem: '/date_box\(@node, "date", :value => @node.prop\[.date.\], :size => 15\)/'
152
+ tem: '/date_box\(@node, "node\[date\]", :value => @node.prop\[.date.\], :size => 15\)/'
153
153
  res: "/value='2006-03-15 01:00'/"
154
154
 
155
+ input_date_value_now:
156
+ context:
157
+ node: opening
158
+ src: "<r:Post?><r:input type='date' name='date' value='now'/></r:Post?>"
159
+ tem: '/date_box\(@node, "node\[date\]", :value => Time.now, :size => 15\)/'
160
+
155
161
  input_date_no_time:
156
162
  context:
157
163
  node: opening
@@ -160,6 +166,14 @@ input_date_no_time:
160
166
  res: "/value='2006-03-15'/"
161
167
  js: "/showsTime *: *false/"
162
168
 
169
+ label_on_hash:
170
+ src: "<r:input name='settings[foo]' label='t'/>"
171
+ res: "<label>settings_foo</label> <span><input type='text' name='node[settings][foo]' value=''/></span>"
172
+
173
+ date_on_hash:
174
+ src: "<r:input name='settings[foo]' type='date'/>"
175
+ res: "/<input id='.*' name='node\[settings\]\[foo\]' type='text' size='15' value='' class=''/>/"
176
+
163
177
  test_date:
164
178
  # test with 'date' tests contextual date (main_date).
165
179
  src: "<r:Post?><r:if test='this.date'></r:if></r:Post?>"
@@ -184,4 +198,11 @@ time_year:
184
198
  node: opening
185
199
  tz: 'US/Pacific'
186
200
  src: "<r:Post?><b do='this.date.year'/> <b do='this.date.year(\"UTC\")'/></r:Post?>"
187
- res: "<b>2011</b> <b>2012</b>"
201
+ res: "<b>2011</b> <b>2012</b>"
202
+
203
+ time_wday:
204
+ context:
205
+ node: opening
206
+ tz: 'US/Pacific'
207
+ src: "<r:Post?><b do='this.date.wday'/> <b do='this.date.wday(\"UTC\")'/></r:Post?>"
208
+ res: "<b>2</b> <b>3</b>"
@@ -7,6 +7,50 @@ default:
7
7
  tem: "simple text"
8
8
  res: "simple text"
9
9
 
10
+ space_in_tag:
11
+ src: <meta http-equiv='Content-type' content='text/html; charset=utf-8' /><r:title/>
12
+ tem: '!/r:title/'
13
+
14
+ multiline_tag:
15
+ src: |
16
+ <meta
17
+ http-equiv='Content-type'
18
+ content='text/html; charset=utf-8' /><r:title/>
19
+ tem: '!/r:title/'
20
+
21
+ multiline_rtag:
22
+ src: |
23
+ <r:void
24
+ http-equiv='Content-type'
25
+ content='text/html; charset=utf-8' /><r:title/>
26
+ tem: '!/r:title/'
27
+
28
+ cdata:
29
+ src: |
30
+ <script type='text/javascript'>
31
+ <![CDATA[
32
+ var urls = [<r:images in='site limit 2' do='each' join=', '>'<r:url mode='med' format='data'/>'</r:images>];
33
+ //]]>
34
+ </script>
35
+ res: |
36
+ <script type='text/javascript'>
37
+ <![CDATA[
38
+ var urls = ['http://test.host/oo/image40_med.jpg?390663777446', 'http://test.host/en/image30_med.jpg?390663777446'];
39
+ //]]>
40
+ </script>
41
+
42
+ multiline_tag:
43
+ src: |
44
+ <div id='extract'>
45
+ <r:section do='zazen' attr='infos' edit='true' publish='true' />
46
+
47
+ <div id='cert' do='pages' in='site'>
48
+ <div class='cert' do='each' do='link' do='img' src='find("image")' mode='cert' />
49
+ </div>
50
+ </div>
51
+ tem: "!/do='pages'/"
52
+
53
+
10
54
  show_title:
11
55
  old_src: "<r:show attr='title'/>"
12
56
  old_tem: "<%= @node.title %>"
@@ -340,9 +384,9 @@ each_whitespace:
340
384
  res: "53\n37\n12\n.\n"
341
385
 
342
386
  set_class_before_query:
343
- # Should use previous node (not list context)
387
+ # Uses list context
344
388
  src: "<div class='foo_#{title}' do='images in site'></div>"
345
- res: "<div class='foo_status title'></div>"
389
+ res: "<div class='foo_Autumn Tree'></div>"
346
390
 
347
391
  flash_messages:
348
392
  src: "<r:flash_messages/>"
@@ -81,8 +81,8 @@ toggle_bad_finder_class:
81
81
  map_join:
82
82
  context:
83
83
  node: 'cleanWater'
84
- src: "<r:children do='map(:flobo).join(\",\")'/>"
85
- tem: "/unknown method .*map\(:flobo\)/"
84
+ src: "<r:children do='map(\"flobo\").join(\",\")'/>"
85
+ tem: "/unknown method <span class='type'>flobo\(\)</span>/"
86
86
 
87
87
  datebox_on_vclass:
88
88
  src: "<r:Contact><r:input type='date' name='log_at'/></r:Contact>"
@@ -8,14 +8,42 @@ show_var_overwrites_attribute:
8
8
  src: "<r:set title='12345'><b do='title'/></r:set>"
9
9
  res: "<b>12345</b>"
10
10
 
11
- test_set_in_scope:
11
+ set_in_scope:
12
12
  src: "<r:set hours='3'><r:if test='hours &gt; 0'>you have: <r:show eval='hours' format='%.2f'/></r:if></r:set>"
13
13
  res: "you have: 3.00"
14
14
 
15
- test_set_for_siblings:
16
- src: "<r:set hours='3'/><r:if test='hours &gt; 0'>you have: <r:show eval='hours' format='%.2f'/></r:if>"
17
- res: "you have: 3.00"
15
+ set_bad_code:
16
+ src: "<r:set hours='foobar'><r:if test='hours &gt; 0'>you have: <r:show eval='hours' format='%.2f'/></r:if></r:set>"
17
+ res: "/unknown method 'foobar\(\)'/"
18
+
19
+ set_var:
20
+ context:
21
+ date: '2011-05-30'
22
+ src: "<div do='set' next_date='date.advance(:years =&gt; 1)'><span do='next_date' format='%Y-%m-%d'/></div>"
23
+ res: "<div><span>2012-05-30</span></div>"
24
+
25
+ set_var_propagates:
26
+ src: "<div do='set' a='%q{hello}'><r:void do='set' a='%q{goodbye}'/><r:a/></div>"
27
+ tem: '<div><% _za = "hello" %><% _za = "goodbye" %><%= _za %></div>'
28
+ res: "<div>goodbye</div>"
18
29
 
19
- test_set_for_siblings_overwrite:
20
- src: "<r:set hours='3'/><r:set hours='%{hello}'/><r:if test='!hours.blank?'>you have: <r:eval>hours.gsub(/o/,'')</r:eval></r:if>"
21
- res: "you have: hell"
30
+ set_var_can_be_nil:
31
+ src: "<div do='set' a='%q{hello}'><r:void do='set' a='origin'/><r:a/></div>"
32
+ tem: "<div><% _za = \"hello\" %><% _za = @node.prop['origin'] || _za %><%= _za %></div>"
33
+ res: "<div>hello</div>"
34
+
35
+ set_var_different_type:
36
+ src: "<div do='set' a='%q{hello}'><r:void do='set' a='15'/><r:a/></div>"
37
+ tem: "/Type mismatch for var a=15: Number != String/"
38
+
39
+ node_eval:
40
+ src: "<r:void do='@node.eval(\"title\")'/>"
41
+ tem: "<%= @node.zafu_eval(\"title\") %>"
42
+ res: "status title"
43
+
44
+ node_eval_array:
45
+ context:
46
+ node: opening
47
+ src: "<r:void do='@node.eval(\"set_tag_ids\")'/>"
48
+ tem: "<%= @node.zafu_eval(\"set_tag_ids\") %>"
49
+ res: "33,34"
@@ -36,7 +36,7 @@ new:
36
36
  # Should accept allowed params (from class and roles) and transform ids to zip (back and forth)
37
37
  src: "<r:new klass='Letter' title='%q{Joe}' parent_id='project.id' paper='%q{white}' origin='%q{Mars}' bad='%q{value}'><r:form><r:input name='title'/> <r:input name='parent_id'/></r:form></r:new>"
38
38
  tem: "/:title => \"Joe\", :parent_id => .*@node.project.zip.*, :paper => \"white\", :origin => \"Mars\"/"
39
- res: "/<input type='text' name='node\[title\]' value='Joe'/> <input type='text' name='node\[parent_id\]' value='21'/><div class='hidden'><input type='hidden' name='node\[klass\]' value='Letter'/><input type='submit'/><input type='hidden' name='node\[paper\]' value='white'/><input type='hidden' name='node\[origin\]' value='Mars'/></div>/"
39
+ res: "/<input type='text' name='node\[title\]' value='Joe' id='list1_title'/> <input type='text' name='node\[parent_id\]' value='21'[^>]+/><div class='hidden'><input type='hidden' name='node\[klass\]' value='Letter'/><input type='submit'/><input type='hidden' name='node\[paper\]' value='white'/><input type='hidden' name='node\[origin\]' value='Mars'/></div>/"
40
40
 
41
41
  translate_id_to_zip:
42
42
  src: "<b do='hot_id'/><i do='parent_id'/>"
@@ -46,23 +46,32 @@ select_class_existing_node:
46
46
  context:
47
47
  node: 'letter'
48
48
  src: "<r:form><r:select name='klass' root_class='Note' selected='Post'/></r:form>"
49
- res: "/<select name=.node\[klass\].><option value=\"Note\">Note<\/option>\n<option value=\"Letter\" selected=\"selected\">  Letter<\/option>\n<option value=\"Post\">  Post<\/option><\/select>/"
49
+ res: "/<select name=.node\[klass\]. id=.list1_klass.><option value=\"Note\">klass_Note<\/option>\n<option value=\"Letter\" selected=\"selected\">  klass_Letter<\/option>\n<option value=\"Post\">  klass_Post<\/option><\/select>/"
50
50
 
51
51
  select_class_new_node:
52
52
  src: "<r:pages><r:each/><r:add/><r:form><r:select name='klass' root_class='Note' selected='Post'/></r:form>"
53
- res: "/<select.*name=.node\[klass\].*Note.*Letter.*Post. selected=.selected./"
53
+ res: "/<select.*name=.node\[klass\].*klass_Note.*klass_Letter.*Post. selected=.selected./"
54
54
 
55
55
  select_class_kpath:
56
56
  src: "<r:select param='k' root_class='Note' attr='kpath'/>"
57
- res: "/<select.*name=.k.*NN.*Note.*NNL.*Letter.*NNP.*Post/"
57
+ res: "/<select.*name=.k.*NN.*k_Note.*NNL.*k_Letter.*NNP.*k_Post/"
58
+
59
+ select_class_tprefix:
60
+ src: "<r:select tprefix='foo' param='k' root_class='Note'/>"
61
+ tem: '/\["foo_Note", "Note"\]/'
62
+ res: "/foo_Note.*foo_Letter/"
63
+
64
+ select_data:
65
+ src: "<r:select data-d='foo' param='k' root_class='Note' attr='kpath'/>"
66
+ res: "/<select name=.k. data-d='foo'.*NN.*k_Note.*NNL.*k_Letter.*NNP.*k_Post/"
58
67
 
59
68
  select_nodes:
60
69
  src: "<r:form><r:select nodes='images in site' name='foo'></select></r:form>"
61
- res: "/name='node\[foo\]'><option value=\"\" selected=\"selected\"></option>\n<option value=\"40\">Autumn Tree</option>\n<option value=\"30\">bird</option>/"
70
+ res: "/name='node\[foo\]'[^>]+><option value=\"\" selected=\"selected\"></option>\n<option value=\"40\">Autumn Tree</option>\n<option value=\"30\">bird</option>/"
62
71
 
63
72
  select_nodes_show_rubyless:
64
73
  src: "<r:form><r:select nodes='images in site' name='foo' show='title.limit(3)'></select></r:form>"
65
- res: "/name='node\[foo\]'><option value=\"\" selected=\"selected\"></option>\n<option value=\"40\">Aut…</option>\n<option value=\"30\">bir…</option>/"
74
+ res: "/name='node\[foo\]'[^>]+><option value=\"\" selected=\"selected\"></option>\n<option value=\"40\">Aut…</option>\n<option value=\"30\">bir…</option>/"
66
75
 
67
76
  do_not_set_parent_id_if_form_contains_parent_id:
68
77
  src: "<r:children><r:each do='title'/><r:add/><r:form><r:select name='parent_id' nodes='projects in site'/><input name='title'/></r:form></r:children>"
@@ -74,11 +83,11 @@ select_nodes_selected:
74
83
 
75
84
  select_nodes_in_ajax:
76
85
  src: "<r:pages><r:each do='title'/><r:add/><r:form><r:select nodes='images in site' name='d_ref'/></r:form></r:pages>"
77
- res: "/name=.node\[d_ref\].><option value=\"\" selected=\"selected\"></option>\n<option value=\"40\">Autumn Tree</option>\n<option value=\"30\">bird</option>/"
86
+ res: "/name=.node\[d_ref\].[^>]+><option value=\"\" selected=\"selected\"></option>\n<option value=\"40\">Autumn Tree</option>\n<option value=\"30\">bird</option>/"
78
87
 
79
88
  select_nodes_show_attr:
80
89
  src: "<r:form><r:select name='title' nodes='images in site' attr='ext' show='title'/></r:form>"
81
- res: "/name=.node\[title\].>.*<option value=\"jpg\">flower</option>\n<option value=\"jpg\">it's a lake</option>/"
90
+ res: "/name=.node\[title\].[^>]+>.*<option value=\"jpg\">flower</option>\n<option value=\"jpg\">it's a lake</option>/"
82
91
 
83
92
  select_time_zone:
84
93
  src: "<r:form><r:select type='time_zone' name='d_tz'/></r:form>"
@@ -138,6 +147,13 @@ checkbox_checked_value:
138
147
  tem: "/@node.tagged\[\"sky\"\].blank\?/"
139
148
  res: "<input type='hidden' name='node[tagged][sky]' value=''/><input type='checkbox' name='node[tagged][sky]' value='sky' checked='checked'/>"
140
149
 
150
+ checkbox_checked_hash_value:
151
+ context:
152
+ node: test
153
+ src: "<r:input type='checkbox' name='settings[one]' value='un'/> <r:input type='checkbox' name='settings[one]' value='deux'/>"
154
+ tem: "/@node.prop\[.settings.\]\[.one.\] : nil\) == .un. \? . checked='checked'/"
155
+ res: "<input type='hidden' name='node[settings][one]' value=''/><input type='checkbox' name='node[settings][one]' value='un' checked='checked'/><input type='hidden' name='node[settings][one]' value=''/> <input type='checkbox' name='node[settings][one]' value='deux'/>"
156
+
141
157
  checkbox_unchecked_value:
142
158
  src: "<r:input type='checkbox' name='tagged[foo]'/>"
143
159
  tem: "/@node.tagged\[\"foo\"\].blank\?/"
@@ -160,19 +176,19 @@ input:
160
176
  context:
161
177
  node: 'ant'
162
178
  src: "<r:Contact?><r:input name='first_name'/></r:Contact?>"
163
- tem: "<% if @node.kpath_match?('NRC') %><input type='text' name='node[first_name]' value='<%= fquote @node.prop['first_name'] %>'/><% end %>"
179
+ tem: "<% if @node.kpath_match?('NRC') %><input type='text' name='node[first_name]' value='<%= fquote(@node.prop['first_name']) %>'/><% end %>"
164
180
  res: "<input type='text' name='node[first_name]' value='Solenopsis'/>"
165
181
 
166
182
  input_raw_name:
167
183
  src: "<r:input param='first_name'/>"
168
- tem: "<input type='text' name='first_name' value='<%= fquote params[:first_name] %>'/>"
184
+ tem: "<input type='text' name='first_name' value='<%= fquote(params[:first_name]) %>'/>"
169
185
 
170
186
  input_param_value:
171
187
  context:
172
188
  foo:
173
189
  "bar.baz": 'xyz'
174
190
  src: "<r:input param='foo[bar.baz]'/>"
175
- tem: "<input type='text' name='foo[bar.baz]' value='<%= fquote param_value(\"foo[bar.baz]\") %>'/>"
191
+ tem: "<input type='text' name='foo[bar.baz]' value='<%= fquote(param_value(\"foo[bar.baz]\")) %>'/>"
176
192
  res: "<input type='text' name='foo[bar.baz]' value='xyz'/>"
177
193
 
178
194
  input_checkbox_param_value:
@@ -212,7 +228,7 @@ input_new:
212
228
  context:
213
229
  node: 'ant'
214
230
  src: "<r:contacts><r:each/><r:form><r:input name='first_name'/></r:form><r:add/></r:contacts>"
215
- res: "/name='node\[first_name\]' [^>]*id='list2_first_name'/"
231
+ res: "/name='node\[first_name\]' [^>]*id='list1_first_name'/"
216
232
 
217
233
  show_in_form:
218
234
  src: "<r:form><b do='title'/></r:form>"
@@ -228,13 +244,23 @@ set_parent_id_in_new:
228
244
  tem: "/node\[parent_id\].*@node.zip/"
229
245
  res: "/<input type='hidden' name='node\[parent_id\]' value='22'/>/"
230
246
 
231
-
232
247
  label_on_input:
233
248
  context:
234
249
  lang: fr
235
250
  src: "<r:input label='t' name='title'/>"
236
251
  res: "<label>titre</label> <span><input type='text' name='node[title]' value='Etat des travaux'/></span>"
237
252
 
253
+ label_on_input_param:
254
+ context:
255
+ lang: fr
256
+ src: "<r:input label='t' param='title'/>"
257
+ res: "<label>titre</label> <span><input type='text' name='title' value=''/></span>"
258
+
259
+ label_on_hash:
260
+ src: "<r:input name='settings[foo]' label='t'/>"
261
+ tem: "/@node.prop\[.settings.\]\[.foo.\]/"
262
+ res: "<label>settings_foo</label> <span><input type='text' name='node[settings][foo]' value=''/></span>"
263
+
238
264
  label_on_textarea:
239
265
  context:
240
266
  lang: fr
@@ -267,6 +293,14 @@ param_on_select:
267
293
  src: "<r:select param='q[contact.status]' values='0,-5,-10' tshow='active, being registered, inactive'/>"
268
294
  res: "<select name='q[contact.status]'><option value=\"0\">active</option>\n<option value=\"-5\">being registered</option>\n<option value=\"-10\">inactive</option></select>"
269
295
 
296
+ select_eval_value:
297
+ context:
298
+ f: "a,b,c,en"
299
+ q: 'en'
300
+ src: "<r:select param='q' eval='params[:f]'/>"
301
+ tem: "<select name='q'><%= options_for_select((params[:f] || '').split(',').map(&:strip).map {|e| [trans(e), e]}, param_value(\"q\").to_s) %></select>"
302
+ res: "<select name='q'><option value=\"a\">a</option>\n<option value=\"b\">b</option>\n<option value=\"c\">c</option>\n<option value=\"en\" selected=\"selected\">english</option></select>"
303
+
270
304
  crop:
271
305
  context:
272
306
  node: 'bird_jpg'