actionpack 2.3.18 → 3.0.0.beta

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of actionpack might be problematic. Click here for more details.

Files changed (513) hide show
  1. data/CHANGELOG +15 -64
  2. data/README +39 -48
  3. data/lib/abstract_controller.rb +22 -0
  4. data/lib/abstract_controller/base.rb +191 -0
  5. data/lib/abstract_controller/callbacks.rb +113 -0
  6. data/lib/abstract_controller/collector.rb +30 -0
  7. data/lib/abstract_controller/compatibility.rb +18 -0
  8. data/lib/abstract_controller/helpers.rb +163 -0
  9. data/lib/abstract_controller/layouts.rb +413 -0
  10. data/lib/abstract_controller/localized_cache.rb +49 -0
  11. data/lib/abstract_controller/logger.rb +13 -0
  12. data/lib/abstract_controller/rendering.rb +238 -0
  13. data/lib/{action_controller → abstract_controller}/translation.rb +1 -1
  14. data/lib/action_controller.rb +68 -102
  15. data/lib/action_controller/base.rb +77 -1409
  16. data/lib/action_controller/caching.rb +58 -45
  17. data/lib/action_controller/caching/actions.rb +100 -114
  18. data/lib/action_controller/caching/fragments.rb +17 -19
  19. data/lib/action_controller/caching/pages.rb +12 -6
  20. data/lib/action_controller/caching/sweeping.rb +42 -0
  21. data/lib/action_controller/deprecated.rb +5 -0
  22. data/lib/action_controller/deprecated/dispatcher.rb +28 -0
  23. data/lib/action_controller/deprecated/integration_test.rb +2 -0
  24. data/lib/action_controller/deprecated/performance_test.rb +1 -0
  25. data/lib/action_controller/metal.rb +125 -0
  26. data/lib/action_controller/metal/compatibility.rb +141 -0
  27. data/lib/action_controller/metal/conditional_get.rb +86 -0
  28. data/lib/action_controller/metal/configuration.rb +28 -0
  29. data/lib/action_controller/metal/cookies.rb +17 -0
  30. data/lib/action_controller/metal/exceptions.rb +46 -0
  31. data/lib/action_controller/metal/flash.rb +28 -0
  32. data/lib/action_controller/metal/head.rb +33 -0
  33. data/lib/action_controller/metal/helpers.rb +116 -0
  34. data/lib/action_controller/metal/hide_actions.rb +50 -0
  35. data/lib/action_controller/{http_authentication.rb → metal/http_authentication.rb} +18 -15
  36. data/lib/action_controller/metal/instrumentation.rb +99 -0
  37. data/lib/action_controller/metal/mime_responds.rb +300 -0
  38. data/lib/action_controller/metal/rack_delegation.rb +35 -0
  39. data/lib/action_controller/metal/redirecting.rb +90 -0
  40. data/lib/action_controller/metal/renderers.rb +95 -0
  41. data/lib/action_controller/metal/rendering.rb +69 -0
  42. data/lib/action_controller/metal/request_forgery_protection.rb +115 -0
  43. data/lib/action_controller/metal/rescue.rb +13 -0
  44. data/lib/action_controller/metal/responder.rb +220 -0
  45. data/lib/action_controller/{session_management.rb → metal/session_management.rb} +5 -14
  46. data/lib/action_controller/{streaming.rb → metal/streaming.rb} +13 -12
  47. data/lib/action_controller/metal/testing.rb +42 -0
  48. data/lib/action_controller/metal/url_for.rb +157 -0
  49. data/lib/action_controller/{verification.rb → metal/verification.rb} +41 -41
  50. data/lib/action_controller/middleware.rb +38 -0
  51. data/lib/action_controller/polymorphic_routes.rb +20 -26
  52. data/lib/action_controller/railtie.rb +30 -0
  53. data/lib/action_controller/railties/subscriber.rb +63 -0
  54. data/lib/action_controller/record_identifier.rb +3 -16
  55. data/lib/action_controller/test_case.rb +156 -18
  56. data/lib/action_controller/url_rewriter.rb +47 -200
  57. data/lib/action_controller/vendor/html-scanner.rb +16 -12
  58. data/lib/action_controller/vendor/html-scanner/html/node.rb +1 -1
  59. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +12 -9
  60. data/lib/action_dispatch.rb +88 -0
  61. data/lib/action_dispatch/http/cache.rb +123 -0
  62. data/lib/action_dispatch/http/filter_parameters.rb +98 -0
  63. data/lib/{action_controller → action_dispatch/http}/headers.rb +8 -8
  64. data/lib/action_dispatch/http/mime_negotiation.rb +101 -0
  65. data/lib/{action_controller → action_dispatch/http}/mime_type.rb +30 -11
  66. data/lib/{action_controller → action_dispatch/http}/mime_types.rb +5 -3
  67. data/lib/action_dispatch/http/parameters.rb +49 -0
  68. data/lib/action_dispatch/http/request.rb +223 -0
  69. data/lib/action_dispatch/http/response.rb +209 -0
  70. data/lib/action_dispatch/http/upload.rb +48 -0
  71. data/lib/action_dispatch/http/url.rb +129 -0
  72. data/lib/action_dispatch/middleware/callbacks.rb +50 -0
  73. data/lib/action_dispatch/middleware/cascade.rb +29 -0
  74. data/lib/action_dispatch/middleware/cookies.rb +216 -0
  75. data/lib/{action_controller → action_dispatch/middleware}/flash.rb +51 -90
  76. data/lib/action_dispatch/middleware/head.rb +18 -0
  77. data/lib/action_dispatch/middleware/params_parser.rb +78 -0
  78. data/lib/action_dispatch/middleware/rescue.rb +26 -0
  79. data/lib/action_dispatch/middleware/session/abstract_store.rb +209 -0
  80. data/lib/{action_controller → action_dispatch/middleware}/session/cookie_store.rb +56 -60
  81. data/lib/action_dispatch/middleware/session/mem_cache_store.rb +47 -0
  82. data/lib/action_dispatch/middleware/show_exceptions.rb +173 -0
  83. data/lib/{action_controller/middleware_stack.rb → action_dispatch/middleware/stack.rb} +23 -13
  84. data/lib/action_dispatch/middleware/static.rb +44 -0
  85. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/_request_and_response.erb +10 -3
  86. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/_trace.erb +4 -4
  87. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +10 -0
  88. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/layout.erb +2 -2
  89. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/missing_template.erb +0 -0
  90. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/routing_error.erb +0 -0
  91. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/template_error.erb +3 -3
  92. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/unknown_action.erb +0 -0
  93. data/lib/action_dispatch/railtie.rb +15 -0
  94. data/lib/action_dispatch/routing.rb +217 -0
  95. data/lib/action_dispatch/routing/deprecated_mapper.rb +877 -0
  96. data/lib/action_dispatch/routing/mapper.rb +649 -0
  97. data/lib/action_dispatch/routing/route.rb +55 -0
  98. data/lib/action_dispatch/routing/route_set.rb +445 -0
  99. data/lib/action_dispatch/testing/assertions.rb +21 -0
  100. data/lib/action_dispatch/testing/assertions/dom.rb +37 -0
  101. data/lib/{action_controller/assertions/model_assertions.rb → action_dispatch/testing/assertions/model.rb} +2 -4
  102. data/lib/action_dispatch/testing/assertions/response.rb +154 -0
  103. data/lib/{action_controller/assertions/routing_assertions.rb → action_dispatch/testing/assertions/routing.rb} +72 -34
  104. data/lib/{action_controller/assertions/selector_assertions.rb → action_dispatch/testing/assertions/selector.rb} +14 -11
  105. data/lib/{action_controller/assertions/tag_assertions.rb → action_dispatch/testing/assertions/tag.rb} +25 -14
  106. data/lib/{action_controller → action_dispatch/testing}/integration.rb +173 -406
  107. data/lib/action_dispatch/testing/performance_test.rb +17 -0
  108. data/lib/action_dispatch/testing/test_process.rb +42 -0
  109. data/lib/action_dispatch/testing/test_request.rb +83 -0
  110. data/lib/action_dispatch/testing/test_response.rb +136 -0
  111. data/lib/action_pack/version.rb +3 -3
  112. data/lib/action_view.rb +29 -26
  113. data/lib/action_view/base.rb +101 -148
  114. data/lib/action_view/context.rb +44 -0
  115. data/lib/action_view/helpers.rb +6 -4
  116. data/lib/action_view/helpers/{active_record_helper.rb → active_model_helper.rb} +63 -63
  117. data/lib/action_view/helpers/asset_tag_helper.rb +166 -31
  118. data/lib/action_view/helpers/cache_helper.rb +1 -1
  119. data/lib/action_view/helpers/capture_helper.rb +40 -8
  120. data/lib/action_view/helpers/csrf_helper.rb +2 -4
  121. data/lib/action_view/helpers/date_helper.rb +14 -15
  122. data/lib/action_view/helpers/form_helper.rb +121 -24
  123. data/lib/action_view/helpers/form_options_helper.rb +26 -25
  124. data/lib/action_view/helpers/form_tag_helper.rb +42 -33
  125. data/lib/action_view/helpers/javascript_helper.rb +1 -109
  126. data/lib/action_view/helpers/number_helper.rb +4 -1
  127. data/lib/action_view/helpers/prototype_helper.rb +75 -499
  128. data/lib/action_view/helpers/raw_output_helper.rb +1 -1
  129. data/lib/action_view/helpers/record_tag_helper.rb +3 -3
  130. data/lib/action_view/helpers/sanitize_helper.rb +3 -2
  131. data/lib/action_view/helpers/scriptaculous_helper.rb +89 -53
  132. data/lib/action_view/helpers/tag_helper.rb +12 -13
  133. data/lib/action_view/helpers/text_helper.rb +33 -38
  134. data/lib/action_view/helpers/translation_helper.rb +11 -35
  135. data/lib/action_view/helpers/url_helper.rb +140 -134
  136. data/lib/action_view/locale/en.yml +34 -28
  137. data/lib/action_view/paths.rb +27 -24
  138. data/lib/action_view/railtie.rb +17 -0
  139. data/lib/action_view/railties/subscriber.rb +24 -0
  140. data/lib/action_view/{partials.rb → render/partials.rb} +161 -51
  141. data/lib/action_view/render/rendering.rb +117 -0
  142. data/lib/action_view/template.rb +88 -217
  143. data/lib/action_view/template/error.rb +105 -0
  144. data/lib/action_view/template/handler.rb +41 -0
  145. data/lib/action_view/template/handlers.rb +54 -0
  146. data/lib/action_view/{template_handlers → template/handlers}/builder.rb +6 -6
  147. data/lib/action_view/template/handlers/erb.rb +58 -0
  148. data/lib/action_view/{template_handlers → template/handlers}/rjs.rb +8 -3
  149. data/lib/action_view/template/resolver.rb +164 -0
  150. data/lib/action_view/template/text.rb +40 -0
  151. data/lib/action_view/test_case.rb +18 -18
  152. metadata +165 -420
  153. data/RUNNING_UNIT_TESTS +0 -24
  154. data/Rakefile +0 -158
  155. data/install.rb +0 -30
  156. data/lib/action_controller/assertions/dom_assertions.rb +0 -55
  157. data/lib/action_controller/assertions/response_assertions.rb +0 -169
  158. data/lib/action_controller/benchmarking.rb +0 -107
  159. data/lib/action_controller/caching/sweeper.rb +0 -45
  160. data/lib/action_controller/cgi_ext.rb +0 -15
  161. data/lib/action_controller/cgi_ext/cookie.rb +0 -112
  162. data/lib/action_controller/cgi_ext/query_extension.rb +0 -22
  163. data/lib/action_controller/cgi_ext/stdinput.rb +0 -24
  164. data/lib/action_controller/cgi_process.rb +0 -77
  165. data/lib/action_controller/cookies.rb +0 -197
  166. data/lib/action_controller/dispatcher.rb +0 -133
  167. data/lib/action_controller/failsafe.rb +0 -87
  168. data/lib/action_controller/filters.rb +0 -680
  169. data/lib/action_controller/helpers.rb +0 -225
  170. data/lib/action_controller/layout.rb +0 -286
  171. data/lib/action_controller/middlewares.rb +0 -14
  172. data/lib/action_controller/mime_responds.rb +0 -193
  173. data/lib/action_controller/params_parser.rb +0 -77
  174. data/lib/action_controller/performance_test.rb +0 -15
  175. data/lib/action_controller/rack_lint_patch.rb +0 -36
  176. data/lib/action_controller/reloader.rb +0 -54
  177. data/lib/action_controller/request.rb +0 -518
  178. data/lib/action_controller/request_forgery_protection.rb +0 -116
  179. data/lib/action_controller/rescue.rb +0 -183
  180. data/lib/action_controller/resources.rb +0 -682
  181. data/lib/action_controller/response.rb +0 -237
  182. data/lib/action_controller/routing.rb +0 -388
  183. data/lib/action_controller/routing/builder.rb +0 -197
  184. data/lib/action_controller/routing/optimisations.rb +0 -130
  185. data/lib/action_controller/routing/recognition_optimisation.rb +0 -167
  186. data/lib/action_controller/routing/route.rb +0 -265
  187. data/lib/action_controller/routing/route_set.rb +0 -503
  188. data/lib/action_controller/routing/routing_ext.rb +0 -49
  189. data/lib/action_controller/routing/segments.rb +0 -343
  190. data/lib/action_controller/session/abstract_store.rb +0 -276
  191. data/lib/action_controller/session/mem_cache_store.rb +0 -60
  192. data/lib/action_controller/status_codes.rb +0 -88
  193. data/lib/action_controller/string_coercion.rb +0 -29
  194. data/lib/action_controller/templates/rescues/diagnostics.erb +0 -11
  195. data/lib/action_controller/test_process.rb +0 -580
  196. data/lib/action_controller/uploaded_file.rb +0 -44
  197. data/lib/action_view/helpers/benchmark_helper.rb +0 -54
  198. data/lib/action_view/inline_template.rb +0 -19
  199. data/lib/action_view/reloadable_template.rb +0 -117
  200. data/lib/action_view/renderable.rb +0 -109
  201. data/lib/action_view/renderable_partial.rb +0 -53
  202. data/lib/action_view/template_error.rb +0 -99
  203. data/lib/action_view/template_handler.rb +0 -34
  204. data/lib/action_view/template_handlers.rb +0 -48
  205. data/lib/action_view/template_handlers/erb.rb +0 -25
  206. data/lib/actionpack.rb +0 -2
  207. data/test/abstract_unit.rb +0 -78
  208. data/test/active_record_unit.rb +0 -104
  209. data/test/activerecord/active_record_store_test.rb +0 -221
  210. data/test/activerecord/render_partial_with_record_identification_test.rb +0 -188
  211. data/test/adv_attr_test.rb +0 -20
  212. data/test/controller/action_pack_assertions_test.rb +0 -545
  213. data/test/controller/addresses_render_test.rb +0 -37
  214. data/test/controller/assert_select_test.rb +0 -735
  215. data/test/controller/base_test.rb +0 -217
  216. data/test/controller/benchmark_test.rb +0 -32
  217. data/test/controller/caching_test.rb +0 -743
  218. data/test/controller/capture_test.rb +0 -66
  219. data/test/controller/content_type_test.rb +0 -178
  220. data/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb +0 -0
  221. data/test/controller/controller_fixtures/app/controllers/user_controller.rb +0 -0
  222. data/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb +0 -0
  223. data/test/controller/cookie_test.rb +0 -208
  224. data/test/controller/deprecation/deprecated_base_methods_test.rb +0 -32
  225. data/test/controller/dispatcher_test.rb +0 -144
  226. data/test/controller/dom_assertions_test.rb +0 -53
  227. data/test/controller/failsafe_test.rb +0 -60
  228. data/test/controller/fake_controllers.rb +0 -33
  229. data/test/controller/fake_models.rb +0 -19
  230. data/test/controller/filter_params_test.rb +0 -52
  231. data/test/controller/filters_test.rb +0 -885
  232. data/test/controller/flash_test.rb +0 -174
  233. data/test/controller/header_test.rb +0 -14
  234. data/test/controller/helper_test.rb +0 -224
  235. data/test/controller/html-scanner/cdata_node_test.rb +0 -15
  236. data/test/controller/html-scanner/document_test.rb +0 -148
  237. data/test/controller/html-scanner/node_test.rb +0 -89
  238. data/test/controller/html-scanner/sanitizer_test.rb +0 -300
  239. data/test/controller/html-scanner/tag_node_test.rb +0 -238
  240. data/test/controller/html-scanner/text_node_test.rb +0 -50
  241. data/test/controller/html-scanner/tokenizer_test.rb +0 -131
  242. data/test/controller/http_basic_authentication_test.rb +0 -113
  243. data/test/controller/http_digest_authentication_test.rb +0 -254
  244. data/test/controller/integration_test.rb +0 -526
  245. data/test/controller/layout_test.rb +0 -215
  246. data/test/controller/localized_templates_test.rb +0 -24
  247. data/test/controller/logging_test.rb +0 -46
  248. data/test/controller/middleware_stack_test.rb +0 -90
  249. data/test/controller/mime_responds_test.rb +0 -536
  250. data/test/controller/mime_type_test.rb +0 -93
  251. data/test/controller/output_escaping_test.rb +0 -19
  252. data/test/controller/polymorphic_routes_test.rb +0 -297
  253. data/test/controller/rack_test.rb +0 -308
  254. data/test/controller/record_identifier_test.rb +0 -139
  255. data/test/controller/redirect_test.rb +0 -285
  256. data/test/controller/reloader_test.rb +0 -125
  257. data/test/controller/render_test.rb +0 -1783
  258. data/test/controller/request/json_params_parsing_test.rb +0 -65
  259. data/test/controller/request/multipart_params_parsing_test.rb +0 -177
  260. data/test/controller/request/query_string_parsing_test.rb +0 -129
  261. data/test/controller/request/test_request_test.rb +0 -35
  262. data/test/controller/request/url_encoded_params_parsing_test.rb +0 -146
  263. data/test/controller/request/xml_params_parsing_test.rb +0 -103
  264. data/test/controller/request_forgery_protection_test.rb +0 -233
  265. data/test/controller/request_test.rb +0 -398
  266. data/test/controller/rescue_test.rb +0 -541
  267. data/test/controller/resources_test.rb +0 -1393
  268. data/test/controller/routing_test.rb +0 -2592
  269. data/test/controller/selector_test.rb +0 -628
  270. data/test/controller/send_file_test.rb +0 -171
  271. data/test/controller/session/abstract_store_test.rb +0 -64
  272. data/test/controller/session/cookie_store_test.rb +0 -354
  273. data/test/controller/session/mem_cache_store_test.rb +0 -187
  274. data/test/controller/session/test_session_test.rb +0 -58
  275. data/test/controller/test_test.rb +0 -700
  276. data/test/controller/translation_test.rb +0 -26
  277. data/test/controller/url_rewriter_test.rb +0 -395
  278. data/test/controller/verification_test.rb +0 -270
  279. data/test/controller/view_paths_test.rb +0 -141
  280. data/test/controller/webservice_test.rb +0 -273
  281. data/test/fixtures/_top_level_partial.html.erb +0 -1
  282. data/test/fixtures/_top_level_partial_only.erb +0 -1
  283. data/test/fixtures/addresses/list.erb +0 -1
  284. data/test/fixtures/alternate_helpers/foo_helper.rb +0 -3
  285. data/test/fixtures/bad_customers/_bad_customer.html.erb +0 -1
  286. data/test/fixtures/companies.yml +0 -24
  287. data/test/fixtures/company.rb +0 -10
  288. data/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +0 -1
  289. data/test/fixtures/content_type/render_default_for_rhtml.rhtml +0 -1
  290. data/test/fixtures/content_type/render_default_for_rjs.rjs +0 -1
  291. data/test/fixtures/content_type/render_default_for_rxml.rxml +0 -1
  292. data/test/fixtures/customers/_customer.html.erb +0 -1
  293. data/test/fixtures/db_definitions/sqlite.sql +0 -49
  294. data/test/fixtures/developer.rb +0 -9
  295. data/test/fixtures/developers.yml +0 -21
  296. data/test/fixtures/developers/_developer.erb +0 -1
  297. data/test/fixtures/developers_projects.yml +0 -13
  298. data/test/fixtures/failsafe/500.html +0 -1
  299. data/test/fixtures/fun/games/_game.erb +0 -1
  300. data/test/fixtures/fun/games/hello_world.erb +0 -1
  301. data/test/fixtures/fun/serious/games/_game.erb +0 -1
  302. data/test/fixtures/functional_caching/_partial.erb +0 -3
  303. data/test/fixtures/functional_caching/formatted_fragment_cached.html.erb +0 -3
  304. data/test/fixtures/functional_caching/formatted_fragment_cached.js.rjs +0 -6
  305. data/test/fixtures/functional_caching/formatted_fragment_cached.xml.builder +0 -5
  306. data/test/fixtures/functional_caching/fragment_cached.html.erb +0 -2
  307. data/test/fixtures/functional_caching/html_fragment_cached_with_partial.html.erb +0 -1
  308. data/test/fixtures/functional_caching/inline_fragment_cached.html.erb +0 -2
  309. data/test/fixtures/functional_caching/js_fragment_cached_with_partial.js.rjs +0 -1
  310. data/test/fixtures/good_customers/_good_customer.html.erb +0 -1
  311. data/test/fixtures/helpers/abc_helper.rb +0 -5
  312. data/test/fixtures/helpers/fun/games_helper.rb +0 -3
  313. data/test/fixtures/helpers/fun/pdf_helper.rb +0 -3
  314. data/test/fixtures/layout_tests/abs_path_layout.rhtml +0 -1
  315. data/test/fixtures/layout_tests/alt/hello.rhtml +0 -1
  316. data/test/fixtures/layout_tests/alt/layouts/alt.rhtml +0 -0
  317. data/test/fixtures/layout_tests/layouts/controller_name_space/nested.rhtml +0 -1
  318. data/test/fixtures/layout_tests/layouts/item.rhtml +0 -1
  319. data/test/fixtures/layout_tests/layouts/layout_test.rhtml +0 -1
  320. data/test/fixtures/layout_tests/layouts/multiple_extensions.html.erb +0 -1
  321. data/test/fixtures/layout_tests/layouts/third_party_template_library.mab +0 -1
  322. data/test/fixtures/layout_tests/views/hello.rhtml +0 -1
  323. data/test/fixtures/layouts/_column.html.erb +0 -2
  324. data/test/fixtures/layouts/block_with_layout.erb +0 -3
  325. data/test/fixtures/layouts/builder.builder +0 -3
  326. data/test/fixtures/layouts/default_html.html.erb +0 -1
  327. data/test/fixtures/layouts/partial_with_layout.erb +0 -3
  328. data/test/fixtures/layouts/standard.erb +0 -1
  329. data/test/fixtures/layouts/talk_from_action.erb +0 -2
  330. data/test/fixtures/layouts/xhr.html.erb +0 -2
  331. data/test/fixtures/layouts/yield.erb +0 -2
  332. data/test/fixtures/localized/hello_world.de.html +0 -1
  333. data/test/fixtures/localized/hello_world.en.html +0 -1
  334. data/test/fixtures/mascot.rb +0 -3
  335. data/test/fixtures/mascots.yml +0 -4
  336. data/test/fixtures/mascots/_mascot.html.erb +0 -1
  337. data/test/fixtures/multipart/binary_file +0 -0
  338. data/test/fixtures/multipart/boundary_problem_file +0 -10
  339. data/test/fixtures/multipart/bracketed_param +0 -5
  340. data/test/fixtures/multipart/empty +0 -10
  341. data/test/fixtures/multipart/hello.txt +0 -1
  342. data/test/fixtures/multipart/large_text_file +0 -10
  343. data/test/fixtures/multipart/mixed_files +0 -0
  344. data/test/fixtures/multipart/mona_lisa.jpg +0 -0
  345. data/test/fixtures/multipart/none +0 -9
  346. data/test/fixtures/multipart/single_parameter +0 -5
  347. data/test/fixtures/multipart/text_file +0 -10
  348. data/test/fixtures/override/test/hello_world.erb +0 -1
  349. data/test/fixtures/override2/layouts/test/sub.erb +0 -1
  350. data/test/fixtures/post_test/layouts/post.html.erb +0 -1
  351. data/test/fixtures/post_test/layouts/super_post.iphone.erb +0 -1
  352. data/test/fixtures/post_test/post/index.html.erb +0 -1
  353. data/test/fixtures/post_test/post/index.iphone.erb +0 -1
  354. data/test/fixtures/post_test/super_post/index.html.erb +0 -1
  355. data/test/fixtures/post_test/super_post/index.iphone.erb +0 -1
  356. data/test/fixtures/project.rb +0 -3
  357. data/test/fixtures/projects.yml +0 -7
  358. data/test/fixtures/projects/_project.erb +0 -1
  359. data/test/fixtures/public/404.html +0 -1
  360. data/test/fixtures/public/500.da.html +0 -1
  361. data/test/fixtures/public/500.html +0 -1
  362. data/test/fixtures/public/absolute/test.css +0 -23
  363. data/test/fixtures/public/absolute/test.js +0 -63
  364. data/test/fixtures/public/images/rails.png +0 -0
  365. data/test/fixtures/public/javascripts/application.js +0 -1
  366. data/test/fixtures/public/javascripts/bank.js +0 -1
  367. data/test/fixtures/public/javascripts/controls.js +0 -1
  368. data/test/fixtures/public/javascripts/dragdrop.js +0 -1
  369. data/test/fixtures/public/javascripts/effects.js +0 -1
  370. data/test/fixtures/public/javascripts/prototype.js +0 -1
  371. data/test/fixtures/public/javascripts/robber.js +0 -1
  372. data/test/fixtures/public/javascripts/subdir/subdir.js +0 -1
  373. data/test/fixtures/public/javascripts/version.1.0.js +0 -1
  374. data/test/fixtures/public/stylesheets/bank.css +0 -1
  375. data/test/fixtures/public/stylesheets/robber.css +0 -1
  376. data/test/fixtures/public/stylesheets/subdir/subdir.css +0 -1
  377. data/test/fixtures/public/stylesheets/version.1.0.css +0 -1
  378. data/test/fixtures/quiz/questions/_question.html.erb +0 -1
  379. data/test/fixtures/replies.yml +0 -15
  380. data/test/fixtures/replies/_reply.erb +0 -1
  381. data/test/fixtures/reply.rb +0 -7
  382. data/test/fixtures/respond_to/all_types_with_layout.html.erb +0 -1
  383. data/test/fixtures/respond_to/all_types_with_layout.js.rjs +0 -1
  384. data/test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb +0 -1
  385. data/test/fixtures/respond_to/iphone_with_html_response_type.html.erb +0 -1
  386. data/test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb +0 -1
  387. data/test/fixtures/respond_to/layouts/missing.html.erb +0 -1
  388. data/test/fixtures/respond_to/layouts/standard.html.erb +0 -1
  389. data/test/fixtures/respond_to/layouts/standard.iphone.erb +0 -1
  390. data/test/fixtures/respond_to/using_defaults.html.erb +0 -1
  391. data/test/fixtures/respond_to/using_defaults.js.rjs +0 -1
  392. data/test/fixtures/respond_to/using_defaults.xml.builder +0 -1
  393. data/test/fixtures/respond_to/using_defaults_with_type_list.html.erb +0 -1
  394. data/test/fixtures/respond_to/using_defaults_with_type_list.js.rjs +0 -1
  395. data/test/fixtures/respond_to/using_defaults_with_type_list.xml.builder +0 -1
  396. data/test/fixtures/scope/test/modgreet.erb +0 -1
  397. data/test/fixtures/session_autoload_test/session_autoload_test/foo.rb +0 -10
  398. data/test/fixtures/shared.html.erb +0 -1
  399. data/test/fixtures/symlink_parent/symlinked_layout.erb +0 -5
  400. data/test/fixtures/test/_counter.html.erb +0 -1
  401. data/test/fixtures/test/_customer.erb +0 -1
  402. data/test/fixtures/test/_customer_counter.erb +0 -1
  403. data/test/fixtures/test/_customer_counter_with_as.erb +0 -1
  404. data/test/fixtures/test/_customer_greeting.erb +0 -1
  405. data/test/fixtures/test/_customer_with_var.erb +0 -1
  406. data/test/fixtures/test/_form.erb +0 -1
  407. data/test/fixtures/test/_from_helper.erb +0 -1
  408. data/test/fixtures/test/_hash_greeting.erb +0 -1
  409. data/test/fixtures/test/_hash_object.erb +0 -2
  410. data/test/fixtures/test/_hello.builder +0 -1
  411. data/test/fixtures/test/_labelling_form.erb +0 -1
  412. data/test/fixtures/test/_layout_for_block_with_args.html.erb +0 -3
  413. data/test/fixtures/test/_layout_for_partial.html.erb +0 -3
  414. data/test/fixtures/test/_local_inspector.html.erb +0 -1
  415. data/test/fixtures/test/_one.html.erb +0 -1
  416. data/test/fixtures/test/_partial.erb +0 -1
  417. data/test/fixtures/test/_partial.html.erb +0 -1
  418. data/test/fixtures/test/_partial.js.erb +0 -1
  419. data/test/fixtures/test/_partial_for_use_in_layout.html.erb +0 -1
  420. data/test/fixtures/test/_partial_only.erb +0 -1
  421. data/test/fixtures/test/_partial_with_only_html_version.html.erb +0 -1
  422. data/test/fixtures/test/_person.erb +0 -2
  423. data/test/fixtures/test/_raise.html.erb +0 -1
  424. data/test/fixtures/test/_two.html.erb +0 -1
  425. data/test/fixtures/test/_utf8_partial.html.erb +0 -1
  426. data/test/fixtures/test/_utf8_partial_magic.html.erb +0 -2
  427. data/test/fixtures/test/action_talk_to_layout.erb +0 -2
  428. data/test/fixtures/test/array_translation.erb +0 -1
  429. data/test/fixtures/test/calling_partial_with_layout.html.erb +0 -1
  430. data/test/fixtures/test/capturing.erb +0 -4
  431. data/test/fixtures/test/content_for.erb +0 -2
  432. data/test/fixtures/test/content_for_concatenated.erb +0 -3
  433. data/test/fixtures/test/content_for_with_parameter.erb +0 -2
  434. data/test/fixtures/test/delete_with_js.rjs +0 -2
  435. data/test/fixtures/test/dont_pick_me +0 -1
  436. data/test/fixtures/test/dot.directory/render_file_with_ivar.erb +0 -1
  437. data/test/fixtures/test/enum_rjs_test.rjs +0 -6
  438. data/test/fixtures/test/formatted_html_erb.html.erb +0 -1
  439. data/test/fixtures/test/formatted_xml_erb.builder +0 -1
  440. data/test/fixtures/test/formatted_xml_erb.html.erb +0 -1
  441. data/test/fixtures/test/formatted_xml_erb.xml.erb +0 -1
  442. data/test/fixtures/test/greeting.erb +0 -1
  443. data/test/fixtures/test/greeting.js.rjs +0 -1
  444. data/test/fixtures/test/hello.builder +0 -4
  445. data/test/fixtures/test/hello_world.da.html.erb +0 -1
  446. data/test/fixtures/test/hello_world.erb +0 -1
  447. data/test/fixtures/test/hello_world.erb~ +0 -1
  448. data/test/fixtures/test/hello_world.pt-BR.html.erb +0 -1
  449. data/test/fixtures/test/hello_world_container.builder +0 -3
  450. data/test/fixtures/test/hello_world_from_rxml.builder +0 -4
  451. data/test/fixtures/test/hello_world_with_layout_false.erb +0 -1
  452. data/test/fixtures/test/hello_xml_world.builder +0 -11
  453. data/test/fixtures/test/hyphen-ated.erb +0 -1
  454. data/test/fixtures/test/implicit_content_type.atom.builder +0 -2
  455. data/test/fixtures/test/list.erb +0 -1
  456. data/test/fixtures/test/malformed/malformed.en.html.erb~ +0 -1
  457. data/test/fixtures/test/malformed/malformed.erb~ +0 -1
  458. data/test/fixtures/test/malformed/malformed.html.erb~ +0 -1
  459. data/test/fixtures/test/nested_layout.erb +0 -3
  460. data/test/fixtures/test/non_erb_block_content_for.builder +0 -4
  461. data/test/fixtures/test/potential_conflicts.erb +0 -4
  462. data/test/fixtures/test/render_explicit_html_template.js.rjs +0 -1
  463. data/test/fixtures/test/render_file_from_template.html.erb +0 -1
  464. data/test/fixtures/test/render_file_with_ivar.erb +0 -1
  465. data/test/fixtures/test/render_file_with_locals.erb +0 -1
  466. data/test/fixtures/test/render_implicit_html_template.js.rjs +0 -1
  467. data/test/fixtures/test/render_implicit_html_template_from_xhr_request.da.html.erb +0 -1
  468. data/test/fixtures/test/render_implicit_html_template_from_xhr_request.html.erb +0 -1
  469. data/test/fixtures/test/render_implicit_js_template_without_layout.js.erb +0 -1
  470. data/test/fixtures/test/render_to_string_test.erb +0 -1
  471. data/test/fixtures/test/scoped_array_translation.erb +0 -1
  472. data/test/fixtures/test/sub_template_raise.html.erb +0 -1
  473. data/test/fixtures/test/template.erb +0 -1
  474. data/test/fixtures/test/translation.erb +0 -1
  475. data/test/fixtures/test/update_element_with_capture.erb +0 -9
  476. data/test/fixtures/test/using_layout_around_block.html.erb +0 -1
  477. data/test/fixtures/test/using_layout_around_block_with_args.html.erb +0 -1
  478. data/test/fixtures/test/utf8.html.erb +0 -4
  479. data/test/fixtures/test/utf8_magic.html.erb +0 -5
  480. data/test/fixtures/test/utf8_magic_with_bare_partial.html.erb +0 -5
  481. data/test/fixtures/topic.rb +0 -3
  482. data/test/fixtures/topics.yml +0 -22
  483. data/test/fixtures/topics/_topic.html.erb +0 -1
  484. data/test/template/active_record_helper_i18n_test.rb +0 -51
  485. data/test/template/active_record_helper_test.rb +0 -302
  486. data/test/template/asset_tag_helper_test.rb +0 -770
  487. data/test/template/atom_feed_helper_test.rb +0 -315
  488. data/test/template/benchmark_helper_test.rb +0 -86
  489. data/test/template/compiled_templates_test.rb +0 -204
  490. data/test/template/date_helper_i18n_test.rb +0 -121
  491. data/test/template/date_helper_test.rb +0 -2603
  492. data/test/template/erb_util_test.rb +0 -36
  493. data/test/template/form_helper_test.rb +0 -1447
  494. data/test/template/form_options_helper_i18n_test.rb +0 -27
  495. data/test/template/form_options_helper_test.rb +0 -811
  496. data/test/template/form_tag_helper_test.rb +0 -356
  497. data/test/template/javascript_helper_test.rb +0 -106
  498. data/test/template/number_helper_i18n_test.rb +0 -69
  499. data/test/template/number_helper_test.rb +0 -132
  500. data/test/template/prototype_helper_test.rb +0 -639
  501. data/test/template/raw_output_helper_test.rb +0 -21
  502. data/test/template/record_tag_helper_test.rb +0 -58
  503. data/test/template/render_test.rb +0 -329
  504. data/test/template/sanitize_helper_test.rb +0 -57
  505. data/test/template/scriptaculous_helper_test.rb +0 -90
  506. data/test/template/tag_helper_test.rb +0 -98
  507. data/test/template/template_test.rb +0 -32
  508. data/test/template/test_test.rb +0 -54
  509. data/test/template/text_helper_test.rb +0 -601
  510. data/test/template/translation_helper_test.rb +0 -95
  511. data/test/template/url_helper_test.rb +0 -641
  512. data/test/testing_sandbox.rb +0 -15
  513. data/test/view/test_case_test.rb +0 -176
