zena 0.16.9 → 1.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (572) hide show
  1. data/.gitignore +16 -3
  2. data/CREDITS +8 -4
  3. data/History.txt +12 -15
  4. data/app/controllers/application_controller.rb +1 -0
  5. data/app/controllers/columns_controller.rb +130 -0
  6. data/app/controllers/documents_controller.rb +16 -4
  7. data/app/controllers/groups_controller.rb +1 -5
  8. data/app/controllers/iformats_controller.rb +1 -5
  9. data/app/controllers/nodes_controller.rb +116 -41
  10. data/app/controllers/preferences_controller.rb +2 -0
  11. data/app/controllers/relations_controller.rb +1 -5
  12. data/app/controllers/sites_controller.rb +1 -5
  13. data/app/controllers/user_sessions_controller.rb +8 -3
  14. data/app/controllers/users_controller.rb +23 -11
  15. data/app/controllers/versions_controller.rb +29 -46
  16. data/app/controllers/virtual_classes_controller.rb +20 -12
  17. data/app/helpers/documents_helper.rb +5 -1
  18. data/app/models/attachment.rb +41 -0
  19. data/app/models/base_contact.rb +79 -0
  20. data/app/models/cache.rb +2 -2
  21. data/app/models/cached_page.rb +5 -4
  22. data/app/models/column.rb +90 -0
  23. data/app/models/comment.rb +3 -1
  24. data/app/models/contact_content.rb +5 -5
  25. data/app/models/contact_version.rb +2 -2
  26. data/app/models/data_entry.rb +9 -8
  27. data/app/models/discussion.rb +4 -0
  28. data/app/models/document.rb +170 -42
  29. data/app/models/document_content.rb +5 -9
  30. data/app/models/group.rb +4 -3
  31. data/app/models/idx_nodes_ml_string.rb +5 -0
  32. data/app/models/idx_nodes_string.rb +5 -0
  33. data/app/models/idx_template.rb +35 -0
  34. data/app/models/iformat.rb +4 -4
  35. data/app/models/image.rb +193 -26
  36. data/app/models/link.rb +1 -1
  37. data/app/models/node.rb +358 -338
  38. data/app/models/note.rb +2 -4
  39. data/app/models/page.rb +10 -8
  40. data/app/models/reference.rb +1 -1
  41. data/app/models/relation.rb +40 -1
  42. data/app/models/relation_proxy.rb +37 -40
  43. data/app/models/role.rb +19 -0
  44. data/app/models/site.rb +54 -24
  45. data/app/models/skin.rb +1 -16
  46. data/app/models/template.rb +92 -62
  47. data/app/models/template_content.rb +12 -6
  48. data/app/models/text_document.rb +69 -36
  49. data/app/models/text_document_content.rb +3 -3
  50. data/app/models/user.rb +34 -13
  51. data/app/models/version.rb +47 -291
  52. data/app/models/virtual_class.rb +26 -29
  53. data/app/views/columns/_add.html.erb +6 -0
  54. data/app/views/columns/_form.html.erb +36 -0
  55. data/app/views/columns/_li.html.erb +11 -0
  56. data/app/views/columns/create.rjs +8 -0
  57. data/app/views/columns/destroy.rjs +6 -0
  58. data/app/views/columns/edit.html.erb +5 -0
  59. data/app/views/columns/index.html.erb +15 -0
  60. data/app/views/columns/new.html.erb +2 -0
  61. data/app/views/columns/show.rjs +1 -0
  62. data/app/views/columns/update.rjs +5 -0
  63. data/app/views/comments/_li.rhtml +1 -1
  64. data/app/views/comments/create.rjs +1 -1
  65. data/app/views/comments/index.rhtml +1 -1
  66. data/app/views/comments/publish.rjs +1 -1
  67. data/app/views/comments/remove.rjs +1 -1
  68. data/app/views/data_entries/_li.html.erb +1 -1
  69. data/app/views/discussions/create.rjs +1 -1
  70. data/app/views/documents/_crop.rhtml +4 -4
  71. data/app/views/documents/crop_form.rjs +1 -1
  72. data/app/views/documents/new.rhtml +1 -1
  73. data/app/views/documents/show.rhtml +4 -4
  74. data/app/views/groups/_form.rhtml +1 -1
  75. data/app/views/groups/index.rhtml +1 -1
  76. data/app/views/iformats/_form.rhtml +1 -1
  77. data/app/views/iformats/create.rjs +1 -1
  78. data/app/views/iformats/index.rhtml +1 -1
  79. data/app/views/links/create.rjs +1 -1
  80. data/app/views/links/destroy.rjs +1 -1
  81. data/app/views/links/show.rjs +1 -1
  82. data/app/views/nodes/_dates.rhtml +2 -2
  83. data/app/views/nodes/_gallery.rhtml +2 -2
  84. data/app/views/nodes/_list_nodes.rhtml +2 -2
  85. data/app/views/nodes/_parent.rhtml +1 -1
  86. data/app/views/nodes/_position.rhtml +2 -2
  87. data/app/views/nodes/_results.rhtml +1 -1
  88. data/app/views/nodes/create.rjs +1 -4
  89. data/app/views/nodes/destroy.erb +0 -0
  90. data/app/views/nodes/import.rhtml +1 -1
  91. data/app/views/nodes/save_text.rjs +3 -3
  92. data/app/views/nodes/table_update.rjs +1 -2
  93. data/app/views/nodes/update.rjs +1 -1
  94. data/app/views/relations/_form.erb +15 -15
  95. data/app/views/relations/_li.erb +5 -11
  96. data/app/views/relations/create.rjs +1 -1
  97. data/app/views/relations/index.erb +1 -1
  98. data/app/views/sites/_form.erb +3 -3
  99. data/app/views/sites/_li.erb +1 -1
  100. data/app/views/sites/index.erb +1 -1
  101. data/app/views/templates/document_create_tabs/_file.rhtml +3 -3
  102. data/app/views/templates/document_create_tabs/_template.rhtml +9 -9
  103. data/app/views/templates/document_create_tabs/{_text_doc.rhtml → _text_document.rhtml} +4 -4
  104. data/app/views/templates/edit_tabs/{_contact.rhtml → _basecontact.rhtml} +2 -2
  105. data/app/views/templates/edit_tabs/_document.rhtml +3 -3
  106. data/app/views/templates/edit_tabs/_help.rhtml +2 -2
  107. data/app/views/templates/edit_tabs/_image.rhtml +4 -4
  108. data/app/views/templates/edit_tabs/_template.rhtml +6 -6
  109. data/app/views/templates/edit_tabs/_text.rhtml +1 -1
  110. data/app/views/templates/edit_tabs/_textdocument.rhtml +4 -4
  111. data/app/views/templates/edit_tabs/_title.rhtml +9 -14
  112. data/app/views/users/_form.rhtml +1 -1
  113. data/app/views/users/change_info.rjs +1 -1
  114. data/app/views/users/change_password.rjs +1 -1
  115. data/app/views/users/index.rhtml +1 -1
  116. data/app/views/users/preferences.html.erb +10 -4
  117. data/app/views/users/update.rjs +1 -1
  118. data/app/views/versions/_list.rhtml +1 -1
  119. data/app/views/versions/_tr.rhtml +1 -1
  120. data/app/views/versions/backup.rjs +1 -1
  121. data/app/views/versions/destroy.rjs +6 -2
  122. data/app/views/versions/diff.rjs +1 -1
  123. data/app/views/versions/edit.rhtml +14 -6
  124. data/app/views/versions/preview.rjs +1 -1
  125. data/app/views/versions/show.rjs +1 -1
  126. data/app/views/virtual_classes/_add.erb +1 -1
  127. data/app/views/virtual_classes/_form.erb +15 -10
  128. data/app/views/virtual_classes/_li.erb +13 -7
  129. data/app/views/virtual_classes/create.rjs +2 -2
  130. data/app/views/virtual_classes/edit.html.erb +7 -0
  131. data/app/views/virtual_classes/index.erb +2 -2
  132. data/app/views/zafu/default/Node-+adminLayout.zafu +47 -0
  133. data/app/views/zafu/default/Node-+index.zafu +1 -0
  134. data/app/views/{templates/defaults/+login.zafu → zafu/default/Node-+login.zafu} +9 -7
  135. data/app/views/zafu/default/Node-+notFound.zafu +14 -0
  136. data/app/views/zafu/default/Node-+popupLayout.zafu +24 -0
  137. data/app/views/zafu/default/Node-+search.zafu +23 -0
  138. data/app/views/zafu/default/Node.zafu +95 -0
  139. data/bin/zena +0 -2
  140. data/bricks/captcha/lib/bricks/captcha.rb +62 -0
  141. data/bricks/captcha/zena/init.rb +11 -0
  142. data/bricks/data2pdf/.document +5 -0
  143. data/bricks/data2pdf/README +19 -0
  144. data/bricks/data2pdf/Rakefile +36 -0
  145. data/bricks/data2pdf/VERSION +1 -0
  146. data/bricks/data2pdf/lib/data2pdf.rb +60 -0
  147. data/bricks/data2pdf/lib/engines/prince.rb +39 -0
  148. data/bricks/data2pdf/lib/engines/xhtml2pdf.rb +41 -0
  149. data/bricks/data2pdf/lib/install.rb +111 -0
  150. data/bricks/data2pdf/test/engines/test_prince.rb +14 -0
  151. data/bricks/data2pdf/test/engines/test_xhtml2pdf.rb +14 -0
  152. data/bricks/data2pdf/test/fixtures/application.css +241 -0
  153. data/bricks/data2pdf/test/fixtures/contact.html +153 -0
  154. data/bricks/data2pdf/test/fixtures/pisa-default.css +207 -0
  155. data/bricks/data2pdf/test/fixtures/sheet1.css +207 -0
  156. data/bricks/data2pdf/test/fixtures/sheet2.css +207 -0
  157. data/bricks/data2pdf/test/fixtures/simple-html.html +337 -0
  158. data/bricks/data2pdf/test/fixtures/simple-text.txt +1 -0
  159. data/bricks/data2pdf/test/helper.rb +23 -0
  160. data/bricks/data2pdf/test/shoulda_macros/shoulda_data2pdf.rb +91 -0
  161. data/bricks/data2pdf/test/unit/test_rendering.rb +37 -0
  162. data/bricks/math/{patch/application_helper.rb → lib/bricks/math.rb} +0 -4
  163. data/bricks/math/zena/init.rb +4 -0
  164. data/bricks/sphinx/README +2 -2
  165. data/bricks/sphinx/lib/use_sphinx.rb +7 -11
  166. data/bricks/sphinx/{misc → zena}/deploy.rb +0 -0
  167. data/bricks/sphinx/{patch/node.rb → zena/init.rb} +1 -3
  168. data/bricks/sphinx/{migrate → zena/migrate}/20091102171258_add_delta_for_sphinx.rb +0 -0
  169. data/bricks/sphinx/{misc → zena}/sphinx.yml +0 -0
  170. data/bricks/sphinx/{misc → zena}/tasks.rb +0 -0
  171. data/bricks/tags/lib/{has_tags.rb → bricks/tags.rb} +12 -24
  172. data/bricks/tags/zena/init.rb +21 -0
  173. data/bricks/tags/{test → zena/test}/sites/zena/links.yml +0 -0
  174. data/bricks/tags/{test → zena/test}/unit/tags_test.rb +1 -1
  175. data/bricks/tags/zena/test/zafu/tags.yml +41 -0
  176. data/bricks/worker/README +2 -2
  177. data/bricks/worker/{misc → zena}/deploy.rb +0 -0
  178. data/bricks/worker/{misc → zena}/init.rb +2 -1
  179. data/bricks/worker/{migrate → zena/migrate}/20091104191643_create_delayed_jobs_table.rb +0 -0
  180. data/bricks/worker/{misc → zena}/tasks.rb +0 -0
  181. data/bricks/worker/{misc → zena}/worker +0 -0
  182. data/config/bricks.yml +2 -0
  183. data/config/deploy.rb +2 -7
  184. data/config/environment.rb +3 -5
  185. data/config/gems.yml +9 -4
  186. data/db/20100628074512_zena0x_to1x.rb +223 -0
  187. data/db/init/base/help.en.zml +3 -3
  188. data/db/init/base/help.fr.zml +3 -3
  189. data/db/init/base/skins.zml +2 -2
  190. data/db/init/base/skins/default.zml +4 -4
  191. data/db/init/base/skins/default/Node-+adminLayout.zafu +8 -7
  192. data/db/init/base/skins/default/Node-+login.zafu +9 -7
  193. data/db/init/base/skins/default/Node-+search.zafu +4 -1
  194. data/db/init/base/skins/default/Node-tree.zafu +3 -3
  195. data/db/init/base/skins/default/Node.zafu +20 -20
  196. data/db/init/base/skins/default/Project.zafu +1 -1
  197. data/db/init/base/skins/default/notes.zafu +5 -5
  198. data/db/init/base/skins/default/style.css +17 -12
  199. data/db/migrate/001_create_base.rb +1 -1
  200. data/db/migrate/008_user_status.rb +1 -1
  201. data/db/migrate/020_create_participation.rb +3 -3
  202. data/db/migrate/024_correct_vclass_kpath.rb +5 -3
  203. data/db/migrate/025_move_tag_into_vclass.rb +7 -5
  204. data/db/migrate/030_redit_auto_publish_site_settings.rb +2 -2
  205. data/db/migrate/032_caches_context_as_hash.rb +4 -2
  206. data/db/migrate/046_fix_zazen_image_tag.rb +2 -2
  207. data/db/migrate/047_change_default_link_id_to_zero.rb +4 -2
  208. data/db/migrate/20090825201159_insert_zero_link.rb +1 -1
  209. data/db/migrate/20090924141459_zafu_fix_sept09.rb +2 -2
  210. data/db/migrate/20100125062254_add_dynamo_to_version.rb +9 -0
  211. data/db/migrate/20100201133242_remove_default_status_on_version.rb +9 -0
  212. data/db/migrate/20100208194210_create_attachments.rb +17 -0
  213. data/db/migrate/20100210112319_change_dynamo_to_property.rb +9 -0
  214. data/db/migrate/20100320145726_transform_template_contents_into_index.rb +13 -0
  215. data/db/migrate/20100328125634_change_skin_name_to_id.rb +31 -0
  216. data/db/migrate/20100417061257_add_properties_to_sites.rb +9 -0
  217. data/db/migrate/20100419163149_rename_name_to_node_name.rb +9 -0
  218. data/db/migrate/20100422091606_change_v_class_table_into_roles.rb +27 -0
  219. data/db/migrate/20100422094048_node_habtm_roles.rb +13 -0
  220. data/db/migrate/20100422115935_create_columns.rb +15 -0
  221. data/db/migrate/20100513181529_add_site_id_to_columns.rb +9 -0
  222. data/db/migrate/20100519091711_add_index_definition_to_columns.rb +9 -0
  223. data/db/migrate/20100519091940_create_idx_nodes_string.rb +14 -0
  224. data/db/migrate/20100519232432_create_idx_nodes_ml_string.rb +15 -0
  225. data/db/migrate/20100525113858_add_porperties_to_users.rb +9 -0
  226. data/db/migrate/20100526090140_renamed_contact_model_to_base_contact.rb +13 -0
  227. data/db/migrate/20100527130937_change_column_index_to_string.rb +9 -0
  228. data/db/migrate/20100531135128_add_fulltext_builder_fields.rb +28 -0
  229. data/doc/zafu_changes.yml +2 -2
  230. data/lib/bricks/loader.rb +48 -26
  231. data/lib/exif_data.rb +21 -1
  232. data/lib/gettext_strings.rb +8 -1
  233. data/lib/tasks/zena.rake +55 -20
  234. data/lib/version_off.rb +323 -0
  235. data/lib/zazen_parser.rb +9 -0
  236. data/lib/zena.rb +13 -14
  237. data/lib/zena/acts/enrollable.rb +232 -0
  238. data/lib/zena/acts/secure.rb +86 -506
  239. data/lib/zena/acts/secure_node.rb +483 -0
  240. data/lib/zena/acts/serializable.rb +149 -0
  241. data/lib/zena/app.rb +36 -23
  242. data/lib/zena/code_syntax.rb +26 -2
  243. data/lib/zena/controller/test_case.rb +23 -2
  244. data/lib/zena/core_ext/file_utils.rb +3 -3
  245. data/lib/zena/core_ext/string.rb +2 -2
  246. data/lib/zena/db.rb +180 -24
  247. data/lib/zena/deploy.rb +140 -183
  248. data/lib/zena/deploy/awstats.conf.rhtml +4 -4
  249. data/lib/zena/deploy/httpd.rhtml +1 -2
  250. data/lib/zena/deploy/stats.vhost.rhtml +7 -7
  251. data/lib/zena/deploy/vhost.rhtml +1 -1
  252. data/lib/zena/deploy/vhost_www.rhtml +4 -4
  253. data/lib/zena/foxy_parser.rb +345 -295
  254. data/lib/zena/info.rb +1 -2
  255. data/lib/zena/integration/test_case.rb +70 -0
  256. data/lib/zena/loader/yaml_loader.rb +80 -0
  257. data/lib/zena/migrator.rb +2 -2
  258. data/lib/zena/parser.rb +19 -17
  259. data/lib/zena/parser/zafu_rules.rb +7 -0
  260. data/lib/zena/parser/zafu_tags.rb +2 -2
  261. data/lib/zena/parser/zazen_rules.rb +9 -29
  262. data/lib/zena/parser/zena_rules.rb +2 -2
  263. data/lib/zena/refactor/act_as_content.rb +6 -0
  264. data/lib/zena/routes.rb +9 -3
  265. data/lib/zena/site_worker.rb +48 -0
  266. data/lib/zena/test_controller.rb +49 -12
  267. data/lib/zena/use.rb +47 -0
  268. data/lib/zena/use/action.rb +230 -0
  269. data/lib/zena/use/ajax.rb +287 -13
  270. data/lib/zena/use/authlogic.rb +28 -12
  271. data/lib/zena/use/calendar.rb +2 -2
  272. data/lib/zena/use/conditional.rb +41 -0
  273. data/lib/zena/use/context.rb +187 -0
  274. data/lib/zena/use/dates.rb +87 -30
  275. data/lib/zena/use/display.rb +598 -0
  276. data/lib/zena/use/dyn_attributes.rb +4 -4
  277. data/lib/zena/use/error_rendering.rb +3 -1
  278. data/lib/zena/use/fixtures.rb +56 -22
  279. data/lib/zena/use/forms.rb +584 -0
  280. data/lib/zena/use/fulltext.rb +90 -0
  281. data/lib/zena/use/grid.rb +12 -7
  282. data/lib/zena/use/html_tags.rb +8 -459
  283. data/lib/zena/use/i18n.rb +172 -109
  284. data/lib/zena/use/image_builder.rb +1 -2
  285. data/lib/zena/use/ml_index.rb +56 -0
  286. data/lib/zena/use/nested_attributes_alias.rb +2 -2
  287. data/lib/zena/use/node_name.rb +94 -0
  288. data/lib/zena/use/query_builder.rb +355 -0
  289. data/lib/zena/use/query_comment.rb +63 -73
  290. data/lib/zena/use/query_node.rb +404 -317
  291. data/lib/zena/use/recursion.rb +71 -0
  292. data/lib/zena/use/refactor.rb +27 -40
  293. data/lib/zena/use/relations.rb +9 -3
  294. data/lib/zena/use/rendering.rb +143 -116
  295. data/lib/zena/use/search.rb +79 -21
  296. data/lib/zena/use/test_helper.rb +17 -9
  297. data/lib/zena/use/upload.rb +1 -1
  298. data/lib/zena/use/urls.rb +534 -28
  299. data/lib/zena/use/version_hash.rb +154 -0
  300. data/lib/zena/use/workflow.rb +635 -0
  301. data/lib/zena/use/zafu_attributes.rb +205 -0
  302. data/lib/zena/use/zafu_eval.rb +21 -0
  303. data/lib/zena/use/zafu_safe_definitions.rb +36 -0
  304. data/lib/zena/use/zafu_templates.rb +459 -0
  305. data/lib/zena/use/zazen.rb +53 -23
  306. data/lib/zena/view/test_case.rb +56 -7
  307. data/lib/zena/webdav_adapter.rb +8 -8
  308. data/lib/zena/zafu_compiler.rb +25 -0
  309. data/locale/de/LC_MESSAGES/zena.mo +0 -0
  310. data/locale/de/zena.mo +0 -0
  311. data/locale/de/zena.po +920 -781
  312. data/locale/en/LC_MESSAGES/zena.mo +0 -0
  313. data/locale/en/zena.mo +0 -0
  314. data/locale/en/zena.po +530 -405
  315. data/locale/fr/LC_MESSAGES/zena.mo +0 -0
  316. data/locale/fr/zena.mo +0 -0
  317. data/locale/fr/zena.po +588 -432
  318. data/locale/zena.pot +391 -353
  319. data/old_zafu/action.rb +129 -0
  320. data/{lib/zafu → old_zafu}/ajax.rb +0 -24
  321. data/{lib/zafu → old_zafu}/attributes.rb +2 -2
  322. data/{lib/zafu → old_zafu}/calendar.rb +1 -1
  323. data/{lib/zafu → old_zafu}/context.rb +4 -8
  324. data/{lib/zafu → old_zafu}/core/html.rb +1 -1
  325. data/old_zafu/core/move_to_parser.rb +74 -0
  326. data/old_zafu/dates.rb +20 -0
  327. data/{lib/zafu → old_zafu}/display.rb +33 -146
  328. data/{lib/zafu → old_zafu}/eval.rb +0 -0
  329. data/{lib/zafu → old_zafu}/experimental.rb +1 -1
  330. data/{lib/zafu → old_zafu}/i18n.rb +1 -1
  331. data/{lib/zafu → old_zafu}/meta.rb +0 -0
  332. data/old_zafu/query_node.rb +278 -0
  333. data/{lib/zafu → old_zafu}/refactor.rb +2 -12
  334. data/old_zafu/support/context.rb +146 -0
  335. data/{lib/zafu → old_zafu}/support/dom.rb +1 -43
  336. data/{lib/zafu → old_zafu}/support/erb.rb +0 -0
  337. data/{lib/zafu → old_zafu}/support/flow.rb +1 -13
  338. data/old_zafu/support/forms.rb +7 -0
  339. data/old_zafu/support/links.rb +75 -0
  340. data/{lib → old_zafu}/zafu_parser.rb +2 -2
  341. data/public/images/attach_window.png +0 -0
  342. data/public/images/dettach_window.png +0 -0
  343. data/public/images/ext/{contact.png → basecontact.png} +0 -0
  344. data/public/images/toggle_off.png +0 -0
  345. data/public/images/toggle_on.png +0 -0
  346. data/public/images/window/bottom_left.png +0 -0
  347. data/public/images/window/bottom_mid.png +0 -0
  348. data/public/images/window/bottom_right.png +0 -0
  349. data/public/images/window/center_left.png +0 -0
  350. data/public/images/window/center_right.png +0 -0
  351. data/public/images/window/close.png +0 -0
  352. data/public/images/window/maximize.png +0 -0
  353. data/public/images/window/minimize.png +0 -0
  354. data/public/images/window/overlay.png +0 -0
  355. data/public/images/window/sizer.png +0 -0
  356. data/public/images/window/top_left.png +0 -0
  357. data/public/images/window/top_mid.png +0 -0
  358. data/public/images/window/top_right.png +0 -0
  359. data/public/javascripts/builder.js +1 -3
  360. data/public/javascripts/controls.js +3 -5
  361. data/public/javascripts/dragdrop.js +5 -8
  362. data/public/javascripts/effects.js +6 -15
  363. data/public/javascripts/prototype.js +1574 -1020
  364. data/public/javascripts/scriptaculous.js +13 -7
  365. data/public/javascripts/slider.js +5 -7
  366. data/public/javascripts/sound.js +6 -4
  367. data/public/javascripts/unittest.js +69 -71
  368. data/public/javascripts/window.js +1843 -0
  369. data/public/javascripts/zena.js +216 -16
  370. data/public/stylesheets/admin.css +18 -13
  371. data/public/stylesheets/default.css +18 -17
  372. data/public/stylesheets/popup.css +4 -4
  373. data/public/stylesheets/window.css +155 -0
  374. data/public/stylesheets/zena.css +9 -8
  375. data/test/custom_queries/complex.host.yml +8 -8
  376. data/test/fixtures/files/Node-test.zafu +11 -11
  377. data/test/fixtures/files/import.tgz +0 -0
  378. data/test/fixtures/files/simple.zml.gz +0 -0
  379. data/test/fixtures/import/photos.en.zml +3 -3
  380. data/test/fixtures/import/photos/bird.jpg.en.zml +1 -1
  381. data/test/fixtures/import/photos/bird.jpg.fr.zml +1 -1
  382. data/test/fixtures/import/simple.zml +2 -2
  383. data/test/functional/application_controller_test.rb +2 -41
  384. data/test/functional/columns_controller_test.rb +140 -0
  385. data/test/functional/data_entries_controller_test.rb +1 -1
  386. data/test/functional/documents_controller_test.rb +88 -5
  387. data/test/functional/nodes_controller_commit_test.rb +71 -0
  388. data/test/functional/nodes_controller_test.rb +393 -93
  389. data/test/functional/note_controller_test.rb +5 -5
  390. data/test/functional/relations_controller_test.rb +1 -1
  391. data/test/functional/users_controller_test.rb +72 -14
  392. data/test/functional/versions_controller_test.rb +9 -8
  393. data/test/functional/virtual_classes_controller_test.rb +142 -65
  394. data/test/integration/multiple_hosts_test.rb +28 -20
  395. data/test/integration/navigation_test.rb +121 -83
  396. data/test/integration/query_node/basic.yml +128 -0
  397. data/test/integration/query_node/comments.yml +23 -0
  398. data/test/integration/query_node/complex.yml +111 -0
  399. data/test/integration/query_node/dates.yml +22 -0
  400. data/test/integration/query_node/errors.yml +12 -0
  401. data/test/integration/query_node/filters.yml +123 -0
  402. data/test/integration/query_node/properties.yml +41 -0
  403. data/test/integration/query_node/relations.yml +75 -0
  404. data/test/integration/query_node_test.rb +189 -0
  405. data/test/integration/xml_api_test.rb +166 -0
  406. data/test/integration/zafu_compiler/action.yml +67 -0
  407. data/test/integration/zafu_compiler/ajax.yml +263 -0
  408. data/test/{unit/zena/zena_tags → integration/zafu_compiler}/apphelper.yml +0 -0
  409. data/test/integration/zafu_compiler/asset.yml +13 -0
  410. data/test/integration/zafu_compiler/basic.yml +518 -0
  411. data/test/integration/zafu_compiler/calendar.yml +35 -0
  412. data/test/{unit/zena/zena_tags → integration/zafu_compiler}/complex.yml +16 -16
  413. data/test/integration/zafu_compiler/conditional.yml +173 -0
  414. data/test/{unit/zena/zena_tags → integration/zafu_compiler}/data.yml +3 -3
  415. data/test/integration/zafu_compiler/dates.yml +58 -0
  416. data/test/integration/zafu_compiler/display.yml +273 -0
  417. data/test/integration/zafu_compiler/errors.yml +79 -0
  418. data/test/{unit/zena/zena_tags → integration/zafu_compiler}/eval.yml +6 -2
  419. data/test/integration/zafu_compiler/forms.yml +130 -0
  420. data/test/integration/zafu_compiler/i18n.yml +107 -0
  421. data/test/integration/zafu_compiler/later.yml +31 -0
  422. data/test/integration/zafu_compiler/off/off.yml +15 -0
  423. data/test/integration/zafu_compiler/recursion.yml +28 -0
  424. data/test/integration/zafu_compiler/relations.yml +487 -0
  425. data/test/integration/zafu_compiler/roles.yml +28 -0
  426. data/test/{unit/zena/zena_tags → integration/zafu_compiler}/rubyless.yml +10 -9
  427. data/test/integration/zafu_compiler/safe_definitions.yml +65 -0
  428. data/test/integration/zafu_compiler/search.yml +13 -0
  429. data/test/integration/zafu_compiler/security.yml +30 -0
  430. data/test/integration/zafu_compiler/site.yml +14 -0
  431. data/test/integration/zafu_compiler/urls.yml +189 -0
  432. data/test/integration/zafu_compiler/user.yml +32 -0
  433. data/test/integration/zafu_compiler/version.yml +47 -0
  434. data/test/integration/zafu_compiler/workflow.yml +36 -0
  435. data/test/integration/zafu_compiler/zafu_attributes.yml +169 -0
  436. data/test/{unit/zena/zena_tags → integration/zafu_compiler}/zazen.yml +7 -3
  437. data/test/{unit/zena/zena_tags_test.rb → integration/zafu_compiler_test.rb} +137 -57
  438. data/test/sites/complex/nodes.yml +48 -47
  439. data/test/sites/complex/{virtual_classes.yml → roles.yml} +2 -1
  440. data/test/sites/ocean/nodes.yml +7 -7
  441. data/test/sites/ocean/versions.yml +30 -21
  442. data/test/sites/zena/columns.yml +12 -0
  443. data/test/sites/zena/nodes.yml +33 -32
  444. data/test/sites/zena/{virtual_classes.yml → roles.yml} +11 -1
  445. data/test/sites/zena/sites.yml +4 -1
  446. data/test/sites/zena/users.yml +5 -4
  447. data/test/sites/zena/versions.yml +398 -279
  448. data/test/test_helper.rb +2 -1
  449. data/test/test_zena.rb +3 -8
  450. data/test/unit/after_commit_test.rb +103 -0
  451. data/test/unit/attachment_test.rb +266 -0
  452. data/test/unit/base_contact_test.rb +242 -0
  453. data/test/unit/cached_page_test.rb +6 -6
  454. data/test/unit/column_test.rb +77 -0
  455. data/test/unit/comment_test.rb +1 -1
  456. data/test/unit/data_entry_test.rb +8 -2
  457. data/test/unit/document_test.rb +393 -211
  458. data/test/unit/exif_data_test.rb +1 -1
  459. data/test/unit/iformat_test.rb +9 -9
  460. data/test/unit/image_test.rb +358 -284
  461. data/test/unit/multi_version_test.rb +4 -0
  462. data/test/unit/multiversion_test.rb +2 -1013
  463. data/test/unit/node_name_test.rb +137 -0
  464. data/test/unit/node_test.rb +374 -461
  465. data/test/unit/note_test.rb +23 -23
  466. data/test/unit/page_test.rb +23 -23
  467. data/test/unit/project_test.rb +2 -2
  468. data/test/unit/relation_proxy_test.rb +25 -6
  469. data/test/unit/relation_test.rb +156 -24
  470. data/test/unit/role_test.rb +122 -0
  471. data/test/unit/section_test.rb +2 -2
  472. data/test/unit/site_test.rb +48 -12
  473. data/test/unit/skin_test.rb +0 -13
  474. data/test/unit/template_test.rb +361 -314
  475. data/test/unit/text_document_test.rb +105 -33
  476. data/test/unit/transparent_version_test.rb +4 -0
  477. data/test/unit/user_test.rb +10 -10
  478. data/test/unit/version_test.rb +209 -301
  479. data/test/unit/virtual_class_test.rb +21 -29
  480. data/test/unit/workflow_test.rb +1075 -0
  481. data/test/unit/zena/acts/enrollable_test.rb +211 -0
  482. data/test/unit/{secure_test.rb → zena/acts/secure_test.rb} +190 -105
  483. data/test/unit/zena/acts/serializable_test.rb +85 -0
  484. data/test/unit/zena/db_test.rb +27 -14
  485. data/test/unit/zena/parser/zazen.yml +1 -1
  486. data/test/unit/zena/use/action_test.rb +109 -0
  487. data/test/unit/zena/use/calendar_test.rb +8 -8
  488. data/test/unit/zena/use/dates_test.rb +10 -0
  489. data/test/unit/zena/use/dates_view_methods_test.rb +8 -12
  490. data/test/unit/zena/use/fulltext_test.rb +82 -0
  491. data/test/unit/zena/use/html_tags_test.rb +225 -201
  492. data/test/unit/zena/use/i18n_test.rb +56 -26
  493. data/test/unit/zena/use/ml_index_test.rb +129 -0
  494. data/test/unit/zena/use/nested_attributes_alias_view_test.rb +10 -10
  495. data/test/unit/zena/use/query_node_test.rb +104 -0
  496. data/test/unit/zena/use/refactor_test.rb +4 -15
  497. data/test/unit/zena/use/rendering_test.rb +23 -16
  498. data/test/unit/zena/use/upload_test.rb +2 -2
  499. data/test/unit/zena/use/urls_test.rb +2 -0
  500. data/test/unit/zena/use/version_hash_test.rb +126 -0
  501. data/test/unit/zena/use/zafu_template_test.rb +135 -0
  502. data/test/unit/zena/use/zazen_test.rb +85 -61
  503. data/vendor/plugins/gettext_i18n_rails/README.markdown +26 -22
  504. data/vendor/plugins/gettext_i18n_rails/Rakefile +31 -5
  505. data/vendor/plugins/gettext_i18n_rails/VERSION +1 -0
  506. data/vendor/plugins/gettext_i18n_rails/gettext_i18n_rails.gemspec +64 -0
  507. data/vendor/plugins/gettext_i18n_rails/init.rb +7 -3
  508. data/vendor/plugins/gettext_i18n_rails/lib/gettext_i18n_rails.rb +5 -6
  509. data/vendor/plugins/gettext_i18n_rails/lib/gettext_i18n_rails/active_record.rb +6 -2
  510. data/vendor/plugins/gettext_i18n_rails/lib/gettext_i18n_rails/backend.rb +1 -1
  511. data/vendor/plugins/gettext_i18n_rails/lib/gettext_i18n_rails/model_attributes_finder.rb +2 -2
  512. data/vendor/plugins/gettext_i18n_rails/{tasks → lib/tasks}/gettext_rails_i18n.rake +10 -9
  513. data/vendor/plugins/gettext_i18n_rails/spec/gettext_i18n_rails/action_controller_spec.rb +7 -3
  514. data/vendor/plugins/gettext_i18n_rails/spec/gettext_i18n_rails/active_record_spec.rb +7 -5
  515. data/vendor/plugins/gettext_i18n_rails/spec/gettext_i18n_rails/backend_spec.rb +7 -7
  516. data/vendor/plugins/gettext_i18n_rails/spec/gettext_i18n_rails_spec.rb +4 -0
  517. data/vendor/plugins/gettext_i18n_rails/spec/spec_helper.rb +11 -9
  518. data/vendor/plugins/mysql_timezone_utc/init.rb +1 -0
  519. data/vendor/plugins/mysql_timezone_utc/lib/mysql_timezone_utc.rb +14 -0
  520. data/vendor/plugins/postgresql_timezone_utc/init.rb +1 -0
  521. data/vendor/plugins/postgresql_timezone_utc/lib/postgresql_timezone_utc.rb +14 -0
  522. data/zena.gemspec +281 -123
  523. metadata +354 -160
  524. data/app/models/contact.rb +0 -32
  525. data/app/models/document_version.rb +0 -13
  526. data/app/models/image_version.rb +0 -21
  527. data/app/models/text_document_version.rb +0 -29
  528. data/app/views/templates/defaults/+adminLayout.zafu +0 -69
  529. data/bricks/captcha/patch/application_controller.rb +0 -10
  530. data/bricks/captcha/patch/application_helper.rb +0 -32
  531. data/bricks/captcha/patch/site.rb +0 -2
  532. data/bricks/captcha/zafu/captcha.rb +0 -29
  533. data/bricks/tags/patch/node.rb +0 -15
  534. data/bricks/tags/test/zafu/tags.yml +0 -40
  535. data/db/schema.rb +0 -295
  536. data/lib/zafu/action.rb +0 -285
  537. data/lib/zafu/core/move_to_parser.rb +0 -167
  538. data/lib/zafu/dates.rb +0 -58
  539. data/lib/zafu/support/context.rb +0 -265
  540. data/lib/zafu/support/forms.rb +0 -461
  541. data/lib/zafu/support/links.rb +0 -306
  542. data/lib/zena/acts/multiversion.rb +0 -755
  543. data/lib/zena/fix/mysql_connection.rb +0 -17
  544. data/lib/zena/use/query_node_finders.rb +0 -91
  545. data/lib/zena/use/zafu.rb +0 -514
  546. data/test/helpers/query_node/basic.yml +0 -149
  547. data/test/helpers/query_node/comments.yml +0 -18
  548. data/test/helpers/query_node/complex.yml +0 -98
  549. data/test/helpers/query_node/filters.yml +0 -110
  550. data/test/helpers/query_node/relations.yml +0 -43
  551. data/test/helpers/query_node_test.rb +0 -116
  552. data/test/sites/ocean/contact_contents.yml +0 -19
  553. data/test/sites/ocean/template_contents.yml +0 -8
  554. data/test/sites/zena/contact_contents.yml +0 -55
  555. data/test/sites/zena/document_contents.yml +0 -76
  556. data/test/sites/zena/dyn_attributes.yml +0 -43
  557. data/test/sites/zena/template_contents.yml +0 -103
  558. data/test/unit/contact_content_test.rb +0 -33
  559. data/test/unit/contact_test.rb +0 -39
  560. data/test/unit/contact_version_test.rb +0 -48
  561. data/test/unit/document_content_test.rb +0 -110
  562. data/test/unit/document_version_test.rb +0 -11
  563. data/test/unit/dyn_attributes_test.rb +0 -229
  564. data/test/unit/image_content_test.rb +0 -154
  565. data/test/unit/image_version_test.rb +0 -18
  566. data/test/unit/template_content_test.rb +0 -9
  567. data/test/unit/text_document_version_test.rb +0 -37
  568. data/test/unit/zena/use/zafu_test.rb +0 -41
  569. data/test/unit/zena/zena_tags/ajax.yml +0 -233
  570. data/test/unit/zena/zena_tags/basic.yml +0 -1306
  571. data/test/unit/zena/zena_tags/errors.yml +0 -71
  572. data/test/unit/zena/zena_tags/relations.yml +0 -405
