lady_josephine 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (304) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/Rakefile +32 -0
  4. data/app/assets/fonts/lady_josephine/icons/icons.eot +0 -0
  5. data/app/assets/fonts/lady_josephine/icons/icons.svg +215 -0
  6. data/app/assets/fonts/lady_josephine/icons/icons.ttf +0 -0
  7. data/app/assets/fonts/lady_josephine/icons/icons.woff +0 -0
  8. data/app/assets/javascripts/lady_josephine/blocks/facebook.js +25 -0
  9. data/app/assets/javascripts/lady_josephine/blocks/instagram.js +22 -0
  10. data/app/assets/javascripts/lady_josephine/blocks/soundcloud.js +24 -0
  11. data/app/assets/javascripts/lady_josephine/blocks/twitter.js +25 -0
  12. data/app/assets/javascripts/lady_josephine/blocks/vimeo.js +55 -0
  13. data/app/assets/javascripts/lady_josephine/blocks/youtube.js +64 -0
  14. data/app/assets/javascripts/lady_josephine/editor.js +40 -0
  15. data/app/assets/javascripts/lady_josephine/lady_josephine.js +4 -0
  16. data/app/assets/javascripts/lady_josephine/lady_josephine_view.js +6 -0
  17. data/app/assets/stylesheets/lady_josephine/content.sass +33 -0
  18. data/app/assets/stylesheets/lady_josephine/icons.sass +175 -0
  19. data/app/assets/stylesheets/lady_josephine/lady_josephine.sass +6 -0
  20. data/app/assets/stylesheets/lady_josephine/sir_trevor.sass +619 -0
  21. data/app/assets/stylesheets/lady_josephine/vars.sass +36 -0
  22. data/app/controllers/lady_josephine/application_controller.rb +4 -0
  23. data/app/controllers/lady_josephine/editor_controller.rb +40 -0
  24. data/app/controllers/lady_josephine/images_controller.rb +26 -0
  25. data/app/helpers/lady_josephine/helper.rb +25 -0
  26. data/app/helpers/lady_josephine/sir_trevor_helper.rb +172 -0
  27. data/app/models/lady_josephine/concerns/model.rb +29 -0
  28. data/app/models/lady_josephine/concerns/pingable.rb +28 -0
  29. data/app/models/lady_josephine/concerns/server_uuid.rb +24 -0
  30. data/app/models/lady_josephine/concerns/sir_trevor_images.rb +38 -0
  31. data/app/models/lady_josephine/image.rb +41 -0
  32. data/app/uploader/lady_josephine/base_uploader.rb +47 -0
  33. data/app/uploader/lady_josephine/image_uploader.rb +149 -0
  34. data/app/views/lady_josephine/blocks/_audio_block.haml +2 -0
  35. data/app/views/lady_josephine/blocks/_definition_block.haml +4 -0
  36. data/app/views/lady_josephine/blocks/_divider_block.haml +2 -0
  37. data/app/views/lady_josephine/blocks/_extended_image_block.haml +63 -0
  38. data/app/views/lady_josephine/blocks/_extended_quote_block.haml +5 -0
  39. data/app/views/lady_josephine/blocks/_extended_tweet_block.haml +2 -0
  40. data/app/views/lady_josephine/blocks/_facebook_post_block.haml +2 -0
  41. data/app/views/lady_josephine/blocks/_heading_block.haml +2 -0
  42. data/app/views/lady_josephine/blocks/_html_block.haml +1 -0
  43. data/app/views/lady_josephine/blocks/_instagram_block.haml +2 -0
  44. data/app/views/lady_josephine/blocks/_list_block.haml +3 -0
  45. data/app/views/lady_josephine/blocks/_quote_block.haml +5 -0
  46. data/app/views/lady_josephine/blocks/_text_block.html.haml +2 -0
  47. data/app/views/lady_josephine/blocks/_video_block.haml +9 -0
  48. data/config/routes.rb +9 -0
  49. data/db/migrate/20160222151500_lady_josephine_image.rb +18 -0
  50. data/lib/generators/lady_josephine_migration/USAGE +9 -0
  51. data/lib/generators/lady_josephine_migration/lady_josephine_migration_generator.rb +17 -0
  52. data/lib/generators/lady_josephine_migration/templates/migration.rb +9 -0
  53. data/lib/lady_josephine.rb +18 -0
  54. data/lib/lady_josephine/engine.rb +18 -0
  55. data/lib/lady_josephine/redcarpet/custom_markdown_formatter.rb +63 -0
  56. data/lib/lady_josephine/renderer/sir_trevor_renderer.rb +16 -0
  57. data/lib/lady_josephine/version.rb +3 -0
  58. data/lib/lady_josephine/whitelist.rb +26 -0
  59. data/lib/tasks/lady_josephine_tasks.rake +4 -0
  60. data/spec/controllers/lady_josephine/editor_controller_spec.rb +58 -0
  61. data/spec/dummy/README.rdoc +28 -0
  62. data/spec/dummy/Rakefile +6 -0
  63. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  64. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  65. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  66. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  67. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  68. data/spec/dummy/bin/bundle +3 -0
  69. data/spec/dummy/bin/rails +4 -0
  70. data/spec/dummy/bin/rake +4 -0
  71. data/spec/dummy/bin/setup +29 -0
  72. data/spec/dummy/config.ru +4 -0
  73. data/spec/dummy/config/application.rb +26 -0
  74. data/spec/dummy/config/boot.rb +5 -0
  75. data/spec/dummy/config/database.yml +25 -0
  76. data/spec/dummy/config/environment.rb +5 -0
  77. data/spec/dummy/config/environments/development.rb +41 -0
  78. data/spec/dummy/config/environments/production.rb +79 -0
  79. data/spec/dummy/config/environments/test.rb +42 -0
  80. data/spec/dummy/config/initializers/assets.rb +11 -0
  81. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  82. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  83. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  84. data/spec/dummy/config/initializers/inflections.rb +16 -0
  85. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  86. data/spec/dummy/config/initializers/session_store.rb +3 -0
  87. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  88. data/spec/dummy/config/locales/en.yml +23 -0
  89. data/spec/dummy/config/routes.rb +4 -0
  90. data/spec/dummy/config/secrets.yml +22 -0
  91. data/spec/dummy/db/development.sqlite3 +0 -0
  92. data/spec/dummy/db/schema.rb +16 -0
  93. data/spec/dummy/db/test.sqlite3 +0 -0
  94. data/spec/dummy/log/bla +0 -0
  95. data/spec/dummy/public/404.html +67 -0
  96. data/spec/dummy/public/422.html +67 -0
  97. data/spec/dummy/public/500.html +66 -0
  98. data/spec/dummy/public/favicon.ico +0 -0
  99. data/spec/spec_helper.rb +17 -0
  100. data/vendor/assets/components/Eventable/README.md +12 -0
  101. data/vendor/assets/components/Eventable/bower.json +10 -0
  102. data/vendor/assets/components/Eventable/component.json +11 -0
  103. data/vendor/assets/components/Eventable/eventable.js +207 -0
  104. data/vendor/assets/components/Eventable/package.json +15 -0
  105. data/vendor/assets/components/jquery-autosize/bower.json +30 -0
  106. data/vendor/assets/components/jquery-autosize/demo.html +36 -0
  107. data/vendor/assets/components/jquery-autosize/jquery.autosize.js +273 -0
  108. data/vendor/assets/components/jquery-autosize/jquery.autosize.min.js +6 -0
  109. data/vendor/assets/components/jquery-autosize/package.json +32 -0
  110. data/vendor/assets/components/jquery-autosize/readme.md +216 -0
  111. data/vendor/assets/components/jquery/AUTHORS.txt +163 -0
  112. data/vendor/assets/components/jquery/CONTRIBUTING.md +216 -0
  113. data/vendor/assets/components/jquery/Gruntfile.js +496 -0
  114. data/vendor/assets/components/jquery/MIT-LICENSE.txt +21 -0
  115. data/vendor/assets/components/jquery/README.md +415 -0
  116. data/vendor/assets/components/jquery/build/release-notes.js +59 -0
  117. data/vendor/assets/components/jquery/build/release.js +246 -0
  118. data/vendor/assets/components/jquery/component.json +13 -0
  119. data/vendor/assets/components/jquery/composer.json +35 -0
  120. data/vendor/assets/components/jquery/jquery-migrate.js +496 -0
  121. data/vendor/assets/components/jquery/jquery-migrate.min.js +3 -0
  122. data/vendor/assets/components/jquery/jquery.js +9597 -0
  123. data/vendor/assets/components/jquery/jquery.min.js +5 -0
  124. data/vendor/assets/components/jquery/jquery.min.map +1 -0
  125. data/vendor/assets/components/jquery/package.json +39 -0
  126. data/vendor/assets/components/jquery/speed/benchmark.js +15 -0
  127. data/vendor/assets/components/jquery/speed/benchmarker.css +65 -0
  128. data/vendor/assets/components/jquery/speed/benchmarker.js +181 -0
  129. data/vendor/assets/components/jquery/speed/closest.html +39 -0
  130. data/vendor/assets/components/jquery/speed/css.html +82 -0
  131. data/vendor/assets/components/jquery/speed/event.html +58 -0
  132. data/vendor/assets/components/jquery/speed/filter.html +183 -0
  133. data/vendor/assets/components/jquery/speed/find.html +179 -0
  134. data/vendor/assets/components/jquery/speed/index.html +72 -0
  135. data/vendor/assets/components/jquery/speed/jquery-basis.js +6238 -0
  136. data/vendor/assets/components/jquery/speed/slice.vs.concat.html +47 -0
  137. data/vendor/assets/components/jquery/src/ajax.js +851 -0
  138. data/vendor/assets/components/jquery/src/ajax/jsonp.js +80 -0
  139. data/vendor/assets/components/jquery/src/ajax/script.js +86 -0
  140. data/vendor/assets/components/jquery/src/ajax/xhr.js +207 -0
  141. data/vendor/assets/components/jquery/src/attributes.js +661 -0
  142. data/vendor/assets/components/jquery/src/callbacks.js +196 -0
  143. data/vendor/assets/components/jquery/src/core.js +949 -0
  144. data/vendor/assets/components/jquery/src/css.js +679 -0
  145. data/vendor/assets/components/jquery/src/data.js +340 -0
  146. data/vendor/assets/components/jquery/src/deferred.js +141 -0
  147. data/vendor/assets/components/jquery/src/deprecated.js +4 -0
  148. data/vendor/assets/components/jquery/src/dimensions.js +41 -0
  149. data/vendor/assets/components/jquery/src/effects.js +730 -0
  150. data/vendor/assets/components/jquery/src/event-alias.js +15 -0
  151. data/vendor/assets/components/jquery/src/event.js +991 -0
  152. data/vendor/assets/components/jquery/src/exports.js +18 -0
  153. data/vendor/assets/components/jquery/src/intro.js +20 -0
  154. data/vendor/assets/components/jquery/src/manipulation.js +796 -0
  155. data/vendor/assets/components/jquery/src/offset.js +169 -0
  156. data/vendor/assets/components/jquery/src/outro.js +2 -0
  157. data/vendor/assets/components/jquery/src/queue.js +147 -0
  158. data/vendor/assets/components/jquery/src/serialize.js +99 -0
  159. data/vendor/assets/components/jquery/src/sizzle-jquery.js +9 -0
  160. data/vendor/assets/components/jquery/src/support.js +241 -0
  161. data/vendor/assets/components/jquery/src/traversing.js +275 -0
  162. data/vendor/assets/components/jquery/test/csp.php +16 -0
  163. data/vendor/assets/components/jquery/test/data/1x1.jpg +0 -0
  164. data/vendor/assets/components/jquery/test/data/ajax/unreleasedXHR.html +25 -0
  165. data/vendor/assets/components/jquery/test/data/atom+xml.php +4 -0
  166. data/vendor/assets/components/jquery/test/data/badcall.js +1 -0
  167. data/vendor/assets/components/jquery/test/data/badjson.js +1 -0
  168. data/vendor/assets/components/jquery/test/data/cleanScript.html +10 -0
  169. data/vendor/assets/components/jquery/test/data/core/cc_on.html +22 -0
  170. data/vendor/assets/components/jquery/test/data/dashboard.xml +11 -0
  171. data/vendor/assets/components/jquery/test/data/dimensions/documentLarge.html +17 -0
  172. data/vendor/assets/components/jquery/test/data/dimensions/documentSmall.html +21 -0
  173. data/vendor/assets/components/jquery/test/data/echoData.php +1 -0
  174. data/vendor/assets/components/jquery/test/data/echoQuery.php +1 -0
  175. data/vendor/assets/components/jquery/test/data/errorWithText.php +5 -0
  176. data/vendor/assets/components/jquery/test/data/etag.php +21 -0
  177. data/vendor/assets/components/jquery/test/data/evalScript.php +1 -0
  178. data/vendor/assets/components/jquery/test/data/event/longLoadScript.php +4 -0
  179. data/vendor/assets/components/jquery/test/data/event/promiseReady.html +17 -0
  180. data/vendor/assets/components/jquery/test/data/event/syncReady.html +23 -0
  181. data/vendor/assets/components/jquery/test/data/headers.php +18 -0
  182. data/vendor/assets/components/jquery/test/data/if_modified_since.php +20 -0
  183. data/vendor/assets/components/jquery/test/data/iframe.html +8 -0
  184. data/vendor/assets/components/jquery/test/data/jquery-1.8.2.ajax_xhr.min.js +2 -0
  185. data/vendor/assets/components/jquery/test/data/json.php +13 -0
  186. data/vendor/assets/components/jquery/test/data/json_obj.js +1 -0
  187. data/vendor/assets/components/jquery/test/data/jsonp.php +14 -0
  188. data/vendor/assets/components/jquery/test/data/manipulation/iframe-denied.html +36 -0
  189. data/vendor/assets/components/jquery/test/data/name.html +1 -0
  190. data/vendor/assets/components/jquery/test/data/name.php +24 -0
  191. data/vendor/assets/components/jquery/test/data/nocontent.php +5 -0
  192. data/vendor/assets/components/jquery/test/data/offset/absolute.html +41 -0
  193. data/vendor/assets/components/jquery/test/data/offset/body.html +26 -0
  194. data/vendor/assets/components/jquery/test/data/offset/fixed.html +34 -0
  195. data/vendor/assets/components/jquery/test/data/offset/relative.html +31 -0
  196. data/vendor/assets/components/jquery/test/data/offset/scroll.html +39 -0
  197. data/vendor/assets/components/jquery/test/data/offset/static.html +31 -0
  198. data/vendor/assets/components/jquery/test/data/offset/table.html +43 -0
  199. data/vendor/assets/components/jquery/test/data/params_html.php +12 -0
  200. data/vendor/assets/components/jquery/test/data/readywaitasset.js +1 -0
  201. data/vendor/assets/components/jquery/test/data/readywaitloader.js +25 -0
  202. data/vendor/assets/components/jquery/test/data/script.php +11 -0
  203. data/vendor/assets/components/jquery/test/data/selector/html5_selector.html +114 -0
  204. data/vendor/assets/components/jquery/test/data/selector/sizzle_cache.html +21 -0
  205. data/vendor/assets/components/jquery/test/data/statusText.php +5 -0
  206. data/vendor/assets/components/jquery/test/data/support/bodyBackground.html +28 -0
  207. data/vendor/assets/components/jquery/test/data/support/shrinkWrapBlocks.html +23 -0
  208. data/vendor/assets/components/jquery/test/data/support/testElementCrash.html +17 -0
  209. data/vendor/assets/components/jquery/test/data/test.html +7 -0
  210. data/vendor/assets/components/jquery/test/data/test.js +3 -0
  211. data/vendor/assets/components/jquery/test/data/test.php +7 -0
  212. data/vendor/assets/components/jquery/test/data/test2.html +5 -0
  213. data/vendor/assets/components/jquery/test/data/test3.html +3 -0
  214. data/vendor/assets/components/jquery/test/data/testinit.js +269 -0
  215. data/vendor/assets/components/jquery/test/data/testrunner.js +368 -0
  216. data/vendor/assets/components/jquery/test/data/testsuite.css +155 -0
  217. data/vendor/assets/components/jquery/test/data/text.php +12 -0
  218. data/vendor/assets/components/jquery/test/data/ua.txt +272 -0
  219. data/vendor/assets/components/jquery/test/data/with_fries.xml +25 -0
  220. data/vendor/assets/components/jquery/test/data/with_fries_over_jsonp.php +7 -0
  221. data/vendor/assets/components/jquery/test/delegatetest.html +228 -0
  222. data/vendor/assets/components/jquery/test/hovertest.html +158 -0
  223. data/vendor/assets/components/jquery/test/index.html +330 -0
  224. data/vendor/assets/components/jquery/test/localfile.html +75 -0
  225. data/vendor/assets/components/jquery/test/networkerror.html +84 -0
  226. data/vendor/assets/components/jquery/test/polluted.php +110 -0
  227. data/vendor/assets/components/jquery/test/readywait.html +70 -0
  228. data/vendor/assets/components/jquery/test/unit/ajax.js +1971 -0
  229. data/vendor/assets/components/jquery/test/unit/attributes.js +1332 -0
  230. data/vendor/assets/components/jquery/test/unit/callbacks.js +326 -0
  231. data/vendor/assets/components/jquery/test/unit/core.js +1332 -0
  232. data/vendor/assets/components/jquery/test/unit/css.js +1036 -0
  233. data/vendor/assets/components/jquery/test/unit/data.js +636 -0
  234. data/vendor/assets/components/jquery/test/unit/deferred.js +440 -0
  235. data/vendor/assets/components/jquery/test/unit/deprecated.js +1 -0
  236. data/vendor/assets/components/jquery/test/unit/dimensions.js +461 -0
  237. data/vendor/assets/components/jquery/test/unit/effects.js +2050 -0
  238. data/vendor/assets/components/jquery/test/unit/event.js +2690 -0
  239. data/vendor/assets/components/jquery/test/unit/exports.js +7 -0
  240. data/vendor/assets/components/jquery/test/unit/manipulation.js +2242 -0
  241. data/vendor/assets/components/jquery/test/unit/offset.js +549 -0
  242. data/vendor/assets/components/jquery/test/unit/queue.js +316 -0
  243. data/vendor/assets/components/jquery/test/unit/selector.js +185 -0
  244. data/vendor/assets/components/jquery/test/unit/serialize.js +146 -0
  245. data/vendor/assets/components/jquery/test/unit/support.js +384 -0
  246. data/vendor/assets/components/jquery/test/unit/traversing.js +667 -0
  247. data/vendor/assets/components/jquery/test/xhtml.php +5 -0
  248. data/vendor/assets/components/sir-trevor-js/CHANGELOG.md +44 -0
  249. data/vendor/assets/components/sir-trevor-js/Gemfile +3 -0
  250. data/vendor/assets/components/sir-trevor-js/Gemfile.lock +10 -0
  251. data/vendor/assets/components/sir-trevor-js/Gruntfile.js +109 -0
  252. data/vendor/assets/components/sir-trevor-js/MIT-LICENCE +20 -0
  253. data/vendor/assets/components/sir-trevor-js/Readme.md +84 -0
  254. data/vendor/assets/components/sir-trevor-js/bower.json +21 -0
  255. data/vendor/assets/components/sir-trevor-js/component.json +42 -0
  256. data/vendor/assets/components/sir-trevor-js/contributing.md +74 -0
  257. data/vendor/assets/components/sir-trevor-js/examples-component/component.json +14 -0
  258. data/vendor/assets/components/sir-trevor-js/examples-component/index.html +33 -0
  259. data/vendor/assets/components/sir-trevor-js/examples-component/index.js +29 -0
  260. data/vendor/assets/components/sir-trevor-js/examples-component/javascript/example_block.js +203 -0
  261. data/vendor/assets/components/sir-trevor-js/examples-component/javascript/limit_chars.js +46 -0
  262. data/vendor/assets/components/sir-trevor-js/examples-component/sir-trevor.gif +0 -0
  263. data/vendor/assets/components/sir-trevor-js/locales/cn.js +51 -0
  264. data/vendor/assets/components/sir-trevor-js/locales/de.js +51 -0
  265. data/vendor/assets/components/sir-trevor-js/locales/es.js +51 -0
  266. data/vendor/assets/components/sir-trevor-js/locales/fi.js +51 -0
  267. data/vendor/assets/components/sir-trevor-js/locales/fr.js +51 -0
  268. data/vendor/assets/components/sir-trevor-js/locales/pt.js +52 -0
  269. data/vendor/assets/components/sir-trevor-js/package.json +23 -0
  270. data/vendor/assets/components/sir-trevor-js/sir-trevor-icons.css +6 -0
  271. data/vendor/assets/components/sir-trevor-js/sir-trevor.css +393 -0
  272. data/vendor/assets/components/sir-trevor-js/sir-trevor.css.map +7 -0
  273. data/vendor/assets/components/sir-trevor-js/sir-trevor.js +5481 -0
  274. data/vendor/assets/components/sir-trevor-js/sir-trevor.min.js +13 -0
  275. data/vendor/assets/components/underscore/CNAME +1 -0
  276. data/vendor/assets/components/underscore/CONTRIBUTING.md +9 -0
  277. data/vendor/assets/components/underscore/LICENSE +22 -0
  278. data/vendor/assets/components/underscore/README.md +19 -0
  279. data/vendor/assets/components/underscore/Rakefile +10 -0
  280. data/vendor/assets/components/underscore/docs/docco.css +192 -0
  281. data/vendor/assets/components/underscore/docs/favicon.ico +0 -0
  282. data/vendor/assets/components/underscore/docs/images/background.png +0 -0
  283. data/vendor/assets/components/underscore/docs/images/underscore.png +0 -0
  284. data/vendor/assets/components/underscore/docs/underscore.html +823 -0
  285. data/vendor/assets/components/underscore/favicon.ico +0 -0
  286. data/vendor/assets/components/underscore/index.html +2467 -0
  287. data/vendor/assets/components/underscore/index.js +1 -0
  288. data/vendor/assets/components/underscore/package.json +16 -0
  289. data/vendor/assets/components/underscore/test/arrays.js +200 -0
  290. data/vendor/assets/components/underscore/test/chaining.js +59 -0
  291. data/vendor/assets/components/underscore/test/collections.js +453 -0
  292. data/vendor/assets/components/underscore/test/functions.js +265 -0
  293. data/vendor/assets/components/underscore/test/index.html +44 -0
  294. data/vendor/assets/components/underscore/test/objects.js +570 -0
  295. data/vendor/assets/components/underscore/test/speed.js +75 -0
  296. data/vendor/assets/components/underscore/test/utility.js +266 -0
  297. data/vendor/assets/components/underscore/test/vendor/jquery.js +9404 -0
  298. data/vendor/assets/components/underscore/test/vendor/jslitmus.js +670 -0
  299. data/vendor/assets/components/underscore/test/vendor/qunit.css +235 -0
  300. data/vendor/assets/components/underscore/test/vendor/qunit.js +1977 -0
  301. data/vendor/assets/components/underscore/test/vendor/runner.js +98 -0
  302. data/vendor/assets/components/underscore/underscore-min.js +1 -0
  303. data/vendor/assets/components/underscore/underscore.js +1226 -0
  304. metadata +473 -0