@@ -6,4 +6,4 @@ module ActionView #:nodoc:
6
6
  end
7
7
  end
8
8
  end
9
- end
9
+ end
@@ -15,7 +15,7 @@ module ActionView
15
15
  def div_for(record, *args, &block)
16
16
  content_tag_for(:div, record, *args, &block)
17
17
  end
18
-
18
+
19
19
  # content_tag_for creates an HTML element with id and class parameters
20
20
  # that relate to the specified Active Record object. For example:
21
21
  #
@@ -34,7 +34,7 @@ module ActionView
34
34
  # <% content_tag_for(:tr, @person, :foo) do %> ...
35
35
  #
36
36
  # produces:
37
- #
37
+ #
38
38
  # <tr id="foo_person_123" class="person">...
39
39
  #
40
40
  # content_tag_for also accepts a hash of options, which will be converted to
@@ -50,7 +50,7 @@ module ActionView
50
50
  def content_tag_for(tag_name, record, *args, &block)
51
51
  prefix = args.first.is_a?(Hash) ? nil : args.shift
52
52
  options = args.extract_options!
53
- options.merge!({ :class => "#{dom_class(record)} #{options[:class]}".strip, :id => dom_id(record, prefix) })
53
+ options.merge!({ :class => "#{dom_class(record, prefix)} #{options[:class]}".strip, :id => dom_id(record, prefix) })
54
54
  content_tag(tag_name, options, &block)