data/app/models/skin.rb CHANGED
@@ -1,19 +1,4 @@
1
- # A skin is a master template containing all sub templates and css to render a full site or sectioon
1
+ # A skin is a container for templates and css to render a full site or sectioon
2
2
  # of a site.
3
3
  class Skin < Section
4
- before_save :set_need_skin_name_update
5
- after_save :update_skin_name
6
-
7
- private
8
-
9
- def set_need_skin_name_update
10
- @need_skin_name_update = !new_record? && name_changed?
11
- true # save can continue
12
- end
13
-
14
- def update_skin_name
15
- return unless @need_skin_name_update
16
- # FIXME: when moving a template or a page that is a parent of a template: we must sync skin_name after spread_project_and_section.
17
- Skin.connection.execute "UPDATE template_contents SET skin_name = #{Zena::Db.quote(name)} WHERE template_contents.node_id IN (SELECT id FROM nodes WHERE nodes.section_id = #{Zena::Db.quote(self[:id])}) AND template_contents.site_id = #{Zena::Db.quote(self[:site_id])}"
18
- end
19
4
  end
@@ -1,91 +1,109 @@
1
1
  =begin rdoc
2
2
  Definitions:
3
3
 
4
- * master template: used to render a node. It is used depending on it's 'klass' filter.
4
+ * master template: used to render a node. It is used depending on it's 'target_klass' filter.
5
5
  * helper template: included into another template.
