radiant 0.8.2 → 0.9.0.rc2

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

Potentially problematic release.


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

Files changed (1212) hide show
  1. data/CHANGELOG +258 -389
  2. data/CONTRIBUTORS +21 -0
  3. data/app/controllers/admin/layouts_controller.rb +2 -8
  4. data/app/controllers/admin/pages_controller.rb +0 -19
  5. data/app/controllers/admin/preferences_controller.rb +3 -4
  6. data/app/controllers/admin/references_controller.rb +1 -1
  7. data/app/controllers/admin/resource_controller.rb +11 -10
  8. data/app/controllers/admin/snippets_controller.rb +5 -6
  9. data/app/controllers/admin/users_controller.rb +15 -1
  10. data/app/controllers/admin/welcome_controller.rb +5 -5
  11. data/app/controllers/application_controller.rb +34 -2
  12. data/app/controllers/site_controller.rb +20 -6
  13. data/app/helpers/admin/layouts_helper.rb +19 -0
  14. data/app/helpers/admin/node_helper.rb +10 -10
  15. data/app/helpers/admin/pages_helper.rb +82 -22
  16. data/app/helpers/admin/references_helper.rb +6 -3
  17. data/app/helpers/admin/snippets_helper.rb +39 -0
  18. data/app/helpers/admin/users_helper.rb +2 -2
  19. data/app/helpers/application_helper.rb +93 -27
  20. data/app/models/layout.rb +3 -4
  21. data/app/models/page.rb +35 -20
  22. data/app/models/page_part.rb +4 -4
  23. data/app/models/radiant/config.rb +11 -7
  24. data/app/models/snippet.rb +5 -5
  25. data/app/models/standard_tags.rb +116 -20
  26. data/app/models/status.rb +3 -1
  27. data/app/models/user.rb +37 -33
  28. data/app/views/admin/extensions/index.html.haml +26 -25
  29. data/app/views/admin/layouts/_form.html.haml +26 -23
  30. data/app/views/admin/layouts/edit.html.haml +5 -3
  31. data/app/views/admin/layouts/index.html.haml +31 -32
  32. data/app/views/admin/layouts/new.html.haml +4 -2
  33. data/app/views/admin/layouts/remove.html.haml +9 -9
  34. data/app/views/admin/page_parts/_page_part.html.haml +11 -10
  35. data/app/views/admin/pages/_fields.html.haml +42 -48
  36. data/app/views/admin/pages/_meta_row.html.haml +2 -4
  37. data/app/views/admin/pages/_node.html.haml +5 -5
  38. data/app/views/admin/pages/_popups.html.haml +12 -29
  39. data/app/views/admin/pages/edit.html.haml +6 -3
  40. data/app/views/admin/pages/index.html.haml +22 -24
  41. data/app/views/admin/pages/new.html.haml +4 -3
  42. data/app/views/admin/pages/remove.html.haml +14 -17
  43. data/app/views/admin/preferences/edit.html.haml +36 -28
  44. data/app/views/admin/references/_tag_reference.haml +2 -2
  45. data/app/views/admin/references/filters.haml +6 -0
  46. data/app/views/admin/references/tags.haml +30 -0
  47. data/app/views/admin/snippets/_form.html.haml +22 -18
  48. data/app/views/admin/snippets/edit.html.haml +6 -2
  49. data/app/views/admin/snippets/index.html.haml +29 -29
  50. data/app/views/admin/snippets/new.html.haml +4 -2
  51. data/app/views/admin/snippets/remove.html.haml +9 -11
  52. data/app/views/admin/users/_avatar.html.haml +3 -0
  53. data/app/views/admin/users/_form.html.haml +47 -67
  54. data/app/views/admin/users/_password_fields.html.haml +18 -0
  55. data/app/views/admin/users/edit.html.haml +5 -1
  56. data/app/views/admin/users/index.html.haml +33 -30
  57. data/app/views/admin/users/new.html.haml +2 -1
  58. data/app/views/admin/users/remove.html.haml +8 -10
  59. data/app/views/admin/welcome/login.html.haml +19 -58
  60. data/app/views/layouts/application.html.haml +30 -29
  61. data/config/boot.rb +1 -1
  62. data/config/cucumber.yml +7 -0
  63. data/config/database.db2.yml +4 -1
  64. data/config/database.mysql.yml +5 -2
  65. data/config/database.postgresql.yml +5 -2
  66. data/config/database.sqlite.yml +4 -1
  67. data/config/database.sqlserver.yml +5 -2
  68. data/config/environment.rb +14 -2
  69. data/config/environments/cucumber.rb +29 -0
  70. data/config/environments/production.rb +6 -1
  71. data/config/environments/test.rb +6 -3
  72. data/config/initializers/haml.rb +2 -0
  73. data/config/initializers/pagination.rb +1 -0
  74. data/config/locales/en.yml +190 -0
  75. data/config/locales/en_available_tags.yml +454 -0
  76. data/config/routes.rb +2 -2
  77. data/db/migrate/20090226140109_add_user_language.rb +9 -0
  78. data/db/migrate/20090929164633_rename_developer_role_to_designer.rb +9 -0
  79. data/db/migrate/20091003095744_change_user_language_to_locale.rb +9 -0
  80. data/db/schema.rb +3 -2
  81. data/features/admin/content_negotiation.feature +4 -4
  82. data/features/admin/layouts_management.feature +2 -2
  83. data/features/admin/pages_management.feature +31 -17
  84. data/features/admin/snippets_management.feature +19 -17
  85. data/features/admin/user_permissions.feature +49 -41
  86. data/features/admin/user_preferences.feature +6 -6
  87. data/features/admin/users_management.feature +8 -9
  88. data/features/page_serving.feature +8 -8
  89. data/features/step_definitions/admin/admin_steps.rb +8 -2
  90. data/features/step_definitions/admin/content_negotiation_steps.rb +14 -5
  91. data/features/step_definitions/admin/pages_management_steps.rb +1 -1
  92. data/features/step_definitions/admin/users_management_steps.rb +3 -0
  93. data/features/step_definitions/page_serving_steps.rb +0 -19
  94. data/features/step_definitions/web_steps.rb +263 -0
  95. data/features/support/dataset.rb +9 -0
  96. data/features/support/env.rb +44 -14
  97. data/features/support/paths.rb +57 -12
  98. data/lib/generators/extension/extension_generator.rb +29 -1
  99. data/lib/generators/extension/templates/RSpecRakefile +14 -1
  100. data/lib/generators/extension/templates/Rakefile +17 -0
  101. data/lib/generators/extension/templates/en.yml +3 -0
  102. data/lib/generators/extension/templates/extension.rb +10 -10
  103. data/lib/generators/extension/templates/routes.rb +5 -0
  104. data/lib/generators/extension/templates/tasks.rake +27 -0
  105. data/lib/generators/extension/templates/test_helper.rb +1 -1
  106. data/lib/generators/instance/instance_generator.rb +3 -2
  107. data/lib/generators/instance/templates/databases/sqlserver.yml +2 -1
  108. data/lib/generators/instance/templates/instance_boot.rb +1 -1
  109. data/lib/generators/instance/templates/instance_environment.rb +8 -1
  110. data/lib/generators/language_extension/USAGE +27 -0
  111. data/lib/generators/language_extension/language_extension_generator.rb +49 -0
  112. data/lib/generators/language_extension/templates/README +3 -0
  113. data/lib/generators/language_extension/templates/RSpecRakefile +123 -0
  114. data/lib/generators/language_extension/templates/Rakefile +25 -0
  115. data/lib/generators/language_extension/templates/available_tags.yml +553 -0
  116. data/lib/generators/language_extension/templates/cucumber.yml +1 -0
  117. data/lib/generators/language_extension/templates/cucumber_env.rb +16 -0
  118. data/lib/generators/language_extension/templates/cucumber_paths.rb +14 -0
  119. data/lib/generators/language_extension/templates/extension.rb +8 -0
  120. data/lib/generators/language_extension/templates/functional_test.rb +15 -0
  121. data/lib/generators/language_extension/templates/lang.yml +181 -0
  122. data/lib/generators/language_extension/templates/spec.opts +6 -0
  123. data/lib/generators/language_extension/templates/spec_helper.rb +36 -0
  124. data/lib/generators/language_extension/templates/tasks.rake +28 -0
  125. data/lib/generators/language_extension/templates/test_helper.rb +26 -0
  126. data/lib/login_system.rb +14 -17
  127. data/lib/radiant.rb +4 -3
  128. data/lib/radiant/admin_ui.rb +114 -58
  129. data/lib/radiant/available_locales.rb +31 -0
  130. data/lib/radiant/cache.rb +12 -0
  131. data/lib/radiant/extension.rb +29 -3
  132. data/lib/radiant/extension/script.rb +44 -13
  133. data/lib/radiant/extension_loader.rb +21 -7
  134. data/lib/radiant/initializer.rb +23 -23
  135. data/lib/radiant/pagination/link_renderer.rb +31 -0
  136. data/lib/radiant/setup.rb +1 -0
  137. data/lib/radiant/taggable.rb +2 -1
  138. data/lib/task_support.rb +21 -1
  139. data/lib/tasks/ci.rake +17 -0
  140. data/lib/tasks/cucumber.rake +39 -13
  141. data/lib/tasks/extensions.rake +12 -1
  142. data/lib/tasks/framework.rake +44 -8
  143. data/lib/tasks/prototype.rake +34 -0
  144. data/lib/tasks/release.rake +6 -4
  145. data/lib/tasks/rspec.rake +7 -7
  146. data/lib/tasks/translate.rake +59 -0
  147. data/lib/tasks/undefine.rake +4 -0
  148. data/lib/translation_support.rb +54 -0
  149. data/public/images/admin/add_tab.png +0 -0
  150. data/public/images/admin/avatar_32x32.png +0 -0
  151. data/public/images/admin/avatar_96x96.png +0 -0
  152. data/public/images/admin/{brown-bottom-line.gif → brown_bottom_line.gif} +0 -0
  153. data/public/images/admin/buttons_background.png +0 -0
  154. data/public/images/admin/calendar_down.gif +0 -0
  155. data/public/images/admin/collapse.png +0 -0
  156. data/public/images/admin/draft_page.png +0 -0
  157. data/public/images/admin/expand.png +0 -0
  158. data/public/images/admin/layout.png +0 -0
  159. data/public/images/admin/login_shadow.png +0 -0
  160. data/public/images/admin/metadata_toggle.png +0 -0
  161. data/public/images/admin/minus_disabled.png +0 -0
  162. data/public/images/admin/minus_grey.png +0 -0
  163. data/public/images/admin/navigation_background.gif +0 -0
  164. data/public/images/admin/navigation_secondary_background.png +0 -0
  165. data/public/images/admin/navigation_secondary_separator.gif +0 -0
  166. data/public/images/admin/navigation_shadow.png +0 -0
  167. data/public/images/admin/navigation_tabs.png +0 -0
  168. data/public/images/admin/{new-homepage.png → new_homepage.png} +0 -0
  169. data/public/images/admin/{new-layout.png → new_layout.png} +0 -0
  170. data/public/images/admin/{new-snippet.png → new_snippet.png} +0 -0
  171. data/public/images/admin/{new-user.png → new_user.png} +0 -0
  172. data/public/images/admin/page.png +0 -0
  173. data/public/images/admin/plus_grey.png +0 -0
  174. data/public/images/admin/popup_border_background.png +0 -0
  175. data/public/images/admin/popup_border_bottom_left.png +0 -0
  176. data/public/images/admin/popup_border_bottom_right.png +0 -0
  177. data/public/images/admin/popup_border_top_left.png +0 -0
  178. data/public/images/admin/popup_border_top_right.png +0 -0
  179. data/public/images/admin/single_form_shadow.png +0 -0
  180. data/public/images/admin/snippet.png +0 -0
  181. data/public/images/admin/spacer.gif +0 -0
  182. data/public/images/admin/status_background.png +0 -0
  183. data/public/images/admin/status_bottom_left.png +0 -0
  184. data/public/images/admin/status_bottom_right.png +0 -0
  185. data/public/images/admin/status_spinner.gif +0 -0
  186. data/public/images/admin/status_top_left.png +0 -0
  187. data/public/images/admin/status_top_right.png +0 -0
  188. data/public/images/admin/tab_close.png +0 -0
  189. data/public/images/admin/vertical_tan_gradient.png +0 -0
  190. data/public/images/admin/view_site.png +0 -0
  191. data/public/images/admin/virtual_page.png +0 -0
  192. data/public/images/radiant-badge-color.png +0 -0
  193. data/public/javascripts/admin/application.js +82 -0
  194. data/public/javascripts/admin/codearea.js +165 -0
  195. data/public/javascripts/{controls.js → admin/controls.js} +78 -76
  196. data/public/javascripts/admin/cookie.js +80 -0
  197. data/public/javascripts/admin/dateinput.js +402 -0
  198. data/public/javascripts/{dragdrop.js → admin/dragdrop.js} +167 -166
  199. data/public/javascripts/{effects.js → admin/effects.js} +168 -174
  200. data/public/javascripts/admin/lowpro.js +340 -0
  201. data/public/javascripts/admin/overrides.js +1 -0
  202. data/public/javascripts/admin/pagestatus.js +17 -0
  203. data/public/javascripts/admin/popup.js +216 -0
  204. data/public/javascripts/{prototype.js → admin/prototype.js} +1574 -1020
  205. data/public/javascripts/admin/ruledtable.js +5 -5
  206. data/public/javascripts/admin/shortcuts.js +27 -0
  207. data/public/javascripts/admin/sitemap.js +37 -20
  208. data/public/javascripts/admin/status.js +233 -0
  209. data/public/javascripts/admin/tabcontrol.js +88 -100
  210. data/public/javascripts/admin/toggle.js +430 -0
  211. data/public/javascripts/admin/utility.js +52 -0
  212. data/public/stylesheets/admin/main.css +1088 -588
  213. data/public/stylesheets/admin/overrides.css +1 -0
  214. data/public/stylesheets/sass/admin/main.sass +26 -0
  215. data/public/stylesheets/sass/admin/modules/_links.sass +15 -0
  216. data/public/stylesheets/sass/admin/modules/_opacity.sass +7 -0
  217. data/public/stylesheets/sass/admin/modules/_rounded.sass +41 -0
  218. data/public/stylesheets/sass/admin/modules/_shadow.sass +9 -0
  219. data/public/stylesheets/sass/admin/overrides.sass +2 -0
  220. data/public/stylesheets/sass/admin/partials/_actions.sass +43 -0
  221. data/public/stylesheets/sass/admin/partials/_avatars.sass +10 -0
  222. data/public/stylesheets/sass/admin/partials/_base.sass +59 -0
  223. data/public/stylesheets/sass/admin/partials/_content.sass +199 -0
  224. data/public/stylesheets/sass/admin/partials/_dateinput.sass +62 -0
  225. data/public/stylesheets/sass/admin/partials/_depreciated.sass +26 -0
  226. data/public/stylesheets/sass/admin/partials/_footer.sass +12 -0
  227. data/public/stylesheets/sass/admin/partials/_forms.sass +309 -0
  228. data/public/stylesheets/sass/admin/partials/_header.sass +112 -0
  229. data/public/stylesheets/sass/admin/partials/_layout.sass +10 -0
  230. data/public/stylesheets/sass/admin/partials/_messages.sass +10 -0
  231. data/public/stylesheets/sass/admin/partials/_popup.sass +117 -0
  232. data/public/stylesheets/sass/admin/partials/_reset.sass +36 -0
  233. data/public/stylesheets/sass/admin/partials/_tabcontrol.sass +70 -0
  234. data/public/stylesheets/sass/admin/partials/_toolbar.sass +31 -0
  235. data/rerun.txt +1 -0
  236. data/script/cucumber +9 -7
  237. data/spec/controllers/admin/export_controller_spec.rb +1 -1
  238. data/spec/controllers/admin/layouts_controller_spec.rb +5 -5
  239. data/spec/controllers/admin/pages_controller_spec.rb +26 -7
  240. data/spec/controllers/admin/preferences_controller_spec.rb +5 -6
  241. data/spec/controllers/admin/references_controller_spec.rb +1 -1
  242. data/spec/controllers/admin/snippets_controller_spec.rb +6 -6
  243. data/spec/controllers/admin/users_controller_spec.rb +10 -1
  244. data/spec/controllers/admin/welcome_controller_spec.rb +3 -3
  245. data/spec/controllers/application_controller_spec.rb +14 -0
  246. data/spec/controllers/site_controller_spec.rb +48 -1
  247. data/spec/datasets/pages_dataset.rb +5 -1
  248. data/spec/datasets/users_dataset.rb +23 -10
  249. data/spec/generators/extension_controller_generator_spec.rb +16 -6
  250. data/spec/generators/extension_generator_spec.rb +49 -18
  251. data/spec/generators/extension_generators_spec_helper.rb +53 -26
  252. data/spec/generators/extension_mailer_generator_spec.rb +3 -3
  253. data/spec/generators/instance_generator_spec.rb +152 -0
  254. data/spec/helpers/admin/node_helper_spec.rb +8 -8
  255. data/spec/helpers/admin/references_helper_spec.rb +4 -4
  256. data/spec/helpers/admin/users_helper_spec.rb +2 -2
  257. data/spec/helpers/application_helper_spec.rb +68 -32
  258. data/spec/lib/login_system_spec.rb +1 -1
  259. data/spec/lib/radiant/admin_ui/nav_tabs_spec.rb +139 -0
  260. data/spec/lib/radiant/admin_ui_spec.rb +30 -131
  261. data/spec/lib/radiant/available_locales_spec.rb +13 -0
  262. data/spec/lib/radiant/extension/script_spec.rb +24 -11
  263. data/spec/lib/radiant/extension_loader_spec.rb +37 -7
  264. data/spec/lib/radiant/extension_spec.rb +32 -1
  265. data/spec/lib/radiant/initializer_spec.rb +32 -2
  266. data/spec/lib/radiant/taggable_spec.rb +10 -8
  267. data/spec/lib/radiant_spec.rb +5 -1
  268. data/spec/lib/task_support_spec.rb +31 -0
  269. data/spec/lib/translation_support_spec.rb +16 -0
  270. data/spec/matchers/generator_matchers.rb +145 -147
  271. data/spec/matchers/render_form_errors_matcher.rb +1 -1
  272. data/spec/models/page_spec.rb +36 -0
  273. data/spec/models/radiant/config_spec.rb +2 -2
  274. data/spec/models/standard_tags_spec.rb +96 -26
  275. data/spec/models/user_spec.rb +32 -8
  276. data/test/fixtures/extensions/{01_basic → basic}/app/controllers/basic_extension_controller.rb +0 -0
  277. data/test/fixtures/extensions/{01_basic → basic}/app/metal/basic_metal.rb +0 -0
  278. data/test/fixtures/extensions/{01_basic → basic}/app/models/basic_extension_mailer.rb +0 -0
  279. data/test/fixtures/extensions/{01_basic → basic}/app/models/basic_extension_model.rb +0 -0
  280. data/test/fixtures/extensions/{01_basic → basic}/app/views/basic_extension/index.html.erb +0 -0
  281. data/test/fixtures/extensions/{01_basic → basic}/app/views/basic_extension/override.html.erb +0 -0
  282. data/test/fixtures/extensions/{01_basic → basic}/app/views/basic_extension_mailer/message.text.html.erb +0 -0
  283. data/test/fixtures/extensions/{01_basic → basic}/basic_extension.rb +3 -4
  284. data/test/fixtures/extensions/{01_basic → basic}/db/migrate/200812131420_create_initial_schema.rb +0 -0
  285. data/test/fixtures/extensions/{01_basic → basic}/db/migrate/200812131421_modify_initial_schema.rb +0 -0
  286. data/test/fixtures/extensions/{01_basic → basic}/lib/new_module.rb +0 -0
  287. data/test/fixtures/extensions/{01_basic → basic}/vendor/plugins/multiple/init.rb +0 -0
  288. data/test/fixtures/extensions/{01_basic → basic}/vendor/plugins/multiple/lib/multiple.rb +0 -0
  289. data/test/fixtures/extensions/{01_basic → basic}/vendor/plugins/plugin_normal/init.rb +0 -0
  290. data/test/fixtures/extensions/{01_basic → basic}/vendor/plugins/plugin_normal/lib/normal_plugin.rb +0 -0
  291. data/test/fixtures/extensions/load_order_blue/load_order_blue_extension.rb +0 -3
  292. data/test/fixtures/extensions/load_order_green/load_order_green_extension.rb +0 -3
  293. data/test/fixtures/extensions/load_order_red/load_order_red_extension.rb +0 -3
  294. data/test/fixtures/extensions/locale/config/locales/en-uk.yml +3 -0
  295. data/test/fixtures/extensions/locale/config/locales/en.yml +3 -0
  296. data/test/fixtures/extensions/locale/locale_extension.rb +5 -0
  297. data/test/fixtures/extensions/{02_overriding → overriding}/app/metal/basic_metal.rb +0 -0
  298. data/test/fixtures/extensions/{02_overriding → overriding}/app/views/basic_extension/override.html.erb +0 -0
  299. data/test/fixtures/extensions/{02_overriding → overriding}/overriding_extension.rb +0 -3
  300. data/test/fixtures/extensions/{02_overriding → overriding}/vendor/plugins/multiple/init.rb +0 -0
  301. data/test/fixtures/extensions/{02_overriding → overriding}/vendor/plugins/multiple/lib/multiple.rb +0 -0
  302. data/test/fixtures/extensions/routed/config/routes.rb +1 -0
  303. data/test/fixtures/extensions/routed/routed_extension.rb +2 -0
  304. data/test/fixtures/extensions/{03_upgrading → upgrading}/db/migrate/01_first.rb +0 -0
  305. data/test/fixtures/extensions/{03_upgrading → upgrading}/db/migrate/02_second.rb +0 -0
  306. data/test/fixtures/extensions/{03_upgrading → upgrading}/db/migrate/03_pending.rb +0 -0
  307. data/test/fixtures/extensions/{03_upgrading → upgrading}/db/migrate/04_dont_run.rb +0 -0
  308. data/test/fixtures/extensions/{03_upgrading → upgrading}/upgrading_extension.rb +0 -0
  309. data/test/fixtures/gems/misnamed_ext-0.0.0/misnamed_ext_extension.rb +2 -0
  310. data/test/fixtures/gems/radiant-gem_ext-extension-0.0.0/gem_ext_extension.rb +2 -0
  311. data/test/fixtures/gems/radiant-gem_ext-extension-0.0.0/lib/gem_ext.rb +3 -0
  312. data/test/test_helper.rb +1 -1
  313. data/vendor/extensions/archive/archive_extension.rb +1 -1
  314. data/vendor/extensions/dutch_language_pack/README +3 -0
  315. data/vendor/extensions/dutch_language_pack/Rakefile +123 -0
  316. data/vendor/extensions/dutch_language_pack/config/locales/nl.yml +187 -0
  317. data/vendor/extensions/dutch_language_pack/config/locales/nl_available_tags.yml +553 -0
  318. data/vendor/extensions/dutch_language_pack/dutch_language_pack_extension.rb +9 -0
  319. data/vendor/extensions/dutch_language_pack/lib/tasks/i18n_nl_extension_tasks.rake +28 -0
  320. data/vendor/extensions/french_language_pack/README +3 -0
  321. data/vendor/extensions/french_language_pack/Rakefile +123 -0
  322. data/vendor/extensions/french_language_pack/config/locales/fr.yml +184 -0
  323. data/vendor/extensions/french_language_pack/config/locales/fr_available_tags.yml +553 -0
  324. data/vendor/extensions/french_language_pack/french_language_pack_extension.rb +9 -0
  325. data/vendor/extensions/french_language_pack/lib/tasks/i18n_fr_extension_tasks.rake +28 -0
  326. data/vendor/extensions/german_language_pack/README +3 -0
  327. data/vendor/extensions/german_language_pack/Rakefile +123 -0
  328. data/vendor/extensions/german_language_pack/config/locales/de.yml +184 -0
  329. data/vendor/extensions/german_language_pack/config/locales/de_available_tags.yml +553 -0
  330. data/vendor/extensions/german_language_pack/german_language_pack_extension.rb +9 -0
  331. data/vendor/extensions/german_language_pack/lib/tasks/i18n_de_extension_tasks.rake +28 -0
  332. data/vendor/extensions/italian_language_pack/README +3 -0
  333. data/vendor/extensions/italian_language_pack/Rakefile +123 -0
  334. data/vendor/extensions/italian_language_pack/config/locales/it.yml +184 -0
  335. data/vendor/extensions/italian_language_pack/config/locales/it_available_tags.yml +553 -0
  336. data/vendor/extensions/italian_language_pack/italian_language_pack_extension.rb +8 -0
  337. data/vendor/extensions/italian_language_pack/lib/tasks/i18n_it_extension_tasks.rake +28 -0
  338. data/vendor/extensions/japanese_language_pack/README +3 -0
  339. data/vendor/extensions/japanese_language_pack/Rakefile +123 -0
  340. data/vendor/extensions/japanese_language_pack/config/locales/ja.yml +184 -0
  341. data/vendor/extensions/japanese_language_pack/config/locales/ja_available_tags.yml +553 -0
  342. data/vendor/extensions/japanese_language_pack/japanese_language_pack_extension.rb +9 -0
  343. data/vendor/extensions/japanese_language_pack/lib/tasks/i18n_ja_extension_tasks.rake +28 -0
  344. data/vendor/extensions/markdown_filter/lib/markdown_filter.rb +5 -1
  345. data/vendor/extensions/markdown_filter/lib/markdown_tags.rb +4 -4
  346. data/vendor/extensions/markdown_filter/markdown.html +122 -122
  347. data/vendor/extensions/markdown_filter/markdown_filter_extension.rb +2 -2
  348. data/vendor/extensions/markdown_filter/smartypants.html +47 -47
  349. data/vendor/extensions/markdown_filter/spec/models/markdown_filter_spec.rb +1 -1
  350. data/vendor/extensions/markdown_filter/vendor/kramdown/AUTHORS +1 -0
  351. data/vendor/extensions/markdown_filter/vendor/kramdown/COPYING +24 -0
  352. data/vendor/extensions/markdown_filter/vendor/kramdown/ChangeLog +2624 -0
  353. data/vendor/extensions/markdown_filter/vendor/kramdown/GPL +674 -0
  354. data/vendor/extensions/markdown_filter/vendor/kramdown/README +20 -0
  355. data/vendor/extensions/markdown_filter/vendor/kramdown/Rakefile +283 -0
  356. data/vendor/extensions/markdown_filter/vendor/kramdown/VERSION +1 -0
  357. data/vendor/extensions/markdown_filter/vendor/kramdown/benchmark/benchmark.rb +34 -0
  358. data/vendor/extensions/markdown_filter/vendor/kramdown/benchmark/generate_data.rb +110 -0
  359. data/vendor/extensions/markdown_filter/vendor/kramdown/benchmark/historic-jruby-1.4.0.dat +7 -0
  360. data/vendor/extensions/markdown_filter/vendor/kramdown/benchmark/historic-ruby-1.8.6.dat +7 -0
  361. data/vendor/extensions/markdown_filter/vendor/kramdown/benchmark/historic-ruby-1.8.7.dat +7 -0
  362. data/vendor/extensions/markdown_filter/vendor/kramdown/benchmark/historic-ruby-1.9.1p243.dat +7 -0
  363. data/vendor/extensions/markdown_filter/vendor/kramdown/benchmark/historic-ruby-1.9.2dev.dat +7 -0
  364. data/vendor/extensions/markdown_filter/vendor/kramdown/benchmark/mdbasics.text +306 -0
  365. data/vendor/extensions/markdown_filter/vendor/kramdown/benchmark/mdsyntax.text +888 -0
  366. data/vendor/extensions/markdown_filter/vendor/kramdown/benchmark/static-jruby-1.4.0.dat +7 -0
  367. data/vendor/extensions/markdown_filter/vendor/kramdown/benchmark/static-ruby-1.8.6.dat +7 -0
  368. data/vendor/extensions/markdown_filter/vendor/kramdown/benchmark/static-ruby-1.8.7.dat +7 -0
  369. data/vendor/extensions/markdown_filter/vendor/kramdown/benchmark/static-ruby-1.9.1p243.dat +7 -0
  370. data/vendor/extensions/markdown_filter/vendor/kramdown/benchmark/static-ruby-1.9.2dev.dat +7 -0
  371. data/vendor/extensions/markdown_filter/vendor/kramdown/benchmark/testing.sh +9 -0
  372. data/vendor/extensions/markdown_filter/vendor/kramdown/benchmark/timing.sh +10 -0
  373. data/vendor/extensions/markdown_filter/vendor/kramdown/bin/kramdown +71 -0
  374. data/vendor/extensions/markdown_filter/vendor/kramdown/doc/default.css +293 -0
  375. data/vendor/extensions/markdown_filter/vendor/kramdown/doc/default.template +78 -0
  376. data/vendor/extensions/markdown_filter/vendor/kramdown/doc/index.page +91 -0
  377. data/vendor/extensions/markdown_filter/vendor/kramdown/doc/installation.page +90 -0
  378. data/vendor/extensions/markdown_filter/vendor/kramdown/doc/news.feed +10 -0
  379. data/vendor/extensions/markdown_filter/vendor/kramdown/doc/news.page +27 -0
  380. data/vendor/extensions/markdown_filter/vendor/kramdown/doc/quickref.page +551 -0
  381. data/vendor/extensions/markdown_filter/vendor/kramdown/doc/syntax.page +1451 -0
  382. data/vendor/extensions/markdown_filter/vendor/kramdown/doc/tests.page +51 -0
  383. data/vendor/extensions/markdown_filter/vendor/kramdown/doc/virtual +2 -0
  384. data/vendor/extensions/markdown_filter/vendor/kramdown/lib/kramdown.rb +23 -0
  385. data/vendor/extensions/markdown_filter/vendor/kramdown/lib/kramdown/compatibility.rb +34 -0
  386. data/vendor/extensions/markdown_filter/vendor/kramdown/lib/kramdown/converter.rb +36 -0
  387. data/vendor/extensions/markdown_filter/vendor/kramdown/lib/kramdown/converter/base.rb +75 -0
  388. data/vendor/extensions/markdown_filter/vendor/kramdown/lib/kramdown/converter/html.rb +325 -0
  389. data/vendor/extensions/markdown_filter/vendor/kramdown/lib/kramdown/converter/latex.rb +516 -0
  390. data/vendor/extensions/markdown_filter/vendor/kramdown/lib/kramdown/document.rb +145 -0
  391. data/vendor/extensions/markdown_filter/vendor/kramdown/lib/kramdown/error.rb +27 -0
  392. data/vendor/extensions/markdown_filter/vendor/kramdown/lib/kramdown/options.rb +262 -0
  393. data/vendor/extensions/markdown_filter/vendor/kramdown/lib/kramdown/parser.rb +33 -0
  394. data/vendor/extensions/markdown_filter/vendor/kramdown/lib/kramdown/parser/kramdown.rb +292 -0
  395. data/vendor/extensions/markdown_filter/vendor/kramdown/lib/kramdown/parser/kramdown/attribute_list.rb +102 -0
  396. data/vendor/extensions/markdown_filter/vendor/kramdown/lib/kramdown/parser/kramdown/autolink.rb +42 -0
  397. data/vendor/extensions/markdown_filter/vendor/kramdown/lib/kramdown/parser/kramdown/blank_line.rb +43 -0
  398. data/vendor/extensions/markdown_filter/vendor/kramdown/lib/kramdown/parser/kramdown/blockquote.rb +42 -0
  399. data/vendor/extensions/markdown_filter/vendor/kramdown/lib/kramdown/parser/kramdown/codeblock.rb +58 -0
  400. data/vendor/extensions/markdown_filter/vendor/kramdown/lib/kramdown/parser/kramdown/codespan.rb +57 -0
  401. data/vendor/extensions/markdown_filter/vendor/kramdown/lib/kramdown/parser/kramdown/emphasis.rb +69 -0
  402. data/vendor/extensions/markdown_filter/vendor/kramdown/lib/kramdown/parser/kramdown/eob.rb +39 -0
  403. data/vendor/extensions/markdown_filter/vendor/kramdown/lib/kramdown/parser/kramdown/escaped_chars.rb +38 -0
  404. data/vendor/extensions/markdown_filter/vendor/kramdown/lib/kramdown/parser/kramdown/extension.rb +109 -0
  405. data/vendor/extensions/markdown_filter/vendor/kramdown/lib/kramdown/parser/kramdown/footnote.rb +73 -0
  406. data/vendor/extensions/markdown_filter/vendor/kramdown/lib/kramdown/parser/kramdown/header.rb +81 -0
  407. data/vendor/extensions/markdown_filter/vendor/kramdown/lib/kramdown/parser/kramdown/horizontal_rule.rb +39 -0
  408. data/vendor/extensions/markdown_filter/vendor/kramdown/lib/kramdown/parser/kramdown/html.rb +253 -0
  409. data/vendor/extensions/markdown_filter/vendor/kramdown/lib/kramdown/parser/kramdown/html_entity.rb +38 -0
  410. data/vendor/extensions/markdown_filter/vendor/kramdown/lib/kramdown/parser/kramdown/line_break.rb +38 -0
  411. data/vendor/extensions/markdown_filter/vendor/kramdown/lib/kramdown/parser/kramdown/link.rb +153 -0
  412. data/vendor/extensions/markdown_filter/vendor/kramdown/lib/kramdown/parser/kramdown/list.rb +225 -0
  413. data/vendor/extensions/markdown_filter/vendor/kramdown/lib/kramdown/parser/kramdown/paragraph.rb +44 -0
  414. data/vendor/extensions/markdown_filter/vendor/kramdown/lib/kramdown/parser/kramdown/smart_quotes.rb +213 -0
  415. data/vendor/extensions/markdown_filter/vendor/kramdown/lib/kramdown/parser/kramdown/table.rb +125 -0
  416. data/vendor/extensions/markdown_filter/vendor/kramdown/lib/kramdown/parser/kramdown/typographic_symbol.rb +48 -0
  417. data/vendor/extensions/markdown_filter/vendor/kramdown/lib/kramdown/version.rb +28 -0
  418. data/vendor/extensions/markdown_filter/vendor/kramdown/setup.rb +1585 -0
  419. data/vendor/extensions/markdown_filter/vendor/kramdown/test/run_tests.rb +58 -0
  420. data/vendor/extensions/markdown_filter/vendor/kramdown/test/test_files.rb +39 -0
  421. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/01_blank_line/spaces.html +1 -0
  422. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/01_blank_line/spaces.text +3 -0
  423. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/01_blank_line/tabs.html +1 -0
  424. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/01_blank_line/tabs.text +6 -0
  425. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/02_eob/beginning.html +1 -0
  426. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/02_eob/beginning.text +3 -0
  427. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/02_eob/end.html +1 -0
  428. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/02_eob/end.text +3 -0
  429. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/02_eob/middle.html +2 -0
  430. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/02_eob/middle.text +5 -0
  431. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/03_paragraph/indented.html +18 -0
  432. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/03_paragraph/indented.text +19 -0
  433. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/03_paragraph/no_newline_at_end.html +5 -0
  434. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/03_paragraph/no_newline_at_end.text +5 -0
  435. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/03_paragraph/one_para.html +1 -0
  436. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/03_paragraph/one_para.text +1 -0
  437. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/03_paragraph/two_para.html +4 -0
  438. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/03_paragraph/two_para.text +4 -0
  439. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/04_header/atx_header.html +34 -0
  440. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/04_header/atx_header.text +32 -0
  441. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/04_header/atx_header_no_newline_at_end.html +1 -0
  442. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/04_header/atx_header_no_newline_at_end.text +1 -0
  443. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/04_header/setext_header.html +31 -0
  444. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/04_header/setext_header.text +36 -0
  445. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/04_header/setext_header_no_newline_at_end.html +1 -0
  446. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/04_header/setext_header_no_newline_at_end.text +2 -0
  447. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/04_header/with_auto_ids.html +17 -0
  448. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/04_header/with_auto_ids.options +1 -0
  449. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/04_header/with_auto_ids.text +19 -0
  450. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/05_blockquote/indented.html +25 -0
  451. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/05_blockquote/indented.text +14 -0
  452. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/05_blockquote/nested.html +9 -0
  453. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/05_blockquote/nested.text +5 -0
  454. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/05_blockquote/no_newline_at_end.html +4 -0
  455. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/05_blockquote/no_newline_at_end.text +2 -0
  456. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/05_blockquote/only_first_quoted.html +8 -0
  457. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/05_blockquote/only_first_quoted.text +4 -0
  458. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/05_blockquote/with_code_blocks.html +15 -0
  459. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/05_blockquote/with_code_blocks.text +11 -0
  460. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/06_codeblock/error.html +4 -0
  461. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/06_codeblock/error.text +4 -0
  462. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/06_codeblock/no_newline_at_end.html +2 -0
  463. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/06_codeblock/no_newline_at_end.text +1 -0
  464. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/06_codeblock/normal.html +13 -0
  465. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/06_codeblock/normal.text +10 -0
  466. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/06_codeblock/tilde_syntax.html +7 -0
  467. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/06_codeblock/tilde_syntax.text +9 -0
  468. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/06_codeblock/whitespace.html +3 -0
  469. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/06_codeblock/whitespace.text +3 -0
  470. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/06_codeblock/with_blank_line.html +13 -0
  471. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/06_codeblock/with_blank_line.text +12 -0
  472. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/06_codeblock/with_eob_marker.html +6 -0
  473. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/06_codeblock/with_eob_marker.text +5 -0
  474. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/07_horizontal_rule/error.html +7 -0
  475. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/07_horizontal_rule/error.text +7 -0
  476. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/07_horizontal_rule/normal.html +19 -0
  477. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/07_horizontal_rule/normal.text +19 -0
  478. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/07_horizontal_rule/sepspaces.html +3 -0
  479. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/07_horizontal_rule/sepspaces.text +3 -0
  480. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/07_horizontal_rule/septabs.html +3 -0
  481. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/07_horizontal_rule/septabs.text +3 -0
  482. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/08_list/escaping.html +17 -0
  483. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/08_list/escaping.text +17 -0
  484. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/08_list/list_and_hr.html +9 -0
  485. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/08_list/list_and_hr.text +5 -0
  486. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/08_list/list_and_others.html +38 -0
  487. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/08_list/list_and_others.text +25 -0
  488. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/08_list/mixed.html +111 -0
  489. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/08_list/mixed.text +66 -0
  490. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/08_list/nested.html +17 -0
  491. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/08_list/nested.text +7 -0
  492. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/08_list/other_first_element.html +39 -0
  493. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/08_list/other_first_element.text +18 -0
  494. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/08_list/simple_ol.html +19 -0
  495. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/08_list/simple_ol.text +13 -0
  496. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/08_list/simple_ul.html +61 -0
  497. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/08_list/simple_ul.text +43 -0
  498. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/08_list/single_item.html +3 -0
  499. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/08_list/single_item.text +1 -0
  500. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/08_list/special_cases.html +29 -0
  501. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/08_list/special_cases.text +19 -0
  502. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/09_html/comment.html +13 -0
  503. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/09_html/comment.text +12 -0
  504. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/09_html/content_model/deflists.html +6 -0
  505. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/09_html/content_model/deflists.options +1 -0
  506. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/09_html/content_model/deflists.text +6 -0
  507. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/09_html/content_model/tables.html +14 -0
  508. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/09_html/content_model/tables.options +1 -0
  509. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/09_html/content_model/tables.text +14 -0
  510. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/09_html/filtered_html.html +1 -0
  511. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/09_html/filtered_html.options +1 -0
  512. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/09_html/filtered_html.text +1 -0
  513. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/09_html/html_and_codeblocks.html +15 -0
  514. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/09_html/html_and_codeblocks.options +1 -0
  515. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/09_html/html_and_codeblocks.text +13 -0
  516. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/09_html/invalid_html_1.html +3 -0
  517. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/09_html/invalid_html_1.text +5 -0
  518. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/09_html/invalid_html_2.html +5 -0
  519. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/09_html/invalid_html_2.text +5 -0
  520. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/09_html/markdown_attr.html +38 -0
  521. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/09_html/markdown_attr.text +38 -0
  522. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/09_html/not_parsed.html +24 -0
  523. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/09_html/not_parsed.text +24 -0
  524. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/09_html/parse_as_raw.html +32 -0
  525. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/09_html/parse_as_raw.options +1 -0
  526. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/09_html/parse_as_raw.text +30 -0
  527. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/09_html/parse_as_span.html +12 -0
  528. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/09_html/parse_as_span.options +1 -0
  529. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/09_html/parse_as_span.text +9 -0
  530. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/09_html/parse_block_html.html +21 -0
  531. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/09_html/parse_block_html.options +1 -0
  532. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/09_html/parse_block_html.text +17 -0
  533. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/09_html/processing_instruction.html +13 -0
  534. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/09_html/processing_instruction.text +12 -0
  535. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/09_html/simple.html +62 -0
  536. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/09_html/simple.options +1 -0
  537. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/09_html/simple.text +57 -0
  538. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/10_ald/simple.html +2 -0
  539. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/10_ald/simple.text +8 -0
  540. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/11_ial/auto_id_and_ial.html +1 -0
  541. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/11_ial/auto_id_and_ial.options +1 -0
  542. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/11_ial/auto_id_and_ial.text +2 -0
  543. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/11_ial/simple.html +20 -0
  544. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/11_ial/simple.text +27 -0
  545. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/12_extension/comment.html +5 -0
  546. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/12_extension/comment.text +11 -0
  547. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/12_extension/ignored.html +6 -0
  548. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/12_extension/ignored.text +11 -0
  549. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/12_extension/nomarkdown.html +6 -0
  550. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/12_extension/nomarkdown.text +11 -0
  551. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/12_extension/options.html +24 -0
  552. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/12_extension/options.text +28 -0
  553. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/12_extension/options2.html +10 -0
  554. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/12_extension/options2.text +5 -0
  555. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/12_extension/options3.html +7 -0
  556. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/12_extension/options3.text +7 -0
  557. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/13_definition_list/definition_at_beginning.html +1 -0
  558. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/13_definition_list/definition_at_beginning.text +1 -0
  559. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/13_definition_list/multiple_terms.html +13 -0
  560. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/13_definition_list/multiple_terms.text +10 -0
  561. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/13_definition_list/no_def_list.html +2 -0
  562. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/13_definition_list/no_def_list.text +2 -0
  563. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/13_definition_list/para_wrapping.html +10 -0
  564. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/13_definition_list/para_wrapping.text +6 -0
  565. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/13_definition_list/separated_by_eob.html +8 -0
  566. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/13_definition_list/separated_by_eob.text +5 -0
  567. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/13_definition_list/simple.html +8 -0
  568. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/13_definition_list/simple.text +7 -0
  569. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/13_definition_list/styled_terms.html +4 -0
  570. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/13_definition_list/styled_terms.text +2 -0
  571. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/13_definition_list/too_much_space.html +3 -0
  572. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/13_definition_list/too_much_space.text +4 -0
  573. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/13_definition_list/with_blocks.html +38 -0
  574. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/13_definition_list/with_blocks.text +24 -0
  575. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/14_table/errors.html +3 -0
  576. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/14_table/errors.text +3 -0
  577. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/14_table/footer.html +65 -0
  578. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/14_table/footer.text +25 -0
  579. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/14_table/header.html +103 -0
  580. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/14_table/header.text +32 -0
  581. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/14_table/no_table.html +3 -0
  582. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/14_table/no_table.text +3 -0
  583. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/14_table/simple.html +61 -0
  584. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/block/14_table/simple.text +16 -0
  585. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/encoding.html +46 -0
  586. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/encoding.text +28 -0
  587. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/01_link/empty.html +3 -0
  588. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/01_link/empty.text +3 -0
  589. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/01_link/image_in_a.html +5 -0
  590. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/01_link/image_in_a.text +5 -0
  591. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/01_link/imagelinks.html +12 -0
  592. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/01_link/imagelinks.text +14 -0
  593. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/01_link/inline.html +40 -0
  594. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/01_link/inline.text +42 -0
  595. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/01_link/link_defs.html +8 -0
  596. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/01_link/link_defs.text +22 -0
  597. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/01_link/links_with_angle_brackets.html +3 -0
  598. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/01_link/links_with_angle_brackets.text +3 -0
  599. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/01_link/reference.html +32 -0
  600. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/01_link/reference.text +42 -0
  601. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/02_emphasis/empty.html +3 -0
  602. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/02_emphasis/empty.text +3 -0
  603. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/02_emphasis/errors.html +9 -0
  604. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/02_emphasis/errors.text +9 -0
  605. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/02_emphasis/nesting.html +34 -0
  606. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/02_emphasis/nesting.text +30 -0
  607. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/02_emphasis/normal.html +46 -0
  608. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/02_emphasis/normal.text +46 -0
  609. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/03_codespan/empty.html +5 -0
  610. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/03_codespan/empty.text +5 -0
  611. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/03_codespan/errors.html +1 -0
  612. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/03_codespan/errors.text +1 -0
  613. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/03_codespan/normal.html +16 -0
  614. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/03_codespan/normal.text +16 -0
  615. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/04_footnote/definitions.html +14 -0
  616. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/04_footnote/definitions.text +18 -0
  617. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/04_footnote/footnote_nr.html +12 -0
  618. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/04_footnote/footnote_nr.options +1 -0
  619. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/04_footnote/footnote_nr.text +4 -0
  620. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/04_footnote/markers.html +46 -0
  621. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/04_footnote/markers.text +26 -0
  622. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/05_html/across_lines.html +1 -0
  623. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/05_html/across_lines.text +2 -0
  624. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/05_html/link_with_mailto.html +1 -0
  625. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/05_html/link_with_mailto.text +1 -0
  626. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/05_html/markdown_attr.html +6 -0
  627. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/05_html/markdown_attr.text +6 -0
  628. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/05_html/normal.html +28 -0
  629. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/05_html/normal.text +28 -0
  630. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/autolinks/url_links.html +9 -0
  631. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/autolinks/url_links.text +9 -0
  632. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/escaped_chars/normal.html +41 -0
  633. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/escaped_chars/normal.text +41 -0
  634. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/ial/simple.html +5 -0
  635. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/ial/simple.text +5 -0
  636. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/line_breaks/normal.html +11 -0
  637. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/line_breaks/normal.text +11 -0
  638. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/text_substitutions/entities.html +4 -0
  639. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/text_substitutions/entities.text +4 -0
  640. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/text_substitutions/greaterthan.html +1 -0
  641. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/text_substitutions/greaterthan.text +1 -0
  642. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/text_substitutions/lowerthan.html +1 -0
  643. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/text_substitutions/lowerthan.text +1 -0
  644. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/text_substitutions/typography.html +15 -0
  645. data/vendor/extensions/markdown_filter/vendor/kramdown/test/testcases/span/text_substitutions/typography.text +15 -0
  646. data/vendor/extensions/russian_language_pack/README +3 -0
  647. data/vendor/extensions/russian_language_pack/Rakefile +123 -0
  648. data/vendor/extensions/russian_language_pack/config/locales/ru.yml +180 -0
  649. data/vendor/extensions/russian_language_pack/config/locales/ru_available_tags.yml +553 -0
  650. data/vendor/extensions/russian_language_pack/lib/tasks/i18n_ru_extension_tasks.rake +28 -0
  651. data/vendor/extensions/russian_language_pack/russian_language_pack_extension.rb +9 -0
  652. data/vendor/extensions/textile_filter/textile.html +114 -114
  653. data/vendor/plugins/dataset/lib/dataset/extensions/cucumber.rb +5 -4
  654. data/vendor/plugins/dataset/lib/dataset/load.rb +0 -10
  655. data/vendor/plugins/dataset/lib/dataset/session.rb +4 -20
  656. data/vendor/plugins/dataset/lib/dataset/session_binding.rb +5 -15
  657. data/vendor/plugins/haml/CONTRIBUTING +4 -0
  658. data/vendor/plugins/haml/MIT-LICENSE +1 -1
  659. data/vendor/plugins/haml/README.md +357 -0
  660. data/vendor/plugins/haml/Rakefile +233 -26
  661. data/vendor/plugins/haml/TODO +47 -0
  662. data/vendor/plugins/haml/VERSION +1 -1
  663. data/vendor/plugins/haml/VERSION_NAME +1 -0
  664. data/vendor/plugins/haml/doc-src/FAQ.md +175 -0
  665. data/vendor/plugins/haml/doc-src/HAML_CHANGELOG.md +479 -0
  666. data/vendor/plugins/haml/doc-src/HAML_REFERENCE.md +1184 -0
  667. data/vendor/plugins/haml/doc-src/SASS_CHANGELOG.md +695 -0
  668. data/vendor/plugins/haml/doc-src/SASS_REFERENCE.md +1150 -0
  669. data/vendor/plugins/haml/extra/haml-mode.el +514 -97
  670. data/vendor/plugins/haml/extra/sass-mode.el +155 -38
  671. data/vendor/plugins/haml/extra/update_watch.rb +13 -0
  672. data/vendor/plugins/haml/haml.gemspec +51 -0
  673. data/vendor/plugins/haml/init.rb +11 -3
  674. data/vendor/plugins/haml/lib/haml.rb +15 -993
  675. data/vendor/plugins/haml/lib/haml/buffer.rb +147 -85
  676. data/vendor/plugins/haml/lib/haml/engine.rb +137 -103
  677. data/vendor/plugins/haml/lib/haml/error.rb +7 -7
  678. data/vendor/plugins/haml/lib/haml/exec.rb +141 -45
  679. data/vendor/plugins/haml/lib/haml/filters.rb +108 -43
  680. data/vendor/plugins/haml/lib/haml/helpers.rb +267 -168
  681. data/vendor/plugins/haml/lib/haml/helpers/action_view_extensions.rb +48 -38
  682. data/vendor/plugins/haml/lib/haml/helpers/action_view_mods.rb +135 -138
  683. data/vendor/plugins/haml/lib/haml/helpers/xss_mods.rb +125 -0
  684. data/vendor/plugins/haml/lib/haml/html.rb +146 -100
  685. data/vendor/plugins/haml/lib/haml/precompiler.rb +528 -277
  686. data/vendor/plugins/haml/lib/haml/shared.rb +78 -0
  687. data/vendor/plugins/haml/lib/haml/template.rb +49 -15
  688. data/vendor/plugins/haml/lib/haml/template/patch.rb +2 -2
  689. data/vendor/plugins/haml/lib/haml/template/plugin.rb +9 -6
  690. data/vendor/plugins/haml/lib/haml/util.rb +299 -6
  691. data/vendor/plugins/haml/lib/haml/version.rb +30 -13
  692. data/vendor/plugins/haml/lib/sass.rb +7 -856
  693. data/vendor/plugins/haml/lib/sass/css.rb +171 -161
  694. data/vendor/plugins/haml/lib/sass/engine.rb +365 -316
  695. data/vendor/plugins/haml/lib/sass/environment.rb +79 -0
  696. data/vendor/plugins/haml/lib/sass/error.rb +33 -11
  697. data/vendor/plugins/haml/lib/sass/files.rb +147 -0
  698. data/vendor/plugins/haml/lib/sass/plugin.rb +177 -123
  699. data/vendor/plugins/haml/lib/sass/plugin/merb.rb +9 -16
  700. data/vendor/plugins/haml/lib/sass/plugin/rack.rb +65 -0
  701. data/vendor/plugins/haml/lib/sass/plugin/rails.rb +15 -15
  702. data/vendor/plugins/haml/lib/sass/repl.rb +58 -0
  703. data/vendor/plugins/haml/lib/sass/script.rb +62 -0
  704. data/vendor/plugins/haml/lib/sass/script/bool.rb +17 -0
  705. data/vendor/plugins/haml/lib/sass/script/color.rb +222 -0
  706. data/vendor/plugins/haml/lib/sass/script/funcall.rb +50 -0
  707. data/vendor/plugins/haml/lib/sass/script/functions.rb +257 -0
  708. data/vendor/plugins/haml/lib/sass/script/lexer.rb +194 -0
  709. data/vendor/plugins/haml/lib/sass/script/literal.rb +177 -0
  710. data/vendor/plugins/haml/lib/sass/script/node.rb +14 -0
  711. data/vendor/plugins/haml/lib/sass/script/number.rb +383 -0
  712. data/vendor/plugins/haml/lib/sass/script/operation.rb +45 -0
  713. data/vendor/plugins/haml/lib/sass/script/parser.rb +222 -0
  714. data/vendor/plugins/haml/lib/sass/script/string.rb +12 -0
  715. data/vendor/plugins/haml/lib/sass/script/unary_operation.rb +34 -0
  716. data/vendor/plugins/haml/lib/sass/script/variable.rb +31 -0
  717. data/vendor/plugins/haml/lib/sass/tree/comment_node.rb +74 -10
  718. data/vendor/plugins/haml/lib/sass/tree/debug_node.rb +30 -0
  719. data/vendor/plugins/haml/lib/sass/tree/directive_node.rb +39 -17
  720. data/vendor/plugins/haml/lib/sass/tree/for_node.rb +48 -0
  721. data/vendor/plugins/haml/lib/sass/tree/if_node.rb +54 -0
  722. data/vendor/plugins/haml/lib/sass/tree/import_node.rb +65 -0
  723. data/vendor/plugins/haml/lib/sass/tree/mixin_def_node.rb +29 -0
  724. data/vendor/plugins/haml/lib/sass/tree/mixin_node.rb +48 -0
  725. data/vendor/plugins/haml/lib/sass/tree/node.rb +216 -11
  726. data/vendor/plugins/haml/lib/sass/tree/prop_node.rb +121 -0
  727. data/vendor/plugins/haml/lib/sass/tree/rule_node.rb +182 -51
  728. data/vendor/plugins/haml/lib/sass/tree/variable_node.rb +34 -0
  729. data/vendor/plugins/haml/lib/sass/tree/while_node.rb +31 -0
  730. data/vendor/plugins/haml/test/haml/engine_test.rb +659 -44
  731. data/vendor/plugins/haml/test/haml/helper_test.rb +60 -2
  732. data/vendor/plugins/haml/test/haml/html2haml_test.rb +60 -0
  733. data/vendor/plugins/haml/test/haml/results/content_for_layout.xhtml +0 -3
  734. data/vendor/plugins/haml/test/haml/results/filters.xhtml +2 -0
  735. data/vendor/plugins/haml/test/haml/results/just_stuff.xhtml +3 -3
  736. data/vendor/plugins/haml/test/haml/results/list.xhtml +1 -1
  737. data/vendor/plugins/haml/test/haml/results/standard.xhtml +120 -0
  738. data/vendor/plugins/haml/test/haml/rhtml/standard.rhtml +2 -2
  739. data/vendor/plugins/haml/test/haml/template_test.rb +117 -11
  740. data/vendor/plugins/haml/test/haml/templates/content_for_layout.haml +0 -2
  741. data/vendor/plugins/haml/test/haml/templates/list.haml +1 -1
  742. data/vendor/plugins/haml/test/haml/templates/standard.haml +2 -2
  743. data/vendor/plugins/haml/test/haml/templates/standard_ugly.haml +2 -2
  744. data/vendor/plugins/haml/test/haml/util_test.rb +107 -0
  745. data/vendor/plugins/haml/test/linked_rails.rb +11 -2
  746. data/vendor/plugins/haml/test/sass/css2sass_test.rb +83 -24
  747. data/vendor/plugins/haml/test/sass/engine_test.rb +743 -67
  748. data/vendor/plugins/haml/test/sass/functions_test.rb +174 -0
  749. data/vendor/plugins/haml/test/sass/more_results/more1.css +9 -0
  750. data/vendor/plugins/haml/test/sass/more_results/more1_with_line_comments.css +26 -0
  751. data/vendor/plugins/haml/test/sass/more_results/more_import.css +29 -0
  752. data/vendor/plugins/haml/test/sass/more_templates/_more_partial.sass +2 -0
  753. data/vendor/plugins/haml/test/sass/more_templates/more1.sass +23 -0
  754. data/vendor/plugins/haml/test/sass/more_templates/more_import.sass +11 -0
  755. data/vendor/plugins/haml/test/sass/plugin_test.rb +130 -48
  756. data/vendor/plugins/haml/test/sass/results/line_numbers.css +49 -0
  757. data/vendor/plugins/haml/test/sass/results/script.css +16 -0
  758. data/vendor/plugins/haml/test/sass/results/subdir/subdir.css +2 -0
  759. data/vendor/plugins/haml/test/sass/results/units.css +11 -0
  760. data/vendor/plugins/haml/test/sass/script_test.rb +267 -0
  761. data/vendor/plugins/haml/test/sass/templates/complex.sass +0 -3
  762. data/vendor/plugins/haml/test/sass/templates/import.sass +2 -2
  763. data/vendor/plugins/haml/test/sass/templates/importee.sass +7 -2
  764. data/vendor/plugins/haml/test/sass/templates/line_numbers.sass +13 -0
  765. data/vendor/plugins/haml/test/sass/templates/script.sass +101 -0
  766. data/vendor/plugins/haml/test/sass/templates/subdir/nested_subdir/_nested_partial.sass +2 -0
  767. data/vendor/plugins/haml/test/sass/templates/subdir/subdir.sass +2 -2
  768. data/vendor/plugins/haml/test/sass/templates/units.sass +11 -0
  769. data/vendor/plugins/haml/test/test_helper.rb +26 -4
  770. data/vendor/plugins/haml/yard/default/fulldoc/html/css/common.sass +22 -0
  771. data/vendor/plugins/haml/yard/default/layout/html/footer.erb +12 -0
  772. data/vendor/plugins/haml/yard/inherited_hash.rb +41 -0
  773. data/vendor/radius/CHANGELOG +8 -0
  774. data/vendor/radius/Manifest.txt +21 -0
  775. data/vendor/radius/{QUICKSTART → QUICKSTART.rdoc} +11 -12
  776. data/vendor/radius/{README → README.rdoc} +38 -17
  777. data/vendor/radius/Rakefile +31 -86
  778. data/vendor/radius/lib/radius.rb +10 -502
  779. data/vendor/radius/lib/radius/context.rb +139 -0
  780. data/vendor/radius/lib/radius/delegating_open_struct.rb +31 -0
  781. data/vendor/radius/lib/radius/error.rb +43 -0
  782. data/vendor/radius/lib/radius/parse_tag.rb +24 -0
  783. data/vendor/radius/lib/radius/parser.rb +65 -0
  784. data/vendor/radius/lib/radius/parser/scan.rb +1247 -0
  785. data/vendor/radius/lib/radius/parser/scan.rl +123 -0
  786. data/vendor/radius/lib/radius/tag_binding.rb +71 -0
  787. data/vendor/radius/lib/radius/tag_definitions.rb +78 -0
  788. data/vendor/radius/lib/radius/utility.rb +30 -0
  789. data/vendor/radius/lib/radius/version.rb +14 -0
  790. data/vendor/radius/radius.gemspec +38 -0
  791. data/vendor/radius/tasks/scan.rake +27 -0
  792. data/vendor/radius/test/context_test.rb +61 -0
  793. data/vendor/radius/test/{radius_test.rb → parser_test.rb} +45 -82
  794. data/vendor/radius/test/quickstart_test.rb +153 -0
  795. data/vendor/radius/test/test_helper.rb +28 -0
  796. data/vendor/rails/Rakefile +81 -0
  797. data/vendor/rails/actionmailer/CHANGELOG +4 -0
  798. data/vendor/rails/actionmailer/Rakefile +1 -1
  799. data/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/parser.rb +2 -0
  800. data/vendor/rails/actionmailer/lib/action_mailer/version.rb +1 -1
  801. data/vendor/rails/actionmailer/lib/actionmailer.rb +1 -0
  802. data/vendor/rails/actionmailer/test/fixtures/helpers/example_helper.rb +1 -1
  803. data/vendor/rails/actionmailer/test/mail_service_test.rb +3 -1
  804. data/vendor/rails/actionpack/CHANGELOG +12 -0
  805. data/vendor/rails/actionpack/Rakefile +1 -1
  806. data/vendor/rails/actionpack/lib/action_controller.rb +3 -1
  807. data/vendor/rails/actionpack/lib/action_controller/assertions/dom_assertions.rb +19 -3
  808. data/vendor/rails/actionpack/lib/action_controller/assertions/selector_assertions.rb +16 -10
  809. data/vendor/rails/actionpack/lib/action_controller/base.rb +1 -1
  810. data/vendor/rails/actionpack/lib/action_controller/caching.rb +1 -0
  811. data/vendor/rails/actionpack/lib/action_controller/cookies.rb +2 -1
  812. data/vendor/rails/actionpack/lib/action_controller/http_authentication.rb +3 -2
  813. data/vendor/rails/actionpack/lib/action_controller/integration.rb +15 -3
  814. data/vendor/rails/actionpack/lib/action_controller/layout.rb +6 -1
  815. data/vendor/rails/actionpack/lib/action_controller/middlewares.rb +2 -0
  816. data/vendor/rails/actionpack/lib/action_controller/polymorphic_routes.rb +6 -21
  817. data/vendor/rails/actionpack/lib/action_controller/rack_lint_patch.rb +36 -0
  818. data/vendor/rails/actionpack/lib/action_controller/request_forgery_protection.rb +6 -2
  819. data/vendor/rails/actionpack/lib/action_controller/response.rb +2 -1
  820. data/vendor/rails/actionpack/lib/action_controller/string_coercion.rb +29 -0
  821. data/vendor/rails/actionpack/lib/action_controller/test_case.rb +6 -1
  822. data/vendor/rails/actionpack/lib/action_controller/test_process.rb +1 -1
  823. data/vendor/rails/actionpack/lib/action_controller/translation.rb +2 -2
  824. data/vendor/rails/actionpack/lib/action_controller/uploaded_file.rb +2 -2
  825. data/vendor/rails/actionpack/lib/action_controller/vendor/html-scanner/html/node.rb +1 -1
  826. data/vendor/rails/actionpack/lib/action_pack/version.rb +1 -1
  827. data/vendor/rails/actionpack/lib/action_view.rb +3 -3
  828. data/vendor/rails/actionpack/lib/action_view/base.rb +6 -1
  829. data/vendor/rails/actionpack/lib/action_view/erb/util.rb +6 -0
  830. data/vendor/rails/actionpack/lib/action_view/helpers.rb +2 -0
  831. data/vendor/rails/actionpack/lib/action_view/helpers/active_record_helper.rb +3 -3
  832. data/vendor/rails/actionpack/lib/action_view/helpers/asset_tag_helper.rb +2 -2
  833. data/vendor/rails/actionpack/lib/action_view/helpers/capture_helper.rb +2 -2
  834. data/vendor/rails/actionpack/lib/action_view/helpers/date_helper.rb +27 -15
  835. data/vendor/rails/actionpack/lib/action_view/helpers/form_helper.rb +32 -11
  836. data/vendor/rails/actionpack/lib/action_view/helpers/form_options_helper.rb +1 -1
  837. data/vendor/rails/actionpack/lib/action_view/helpers/form_tag_helper.rb +3 -3
  838. data/vendor/rails/actionpack/lib/action_view/helpers/number_helper.rb +6 -1
  839. data/vendor/rails/actionpack/lib/action_view/helpers/prototype_helper.rb +1 -1
  840. data/vendor/rails/actionpack/lib/action_view/helpers/raw_output_helper.rb +9 -0
  841. data/vendor/rails/actionpack/lib/action_view/helpers/sanitize_helper.rb +10 -2
  842. data/vendor/rails/actionpack/lib/action_view/helpers/tag_helper.rb +4 -4
  843. data/vendor/rails/actionpack/lib/action_view/helpers/translation_helper.rb +1 -1
  844. data/vendor/rails/actionpack/lib/action_view/helpers/url_helper.rb +3 -3
  845. data/vendor/rails/actionpack/lib/action_view/locale/en.yml +3 -0
  846. data/vendor/rails/actionpack/lib/action_view/partials.rb +1 -1
  847. data/vendor/rails/actionpack/lib/action_view/safe_buffer.rb +28 -0
  848. data/vendor/rails/actionpack/lib/action_view/template.rb +8 -2
  849. data/vendor/rails/actionpack/lib/action_view/test_case.rb +102 -27
  850. data/vendor/rails/actionpack/lib/actionpack.rb +1 -0
  851. data/vendor/rails/actionpack/test/controller/cookie_test.rb +7 -0
  852. data/vendor/rails/actionpack/test/controller/dom_assertions_test.rb +53 -0
  853. data/vendor/rails/actionpack/test/controller/filter_params_test.rb +1 -0
  854. data/vendor/rails/actionpack/test/controller/html-scanner/sanitizer_test.rb +1 -0
  855. data/vendor/rails/actionpack/test/controller/http_digest_authentication_test.rb +22 -0
  856. data/vendor/rails/actionpack/test/controller/integration_test.rb +38 -0
  857. data/vendor/rails/actionpack/test/controller/layout_test.rb +11 -0
  858. data/vendor/rails/actionpack/test/controller/polymorphic_routes_test.rb +4 -0
  859. data/vendor/rails/actionpack/test/controller/request_forgery_protection_test.rb +19 -1
  860. data/vendor/rails/actionpack/test/controller/routing_test.rb +23 -15
  861. data/vendor/rails/actionpack/test/controller/session/test_session_test.rb +2 -2
  862. data/vendor/rails/actionpack/test/fixtures/layout_tests/abs_path_layout.rhtml +1 -0
  863. data/vendor/rails/actionpack/test/fixtures/test/_from_helper.erb +1 -0
  864. data/vendor/rails/actionpack/test/template/active_record_helper_test.rb +1 -1
  865. data/vendor/rails/actionpack/test/template/asset_tag_helper_test.rb +12 -0
  866. data/vendor/rails/actionpack/test/template/benchmark_helper_test.rb +6 -6
  867. data/vendor/rails/actionpack/test/template/compiled_templates_test.rb +2 -1
  868. data/vendor/rails/actionpack/test/template/date_helper_i18n_test.rb +10 -9
  869. data/vendor/rails/actionpack/test/template/date_helper_test.rb +29 -13
  870. data/vendor/rails/actionpack/test/template/form_helper_test.rb +90 -10
  871. data/vendor/rails/actionpack/test/template/number_helper_test.rb +4 -0
  872. data/vendor/rails/actionpack/test/template/raw_output_helper_test.rb +21 -0
  873. data/vendor/rails/actionpack/test/template/sanitize_helper_test.rb +10 -1
  874. data/vendor/rails/actionpack/test/template/tag_helper_test.rb +1 -0
  875. data/vendor/rails/actionpack/test/view/safe_buffer_test.rb +36 -0
  876. data/vendor/rails/actionpack/test/view/test_case_test.rb +173 -5
  877. data/vendor/rails/activemodel/CHANGES +12 -0
  878. data/vendor/rails/activemodel/README +21 -0
  879. data/vendor/rails/activemodel/Rakefile +24 -0
  880. data/vendor/rails/activemodel/lib/active_model.rb +5 -0
  881. data/vendor/rails/activemodel/lib/active_model/base.rb +8 -0
  882. data/vendor/rails/activemodel/lib/active_model/callbacks.rb +7 -0
  883. data/vendor/rails/activemodel/lib/active_model/core.rb +7 -0
  884. data/vendor/rails/activemodel/lib/active_model/deprecated_error_methods.rb +38 -0
  885. data/vendor/rails/activemodel/lib/active_model/errors.rb +82 -0
  886. data/vendor/rails/activemodel/lib/active_model/observing.rb +98 -0
  887. data/vendor/rails/activemodel/lib/active_model/state_machine.rb +68 -0
  888. data/vendor/rails/activemodel/lib/active_model/state_machine/event.rb +64 -0
  889. data/vendor/rails/activemodel/lib/active_model/state_machine/machine.rb +78 -0
  890. data/vendor/rails/activemodel/lib/active_model/state_machine/state.rb +47 -0
  891. data/vendor/rails/activemodel/lib/active_model/state_machine/state_transition.rb +40 -0
  892. data/vendor/rails/activemodel/lib/active_model/validations.rb +126 -0
  893. data/vendor/rails/activemodel/lib/active_model/validations/acceptance.rb +45 -0
  894. data/vendor/rails/activemodel/lib/active_model/validations/associated.rb +46 -0
  895. data/vendor/rails/activemodel/lib/active_model/validations/confirmation.rb +44 -0
  896. data/vendor/rails/activemodel/lib/active_model/validations/exclusion.rb +37 -0
  897. data/vendor/rails/activemodel/lib/active_model/validations/format.rb +39 -0
  898. data/vendor/rails/activemodel/lib/active_model/validations/inclusion.rb +37 -0
  899. data/vendor/rails/activemodel/lib/active_model/validations/length.rb +95 -0
  900. data/vendor/rails/activemodel/lib/active_model/validations/numericality.rb +80 -0
  901. data/vendor/rails/activemodel/lib/active_model/validations/presence.rb +42 -0
  902. data/vendor/rails/activemodel/lib/active_model/validations/uniqueness.rb +104 -0
  903. data/vendor/rails/activemodel/test/observing_test.rb +121 -0
  904. data/vendor/rails/activemodel/test/state_machine/event_test.rb +49 -0
  905. data/vendor/rails/activemodel/test/state_machine/machine_test.rb +43 -0
  906. data/vendor/rails/activemodel/test/state_machine/state_test.rb +72 -0
  907. data/vendor/rails/activemodel/test/state_machine/state_transition_test.rb +84 -0
  908. data/vendor/rails/activemodel/test/state_machine_test.rb +312 -0
  909. data/vendor/rails/activemodel/test/test_helper.rb +21 -0
  910. data/vendor/rails/activerecord/CHANGELOG +8 -0
  911. data/vendor/rails/activerecord/MIT-LICENSE +20 -0
  912. data/vendor/rails/activerecord/Rakefile +1 -1
  913. data/vendor/rails/activerecord/lib/active_record/associations.rb +10 -7
  914. data/vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb +7 -8
  915. data/vendor/rails/activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb +2 -2
  916. data/vendor/rails/activerecord/lib/active_record/associations/has_one_association.rb +9 -0
  917. data/vendor/rails/activerecord/lib/active_record/autosave_association.rb +32 -23
  918. data/vendor/rails/activerecord/lib/active_record/base.rb +7 -0
  919. data/vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb +6 -2
  920. data/vendor/rails/activerecord/lib/active_record/fixtures.rb +1 -1
  921. data/vendor/rails/activerecord/lib/active_record/locking/optimistic.rb +0 -33
  922. data/vendor/rails/activerecord/lib/active_record/locking/pessimistic.rb +0 -22
  923. data/vendor/rails/activerecord/lib/active_record/nested_attributes.rb +101 -38
  924. data/vendor/rails/activerecord/lib/active_record/validations.rb +35 -35
  925. data/vendor/rails/activerecord/lib/active_record/version.rb +1 -1
  926. data/vendor/rails/activerecord/lib/activerecord.rb +1 -0
  927. data/vendor/rails/activerecord/test/cases/associations/has_many_associations_test.rb +12 -0
  928. data/vendor/rails/activerecord/test/cases/associations/has_many_through_associations_test.rb +22 -0
  929. data/vendor/rails/activerecord/test/cases/associations/has_one_associations_test.rb +21 -0
  930. data/vendor/rails/activerecord/test/cases/autosave_association_test.rb +230 -11
  931. data/vendor/rails/activerecord/test/cases/base_test.rb +2 -0
  932. data/vendor/rails/activerecord/test/cases/connection_test_mysql.rb +8 -0
  933. data/vendor/rails/activerecord/test/cases/fixtures_test.rb +2 -2
  934. data/vendor/rails/activerecord/test/cases/locking_test.rb +0 -18
  935. data/vendor/rails/activerecord/test/cases/nested_attributes_test.rb +109 -37
  936. data/vendor/rails/activerecord/test/cases/reflection_test.rb +3 -3
  937. data/vendor/rails/activerecord/test/cases/validations_i18n_test.rb +8 -0
  938. data/vendor/rails/activerecord/test/cases/validations_test.rb +37 -9
  939. data/vendor/rails/activerecord/test/fixtures/accounts.yml +1 -0
  940. data/vendor/rails/activerecord/test/models/company.rb +10 -0
  941. data/vendor/rails/activerecord/test/models/pirate.rb +9 -2
  942. data/vendor/rails/activerecord/test/models/treasure.rb +2 -0
  943. data/vendor/rails/activerecord/test/schema/mysql_specific_schema.rb +12 -0
  944. data/vendor/rails/activerecord/test/schema/schema.rb +1 -0
  945. data/vendor/rails/activeresource/CHANGELOG +9 -0
  946. data/vendor/rails/activeresource/MIT-LICENSE +20 -0
  947. data/vendor/rails/activeresource/Rakefile +1 -1
  948. data/vendor/rails/activeresource/lib/active_resource/validations.rb +2 -2
  949. data/vendor/rails/activeresource/lib/active_resource/version.rb +1 -1
  950. data/vendor/rails/activeresource/lib/activeresource.rb +1 -0
  951. data/vendor/rails/activeresource/test/base_errors_test.rb +2 -2
  952. data/vendor/rails/activesupport/CHANGELOG +8 -0
  953. data/vendor/rails/activesupport/MIT-LICENSE +20 -0
  954. data/vendor/rails/activesupport/Rakefile +175 -0
  955. data/vendor/rails/activesupport/bin/generate_tables +147 -0
  956. data/vendor/rails/activesupport/install.rb +30 -0
  957. data/vendor/rails/activesupport/lib/active_support/cache.rb +7 -0
  958. data/vendor/rails/activesupport/lib/active_support/cache/mem_cache_store.rb +5 -0
  959. data/vendor/rails/activesupport/lib/active_support/cache/strategy/local_cache.rb +5 -5
  960. data/vendor/rails/activesupport/lib/active_support/core_ext.rb +7 -3
  961. data/vendor/rails/activesupport/lib/active_support/core_ext/blank.rb +2 -58
  962. data/vendor/rails/activesupport/lib/active_support/core_ext/kernel/debugger.rb +1 -0
  963. data/vendor/rails/activesupport/lib/active_support/core_ext/name_error.rb +3 -1
  964. data/vendor/rails/activesupport/lib/active_support/core_ext/object.rb +1 -0
  965. data/vendor/rails/activesupport/lib/active_support/core_ext/object/blank.rb +58 -0
  966. data/vendor/rails/activesupport/lib/active_support/core_ext/string.rb +2 -0
  967. data/vendor/rails/activesupport/lib/active_support/core_ext/string/output_safety.rb +48 -0
  968. data/vendor/rails/activesupport/lib/active_support/core_ext/time/calculations.rb +2 -1
  969. data/vendor/rails/activesupport/lib/active_support/deprecation.rb +1 -1
  970. data/vendor/rails/activesupport/lib/active_support/json/backends/jsongem.rb +2 -3
  971. data/vendor/rails/activesupport/lib/active_support/json/backends/yaml.rb +1 -5
  972. data/vendor/rails/activesupport/lib/active_support/json/decoding.rb +2 -0
  973. data/vendor/rails/activesupport/lib/active_support/message_verifier.rb +30 -10
  974. data/vendor/rails/activesupport/lib/active_support/multibyte/chars.rb +1 -1
  975. data/vendor/rails/activesupport/lib/active_support/multibyte/utils.rb +4 -4
  976. data/vendor/rails/activesupport/lib/active_support/ordered_hash.rb +7 -0
  977. data/vendor/rails/activesupport/lib/active_support/vendor.rb +2 -2
  978. data/vendor/rails/activesupport/lib/active_support/version.rb +1 -1
  979. data/vendor/rails/activesupport/lib/active_support/whiny_nil.rb +8 -2
  980. data/vendor/rails/activesupport/lib/active_support/xml_mini/nokogiri.rb +13 -21
  981. data/vendor/rails/activesupport/lib/activesupport.rb +1 -0
  982. data/vendor/rails/activesupport/test/abstract_unit.rb +36 -0
  983. data/vendor/rails/activesupport/test/autoloading_fixtures/a/b.rb +2 -0
  984. data/vendor/rails/activesupport/test/autoloading_fixtures/a/c/d.rb +2 -0
  985. data/vendor/rails/activesupport/test/autoloading_fixtures/a/c/e/f.rb +2 -0
  986. data/vendor/rails/activesupport/test/autoloading_fixtures/application.rb +1 -0
  987. data/vendor/rails/activesupport/test/autoloading_fixtures/class_folder.rb +3 -0
  988. data/vendor/rails/activesupport/test/autoloading_fixtures/class_folder/class_folder_subclass.rb +3 -0
  989. data/vendor/rails/activesupport/test/autoloading_fixtures/class_folder/inline_class.rb +2 -0
  990. data/vendor/rails/activesupport/test/autoloading_fixtures/class_folder/nested_class.rb +7 -0
  991. data/vendor/rails/activesupport/test/autoloading_fixtures/conflict.rb +1 -0
  992. data/vendor/rails/activesupport/test/autoloading_fixtures/counting_loader.rb +5 -0
  993. data/vendor/rails/activesupport/test/autoloading_fixtures/cross_site_dependency.rb +2 -0
  994. data/vendor/rails/activesupport/test/autoloading_fixtures/e.rb +2 -0
  995. data/vendor/rails/activesupport/test/autoloading_fixtures/module_folder/inline_class.rb +2 -0
  996. data/vendor/rails/activesupport/test/autoloading_fixtures/module_folder/nested_class.rb +4 -0
  997. data/vendor/rails/activesupport/test/autoloading_fixtures/module_folder/nested_sibling.rb +2 -0
  998. data/vendor/rails/activesupport/test/autoloading_fixtures/module_with_custom_const_missing/a/b.rb +1 -0
  999. data/vendor/rails/activesupport/test/autoloading_fixtures/multiple_constant_file.rb +2 -0
  1000. data/vendor/rails/activesupport/test/autoloading_fixtures/raises_name_error.rb +3 -0
  1001. data/vendor/rails/activesupport/test/autoloading_fixtures/raises_no_method_error.rb +3 -0
  1002. data/vendor/rails/activesupport/test/buffered_logger_test.rb +146 -0
  1003. data/vendor/rails/activesupport/test/caching_test.rb +348 -0
  1004. data/vendor/rails/activesupport/test/callbacks_test.rb +188 -0
  1005. data/vendor/rails/activesupport/test/clean_backtrace_test.rb +47 -0
  1006. data/vendor/rails/activesupport/test/clean_logger_test.rb +57 -0
  1007. data/vendor/rails/activesupport/test/core_ext/array_ext_test.rb +363 -0
  1008. data/vendor/rails/activesupport/test/core_ext/base64_ext_test.rb +8 -0
  1009. data/vendor/rails/activesupport/test/core_ext/bigdecimal.rb +10 -0
  1010. data/vendor/rails/activesupport/test/core_ext/blank_test.rb +24 -0
  1011. data/vendor/rails/activesupport/test/core_ext/cgi_ext_test.rb +14 -0
  1012. data/vendor/rails/activesupport/test/core_ext/class/attribute_accessor_test.rb +31 -0
  1013. data/vendor/rails/activesupport/test/core_ext/class/class_inheritable_attributes_test.rb +224 -0
  1014. data/vendor/rails/activesupport/test/core_ext/class/delegating_attributes_test.rb +115 -0
  1015. data/vendor/rails/activesupport/test/core_ext/class_test.rb +46 -0
  1016. data/vendor/rails/activesupport/test/core_ext/date_ext_test.rb +278 -0
  1017. data/vendor/rails/activesupport/test/core_ext/date_time_ext_test.rb +359 -0
  1018. data/vendor/rails/activesupport/test/core_ext/duplicable_test.rb +22 -0
  1019. data/vendor/rails/activesupport/test/core_ext/duration_test.rb +121 -0
  1020. data/vendor/rails/activesupport/test/core_ext/enumerable_test.rb +97 -0
  1021. data/vendor/rails/activesupport/test/core_ext/exception_test.rb +68 -0
  1022. data/vendor/rails/activesupport/test/core_ext/file_test.rb +67 -0
  1023. data/vendor/rails/activesupport/test/core_ext/float_ext_test.rb +25 -0
  1024. data/vendor/rails/activesupport/test/core_ext/hash_ext_test.rb +1014 -0
  1025. data/vendor/rails/activesupport/test/core_ext/integer_ext_test.rb +37 -0
  1026. data/vendor/rails/activesupport/test/core_ext/kernel_test.rb +43 -0
  1027. data/vendor/rails/activesupport/test/core_ext/load_error_test.rb +16 -0
  1028. data/vendor/rails/activesupport/test/core_ext/module/attr_accessor_with_default_test.rb +30 -0
  1029. data/vendor/rails/activesupport/test/core_ext/module/attr_internal_test.rb +52 -0
  1030. data/vendor/rails/activesupport/test/core_ext/module/attribute_accessor_test.rb +33 -0
  1031. data/vendor/rails/activesupport/test/core_ext/module/attribute_aliasing_test.rb +58 -0
  1032. data/vendor/rails/activesupport/test/core_ext/module/model_naming_test.rb +27 -0
  1033. data/vendor/rails/activesupport/test/core_ext/module/synchronization_test.rb +85 -0
  1034. data/vendor/rails/activesupport/test/core_ext/module_test.rb +363 -0
  1035. data/vendor/rails/activesupport/test/core_ext/name_error_test.rb +20 -0
  1036. data/vendor/rails/activesupport/test/core_ext/numeric_ext_test.rb +162 -0
  1037. data/vendor/rails/activesupport/test/core_ext/object_and_class_ext_test.rb +282 -0
  1038. data/vendor/rails/activesupport/test/core_ext/object_ext_test.rb +8 -0
  1039. data/vendor/rails/activesupport/test/core_ext/pathname_test.rb +9 -0
  1040. data/vendor/rails/activesupport/test/core_ext/proc_test.rb +11 -0
  1041. data/vendor/rails/activesupport/test/core_ext/range_ext_test.rb +63 -0
  1042. data/vendor/rails/activesupport/test/core_ext/string_ext_test.rb +369 -0
  1043. data/vendor/rails/activesupport/test/core_ext/symbol_test.rb +9 -0
  1044. data/vendor/rails/activesupport/test/core_ext/time_ext_test.rb +744 -0
  1045. data/vendor/rails/activesupport/test/core_ext/time_with_zone_test.rb +845 -0
  1046. data/vendor/rails/activesupport/test/core_ext/uri_ext_test.rb +12 -0
  1047. data/vendor/rails/activesupport/test/dependencies/check_warnings.rb +2 -0
  1048. data/vendor/rails/activesupport/test/dependencies/conflict.rb +1 -0
  1049. data/vendor/rails/activesupport/test/dependencies/cross_site_depender.rb +3 -0
  1050. data/vendor/rails/activesupport/test/dependencies/mutual_one.rb +4 -0
  1051. data/vendor/rails/activesupport/test/dependencies/mutual_two.rb +4 -0
  1052. data/vendor/rails/activesupport/test/dependencies/raises_exception.rb +3 -0
  1053. data/vendor/rails/activesupport/test/dependencies/requires_nonexistent0.rb +1 -0
  1054. data/vendor/rails/activesupport/test/dependencies/requires_nonexistent1.rb +1 -0
  1055. data/vendor/rails/activesupport/test/dependencies/service_one.rb +5 -0
  1056. data/vendor/rails/activesupport/test/dependencies/service_two.rb +2 -0
  1057. data/vendor/rails/activesupport/test/dependencies_test.rb +782 -0
  1058. data/vendor/rails/activesupport/test/deprecation_test.rb +167 -0
  1059. data/vendor/rails/activesupport/test/flush_cache_on_private_memoization_test.rb +43 -0
  1060. data/vendor/rails/activesupport/test/gzip_test.rb +7 -0
  1061. data/vendor/rails/activesupport/test/i18n_test.rb +98 -0
  1062. data/vendor/rails/activesupport/test/inflector_test.rb +298 -0
  1063. data/vendor/rails/activesupport/test/inflector_test_cases.rb +252 -0
  1064. data/vendor/rails/activesupport/test/json/decoding_test.rb +73 -0
  1065. data/vendor/rails/activesupport/test/json/encoding_test.rb +160 -0
  1066. data/vendor/rails/activesupport/test/memoizable_test.rb +247 -0
  1067. data/vendor/rails/activesupport/test/message_encryptor_test.rb +46 -0
  1068. data/vendor/rails/activesupport/test/message_verifier_test.rb +31 -0
  1069. data/vendor/rails/activesupport/test/multibyte_chars_test.rb +606 -0
  1070. data/vendor/rails/activesupport/test/multibyte_conformance.rb +129 -0
  1071. data/vendor/rails/activesupport/test/multibyte_test_helpers.rb +19 -0
  1072. data/vendor/rails/activesupport/test/multibyte_unicode_database_test.rb +22 -0
  1073. data/vendor/rails/activesupport/test/multibyte_utils_test.rb +137 -0
  1074. data/vendor/rails/activesupport/test/option_merger_test.rb +85 -0
  1075. data/vendor/rails/activesupport/test/ordered_hash_test.rb +201 -0
  1076. data/vendor/rails/activesupport/test/ordered_options_test.rb +53 -0
  1077. data/vendor/rails/activesupport/test/rescuable_test.rb +75 -0
  1078. data/vendor/rails/activesupport/test/secure_random_test.rb +19 -0
  1079. data/vendor/rails/activesupport/test/string_inquirer_test.rb +15 -0
  1080. data/vendor/rails/activesupport/test/test_test.rb +148 -0
  1081. data/vendor/rails/activesupport/test/time_zone_test.rb +266 -0
  1082. data/vendor/rails/activesupport/test/whiny_nil_test.rb +50 -0
  1083. data/vendor/rails/activesupport/test/xml_mini/jdom_engine_test.rb +153 -0
  1084. data/vendor/rails/activesupport/test/xml_mini/nokogiri_engine_test.rb +168 -0
  1085. data/vendor/rails/activesupport/test/xml_mini/rexml_engine_test.rb +15 -0
  1086. data/vendor/rails/ci/ci_build.rb +119 -0
  1087. data/vendor/rails/ci/ci_setup_notes.txt +131 -0
  1088. data/vendor/rails/ci/cruise_config.rb +9 -0
  1089. data/vendor/rails/ci/geminstaller.yml +24 -0
  1090. data/vendor/rails/ci/site.css +13 -0
  1091. data/vendor/rails/ci/site_config.rb +72 -0
  1092. data/vendor/rails/doc/template/horo.rb +613 -0
  1093. data/vendor/rails/pushgems.rb +14 -0
  1094. data/vendor/rails/railties/CHANGELOG +6 -0
  1095. data/vendor/rails/railties/Rakefile +6 -6
  1096. data/vendor/rails/railties/lib/commands/plugin.rb +1 -1
  1097. data/vendor/rails/railties/lib/rails/rack/debugger.rb +2 -0
  1098. data/vendor/rails/railties/lib/rails/version.rb +1 -1
  1099. data/vendor/rails/railties/lib/rails_generator/options.rb +7 -7
  1100. data/vendor/rails/railties/lib/tasks/rails.rb +2 -1
  1101. data/vendor/rails/railties/test/abstract_unit.rb +27 -0
  1102. data/vendor/rails/railties/test/backtrace_cleaner_test.rb +61 -0
  1103. data/vendor/rails/railties/test/boot_test.rb +178 -0
  1104. data/vendor/rails/railties/test/console_app_test.rb +42 -0
  1105. data/vendor/rails/railties/test/fcgi_dispatcher_test.rb +266 -0
  1106. data/vendor/rails/railties/test/fixtures/about_yml_plugins/bad_about_yml/about.yml +1 -0
  1107. data/vendor/rails/railties/test/fixtures/about_yml_plugins/bad_about_yml/init.rb +1 -0
  1108. data/vendor/rails/railties/test/fixtures/about_yml_plugins/plugin_without_about_yml/init.rb +1 -0
  1109. data/vendor/rails/railties/test/fixtures/eager/zoo.rb +3 -0
  1110. data/vendor/rails/railties/test/fixtures/eager/zoo/reptile_house.rb +2 -0
  1111. data/vendor/rails/railties/test/fixtures/environment_with_constant.rb +1 -0
  1112. data/vendor/{extensions/markdown_filter/lib/tasks/textile_filter_extension_tasks.rake → rails/railties/test/fixtures/lib/generators/missing_class/missing_class_generator.rb} +0 -0
  1113. data/vendor/rails/railties/test/fixtures/lib/generators/working/working_generator.rb +2 -0
  1114. data/vendor/rails/railties/test/fixtures/metal/multiplemetals/app/metal/metal_a.rb +5 -0
  1115. data/vendor/rails/railties/test/fixtures/metal/multiplemetals/app/metal/metal_b.rb +5 -0
  1116. data/vendor/rails/railties/test/fixtures/metal/pluralmetal/app/metal/legacy_routes.rb +5 -0
  1117. data/vendor/rails/railties/test/fixtures/metal/singlemetal/app/metal/foo_metal.rb +5 -0
  1118. data/vendor/rails/railties/test/fixtures/metal/subfolders/app/metal/Folder/metal_a.rb +7 -0
  1119. data/vendor/rails/railties/test/fixtures/metal/subfolders/app/metal/Folder/metal_b.rb +7 -0
  1120. data/vendor/rails/railties/test/fixtures/plugins/alternate/a/generators/a_generator/a_generator.rb +4 -0
  1121. data/vendor/rails/railties/test/fixtures/plugins/default/gemlike/init.rb +1 -0
  1122. data/vendor/rails/railties/test/fixtures/plugins/default/gemlike/lib/gemlike.rb +2 -0
  1123. data/vendor/rails/railties/test/fixtures/plugins/default/gemlike/rails/init.rb +7 -0
  1124. data/vendor/rails/railties/test/fixtures/plugins/default/plugin_with_no_lib_dir/init.rb +0 -0
  1125. data/vendor/rails/railties/test/fixtures/plugins/default/stubby/about.yml +2 -0
  1126. data/vendor/rails/railties/test/fixtures/plugins/default/stubby/generators/stubby_generator/stubby_generator.rb +4 -0
  1127. data/vendor/rails/railties/test/fixtures/plugins/default/stubby/init.rb +7 -0
  1128. data/vendor/rails/railties/test/fixtures/plugins/default/stubby/lib/stubby_mixin.rb +2 -0
  1129. data/vendor/rails/railties/test/fixtures/plugins/engines/engine/app/controllers/engine_controller.rb +2 -0
  1130. data/vendor/rails/railties/test/fixtures/plugins/engines/engine/app/metal/engine_metal.rb +10 -0
  1131. data/vendor/rails/railties/test/fixtures/plugins/engines/engine/app/models/engine_model.rb +2 -0
  1132. data/vendor/rails/railties/test/fixtures/plugins/engines/engine/config/locales/en.yml +2 -0
  1133. data/vendor/rails/railties/test/fixtures/plugins/engines/engine/config/routes.rb +3 -0
  1134. data/vendor/rails/railties/test/fixtures/plugins/engines/engine/init.rb +3 -0
  1135. data/vendor/rails/railties/test/fixtures/public/foo/bar.html +1 -0
  1136. data/vendor/rails/railties/test/fixtures/public/foo/index.html +1 -0
  1137. data/vendor/rails/railties/test/fixtures/public/index.html +1 -0
  1138. data/vendor/rails/railties/test/gem_dependency_test.rb +219 -0
  1139. data/vendor/rails/railties/test/generator_lookup_test.rb +40 -0
  1140. data/vendor/rails/railties/test/generators/generator_test_helper.rb +310 -0
  1141. data/vendor/rails/railties/test/generators/rails_controller_generator_test.rb +44 -0
  1142. data/vendor/rails/railties/test/generators/rails_helper_generator_test.rb +36 -0
  1143. data/vendor/rails/railties/test/generators/rails_mailer_generator_test.rb +29 -0
  1144. data/vendor/rails/railties/test/generators/rails_model_generator_test.rb +96 -0
  1145. data/vendor/rails/railties/test/generators/rails_resource_generator_test.rb +29 -0
  1146. data/vendor/rails/railties/test/generators/rails_scaffold_generator_test.rb +151 -0
  1147. data/vendor/rails/railties/test/generators/rails_template_runner_test.rb +216 -0
  1148. data/vendor/rails/railties/test/initializer_test.rb +416 -0
  1149. data/vendor/rails/railties/test/metal_test.rb +72 -0
  1150. data/vendor/rails/railties/test/mocks/routes.rb +6 -0
  1151. data/vendor/rails/railties/test/plugin_loader_test.rb +172 -0
  1152. data/vendor/rails/railties/test/plugin_locator_test.rb +62 -0
  1153. data/vendor/rails/railties/test/plugin_test.rb +162 -0
  1154. data/vendor/rails/railties/test/plugin_test_helper.rb +29 -0
  1155. data/vendor/rails/railties/test/rack_static_test.rb +46 -0
  1156. data/vendor/rails/railties/test/rails_generator_test.rb +145 -0
  1157. data/vendor/rails/railties/test/rails_info_controller_test.rb +52 -0
  1158. data/vendor/rails/railties/test/rails_info_test.rb +99 -0
  1159. data/vendor/rails/railties/test/secret_key_generation_test.rb +38 -0
  1160. data/vendor/rails/railties/test/vendor/gems/dummy-gem-a-0.4.0/lib/dummy-gem-a.rb +1 -0
  1161. data/vendor/rails/railties/test/vendor/gems/dummy-gem-b-0.4.0/lib/dummy-gem-b.rb +1 -0
  1162. data/vendor/rails/railties/test/vendor/gems/dummy-gem-b-0.6.0/lib/dummy-gem-b.rb +1 -0
  1163. data/vendor/rails/railties/test/vendor/gems/dummy-gem-c-0.4.0/lib/dummy-gem-c.rb +1 -0
  1164. data/vendor/rails/railties/test/vendor/gems/dummy-gem-c-0.6.0/lib/dummy-gem-c.rb +1 -0
  1165. data/vendor/rails/railties/test/vendor/gems/dummy-gem-d-1.0.0/lib/dummy-gem-d.rb +1 -0
  1166. data/vendor/rails/railties/test/vendor/gems/dummy-gem-e-1.0.0/lib/dummy-gem-e.rb +1 -0
  1167. data/vendor/rails/railties/test/vendor/gems/dummy-gem-f-1.0.0/lib/dummy-gem-f.rb +1 -0
  1168. data/vendor/rails/railties/test/vendor/gems/dummy-gem-g-1.0.0/lib/dummy-gem-g.rb +1 -0
  1169. data/vendor/rails/railties/test/vendor/gems/dummy-gem-h-1.0.0/lib/dummy-gem-h.rb +1 -0
  1170. data/vendor/rails/railties/test/vendor/gems/dummy-gem-i-1.0.0/ext/dummy-gem-i/Makefile +0 -0
  1171. data/vendor/rails/railties/test/vendor/gems/dummy-gem-i-1.0.0/lib/dummy-gem-i.rb +1 -0
  1172. data/vendor/rails/railties/test/vendor/gems/dummy-gem-j-1.0.0/lib/dummy-gem-j.rb +1 -0
  1173. data/vendor/rails/railties/test/vendor/gems/dummy-gem-k-1.0.0/lib/dummy-gem-k.rb +1 -0
  1174. data/vendor/rails/release.rb +25 -0
  1175. metadata +814 -84
  1176. data/app/views/admin/pages/_edit_styles.html.haml +0 -15
  1177. data/app/views/admin/references/filters.js.erb +0 -5
  1178. data/app/views/admin/references/tags.js.erb +0 -5
  1179. data/features/step_definitions/webrat_steps.rb +0 -117
  1180. data/public/images/admin/add-child.png +0 -0
  1181. data/public/images/admin/clear-page-cache.png +0 -0
  1182. data/public/images/admin/remove-disabled.png +0 -0
  1183. data/public/images/admin/remove.png +0 -0
  1184. data/public/images/admin/view-site.gif +0 -0
  1185. data/public/images/admin/virtual-page.png +0 -0
  1186. data/public/javascripts/admin/admin.js +0 -149
  1187. data/public/javascripts/application.js +0 -2
  1188. data/public/javascripts/pngfix.js +0 -39
  1189. data/public/javascripts/string.js +0 -17
  1190. data/vendor/extensions/markdown_filter/vendor/bluecloth/CHANGES +0 -366
  1191. data/vendor/extensions/markdown_filter/vendor/bluecloth/LICENSE +0 -340
  1192. data/vendor/extensions/markdown_filter/vendor/bluecloth/README +0 -99
  1193. data/vendor/extensions/markdown_filter/vendor/bluecloth/bin/bluecloth +0 -83
  1194. data/vendor/extensions/markdown_filter/vendor/bluecloth/install.rb +0 -150
  1195. data/vendor/extensions/markdown_filter/vendor/bluecloth/lib/bluecloth.rb +0 -1144
  1196. data/vendor/extensions/markdown_filter/vendor/bluecloth/test.rb +0 -117
  1197. data/vendor/extensions/markdown_filter/vendor/bluecloth/tests/00_Class.tests.rb +0 -71
  1198. data/vendor/extensions/markdown_filter/vendor/bluecloth/tests/05_Markdown.tests.rb +0 -1527
  1199. data/vendor/extensions/markdown_filter/vendor/bluecloth/tests/10_Bug.tests.rb +0 -57
  1200. data/vendor/extensions/markdown_filter/vendor/bluecloth/tests/15_Contrib.tests.rb +0 -132
  1201. data/vendor/extensions/markdown_filter/vendor/bluecloth/tests/bctestcase.rb +0 -274
  1202. data/vendor/extensions/markdown_filter/vendor/bluecloth/tests/data/antsugar.txt +0 -34
  1203. data/vendor/extensions/markdown_filter/vendor/bluecloth/tests/data/ml-announce.txt +0 -17
  1204. data/vendor/extensions/markdown_filter/vendor/bluecloth/tests/data/re-overflow.txt +0 -67
  1205. data/vendor/extensions/markdown_filter/vendor/bluecloth/tests/data/re-overflow2.txt +0 -281
  1206. data/vendor/extensions/markdown_filter/vendor/bluecloth/utils.rb +0 -553
  1207. data/vendor/radius/ROADMAP +0 -12
  1208. data/vendor/rails/activerecord/test/fixtures/fixture_database.sqlite +0 -0
  1209. data/vendor/rails/activerecord/test/fixtures/fixture_database.sqlite3 +0 -0
  1210. data/vendor/rails/activerecord/test/fixtures/fixture_database_2.sqlite +0 -0
  1211. data/vendor/rails/activerecord/test/fixtures/fixture_database_2.sqlite3 +0 -0
  1212. data/vendor/rails/activeresource/test/debug.log +0 -7974
