rich 0.0.1

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 (233) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.rdoc +163 -0
  3. data/Rakefile +39 -0
  4. data/app/assets/images/rich/images.png +0 -0
  5. data/app/assets/images/rich/plus-red.png +0 -0
  6. data/app/assets/images/rich/plus.png +0 -0
  7. data/app/assets/images/rich/x-red.png +0 -0
  8. data/app/assets/javascripts/rich/application.js +61 -0
  9. data/app/assets/javascripts/rich/base.js +51 -0
  10. data/app/assets/javascripts/rich/ckeditor_path.js +1 -0
  11. data/app/assets/javascripts/rich/uploader.js +59 -0
  12. data/app/assets/stylesheets/rich/application.css.scss +253 -0
  13. data/app/assets/stylesheets/rich/editor.css +20 -0
  14. data/app/assets/stylesheets/rich/files.css +4 -0
  15. data/app/assets/stylesheets/rich/mixins/reset.css.scss +58 -0
  16. data/app/controllers/rich/application_controller.rb +11 -0
  17. data/app/controllers/rich/files_controller.rb +107 -0
  18. data/app/helpers/rich/application_helper.rb +4 -0
  19. data/app/helpers/rich/files_helper.rb +4 -0
  20. data/app/inputs/rich_input.rb +14 -0
  21. data/app/models/rich/rich_image.rb +77 -0
  22. data/app/views/layouts/rich/application.html.erb +14 -0
  23. data/app/views/rich/files/_image.html.erb +9 -0
  24. data/app/views/rich/files/destroy.js.erb +1 -0
  25. data/app/views/rich/files/index.html.erb +29 -0
  26. data/app/views/rich/files/show.html.erb +1 -0
  27. data/config/routes.rb +5 -0
  28. data/db/migrate/20111002142937_create_rich_rich_images.rb +17 -0
  29. data/lib/generators/rich/install/install_generator.rb +34 -0
  30. data/lib/generators/rich/install/templates/rich.js +1 -0
  31. data/lib/generators/rich/install/templates/rich.rb.erb +69 -0
  32. data/lib/rich.rb +63 -0
  33. data/lib/rich/engine.rb +13 -0
  34. data/lib/rich/form_builder.rb +14 -0
  35. data/lib/rich/legacy_formtastic.rb +15 -0
  36. data/lib/rich/version.rb +3 -0
  37. data/lib/rich/view_helper.rb +48 -0
  38. data/lib/tasks/rich_tasks.rake +29 -0
  39. data/test/dummy/Rakefile +7 -0
  40. data/test/dummy/app/admin/dashboards.rb +38 -0
  41. data/test/dummy/app/admin/posts.rb +11 -0
  42. data/test/dummy/app/assets/javascripts/active_admin.js +1 -0
  43. data/test/dummy/app/assets/javascripts/application.js +9 -0
  44. data/test/dummy/app/assets/javascripts/posts.js +2 -0
  45. data/test/dummy/app/assets/javascripts/rich.js +1 -0
  46. data/test/dummy/app/assets/stylesheets/active_admin.css.scss +10 -0
  47. data/test/dummy/app/assets/stylesheets/application.css +7 -0
  48. data/test/dummy/app/assets/stylesheets/posts.css +4 -0
  49. data/test/dummy/app/assets/stylesheets/rich/editor.css +20 -0
  50. data/test/dummy/app/assets/stylesheets/scaffold.css +56 -0
  51. data/test/dummy/app/controllers/application_controller.rb +3 -0
  52. data/test/dummy/app/controllers/posts_controller.rb +83 -0
  53. data/test/dummy/app/helpers/application_helper.rb +2 -0
  54. data/test/dummy/app/helpers/posts_helper.rb +2 -0
  55. data/test/dummy/app/models/admin_user.rb +9 -0
  56. data/test/dummy/app/models/post.rb +2 -0
  57. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  58. data/test/dummy/app/views/posts/_form.html.erb +29 -0
  59. data/test/dummy/app/views/posts/_formtastic_form.html.erb +10 -0
  60. data/test/dummy/app/views/posts/edit.html.erb +6 -0
  61. data/test/dummy/app/views/posts/index.html.erb +27 -0
  62. data/test/dummy/app/views/posts/new.html.erb +5 -0
  63. data/test/dummy/app/views/posts/show.html.erb +20 -0
  64. data/test/dummy/config.ru +4 -0
  65. data/test/dummy/config/application.rb +48 -0
  66. data/test/dummy/config/boot.rb +19 -0
  67. data/test/dummy/config/database.yml +25 -0
  68. data/test/dummy/config/environment.rb +5 -0
  69. data/test/dummy/config/environments/development.rb +32 -0
  70. data/test/dummy/config/environments/production.rb +62 -0
  71. data/test/dummy/config/environments/test.rb +39 -0
  72. data/test/dummy/config/initializers/active_admin.rb +102 -0
  73. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  74. data/test/dummy/config/initializers/devise.rb +211 -0
  75. data/test/dummy/config/initializers/formtastic.rb +80 -0
  76. data/test/dummy/config/initializers/inflections.rb +10 -0
  77. data/test/dummy/config/initializers/mime_types.rb +5 -0
  78. data/test/dummy/config/initializers/rich.rb +28 -0
  79. data/test/dummy/config/initializers/secret_token.rb +7 -0
  80. data/test/dummy/config/initializers/session_store.rb +8 -0
  81. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  82. data/test/dummy/config/locales/devise.en.yml +58 -0
  83. data/test/dummy/config/locales/en.yml +5 -0
  84. data/test/dummy/config/routes.rb +13 -0
  85. data/test/dummy/db/development.sqlite3 +0 -0
  86. data/test/dummy/db/migrate/20111001122048_create_posts.rb +11 -0
  87. data/test/dummy/db/migrate/20111003150957_create_rich_rich_images.rb +17 -0
  88. data/test/dummy/db/migrate/20111014123344_devise_create_admin_users.rb +31 -0
  89. data/test/dummy/db/migrate/20111014143348_create_admin_notes.rb +16 -0
  90. data/test/dummy/db/migrate/20111014143349_move_admin_notes_to_comments.rb +25 -0
  91. data/test/dummy/db/production.sqlite3 +0 -0
  92. data/test/dummy/db/schema.rb +67 -0
  93. data/test/dummy/log/development.log +72064 -0
  94. data/test/dummy/log/production.log +2417 -0
  95. data/test/dummy/public/404.html +26 -0
  96. data/test/dummy/public/422.html +26 -0
  97. data/test/dummy/public/500.html +26 -0
  98. data/test/dummy/public/favicon.ico +0 -0
  99. data/test/dummy/public/system/test +0 -0
  100. data/test/dummy/script/rails +6 -0
  101. data/test/dummy/test/fixtures/admin_users.yml +11 -0
  102. data/test/dummy/test/fixtures/posts.yml +11 -0
  103. data/test/dummy/test/functional/posts_controller_test.rb +49 -0
  104. data/test/dummy/test/unit/admin_user_test.rb +7 -0
  105. data/test/dummy/test/unit/helpers/posts_helper_test.rb +4 -0
  106. data/test/dummy/test/unit/post_test.rb +7 -0
  107. data/test/dummy/tmp/cache/assets/C2B/5B0/sprockets%2F0c71315129cf9540624929678219ee7b +0 -0
  108. data/test/dummy/tmp/cache/assets/C32/C40/sprockets%2Ff459d7671964c49e413971720514ba68 +0 -0
  109. data/test/dummy/tmp/cache/assets/C51/3D0/sprockets%2F110c288a88ab99a1399d35171079612c +0 -0
  110. data/test/dummy/tmp/cache/assets/C53/630/sprockets%2F0680b1b2c967d3c84970e3786800641c +0 -0
  111. data/test/dummy/tmp/cache/assets/C53/680/sprockets%2F03d11661470de7443c495783330d9ee7 +0 -0
  112. data/test/dummy/tmp/cache/assets/C7F/C10/sprockets%2F356f0929a286c961448d76c12a2e14b1 +0 -0
  113. data/test/dummy/tmp/cache/assets/C8D/E30/sprockets%2F24444bdc865de860f4b693233c973844 +0 -0
  114. data/test/dummy/tmp/cache/assets/C99/430/sprockets%2F1027b261dc3bd6202585ad4d830263c6 +0 -0
  115. data/test/dummy/tmp/cache/assets/CAB/440/sprockets%2Fed2218494b3b8488b7268c00e717a0c1 +0 -0
  116. data/test/dummy/tmp/cache/assets/CB3/920/sprockets%2Fc38c48651c972cee0be83538700535b4 +0 -0
  117. data/test/dummy/tmp/cache/assets/CB4/740/sprockets%2F36fd3817633b234824bc6577f25ffe01 +0 -0
  118. data/test/dummy/tmp/cache/assets/CBE/A80/sprockets%2F60bb9087aed9745744925f6ce01525d9 +0 -0
  119. data/test/dummy/tmp/cache/assets/CC4/040/sprockets%2F83a9f5f7314b761bbd7f1858d1998045 +0 -0
  120. data/test/dummy/tmp/cache/assets/CC4/590/sprockets%2F869369b5c848f745b23ba174ca9197a6 +0 -0
  121. data/test/dummy/tmp/cache/assets/CC4/BF0/sprockets%2F93d5b131135a09e48369e02ba5c01b0a +0 -0
  122. data/test/dummy/tmp/cache/assets/CC7/5F0/sprockets%2F8bf37168fb70e08b9e4578e72739a543 +0 -0
  123. data/test/dummy/tmp/cache/assets/CD5/340/sprockets%2Fae698307143f445c5011d6ad90b4cf60 +0 -0
  124. data/test/dummy/tmp/cache/assets/CDD/D50/sprockets%2Faee2002e4369cf20946112efcb776089 +0 -0
  125. data/test/dummy/tmp/cache/assets/CE4/510/sprockets%2F3271d0cbd86553a56768f4d130ec5e59 +0 -0
  126. data/test/dummy/tmp/cache/assets/CE8/310/sprockets%2F4ab24984d5862f28160f1f4f067e2ef4 +0 -0
  127. data/test/dummy/tmp/cache/assets/CEC/1A0/sprockets%2F87fdead6014b961bb870b5931890d677 +0 -0
  128. data/test/dummy/tmp/cache/assets/CED/2E0/sprockets%2F82382552d084b0569dfd88e34d1cb7e8 +0 -0
  129. data/test/dummy/tmp/cache/assets/CF0/1D0/sprockets%2F6fc757c2c8329244ca95d6909865bbc2 +0 -0
  130. data/test/dummy/tmp/cache/assets/CF0/A80/sprockets%2Fd1de761043f6d817880d4b876a73bf87 +0 -0
  131. data/test/dummy/tmp/cache/assets/CF9/EC0/sprockets%2F04ba1f02c639d30c53eb7b51640b937a +0 -0
  132. data/test/dummy/tmp/cache/assets/CFB/870/sprockets%2Feb5658a4a2c12e389e4c405f0113a0a7 +0 -0
  133. data/test/dummy/tmp/cache/assets/D00/7A0/sprockets%2F3ee0dfa5072b54505817cb4bf934201e +0 -0
  134. data/test/dummy/tmp/cache/assets/D00/C00/sprockets%2F0a61e8d7b11a463083da24605e65d5dd +0 -0
  135. data/test/dummy/tmp/cache/assets/D07/B30/sprockets%2F0640b99ec5e303921065ac4c0ff8b7f0 +0 -0
  136. data/test/dummy/tmp/cache/assets/D11/D20/sprockets%2Fcac21eac42152981882bf9e489316af4 +0 -0
  137. data/test/dummy/tmp/cache/assets/D13/970/sprockets%2F1fd634278255bc58382a590fd5cf24cc +0 -0
  138. data/test/dummy/tmp/cache/assets/D14/980/sprockets%2F85dc72862eb259cd954ab41369bc6a32 +0 -0
  139. data/test/dummy/tmp/cache/assets/D15/F40/sprockets%2F83d1a8006e470e79f75592d63bdedc04 +0 -0
  140. data/test/dummy/tmp/cache/assets/D16/C70/sprockets%2Fd3046a8979c64b4311a728da2ee8b88b +0 -0
  141. data/test/dummy/tmp/cache/assets/D1D/1A0/sprockets%2Fc2e11e4152a31726c2cbab7333c74ba2 +0 -0
  142. data/test/dummy/tmp/cache/assets/D1D/500/sprockets%2F71e1de34b5d39e4c637f0fb0619696f7 +0 -0
  143. data/test/dummy/tmp/cache/assets/D1F/B30/sprockets%2F6351ed750b17ed0f99fa01c32ff98878 +0 -0
  144. data/test/dummy/tmp/cache/assets/D2A/FA0/sprockets%2Fa5403e1fe15018cddc4435c3cac84910 +0 -0
  145. data/test/dummy/tmp/cache/assets/D2E/090/sprockets%2Fc54283e81ce52bf9d542ab12492a01ad +0 -0
  146. data/test/dummy/tmp/cache/assets/D2F/390/sprockets%2Fa02968dd653b0e650fc202c33ff42fc0 +0 -0
  147. data/test/dummy/tmp/cache/assets/D30/E90/sprockets%2F3a19bbe0320337a6bf29177da71bf1e7 +0 -0
  148. data/test/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
  149. data/test/dummy/tmp/cache/assets/D34/080/sprockets%2Fe398005214c8d65a54fc19fca2c00c8b +0 -0
  150. data/test/dummy/tmp/cache/assets/D37/9B0/sprockets%2F0de49dd3031c50c7cf2ef74d6c392530 +0 -0
  151. data/test/dummy/tmp/cache/assets/D38/540/sprockets%2F86e1ad844bc9df4491a2a52b870421db +0 -0
  152. data/test/dummy/tmp/cache/assets/D3C/070/sprockets%2F2377eb8a729535e35abd593a6fc00ba6 +0 -0
  153. data/test/dummy/tmp/cache/assets/D3E/B20/sprockets%2F1f79ee84bd6d74d100c5cb018b662b67 +0 -0
  154. data/test/dummy/tmp/cache/assets/D40/A40/sprockets%2Feb59c65dcb7136f1cd134dac36794822 +0 -0
  155. data/test/dummy/tmp/cache/assets/D48/9F0/sprockets%2F6ed3c460867ee6d748edad50818d332a +0 -0
  156. data/test/dummy/tmp/cache/assets/D4D/650/sprockets%2Ff51d1875ad5829c7bf3ff03e920497be +0 -0
  157. data/test/dummy/tmp/cache/assets/D52/9B0/sprockets%2F736738bf59f956eb15c4bff06d980be0 +0 -0
  158. data/test/dummy/tmp/cache/assets/D54/ED0/sprockets%2F71c9fa01091d432b131da3bb73faf3d4 +0 -0
  159. data/test/dummy/tmp/cache/assets/D55/5C0/sprockets%2F97b52c1c0d1a002ac6fb9d702b7ab625 +0 -0
  160. data/test/dummy/tmp/cache/assets/D61/940/sprockets%2Fca03651b8f5fb1416c9945cda71ab22d +0 -0
  161. data/test/dummy/tmp/cache/assets/D6C/F90/sprockets%2Fcb34e531e41b981cf6ca2a5c7e70f890 +0 -0
  162. data/test/dummy/tmp/cache/assets/D78/9D0/sprockets%2Ff56eced46698105ad2e9d46b1e2ee228 +0 -0
  163. data/test/dummy/tmp/cache/assets/D84/210/sprockets%2Fabd0103ccec2b428ac62c94e4c40b384 +0 -0
  164. data/test/dummy/tmp/cache/assets/D86/710/sprockets%2F409dbeb796f68c91b60fe29aef7817e3 +0 -0
  165. data/test/dummy/tmp/cache/assets/D95/D50/sprockets%2F15e32d81de6597aad23d67d2cd1d0b7a +0 -0
  166. data/test/dummy/tmp/cache/assets/D96/E90/sprockets%2Ff43f31dd3e2d9f8eda108c01c42bd457 +0 -0
  167. data/test/dummy/tmp/cache/assets/D98/BF0/sprockets%2F132c8dc4d7ba67c8faee429e5064a02c +0 -0
  168. data/test/dummy/tmp/cache/assets/D9C/CD0/sprockets%2Fc85016e7bbd4f3adbb7635d01f85d39b +0 -0
  169. data/test/dummy/tmp/cache/assets/DB9/240/sprockets%2F689d916cf738bdb67e176fced176e3af +0 -0
  170. data/test/dummy/tmp/cache/assets/DBA/AB0/sprockets%2F8be4208fd77cb5ef9b6f77e5fcf18670 +0 -0
  171. data/test/dummy/tmp/cache/assets/DC5/450/sprockets%2F82d256faac73d9a3ec5c4f1d11be525d +0 -0
  172. data/test/dummy/tmp/cache/assets/DC6/890/sprockets%2F41b80fcec0c085408c41ecadc877df0f +0 -0
  173. data/test/dummy/tmp/cache/assets/DCE/890/sprockets%2Ffd6332ebff4dab12cdf448e195d6b381 +0 -0
  174. data/test/dummy/tmp/cache/assets/DD7/B50/sprockets%2F7effa89c4b23ab60109f969a9a66ccbc +0 -0
  175. data/test/dummy/tmp/cache/assets/DDE/420/sprockets%2Ffb8b186d5bf0307f86f65fc787d2adeb +0 -0
  176. data/test/dummy/tmp/cache/assets/DE7/7C0/sprockets%2F75aa5c034633c20d9c4d1bffbbbdc23d +0 -0
  177. data/test/dummy/tmp/cache/assets/DF0/680/sprockets%2F5e8210564bdda6fcef1fa19aa04b5e6a +0 -0
  178. data/test/dummy/tmp/cache/assets/DFB/0C0/sprockets%2Fd35f36529da4a7a4cf67cdbe0a3bf27e +0 -0
  179. data/test/dummy/tmp/cache/assets/DFF/4D0/sprockets%2F0d7eae306cc4e83ae549e96b1b6da8db +0 -0
  180. data/test/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
  181. data/test/dummy/tmp/cache/assets/E06/920/sprockets%2F6baa37d1c26468aef4fe5fe4bf982fa3 +0 -0
  182. data/test/dummy/tmp/cache/assets/E09/680/sprockets%2Fff9edf3a74399a0818b02efcff3ad0f7 +0 -0
  183. data/test/dummy/tmp/cache/assets/E0B/8B0/sprockets%2F35f64adcaf8786c81c0def5dd2ff47d3 +0 -0
  184. data/test/dummy/tmp/cache/assets/E2F/E90/sprockets%2Ff4b19e42c92a93dcaaec9fe6eae4081d +0 -0
  185. data/test/dummy/tmp/cache/sass/12aeefe9aeb071fe3d12ce952e92dfc373eac603/_base.css.scssc +0 -0
  186. data/test/dummy/tmp/cache/sass/12aeefe9aeb071fe3d12ce952e92dfc373eac603/_forms.css.scssc +0 -0
  187. data/test/dummy/tmp/cache/sass/12aeefe9aeb071fe3d12ce952e92dfc373eac603/_header.css.scssc +0 -0
  188. data/test/dummy/tmp/cache/sass/12aeefe9aeb071fe3d12ce952e92dfc373eac603/_mixins.css.scssc +0 -0
  189. data/test/dummy/tmp/cache/sass/12aeefe9aeb071fe3d12ce952e92dfc373eac603/_typography.css.scssc +0 -0
  190. data/test/dummy/tmp/cache/sass/4042a1944de48cf2066ee5650a418db4b1d7f0a1/_base.css.scssc +0 -0
  191. data/test/dummy/tmp/cache/sass/4042a1944de48cf2066ee5650a418db4b1d7f0a1/_forms.css.scssc +0 -0
  192. data/test/dummy/tmp/cache/sass/4042a1944de48cf2066ee5650a418db4b1d7f0a1/_header.css.scssc +0 -0
  193. data/test/dummy/tmp/cache/sass/4042a1944de48cf2066ee5650a418db4b1d7f0a1/_mixins.css.scssc +0 -0
  194. data/test/dummy/tmp/cache/sass/4042a1944de48cf2066ee5650a418db4b1d7f0a1/_typography.css.scssc +0 -0
  195. data/test/dummy/tmp/cache/sass/4905b1148d31ac1351d8ccf185fbd2494a596795/application.css.scssc +0 -0
  196. data/test/dummy/tmp/cache/sass/4f667cf792197ab0525ceee5448b803db81dab90/_comments.css.scssc +0 -0
  197. data/test/dummy/tmp/cache/sass/4f667cf792197ab0525ceee5448b803db81dab90/_date_picker.css.scssc +0 -0
  198. data/test/dummy/tmp/cache/sass/4f667cf792197ab0525ceee5448b803db81dab90/_flash_messages.css.scssc +0 -0
  199. data/test/dummy/tmp/cache/sass/4f667cf792197ab0525ceee5448b803db81dab90/_tables.css.scssc +0 -0
  200. data/test/dummy/tmp/cache/sass/76bbe61bc8118aa78e4db81878cf11d79a964373/_all.css.scssc +0 -0
  201. data/test/dummy/tmp/cache/sass/76bbe61bc8118aa78e4db81878cf11d79a964373/_buttons.css.scssc +0 -0
  202. data/test/dummy/tmp/cache/sass/76bbe61bc8118aa78e4db81878cf11d79a964373/_gradients.css.scssc +0 -0
  203. data/test/dummy/tmp/cache/sass/76bbe61bc8118aa78e4db81878cf11d79a964373/_icons.css.scssc +0 -0
  204. data/test/dummy/tmp/cache/sass/76bbe61bc8118aa78e4db81878cf11d79a964373/_reset.css.scssc +0 -0
  205. data/test/dummy/tmp/cache/sass/76bbe61bc8118aa78e4db81878cf11d79a964373/_rounded.css.scssc +0 -0
  206. data/test/dummy/tmp/cache/sass/76bbe61bc8118aa78e4db81878cf11d79a964373/_sections.css.scssc +0 -0
  207. data/test/dummy/tmp/cache/sass/76bbe61bc8118aa78e4db81878cf11d79a964373/_shadows.css.scssc +0 -0
  208. data/test/dummy/tmp/cache/sass/76bbe61bc8118aa78e4db81878cf11d79a964373/_utilities.scssc +0 -0
  209. data/test/dummy/tmp/cache/sass/76bbe61bc8118aa78e4db81878cf11d79a964373/_variables.css.scssc +0 -0
  210. data/test/dummy/tmp/cache/sass/9b29130c260e464c0ad2c23c77a58da7c3f9eec7/active_admin.css.scssc +0 -0
  211. data/test/dummy/tmp/cache/sass/dc62b2f303532e1c32e9571414568d9c2570f335/_all.css.scssc +0 -0
  212. data/test/dummy/tmp/cache/sass/dc62b2f303532e1c32e9571414568d9c2570f335/_buttons.css.scssc +0 -0
  213. data/test/dummy/tmp/cache/sass/dc62b2f303532e1c32e9571414568d9c2570f335/_gradients.css.scssc +0 -0
  214. data/test/dummy/tmp/cache/sass/dc62b2f303532e1c32e9571414568d9c2570f335/_icons.css.scssc +0 -0
  215. data/test/dummy/tmp/cache/sass/dc62b2f303532e1c32e9571414568d9c2570f335/_reset.css.scssc +0 -0
  216. data/test/dummy/tmp/cache/sass/dc62b2f303532e1c32e9571414568d9c2570f335/_rounded.css.scssc +0 -0
  217. data/test/dummy/tmp/cache/sass/dc62b2f303532e1c32e9571414568d9c2570f335/_sections.css.scssc +0 -0
  218. data/test/dummy/tmp/cache/sass/dc62b2f303532e1c32e9571414568d9c2570f335/_shadows.css.scssc +0 -0
  219. data/test/dummy/tmp/cache/sass/dc62b2f303532e1c32e9571414568d9c2570f335/_utilities.scssc +0 -0
  220. data/test/dummy/tmp/cache/sass/dc62b2f303532e1c32e9571414568d9c2570f335/_variables.css.scssc +0 -0
  221. data/test/dummy/tmp/cache/sass/ddba83cb438190ca32bf384b6eea0c3ef82ae9fa/reset.css.scssc +0 -0
  222. data/test/dummy/tmp/cache/sass/dde0527ffef9ea409c8e8afb2306d11f2e0b6500/_comments.css.scssc +0 -0
  223. data/test/dummy/tmp/cache/sass/dde0527ffef9ea409c8e8afb2306d11f2e0b6500/_date_picker.css.scssc +0 -0
  224. data/test/dummy/tmp/cache/sass/dde0527ffef9ea409c8e8afb2306d11f2e0b6500/_flash_messages.css.scssc +0 -0
  225. data/test/dummy/tmp/cache/sass/dde0527ffef9ea409c8e8afb2306d11f2e0b6500/_tables.css.scssc +0 -0
  226. data/test/fixtures/rich/rich_images.yml +11 -0
  227. data/test/functional/rich/files_controller_test.rb +9 -0
  228. data/test/integration/navigation_test.rb +10 -0
  229. data/test/rich_test.rb +7 -0
  230. data/test/test_helper.rb +10 -0
  231. data/test/unit/helpers/rich/files_helper_test.rb +6 -0
  232. data/test/unit/rich/rich_image_test.rb +9 -0
  233. metadata +603 -0