6
6
 
7
7
  Render ---> Master template --include--> helper template --include--> ...
8
8
 
9
- For master templates, the name is build from the different filters (klass, mode, format):
9
+ For master templates, the node_name is build from the different filters (target_klass, mode, format):
10
10
 
11
11
  Klass-mode-format. Examples: Node-index, Node--xml, Project-info. Note how the format is omitted when it is 'html'.
12
12
 
13
- Other templates have a name built from the given name, just like any other node.
13
+ Other templates have a node_name built from the given name, just like any other node.
14
14
 
15
15
  =end
16
16
  class Template < TextDocument
17
- validate :valid_section
18
- after_save :update_content
19
17
 
18
+ property do |p|
19
+ p.string 'target_klass'
20
+ p.string 'format'
21
+ p.string 'mode'
22
+ p.string 'tkpath'
23
+
24
+ p.index(IdxTemplate) do |record|
25
+ {
26
+ 'format' => record.format,
27
+ 'mode' => record.mode,
28
+ 'tkpath' => record.tkpath,
29
+ 'skin_id' => record[:section_id],
30
+ }
31
+ end
32
+
33
+ safe_property :tkpath, :mode, :target_klass, :format
34
+ end
35
+
36
+ attr_protected :tkpath
37
+ validate :validate_section, :validate_target_klass
38
+ before_validation :template_content_before_validation
39
+
40
+ # Class Methods
20
41
  class << self
