refinerycms 0.9.6.19 → 0.9.6.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (385) hide show
  1. data/.gems +0 -8
  2. data/.gitignore +3 -1
  3. data/Rakefile +1 -5
  4. data/VERSION +1 -1
  5. data/bin/refinery-update-core +11 -2
  6. data/config/application.rb +6 -1
  7. data/config/environments/development.rb +10 -6
  8. data/config/settings.rb +3 -0
  9. data/db/migrate/20100305023036_change_users_columns_for_authlogic.rb +46 -0
  10. data/db/migrate/20100305023037_remove_unused_users_columns.rb +16 -0
  11. data/db/migrate/20100312155331_make_user_perishable_token_nullable.rb +13 -0
  12. data/db/migrate/20100312160327_make_user_persistence_token_nullable.rb +13 -0
  13. data/db/migrate/20100315203301_remove_state_from_users.rb +9 -0
  14. data/db/schema.rb +8 -21
  15. data/db/seeds.rb +5 -19
  16. data/lib/refinery/tasks/refinery.rb +1 -1
  17. data/public/javascripts/admin.js +6 -2
  18. data/public/javascripts/jquery-ui-1.8.min.js +374 -0
  19. data/public/javascripts/jquery.js +606 -444
  20. data/public/javascripts/refinery/admin.js +30 -9
  21. data/public/javascripts/refinery/boot_wym.js +4 -0
  22. data/public/javascripts/wymeditor/jquery.refinery.wymeditor.js +3 -4
  23. data/public/stylesheets/refinery/refinery.css +11 -0
  24. data/public/stylesheets/wymeditor/skins/refinery/skin.css +3 -1
  25. data/public/stylesheets/wymeditor/skins/refinery/wymiframe.css +5 -5
  26. data/readme.md +13 -10
  27. data/test/fixtures/users.yml +5 -5
  28. data/test/functional/dashboard_controller_test.rb +0 -4
  29. data/test/functional/images_controller_test.rb +0 -3
  30. data/test/test_helper.rb +7 -3
  31. data/themes/hemingway/views/layouts/application.html.erb +1 -12
  32. data/vendor/plugins/authentication/app/controllers/admin/users_controller.rb +1 -3
  33. data/vendor/plugins/authentication/app/controllers/sessions_controller.rb +3 -14
  34. data/vendor/plugins/authentication/app/controllers/users_controller.rb +26 -37
  35. data/vendor/plugins/authentication/app/models/user.rb +29 -112
  36. data/vendor/plugins/authentication/app/models/user_mailer.rb +8 -5
  37. data/vendor/plugins/authentication/app/models/user_session.rb +9 -0
  38. data/vendor/plugins/authentication/app/views/admin/users/index.html.erb +1 -1
  39. data/vendor/plugins/authentication/app/views/sessions/new.html.erb +5 -4
  40. data/vendor/plugins/authentication/lib/authenticated_system.rb +40 -30
  41. data/vendor/plugins/authentication/rails/init.rb +9 -0
  42. data/vendor/plugins/authlogic/CHANGELOG.rdoc +345 -0
  43. data/vendor/plugins/authlogic/LICENSE +20 -0
  44. data/vendor/plugins/authlogic/README.rdoc +246 -0
  45. data/vendor/plugins/authlogic/Rakefile +42 -0
  46. data/vendor/plugins/authlogic/VERSION.yml +5 -0
  47. data/vendor/plugins/authlogic/authlogic.gemspec +217 -0
  48. data/vendor/plugins/authlogic/generators/session/session_generator.rb +9 -0
  49. data/vendor/plugins/authlogic/generators/session/templates/session.rb +2 -0
  50. data/vendor/plugins/authlogic/init.rb +1 -0
  51. data/vendor/plugins/authlogic/lib/authlogic.rb +64 -0
  52. data/vendor/plugins/authlogic/lib/authlogic/acts_as_authentic/base.rb +107 -0
  53. data/vendor/plugins/authlogic/lib/authlogic/acts_as_authentic/email.rb +110 -0
  54. data/vendor/plugins/authlogic/lib/authlogic/acts_as_authentic/logged_in_status.rb +60 -0
  55. data/vendor/plugins/authlogic/lib/authlogic/acts_as_authentic/login.rb +141 -0
  56. data/vendor/plugins/authlogic/lib/authlogic/acts_as_authentic/magic_columns.rb +24 -0
  57. data/vendor/plugins/authlogic/lib/authlogic/acts_as_authentic/password.rb +355 -0
  58. data/vendor/plugins/authlogic/lib/authlogic/acts_as_authentic/perishable_token.rb +105 -0
  59. data/vendor/plugins/authlogic/lib/authlogic/acts_as_authentic/persistence_token.rb +68 -0
  60. data/vendor/plugins/authlogic/lib/authlogic/acts_as_authentic/restful_authentication.rb +61 -0
  61. data/vendor/plugins/authlogic/lib/authlogic/acts_as_authentic/session_maintenance.rb +139 -0
  62. data/vendor/plugins/authlogic/lib/authlogic/acts_as_authentic/single_access_token.rb +65 -0
  63. data/vendor/plugins/authlogic/lib/authlogic/acts_as_authentic/validations_scope.rb +32 -0
  64. data/vendor/plugins/authlogic/lib/authlogic/authenticates_many/association.rb +42 -0
  65. data/vendor/plugins/authlogic/lib/authlogic/authenticates_many/base.rb +55 -0
  66. data/vendor/plugins/authlogic/lib/authlogic/controller_adapters/abstract_adapter.rb +67 -0
  67. data/vendor/plugins/authlogic/lib/authlogic/controller_adapters/merb_adapter.rb +30 -0
  68. data/vendor/plugins/authlogic/lib/authlogic/controller_adapters/rails_adapter.rb +48 -0
  69. data/vendor/plugins/authlogic/lib/authlogic/controller_adapters/sinatra_adapter.rb +61 -0
  70. data/vendor/plugins/authlogic/lib/authlogic/crypto_providers/aes256.rb +43 -0
  71. data/vendor/plugins/authlogic/lib/authlogic/crypto_providers/bcrypt.rb +90 -0
  72. data/vendor/plugins/authlogic/lib/authlogic/crypto_providers/md5.rb +34 -0
  73. data/vendor/plugins/authlogic/lib/authlogic/crypto_providers/sha1.rb +35 -0
  74. data/vendor/plugins/authlogic/lib/authlogic/crypto_providers/sha256.rb +50 -0
  75. data/vendor/plugins/authlogic/lib/authlogic/crypto_providers/sha512.rb +50 -0
  76. data/vendor/plugins/authlogic/lib/authlogic/crypto_providers/wordpress.rb +43 -0
  77. data/vendor/plugins/authlogic/lib/authlogic/i18n.rb +83 -0
  78. data/vendor/plugins/authlogic/lib/authlogic/i18n/translator.rb +15 -0
  79. data/vendor/plugins/authlogic/lib/authlogic/random.rb +33 -0
  80. data/vendor/plugins/authlogic/lib/authlogic/regex.rb +25 -0
  81. data/vendor/plugins/authlogic/lib/authlogic/session/activation.rb +58 -0
  82. data/vendor/plugins/authlogic/lib/authlogic/session/active_record_trickery.rb +64 -0
  83. data/vendor/plugins/authlogic/lib/authlogic/session/base.rb +37 -0
  84. data/vendor/plugins/authlogic/lib/authlogic/session/brute_force_protection.rb +96 -0
  85. data/vendor/plugins/authlogic/lib/authlogic/session/callbacks.rb +99 -0
  86. data/vendor/plugins/authlogic/lib/authlogic/session/cookies.rb +130 -0
  87. data/vendor/plugins/authlogic/lib/authlogic/session/existence.rb +93 -0
  88. data/vendor/plugins/authlogic/lib/authlogic/session/foundation.rb +63 -0
  89. data/vendor/plugins/authlogic/lib/authlogic/session/http_auth.rb +58 -0
  90. data/vendor/plugins/authlogic/lib/authlogic/session/id.rb +41 -0
  91. data/vendor/plugins/authlogic/lib/authlogic/session/klass.rb +78 -0
  92. data/vendor/plugins/authlogic/lib/authlogic/session/magic_columns.rb +95 -0
  93. data/vendor/plugins/authlogic/lib/authlogic/session/magic_states.rb +59 -0
  94. data/vendor/plugins/authlogic/lib/authlogic/session/params.rb +101 -0
  95. data/vendor/plugins/authlogic/lib/authlogic/session/password.rb +240 -0
  96. data/vendor/plugins/authlogic/lib/authlogic/session/perishable_token.rb +18 -0
  97. data/vendor/plugins/authlogic/lib/authlogic/session/persistence.rb +70 -0
  98. data/vendor/plugins/authlogic/lib/authlogic/session/priority_record.rb +34 -0
  99. data/vendor/plugins/authlogic/lib/authlogic/session/scopes.rb +101 -0
  100. data/vendor/plugins/authlogic/lib/authlogic/session/session.rb +62 -0
  101. data/vendor/plugins/authlogic/lib/authlogic/session/timeout.rb +82 -0
  102. data/vendor/plugins/authlogic/lib/authlogic/session/unauthorized_record.rb +50 -0
  103. data/vendor/plugins/authlogic/lib/authlogic/session/validation.rb +82 -0
  104. data/vendor/plugins/authlogic/lib/authlogic/test_case.rb +120 -0
  105. data/vendor/plugins/authlogic/lib/authlogic/test_case/mock_controller.rb +45 -0
  106. data/vendor/plugins/authlogic/lib/authlogic/test_case/mock_cookie_jar.rb +14 -0
  107. data/vendor/plugins/authlogic/lib/authlogic/test_case/mock_logger.rb +10 -0
  108. data/vendor/plugins/authlogic/lib/authlogic/test_case/mock_request.rb +19 -0
  109. data/vendor/plugins/authlogic/lib/authlogic/test_case/rails_request_adapter.rb +30 -0
  110. data/vendor/plugins/authlogic/rails/init.rb +1 -0
  111. data/vendor/plugins/authlogic/shoulda_macros/authlogic.rb +69 -0
  112. data/vendor/plugins/authlogic/test/acts_as_authentic_test/base_test.rb +18 -0
  113. data/vendor/plugins/authlogic/test/acts_as_authentic_test/email_test.rb +97 -0
  114. data/vendor/plugins/authlogic/test/acts_as_authentic_test/logged_in_status_test.rb +36 -0
  115. data/vendor/plugins/authlogic/test/acts_as_authentic_test/login_test.rb +109 -0
  116. data/vendor/plugins/authlogic/test/acts_as_authentic_test/magic_columns_test.rb +27 -0
  117. data/vendor/plugins/authlogic/test/acts_as_authentic_test/password_test.rb +236 -0
  118. data/vendor/plugins/authlogic/test/acts_as_authentic_test/perishable_token_test.rb +90 -0
  119. data/vendor/plugins/authlogic/test/acts_as_authentic_test/persistence_token_test.rb +55 -0
  120. data/vendor/plugins/authlogic/test/acts_as_authentic_test/restful_authentication_test.rb +40 -0
  121. data/vendor/plugins/authlogic/test/acts_as_authentic_test/session_maintenance_test.rb +84 -0
  122. data/vendor/plugins/authlogic/test/acts_as_authentic_test/single_access_test.rb +44 -0
  123. data/vendor/plugins/authlogic/test/authenticates_many_test.rb +16 -0
  124. data/vendor/plugins/authlogic/test/crypto_provider_test/aes256_test.rb +14 -0
  125. data/vendor/plugins/authlogic/test/crypto_provider_test/bcrypt_test.rb +14 -0
  126. data/vendor/plugins/authlogic/test/crypto_provider_test/sha1_test.rb +23 -0
  127. data/vendor/plugins/authlogic/test/crypto_provider_test/sha256_test.rb +14 -0
  128. data/vendor/plugins/authlogic/test/crypto_provider_test/sha512_test.rb +14 -0
  129. data/vendor/plugins/authlogic/test/fixtures/companies.yml +5 -0
  130. data/vendor/plugins/authlogic/test/fixtures/employees.yml +17 -0
  131. data/vendor/plugins/authlogic/test/fixtures/projects.yml +3 -0
  132. data/vendor/plugins/authlogic/test/fixtures/users.yml +24 -0
  133. data/vendor/plugins/authlogic/test/i18n_test.rb +33 -0
  134. data/vendor/plugins/authlogic/test/libs/affiliate.rb +7 -0
  135. data/vendor/plugins/authlogic/test/libs/company.rb +6 -0
  136. data/vendor/plugins/authlogic/test/libs/employee.rb +7 -0
  137. data/vendor/plugins/authlogic/test/libs/employee_session.rb +2 -0
  138. data/vendor/plugins/authlogic/test/libs/ldaper.rb +3 -0
  139. data/vendor/plugins/authlogic/test/libs/ordered_hash.rb +9 -0
  140. data/vendor/plugins/authlogic/test/libs/project.rb +3 -0
  141. data/vendor/plugins/authlogic/test/libs/user.rb +5 -0
  142. data/vendor/plugins/authlogic/test/libs/user_session.rb +6 -0
  143. data/vendor/plugins/authlogic/test/random_test.rb +49 -0
  144. data/vendor/plugins/authlogic/test/session_test/activation_test.rb +43 -0
  145. data/vendor/plugins/authlogic/test/session_test/active_record_trickery_test.rb +36 -0
  146. data/vendor/plugins/authlogic/test/session_test/brute_force_protection_test.rb +101 -0
  147. data/vendor/plugins/authlogic/test/session_test/callbacks_test.rb +6 -0
  148. data/vendor/plugins/authlogic/test/session_test/cookies_test.rb +112 -0
  149. data/vendor/plugins/authlogic/test/session_test/credentials_test.rb +0 -0
  150. data/vendor/plugins/authlogic/test/session_test/existence_test.rb +64 -0
  151. data/vendor/plugins/authlogic/test/session_test/http_auth_test.rb +28 -0
  152. data/vendor/plugins/authlogic/test/session_test/id_test.rb +17 -0
  153. data/vendor/plugins/authlogic/test/session_test/klass_test.rb +40 -0
  154. data/vendor/plugins/authlogic/test/session_test/magic_columns_test.rb +62 -0
  155. data/vendor/plugins/authlogic/test/session_test/magic_states_test.rb +60 -0
  156. data/vendor/plugins/authlogic/test/session_test/params_test.rb +53 -0
  157. data/vendor/plugins/authlogic/test/session_test/password_test.rb +106 -0
  158. data/vendor/plugins/authlogic/test/session_test/perishability_test.rb +15 -0
  159. data/vendor/plugins/authlogic/test/session_test/persistence_test.rb +21 -0
  160. data/vendor/plugins/authlogic/test/session_test/scopes_test.rb +60 -0
  161. data/vendor/plugins/authlogic/test/session_test/session_test.rb +59 -0
  162. data/vendor/plugins/authlogic/test/session_test/timeout_test.rb +52 -0
  163. data/vendor/plugins/authlogic/test/session_test/unauthorized_record_test.rb +13 -0
  164. data/vendor/plugins/authlogic/test/session_test/validation_test.rb +23 -0
  165. data/vendor/plugins/authlogic/test/test_helper.rb +182 -0
  166. data/vendor/plugins/dashboard/app/helpers/admin/dashboard_helper.rb +1 -1
  167. data/vendor/plugins/friendly_id/Changelog.md +243 -0
  168. data/vendor/plugins/friendly_id/Contributors.md +30 -0
  169. data/vendor/plugins/friendly_id/Gemfile +2 -0
  170. data/vendor/plugins/friendly_id/Guide.md +509 -0
  171. data/vendor/plugins/friendly_id/LICENSE +19 -0
  172. data/vendor/plugins/friendly_id/README.md +76 -0
  173. data/vendor/plugins/friendly_id/Rakefile +68 -0
  174. data/vendor/plugins/friendly_id/extras/README.txt +3 -0
  175. data/vendor/plugins/friendly_id/extras/bench.rb +59 -0
  176. data/vendor/plugins/friendly_id/extras/extras.rb +31 -0
  177. data/vendor/plugins/friendly_id/extras/prof.rb +14 -0
  178. data/vendor/plugins/friendly_id/extras/template-gem.rb +26 -0
  179. data/vendor/plugins/friendly_id/extras/template-plugin.rb +28 -0
  180. data/vendor/plugins/friendly_id/friendly_id.gemspec +40 -0
  181. data/vendor/plugins/friendly_id/generators/friendly_id/friendly_id_generator.rb +28 -0
  182. data/vendor/plugins/friendly_id/generators/friendly_id/templates/create_slugs.rb +18 -0
  183. data/vendor/plugins/friendly_id/lib/friendly_id.rb +67 -0
  184. data/vendor/plugins/friendly_id/lib/friendly_id/active_record2.rb +47 -0
  185. data/vendor/plugins/friendly_id/lib/friendly_id/active_record2/configuration.rb +66 -0
  186. data/vendor/plugins/friendly_id/lib/friendly_id/active_record2/finders.rb +140 -0
  187. data/vendor/plugins/friendly_id/lib/friendly_id/active_record2/simple_model.rb +162 -0
  188. data/vendor/plugins/friendly_id/lib/friendly_id/active_record2/slug.rb +111 -0
  189. data/vendor/plugins/friendly_id/lib/friendly_id/active_record2/slugged_model.rb +323 -0
  190. data/vendor/plugins/friendly_id/lib/friendly_id/active_record2/tasks.rb +66 -0
  191. data/vendor/plugins/friendly_id/lib/friendly_id/active_record2/tasks/friendly_id.rake +19 -0
  192. data/vendor/plugins/friendly_id/lib/friendly_id/configuration.rb +132 -0
  193. data/vendor/plugins/friendly_id/lib/friendly_id/finders.rb +106 -0
  194. data/vendor/plugins/friendly_id/lib/friendly_id/slug_string.rb +292 -0
  195. data/vendor/plugins/friendly_id/lib/friendly_id/slugged.rb +91 -0
  196. data/vendor/plugins/friendly_id/lib/friendly_id/status.rb +35 -0
  197. data/vendor/plugins/friendly_id/lib/friendly_id/test.rb +175 -0
  198. data/vendor/plugins/friendly_id/lib/friendly_id/version.rb +8 -0
  199. data/vendor/plugins/friendly_id/rails/init.rb +2 -0
  200. data/vendor/plugins/friendly_id/test/active_record2/basic_slugged_model_test.rb +14 -0
  201. data/vendor/plugins/friendly_id/test/active_record2/cached_slug_test.rb +61 -0
  202. data/vendor/plugins/friendly_id/test/active_record2/core.rb +93 -0
  203. data/vendor/plugins/friendly_id/test/active_record2/custom_normalizer_test.rb +20 -0
  204. data/vendor/plugins/friendly_id/test/active_record2/custom_table_name_test.rb +22 -0
  205. data/vendor/plugins/friendly_id/test/active_record2/deprecated_test.rb +23 -0
  206. data/vendor/plugins/friendly_id/test/active_record2/scoped_model_test.rb +111 -0
  207. data/vendor/plugins/friendly_id/test/active_record2/simple_test.rb +59 -0
  208. data/vendor/plugins/friendly_id/test/active_record2/slug_test.rb +34 -0
  209. data/vendor/plugins/friendly_id/test/active_record2/slugged.rb +30 -0
  210. data/vendor/plugins/friendly_id/test/active_record2/slugged_status_test.rb +61 -0
  211. data/vendor/plugins/friendly_id/test/active_record2/sti_test.rb +22 -0
  212. data/vendor/plugins/friendly_id/test/active_record2/support/database.mysql.yml +4 -0
  213. data/vendor/plugins/friendly_id/test/active_record2/support/database.postgres.yml +6 -0
  214. data/vendor/plugins/friendly_id/test/active_record2/support/database.sqlite3.yml +2 -0
  215. data/vendor/plugins/friendly_id/test/active_record2/support/models.rb +78 -0
  216. data/vendor/plugins/friendly_id/test/active_record2/tasks_test.rb +82 -0
  217. data/vendor/plugins/friendly_id/test/active_record2/test_helper.rb +114 -0
  218. data/vendor/plugins/friendly_id/test/friendly_id_test.rb +60 -0
  219. data/vendor/plugins/friendly_id/test/slug_string_test.rb +78 -0
  220. data/vendor/plugins/friendly_id/test/test_helper.rb +9 -0
  221. data/vendor/plugins/hpricot/CHANGELOG +88 -0
  222. data/vendor/plugins/hpricot/COPYING +18 -0
  223. data/vendor/plugins/hpricot/README +275 -0
  224. data/vendor/plugins/hpricot/Rakefile +272 -0
  225. data/vendor/plugins/hpricot/ext/fast_xs/FastXsService.java +1030 -0
  226. data/vendor/plugins/hpricot/ext/fast_xs/extconf.rb +4 -0
  227. data/vendor/plugins/hpricot/ext/fast_xs/fast_xs.c +201 -0
  228. data/vendor/plugins/hpricot/ext/hpricot_scan/HpricotCss.java +831 -0
  229. data/vendor/plugins/hpricot/ext/hpricot_scan/HpricotScanService.java +2086 -0
  230. data/vendor/plugins/hpricot/ext/hpricot_scan/MANIFEST +0 -0
  231. data/vendor/plugins/hpricot/ext/hpricot_scan/extconf.rb +6 -0
  232. data/vendor/plugins/hpricot/ext/hpricot_scan/hpricot_common.rl +76 -0
  233. data/vendor/plugins/hpricot/ext/hpricot_scan/hpricot_css.c +3503 -0
  234. data/vendor/plugins/hpricot/ext/hpricot_scan/hpricot_css.java.rl +155 -0
  235. data/vendor/plugins/hpricot/ext/hpricot_scan/hpricot_css.rl +115 -0
  236. data/vendor/plugins/hpricot/ext/hpricot_scan/hpricot_scan.c +6927 -0
  237. data/vendor/plugins/hpricot/ext/hpricot_scan/hpricot_scan.h +79 -0
  238. data/vendor/plugins/hpricot/ext/hpricot_scan/hpricot_scan.java.rl +1152 -0
  239. data/vendor/plugins/hpricot/ext/hpricot_scan/hpricot_scan.rl +788 -0
  240. data/vendor/plugins/hpricot/extras/mingw-rbconfig.rb +176 -0
  241. data/vendor/plugins/hpricot/hpricot.gemspec +17 -0
  242. data/vendor/plugins/hpricot/lib/hpricot.rb +26 -0
  243. data/vendor/plugins/hpricot/lib/hpricot/blankslate.rb +63 -0
  244. data/vendor/plugins/hpricot/lib/hpricot/builder.rb +216 -0
  245. data/vendor/plugins/hpricot/lib/hpricot/elements.rb +510 -0
  246. data/vendor/plugins/hpricot/lib/hpricot/htmlinfo.rb +691 -0
  247. data/vendor/plugins/hpricot/lib/hpricot/inspect.rb +103 -0
  248. data/vendor/plugins/hpricot/lib/hpricot/modules.rb +40 -0
  249. data/vendor/plugins/hpricot/lib/hpricot/parse.rb +38 -0
  250. data/vendor/plugins/hpricot/lib/hpricot/tag.rb +219 -0
  251. data/vendor/plugins/hpricot/lib/hpricot/tags.rb +164 -0
  252. data/vendor/plugins/hpricot/lib/hpricot/traverse.rb +839 -0
  253. data/vendor/plugins/hpricot/lib/hpricot/xchar.rb +94 -0
  254. data/vendor/plugins/hpricot/setup.rb +1585 -0
  255. data/vendor/plugins/hpricot/test/files/basic.xhtml +17 -0
  256. data/vendor/plugins/hpricot/test/files/boingboing.html +2266 -0
  257. data/vendor/plugins/hpricot/test/files/cy0.html +3653 -0
  258. data/vendor/plugins/hpricot/test/files/immob.html +400 -0
  259. data/vendor/plugins/hpricot/test/files/pace_application.html +1320 -0
  260. data/vendor/plugins/hpricot/test/files/tenderlove.html +16 -0
  261. data/vendor/plugins/hpricot/test/files/uswebgen.html +220 -0
  262. data/vendor/plugins/hpricot/test/files/utf8.html +1054 -0
  263. data/vendor/plugins/hpricot/test/files/week9.html +1723 -0
  264. data/vendor/plugins/hpricot/test/files/why.xml +19 -0
  265. data/vendor/plugins/hpricot/test/load_files.rb +7 -0
  266. data/vendor/plugins/hpricot/test/nokogiri-bench.rb +64 -0
  267. data/vendor/plugins/hpricot/test/test_alter.rb +96 -0
  268. data/vendor/plugins/hpricot/test/test_builder.rb +37 -0
  269. data/vendor/plugins/hpricot/test/test_parser.rb +428 -0
  270. data/vendor/plugins/hpricot/test/test_paths.rb +25 -0
  271. data/vendor/plugins/hpricot/test/test_preserved.rb +88 -0
  272. data/vendor/plugins/hpricot/test/test_xml.rb +28 -0
  273. data/vendor/plugins/inquiries/app/controllers/admin/inquiries_controller.rb +1 -6
  274. data/vendor/plugins/inquiries/app/helpers/inquiries_helper.rb +0 -11
  275. data/vendor/plugins/inquiries/app/views/admin/inquiries/_inquiry.html.erb +10 -6
  276. data/vendor/plugins/inquiries/app/views/inquiry_mailer/confirmation.html.erb +1 -1
  277. data/vendor/plugins/inquiries/config/routes.rb +1 -1
  278. data/vendor/plugins/pages/app/controllers/admin/pages_controller.rb +16 -3
  279. data/vendor/plugins/pages/app/models/page_part.rb +9 -0
  280. data/vendor/plugins/rails_indexes/lib/indexer.rb +0 -2
  281. data/vendor/plugins/refinery/app/views/admin/_head.html.erb +2 -1
  282. data/vendor/plugins/refinery/app/views/shared/_head.html.erb +0 -1
  283. data/vendor/plugins/refinery/app/views/shared/_ie6check.html.erb +23 -11
  284. data/vendor/plugins/refinery/app/views/welcome.html.erb +1 -1
  285. data/vendor/plugins/refinery/app/views/wymiframe.html.erb +2 -1
  286. data/vendor/plugins/refinery/lib/generators/refinery/USAGE +1 -1
  287. data/vendor/plugins/refinery/lib/generators/refinery/templates/migration.rb +2 -2
  288. data/vendor/plugins/refinery/lib/generators/refinery/templates/model.rb +4 -0
  289. data/vendor/plugins/refinery/lib/generators/refinery/templates/views/admin/_form.html.erb +6 -0
  290. data/vendor/plugins/refinery/lib/generators/refinery/templates/views/show.html.erb +5 -3
  291. data/vendor/plugins/refinery/lib/refinery/application_helper.rb +2 -2
  292. data/vendor/plugins/refinery/lib/refinery/initializer.rb +4 -41
  293. data/vendor/plugins/refinery_settings/app/models/refinery_setting.rb +7 -3
  294. data/vendor/plugins/slim_scrooge/README.textile +112 -0
  295. data/vendor/plugins/slim_scrooge/Rakefile +29 -0
  296. data/vendor/plugins/slim_scrooge/VERSION.yml +5 -0
  297. data/vendor/plugins/slim_scrooge/ext/Rakefile +42 -0
  298. data/vendor/plugins/slim_scrooge/ext/extconf.rb +5 -0
  299. data/vendor/plugins/slim_scrooge/lib/slim_scrooge.rb +16 -0
  300. data/vendor/plugins/slim_scrooge/lib/slim_scrooge/callsite.rb +96 -0
  301. data/vendor/plugins/slim_scrooge/lib/slim_scrooge/callsites.rb +70 -0
  302. data/vendor/plugins/slim_scrooge/lib/slim_scrooge/monitored_hash.rb +103 -0
  303. data/vendor/plugins/slim_scrooge/lib/slim_scrooge/result_set.rb +38 -0
  304. data/vendor/plugins/slim_scrooge/lib/slim_scrooge/simple_set.rb +34 -0
  305. data/vendor/plugins/slim_scrooge/lib/slim_scrooge/slim_scrooge.rb +46 -0
  306. data/vendor/plugins/slim_scrooge/rails/init.rb +8 -0
  307. data/vendor/plugins/slim_scrooge/slim_scrooge.gemspec +62 -0
  308. data/vendor/plugins/slim_scrooge/slim_scrooge_windows.gemspec +59 -0
  309. data/vendor/plugins/slim_scrooge/test/active_record_setup.rb +3 -0
  310. data/vendor/plugins/slim_scrooge/test/helper.rb +91 -0
  311. data/vendor/plugins/slim_scrooge/test/models/course.rb +2 -0
  312. data/vendor/plugins/slim_scrooge/test/schema/schema.rb +5 -0
  313. data/vendor/plugins/slim_scrooge/test/setup.rb +5 -0
  314. data/vendor/plugins/themes/app/models/theme.rb +7 -0
  315. data/vendor/plugins/themes/lib/theme_server.rb +3 -1
  316. data/vendor/plugins/themes/rails/init.rb +16 -13
  317. data/vendor/plugins/will_paginate/.manifest +43 -0
  318. data/vendor/plugins/will_paginate/CHANGELOG.rdoc +139 -0
  319. data/vendor/plugins/will_paginate/LICENSE +18 -0
  320. data/vendor/plugins/will_paginate/README.rdoc +107 -0
  321. data/vendor/plugins/will_paginate/Rakefile +53 -0
  322. data/vendor/plugins/will_paginate/examples/apple-circle.gif +0 -0
  323. data/vendor/plugins/will_paginate/examples/index.haml +69 -0
  324. data/vendor/plugins/will_paginate/examples/index.html +92 -0
  325. data/vendor/plugins/will_paginate/examples/pagination.css +90 -0
  326. data/vendor/plugins/will_paginate/examples/pagination.sass +91 -0
  327. data/vendor/plugins/will_paginate/init.rb +1 -0
  328. data/vendor/plugins/will_paginate/lib/will_paginate.rb +90 -0
  329. data/vendor/plugins/will_paginate/lib/will_paginate/array.rb +16 -0
  330. data/vendor/plugins/will_paginate/lib/will_paginate/collection.rb +146 -0
  331. data/vendor/plugins/will_paginate/lib/will_paginate/core_ext.rb +43 -0
  332. data/vendor/plugins/will_paginate/lib/will_paginate/finder.rb +264 -0
  333. data/vendor/plugins/will_paginate/lib/will_paginate/named_scope.rb +170 -0
  334. data/vendor/plugins/will_paginate/lib/will_paginate/named_scope_patch.rb +37 -0
  335. data/vendor/plugins/will_paginate/lib/will_paginate/version.rb +9 -0
  336. data/vendor/plugins/will_paginate/lib/will_paginate/view_helpers.rb +408 -0
  337. data/vendor/plugins/will_paginate/test/boot.rb +21 -0
  338. data/vendor/plugins/will_paginate/test/collection_test.rb +143 -0
  339. data/vendor/plugins/will_paginate/test/console +8 -0
  340. data/vendor/plugins/will_paginate/test/database.yml +22 -0
  341. data/vendor/plugins/will_paginate/test/finder_test.rb +473 -0
  342. data/vendor/plugins/will_paginate/test/fixtures/admin.rb +3 -0
  343. data/vendor/plugins/will_paginate/test/fixtures/developer.rb +14 -0
  344. data/vendor/plugins/will_paginate/test/fixtures/developers_projects.yml +13 -0
  345. data/vendor/plugins/will_paginate/test/fixtures/project.rb +15 -0
  346. data/vendor/plugins/will_paginate/test/fixtures/projects.yml +6 -0
  347. data/vendor/plugins/will_paginate/test/fixtures/replies.yml +29 -0
  348. data/vendor/plugins/will_paginate/test/fixtures/reply.rb +7 -0
  349. data/vendor/plugins/will_paginate/test/fixtures/schema.rb +38 -0
  350. data/vendor/plugins/will_paginate/test/fixtures/topic.rb +10 -0
  351. data/vendor/plugins/will_paginate/test/fixtures/topics.yml +30 -0
  352. data/vendor/plugins/will_paginate/test/fixtures/user.rb +2 -0
  353. data/vendor/plugins/will_paginate/test/fixtures/users.yml +35 -0
  354. data/vendor/plugins/will_paginate/test/helper.rb +37 -0
  355. data/vendor/plugins/will_paginate/test/lib/activerecord_test_case.rb +43 -0
  356. data/vendor/plugins/will_paginate/test/lib/activerecord_test_connector.rb +75 -0
  357. data/vendor/plugins/will_paginate/test/lib/load_fixtures.rb +11 -0
  358. data/vendor/plugins/will_paginate/test/lib/view_test_process.rb +179 -0
  359. data/vendor/plugins/will_paginate/test/tasks.rake +59 -0
  360. data/vendor/plugins/will_paginate/test/view_test.rb +373 -0
  361. data/vendor/plugins/will_paginate/will_paginate.gemspec +19 -0
  362. metadata +308 -27
  363. data/db/migrate/20091029034951_remove_blurb_from_news_items.rb +0 -9
  364. data/public/javascripts/jquery-ui-1.8rc1.min.js +0 -375
  365. data/test/fixtures/news_items.yml +0 -14
  366. data/test/unit/news_items_test.rb +0 -33
  367. data/vendor/plugins/authentication/test/fixtures/users.yml +0 -19
  368. data/vendor/plugins/authentication/test/functional/sessions_controller_test.rb +0 -85
  369. data/vendor/plugins/authentication/test/functional/users_controller_test.rb +0 -99
  370. data/vendor/plugins/authentication/test/unit/user_test.rb +0 -164
  371. data/vendor/plugins/news/app/controllers/admin/news_items_controller.rb +0 -5
  372. data/vendor/plugins/news/app/controllers/news_items_controller.rb +0 -20
  373. data/vendor/plugins/news/app/models/news_item.rb +0 -24
  374. data/vendor/plugins/news/app/views/admin/news_items/_form.html.erb +0 -19
  375. data/vendor/plugins/news/app/views/admin/news_items/_news_item.html.erb +0 -15
  376. data/vendor/plugins/news/app/views/admin/news_items/edit.html.erb +0 -1
  377. data/vendor/plugins/news/app/views/admin/news_items/index.html.erb +0 -31
  378. data/vendor/plugins/news/app/views/admin/news_items/new.html.erb +0 -1
  379. data/vendor/plugins/news/app/views/news_items/_recent_posts.html.erb +0 -8
  380. data/vendor/plugins/news/app/views/news_items/index.html.erb +0 -17
  381. data/vendor/plugins/news/app/views/news_items/index.rss.builder +0 -26
  382. data/vendor/plugins/news/app/views/news_items/show.html.erb +0 -13
  383. data/vendor/plugins/news/config/routes.rb +0 -7
  384. data/vendor/plugins/news/news.md +0 -20
  385. data/vendor/plugins/news/rails/init.rb +0 -11