@@ -2,48 +2,18 @@ require File.dirname(__FILE__) + '/../haml'
2
2
 
3
3
  require 'haml/engine'
4
4
  require 'rubygems'
5
- require 'hpricot'
6
5
  require 'cgi'
7
6
 
8
7
  module Haml
9
- # This class contains the functionality used in the +html2haml+ utility,
10
- # namely converting HTML documents to Haml templates.
11
- # It depends on Hpricot for HTML parsing (http://code.whytheluckystiff.net/hpricot/).
12
8
  class HTML
13
- # Creates a new instance of Haml::HTML that will compile the given template,
14
- # which can either be a string containing HTML or an Hpricot node,
15
- # to a Haml string when +render+ is called.
16
- def initialize(template, options = {})
17
- @@options = options
18
-
19
- if template.is_a? Hpricot::Node
20
- @template = template
21
- else
22
- if template.is_a? IO
23
- template = template.read
24
- end
25
-
26
- if @@options[:rhtml]
27
- match_to_html(template, /<%=(.*?)-?%>/m, 'loud')
28
- match_to_html(template, /<%-?(.*?)-?%>/m, 'silent')
29
- end
30
-
31
- method = @@options[:xhtml] ? Hpricot.method(:XML) : method(:Hpricot)
32
- @template = method.call(template.gsub('&', '&amp;'))
33
- end
34
- end
35
-
36
- # Processes the document and returns the result as a string
37
- # containing the Haml template.
38
- def render
39
- @template.to_haml(0)
40
- end
41
- alias_method :to_haml, :render
42
-
43
- module ::Hpricot::Node
44
- # Returns the Haml representation of the given node,
45
- # at the given tabulation.
46
- def to_haml(tabs = 0)
9
+ # A module containing utility methods that every Hpricot node
10
+ # should have.
11
+ module Node
12
+ # Returns the Haml representation of the given node.
13
+ #
14
+ # @param tabs [Fixnum] The indentation level of the resulting Haml.
15
+ # @option options (see Haml::HTML#initialize)
16
+ def to_haml(tabs, options)
47
17
  parse_text(self.to_s, tabs)