55
55
  end
56
56
  end
@@ -1,3 +1,4 @@
1
+ require 'action_controller/vendor/html-scanner'
1
2
  require 'action_view/helpers/tag_helper'
2
3
 
3
4
  module ActionView
@@ -21,7 +22,7 @@ module ActionView
21
22
  #
22
23
  # Custom Use (only the mentioned tags and attributes are allowed, nothing else)
23
24
  #
24
- # <%= sanitize @article.body, :tags => %w(table tr td), :attributes => %w(id class style)
25
+ # <%= sanitize @article.body, :tags => %w(table tr td), :attributes => %w(id class style) %>
25
26
  #
26
27
  # Add table tags to the default allowed tags
27
28
  #
@@ -72,7 +73,7 @@ module ActionView
72
73
  # strip_tags("<div id='top-bar'>Welcome to my website!</div>")
73
74
  # # => Welcome to my website!
74
75
  def strip_tags(html)
75
- self.class.full_sanitizer.sanitize(html)
76
+ self.class.full_sanitizer.sanitize(html).try(:html_safe)
76
77
  end
77
78
 
78
79
  # Strips all link tags from +text+ leaving just the link text.
@@ -3,11 +3,11 @@ require 'active_support/json'
3
3
 
4
4
  module ActionView
5
5
  module Helpers