@@ -0,0 +1,47 @@
1
+ require 'carrierwave'
2
+
3
+ module LadyJosephine
4
+ class BaseUploader < ::CarrierWave::Uploader::Base
5
+ include ::CarrierWave::MiniMagick
6
+
7
+ storage :file
8
+
9
+ process :auto_orient
10
+
11
+ def strip
12
+ manipulate! do |img|
13
+ img.strip
14
+ img = yield(img) if block_given?
15
+ img
16
+ end
17
+ end
18
+
19
+ def store_dir
20
+ "storage/#{Rails.env}/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
21
+ end
22
+
23
+ # https://makandracards.com/makandra/12323-carrierwave-auto-rotate-tagged-jpegs
24
+ def auto_orient
25
+ manipulate! do |image|
26
+ image.tap(&:auto_orient)
27
+ end
28
+ end
29
+
30
+ def compress_to_fit(width, height, percentage = 70)
31
+ manipulate! do |img|
32
+ img.resize "#{width}x#{height}"
33
+ if img.mime_type.match(/(png|jpeg|jpg)\z/i)
34
+ img.combine_options do |c|
35
+ c.quality(percentage.to_s)
36
+ c.depth "8"
37
+ c.interlace "plane"
38
+ end
39
+ end
40
+
41
+ img = yield(img) if block_given?
42
+ add_metadata(img)
43
+ img
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,149 @@
1
+ module LadyJosephine
2
+ class ImageUploader < BaseUploader
3
+
4
+ def add_metadata(image)
5
+ @version_metadata = metadata_entry(image[:dimensions], image[:size])
6
+ end
7
+
8
+ def metadata_entry(dimensions, size)
9
+ data = HashWithIndifferentAccess.new
10
+ data['width'] = dimensions[0]
11
+ data['height'] = dimensions[1]
12
+ data['size'] = size / 1000
13
+ data['ratio'] = ratio data['width'], data['height']
14
+ data
15
+ end
16
+
17
+ def ratio(width, height)
18
+ (width.to_f / height.to_f).round(2)
19
+ end
20
+
21
+ def version_metadata
22
+ @version_metadata || dummy_version_metadata(version_name)
23
+ end
24
+
25
+ def dummy_version_metadata(version_name)
26
+ metadata_entry([width_from_version_name(version_name),width_from_version_name(version_name)],1000)
27
+ end
28
+
29
+ def srcset_string(url, width)
30
+ "#{url} #{width}w"
31
+ end
32
+
33
+ def srcset(options = {})
34
+ src_versions = [options[:only]].reject(&:blank?).flatten.empty? ? versions.keys{|version| version =~ /^w\d+$/ } : [options[:only]].flatten
35
+ src_versions = src_versions - [options[:except]].flatten
36
+
37
+ src_versions.collect do |version, version_data|
38
+ srcset_string url(version), metadata[version]['width']
39
+ end.reject(&:blank?).join(", ")
40
+ end
41
+
42
+ def width_from_version_name(version_string)
43
+ version_string.to_s.sub(/\D*(\d+)\D*/,'\1').to_i
44
+ end
45
+
46
+
47
+ def metadata
48
+ @metadata ||= collect_metadata
49
+ end
50
+
51
+ def collect_metadata
52
+ if version_name.nil?
53
+ original_filename.present? ? collect_metadata_from_upload : collect_metadata_from_model
54
+ else
55
+ model.send(mounted_as).metadata
56
+ end
57
+
58
+ end
59
+
60
+ def collect_metadata_from_upload
61
+ versions.inject(HashWithIndifferentAccess.new) do |metadata, (key,version_data)|
62
+ metadata[key] = version_data.version_metadata
63
+ metadata
64
+ end
65
+ end
66
+
67
+ def collect_metadata_from_model
68
+ metadata_column = "#{mounted_as}_metadata"
69
+ if model.respond_to?(metadata_column) && (json_data = model.send metadata_column).present?
70
+ collect_metadata_from_cache(json_data)
71
+ else
72
+ collect_metadata_from_version_names
73
+ end
74
+ end
75
+
76
+ def collect_metadata_from_cache(json_data)
77
+ HashWithIndifferentAccess.new(JSON.parse(json_data))
78
+ end
79
+
80
+ def collect_metadata_from_version_names
81
+ versions.inject(HashWithIndifferentAccess.new) do |metadata, (key,version_data)|
82
+ metadata[key] = dummy_version_metadata(key)
83
+ metadata
84
+ end
85
+ end
86
+
87
+ storage :file
88
+
89
+ process :strip
90
+
91
+ version :w300, from_version: :w600 do
92
+ process :compress_to_fit => [300, nil, 70]
93
+ end
94
+
95
+ version :w600 do
96
+ process :compress_to_fit => [600, nil, 70]
97
+ end
98
+
99
+ version :w1000, from_version: :w2000 do
100
+ process :compress_to_fit => [1000, nil, 65]
101
+ end
102
+
103
+ version :w2000 do
104
+ process :compress_to_fit => [2000, nil, 65]
105
+ end
106
+
107
+ def large
108
+ w2000
109
+ end
110
+
111
+ def medium
112
+ w1000
113
+ end
114
+
115
+ def small
116
+ w300
117
+ end
118
+
119
+ def without_meta_data
120
+ w2000
121
+ end
122
+
123
+ def thumb
124
+ w300
125
+ end
126
+
127
+ def preview
128
+ w300
129
+ end
130
+
131
+ def preview_retina
132
+ w600
133
+ end
134
+
135
+ def main
136
+ w1000
137
+ end
138
+
139
+ def main_retina
140
+ w2000
141
+ end
142
+
143
+ def extension_white_list
144
+ %w(jpg jpeg gif png)
145
+ end
146
+
147
+ end
148
+
149
+ end
@@ -0,0 +1,2 @@
1
+ %div{ component_attributes_for(block, ["cp", "lady-josephine-block--audio"]) }<
2
+ %div{soundcloud_url: block["remote_id"]}
@@ -0,0 +1,4 @@
1
+ %div{ component_attributes_for(block, ["cp", "lady-josephine-block--definition"]) }<
2
+ %dl
3
+ %dt= block["term"]
4
+ %dd= sir_trevor_markdown block["text"]
@@ -0,0 +1,2 @@
1
+ %div.cp.lady-josephine-block--divider
2
+ %hr
@@ -0,0 +1,63 @@
1
+ - image = LadyJosephine::Image.find_by(block_uuid: block["uuid"]).file
2
+
3
+ - if block["style"] == "fullwidth"
4
+
5
+ %figure.media(data-fullscreenable-media data-isFullscreen="false" data-ng-class="{'media--fullscreen' : isFullscreen}"){ component_attributes_for(block, ["media lady-josephine-block--image", style: "media"]) }<
6
+
7
+ .media__img
8
+ - if block["target_url"].present?
9
+ %a(href="#{block["target_url"]}")
10
+ = image_with_srcset_tag image.srcset, "(min-width:1000px) #{image_display_width(image.metadata)}px, 50vw"
11
+ - else
12
+ = image_with_srcset_tag image.srcset, "(min-width:1000px) #{image_display_width(image.metadata)}px, 50vw"
13
+
14
+ %figcaption.media__body
15
+ - if block["caption"].present? || block["copyright"].present?
16
+ %p
17
+ = block["caption"]
18
+
19
+ - if block["copyright"].present?
20
+ %span.copyright
21
+ = block["copyright"]
22
+
23
+
24
+ - if block["style"] == "bodywidth"
25
+
26
+ %figure.media.cp(data-fullscreenable-media data-isFullscreen="false" data-ng-class="{'media--fullscreen' : isFullscreen}"){ component_attributes_for(block, ["media lady-josephine-block--image", style: "media"]) }<
27
+
28
+ .media__img
29
+ - if block["target_url"].present?
30
+ %a(href="#{block["target_url"]}")
31
+ = image_with_srcset_tag image.srcset, "(min-width:1000px) 680px, 50vw"
32
+ - else
33
+ = image_with_srcset_tag image.srcset, "(min-width:1000px) 680px, 50vw"
34
+
35
+ %figcaption.media__body
36
+ - if block["caption"].present? || block["copyright"].present?
37
+ %p
38
+ = block["caption"]
39
+
40
+ - if block["copyright"].present?
41
+ %span.copyright
42
+ = block["copyright"]
43
+
44
+
45
+ - if block["style"] == "default" || block["style"] == ""
46
+
47
+ %figure.media.cp(data-fullscreenable-media data-isFullscreen="false" data-ng-class="{'media--fullscreen' : isFullscreen}"){ component_attributes_for(block, ["media", style: "media" ]) }<
48
+ .media__img.pull--left
49
+ - if block["target_url"].present?
50
+ %a(href="#{block["target_url"]}")
51
+ = image_with_srcset_tag image.srcset, "(min-width:1000px) 400px, 50vw"
52
+ - else
53
+ = image_with_srcset_tag image.srcset, "(min-width:1000px) 400px, 50vw"
54
+
55
+ - if block["copyright"].present?
56
+ .media__img.pull--left
57
+ %p.copyright
58
+ = block["copyright"]
59
+
60
+ - if block["caption"].present?
61
+ %figcaption.media__body
62
+ %p
63
+ = block["caption"]
@@ -0,0 +1,5 @@
1
+ %div{ component_attributes_for(block, ["cp", "lady-josephine-block--extended-quote"]) }<
2
+ %blockquote
3
+ %p<>= sir_trevor_markdown block["text"].chomp("\n")
4
+ %cite<
5
+ = block["cite"]
@@ -0,0 +1,2 @@
1
+ %div{ component_attributes_for(block, ["cp", "lady-josephine-block--tweet"]) }<
2
+ %div{ tweet_url: block["remote_id"] }
@@ -0,0 +1,2 @@
1
+ %div{ component_attributes_for(block, ["cp", "lady-josephine-block--facebook-post"]) }<
2
+ %div{ facebook_url: block["url"] }
@@ -0,0 +1,2 @@
1
+ %h2{ component_attributes_for(block, ["lady-josephine-block--heading", "cp"]) }<
2
+ = sir_trevor_markdown block["text"]
@@ -0,0 +1 @@
1
+ = block["text"].html_safe
@@ -0,0 +1,2 @@
1
+ %div{ component_attributes_for(block, ["cp", "lady-josephine-block--instagram"]) }<
2
+ %div{ instagram_url: block["remote_id"] }
@@ -0,0 +1,3 @@
1
+ %div{ component_attributes_for(block, ["cp", "lady-josephine-block--list"]) }<
2
+ %ul
3
+ = sir_trevor_markdown block["text"]
@@ -0,0 +1,5 @@
1
+ %div{ component_attributes_for(block, ["cp", "lady-josephine-block--quote"]) }<
2
+ %blockquote
3
+ %p<>= sir_trevor_markdown block["text"].chomp("\n")
4
+ %cite<
5
+ = block["cite"]
@@ -0,0 +1,2 @@
1
+ %p{ component_attributes_for(block, ["cp", "lady-josephine-block--text"]) }<
2
+ = sir_trevor_markdown block["text"].chomp
@@ -0,0 +1,9 @@
1
+ - if block["style"] == "fullwidth"
2
+
3
+ %div{ component_attributes_for(block, style: ["lady-josephine-block--video"]) }<
4
+ =sir_trevor_video(block).html_safe
5
+
6
+ - if block["style"] == "default" || block["style"] == ""
7
+
8
+ %div.cp{ component_attributes_for(block, style: ["lady-josephine-block--video"]) }<
9
+ =sir_trevor_video(block).html_safe
data/config/routes.rb ADDED
@@ -0,0 +1,9 @@
1
+ LadyJosephine::Engine.routes.draw do
2
+ resources :images, only: [:create]
3
+
4
+ controller :editor do
5
+ get '/content/:resource/:id/version' => :version
6
+ post '/content/:resource/:id/ping' => :ping
7
+ end
8
+
9
+ end
@@ -0,0 +1,18 @@
1
+ class LadyJosephineImage < ActiveRecord::Migration
2
+ def change
3
+ create_table :lady_josephine_images do |t|
4
+
5
+ t.string :block_uuid
6
+ t.string :file
7
+ t.string :uploadable_type
8
+ t.string :uploadable_uuid
9
+ t.string :uploadable_id
10
+ t.string :uploadable_attribute
11
+
12
+ t.text :file_metadata
13
+ t.integer :uploadable_id
14
+
15
+ t.timestamps null: false
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,9 @@
1
+ Description:
2
+ This generator will add the necesarry migration for your model
3
+ to function with LadyJosephine.
4
+
5
+ Example:
6
+ rails generate lady_josephine_migration ModelName
7
+
8
+ This will create:
9
+ db/migrations/NUMBER_add_lady_josephine_to_model_name.rb
@@ -0,0 +1,17 @@
1
+ require 'rails/generators'
2
+ require 'rails/generators/active_record'
3
+ require 'rails/generators/migration'
4
+
5
+ class LadyJosephineMigrationGenerator < Rails::Generators::NamedBase
6
+ include Rails::Generators::Migration
7
+ source_root File.expand_path('../templates', __FILE__)
8
+
9
+ def self.next_migration_number(path)
10
+ Time.now.utc.strftime("%Y%m%d%H%M%S")
11
+ end
12
+
13
+ def copy_model_migration
14
+ migration_template "migration.rb", "db/migrate/add_lady_josephine_to_#{table_name}.rb"
15
+ end
16
+
17
+ end
@@ -0,0 +1,9 @@
1
+ class AddLadyJosephineTo<%= table_name.camelize %> < ActiveRecord::Migration
2
+ def change
3
+ add_column :<%= table_name %>, :content_data, :string, default: "{}"
4
+ add_column :<%= table_name %>, :lady_josephine_ping_date, :timestamp
5
+ add_column :<%= table_name %>, :lady_josephine_ping_user_id, :integer
6
+ add_column :<%= table_name %>, :lady_josephine_server_uuid, :string
7
+ add_column :<%= table_name %>, :lady_josephine_server_version, :string
8
+ end
9
+ end
@@ -0,0 +1,18 @@
1
+ require 'lady_josephine/engine'
2
+ require 'lady_josephine/whitelist'
3
+ require 'carrierwave'
4
+
5
+ module LadyJosephine
6
+
7
+ module Renderer
8
+ autoload :SirTrevorRenderer, 'lady_josephine/renderer/sir_trevor_renderer'
9
+ end
10
+
11
+ module Redcarpet
12
+ autoload :CustomMarkdownFormatter, 'lady_josephine/redcarpet/custom_markdown_formatter'
13
+ end
14
+
15
+ mattr_accessor :mount_path
16
+ @@mount_path = "/josephine"
17
+
18
+ end
@@ -0,0 +1,18 @@
1
+ module LadyJosephine
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace LadyJosephine
4
+
5
+ config.assets.paths << File.expand_path("../../../app/assets/fonts", __FILE__)
6
+
7
+ config.generators do |g|
8
+ g.assets false
9
+ g.helper false
10
+ end
11
+
12
+ initializer 'lady_josephine.action_controller' do |app|
13
+ ActiveSupport.on_load :action_controller do
14
+ helper LadyJosephine::Helper
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,63 @@
1
+ module LadyJosephine
2
+ module Redcarpet
3
+ class CustomMarkdownFormatter < ::Redcarpet::Render::SmartyHTML
4
+
5
+ def block_code(code, language)
6
+ "<p>" << code << "</p>"
7
+ end
8
+
9
+ def paragraph(text)
10
+ text
11
+ end
12
+
13
+ def block_quote(text)
14
+ text
15
+ end
16
+
17
+ def list(contents, list_type)
18
+ contents
19
+ end
20
+
21
+ def codespan(code)
22
+ code
23
+ end
24
+
25
+ def postprocess(full_document)
26
+ full_document.gsub(/&lt;br&gt;/, "<br>\n")
27
+ end
28
+
29
+ def preprocess(full_document)
30
+ sanitized_document = full_document.gsub(/\"(.*?)\"/) do
31
+ "„#{$1}“"
32
+ end
33
+ sanitized_document.gsub!(/\./, "\\.")
34
+ sanitized_document.gsub!(/\n/, "<br>\n")
35
+ sanitized_document
36
+ end
37
+
38
+ def link(link, title, context)
39
+ if is_internal_link?(link)
40
+ "<a href=\"#{link}\">#{context}</a>"
41
+ else
42
+ "<a href=\"#{link}\" target=\"_blank\">#{context}</a>"
43
+ end
44
+ end
45
+
46
+ private
47
+
48
+ def is_internal_link?(link)
49
+ host = Addressable::URI.parse(link).host
50
+ host.nil? || host.casecmp(host_from_config) == 0
51
+ end
52
+
53
+ def host_from_config
54
+ config_host = Krautmag.config.action_mailer.default_url_options[:host]
55
+ unless config_host =~ /^http(s)?:\/\//i
56
+ config_host = "http://" + config_host
57
+ end
58
+ URI(config_host).host
59
+ end
60
+
61
+ end
62
+ end
63
+ end