48
18
  end
49
19
 
@@ -53,8 +23,13 @@ module Haml
53
23
  ' ' * tabs
54
24
  end
55
25
 
26
+ def attr_hash
27
+ attributes.to_hash
28
+ end
29
+
56
30
  def parse_text(text, tabs)
57
31
  text.strip!
32
+ text.gsub!('#{', '\#{') #'
58
33
  if text.empty?
59
34
  String.new
60
35
  else
@@ -67,40 +42,112 @@ module Haml
67
42
  end
68
43
  end
69
44
  end
45
+ end
46
+ end
47
+
48
+ # Haml monkeypatches various Hpricot classes
49
+ # to add methods for conversion to Haml.
50
+ # @private
51
+ module Hpricot
52
+ # @see Hpricot
53
+ module Node
54
+ include Haml::HTML::Node
55
+ end
70
56
 
71
- # :stopdoc:
57
+ # @see Hpricot
58
+ class BaseEle
59
+ include Haml::HTML::Node
60
+ end
61
+ end
72
62
 
73
- def self.options
74
- @@options
63
+ require 'hpricot'
64
+
65
+ module Haml
66
+ # Converts HTML documents into Haml templates.
67
+ # Depends on [Hpricot](http://github.com/whymirror/hpricot) for HTML parsing.
68
+ #
69
+ # Example usage:
70
+ #
71
+ # Haml::Engine.new("<a href='http://google.com'>Blat</a>").render
72
+ # #=> "%a{:href => 'http://google.com'} Blat"
73
+ class HTML
74
+ # @param template [String, Hpricot::Node] The HTML template to convert
75
+ # @option options :rhtml [Boolean] (false) Whether or not to parse
76
+ # ERB's `<%= %>` and `<% %>` into Haml's `=` and `-`
77
+ # @option options :xhtml [Boolean] (false) Whether or not to parse
78
+ # the HTML strictly as XHTML
79
+ def initialize(template, options = {})
80
+ @options = options
81
+
82
+ if template.is_a? Hpricot::Node
83
+ @template = template
84
+ else
85
+ if template.is_a? IO
86
+ template = template.read
87
+ end
88
+
89
+ if @options[:rhtml]
90
+ match_to_html(template, /<%=(.*?)-?%>/m, 'loud')
91
+ match_to_html(template, /<%-?(.*?)-?%>/m, 'silent')
92
+ end
93
+
94
+ method = @options[:xhtml] ? Hpricot.method(:XML) : method(:Hpricot)
95
+ @template = method.call(template.gsub('&', '&amp;'))
96
+ end
75
97
  end