6
- # Provides a set of helpers for calling Scriptaculous JavaScript
6
+ # Provides a set of helpers for calling Scriptaculous JavaScript
7
7
  # functions, including those which create Ajax controls and visual effects.
8
8
  #
9
- # To be able to use these helpers, you must include the Prototype
10
- # JavaScript framework and the Scriptaculous JavaScript library in your
9
+ # To be able to use these helpers, you must include the Prototype
10
+ # JavaScript framework and the Scriptaculous JavaScript library in your
11
11
  # pages. See the documentation for ActionView::Helpers::JavaScriptHelper
12
12
  # for more information on including the necessary JavaScript.
13
13
  #
@@ -18,22 +18,17 @@ module ActionView
18
18
  unless const_defined? :TOGGLE_EFFECTS
19
19
  TOGGLE_EFFECTS = [:toggle_appear, :toggle_slide, :toggle_blind]
20
20
  end
21
-
21
+
22
22
  # Returns a JavaScript snippet to be used on the Ajax callbacks for
23
23
  # starting visual effects.
24
24
  #
25
- # Example:
26
- # <%= link_to_remote "Reload", :update => "posts",
27
- # :url => { :action => "reload" },
28
- # :complete => visual_effect(:highlight, "posts", :duration => 0.5)
29
- #
30
25
  # If no +element_id+ is given, it assumes "element" which should be a local