21
42
  def accept_content_type?(content_type)
22
43
  content_type =~ /text\/(html|zafu)/
23
44
  end
45
+ end # Class Methods
24
46
 
25
- def version_class
26
- TemplateVersion
27
- end
47
+ def filename
48
+ "#{title}.#{ext}"
49
+ end
50
+
51
+ def skin
52
+ @skin ||= secure(Skin) { Skin.find(prop['skin_id']) }
28
53
  end
29
54
 
30
55
  private
31
56
 
32
57
  def set_defaults
33
- # only set name from version title on creation
34
- if name_changed?
35
- new_name = self.name
36
- elsif version.title_changed?
37
- new_name = version.title
38
- else
39
- new_name = nil
40
- end
58
+ super
59
+
60
+ # Force template extension to zafu
61
+ self.ext = 'zafu'
62
+
63
+ # Force template content-type to 'text/zafu'
64
+ self.content_type = 'text/zafu'
41
65
 
42
- if new_name && !new_name.blank?
43
- if new_name =~ /^([A-Z][a-zA-Z]+?)(-(([a-zA-Z_\+]*)(-([a-zA-Z_]+)|))|)(\.|\Z)/
44
- # name/title changed force template_content update
45
- content = redaction.redaction_content
46
- content.klass = $1 unless content.klass_changed?
47
- content.mode = ($4 || '').url_name unless content.mode_changed?
48
- content.format = ($6 || 'html') unless content.format_changed?
66
+ if node_name_changed?
67
+ if node_name =~ /^([A-Z][a-zA-Z]+?)(-(([a-zA-Z_\+]*)(-([a-zA-Z_]+)|))|)(\.|\Z)/
68
+ # node_name/title changed force update
69
+ prop['target_klass'] = $1 unless prop.target_klass_changed?
70
+ prop['mode'] = ($4 || '').url_name unless prop.mode_changed?
71
+ prop['format'] = ($6 || 'html') unless prop.format_changed?
49
72
  else