76
98
 
99
+ # Processes the document and returns the result as a string
100
+ # containing the Haml template.
101
+ def render
102
+ @template.to_haml(0, @options)
103
+ end
104
+ alias_method :to_haml, :render
105
+
106
+ # @private
77
107
  TEXT_REGEXP = /^(\s*).*$/
78
108
 
109
+ # @see Hpricot
110
+ # @private
79
111
  class ::Hpricot::Doc
80
- def to_haml(tabs = 0)
81
- output = ''
82
- children.each { |child| output += child.to_haml(0) } if children
83
- output
112
+ # @see Haml::HTML::Node#to_haml
113
+ def to_haml(tabs, options)
114
+ (children || []).inject('') {|s, c| s << c.to_haml(0, options)}
84
115
  end
85
116
  end
86
117
 
118
+ # @see Hpricot
119
+ # @private
87
120
  class ::Hpricot::XMLDecl
88
- def to_haml(tabs = 0)
121
+ # @see Haml::HTML::Node#to_haml
122
+ def to_haml(tabs, options)
89
123
  "#{tabulate(tabs)}!!! XML\n"
90
124
  end
91
125
  end
92
126
 
127
+ # @see Hpricot
128
+ # @private
129
+ class ::Hpricot::CData
130
+ # @see Haml::HTML::Node#to_haml
131
+ def to_haml(tabs, options)
132
+ "#{tabulate(tabs)}:cdata\n#{parse_text(self.content, tabs + 1)}"
133
+ end
134
+ end
135
+
136
+ # @see Hpricot
137
+ # @private
93
138
  class ::Hpricot::DocType