31
- # variable in the generated JavaScript execution context. This can be
26
+ # variable in the generated JavaScript execution context. This can be
32
27
  # used for example with +drop_receiving_element+:
33
28
  #
34
29
  # <%= drop_receiving_element (...), :loading => visual_effect(:fade) %>
35
30
  #
36
- # This would fade the element that was dropped on the drop receiving
31
+ # This would fade the element that was dropped on the drop receiving
37
32
  # element.
38
33
  #
39
34
  # For toggling visual effects, you can use <tt>:toggle_appear</tt>, <tt>:toggle_slide</tt>, and
@@ -44,13 +39,13 @@ module ActionView
44
39
  # http://script.aculo.us for more documentation.
45
40
  def visual_effect(name, element_id = false, js_options = {})
46
41
  element = element_id ? ActiveSupport::JSON.encode(element_id) : "element"
47
-
42
+
48
43
  js_options[:queue] = if js_options[:queue].is_a?(Hash)
49
44
  '{' + js_options[:queue].map {|k, v| k == :limit ? "#{k}:#{v}" : "#{k}:'#{v}'" }.join(',') + '}'
50
45
  elsif js_options[:queue]
51
46
  "'#{js_options[:queue]}'"
52
47
  end if js_options[:queue]
53
-
48
+
54
49
  [:endcolor, :direction, :startcolor, :scaleMode, :restorecolor].each do |option|