@@ -0,0 +1,20 @@
1
+ /*
2
+ This file defines the default set of CSS styles available in the Rich editor
3
+ */
4
+
5
+ p.caption {
6
+ font-style: italic;
7
+ color: grey;
8
+ }
9
+
10
+ span.highlight {
11
+ background: yellow;
12
+ }
13
+
14
+ img.left {
15
+ float: left;
16
+ }
17
+
18
+ img.right {
19
+ float: right;
20
+ }
@@ -0,0 +1,4 @@
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
@@ -0,0 +1,58 @@
1
+ article, aside, details, figcaption, figure, footer, header, hgroup, nav, section { display: block; }
2
+ audio, canvas, video { display: inline-block; *display: inline; *zoom: 1; }
3
+ audio:not([controls]) { display: none; }
4
+ [hidden] { display: none; }
5
+
6
+ html { font-size: 100%; overflow-y: scroll; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; }
7
+ body { margin: 0; font-size: 13px; line-height: 1.231; }
8
+ body, button, input, select, textarea { font-family: sans-serif; color: #222; }
9
+
10
+ ::-moz-selection { background: #fe57a1; color: #fff; text-shadow: none; }
11
+ ::selection { background: #fe57a1; color: #fff; text-shadow: none; }
12
+
13
+ a { color: #00e; }
14
+ a:visited { color: #551a8b; }
15
+ a:hover { color: #06e; }
16
+ a:focus { outline: thin dotted; }
17
+ a:hover, a:active { outline: 0; }
18
+
19
+ abbr[title] { border-bottom: 1px dotted; }
20
+ b, strong { font-weight: bold; }
21
+ blockquote { margin: 1em 40px; }
22
+ dfn { font-style: italic; }
23
+ hr { display: block; height: 1px; border: 0; border-top: 1px solid #ccc; margin: 1em 0; padding: 0; }
24
+ ins { background: #ff9; color: #000; text-decoration: none; }
25
+ mark { background: #ff0; color: #000; font-style: italic; font-weight: bold; }
26
+ pre, code, kbd, samp { font-family: monospace, monospace; _font-family: 'courier new', monospace; font-size: 1em; }
27
+ pre { white-space: pre; white-space: pre-wrap; word-wrap: break-word; }
28
+ q { quotes: none; }
29
+ q:before, q:after { content: ""; content: none; }
30
+ small { font-size: 85%; }
31
+ sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }
32
+ sup { top: -0.5em; }
33
+ sub { bottom: -0.25em; }
34
+ ul, ol { margin: 1em 0; padding: 0 0 0 40px; }
35
+ dd { margin: 0 0 0 40px; }
36
+ nav ul, nav ol { list-style: none; list-style-image: none; margin: 0; padding: 0; }
37
+ img { border: 0; -ms-interpolation-mode: bicubic; vertical-align: middle; }
38
+ svg:not(:root) { overflow: hidden; }
39
+ figure { margin: 0; }
40
+
41
+ form { margin: 0; }
42
+ fieldset { border: 0; margin: 0; padding: 0; }
43
+ label { cursor: pointer; }
44
+ legend { border: 0; *margin-left: -7px; padding: 0; }
45
+ button, input, select, textarea { font-size: 100%; margin: 0; vertical-align: baseline; *vertical-align: middle; }
46
+ button, input { line-height: normal; *overflow: visible; }
47
+ table button, table input { *overflow: auto; }
48
+ button, input[type="button"], input[type="reset"], input[type="submit"] { cursor: pointer; -webkit-appearance: button; }
49
+ input[type="checkbox"], input[type="radio"] { box-sizing: border-box; }
50
+ input[type="search"] { -webkit-appearance: textfield; -moz-box-sizing: content-box; -webkit-box-sizing: content-box; box-sizing: content-box; }
51
+ input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; }
52
+ button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; }
53
+ textarea { overflow: auto; vertical-align: top; resize: vertical; }
54
+ input:valid, textarea:valid { }
55
+ input:invalid, textarea:invalid { background-color: #f0dddd; }
56
+
57
+ table { border-collapse: collapse; border-spacing: 0; }
58
+ td { vertical-align: top; }
@@ -0,0 +1,11 @@
1
+ module Rich
2
+ class ApplicationController < ActionController::Base
3
+
4
+ before_filter :authenticate_rich_user
5
+
6
+ def authenticate_rich_user
7
+ send(Rich.authentication_method) unless Rich.authentication_method == :none
8
+ end
9
+
10
+ end
11
+ end
@@ -0,0 +1,107 @@
1
+ require 'mime/types'
2
+
3
+ module Rich
4
+ class FilesController < ApplicationController
5
+
6
+ def index
7
+ # filter for allowed styles, default to all available
8
+
9
+ #logger.debug("#{Rich.allowed_styles.inspect}")
10
+
11
+ if (Rich.allowed_styles == :all)
12
+ @styles = Rich.image_styles.keys
13
+ @styles.push(:original)
14
+ else
15
+ @styles = Rich.allowed_styles
16
+ end
17
+
18
+ @default_style = Rich.default_style
19
+
20
+ # list all files
21
+ @images = RichImage.all(:order => "created_at DESC")
22
+
23
+ # stub for new file
24
+ @rich_image = RichImage.new
25
+ end
26
+
27
+ def show
28
+ # show is used to retrieve single images through XHR requests after an image has been uploaded
29
+
30
+ if(params[:id])
31
+ # list all files
32
+ @file = RichImage.find(params[:id])
33
+ render :layout => false
34
+ else
35
+ render :text => "Image not found"
36
+ end
37
+
38
+ end
39
+
40
+ def create
41
+ #render :json => { :success => false, :error => "File is too large..." }
42
+ #render :json => { :success => true, :rich_id => 1 }
43
+
44
+ @file = RichImage.new
45
+
46
+
47
+
48
+
49
+ # use the file from Rack Raw Upload
50
+ if(params[:file])
51
+ # Rack Raw Upload always passes octet/stream, so we need to figure it out ourselves.
52
+ params[:file].content_type = MIME::Types.type_for(params[:file].original_filename)
53
+
54
+ @file.image = params[:file]
55
+ end
56
+
57
+ logger.debug("DIT IS HEM >> #{params[:file].inspect}")
58
+
59
+ if @file.save
60
+ render :json => { :success => true, :rich_id => @file.id }
61
+ else
62
+ render :json => { :success => false,
63
+ :error => "Could not upload your file:\n- "+@file.errors.to_a[-1].to_s,
64
+ :params => params.inspect }
65
+
66
+ # :error => "Could not upload your file:\n"+@file.errors.map {
67
+ # |k,v|
68
+ # "- "+v+"\n"
69
+ # }.to_s,
70
+ #
71
+
72
+ end
73
+
74
+ # if @article.save
75
+ # if is_qq
76
+ # render :json => { "success" => true }
77
+ # else
78
+ # # as before, likely:
79
+ # # redirect_to(articles_path, :notice => "Article was successfully created.")
80
+ # end
81
+ # else
82
+ # if is_qq
83
+ # render :json => { "error" => @article.errors }
84
+ # else
85
+ # # as before, likely:
86
+ # # render :action => :new
87
+ # end
88
+ # end
89
+
90
+ # @rich_image = RichImage.new(params[:rich_image])
91
+ # if @rich_image.save
92
+ # flash[:notice] = "Successfully created image."
93
+ # redirect_to :action => 'index'
94
+ # else
95
+ # redirect_to :action => 'index'
96
+ # end
97
+ end
98
+
99
+ def destroy
100
+ if(params[:id])
101
+ image = RichImage.delete(params[:id])
102
+ @fileid = params[:id]
103
+ end
104
+ end
105
+
106
+ end
107
+ end
@@ -0,0 +1,4 @@
1
+ module Rich
2
+ module ApplicationHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Rich
2
+ module FilesHelper
3
+ end
4
+ end
@@ -0,0 +1,14 @@
1
+ class RichInput < ::Formtastic::Inputs::TextInput
2
+ def to_html
3
+ editor_options = Rich.editor.merge(options[:editor] || {})
4
+ editor_options[:width] = options[:width] || '76%'
5
+ editor_options[:height] = options[:height] || '200px'
6
+
7
+ input_wrapping do
8
+ label_html <<
9
+ builder.text_area(method, input_html_options) <<
10
+ #javascript_tag("$(function(){$('##{dom_id}').ckeditor(function() { }, #{editor_options.to_json} );});")
11
+ "<script>$(function(){$('##{dom_id}').ckeditor(function() { }, #{editor_options.to_json} );});</script>".html_safe
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,77 @@
1
+ require 'cgi'
2
+
3
+ module Rich
4
+ class RichImage < ActiveRecord::Base
5
+
6
+ #has_attached_file :image, :styles => { :thumb => "100x100#", :large => "1000x1000"}
7
+ has_attached_file :image
8
+
9
+ validates_attachment_presence :image
10
+ validates_attachment_content_type :image, :content_type=>['image/jpeg', 'image/png', 'image/gif', 'image/jpg'], :message => "is not an image"
11
+ validates_attachment_size :image, :less_than=>15.megabyte, :message => "must be smaller than 15MB"
12
+
13
+ after_initialize :init_styles
14
+
15
+ before_create :transliterate_file_name
16
+
17
+ def style_uris
18
+ uris = {}
19
+
20
+ image.styles.each do |style|
21
+ uris[style[0]] = image.url(style[0].to_sym)
22
+ end
23
+
24
+ # manualy add the original size
25
+ uris["original"] = image.url(:original)
26
+
27
+ uris.to_json
28
+ end
29
+
30
+ def init_styles
31
+ self.class.has_attached_file :image,
32
+ :styles => hash = Rich.image_styles
33
+ end
34
+
35
+ def transliterate(str)
36
+ # Based on permalink_fu by Rick Olsen
37
+
38
+ # Escape str by transliterating to UTF-8 with Iconv
39
+ s = Iconv.iconv('ascii//ignore//translit', 'utf-8', str).to_s
40
+
41
+ # Downcase string
42
+ s.downcase!
43
+
44
+ # Remove apostrophes so isn't changes to isnt
45
+ s.gsub!(/'/, '')
46
+
47
+ # Replace any non-letter or non-number character with a space
48
+ s.gsub!(/[^A-Za-z0-9]+/, ' ')
49
+
50
+ # Remove spaces from beginning and end of string
51
+ s.strip!
52
+
53
+ # Replace groups of spaces with single hyphen
54
+ s.gsub!(/\ +/, '-')
55
+
56
+ return s
57
+ end
58
+
59
+
60
+ private
61
+
62
+ def transliterate_file_name
63
+ extension = File.extname(image_file_name).gsub(/^\.+/, '')
64
+ filename = image_file_name.gsub(/\.#{extension}$/, '')
65
+
66
+ filename = CGI::unescape(filename)
67
+ filename = CGI::unescape(filename)
68
+
69
+ # TODO: remove %20 stuff from filename
70
+ # CGI::unescape("%27Stop%21%27+said+Fred")
71
+
72
+ self.image.instance_write(:file_name, "#{self.transliterate(filename)}.#{self.transliterate(extension)}")
73
+ end
74
+
75
+
76
+ end
77
+ end
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Rich</title>
5
+ <%= stylesheet_link_tag "rich/application" %>
6
+ <%= javascript_include_tag "rich/application" %>
7
+ <%= csrf_meta_tags %>
8
+ </head>
9
+ <body>
10
+
11
+ <%= yield %>
12
+
13
+ </body>
14
+ </html>
@@ -0,0 +1,9 @@
1
+ <li class="clickable">
2
+ <img id="image<%= file.id %>"
3
+ src="<%= file.image.url(:thumb) %>"
4
+ data-uris="<%= file.style_uris %>"
5
+ data-rich-image-id="<%= file.id %>"
6
+ />
7
+ <p><%= file.image.original_filename %></p>
8
+ <%= link_to "delete", "/rich/files/"+file.id.to_s, :method => :delete, :remote => true, :confirm => "Are you sure you want to delete this image?", :class => "delete", :title => "Delete this image" %>
9
+ </li>
@@ -0,0 +1 @@
1
+ $("#image<%= @fileid %>").parent().remove();
@@ -0,0 +1,29 @@
1
+ <header>
2
+ <ul id="styles" class="scopes" data-default-style="<%= @default_style %>">
3
+ <li class="label">Image style to insert</li>
4
+ <% for style in @styles %>
5
+ <li class="scope" id="style-<%= style %>" data-rich-style="<%= style %>"><%= style %></li>
6
+ <% end %>
7
+ </ul>
8
+ </header>
9
+
10
+ <div id="legacy-form"><%= form_for(@rich_image, :url => files_path) do |f| %>
11
+ <p><%= f.file_field :image%></p>
12
+ <%= f.submit("Upload") %>
13
+ <% end %>
14
+ </div>
15
+
16
+ <ul id="images">
17
+
18
+ <li id="uploadBlock">
19
+ <div id="upload" class="qq-upload-button placeholder">
20
+ <div class="spinner"></div>
21
+ </div>
22
+ <p>Upload an image</p>
23
+ </li>
24
+
25
+ <% for file in @images %>
26
+ <%= render :partial => 'image', :locals => {:file => file} %>
27
+ <% end %>
28
+
29
+ </ul>
@@ -0,0 +1 @@
1
+ <%= render :partial => 'image', :locals => {:file => @file} %>
data/config/routes.rb ADDED
@@ -0,0 +1,5 @@
1
+ Rich::Engine.routes.draw do
2
+
3
+ resources :files, :controller => "files"
4
+
5
+ end
@@ -0,0 +1,17 @@
1
+ class CreateRichRichImages < ActiveRecord::Migration
2
+ def change
3
+ create_table :rich_rich_images do |t|
4
+
5
+ t.timestamps
6
+
7
+ t.string :image_file_name
8
+ t.string :image_content_type
9
+ t.integer :image_file_size
10
+ t.datetime :image_updated_at
11
+
12
+ t.string :owner_type
13
+ t.integer :owner_id
14
+
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,34 @@
1
+ require 'rails/generators'
2
+ module Rich
3
+ module Generators
4
+ class InstallGenerator < Rails::Generators::Base
5
+
6
+ desc "Installs Rich into your app. Get wealthy."
7
+
8
+ def self.source_root
9
+ @source_root ||= File.join(File.dirname(__FILE__), 'templates')
10
+ end
11
+
12
+ def copy_initializer
13
+ template 'rich.rb.erb', 'config/initializers/rich.rb'
14
+ end
15
+
16
+ def setup_route
17
+ route "mount Rich::Engine => '/rich'"
18
+ end
19
+
20
+ def install_editor_styles
21
+ copy_file '../../../../../app/assets/stylesheets/rich/editor.css', 'app/assets/stylesheets/rich/editor.css'
22
+ end
23
+
24
+ def install_javascript
25
+ template 'rich.js', 'app/assets/javascripts/rich.js'
26
+ end
27
+
28
+ def create_migrations
29
+ rake "rich:install:migrations"
30
+ end
31
+
32
+ end
33
+ end
34
+ end
@@ -0,0 +1 @@
1
+ //=require rich/base
@@ -0,0 +1,69 @@
1
+ require "rich"
2
+
3
+ if Object.const_defined?("Rich")
4
+ Rich.setup do |config|
5
+
6
+ # == CKEditor configuration
7
+ #
8
+ # Rich ships with what I hope are sensible defaults.
9
+ # You may want to override these. This is how.
10
+ #
11
+ # For example, the elements available in the formats
12
+ # dropdown are defined like this:
13
+ # config.editor[:formats] = ""
14
+ #
15
+ # By default, Rich visualizes what type of element
16
+ # you are editing. To disable this:
17
+ # config.editor[:startupOutlineBlocks] = false
18
+
19
+
20
+ # == Image styles
21
+ #
22
+ # Rich uses paperclip for image processing. You can
23
+ # define the styles you would like to use here. You
24
+ # can use the standard syntax allowed by paperclip.
25
+ # See: https://github.com/thoughtbot/paperclip/wiki/Thumbnail-Generation
26
+ #
27
+ # When you change these after uploading some files,
28
+ # remember to do let Paperclip re-generate these by running
29
+ # rake paperclip:refresh CLASS=Rich::RichImage
30
+ config.image_styles = {
31
+ :thumb => "100x100#"
32
+ }
33
+
34
+ # == Allowed styles (in file manager)
35
+ #
36
+ # Of the styles specified above, which should be user
37
+ # selectable in the file manager?
38
+ #
39
+ # Example:
40
+ # config.allowed_styles = [ :large, :thumb ]
41
+ #
42
+ # Default:
43
+ # config.allowed_styles = :all
44
+
45
+ # == Default Style
46
+ #
47
+ # The style to insert by default. In addition to the
48
+ # styles defined above you can also use :original to get
49
+ # the unprocessed file. Make sure this style exists.
50
+ config.default_style = :thumb
51
+
52
+ # == User Authentication
53
+ #
54
+ # When defined, Rich will automatically call this method
55
+ # in a before filter to ensure that the user is logged in.
56
+ #
57
+ # If you do not change this value from the default, anyone
58
+ # will be able to see your images, and upload files.
59
+ #
60
+ # Example for Devise with an AdminUser model:
61
+ # config.authentication_method = :authenticate_admin_user!
62
+ #
63
+ # Default (NOT recommended in production environments):
64
+ # config.authentication_method = :none
65
+
66
+ end
67
+
68
+ Rich.insert
69
+ end