50
- # name set but it is not a master template name
51
- content = redaction.redaction_content
52
- content.klass = nil
53
- content.mode = nil
54
- content.format = nil
55
- if new_name =~ /(.*)\.zafu$/
56
- self.name = $1
57
- end
73
+ # node_name set but it is not a master template name
74
+ prop['target_klass'] = nil
75
+ prop['mode'] = nil
76
+ prop['format'] = nil
58
77
  end
59
78
  end
60
79
 
61
- if version.content.changed?
62
- content = version.content
63
- content.mode = content.mode.url_name if content.mode
80
+ if version.edited?
81
+ prop['mode'] = prop['mode'].url_name if prop['mode']
64
82
 
65
- if !content.klass.blank?
66
- # update name
67
- content.format = 'html' if content.format.blank?
68
- self[:name] = name_from_content(:format => content.format, :mode => content.mode, :klass => content.klass)
69
- version.title = self[:name]
83
+ if !prop['target_klass'].blank?
84
+ # update node_name
85
+ prop['format'] = 'html' if prop['format'].blank?
86
+ self.node_name = node_name_from_mode_and_format
87
+ self.title = self.node_name
70
88
 
71
- if version.text.blank? && content.format == 'html' && content.mode != '+edit'
89
+ if text.blank? && prop['format'] == 'html' && prop['mode'] != '+edit'
72
90
  # set a default text