55
50
  js_options[option] = "'#{js_options[option]}'" if js_options[option]
56
51
  end
@@ -61,7 +56,7 @@ module ActionView
61
56
  "new Effect.#{name.to_s.camelize}(#{element},#{options_for_javascript(js_options)});"
62
57
  end
63
58
  end
64
-
59
+
65
60
  # Makes the element with the DOM ID specified by +element_id+ sortable
66
61
  # by drag-and-drop and make an Ajax call whenever the sort order has
67
62
  # changed. By default, the action called gets the serialized sortable
@@ -71,84 +66,84 @@ module ActionView
71
66
  #
72
67
  # <%= sortable_element("my_list", :url => { :action => "order" }) %>
73
68
  #
74
- # In the example, the action gets a "my_list" array parameter
75
- # containing the values of the ids of elements the sortable consists
69
+ # In the example, the action gets a "my_list" array parameter
70
+ # containing the values of the ids of elements the sortable consists
76
71
  # of, in the current order.
77
72
  #
78
73
  # Important: For this to work, the sortable elements must have id
79
74
  # attributes in the form "string_identifier". For example, "item_1". Only
80
75
  # the identifier part of the id attribute will be serialized.
81
- #
76
+ #
82
77
  # Additional +options+ are:
83
78
  #
84
79
  # * <tt>:format</tt> - A regular expression to determine what to send as the
85
80
  # serialized id to the server (the default is <tt>/^[^_]*_(.*)$/</tt>).
86
- #
81
+ #
87
82
  # * <tt>:constraint</tt> - Whether to constrain the dragging to either
88
83
  # <tt>:horizontal</tt> or <tt>:vertical</tt> (or false to make it unconstrained).
89
- #
84
+ #
90
85
  # * <tt>:overlap</tt> - Calculate the item overlap in the <tt>:horizontal</tt>
91
86
  # or <tt>:vertical</tt> direction.
92
- #
87
+ #
93
88
  # * <tt>:tag</tt> - Which children of the container element to treat as
94
89
  # sortable (default is <tt>li</tt>).
95
- #
90
+ #
96
91
  # * <tt>:containment</tt> - Takes an element or array of elements to treat as
97
92
  # potential drop targets (defaults to the original target element).
98
- #
93
+ #
99
94
  # * <tt>:only</tt> - A CSS class name or array of class names used to filter
100
95
  # out child elements as candidates.
101
- #
96
+ #
102
97
  # * <tt>:scroll</tt> - Determines whether to scroll the list during drag
103
98
  # operations if the list runs past the visual border.
104
- #
99
+ #
105
100
  # * <tt>:tree</tt> - Determines whether to treat nested lists as part of the
106
101
  # main sortable list. This means that you can create multi-layer lists,
107
102
  # and not only sort items at the same level, but drag and sort items
108
103
  # between levels.
109
- #
104
+ #
110
105
  # * <tt>:hoverclass</tt> - If set, the Droppable will have this additional CSS class
111
- # when an accepted Draggable is hovered over it.
112
- #
106
+ # when an accepted Draggable is hovered over it.
107
+ #
113
108
  # * <tt>:handle</tt> - Sets whether the element should only be draggable by an
114
109
  # embedded handle. The value may be a string referencing a CSS class value
115
110
  # (as of script.aculo.us V1.5). The first child/grandchild/etc. element
116
111
  # found within the element that has this CSS class value will be used as
117
112
  # the handle.
118
- #
113
+ #
119
114
  # * <tt>:ghosting</tt> - Clones the element and drags the clone, leaving
120
115
  # the original in place until the clone is dropped (default is <tt>false</tt>).
121
- #
116
+ #
122
117
  # * <tt>:dropOnEmpty</tt> - If true the Sortable container will be made into
123
118
  # a Droppable, that can receive a Draggable (as according to the containment
124
119
  # rules) as a child element when there are no more elements inside (default
125
120
  # is <tt>false</tt>).
126
- #
121
+ #
127
122
  # * <tt>:onChange</tt> - Called whenever the sort order changes while dragging. When
128
123
  # dragging from one Sortable to another, the callback is called once on each
129
124
  # Sortable. Gets the affected element as its parameter.
130
- #
125
+ #
131
126
  # * <tt>:onUpdate</tt> - Called when the drag ends and the Sortable's order is
132
127
  # changed in any way. When dragging from one Sortable to another, the callback
133
128
  # is called once on each Sortable. Gets the container as its parameter.
134
- #
129
+ #
135
130
  # See http://script.aculo.us for more documentation.
136
131
  def sortable_element(element_id, options = {})
137
132
  javascript_tag(sortable_element_js(element_id, options).chop!)
138
133
  end
139
-
134
+
140
135
  def sortable_element_js(element_id, options = {}) #:nodoc:
141
136
  options[:with] ||= "Sortable.serialize(#{ActiveSupport::JSON.encode(element_id)})"
142
137
  options[:onUpdate] ||= "function(){" + remote_function(options) + "}"
143
138
  options.delete_if { |key, value| PrototypeHelper::AJAX_OPTIONS.include?(key) }
144
-
139
+
145
140
  [:tag, :overlap, :constraint, :handle].each do |option|
146
141
  options[option] = "'#{options[option]}'" if options[option]
147
142
  end
148
-
143
+
149
144
  options[:containment] = array_or_string_for_javascript(options[:containment]) if options[:containment]
150
145
  options[:only] = array_or_string_for_javascript(options[:only]) if options[:only]