@@ -0,0 +1,114 @@
1
+ require File.dirname(__FILE__) + "/../test_helper"
2
+
3
+ require "active_record"
4
+ require "active_support"
5
+ require File.dirname(__FILE__) + "/../../lib/friendly_id/active_record2.rb"
6
+ require File.dirname(__FILE__) + "/../../generators/friendly_id/templates/create_slugs"
7
+ require File.dirname(__FILE__) + "/support/models"
8
+ require File.dirname(__FILE__) + '/core'
9
+ require File.dirname(__FILE__) + '/slugged'
10
+
11
+ local_db_settings = File.dirname(__FILE__) + "/support/database.yml"
12
+ default_db_settings = File.dirname(__FILE__) + "/support/database.sqlite3.yml"
13
+ db_settings = File.exists?(local_db_settings) ? local_db_settings : default_db_settings
14
+ ActiveRecord::Base.establish_connection(YAML::load(File.open(db_settings)))
15
+
16
+ class ActiveRecord::Base
17
+ def log_protected_attribute_removal(*args) end
18
+ end
19
+
20
+ ActiveRecord::Base.connection.tables.each do |table|
21
+ ActiveRecord::Base.connection.drop_table(table)
22
+ end
23
+ ActiveRecord::Migration.verbose = false
24
+ CreateSlugs.up
25
+ CreateSupportModels.up
26
+
27
+ # A model that uses the automagically configured "cached_slug" column
28
+ class District < ActiveRecord::Base
29
+ has_friendly_id :name, :use_slug => true
30
+ end
31
+
32
+ # A model that specifies a custom cached slug column
33
+ class City < ActiveRecord::Base
34
+ attr_accessible :name
35
+ has_friendly_id :name, :use_slug => true, :cache_column => "my_slug"
36
+ end
37
+
38
+ # A model with a custom slug text normalizer
39
+ class Person < ActiveRecord::Base
40
+ has_friendly_id :name, :use_slug => true
41
+
42
+ def normalize_friendly_id(string)
43
+ string.upcase
44
+ end
45
+
46
+ end
47
+
48
+ # A slugged model that uses a scope
49
+ class Resident < ActiveRecord::Base
50
+ belongs_to :country
51
+ has_friendly_id :name, :use_slug => true, :scope => :country
52
+ end
53
+
54
+ # A slugged model used as a scope
55
+ class Country < ActiveRecord::Base
56
+ has_many :people
57
+ has_many :residents
58
+ has_friendly_id :name, :use_slug => true
59
+ end
60
+
61
+ # A model that doesn"t use slugs
62
+ class User < ActiveRecord::Base
63
+ has_friendly_id :name
64
+ has_many :houses
65
+ end
66
+
67
+ # Another model that doesn"t use slugs
68
+ class Author < ActiveRecord::Base
69
+ has_friendly_id :name
70
+ end
71
+
72
+
73
+ # A model that uses a non-slugged model for its scope
74
+ class House < ActiveRecord::Base
75
+ belongs_to :user
76
+ has_friendly_id :name, :use_slug => true, :scope => :user
77
+ end
78
+
79
+ # A model that uses default slug settings and has a named scope
80
+ class Post < ActiveRecord::Base
81
+ has_friendly_id :name, :use_slug => true
82
+ named_scope :published, :conditions => { :published => true }
83
+ end
84
+
85
+ # Model that uses a custom table name
86
+ class Place < ActiveRecord::Base
87
+ self.table_name = "legacy_table"
88
+ has_friendly_id :name, :use_slug => true
89
+ end
90
+
91
+ # A model that uses a datetime field for its friendly_id
92
+ class Event < ActiveRecord::Base
93
+ has_friendly_id :event_date, :use_slug => true
94
+ end
95
+
96
+ # A base model for single table inheritence
97
+ class Book < ActiveRecord::Base ; end
98
+
99
+ # A model that uses STI
100
+ class Novel < ::Book
101
+ has_friendly_id :name, :use_slug => true
102
+ end
103
+
104
+ # A model with no table
105
+ class Question < ActiveRecord::Base
106
+ has_friendly_id :name, :use_slug => true
107
+ end
108
+
109
+ # A model using the deprecated block syntax
110
+ class Block < ActiveRecord::Base
111
+ has_friendly_id :name, :use_slug => true do |text|
112
+ FriendlyId::SlugString.new(text).clean.with_dashes
113
+ end
114
+ end
@@ -0,0 +1,60 @@
1
+ require(File.dirname(__FILE__) + "/test_helper")
2
+
3
+ module FriendlyId
4
+
5
+ module Test
6
+
7
+ class FriendlyIdTest < ::Test::Unit::TestCase
8
+
9
+ test "should parse a friendly_id name and sequence" do
10
+ assert_equal ["test", "2"], "test--2".parse_friendly_id
11
+ end
12
+
13
+ test "should parse a friendly_id name and 10 as a sequence" do
14
+ assert_equal ["test", "10"], "test--10".parse_friendly_id
15
+ end
16
+
17
+ test "should parse a friendly_id name and 11 as a sequence" do
18
+ assert_equal ["test", "11"], "test--11".parse_friendly_id
19
+ end
20
+
21
+ test "should parse a friendly_id name and 29 as a sequence" do
22
+ assert_equal ["test", "29"], "test--29".parse_friendly_id
23
+ end
24
+
25
+ test "should parse with a default sequence of 1" do
26
+ assert_equal ["test", "1"], "test".parse_friendly_id
27
+ end
28
+
29
+ test "should be parseable with a custom separator" do
30
+ assert_equal ["test", "2"], "test:2".parse_friendly_id(":")
31
+ end
32
+
33
+ test "should be parseable with a custom separator and a double digit sequence" do
34
+ assert_equal ["test", "12"], "test:12".parse_friendly_id(":")
35
+ end
36
+
37
+ test "should parse when default sequence separator occurs in friendly_id name" do
38
+ assert_equal ["test--test", "2"], "test--test--2".parse_friendly_id
39
+ end
40
+
41
+ test "should parse when custom sequence separator occurs in friendly_id name" do
42
+ assert_equal ["test:test", "2"], "test:test:2".parse_friendly_id(":")
43
+ end
44
+
45
+ test "should parse when sequence separator and number occur in friendly_id name" do
46
+ assert_equal ["test--2--test", "1"], "test--2--test".parse_friendly_id
47
+ end
48
+
49
+ test "should parse when sequence separator, number and sequence occur in friendly_id name" do
50
+ assert_equal ["test--2--test", "2"], "test--2--test--2".parse_friendly_id
51
+ end
52
+
53
+ test "should parse when double digit sequence separator, number and sequence occur in friendly_id name" do
54
+ assert_equal ["test--2--test", "12"], "test--2--test--12".parse_friendly_id
55
+ end
56
+
57
+
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,78 @@
1
+ # encoding: utf-8
2
+ require(File.dirname(__FILE__) + "/test_helper")
3
+
4
+ module FriendlyId
5
+ module Test
6
+
7
+ class SlugStringTest < ::Test::Unit::TestCase
8
+
9
+ test "should approximate ascii" do
10
+ # create string with range of Unicode"s western characters with
11
+ # diacritics, excluding the division and multiplication signs which for
12
+ # some reason or other are floating in the middle of all the letters.
13
+ s = SlugString.new((0xC0..0x17E).to_a.reject {|c| [0xD7, 0xF7].include? c}.pack("U*"))
14
+ output = s.approximate_ascii
15
+ assert(output.length > s.length)
16
+ assert_match output, /^[a-zA-Z']*$/
17
+ end
18
+
19
+ test "should strip non-word chars" do
20
+ s = SlugString.new "¡feliz año!"
21
+ assert_equal "feliz año", s.word_chars
22
+ end
23
+
24
+ test "should lowercase strings" do
25
+ assert_equal "feliz año", SlugString.new("FELIZ AÑO").downcase
26
+ end
27
+
28
+ test "should uppercase strings" do
29
+ assert_equal "FELIZ AÑO", SlugString.new("feliz año").upcase
30
+ end
31
+
32
+ test "should replace whitespace with dashes" do
33
+ assert_equal "a-b", SlugString.new("a b").clean.with_dashes
34
+ end
35
+
36
+ test "should replace multiple spaces with 1 dash" do
37
+ assert_equal "a-b", SlugString.new("a b").clean.with_dashes
38
+ end
39
+
40
+ test "should replace multiple dashes with 1 dash" do
41
+ assert_equal "male-female", SlugString.new("male - female").with_dashes
42
+ end
43
+
44
+ test "should strip trailing space" do
45
+ assert_equal "ab", SlugString.new("ab ").clean
46
+ end
47
+
48
+ test "should strip leading space" do
49
+ assert_equal "ab", SlugString.new(" ab").clean
50
+ end
51
+
52
+ test "should strip trailing slashes" do
53
+ assert_equal "ab", SlugString.new("ab-").clean
54
+ end
55
+
56
+ test "should strip leading slashes" do
57
+ assert_equal "ab", SlugString.new("-ab").clean
58
+ end
59
+
60
+ test "should not modify valid name strings" do
61
+ assert_equal "a-b-c-d", SlugString.new("a-b-c-d").clean
62
+ end
63
+
64
+ test "should do special approximations for German" do
65
+ assert_equal "Juergen", SlugString.new("Jürgen").approximate_ascii(:german)
66
+ end
67
+
68
+ test "should do special approximations for Spanish" do
69
+ assert_equal "anno", SlugString.new("año").approximate_ascii(:spanish)
70
+ end
71
+
72
+ test "should work with non roman chars" do
73
+ assert_equal "検-索", SlugString.new("検 索").with_dashes
74
+ end
75
+
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,9 @@
1
+ $KCODE = "UTF8" if RUBY_VERSION < "1.9"
2
+ $VERBOSE = false
3
+
4
+ require "rubygems"
5
+ require "test/unit"
6
+ require "mocha"
7
+ require "active_support"
8
+ require File.dirname(__FILE__) + "/../lib/friendly_id"
9
+ require File.dirname(__FILE__) + "/../lib/friendly_id/test"
@@ -0,0 +1,88 @@
1
+ = 0.8.2
2
+ === 5 November, 2009
3
+ * Bring JRuby support up to speed, including Java-based hpricot_css support
4
+ * Change JRuby fast_xs to have same escaping behavior as C fast_xs
5
+
6
+ = 0.8.1
7
+ === 3 April, 2009
8
+ * fix for issue #2, downcasing of html attributes inside the parser.
9
+ * solve issue #3 with bogus etags being preserved in `to_s` rather than just `to_original_html`.
10
+ * fix error when attempting to reparent cleared node. (issue #5)
11
+ * Hpricot::Attributes proxy object for using `ele.attributes[k] = v` directly.
12
+ however, it is preferred to use the jquery-like `elements.attr(k, v)`.
13
+
14
+ = 0.8
15
+ === 31st March, 2009
16
+ * Saving memory and speed by using RStruct-based elements in the C extension.
17
+ * Bug in tag parsing, causing runaway <script> and <style> tags in HTML.
18
+ * Problem compiling under Ruby 1.9, due to our_rb_hash_lookup function meant for Ruby 1.8.
19
+ * CData was missing inner_text method.
20
+
21
+ = 0.7
22
+ === 17th March, 2009
23
+ * Rewritten parser routine, much lighter on memory, quite a bit faster.
24
+ * Friendlier with Ruby 1.9.
25
+ * Fixes to nth-child and text() selectors.
26
+
27
+ = 0.6
28
+ === 15th June, 2007
29
+ * Hpricot for JRuby -- nice work Ola Bini!
30
+ * Inline Markaby for Hpricot documents.
31
+ * XML tags and attributes are no longer downcased like HTML is.
32
+ * new syntax for grabbing everything between two elements using a Range in the search method: (doc/("font".."font/br")) or in nodes_at like so: (doc/"font").nodes_at("*".."br"). Only works with either a pair of siblings or a set of a parent and a sibling.
33
+ * Ignore self-closing endings on tags (such as form) which are containers. Treat them like open parent tags. Reported by Jonathan Nichols on the hpricot list.
34
+ * Escaping of attributes, yanked from Jim Weirich and Sam Ruby's work in Builder.
35
+ * Element#raw_attributes gives unescaped data. Element#attributes gives escaped.
36
+ * Added: Elements#attr, Elements#remove_attr, Elements#remove_class.
37
+ * Added: Traverse#preceding, Traverse#following, Traverse#previous, Traverse#next.
38
+
39
+ = 0.5
40
+ === 31rd January, 2007
41
+
42
+ * support for a[text()="Click Me!"] and h3[text()*="space"] and the like.
43
+ * Hpricot.buffer_size accessor for increasing Hpricot's buffer if you're encountering huge ASP.NET viewstate attribs.
44
+ * some support for colons in tag names (not full namespace support yet.)
45
+ * Element.to_original_html will attempt to preserve the original HTML while merging your changes.
46
+ * Element.to_plain_text converts an element's contents to a simple text format.
47
+ * Element.inner_text removes all tags and returns text nodes concatenated into a single string.
48
+ * no @raw_string variable kept for comments, text, and cdata -- as it's redundant.
49
+ * xpath-style indices (//p/a[1]) but keep in mind that they aren't zero-based.
50
+ * node_position is the index among all sibling nodes, while position is the position among children of identical type.
51
+ * comment() and text() search criteria, like: //p/text(), which selects all text inside paragraph tags.
52
+ * every element has css_path and xpath methods which return respective absolute paths.
53
+ * more flexibility all around: in parsing attributes, tags, comments and cdata.
54
+
55
+ = 0.4
56
+ === 11th August, 2006
57
+
58
+ * The :fixup_tags option will try to sort out the hierarchy so elements end up with the right parents.
59
+ * Elements such as *script* and *style* (identified as having CDATA contents) receive a single text node as their children now. Previously, Hpricot was parsing out tags found in scripts.
60
+ * Better scanning of partially quoted attributes (found by Brent Beardsly on http://uswebgen.com/)
61
+ * Better scanning of unquoted attributes -- thanks to Aaron Patterson for the test cases!
62
+ * Some tags were being output in the empty tag style, although browsers hated that. FIXED!
63
+ * Added Elements#at for finding single elements.
64
+ * Added Elem::Trav#[] and Elem::Trav#[]= for reading and writing attributes.
65
+
66
+ = 0.3
67
+ === 7th July, 2006
68
+
69
+ * Fixed negative string size error on empty tokens. (news.bbc.co.uk)
70
+ * Allow the parser to accept just text nodes. (such as: <tt>Hpricot.parse('TEXT')</tt>)
71
+ * from JQuery to Hpricot::Elements: remove, empty, append, prepend, before, after, wrap, set,
72
+ html(...), to_html, to_s.
73
+ * on containers: to_html, replace_child, insert_before, insert_after, innerHTML=.
74
+ * Hpricot(...) is an alias for parse.
75
+ * open up all properties to setters, let people do as they may.
76
+ * use to_html for the full html of a node or set of elements.
77
+ * doctypes were messed.
78
+
79
+ = 0.2
80
+ === 4th July, 2006
81
+
82
+ * Rewrote the HTree parser to be simpler, more adequate for the common man. Will add encoding back in later.
83
+
84
+ = 0.1
85
+ === 3rd July, 2006
86
+
87
+ * For whatever reason, wrote this HTML parser in C.
88
+ I guess Ragel is addictive and I want to improve HTree.
@@ -0,0 +1,18 @@
1
+ Copyright (c) 2006 why the lucky stiff
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to
5
+ deal in the Software without restriction, including without limitation the
6
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
7
+ sell copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
16
+ THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
17
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
18
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,275 @@
1
+ = Hpricot, Read Any HTML
2
+
3
+ Hpricot is a fast, flexible HTML parser written in C. It's designed to be very
4
+ accommodating (like Tanaka Akira's HTree) and to have a very helpful library
5
+ (like some JavaScript libs -- JQuery, Prototype -- give you.) The XPath and CSS
6
+ parser, in fact, is based on John Resig's JQuery.
7
+
8
+ Also, Hpricot can be handy for reading broken XML files, since many of the same
9
+ techniques can be used. If a quote is missing, Hpricot tries to figure it out.
10
+ If tags overlap, Hpricot works on sorting them out. You know, that sort of
11
+ thing.
12
+
13
+ *Please read this entire document* before making assumptions about how this
14
+ software works.
15
+
16
+ == An Overview
17
+
18
+ Let's clear up what Hpricot is.
19
+
20
+ # Hpricot is *a standalone library*. It requires no other libraries. Just Ruby!
21
+ # While priding itself on speed, Hpricot *works hard to sort out bad HTML* and
22
+ pays a small penalty in order to get that right. So that's slightly more important
23
+ to me than speed.
24
+ # *If you can see it in Firefox, then Hpricot should parse it.* That's
25
+ how it should be! Let me know the minute it's otherwise.
26
+ # Primarily, Hpricot is used for reading HTML and tries to sort out troubled
27
+ HTML by having some idea of what good HTML is. Some people still like to use
28
+ Hpricot for XML reading, but *remember to use the Hpricot::XML() method* for that!
29
+
30
+ == The Hpricot Kingdom
31
+
32
+ First, here are all the links you need to know:
33
+
34
+ * http://wiki.github.com/hpricot/hpricot is the Hpricot wiki and
35
+ http://github.com/hpricot/hpricot/issues is the bug tracker.
36
+ Go there for news and recipes and patches. It's the center of activity.
37
+ * http://github.com/hpricot/hpricot is the main Git
38
+ repository for Hpricot. You can get the latest code there.
39
+ * See COPYING for the terms of this software. (Spoiler: it's absolutely free.)
40
+
41
+ If you have any trouble, don't hesitate to contact the author. As always, I'm
42
+ not going to say "Use at your own risk" because I don't want this library to be
43
+ risky. If you trip on something, I'll share the liability by repairing things
44
+ as quickly as I can. Your responsibility is to report the inadequacies.
45
+
46
+ == Installing Hpricot
47
+
48
+ You may get the latest stable version from Rubyforge. Win32 binaries,
49
+ Java binaries (for JRuby), and source gems are available.
50
+
51
+ $ gem install hpricot
52
+
53
+ == An Hpricot Showcase
54
+
55
+ We're going to run through a big pile of examples to get you jump-started.
56
+ Many of these examples are also found at
57
+ http://wiki.github.com/hpricot/hpricot/hpricot-basics, in case you
58
+ want to add some of your own.
59
+
60
+ === Loading Hpricot Itself
61
+
62
+ You have probably got the gem, right? To load Hpricot:
63
+
64
+ require 'rubygems'
65
+ require 'hpricot'
66
+
67
+ If you've installed the plain source distribution, go ahead and just:
68
+
69
+ require 'hpricot'
70
+
71
+ === Load an HTML Page
72
+
73
+ The <tt>Hpricot()</tt> method takes a string or any IO object and loads the
74
+ contents into a document object.
75
+
76
+ doc = Hpricot("<p>A simple <b>test</b> string.</p>")
77
+
78
+ To load from a file, just get the stream open:
79
+
80
+ doc = open("index.html") { |f| Hpricot(f) }
81
+
82
+ To load from a web URL, use <tt>open-uri</tt>, which comes with Ruby:
83
+
84
+ require 'open-uri'
85
+ doc = open("http://qwantz.com/") { |f| Hpricot(f) }
86
+
87
+ Hpricot uses an internal buffer to parse the file, so the IO will stream
88
+ properly and large documents won't be loaded into memory all at once. However,
89
+ the parsed document object will be present in memory, in its entirety.
90
+
91
+ === Search for Elements
92
+
93
+ Use <tt>Doc.search</tt>:
94
+
95
+ doc.search("//p[@class='posted']")
96
+ #=> #<Hpricot:Elements[{p ...}, {p ...}]>
97
+
98
+ <tt>Doc.search</tt> can take an XPath or CSS expression. In the above example,
99
+ all paragraph <tt><p></tt> elements are grabbed which have a <tt>class</tt>
100
+ attribute of <tt>"posted"</tt>.
101
+
102
+ A shortcut is to use the divisor:
103
+
104
+ (doc/"p.posted")
105
+ #=> #<Hpricot:Elements[{p ...}, {p ...}]>
106
+
107
+ === Finding Just One Element
108
+
109
+ If you're looking for a single element, the <tt>at</tt> method will return the
110
+ first element matched by the expression. In this case, you'll get back the
111
+ element itself rather than the <tt>Hpricot::Elements</tt> array.
112
+
113
+ doc.at("body")['onload']
114
+
115
+ The above code will find the body tag and give you back the <tt>onload</tt>
116
+ attribute. This is the most common reason to use the element directly: when
117
+ reading and writing HTML attributes.
118
+
119
+ === Fetching the Contents of an Element
120
+
121
+ Just as with browser scripting, the <tt>inner_html</tt> property can be used to
122
+ get the inner contents of an element.
123
+
124
+ (doc/"#elementID").inner_html
125
+ #=> "..<b>contents</b>.."
126
+
127
+ If your expression matches more than one element, you'll get back the contents
128
+ of ''all the matched elements''. So you may want to use <tt>first</tt> to be
129
+ sure you get back only one.
130
+
131
+ (doc/"#elementID").first.inner_html
132
+ #=> "..<b>contents</b>.."
133
+
134
+ === Fetching the HTML for an Element
135
+
136
+ If you want the HTML for the whole element (not just the contents), use
137
+ <tt>to_html</tt>:
138
+
139
+ (doc/"#elementID").to_html
140
+ #=> "<div id='elementID'>...</div>"
141
+
142
+ === Looping
143
+
144
+ All searches return a set of <tt>Hpricot::Elements</tt>. Go ahead and loop
145
+ through them like you would an array.
146
+
147
+ (doc/"p/a/img").each do |img|
148
+ puts img.attributes['class']
149
+ end
150
+
151
+ === Continuing Searches
152
+
153
+ Searches can be continued from a collection of elements, in order to search deeper.
154
+
155
+ # find all paragraphs.
156
+ elements = doc.search("/html/body//p")
157
+ # continue the search by finding any images within those paragraphs.
158
+ (elements/"img")
159
+ #=> #<Hpricot::Elements[{img ...}, {img ...}]>
160
+
161
+ Searches can also be continued by searching within container elements.
162
+
163
+ # find all images within paragraphs.
164
+ doc.search("/html/body//p").each do |para|
165
+ puts "== Found a paragraph =="
166
+ pp para
167
+
168
+ imgs = para.search("img")
169
+ if imgs.any?
170
+ puts "== Found #{imgs.length} images inside =="
171
+ end
172
+ end
173
+
174
+ Of course, the most succinct ways to do the above are using CSS or XPath.
175
+
176
+ # the xpath version
177
+ (doc/"/html/body//p//img")
178
+ # the css version
179
+ (doc/"html > body > p img")
180
+ # ..or symbols work, too!
181
+ (doc/:html/:body/:p/:img)
182
+
183
+ === Looping Edits
184
+
185
+ You may certainly edit objects from within your search loops. Then, when you
186
+ spit out the HTML, the altered elements will show.
187
+
188
+ (doc/"span.entryPermalink").each do |span|
189
+ span.attributes['class'] = 'newLinks'
190
+ end
191
+ puts doc
192
+
193
+ This changes all <tt>span.entryPermalink</tt> elements to
194
+ <tt>span.newLinks</tt>. Keep in mind that there are often more convenient ways
195
+ of doing this. Such as the <tt>set</tt> method:
196
+
197
+ (doc/"span.entryPermalink").set(:class => 'newLinks')
198
+
199
+ === Figuring Out Paths
200
+
201
+ Every element can tell you its unique path (either XPath or CSS) to get to the
202
+ element from the root tag.
203
+
204
+ The <tt>css_path</tt> method:
205
+
206
+ doc.at("div > div:nth(1)").css_path
207
+ #=> "div > div:nth(1)"
208
+ doc.at("#header").css_path
209
+ #=> "#header"
210
+
211
+ Or, the <tt>xpath</tt> method:
212
+
213
+ doc.at("div > div:nth(1)").xpath
214
+ #=> "/div/div:eq(1)"
215
+ doc.at("#header").xpath
216
+ #=> "//div[@id='header']"
217
+
218
+ == Hpricot Fixups
219
+
220
+ When loading HTML documents, you have a few settings that can make Hpricot more
221
+ or less intense about how it gets involved.
222
+
223
+ == :fixup_tags
224
+
225
+ Really, there are so many ways to clean up HTML and your intentions may be to
226
+ keep the HTML as-is. So Hpricot's default behavior is to keep things flexible.
227
+ Making sure to open and close all the tags, but ignore any validation problems.
228
+
229
+ As of Hpricot 0.4, there's a new <tt>:fixup_tags</tt> option which will attempt
230
+ to shift the document's tags to meet XHTML 1.0 Strict.
231
+
232
+ doc = open("index.html") { |f| Hpricot f, :fixup_tags => true }
233
+
234
+ This doesn't quite meet the XHTML 1.0 Strict standard, it just tries to follow
235
+ the rules a bit better. Like: say Hpricot finds a paragraph in a link, it's
236
+ going to move the paragraph below the link. Or up and out of other elements
237
+ where paragraphs don't belong.
238
+
239
+ If an unknown element is found, it is ignored. Again, <tt>:fixup_tags</tt>.
240
+
241
+ == :xhtml_strict
242
+
243
+ So, let's go beyond just trying to fix the hierarchy. The
244
+ <tt>:xhtml_strict</tt> option really tries to force the document to be an XHTML
245
+ 1.0 Strict document. Even at the cost of removing elements that get in the way.
246
+
247
+ doc = open("index.html") { |f| Hpricot f, :xhtml_strict => true }
248
+
249
+ What measures does <tt>:xhtml_strict</tt> take?
250
+
251
+ 1. Shift elements into their proper containers just like :fixup_tags.
252
+ 2. Remove unknown elements.
253
+ 3. Remove unknown attributes.
254
+ 4. Remove illegal content.
255
+ 5. Alter the doctype to XHTML 1.0 Strict.
256
+
257
+ == Hpricot.XML()
258
+
259
+ The last option is the <tt>:xml</tt> option, which makes some slight variations
260
+ on the standard mode. The main difference is that :xml mode won't try to output
261
+ tags which are friendlier for browsers. For example, if an opening and closing
262
+ <tt>br</tt> tag is found, XML mode won't try to turn that into an empty element.
263
+
264
+ XML mode also doesn't downcase the tags and attributes for you. So pay attention
265
+ to case, friends.
266
+
267
+ The primary way to use Hpricot's XML mode is to call the Hpricot.XML method:
268
+
269
+ doc = open("http://redhanded.hobix.com/index.xml") do |f|
270
+ Hpricot.XML(f)
271
+ end
272
+
273
+ *Also, :fixup_tags is canceled out by the :xml option.* This is because
274
+ :fixup_tags makes assumptions based how HTML is structured. Specifically, how
275
+ tags are defined in the XHTML 1.0 DTD.