73
91
 
74
- if content.klass == 'Node'
75
- version.text = <<END_TXT
92
+ if prop['target_klass'] == 'Node'
93
+ self.text = <<END_TXT
76
94
  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
77
95
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
78
96
  <html xmlns="http://www.w3.org/1999/xhtml" do='void' lang="en" set_lang='[v_lang]' xml:lang='en'>
79
97
  <head do='void' name='head'>
80
- <title do='title_for_layout' do='show' attr='v_title' name='page_title'>page title</title>
98
+ <title do='title_for_layout' do='show' attr='title' name='page_title'>page title</title>
81
99
  <!-- link href='favicon.png' rel='shortcut icon' type='image/png' / -->
82
100
  <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
83
101
  <r:void name='stylesheets'>
84
- <r:stylesheets list='reset,zena,code'/>
102
+ <r:stylesheets/>
85
103
  <link href="style.css" rel="Stylesheet" type="text/css"/>
86
104
  </r:void>
87
105
 
88
- <r:javascripts list='prototype,effects,zena'/>
106
+ <r:javascripts/>
89
107
  <r:uses_datebox/>
90
108
  </head>
91
109
  <body>
@@ -96,34 +114,46 @@ class Template < TextDocument
96
114
  </html>
97
115
  END_TXT
98
116
  else