94
- def to_haml(tabs = 0)
95
- attrs = public_id.scan(/DTD\s+([^\s]+)\s*([^\s]*)\s*([^\s]*)\s*\/\//)[0]
139
+ # @see Haml::HTML::Node#to_haml
140
+ def to_haml(tabs, options)
141
+ attrs = public_id.nil? ? ["", "", ""] :
142
+ public_id.scan(/DTD\s+([^\s]+)\s*([^\s]*)\s*([^\s]*)\s*\/\//)[0]
96
143
  if attrs == nil
97
144
  raise Exception.new("Invalid doctype")
98
145
  end
99
146
 
100
147
  type, version, strictness = attrs.map { |a| a.downcase }
101
148
  if type == "html"
102
- version = "1.0"
103
- strictness = "transitional"
149
+ version = ""
150
+ strictness = "strict" if strictness == ""
104
151
  end
105
152
 
106
153
  if version == "1.0" || version.empty?
@@ -111,45 +158,49 @@ module Haml
111
158
  strictness = nil
112
159
  end
113
160
 
114
- version = " #{version}" if version
115
- if strictness
116
- strictness[0] = strictness[0] - 32
117
- strictness = " #{strictness}"
118
- end
161
+ version = " #{version.capitalize}" if version
162
+ strictness = " #{strictness.capitalize}" if strictness
119
163
 
120
164
  "#{tabulate(tabs)}!!!#{version}#{strictness}\n"
121
165
  end
122
166
  end
123
167
 
168
+ # @see Hpricot
169
+ # @private
124
170
  class ::Hpricot::Comment
125
- def to_haml(tabs = 0)
171
+ # @see Haml::HTML::Node#to_haml
172
+ def to_haml(tabs, options)
126
173
  "#{tabulate(tabs)}/\n#{parse_text(self.content, tabs + 1)}"
127
174
  end
128
175
  end
129
176
 
177
+ # @see Hpricot
178
+ # @private
130
179
  class ::Hpricot::Elem
131
- def to_haml(tabs = 0)
180
+ # @see Haml::HTML::Node#to_haml
181
+ def to_haml(tabs, options)
132
182
  output = "#{tabulate(tabs)}"
133
- if HTML.options[:rhtml] && name[0...5] == 'haml:'
134
- return output + HTML.send("haml_tag_#{name[5..-1]}", CGI.unescapeHTML(self.inner_text))
183
+ if options[:rhtml] && name[0...5] == 'haml:'
184
+ return output + send("haml_tag_#{name[5..-1]}", CGI.unescapeHTML(self.inner_text))
135
185
  end
136
186
 
137
- output += "%#{name}" unless name == 'div' && (static_id? || static_classname?)
187
+ output += "%#{name}" unless name == 'div' &&
188
+ (static_id?(options) || static_classname?(options))
138
189
 
139
- if attributes
140
- if static_id?
141
- output += "##{attributes['id']}"
190
+ if attr_hash
191
+ if static_id?(options)
192
+ output += "##{attr_hash['id']}"
142
193
  remove_attribute('id')
143
194
  end
144
- if static_classname?
145
- attributes['class'].split(' ').each { |c| output += ".#{c}" }
195
+ if static_classname?(options)
196
+ attr_hash['class'].split(' ').each { |c| output += ".#{c}" }
146
197
  remove_attribute('class')
147
198
  end
148
- output += haml_attributes if attributes.length > 0
199
+ output += haml_attributes(options) if attr_hash.length > 0
149
200
  end
150
201
 
151
202
  (self.children || []).inject(output + "\n") do |output, child|
152
- output + child.to_haml(tabs + 1)
203
+ output + child.to_haml(tabs + 1, options)
153
204
  end
154
205
  end
155
206
 
@@ -157,44 +208,48 @@ module Haml
157
208
 
158
209
  def dynamic_attributes
159
210
  @dynamic_attributes ||= begin
160
- attributes.inject({}) do |dynamic, pair|
161
- name, value = pair
162
- unless value.empty?
163
- full_match = nil
164
- ruby_value = value.gsub(%r{<haml:loud>\s*(.+?)\s*</haml:loud>}) do
165
- full_match = $`.empty? && $'.empty?
166
- full_match ? $1: "\#{#{$1}}"
167
- end
168
- unless ruby_value == value
169
- dynamic[name] = full_match ? ruby_value : %("#{ruby_value}")
170
- end
211
+ Haml::Util.map_hash(attr_hash) do |name, value|
212
+ next if value.empty?
213
+ full_match = nil
214
+ ruby_value = value.gsub(%r{<haml:loud>\s*(.+?)\s*</haml:loud>}) do
215
+ full_match = $`.empty? && $'.empty?
216
+ CGI.unescapeHTML(full_match ? $1: "\#{#{$1}}")
171
217
  end
172
- dynamic
218
+ next if ruby_value == value
219
+ [name, full_match ? ruby_value : %("#{ruby_value}")]
173
220
  end
174
221
  end
175
222
  end
176
-
177
- def static_attribute?(name)
178
- attributes[name] and !dynamic_attribute?(name)
223
+
224
+ def haml_tag_loud(text)
225
+ "= #{text.gsub(/\n\s*/, ' ').strip}\n"
226
+ end
227
+
228
+ def haml_tag_silent(text)
229
+ text.split("\n").map { |line| "- #{line.strip}\n" }.join
230
+ end
231
+
232
+ def static_attribute?(name, options)
233
+ attr_hash[name] and !dynamic_attribute?(name, options)
179
234
  end
180
235
 
181
- def dynamic_attribute?(name)
182
- HTML.options[:rhtml] and dynamic_attributes.key?(name)
236
+ def dynamic_attribute?(name, options)
237
+ options[:rhtml] and dynamic_attributes.key?(name)
183
238
  end
184
239
 
185
- def static_id?
186
- static_attribute? 'id'
240
+ def static_id?(options)
241
+ static_attribute?('id', options)
187
242
  end
188
243
 
189
- def static_classname?
190
- static_attribute? 'class'
244
+ def static_classname?(options)
245
+ static_attribute?('class', options)
191
246
  end
192
247
 
193
248
  # Returns a string representation of an attributes hash
194
249
  # that's prettier than that produced by Hash#inspect
195
- def haml_attributes
196
- attrs = attributes.map do |name, value|
197
- value = dynamic_attribute?(name) ? dynamic_attributes[name] : value.inspect
250
+ def haml_attributes(options)
251
+ attrs = attr_hash.map do |name, value|
252
+ value = dynamic_attribute?(name, options) ? dynamic_attributes[name] : value.inspect
198
253
  name = name.index(/\W/) ? name.inspect : ":#{name}"
199
254
  "#{name} => #{value}"
200
255
  end
@@ -202,14 +257,6 @@ module Haml
202
257
  end
203
258
  end
204
259
 
205
- def self.haml_tag_loud(text)
206
- "= #{text.gsub(/\n\s*/, ' ').strip}\n"
207
- end
208
-
209
- def self.haml_tag_silent(text)
210
- text.split("\n").map { |line| "- #{line.strip}\n" }.join
211
- end
212
-
213
260
  private
214
261
 
215
262
  def match_to_html(string, regex, tag)
@@ -217,6 +264,5 @@ module Haml
217
264
  "<haml:#{tag}>#{CGI.escapeHTML($1)}</haml:#{tag}>"
218
265
  end
219
266
  end
220
- # :startdoc:
221
267
  end
222
268
  end
@@ -1,48 +1,67 @@
1
1
  require 'strscan'
2
+ require 'haml/shared'
2
3
 
3
4
  module Haml
5
+ # Handles the internal pre-compilation from Haml into Ruby code,
6
+ # which then runs the final creation of the HTML string.
4
7
  module Precompiler
8
+ include Haml::Util
9
+
5
10
  # Designates an XHTML/XML element.
11
+ # @private
6
12
  ELEMENT = ?%
7
13
 
8
- # Designates a <tt><div></tt> element with the given class.
14
+ # Designates a `<div>` element with the given class.
15
+ # @private
9
16
  DIV_CLASS = ?.
10
17
 
11
- # Designates a <tt><div></tt> element with the given id.
18
+ # Designates a `<div>` element with the given id.
19
+ # @private
12
20
  DIV_ID = ?#
13
21
 
14
22
  # Designates an XHTML/XML comment.
23
+ # @private
15
24
  COMMENT = ?/
16
25
 
17
26
  # Designates an XHTML doctype or script that is never HTML-escaped.
27
+ # @private
18
28
  DOCTYPE = ?!
19
29
 
20
30
  # Designates script, the result of which is output.
31
+ # @private
21
32
  SCRIPT = ?=
22
33
 
23
34
  # Designates script that is always HTML-escaped.
35
+ # @private
24
36
  SANITIZE = ?&
25
37
 
26
38
  # Designates script, the result of which is flattened and output.
39
+ # @private
27
40
  FLAT_SCRIPT = ?~
28
41
 
29
42
  # Designates script which is run but not output.
43
+ # @private
30
44
  SILENT_SCRIPT = ?-
31
45
 
32
46
  # When following SILENT_SCRIPT, designates a comment that is not output.
47
+ # @private
33
48
  SILENT_COMMENT = ?#
34
49
 
35
50
  # Designates a non-parsed line.
51
+ # @private
36
52
  ESCAPE = ?\\
37
53
 
38
54
  # Designates a block of filtered text.
55
+ # @private
39
56
  FILTER = ?:
40
57
 
41
58
  # Designates a non-parsed line. Not actually a character.
59
+ # @private
42
60
  PLAIN_TEXT = -1
43
61
 
44
62
  # Keeps track of the ASCII values of the characters that begin a
45
63
  # specially-interpreted line.
64
+ # @private
46
65
  SPECIAL_CHARACTERS = [
47
66
  ELEMENT,
48
67
  DIV_CLASS,
@@ -59,15 +78,13 @@ module Haml
59
78
 
60
79
  # The value of the character that designates that a line is part
61
80
  # of a multiline string.
81
+ # @private
62
82
  MULTILINE_CHAR_VALUE = ?|
63
83
 
64
- # Characters that designate that a multiline string may be about
65
- # to begin.
66
- MULTILINE_STARTERS = SPECIAL_CHARACTERS - [?/]
67
-
68
- # Keywords that appear in the middle of a Ruby block with lowered
69
- # indentation. If a block has been started using indentation,
70
- # lowering the indentation with one of these won't end the block.
84
+ # Regex to match keywords that appear in the middle of a Ruby block
85
+ # with lowered indentation.
86
+ # If a block has been started using indentation,
87
+ # lowering the indentation with one of these won't end the block.
71
88
  # For example:
72
89
  #
73
90
  # - if foo
@@ -75,31 +92,43 @@ module Haml
75
92
  # - else
76
93
  # %p no!
77
94
  #
78
- # The block is ended after <tt>%p no!</tt>, because <tt>else</tt>
95
+ # The block is ended after `%p no!`, because `else`
79
96
  # is a member of this array.
80
- MID_BLOCK_KEYWORDS = ['else', 'elsif', 'rescue', 'ensure', 'when']
97
+ # @private
98
+ MID_BLOCK_KEYWORD_REGEX = /^-\s*(#{%w[else elsif rescue ensure when end].join('|')})\b/
81
99
 
82
100
  # The Regex that matches a Doctype command.
83
- DOCTYPE_REGEX = /(\d\.\d)?[\s]*([a-z]*)/i
101
+ # @private
102
+ DOCTYPE_REGEX = /(\d(?:\.\d)?)?[\s]*([a-z]*)/i
84
103
 
85
104
  # The Regex that matches a literal string or symbol value
86
- LITERAL_VALUE_REGEX = /^\s*(:(\w*)|(('|")([^\\\#'"]*?)\4))\s*$/
105
+ # @private
106
+ LITERAL_VALUE_REGEX = /:(\w*)|(["'])((?![\\#]|\2).|\\.)*\2/
87
107
 
88
108
  private
89
109
 
90
110
  # Returns the precompiled string with the preamble and postamble
91
111
  def precompiled_with_ambles(local_names)
92
112
  preamble = <<END.gsub("\n", ";")
113
+ begin
93
114
  extend Haml::Helpers
94
115
  _hamlout = @haml_buffer = Haml::Buffer.new(@haml_buffer, #{options_for_buffer.inspect})
95
116
  _erbout = _hamlout.buffer
96
117
  __in_erb_template = true
97
118
  END
98
119
  postamble = <<END.gsub("\n", ";")
120
+ #{precompiled_method_return_value}
121
+ ensure
99
122
  @haml_buffer = @haml_buffer.upper
100
- _erbout
123
+ end
101
124
  END
102
- preamble + locals_code(local_names) + @precompiled + postamble
125
+ preamble + locals_code(local_names) + precompiled + postamble
126
+ end
127
+
128
+ # Returns the string used as the return value of the precompiled method.
129
+ # This method exists so it can be monkeypatched to return modified values.
130
+ def precompiled_method_return_value
131
+ "_erbout"
103
132
  end
104
133
 
105
134
  def locals_code(names)
@@ -107,63 +136,72 @@ END
107
136
 
108
137
  names.map do |name|
109
138
  # Can't use || because someone might explicitly pass in false with a symbol
110
- sym_local = "_haml_locals[#{name.to_sym.inspect}]"
111
- str_local = "_haml_locals[#{name.to_s.inspect}]"
139
+ sym_local = "_haml_locals[#{name.to_sym.inspect}]"
140
+ str_local = "_haml_locals[#{name.to_s.inspect}]"
112
141
  "#{name} = #{sym_local}.nil? ? #{str_local} : #{sym_local}"
113
142
  end.join(';') + ';'
114
143
  end
115
144
 
116
- Line = Struct.new(:text, :unstripped, :index, :spaces, :tabs)
145
+ # @private
146
+ class Line < Struct.new(:text, :unstripped, :full, :index, :precompiler, :eod)
147
+ alias_method :eod?, :eod
117
148
 
118
- def precompile
119
- @haml_comment = @dont_indent_next_line = @dont_tab_up_next_text = false
120
- @indentation = nil
121
- old_line = Line.new
122
- @template.split(/\r\n|\r|\n/).each_with_index do |text, index|
123
- @next_line = line = Line.new(text.strip, text.lstrip.chomp, index)
124
- line.spaces, line.tabs = count_soft_tabs(text)
149
+ def tabs
150
+ line = self
151
+ @tabs ||= precompiler.instance_eval do
152
+ break 0 if line.text.empty? || !(whitespace = line.full[/^\s+/])
125
153
 
126
- suppress_render = handle_multiline(old_line) unless flat?
154
+ if @indentation.nil?
155
+ @indentation = whitespace
127
156
 
128
- if old_line.text.nil? || suppress_render
129
- old_line = line
130
- resolve_newlines
131
- newline
132
- next
133
- end
157
+ if @indentation.include?(?\s) && @indentation.include?(?\t)
158
+ raise SyntaxError.new("Indentation can't use both tabs and spaces.", line.index)
159
+ end
134
160
 
135
- process_indent(old_line) unless old_line.text.empty?
161
+ @flat_spaces = @indentation * @template_tabs if flat?
162
+ break 1
163
+ end
136
164
 
137
- if line.text.empty? && !flat?
138
- newline
139
- next
165
+ tabs = whitespace.length / @indentation.length
166
+ break tabs if whitespace == @indentation * tabs
167
+ break @template_tabs if flat? && whitespace =~ /^#{@indentation * @template_tabs}/
168
+
169
+ raise SyntaxError.new(<<END.strip.gsub("\n", ' '), line.index)
170
+ Inconsistent indentation: #{Haml::Shared.human_indentation whitespace, true} used for indentation,
171
+ but the rest of the document was indented using #{Haml::Shared.human_indentation @indentation}.
172
+ END
140
173
  end
174
+ end
175
+ end
176
+
177
+ def precompile
178
+ @haml_comment = @dont_indent_next_line = @dont_tab_up_next_text = false
179
+ @indentation = nil
180
+ @line = next_line
181
+ resolve_newlines
182
+ newline
183
+
184
+ raise SyntaxError.new("Indenting at the beginning of the document is illegal.", @line.index) if @line.tabs != 0
185
+
186
+ while next_line
187
+ process_indent(@line) unless @line.text.empty?
141
188
 
142
189
  if flat?
143
- push_flat(old_line)
144
- old_line = line
190
+ push_flat(@line)
191
+ @line = @next_line
145
192
  newline
146
193
  next
147
194
  end
148
195
 
149
- if old_line.spaces != old_line.tabs * 2
150
- raise SyntaxError.new(<<END.strip, old_line.index)
151
- #{old_line.spaces} space#{old_line.spaces == 1 ? ' was' : 's were'} used for indentation. Haml must be indented using two spaces.
152
- END
153
- end
196
+ process_line(@line.text, @line.index) unless @line.text.empty? || @haml_comment
154
197
 
155
- unless old_line.text.empty? || @haml_comment
156
- process_line(old_line.text, old_line.index, line.tabs > old_line.tabs && !line.text.empty?)
198
+ if !flat? && @next_line.tabs - @line.tabs > 1
199
+ raise SyntaxError.new("The line was indented #{@next_line.tabs - @line.tabs} levels deeper than the previous line.", @next_line.index)
157
200
  end
158
- resolve_newlines
159
201
 
160
- if !flat? && line.tabs - old_line.tabs > 1
161
- raise SyntaxError.new(<<END.strip, line.index)
162
- #{line.spaces} spaces were used for indentation. Haml must be indented using two spaces.
163
- END
164
- end
165
- old_line = line
166
- newline
202
+ resolve_newlines unless @next_line.eod?
203
+ @line = @next_line
204
+ newline unless @next_line.eod?
167
205
  end
168
206
 
169
207
  # Close all the open tags
@@ -176,29 +214,32 @@ END
176
214
  return unless line.tabs <= @template_tabs && @template_tabs > 0
177
215
 
178
216
  to_close = @template_tabs - line.tabs
179
- to_close.times { |i| close unless to_close - 1 - i == 0 && mid_block_keyword?(line.text) }
217
+ to_close.times {|i| close unless to_close - 1 - i == 0 && mid_block_keyword?(line.text)}
180
218
  end
181
219
 
182
220
  # Processes a single line of Haml.
183
221
  #
184
222
  # This method doesn't return anything; it simply processes the line and
185
- # adds the appropriate code to <tt>@precompiled</tt>.
186
- def process_line(text, index, block_opened)
187
- @block_opened = block_opened
223
+ # adds the appropriate code to `@precompiled`.
224
+ def process_line(text, index)
188
225
  @index = index + 1
189
226
 
190
227
  case text[0]
191
- when DIV_CLASS, DIV_ID; render_div(text)
228
+ when DIV_CLASS; render_div(text)
229
+ when DIV_ID
230
+ return push_plain(text) if text[1] == ?{
231
+ render_div(text)
192
232
  when ELEMENT; render_tag(text)
193
233
  when COMMENT; render_comment(text[1..-1].strip)
194
234
  when SANITIZE
195
- return push_script(unescape_interpolation(text[3..-1].strip), false, false, false, true) if text[1..2] == "=="
196
- return push_script(text[2..-1].strip, false, false, false, true) if text[1] == SCRIPT
235
+ return push_plain(text[3..-1].strip, :escape_html => true) if text[1..2] == "=="
236
+ return push_script(text[2..-1].strip, :escape_html => true) if text[1] == SCRIPT
237
+ return push_flat_script(text[2..-1].strip, :escape_html => true) if text[1] == FLAT_SCRIPT
238
+ return push_plain(text[1..-1].strip, :escape_html => true) if text[1] == ?\s
197
239
  push_plain text
198
240
  when SCRIPT
199
- return push_script(unescape_interpolation(text[2..-1].strip), false) if text[1] == SCRIPT
200
- return push_script(text[1..-1], false, false, false, true) if options[:escape_html]
201
- push_script(text[1..-1], false)
241
+ return push_plain(text[2..-1].strip) if text[1] == SCRIPT
242
+ push_script(text[1..-1])
202
243
  when FLAT_SCRIPT; push_flat_script(text[1..-1])
203
244
  when SILENT_SCRIPT
204
245
  return start_haml_comment if text[1] == SILENT_COMMENT
@@ -214,63 +255,55 @@ END
214
255
  push_silent(text[1..-1], true)
215
256
  newline_now
216
257
 
217
- case_stmt = text[1..-1].split(' ', 2)[0] == "case"
218
- block = @block_opened && !mid_block_keyword?(text)
219
- push_and_tabulate([:script]) if block || case_stmt
220
- push_and_tabulate(nil) if block && case_stmt
258
+ # Handle stuff like - end.join("|")
259
+ @to_close_stack.last << false if text =~ /^-\s*end\b/ && !block_opened?
260
+
261
+ case_stmt = text =~ /^-\s*case\b/
262
+ keyword = mid_block_keyword?(text)
263
+ block = block_opened? && !keyword
264
+
265
+ # It's important to preserve tabulation modification for keywords
266
+ # that involve choosing between posible blocks of code.
267
+ if %w[else elsif when].include?(keyword)
268
+ # @to_close_stack may not have a :script on top
269
+ # when the preceding "- if" has nothing nested
270
+ if @to_close_stack.last && @to_close_stack.last.first == :script
271
+ @dont_indent_next_line, @dont_tab_up_next_text = @to_close_stack.last[1..2]
272
+ else
273
+ push_and_tabulate([:script, @dont_indent_next_line, @dont_tab_up_next_text])
274
+ end
275
+
276
+ # when is unusual in that either it will be indented twice,
277
+ # or the case won't have created its own indentation
278
+ if keyword == "when"
279
+ push_and_tabulate([:script, @dont_indent_next_line, @dont_tab_up_next_text, false])
280
+ end
281
+ elsif block || case_stmt
282
+ push_and_tabulate([:script, @dont_indent_next_line, @dont_tab_up_next_text])
283
+ elsif block && case_stmt
284
+ push_and_tabulate([:script, @dont_indent_next_line, @dont_tab_up_next_text])
285
+ end
221
286
  when FILTER; start_filtered(text[1..-1].downcase)
222
287
  when DOCTYPE
223
288
  return render_doctype(text) if text[0...3] == '!!!'
224
- return push_script(unescape_interpolation(text[3..-1].strip), false) if text[1..2] == "=="
225
- return push_script(text[2..-1].strip, false) if text[1] == SCRIPT
289
+ return push_plain(text[3..-1].strip, :escape_html => false) if text[1..2] == "=="
290
+ return push_script(text[2..-1].strip, :escape_html => false) if text[1] == SCRIPT
291
+ return push_flat_script(text[2..-1].strip, :escape_html => false) if text[1] == FLAT_SCRIPT
292
+ return push_plain(text[1..-1].strip, :escape_html => false) if text[1] == ?\s
226
293
  push_plain text
227
294
  when ESCAPE; push_plain text[1..-1]
228
295
  else push_plain text
229
296
  end
230
297
  end
231
298
 
232
- # Returns whether or not the text is a silent script text with one
233
- # of Ruby's mid-block keywords.
299
+ # If the text is a silent script text with one of Ruby's mid-block keywords,
300
+ # returns the name of that keyword.
301
+ # Otherwise, returns nil.
234
302
  def mid_block_keyword?(text)
235
- text.length > 2 && text[0] == SILENT_SCRIPT && MID_BLOCK_KEYWORDS.include?(text[1..-1].split[0])
236
- end
237
-
238
- # Deals with all the logic of figuring out whether a given line is
239
- # the beginning, continuation, or end of a multiline sequence.
240
- #
241
- # This returns whether or not the line should be
242
- # rendered normally.
243
- def handle_multiline(line)
244
- text = line.text
245
-
246
- # A multiline string is active, and is being continued
247
- if is_multiline?(text) && @multiline
248
- @multiline.text << text[0...-1]
249
- return true
250
- end
251
-
252
- # A multiline string has just been activated, start adding the lines
253
- if is_multiline?(text) && (MULTILINE_STARTERS.include? text[0])
254
- @multiline = Line.new text[0...-1], nil, line.index, nil, line.tabs
255
- process_indent(line)
256
- return true
257
- end
258
-
259
- # A multiline string has just ended, make line into the result
260
- if @multiline && !line.text.empty?
261
- process_line(@multiline.text, @multiline.index, line.tabs > @multiline.tabs)
262
- @multiline = nil
263
- end
264
-
265
- return false
266
- end
267
-
268
- # Checks whether or not +line+ is in a multiline sequence.
269
- def is_multiline?(text)
270
- text && text.length > 1 && text[-1] == MULTILINE_CHAR_VALUE && text[-2] == ?\s
303
+ text[MID_BLOCK_KEYWORD_REGEX, 1]
271
304
  end
272
305
 
273
- # Evaluates <tt>text</tt> in the context of the scope object, but
306
+ # Evaluates `text` in the context of the scope object, but
274
307
  # does not output the result.
275
308
  def push_silent(text, can_suppress = false)
276
309
  flush_merged_text
@@ -278,17 +311,17 @@ END
278
311
  @precompiled << "#{text};"
279
312
  end
280
313
 
281
- # Adds <tt>text</tt> to <tt>@buffer</tt> with appropriate tabulation
314
+ # Adds `text` to `@buffer` with appropriate tabulation
282
315
  # without parsing it.
283
316
  def push_merged_text(text, tab_change = 0, indent = true)
284
- @merged_text << (!indent || @dont_indent_next_line || @options[:ugly] ? text : "#{' ' * @output_tabs}#{text}")
317
+ text = !indent || @dont_indent_next_line || @options[:ugly] ? text : "#{' ' * @output_tabs}#{text}"
318
+ @to_merge << [:text, text, tab_change]
285
319
  @dont_indent_next_line = false
286
- @tab_change += tab_change
287
320
  end
288
321
 
289
- # Concatenate <tt>text</tt> to <tt>@buffer</tt> without tabulation.
322
+ # Concatenate `text` to `@buffer` without tabulation.
290
323
  def concat_merged_text(text)
291
- @merged_text << text
324
+ @to_merge << [:text, text, 0]
292
325
  end
293
326
 
294
327
  def push_text(text, tab_change = 0)
@@ -296,94 +329,118 @@ END
296
329
  end
297
330
 
298
331
  def flush_merged_text
299
- return if @merged_text.empty?
332
+ return if @to_merge.empty?
300
333
 
301
- @precompiled << "_hamlout.push_text(#{@merged_text.dump}"
302
- @precompiled << ", #{@dont_tab_up_next_text.inspect}" if @dont_tab_up_next_text || @tab_change != 0
303
- @precompiled << ", #{@tab_change}" if @tab_change != 0
304
- @precompiled << ");"
305
- @merged_text = ''
334
+ text, tab_change = @to_merge.inject(["", 0]) do |(str, mtabs), (type, val, tabs)|
335
+ case type
336
+ when :text
337
+ [str << val.inspect[1...-1], mtabs + tabs]
338
+ when :script
339
+ if mtabs != 0 && !@options[:ugly]
340
+ val = "_hamlout.adjust_tabs(#{mtabs}); " + val
341
+ end
342
+ [str << "\#{#{val}}", 0]
343
+ else
344
+ raise SyntaxError.new("[HAML BUG] Undefined entry in Haml::Precompiler@to_merge.")
345
+ end
346
+ end
347
+
348
+ @precompiled <<
349
+ if @options[:ugly]
350
+ "_hamlout.buffer << \"#{text}\";"
351
+ else
352
+ "_hamlout.push_text(\"#{text}\", #{tab_change}, #{@dont_tab_up_next_text.inspect});"
353
+ end
354
+ @to_merge = []
306
355
  @dont_tab_up_next_text = false
307
- @tab_change = 0
308
356
  end
309
357
 
310
358
  # Renders a block of text as plain text.
311
359
  # Also checks for an illegally opened block.
312
- def push_plain(text)
313
- if @block_opened
360
+ def push_plain(text, options = {})
361
+ if block_opened?
314
362
  raise SyntaxError.new("Illegal nesting: nesting within plain text is illegal.", @next_line.index)
315
363
  end
316
364
 
317
- push_text text
365
+ if contains_interpolation?(text)
366
+ options[:escape_html] = self.options[:escape_html] if options[:escape_html].nil?
367
+ push_script(
368
+ unescape_interpolation(text, :escape_html => options[:escape_html]),
369
+ :escape_html => false)
370
+ else
371
+ push_text text
372
+ end
318
373
  end
319
374
 
320
- # Adds +text+ to <tt>@buffer</tt> while flattening text.
375
+ # Adds +text+ to `@buffer` while flattening text.
321
376
  def push_flat(line)
322
- tabulation = line.spaces - @flat_spaces
323
- tabulation = tabulation > -1 ? tabulation : 0
324
- @filter_buffer << "#{' ' * tabulation}#{line.unstripped}\n"
377
+ text = line.full.dup
378
+ text = "" unless text.gsub!(/^#{@flat_spaces}/, '')
379
+ @filter_buffer << "#{text}\n"
325
380
  end
326
381
 
327
- # Causes <tt>text</tt> to be evaluated in the context of
328
- # the scope object and the result to be added to <tt>@buffer</tt>.
382
+ # Causes `text` to be evaluated in the context of
383
+ # the scope object and the result to be added to `@buffer`.
329
384
  #
330
- # If <tt>preserve_script</tt> is true, Haml::Helpers#find_and_flatten is run on
331
- # the result before it is added to <tt>@buffer</tt>
332
- def push_script(text, preserve_script, in_tag = false, preserve_tag = false,
333
- escape_html = false, nuke_inner_whitespace = false)
385
+ # If `opts[:preserve_script]` is true, Haml::Helpers#find_and_flatten is run on
386
+ # the result before it is added to `@buffer`
387
+ def push_script(text, opts = {})
388
+ raise SyntaxError.new("There's no Ruby code for = to evaluate.") if text.empty?
389
+ return if options[:suppress_eval]
390
+ opts[:escape_html] = options[:escape_html] if opts[:escape_html].nil?
391
+
392
+ args = %w[preserve_script in_tag preserve_tag escape_html nuke_inner_whitespace]
393
+ args.map! {|name| opts[name.to_sym]}
394
+ args << !block_opened? << @options[:ugly]
395
+
396
+ no_format = @options[:ugly] &&
397
+ !(opts[:preserve_script] || opts[:preserve_tag] || opts[:escape_html])
398
+ output_temp = "(haml_very_temp = haml_temp; haml_temp = nil; haml_very_temp)"
399
+ out = "_hamlout.#{static_method_name(:format_script, *args)}(#{output_temp});"
400
+
334
401
  # Prerender tabulation unless we're in a tag
335
- push_merged_text '' unless in_tag
402
+ push_merged_text '' unless opts[:in_tag]
336
403
 
337
- flush_merged_text
338
- return if options[:suppress_eval]
404
+ unless block_opened?
405
+ @to_merge << [:script, no_format ? "#{text}\n" : "haml_temp = #{text}\n#{out}"]
406
+ concat_merged_text("\n") unless opts[:in_tag] || opts[:nuke_inner_whitespace]
407
+ @newlines -= 1
408
+ return
409
+ end
339
410
 
340
- raise SyntaxError.new("There's no Ruby code for = to evaluate.") if text.empty?
411
+ flush_merged_text
341
412
 
342
413
  push_silent "haml_temp = #{text}"
343
414
  newline_now
344
- args = [preserve_script, in_tag, preserve_tag,
345
- escape_html, nuke_inner_whitespace].map { |a| a.inspect }.join(', ')
346
- out = "haml_temp = _hamlout.push_script(haml_temp, #{args});"
347
- if @block_opened
348
- push_and_tabulate([:loud, out])
349
- else
350
- @precompiled << out
351
- end
415
+ push_and_tabulate([:loud, "_hamlout.buffer << #{no_format ? "#{output_temp}.to_s;" : out}",
416
+ !(opts[:in_tag] || opts[:nuke_inner_whitespace] || @options[:ugly])])
352
417
  end
353
418
 
354
- # Causes <tt>text</tt> to be evaluated, and Haml::Helpers#find_and_flatten
419
+ # Causes `text` to be evaluated, and Haml::Helpers#find_and_flatten
355
420
  # to be run on it afterwards.
356
- def push_flat_script(text)
421
+ def push_flat_script(text, options = {})
357
422
  flush_merged_text
358
423
 
359
424
  raise SyntaxError.new("There's no Ruby code for ~ to evaluate.") if text.empty?
360
- push_script(text, true)
425
+ push_script(text, options.merge(:preserve_script => true))
361
426
  end
362
427
 
363
428
  def start_haml_comment
364
- return unless @block_opened
429
+ return unless block_opened?
365
430
 
366
431
  @haml_comment = true
367
432
  push_and_tabulate([:haml_comment])
368
433
  end
369
434
 
370
- # Closes the most recent item in <tt>@to_close_stack</tt>.
435
+ # Closes the most recent item in `@to_close_stack`.
371
436
  def close
372
- tag, value = @to_close_stack.pop
373
- case tag
374
- when :script; close_block
375
- when :comment; close_comment value
376
- when :element; close_tag value
377
- when :loud; close_loud value
378
- when :filtered; close_filtered value
379
- when :haml_comment; close_haml_comment
380
- when nil; close_nil
381
- end
437
+ tag, *rest = @to_close_stack.pop
438
+ send("close_#{tag}", *rest)
382
439
  end
383
440
 
384
- # Puts a line in <tt>@precompiled</tt> that will add the closing tag of
441
+ # Puts a line in `@precompiled` that will add the closing tag of
385
442
  # the most recently opened tag.
386
- def close_tag(value)
443
+ def close_element(value)
387
444
  tag, nuke_outer_whitespace, nuke_inner_whitespace = value
388
445
  @output_tabs -= 1 unless nuke_inner_whitespace
389
446
  @template_tabs -= 1
@@ -394,8 +451,8 @@ END
394
451
  end
395
452
 
396
453
  # Closes a Ruby block.
397
- def close_block
398
- push_silent "end", true
454
+ def close_script(_1, _2, push_end = true)
455
+ push_silent("end", true) if push_end
399
456
  @template_tabs -= 1
400
457
  end
401
458
 
@@ -408,16 +465,18 @@ END
408
465
  end
409
466
 
410
467
  # Closes a loud Ruby block.
411
- def close_loud(command)
412
- push_silent 'end', true
468
+ def close_loud(command, add_newline, push_end = true)
469
+ push_silent('end', true) if push_end
413
470
  @precompiled << command
414
471
  @template_tabs -= 1
472
+ concat_merged_text("\n") if add_newline
415
473
  end
416
474
 
417
475
  # Closes a filtered block.
418
476
  def close_filtered(filter)
419
- @flat_spaces = -1
420
477
  filter.internal_compile(self, @filter_buffer)
478
+ @flat = false
479
+ @flat_spaces = nil
421
480
  @filter_buffer = nil
422
481
  @template_tabs -= 1
423
482
  end
@@ -427,12 +486,12 @@ END
427
486
  @template_tabs -= 1
428
487
  end
429
488
 
430
- def close_nil
489
+ def close_nil(*args)
431
490
  @template_tabs -= 1
432
491
  end
433
492
 
434
- # Iterates through the classes and ids supplied through <tt>.</tt>
435
- # and <tt>#</tt> syntax, and returns a hash with them as attributes,
493
+ # Iterates through the classes and ids supplied through `.`
494
+ # and `#` syntax, and returns a hash with them as attributes,
436
495
  # that can then be merged with another attributes hash.
437
496
  def parse_class_and_id(list)
438
497
  attributes = {}
@@ -451,30 +510,18 @@ END
451
510
  attributes
452
511
  end
453
512
 
454
- def parse_literal_value(text)
455
- return nil unless text
456
- text.match(LITERAL_VALUE_REGEX)
457
-
458
- # $2 holds the value matched by a symbol, but is nil for a string match
459
- # $5 holds the value matched by a string
460
- $2 || $5
461
- end
462
-
463
513
  def parse_static_hash(text)
464
- return {} unless text
465
-
466
514
  attributes = {}
467
- text.split(',').each do |attrib|
468
- key, value, more = attrib.split('=>')
469
-
470
- # Make sure the key and value and only the key and value exist
471
- # Otherwise, it's too complicated or dynamic and we'll defer it to the actual Ruby parser
472
- key = parse_literal_value key
473
- value = parse_literal_value value
474
- return nil if more || key.nil? || value.nil?
475
-
476
- attributes[key] = value
515
+ scanner = StringScanner.new(text)
516
+ scanner.scan(/\s+/)
517
+ until scanner.eos?
518
+ return unless key = scanner.scan(LITERAL_VALUE_REGEX)
519
+ return unless scanner.scan(/\s*=>\s*/)
520
+ return unless value = scanner.scan(LITERAL_VALUE_REGEX)
521
+ return unless scanner.scan(/\s*(?:,|$)\s*/)
522
+ attributes[eval(key).to_s] = eval(value).to_s
477
523
  end
524
+ text.count("\n").times { newline }
478
525
  attributes
479
526
  end
480
527
 
@@ -518,32 +565,133 @@ END
518
565
  def parse_tag(line)
519
566
  raise SyntaxError.new("Invalid tag: \"#{line}\".") unless match = line.scan(/%([-:\w]+)([-\w\.\#]*)(.*)/)[0]
520
567
  tag_name, attributes, rest = match
521
- attributes_hash, rest = parse_attributes(rest) if rest[0] == ?{
568
+ new_attributes_hash = old_attributes_hash = last_line = object_ref = nil
569
+ attributes_hashes = []
570
+ while rest
571
+ case rest[0]
572
+ when ?{
573
+ break if old_attributes_hash
574
+ old_attributes_hash, rest, last_line = parse_old_attributes(rest)
575
+ attributes_hashes << [:old, old_attributes_hash]
576
+ when ?(
577
+ break if new_attributes_hash
578
+ new_attributes_hash, rest, last_line = parse_new_attributes(rest)
579
+ attributes_hashes << [:new, new_attributes_hash]
580
+ when ?[
581
+ break if object_ref
582
+ object_ref, rest = balance(rest, ?[, ?])
583
+ else; break
584
+ end
585
+ end
586
+
522
587
  if rest
523
- object_ref, rest = balance(rest, ?[, ?]) if rest[0] == ?[
524
- attributes_hash, rest = parse_attributes(rest) if rest[0] == ?{ && attributes_hash.nil?
525
588
  nuke_whitespace, action, value = rest.scan(/(<>|><|[><])?([=\/\~&!])?(.*)?/)[0]
526
589
  nuke_whitespace ||= ''
527
590
  nuke_outer_whitespace = nuke_whitespace.include? '>'
528
591
  nuke_inner_whitespace = nuke_whitespace.include? '<'
529
592
  end
593
+
530
594
  value = value.to_s.strip
531
- [tag_name, attributes, attributes_hash, object_ref, nuke_outer_whitespace,
532
- nuke_inner_whitespace, action, value]
595
+ [tag_name, attributes, attributes_hashes, object_ref, nuke_outer_whitespace,
596
+ nuke_inner_whitespace, action, value, last_line || @index]
533
597
  end
534
598
 
535
- def parse_attributes(line)
536
- scanner = StringScanner.new(line)
537
- attributes_hash, rest = balance(scanner, ?{, ?})
599
+ def parse_old_attributes(line)
600
+ line = line.dup
601
+ last_line = @index
602
+
603
+ begin
604
+ attributes_hash, rest = balance(line, ?{, ?})
605
+ rescue SyntaxError => e
606
+ if line.strip[-1] == ?, && e.message == "Unbalanced brackets."
607
+ line << "\n" << @next_line.text
608
+ last_line += 1
609
+ next_line
610
+ retry
611
+ end
612
+
613
+ raise e
614
+ end
615
+
538
616
  attributes_hash = attributes_hash[1...-1] if attributes_hash
539
- return attributes_hash, rest
617
+ return attributes_hash, rest, last_line
618
+ end
619
+
620
+ def parse_new_attributes(line)
621
+ line = line.dup
622
+ scanner = StringScanner.new(line)
623
+ last_line = @index
624
+ attributes = {}
625
+
626
+ scanner.scan(/\(\s*/)
627
+ loop do
628
+ name, value = parse_new_attribute(scanner)
629
+ break if name.nil?
630
+
631
+ if name == false
632
+ text = (Haml::Shared.balance(line, ?(, ?)) || [line]).first
633
+ raise Haml::SyntaxError.new("Invalid attribute list: #{text.inspect}.", last_line - 1)
634
+ end
635
+ attributes[name] = value
636
+ scanner.scan(/\s*/)
637
+
638
+ if scanner.eos?
639
+ line << " " << @next_line.text
640
+ last_line += 1
641
+ next_line
642
+ scanner.scan(/\s*/)
643
+ end
644
+ end
645
+
646
+ static_attributes = {}
647
+ dynamic_attributes = "{"
648
+ attributes.each do |name, (type, val)|
649
+ if type == :static
650
+ static_attributes[name] = val
651
+ else
652
+ dynamic_attributes << name.inspect << " => " << val << ","
653
+ end
654
+ end
655
+ dynamic_attributes << "}"
656
+ dynamic_attributes = nil if dynamic_attributes == "{}"
657
+
658
+ return [static_attributes, dynamic_attributes], scanner.rest, last_line
659
+ end
660
+
661
+ def parse_new_attribute(scanner)
662
+ unless name = scanner.scan(/[-:\w]+/)
663
+ return if scanner.scan(/\)/)
664
+ return false
665
+ end
666
+
667
+ scanner.scan(/\s*/)
668
+ return name, [:static, true] unless scanner.scan(/=/) #/end
669
+
670
+ scanner.scan(/\s*/)
671
+ unless quote = scanner.scan(/["']/)
672
+ return false unless var = scanner.scan(/(@@?|\$)?\w+/)
673
+ return name, [:dynamic, var]
674
+ end
675
+
676
+ re = /((?:\\.|\#(?!\{)|[^#{quote}\\#])*)(#{quote}|#\{)/
677
+ content = []
678
+ loop do
679
+ return false unless scanner.scan(re)
680
+ content << [:str, scanner[1].gsub(/\\(.)/, '\1')]
681
+ break if scanner[2] == quote
682
+ content << [:ruby, balance(scanner, ?{, ?}, 1).first[0...-1]]
683
+ end
684
+
685
+ return name, [:static, content.first[1]] if content.size == 1
686
+ return name, [:dynamic,
687
+ '"' + content.map {|(t, v)| t == :str ? v.inspect[1...-1] : "\#{#{v}}"}.join + '"']
540
688
  end
541
689
 
542
690
  # Parses a line that will render as an XHTML tag, and adds the code that will
543
- # render that tag to <tt>@precompiled</tt>.
691
+ # render that tag to `@precompiled`.
544
692
  def render_tag(line)
545
- tag_name, attributes, attributes_hash, object_ref, nuke_outer_whitespace,
546
- nuke_inner_whitespace, action, value = parse_tag(line)
693
+ tag_name, attributes, attributes_hashes, object_ref, nuke_outer_whitespace,
694
+ nuke_inner_whitespace, action, value, last_line = parse_tag(line)
547
695
 
548
696
  raise SyntaxError.new("Illegal element: classes and ids must have values.") if attributes =~ /[\.#](\.|#|\z)/
549
697
 
@@ -554,16 +702,37 @@ END
554
702
  nuke_inner_whitespace ||= preserve_tag
555
703
  preserve_tag &&= !options[:ugly]
556
704
 
705
+ escape_html = (action == '&' || (action != '!' && @options[:escape_html]))
706
+
557
707
  case action
558
708
  when '/'; self_closing = true
559
709
  when '~'; parse = preserve_script = true
560
710
  when '='
561
711
  parse = true
562
- value = unescape_interpolation(value[1..-1].strip) if value[0] == ?=
563
- when '&', '!'
564
712
  if value[0] == ?=
713
+ value = unescape_interpolation(value[1..-1].strip, :escape_html => escape_html)
714
+ escape_html = false
715
+ end
716
+ when '&', '!'
717
+ if value[0] == ?= || value[0] == ?~
718
+ parse = true
719
+ preserve_script = (value[0] == ?~)
720
+ if value[1] == ?=
721
+ value = unescape_interpolation(value[2..-1].strip, :escape_html => escape_html)
722
+ escape_html = false
723
+ else
724
+ value = value[1..-1].strip
725
+ end
726
+ elsif contains_interpolation?(value)
727
+ value = unescape_interpolation(value, :escape_html => escape_html)
728
+ parse = true
729
+ escape_html = false
730
+ end
731
+ else
732
+ if contains_interpolation?(value)
733
+ value = unescape_interpolation(value, :escape_html => escape_html)
565
734
  parse = true
566
- value = (value[1] == ?= ? unescape_interpolation(value[2..-1].strip) : value[1..-1].strip)
735
+ escape_html = false
567
736
  end
568
737
  end
569
738
 
@@ -572,29 +741,35 @@ END
572
741
  value = ''
573
742
  end
574
743
 
575
- escape_html = (action == '&' || (action != '!' && @options[:escape_html]))
576
-
577
744
  object_ref = "nil" if object_ref.nil? || @options[:suppress_eval]
578
745
 
579
- static_attributes = parse_static_hash(attributes_hash) # Try pre-compiling a static attributes hash
580
- attributes_hash = nil if static_attributes || @options[:suppress_eval]
581
746
  attributes = parse_class_and_id(attributes)
582
- Buffer.merge_attrs(attributes, static_attributes) if static_attributes
747
+ attributes_hashes.map! do |syntax, attributes_hash|
748
+ if syntax == :old
749
+ static_attributes = parse_static_hash(attributes_hash)
750
+ attributes_hash = nil if static_attributes || @options[:suppress_eval]
751
+ else
752
+ static_attributes, attributes_hash = attributes_hash
753
+ end
754
+ Buffer.merge_attrs(attributes, static_attributes) if static_attributes
755
+ attributes_hash
756
+ end.compact!
583
757
 
584
- raise SyntaxError.new("Illegal nesting: nesting within a self-closing tag is illegal.", @next_line.index) if @block_opened && self_closing
585
- raise SyntaxError.new("Illegal nesting: content can't be both given on the same line as %#{tag_name} and nested within it.", @next_line.index) if @block_opened && !value.empty?
586
- raise SyntaxError.new("There's no Ruby code for #{action} to evaluate.") if parse && value.empty?
587
- raise SyntaxError.new("Self-closing tags can't have content.") if self_closing && !value.empty?
758
+ raise SyntaxError.new("Illegal nesting: nesting within a self-closing tag is illegal.", @next_line.index) if block_opened? && self_closing
759
+ raise SyntaxError.new("Illegal nesting: content can't be both given on the same line as %#{tag_name} and nested within it.", @next_line.index) if block_opened? && !value.empty?
760
+ raise SyntaxError.new("There's no Ruby code for #{action} to evaluate.", last_line - 1) if parse && value.empty?
761
+ raise SyntaxError.new("Self-closing tags can't have content.", last_line - 1) if self_closing && !value.empty?
588
762
 
589
- self_closing ||= !!( !@block_opened && value.empty? && @options[:autoclose].include?(tag_name) )
763
+ self_closing ||= !!( !block_opened? && value.empty? && @options[:autoclose].include?(tag_name) )
764
+ value = nil if value.empty? && (block_opened? || self_closing)
590
765
 
591
766
  dont_indent_next_line =
592
- (nuke_outer_whitespace && !@block_opened) ||
593
- (nuke_inner_whitespace && @block_opened)
767
+ (nuke_outer_whitespace && !block_opened?) ||
768
+ (nuke_inner_whitespace && block_opened?)
594
769
 
595
770
  # Check if we can render the tag directly to text and not process it in the buffer
596
- if object_ref == "nil" && attributes_hash.nil? && !preserve_script
597
- tag_closed = !@block_opened && !self_closing && !parse
771
+ if object_ref == "nil" && attributes_hashes.empty? && !preserve_script
772
+ tag_closed = !block_opened? && !self_closing && !parse
598
773
 
599
774
  open_tag = prerender_tag(tag_name, self_closing, attributes)
600
775
  if tag_closed
@@ -603,7 +778,7 @@ END
603
778
  else
604
779
  open_tag << "\n" unless parse || nuke_inner_whitespace || (self_closing && nuke_outer_whitespace)
605
780
  end
606
-
781
+
607
782
  push_merged_text(open_tag, tag_closed || self_closing || nuke_inner_whitespace ? 0 : 1,
608
783
  !nuke_outer_whitespace)
609
784
 
@@ -611,33 +786,40 @@ END
611
786
  return if tag_closed
612
787
  else
613
788
  flush_merged_text
614
- content = value.empty? || parse ? 'nil' : value.dump
615
- attributes_hash = ', ' + attributes_hash if attributes_hash
616
- args = [tag_name, self_closing, !@block_opened, preserve_tag, escape_html,
789
+ content = parse ? 'nil' : value.inspect
790
+ if attributes_hashes.empty?
791
+ attributes_hashes = ''
792
+ elsif attributes_hashes.size == 1
793
+ attributes_hashes = ", #{attributes_hashes.first}"
794
+ else
795
+ attributes_hashes = ", (#{attributes_hashes.join(").merge(")})"
796
+ end
797
+
798
+ args = [tag_name, self_closing, !block_opened?, preserve_tag, escape_html,
617
799
  attributes, nuke_outer_whitespace, nuke_inner_whitespace
618
800
  ].map { |v| v.inspect }.join(', ')
619
- push_silent "_hamlout.open_tag(#{args}, #{object_ref}, #{content}#{attributes_hash})"
801
+ push_silent "_hamlout.open_tag(#{args}, #{object_ref}, #{content}#{attributes_hashes})"
620
802
  @dont_tab_up_next_text = @dont_indent_next_line = dont_indent_next_line
621
803
  end
622
804
 
623
805
  return if self_closing
624
806
 
625
- if value.empty?
807
+ if value.nil?
626
808
  push_and_tabulate([:element, [tag_name, nuke_outer_whitespace, nuke_inner_whitespace]])
627
809
  @output_tabs += 1 unless nuke_inner_whitespace
628
810
  return
629
811
  end
630
812
 
631
813
  if parse
632
- flush_merged_text
633
- push_script(value, preserve_script, true, preserve_tag, escape_html, nuke_inner_whitespace)
634
- @dont_tab_up_next_text = true
814
+ push_script(value, :preserve_script => preserve_script, :in_tag => true,
815
+ :preserve_tag => preserve_tag, :escape_html => escape_html,
816
+ :nuke_inner_whitespace => nuke_inner_whitespace)
635
817
  concat_merged_text("</#{tag_name}>" + (nuke_outer_whitespace ? "" : "\n"))
636
818
  end
637
819
  end
638
820
 
639
821
  # Renders a line that creates an XHTML tag and has an implicit div because of
640
- # <tt>.</tt> or <tt>#</tt>.
822
+ # `.` or `#`.
641
823
  def render_div(line)
642
824
  render_tag('%div' + line)
643
825
  end
@@ -648,15 +830,15 @@ END
648
830
  line.strip!
649
831
  conditional << ">" if conditional
650
832
 
651
- if @block_opened && !line.empty?
833
+ if block_opened? && !line.empty?
652
834
  raise SyntaxError.new('Illegal nesting: nesting within a tag that already has content is illegal.', @next_line.index)
653
835
  end
654
836
 
655
- open = "<!--#{conditional} "
837
+ open = "<!--#{conditional}"
656
838
 
657
839
  # Render it statically if possible
658
840
  unless line.empty?
659
- return push_text("#{open}#{line} #{conditional ? "<![endif]-->" : "-->"}")
841
+ return push_text("#{open} #{line} #{conditional ? "<![endif]-->" : "-->"}")
660
842
  end
661
843
 
662
844
  push_text(open, 1)
@@ -670,7 +852,7 @@ END
670
852
 
671
853
  # Renders an XHTML doctype or XML shebang.
672
854
  def render_doctype(line)
673
- raise SyntaxError.new("Illegal nesting: nesting within a header command is illegal.", @next_line.index) if @block_opened
855
+ raise SyntaxError.new("Illegal nesting: nesting within a header command is illegal.", @next_line.index) if block_opened?
674
856
  doctype = text_for_doctype(line)
675
857
  push_text doctype if doctype
676
858
  end
@@ -691,6 +873,8 @@ END
691
873
  if xhtml?
692
874
  if version == "1.1"
693
875
  '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">'
876
+ elsif version == "5"
877
+ '<!DOCTYPE html>'
694
878
  else
695
879
  case type
696
880
  when "strict"; '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'
@@ -717,69 +901,121 @@ END
717
901
  raise Error.new("Filter \"#{name}\" is not defined.") unless filter = Filters.defined[name]
718
902
 
719
903
  push_and_tabulate([:filtered, filter])
720
- @flat_spaces = @template_tabs * 2
904
+ @flat = true
721
905
  @filter_buffer = String.new
722
- @block_opened = false
906
+
907
+ # If we don't know the indentation by now, it'll be set in Line#tabs
908
+ @flat_spaces = @indentation * @template_tabs if @indentation
723
909
  end
724
910
 
725
- def contains_interpolation?(str)
726
- str.include?('#{')
911
+ def raw_next_line
912
+ text = @template.shift
913
+ return unless text
914
+
915
+ index = @template_index
916
+ @template_index += 1
917
+
918
+ return text, index
727
919
  end
728
920
 
729
- def unescape_interpolation(str)
730
- scan = StringScanner.new(str.dump)
731
- str = ''
921
+ def next_line
922
+ text, index = raw_next_line
923
+ return unless text
732
924
 
733
- while scan.scan(/(.*?)(\\+)\#\{/)
734
- escapes = (scan[2].size - 1) / 2
735
- str << scan.matched[0...-3 - escapes]
736
- if escapes % 2 == 1
737
- str << '#{'
925
+ # :eod is a special end-of-document marker
926
+ line =
927
+ if text == :eod
928
+ Line.new '-#', '-#', '-#', index, self, true
738
929
  else
739
- # Use eval to get rid of string escapes
740
- str << '#{' + eval('"' + balance(scan, ?{, ?}, 1)[0][0...-1] + '"') + "}"
930
+ Line.new text.strip, text.lstrip.chomp, text, index, self, false
931
+ end
932
+
933
+ # `flat?' here is a little outdated,
934
+ # so we have to manually check if either the previous or current line
935
+ # closes the flat block,
936
+ # as well as whether a new block is opened
937
+ @line.tabs if @line
938
+ unless (flat? && !closes_flat?(line) && !closes_flat?(@line)) ||
939
+ (@line && @line.text[0] == ?: && line.full =~ %r[^#{@line.full[/^\s+/]}\s])
940
+ if line.text.empty?
941
+ newline
942
+ return next_line
741
943
  end
944
+
945
+ handle_multiline(line)
742
946
  end
743
947
 
744
- str + scan.rest
948
+ @next_line = line
745
949
  end
746
950
 
747
- def balance(scanner, start, finish, count = 0)
748
- str = ''
749
- scanner = StringScanner.new(scanner) unless scanner.is_a? StringScanner
750
- regexp = Regexp.new("(.*?)[\\#{start.chr}\\#{finish.chr}]")
751
- while scanner.scan(regexp)
752
- str << scanner.matched
753
- count += 1 if scanner.matched[-1] == start
754
- count -= 1 if scanner.matched[-1] == finish
755
- return [str.strip, scanner.rest] if count == 0
951
+ def closes_flat?(line)
952
+ line && !line.text.empty? && line.full !~ /^#{@flat_spaces}/
953
+ end
954
+
955
+ def un_next_line(line)
956
+ @template.unshift line
957
+ @template_index -= 1
958
+ end
959
+
960
+ def handle_multiline(line)
961
+ if is_multiline?(line.text)
962
+ line.text.slice!(-1)
963
+ while new_line = raw_next_line.first
964
+ break if new_line == :eod
965
+ newline and next if new_line.strip.empty?
966
+ break unless is_multiline?(new_line.strip)
967
+ line.text << new_line.strip[0...-1]
968
+ newline
969
+ end
970
+ un_next_line new_line
971
+ resolve_newlines
756
972
  end
973
+ end
757
974
 
758
- raise SyntaxError.new("Unbalanced brackets.")
975
+ # Checks whether or not +line+ is in a multiline sequence.
976
+ def is_multiline?(text)
977
+ text && text.length > 1 && text[-1] == MULTILINE_CHAR_VALUE && text[-2] == ?\s
759
978
  end
760
979
 
761
- # Counts the tabulation of a line.
762
- def count_soft_tabs(line)
763
- spaces = line.index(/([^ ]|$)/)
764
- if line[spaces] == ?\t
765
- return 0, 0 if line.strip.empty?
766
- raise SyntaxError.new(<<END.strip, @next_line.index)
767
- A tab character was used for indentation. Haml must be indented using two spaces.
768
- Are you sure you have soft tabs enabled in your editor?
769
- END
980
+ def contains_interpolation?(str)
981
+ str.include?('#{')
982
+ end
983
+
984
+ def unescape_interpolation(str, opts = {})
985
+ res = ''
986
+ rest = Haml::Shared.handle_interpolation str.dump do |scan|
987
+ escapes = (scan[2].size - 1) / 2
988
+ res << scan.matched[0...-3 - escapes]
989
+ if escapes % 2 == 1
990
+ res << '#{'
991
+ else
992
+ content = eval('"' + balance(scan, ?{, ?}, 1)[0][0...-1] + '"')
993
+ content = "Haml::Helpers.html_escape(#{content})" if opts[:escape_html]
994
+ res << '#{' + content + "}"# Use eval to get rid of string escapes
995
+ end
770
996
  end
771
- [spaces, spaces/2]
997
+ res + rest
772
998
  end
773
999
 
774
- # Pushes value onto <tt>@to_close_stack</tt> and increases
775
- # <tt>@template_tabs</tt>.
1000
+ def balance(*args)
1001
+ res = Haml::Shared.balance(*args)
1002
+ return res if res
1003
+ raise SyntaxError.new("Unbalanced brackets.")
1004
+ end
1005
+
1006
+ def block_opened?
1007
+ !flat? && @next_line.tabs > @line.tabs
1008
+ end
1009
+
1010
+ # Pushes value onto `@to_close_stack` and increases
1011
+ # `@template_tabs`.
776
1012
  def push_and_tabulate(value)
777
1013
  @to_close_stack.push(value)
778
1014
  @template_tabs += 1
779
1015
  end
780
1016
 
781
1017
  def flat?
782
- @flat_spaces != -1
1018
+ @flat
783
1019
  end
784
1020
 
785
1021
  def newline
@@ -793,18 +1029,33 @@ END
793
1029
 
794
1030
  def resolve_newlines
795
1031
  return unless @newlines > 0
1032
+ flush_merged_text unless @to_merge.all? {|type, *_| type == :text}
796
1033
  @precompiled << "\n" * @newlines
797
1034
  @newlines = 0
798
1035
  end
799
1036
 
800
1037
  # Get rid of and whitespace at the end of the buffer
801
1038
  # or the merged text
802
- def rstrip_buffer!
803
- unless @merged_text.empty?
804
- @merged_text.rstrip!
805
- else
806
- push_silent("_erbout.rstrip!", false)
1039
+ def rstrip_buffer!(index = -1)
1040
+ last = @to_merge[index]
1041
+ if last.nil?
1042
+ push_silent("_hamlout.rstrip!", false)
807
1043
  @dont_tab_up_next_text = true
1044
+ return
1045
+ end
1046
+
1047
+ case last.first
1048
+ when :text
1049
+ last[1].rstrip!
1050
+ if last[1].empty?
1051
+ @to_merge.slice! index
1052
+ rstrip_buffer! index
1053
+ end
1054
+ when :script
1055
+ last[1].gsub!(/\(haml_temp, (.*?)\);$/, '(haml_temp.rstrip, \1);')
1056
+ rstrip_buffer! index - 1
1057
+ else
1058
+ raise SyntaxError.new("[HAML BUG] Undefined entry in Haml::Precompiler@to_merge.")
808
1059
  end
809
1060
  end
810
1061
  end