zena 1.2.1 → 1.2.2

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.
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'