99
- version.text = "<r:include template='Node'/>\n"
117
+ self.text = "<r:include template='Node'/>\n"
100
118
  end
101
119
  end
102
120
  end
103
121
  end
104
-
105
- super
106
122
  end
107
123
 
108
- def valid_section
109
- @need_skin_name_update = !new_record? && section_id_changed?
110
- errors.add('parent_id', 'Invalid parent (section is not a Skin)') unless section.kind_of?(Skin)
111
- end
112
-
113
- def name_from_content(opts={})
114
- opts[:format] ||= version.content.format
115
- opts[:mode ] ||= version.content.mode
116
- opts[:klass ] ||= version.content.klass
124
+ def node_name_from_mode_and_format(opts={})
125
+ opts[:format] ||= prop['format']
126
+ opts[:mode ] ||= prop['mode']
127
+ opts[:target_klass ] ||= prop['target_klass']
117
128
  format = opts[:format] == 'html' ? '' : "-#{opts[:format]}"
118
129
  mode = (!opts[:mode].blank? || format != '') ? "-#{opts[:mode]}" : ''
119
- "#{opts[:klass]}#{mode}#{format}"
130
+ "#{opts[:target_klass]}#{mode}#{format}"
120
131
  end
121
132
 
122
- def update_content
123
- if @need_skin_name_update
124
- Template.connection.execute "UPDATE template_contents SET skin_name = #{Template.connection.quote(section[:name])} WHERE node_id = #{Template.connection.quote(self[:id])}"
125
- @need_skin_name_update = nil
133
+ def validate_section
134
+ errors.add('parent_id', 'invalid (section is not a Skin)') unless section.kind_of?(Skin)
135
+ end
136
+
137
+ def validate_target_klass
138
+ if prop.target_klass_changed? && prop['target_klass']
139
+ errors.add('format', "can't be blank") unless prop['format']
140
+ # this is a master template (found when choosing the template for rendering)
141
+ if target_klass = Node.get_class(prop['target_klass'])
142
+ prop['tkpath'] = target_klass.kpath
143
+ else
144
+ errors.add('target_klass', 'invalid')
145
+ end
126
146
  end
127
147
  end
128
148
 
149
+ def template_content_before_validation
150
+ prop['mode'] = nil if prop['mode' ].blank?
151
+ prop['target_klass'] = nil if prop['target_klass'].blank?
152
+ unless prop['target_klass']
153
+ # this template is not meant to be accessed directly (partial used for inclusion)
154
+ prop['tkpath'] = nil
155
+ prop['mode'] = nil
156
+ prop['format'] = nil
157
+ end
158
+ end
129
159
  end
@@ -1,7 +1,12 @@
1
+ class TemplateContent < ActiveRecord::Base
2
+ end
3
+ =begin
4
+ TODO: cleanup
5
+
1
6
  class TemplateContent < ActiveRecord::Base
2
7
  include Zena::Use::Upload::UploadedFile
3
8
 
4
- include RubyLess::SafeClass
9
+ include RubyLess
5
10
  safe_attribute :tkpath, :skin_name, :mode, :klass
6
11
  safe_method :ext => String, :format => String, :content_type => String, :filename => String
7
12
  #attr_public :file ?
@@ -12,8 +17,8 @@ class TemplateContent < ActiveRecord::Base
12
17
  before_validation :template_content_before_validation
13
18
  validate :validate_template_content
14
19
 
15
- extend Zena::Acts::Multiversion
16
- act_as_content
20
+ # extend Zena::Acts::Multiversion
21
+ # act_as_content
17
22
 
18
23
  def preload_version(v)
19
24
  # dummy called by Version
@@ -37,7 +42,7 @@ class TemplateContent < ActiveRecord::Base
37
42
  end
38
43
 
39
44
  def size(format=nil)
40
- version.text.size
45
+ text.size
41
46
  end
42
47
 
43
48
  def filename
@@ -55,11 +60,11 @@ class TemplateContent < ActiveRecord::Base
55
60
 
56
61
  def file=(file)
57
62
  @new_file = file
58
- version.text = file.read
63
+ text = file.read
59
64
  end
60
65
 
61
66
  def file(mode=nil)
62
- @new_file ||= StringIO.new(version.text)
67
+ @new_file ||= StringIO.new(text)
63
68
  end
64
69
 
65
70
  def version
@@ -112,3 +117,4 @@ class TemplateContent < ActiveRecord::Base
112
117
  end
113
118
  end
114
119
  end
120
+ =end
@@ -10,25 +10,28 @@ The version class used by text documents is the TextDocumentVersion.
10
10
  Content (file data) is stored in the TextDocumentVersion. The content class (TextDocumentContent) is responsible for faking the exitence of a real file.