151
-
146
+
152
147
  %(Sortable.create(#{ActiveSupport::JSON.encode(element_id)}, #{options_for_javascript(options)});)
153
148
  end
154
149
 
@@ -156,24 +151,24 @@ module ActionView
156
151
  #
157
152
  # Example:
158
153
  # <%= draggable_element("my_image", :revert => true)
159
- #
154
+ #
160
155
  # You can change the behaviour with various options, see
161
156
  # http://script.aculo.us for more documentation.
162
157
  def draggable_element(element_id, options = {})
163
158
  javascript_tag(draggable_element_js(element_id, options).chop!)
164
159
  end
165
-
160
+
166
161
  def draggable_element_js(element_id, options = {}) #:nodoc:
167
162
  %(new Draggable(#{ActiveSupport::JSON.encode(element_id)}, #{options_for_javascript(options)});)
168
163
  end
169
164
 
170
165
  # Makes the element with the DOM ID specified by +element_id+ receive
171
166
  # dropped draggable elements (created by +draggable_element+).
172
- # and make an AJAX call. By default, the action called gets the DOM ID
167
+ # and make an AJAX call. By default, the action called gets the DOM ID
173
168
  # of the element as parameter.
174
169
  #
175
170
  # Example:
176
- # <%= drop_receiving_element("my_cart", :url =>
171
+ # <%= drop_receiving_element("my_cart", :url =>
177
172
  # { :controller => "cart", :action => "add" }) %>
178
173
  #
179
174
  # You can change the behaviour with various options, see
@@ -181,46 +176,87 @@ module ActionView
181
176
  #
182
177
  # Some of these +options+ include:
183
178
  # * <tt>:accept</tt> - Set this to a string or an array of strings describing the
184
- # allowable CSS classes that the +draggable_element+ must have in order
179
+ # allowable CSS classes that the +draggable_element+ must have in order
185
180
  # to be accepted by this +drop_receiving_element+.
186
- #
181
+ #
187
182
  # * <tt>:confirm</tt> - Adds a confirmation dialog. Example:
188
- #
183
+ #
189
184
  # :confirm => "Are you sure you want to do this?"
190
- #
185
+ #
191
186
  # * <tt>:hoverclass</tt> - If set, the +drop_receiving_element+ will have
192
187
  # this additional CSS class when an accepted +draggable_element+ is
193
- # hovered over it.
194
- #
188
+ # hovered over it.
189
+ #
195
190
  # * <tt>:onDrop</tt> - Called when a +draggable_element+ is dropped onto
196
- # this element. Override this callback with a JavaScript expression to
191
+ # this element. Override this callback with a JavaScript expression to
197
192
  # change the default drop behaviour. Example:
198
- #
193
+ #
199
194
  # :onDrop => "function(draggable_element, droppable_element, event) { alert('I like bananas') }"
200
- #
195
+ #
201
196
  # This callback gets three parameters: The Draggable element, the Droppable
202
197
  # element and the Event object. You can extract additional information about
203
198
  # the drop - like if the Ctrl or Shift keys were pressed - from the Event object.
204
- #
199
+ #
205
200
  # * <tt>:with</tt> - A JavaScript expression specifying the parameters for
206
201
  # the XMLHttpRequest. Any expressions should return a valid URL query string.
207
202
  def drop_receiving_element(element_id, options = {})
208
203
  javascript_tag(drop_receiving_element_js(element_id, options).chop!)
209
204
  end
210
-
205
+
211
206
  def drop_receiving_element_js(element_id, options = {}) #:nodoc:
212
207
  options[:with] ||= "'id=' + encodeURIComponent(element.id)"
213
208
  options[:onDrop] ||= "function(element){" + remote_function(options) + "}"
214
209
  options.delete_if { |key, value| PrototypeHelper::AJAX_OPTIONS.include?(key) }
215
210
 
216
- options[:accept] = array_or_string_for_javascript(options[:accept]) if options[:accept]
211
+ options[:accept] = array_or_string_for_javascript(options[:accept]) if options[:accept]
217
212
  options[:hoverclass] = "'#{options[:hoverclass]}'" if options[:hoverclass]
218
-
213
+
219
214
  # Confirmation happens during the onDrop callback, so it can be removed from the options
220
215
  options.delete(:confirm) if options[:confirm]
221
216
 
222
217
  %(Droppables.add(#{ActiveSupport::JSON.encode(element_id)}, #{options_for_javascript(options)});)
223
218
  end
219
+
220
+ protected
221
+ def array_or_string_for_javascript(option)
222
+ if option.kind_of?(Array)
223
+ "['#{option.join('\',\'')}']"
224
+ elsif !option.nil?
225
+ "'#{option}'"
226
+ end
227
+ end
228
+ end
229
+
230
+ module PrototypeHelper
231
+ class JavaScriptGenerator
232
+ module GeneratorMethods
233
+ # Starts a script.aculo.us visual effect. See
234
+ # ActionView::Helpers::ScriptaculousHelper for more information.
235
+ def visual_effect(name, id = nil, options = {})
236
+ record @context.send(:visual_effect, name, id, options)
237
+ end
238
+
239
+ # Creates a script.aculo.us sortable element. Useful
240
+ # to recreate sortable elements after items get added
241
+ # or deleted.
242
+ # See ActionView::Helpers::ScriptaculousHelper for more information.
243
+ def sortable(id, options = {})
244
+ record @context.send(:sortable_element_js, id, options)
245
+ end
246
+
247
+ # Creates a script.aculo.us draggable element.
248
+ # See ActionView::Helpers::ScriptaculousHelper for more information.
249
+ def draggable(id, options = {})
250
+ record @context.send(:draggable_element_js, id, options)
251
+ end
252
+
253
+ # Creates a script.aculo.us drop receiving element.
254
+ # See ActionView::Helpers::ScriptaculousHelper for more information.
255
+ def drop_receiving(id, options = {})
256
+ record @context.send(:drop_receiving_element_js, id, options)
257
+ end
258
+ end
259
+ end
224
260
  end
225
261
  end
226
262
  end
@@ -1,5 +1,3 @@
1
- require 'active_support/multibyte'
2
- require 'active_support/core_ext/string/output_safety'
3
1
  require 'set'
4
2
 
5
3
  module ActionView
@@ -9,8 +7,11 @@ module ActionView
9
7
  module TagHelper
10
8
  include ERB::Util
11
9
 
12
- BOOLEAN_ATTRIBUTES = %w(disabled readonly multiple checked).to_set
13
- BOOLEAN_ATTRIBUTES.merge(BOOLEAN_ATTRIBUTES.map(&:to_sym))
10
+ BOOLEAN_ATTRIBUTES = %w(disabled readonly multiple checked autobuffer
11
+ autoplay controls loop selected hidden scoped async
12
+ defer reversed ismap seemless muted required
13
+ autofocus novalidate formnovalidate open).to_set
14
+ BOOLEAN_ATTRIBUTES.merge(BOOLEAN_ATTRIBUTES.map {|attr| attr.to_sym })
14
15
 
15
16
  # Returns an empty HTML tag of type +name+ which by default is XHTML
16
17
  # compliant. Set +open+ to true to create an open tag compatible
@@ -132,16 +133,14 @@ module ActionView
132
133
  def tag_options(options, escape = true)
133
134
  unless options.blank?
134
135
  attrs = []
135
- if escape
136
- options.each_pair do |key, value|
137
- if BOOLEAN_ATTRIBUTES.include?(key)
138
- attrs << %(#{key}="#{key}") if value
139
- else
140
- attrs << %(#{key}="#{escape_once(value)}") if !value.nil?
141
- end
136
+ options.each_pair do |key, value|
137
+ if BOOLEAN_ATTRIBUTES.include?(key)
138
+ attrs << %(#{key}="#{key}") if value
139
+ elsif !value.nil?
140
+ final_value = value.is_a?(Array) ? value.join(" ") : value
141
+ final_value = escape_once(final_value) if escape
142
+ attrs << %(#{key}="#{final_value}")
142
143
  end
143
- else
144
- attrs = options.map { |key, value| %(#{key}="#{value}") }
145
144
  end
146
145
  " #{attrs.sort * ' '}".html_safe unless attrs.empty?
147
146
  end
@@ -24,11 +24,11 @@ module ActionView
24
24
  # end
25
25
  # # will either display "Logged in!" or a login link
26
26
  # %>
27
- def concat(string, unused_binding = nil)
28
- if unused_binding
29
- ActiveSupport::Deprecation.warn("The binding argument of #concat is no longer needed. Please remove it from your views and helpers.", caller)
30
- end
27
+ def concat(string)
28
+ output_buffer << string
29
+ end
31
30
 
31
+ def safe_concat(string)
32
32
  output_buffer.safe_concat(string)
33
33
  end
34
34
 
@@ -36,11 +36,16 @@ module ActionView
36
36
  # (defaults to 30). The last characters will be replaced with the <tt>:omission</tt> (defaults to "...")
37
37
  # for a total length not exceeding <tt>:length</tt>.
38
38
  #
39
+ # Pass a <tt>:separator</tt> to truncate +text+ at a natural break.
40
+ #
39
41
  # ==== Examples
40
42
  #
41
43
  # truncate("Once upon a time in a world far far away")
42
44
  # # => Once upon a time in a world...
43
45
  #
46
+ # truncate("Once upon a time in a world far far away", :separator => ' ')
47
+ # # => Once upon a time in a world...
48
+ #
44
49
  # truncate("Once upon a time in a world far far away", :length => 14)
45
50
  # # => Once upon a...
46
51
  #
@@ -72,7 +77,8 @@ module ActionView
72
77
  if text
73
78
  l = options[:length] - options[:omission].mb_chars.length
74
79
  chars = text.mb_chars
75
- (chars.length > options[:length] ? chars[0...l] + options[:omission] : text).to_s
80
+ stop = options[:separator] ? (chars.rindex(options[:separator].mb_chars, l) || l) : l
81
+ (chars.length > options[:length] ? chars[0...stop] + options[:omission] : text).to_s
76
82
  end
77
83
  end
78
84
 
@@ -181,7 +187,7 @@ module ActionView
181
187
  # pluralize(0, 'person')
182
188
  # # => 0 people
183
189
  def pluralize(count, singular, plural = nil)
184
- "#{count || 0} " + ((count == 1 || count =~ /^1(\.0+)?$/) ? singular : (plural || singular.pluralize))
190
+ "#{count || 0} " + ((count == 1 || count == '1') ? singular : (plural || singular.pluralize))
185
191
  end
186
192
 
187
193
  # Wraps the +text+ into lines no longer than +line_width+ width. This method
@@ -220,8 +226,7 @@ module ActionView
220
226
  # Returns the text with all the Textile[http://www.textism.com/tools/textile] codes turned into HTML tags.
221
227
  #
222
228
  # You can learn more about Textile's syntax at its website[http://www.textism.com/tools/textile].
223
- # <i>This method is only available if RedCloth[http://whytheluckystiff.net/ruby/redcloth/]
224
- # is available</i>.
229
+ # <i>This method is only available if RedCloth[http://redcloth.org/] is available</i>.
225
230
  #
226
231
  # ==== Examples
227
232
  # textilize("*This is Textile!* Rejoice!")
@@ -257,8 +262,7 @@ module ActionView
257
262
  # but without the bounding <p> tag that RedCloth adds.
258
263
  #
259
264
  # You can learn more about Textile's syntax at its website[http://www.textism.com/tools/textile].
260
- # <i>This method is requires RedCloth[http://whytheluckystiff.net/ruby/redcloth/]
261
- # to be available</i>.
265
+ # <i>This method is only available if RedCloth[http://redcloth.org/] is available</i>.
262
266
  #
263
267
  # ==== Examples
264
268
  # textilize_without_paragraph("*This is Textile!* Rejoice!")
@@ -280,8 +284,8 @@ module ActionView
280
284
  end
281
285
 
282
286
  # Returns the text with all the Markdown codes turned into HTML tags.
283
- # <i>This method requires BlueCloth[http://www.deveiate.org/projects/BlueCloth] or another
284
- # Markdown library to be installed.</i>.
287
+ # <i>This method requires BlueCloth[http://www.deveiate.org/projects/BlueCloth]
288
+ # to be available</i>.
285
289
  #
286
290
  # ==== Examples
287
291
  # markdown("We are using __Markdown__ now!")
@@ -297,7 +301,7 @@ module ActionView
297
301
  # markdown('![The ROR logo](http://rubyonrails.com/images/rails.png "Ruby on Rails")')
298
302
  # # => '<p><img src="http://rubyonrails.com/images/rails.png" alt="The ROR logo" title="Ruby on Rails" /></p>'
299
303
  def markdown(text)
300
- text.blank? ? "" : Markdown.new(text).to_html
304
+ text.blank? ? "" : BlueCloth.new(text).to_html
301
305
  end
302
306
 
303
307
  # Returns +text+ transformed into HTML using simple formatting rules.
@@ -328,12 +332,12 @@ module ActionView
328
332
  text.gsub!(/\n\n+/, "</p>\n\n#{start_tag}") # 2+ newline -> paragraph
329
333
  text.gsub!(/([^\n]\n)(?=[^\n])/, '\1<br />') # 1 newline -> br
330
334
  text.insert 0, start_tag
331
- text.html_safe.safe_concat("</p>")
335
+ text << "</p>"
332
336
  end
333
337
 
334
338
  # Turns all URLs and e-mail addresses into clickable links. The <tt>:link</tt> option
335
339
  # will limit what should be linked. You can add HTML attributes to the links using
336
- # <tt>:href_options</tt>. Possible values for <tt>:link</tt> are <tt>:all</tt> (default),
340
+ # <tt>:html</tt>. Possible values for <tt>:link</tt> are <tt>:all</tt> (default),
337
341
  # <tt>:email_addresses</tt>, and <tt>:urls</tt>. If a block is given, each URL and
338
342
  # e-mail address is yielded and the result is used as the link text.
339
343
  #
@@ -350,7 +354,7 @@ module ActionView
350
354
  # # => "Visit http://www.loudthinking.com/ or e-mail <a href=\"mailto:david@loudthinking.com\">david@loudthinking.com</a>"
351
355
  #
352
356
  # post_body = "Welcome to my new blog at http://www.myblog.com/. Please e-mail me at me@email.com."
353
- # auto_link(post_body, :href_options => { :target => '_blank' }) do |text|
357
+ # auto_link(post_body, :html => { :target => '_blank' }) do |text|
354
358
  # truncate(text, 15)
355
359
  # end
356
360
  # # => "Welcome to my new blog at <a href=\"http://www.myblog.com/\" target=\"_blank\">http://www.m...</a>.
@@ -368,7 +372,7 @@ module ActionView
368
372
  # auto_link(post_body, :all, :target => "_blank") # => Once upon\na time
369
373
  # # => "Welcome to my new blog at <a href=\"http://www.myblog.com/\" target=\"_blank\">http://www.myblog.com</a>.
370
374
  # Please e-mail me at <a href=\"mailto:me@email.com\">me@email.com</a>."
371
- def auto_link(text, *args, &block)#link = :all, href_options = {}, &block)
375
+ def auto_link(text, *args, &block)#link = :all, html = {}, &block)
372
376
  return '' if text.blank?
373
377
 
374
378
  options = args.size == 2 ? {} : args.extract_options! # this is necessary because the old auto_link API has a Hash as its last parameter
@@ -440,7 +444,7 @@ module ActionView
440
444
  end
441
445
 
442
446
  # Returns the current cycle string after a cycle has been started. Useful
443
- # for complex table highlighing or any other design need which requires
447
+ # for complex table highlighting or any other design need which requires
444
448
  # the current cycle string in more than one place.
445
449
  #
446
450
  # ==== Example
@@ -532,14 +536,9 @@ module ActionView
532
536
  end
533
537
 
534
538
  AUTO_LINK_RE = %r{
535
- (?: ([\w+.:-]+:)// | www\. )
539
+ ( https?:// | www\. )
536
540
  [^\s<]+
537
- }x
538
-
539
- # regexps for determining context, used high-volume
540
- AUTO_LINK_CRE = [/<[^>]+$/, /^[^>]*>/, /<a\b.*?>/i, /<\/a>/i]
541
-
542
- AUTO_EMAIL_RE = /[\w.!#\$%+-]+@[\w-]+(?:\.[\w-]+)+/
541
+ }x unless const_defined?(:AUTO_LINK_RE)
543
542
 
544
543
  BRACKETS = { ']' => '[', ')' => '(', '}' => '{' }
545
544
 
@@ -548,10 +547,11 @@ module ActionView
548
547
  def auto_link_urls(text, html_options = {})
549
548
  link_attributes = html_options.stringify_keys
550
549
  text.gsub(AUTO_LINK_RE) do
551
- scheme, href = $1, $&
550
+ href = $&
552
551
  punctuation = []
553
-
554
- if auto_linked?($`, $')
552
+ left, right = $`, $'
553
+ # detect already linked URLs and URLs in the middle of a tag
554
+ if left =~ /<[^>]+$/ && right =~ /^[^>]*>/
555
555
  # do not change string; URL is already linked
556
556
  href
557
557
  else
@@ -565,7 +565,7 @@ module ActionView
565
565
  end
566
566
 
567
567
  link_text = block_given?? yield(href) : href
568
- href = 'http://' + href unless scheme
568
+ href = 'http://' + href unless href =~ %r{^[a-z]+://}i
569
569
 
570
570
  content_tag(:a, h(link_text), link_attributes.merge('href' => href)) + punctuation.reverse.join('')
571
571
  end
@@ -575,10 +575,11 @@ module ActionView
575
575
  # Turns all email addresses into clickable links. If a block is given,
576
576
  # each email is yielded and the result is used as the link text.
577
577
  def auto_link_email_addresses(text, html_options = {})
578
- text.gsub(AUTO_EMAIL_RE) do
579
- text = $&
578
+ body = text.dup
579
+ text.gsub(/([\w\.!#\$%\-+.]+@[A-Za-z0-9\-]+(\.[A-Za-z0-9\-]+)+)/) do
580
+ text = $1
580
581
 
581
- if auto_linked?($`, $')
582
+ if body.match(/<a\b[^>]*>(.*)(#{Regexp.escape(text)})(.*)<\/a>/)
582
583
  text
583
584
  else
584
585
  display_text = (block_given?) ? yield(text) : text
@@ -586,12 +587,6 @@ module ActionView
586
587
  end
587
588
  end
588
589
  end
589
-
590
- # Detects already linked context or position in the middle of a tag
591
- def auto_linked?(left, right)
592
- (left =~ AUTO_LINK_CRE[0] and right =~ AUTO_LINK_CRE[1]) or
593
- (left.rindex(AUTO_LINK_CRE[2]) and $' !~ AUTO_LINK_CRE[3])
594
- end
595
590
  end
596
591
  end
597
592
  end