11
11
  =end
12
12
  class TextDocument < Document
13
+
14
+ # Class Methods
13
15
  class << self
14
16
  # Return true if a new text document can be created with the content_type. Used by the superclass Document to choose the corret subclass when creating a new object.
15
17
  def accept_content_type?(content_type)
16
18
  (content_type =~ /^(text)/ && Zena::TYPE_TO_EXT[content_type.chomp] != ['rtf']) || (content_type =~ /x-javascript/)
17
19
  end
18
20
 
19
- def version_class
20
- TextDocumentVersion
21
+ # Return true if the content_type can change independantly from the file
22
+ def accept_content_type_change?
23
+ true
21
24
  end
22
- end
25
+ end # Class Methods
23
26
 
24
27
 
25
28
  def can_parse_assets?
26
- return ['text/css'].include?(version.content.content_type)
29
+ return ['text/css'].include?(content_type)
27
30
  end
28
31
 
29
32
  # Parse text content and replace all reference to relative urls ('img/footer.png') by their zen_path ('/en/image34.png')
30
33
  def parse_assets(text, helper, key)
31
- if key == 'v_text' && version.content.content_type == 'text/css'
34
+ if key == 'text' && prop['content_type'] == 'text/css'
32
35
  res = text.dup
33
36
  # use skin as root
34
37
  skin = section
@@ -40,7 +43,7 @@ class TextDocument < Document
40
43
  return text
41
44
  end
42
45
 
43
- current_folder = parent.fullpath
46
+ current_dir = parent.fullpath
44
47
 
45
48
  res.gsub!(/url\(\s*(.*?)\s*\)/) do
46
49
  match, src = $&, $1
@@ -66,7 +69,11 @@ class TextDocument < Document
66
69
  "url(#{quote}#{src}#{quote})"
67
70
  end
68
71
  else
69
- if new_src = helper.send(:template_url_for_asset, :src => src, :current_folder=>current_folder, :parse_assets => true)
72
+ if new_src = helper.send(:template_url_for_asset,
73
+ :src => src,
74
+ :base_path => current_dir,
75
+ :parse_assets => true )
76
+
70
77
  "url(#{quote}#{new_src}#{quote})"
71
78
  elsif !(src =~ /\.\./) && File.exist?(File.join(SITES_ROOT, current_site.public_path, src))
72
79
  "url(#{quote}#{src}?#{File.mtime(File.join(SITES_ROOT, current_site.public_path, src)).to_i}#{quote})"
@@ -83,12 +90,35 @@ class TextDocument < Document
83
90
  res
84
91
  end
85
92
 
93
+ def file=(file)
94
+ @new_file = file
95
+ self.text = @new_file.read
96
+ end
97
+
98
+ def file(format=nil)
99
+ @loaded_file ||= @new_file || StringIO.new(text)
100
+ end
101
+
102
+ def filename
103
+ "#{title}.#{ext}"
104
+ end
105
+
106
+ # Get the file path defined in attachment.
107
+ def filepath(format=nil)
108
+ nil
109
+ end
110
+
111
+ # Return document file size (= version's text size).
112
+ def size(format=nil)
113
+ (text || '').size
114
+ end
115
+
86
116
  # Parse text and replace absolute urls ('/en/image30.jpg') by their relative value in the current skin ('img/bird.jpg')
87
117
  def unparse_assets(text, helper, key)
88
- if key == 'v_text' && version.content.content_type == 'text/css'
118
+ if key == 'text' && prop['content_type'] == 'text/css'
89
119
  res = text.dup
90
120
  # use parent as relative root
91
- current_folder = parent.fullpath
121
+ current_dir = parent.fullpath
92
122
 
93
123
  res.gsub!(/url\(('|")(.*?)\1\)/) do
94
124
  if $2[0..6] == 'http://'
@@ -98,10 +128,10 @@ class TextDocument < Document
98
128
  if url =~ /\A\/\w\w\/.*?(\d+)(_\w+|)\./
99
129
  zip, mode = $1, $2
100
130
  if asset = secure(Node) { Node.find_by_zip(zip) }
101
- if asset.fullpath =~ /\A#{current_folder}\/(.+)/
102
- "url(#{quote}#{$1}#{mode}.#{asset.version.content.ext}#{quote})"
131
+ if asset.fullpath =~ /\A#{current_dir}\/(.+)/
132
+ "url(#{quote}#{$1}#{mode}.#{asset.prop['ext']}#{quote})"
103
133
  else
104
- "url(#{quote}/#{asset.fullpath}#{mode}.#{asset.version.content.ext}#{quote})"
134
+ "url(#{quote}/#{asset.fullpath}#{mode}.#{asset.prop['ext']}#{quote})"
105
135
  end
106
136
  else
107
137
  errors.add('asset', '{{zip}} not found', :zip => zip)
@@ -122,46 +152,49 @@ class TextDocument < Document
122
152
  end
123
153
  end
124
154
 
125
- # List of keys to export in a zml file. "v_text" is ignored since it's exported in a separate file.
155
+ # List of keys to export in a zml file. "text" is ignored since it's exported in a separate file.
126
156
  def export_keys
127
157
  h = super
128
- h[:zazen].delete('v_text')
158
+ h[:zazen].delete('text')
129
159
  h
130
160
  end
131
161
 
132
162
  # List of keys which need transformations
133
163
  def parse_keys
134
- (super + (version.content.content_type == 'text/css' ? ['v_text'] : [])).uniq
135
- end
136
-
137
- # Return the code language used for syntax highlighting.
138
- def content_lang
139
- ctype = version.content.content_type
140
- if ctype =~ /^text\/(.*)/
141
- case $1
142
- when 'x-ruby-script'
143
- 'ruby'
144
- when 'html', 'zafu'
145
- 'zafu'
146
- else
147
- $1
148
- end
149
- else
150
- nil
151
- end
164
+ (super + (content_type == 'text/css' ? ['text'] : [])).uniq
152
165
  end
153
166
 
154
167
  private
168
+ class AssetHelper
169
+ attr_accessor :visitor
170
+ include Zena::Acts::Secure # secure
171
+ include Zena::Use::Zazen::ViewMethods # make_image, ...
172
+ include Zena::Use::ZafuTemplates::Common # template_url_for_asset
173
+ include Zena::Use::Urls::Common # data_path
174
+ end
155
175
 
156
176
  # Overwrite superclass (DocumentContent) behavior
157
177
  def valid_file
158
178
  return true
159
179
  end
160
180
 
161
- def document_before_validation
181
+ def set_defaults
162
182
  super
163
- content = version.content
164
- content[:content_type] ||= 'text/plain'
165
- content[:ext] ||= 'txt'
183
+ self.content_type = 'text/plain' if content_type.blank?
184
+ self.ext = 'txt' if ext.blank?
185
+ parse_assets_text_assets
186
+ end
187
+
188
+ # Called from Document#set_defaults
189
+ def set_attachment_filename
190
+ # do nothing
191
+ end
192
+
193
+ def parse_assets_text_assets
194
+ if can_parse_assets? && prop.text_changed?
195
+ helper = AssetHelper.new
196
+ helper.visitor = visitor
197
+ self.text = parse_assets(self.text, helper, 'text')
198
+ end
166
199
  end
167
200
  end