proclaim 0.5.6 → 0.6.0

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 (236) hide show
  1. checksums.yaml +5 -5
  2. data/Rakefile +5 -38
  3. data/app/assets/config/proclaim_manifest.js +2 -0
  4. data/app/assets/images/{ajax_loader.gif → proclaim/ajax_loader.gif} +0 -0
  5. data/app/assets/javascripts/proclaim.js +7 -7
  6. data/app/assets/javascripts/proclaim/{comments_handler.js.coffee → comments_handler.coffee} +16 -10
  7. data/app/assets/javascripts/proclaim/editor.coffee +55 -0
  8. data/app/assets/stylesheets/{proclaim.css.scss → proclaim.scss} +7 -8
  9. data/app/assets/stylesheets/proclaim/{comments.css.scss → comments.scss} +0 -0
  10. data/app/assets/stylesheets/proclaim/{posts.css.scss → posts.scss} +60 -25
  11. data/app/assets/stylesheets/proclaim/{subscriptions.css.scss → subscriptions.scss} +0 -0
  12. data/app/controllers/proclaim/application_controller.rb +60 -56
  13. data/app/controllers/proclaim/comments_controller.rb +13 -42
  14. data/app/controllers/proclaim/posts_controller.rb +25 -57
  15. data/app/controllers/proclaim/subscriptions_controller.rb +3 -3
  16. data/app/jobs/proclaim/application_job.rb +4 -0
  17. data/app/mailers/proclaim/application_mailer.rb +5 -0
  18. data/app/mailers/proclaim/subscription_mailer.rb +19 -17
  19. data/app/models/proclaim/application_record.rb +5 -0
  20. data/app/models/proclaim/comment.rb +6 -1
  21. data/app/models/proclaim/post.rb +20 -28
  22. data/app/models/proclaim/subscription.rb +33 -11
  23. data/app/views/layouts/proclaim/subscription_mailer.html.erb +15 -36
  24. data/app/views/proclaim/comments/_comment.html.erb +7 -7
  25. data/app/views/proclaim/comments/_form.html.erb +7 -5
  26. data/app/views/proclaim/posts/_form.html.erb +34 -21
  27. data/app/views/proclaim/posts/show.html.erb +16 -3
  28. data/app/views/proclaim/subscription_mailer/welcome_email.html.erb +2 -6
  29. data/config/initializers/friendly_id.rb +20 -1
  30. data/config/routes.rb +1 -5
  31. data/db/migrate/20141108222616_create_proclaim_posts.rb +8 -1
  32. data/db/migrate/20141114235359_create_proclaim_comments.rb +1 -1
  33. data/db/migrate/20141115022230_create_proclaim_comment_hierarchies.rb +1 -1
  34. data/db/migrate/20141210234057_create_proclaim_subscriptions.rb +5 -4
  35. data/db/migrate/20150213015321_create_friendly_id_slugs.rb +1 -1
  36. data/lib/generators/proclaim/install_generator.rb +1 -1
  37. data/lib/generators/proclaim/templates/initialize_proclaim.rb +31 -29
  38. data/lib/generators/proclaim/views_generator.rb +1 -1
  39. data/lib/proclaim.rb +15 -15
  40. data/lib/proclaim/engine.rb +21 -19
  41. data/lib/proclaim/version.rb +1 -1
  42. data/vendor/assets/fonts/KaTeX_AMS-Regular.ttf +0 -0
  43. data/vendor/assets/fonts/KaTeX_AMS-Regular.woff +0 -0
  44. data/vendor/assets/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  45. data/vendor/assets/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
  46. data/vendor/assets/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
  47. data/vendor/assets/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  48. data/vendor/assets/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
  49. data/vendor/assets/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
  50. data/vendor/assets/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  51. data/vendor/assets/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
  52. data/vendor/assets/fonts/KaTeX_Fraktur-Bold.woff +0 -0
  53. data/vendor/assets/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  54. data/vendor/assets/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
  55. data/vendor/assets/fonts/KaTeX_Fraktur-Regular.woff +0 -0
  56. data/vendor/assets/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  57. data/vendor/assets/fonts/KaTeX_Main-Bold.ttf +0 -0
  58. data/vendor/assets/fonts/KaTeX_Main-Bold.woff +0 -0
  59. data/vendor/assets/fonts/KaTeX_Main-Bold.woff2 +0 -0
  60. data/vendor/assets/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
  61. data/vendor/assets/fonts/KaTeX_Main-BoldItalic.woff +0 -0
  62. data/vendor/assets/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  63. data/vendor/assets/fonts/KaTeX_Main-Italic.ttf +0 -0
  64. data/vendor/assets/fonts/KaTeX_Main-Italic.woff +0 -0
  65. data/vendor/assets/fonts/KaTeX_Main-Italic.woff2 +0 -0
  66. data/vendor/assets/fonts/KaTeX_Main-Regular.ttf +0 -0
  67. data/vendor/assets/fonts/KaTeX_Main-Regular.woff +0 -0
  68. data/vendor/assets/fonts/KaTeX_Main-Regular.woff2 +0 -0
  69. data/vendor/assets/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
  70. data/vendor/assets/fonts/KaTeX_Math-BoldItalic.woff +0 -0
  71. data/vendor/assets/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  72. data/vendor/assets/fonts/KaTeX_Math-Italic.ttf +0 -0
  73. data/vendor/assets/fonts/KaTeX_Math-Italic.woff +0 -0
  74. data/vendor/assets/fonts/KaTeX_Math-Italic.woff2 +0 -0
  75. data/vendor/assets/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
  76. data/vendor/assets/fonts/KaTeX_SansSerif-Bold.woff +0 -0
  77. data/vendor/assets/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  78. data/vendor/assets/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
  79. data/vendor/assets/fonts/KaTeX_SansSerif-Italic.woff +0 -0
  80. data/vendor/assets/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  81. data/vendor/assets/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
  82. data/vendor/assets/fonts/KaTeX_SansSerif-Regular.woff +0 -0
  83. data/vendor/assets/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  84. data/vendor/assets/fonts/KaTeX_Script-Regular.ttf +0 -0
  85. data/vendor/assets/fonts/KaTeX_Script-Regular.woff +0 -0
  86. data/vendor/assets/fonts/KaTeX_Script-Regular.woff2 +0 -0
  87. data/vendor/assets/fonts/KaTeX_Size1-Regular.ttf +0 -0
  88. data/vendor/assets/fonts/KaTeX_Size1-Regular.woff +0 -0
  89. data/vendor/assets/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  90. data/vendor/assets/fonts/KaTeX_Size2-Regular.ttf +0 -0
  91. data/vendor/assets/fonts/KaTeX_Size2-Regular.woff +0 -0
  92. data/vendor/assets/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  93. data/vendor/assets/fonts/KaTeX_Size3-Regular.ttf +0 -0
  94. data/vendor/assets/fonts/KaTeX_Size3-Regular.woff +0 -0
  95. data/vendor/assets/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  96. data/vendor/assets/fonts/KaTeX_Size4-Regular.ttf +0 -0
  97. data/vendor/assets/fonts/KaTeX_Size4-Regular.woff +0 -0
  98. data/vendor/assets/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  99. data/vendor/assets/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
  100. data/vendor/assets/fonts/KaTeX_Typewriter-Regular.woff +0 -0
  101. data/vendor/assets/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  102. data/vendor/assets/javascripts/contrib/auto-render.js +339 -0
  103. data/vendor/assets/javascripts/contrib/auto-render.min.js +1 -0
  104. data/vendor/assets/javascripts/contrib/auto-render.mjs +215 -0
  105. data/vendor/assets/javascripts/contrib/copy-tex.css +14 -0
  106. data/vendor/assets/javascripts/contrib/copy-tex.js +213 -0
  107. data/vendor/assets/javascripts/contrib/copy-tex.min.css +1 -0
  108. data/vendor/assets/javascripts/contrib/copy-tex.min.js +1 -0
  109. data/vendor/assets/javascripts/contrib/copy-tex.mjs +85 -0
  110. data/vendor/assets/javascripts/contrib/mathtex-script-type.js +137 -0
  111. data/vendor/assets/javascripts/contrib/mathtex-script-type.min.js +1 -0
  112. data/vendor/assets/javascripts/contrib/mathtex-script-type.mjs +24 -0
  113. data/vendor/assets/javascripts/contrib/mhchem.js +3241 -0
  114. data/vendor/assets/javascripts/contrib/mhchem.min.js +1 -0
  115. data/vendor/assets/javascripts/contrib/mhchem.mjs +3109 -0
  116. data/vendor/assets/javascripts/katex.js +16517 -0
  117. data/vendor/assets/javascripts/katex.min.js +1 -0
  118. data/vendor/assets/javascripts/katex.mjs +16122 -0
  119. data/vendor/assets/javascripts/quill.core.js +8522 -0
  120. data/vendor/assets/javascripts/quill.js +11489 -0
  121. data/vendor/assets/javascripts/quill.min.js +8 -0
  122. data/vendor/assets/javascripts/quill.min.js.map +1 -0
  123. data/vendor/assets/stylesheets/katex.css +1011 -0
  124. data/vendor/assets/stylesheets/katex.min.css +1 -0
  125. data/vendor/assets/stylesheets/quill.bubble.css +952 -0
  126. data/vendor/assets/stylesheets/quill.core.css +397 -0
  127. data/vendor/assets/stylesheets/quill.snow.css +945 -0
  128. metadata +169 -278
  129. data/CHANGELOG +0 -77
  130. data/Gemfile +0 -14
  131. data/VERSION +0 -1
  132. data/app/assets/javascripts/proclaim/editor.js.coffee +0 -52
  133. data/app/assets/javascripts/proclaim/images.js.coffee +0 -3
  134. data/app/assets/javascripts/proclaim/subscriptions.js.coffee +0 -3
  135. data/app/assets/stylesheets/proclaim/images.scss +0 -3
  136. data/app/controllers/proclaim/images_controller.rb +0 -67
  137. data/app/helpers/proclaim/comments_helper.rb +0 -4
  138. data/app/helpers/proclaim/images_helper.rb +0 -4
  139. data/app/helpers/proclaim/subscriptions_helper.rb +0 -4
  140. data/app/models/proclaim/image.rb +0 -19
  141. data/app/policies/proclaim/image_policy.rb +0 -29
  142. data/app/uploaders/proclaim/image_uploader.rb +0 -82
  143. data/db/migrate/20141222224905_create_proclaim_images.rb +0 -12
  144. data/db/migrate/20150123115226_add_name_to_subscriptions.rb +0 -7
  145. data/db/migrate/20150213015850_add_slug_to_posts.rb +0 -20
  146. data/proclaim.gemspec +0 -51
  147. data/test/controllers/proclaim/comments_controller_test.rb +0 -228
  148. data/test/controllers/proclaim/images_controller_test.rb +0 -166
  149. data/test/controllers/proclaim/posts_controller_test.rb +0 -465
  150. data/test/controllers/proclaim/subscriptions_controller_test.rb +0 -154
  151. data/test/dummy/README.rdoc +0 -28
  152. data/test/dummy/Rakefile +0 -6
  153. data/test/dummy/app/assets/javascripts/application.js +0 -14
  154. data/test/dummy/app/assets/stylesheets/application.css +0 -16
  155. data/test/dummy/app/controllers/application_controller.rb +0 -15
  156. data/test/dummy/app/helpers/application_helper.rb +0 -28
  157. data/test/dummy/app/models/user.rb +0 -7
  158. data/test/dummy/app/views/layouts/application.html.erb +0 -16
  159. data/test/dummy/bin/bundle +0 -3
  160. data/test/dummy/bin/rails +0 -4
  161. data/test/dummy/bin/rake +0 -4
  162. data/test/dummy/config.ru +0 -4
  163. data/test/dummy/config/application.rb +0 -24
  164. data/test/dummy/config/boot.rb +0 -5
  165. data/test/dummy/config/database.yml +0 -25
  166. data/test/dummy/config/environment.rb +0 -5
  167. data/test/dummy/config/environments/development.rb +0 -45
  168. data/test/dummy/config/environments/production.rb +0 -80
  169. data/test/dummy/config/environments/test.rb +0 -49
  170. data/test/dummy/config/initializers/assets.rb +0 -8
  171. data/test/dummy/config/initializers/backtrace_silencers.rb +0 -7
  172. data/test/dummy/config/initializers/cookies_serializer.rb +0 -3
  173. data/test/dummy/config/initializers/filter_parameter_logging.rb +0 -4
  174. data/test/dummy/config/initializers/inflections.rb +0 -16
  175. data/test/dummy/config/initializers/mime_types.rb +0 -4
  176. data/test/dummy/config/initializers/session_store.rb +0 -3
  177. data/test/dummy/config/initializers/wrap_parameters.rb +0 -14
  178. data/test/dummy/config/locales/en.yml +0 -23
  179. data/test/dummy/config/routes.rb +0 -5
  180. data/test/dummy/config/secrets.yml +0 -22
  181. data/test/dummy/db/migrate/20141117214323_create_users.rb +0 -10
  182. data/test/dummy/db/schema.rb +0 -91
  183. data/test/dummy/public/404.html +0 -67
  184. data/test/dummy/public/422.html +0 -67
  185. data/test/dummy/public/500.html +0 -66
  186. data/test/dummy/public/favicon.ico +0 -0
  187. data/test/factories/proclaim/comment.rb +0 -11
  188. data/test/factories/proclaim/image.rb +0 -6
  189. data/test/factories/proclaim/post.rb +0 -14
  190. data/test/factories/proclaim/subscription.rb +0 -14
  191. data/test/factories/user.rb +0 -6
  192. data/test/helpers/proclaim/comments_helper_test.rb +0 -6
  193. data/test/helpers/proclaim/posts_helper_test.rb +0 -6
  194. data/test/helpers/proclaim/subscriptions_helper_test.rb +0 -6
  195. data/test/integration/with_javascript/comment_test.rb +0 -391
  196. data/test/integration/with_javascript/post_form_test.rb +0 -225
  197. data/test/integration/with_javascript/post_show_test.rb +0 -47
  198. data/test/integration/with_javascript/post_subscription_test.rb +0 -302
  199. data/test/integration/without_javascript/blog_subscription_test.rb +0 -114
  200. data/test/integration/without_javascript/manage_subscriptions_test.rb +0 -37
  201. data/test/integration/without_javascript/post_test.rb +0 -234
  202. data/test/integration/without_javascript/subscription_email_test.rb +0 -95
  203. data/test/integration/without_javascript/unsubscribe_test.rb +0 -32
  204. data/test/mailers/previews/proclaim/subscription_mailer_preview.rb +0 -22
  205. data/test/mailers/proclaim/subscription_mailer_test.rb +0 -91
  206. data/test/models/proclaim/comment_test.rb +0 -41
  207. data/test/models/proclaim/image_test.rb +0 -70
  208. data/test/models/proclaim/post_test.rb +0 -193
  209. data/test/models/proclaim/subscription_test.rb +0 -77
  210. data/test/policies/application_policy_test.rb +0 -87
  211. data/test/policies/proclaim/comment_policy_test.rb +0 -71
  212. data/test/policies/proclaim/image_policy_test.rb +0 -83
  213. data/test/policies/proclaim/post_policy_test.rb +0 -98
  214. data/test/policies/proclaim/subscription_policy_test.rb +0 -103
  215. data/test/proclaim_test.rb +0 -7
  216. data/test/support/images/test.jpg +0 -0
  217. data/test/support/pages/posts/edit_page.rb +0 -5
  218. data/test/support/pages/posts/show_page.rb +0 -47
  219. data/test/support/wait_for_ajax.rb +0 -11
  220. data/test/test_helper.rb +0 -71
  221. data/test/unit/proclaim/new_comment_callback_test.rb +0 -62
  222. data/test/unit/proclaim/new_subscription_callback_test.rb +0 -62
  223. data/test/unit/proclaim/post_published_callback_test.rb +0 -74
  224. data/vendor/assets/images/link.png +0 -0
  225. data/vendor/assets/images/remove.png +0 -0
  226. data/vendor/assets/images/resize-bigger.png +0 -0
  227. data/vendor/assets/images/resize-smaller.png +0 -0
  228. data/vendor/assets/images/unlink.png +0 -0
  229. data/vendor/assets/javascripts/addons/medium-editor-insert-embeds.js +0 -197
  230. data/vendor/assets/javascripts/addons/medium-editor-insert-images.js +0 -572
  231. data/vendor/assets/javascripts/addons/medium-editor-insert-maps.js +0 -50
  232. data/vendor/assets/javascripts/addons/medium-editor-insert-plugin.js +0 -496
  233. data/vendor/assets/javascripts/addons/medium-editor-insert-tables.js +0 -132
  234. data/vendor/assets/javascripts/medium-editor-insert-plugin.all.js +0 -1415
  235. data/vendor/assets/stylesheets/medium-editor-insert-plugin-frontend.css.scss +0 -55
  236. data/vendor/assets/stylesheets/medium-editor-insert-plugin.css.scss +0 -277
@@ -1,50 +0,0 @@
1
- /*!
2
- * medium-editor-insert-plugin v0.3.2 - jQuery insert plugin for MediumEditor
3
- *
4
- * https://github.com/orthes/medium-editor-insert-plugin
5
- *
6
- * Copyright (c) 2014 Pavel Linkesch (http://linkesch.sk)
7
- * Released under the MIT license
8
- */
9
-
10
- (function ($) {
11
-
12
- $.fn.mediumInsert.registerAddon('maps', {
13
-
14
- /**
15
- * Maps initial function
16
- * @return {void}
17
- */
18
-
19
- init: function () {
20
- this.$el = $.fn.mediumInsert.insert.$el;
21
- },
22
-
23
- insertButton: function(buttonLabels){
24
- var label = 'Map';
25
- if (buttonLabels === 'fontawesome' || typeof buttonLabels === 'object' && !!(buttonLabels.fontawesome)) {
26
- label = '<i class="fa fa-map-marker"></i>';
27
- }
28
-
29
- if (typeof buttonLabels === 'object' && buttonLabels.map) {
30
- label = buttonLabels.map;
31
- }
32
-
33
- return '<button data-addon="maps" data-action="add" class="medium-editor-action mediumInsert-action">'+label+'</button>';
34
- },
35
-
36
- /**
37
- * Add map to placeholder
38
- * @param {element} placeholder Placeholder to add map to
39
- * @return {void}
40
- */
41
-
42
- add: function (placeholder) {
43
- $.fn.mediumInsert.insert.deselect();
44
-
45
- placeholder.append('<div class="mediumInsert-maps">Map - Coming soon...</div>');
46
- }
47
-
48
- });
49
-
50
- }(jQuery));
@@ -1,496 +0,0 @@
1
- /*!
2
- * medium-editor-insert-plugin v0.3.2 - jQuery insert plugin for MediumEditor
3
- *
4
- * https://github.com/orthes/medium-editor-insert-plugin
5
- *
6
- * Copyright (c) 2014 Pavel Linkesch (http://linkesch.sk)
7
- * Released under the MIT license
8
- */
9
-
10
- /* global MediumEditor */
11
-
12
- (function ($) {
13
- /*
14
- * Private storage of registered addons
15
- */
16
- var addons = {};
17
-
18
- /**
19
- * Extend MediumEditor functions if the editor exists
20
- */
21
- if (MediumEditor && typeof(MediumEditor) === "function") {
22
- /**
23
- * Extend MediumEditor's serialize function to get rid of unnecesarry Medium Editor Insert Plugin stuff
24
- *
25
- * @return {object} content Object containing HTML content of each element
26
- */
27
-
28
- MediumEditor.prototype.serialize = function () {
29
- var i, j,
30
- elementid,
31
- content = {},
32
- $clone, $inserts, $insert, $insertData, html;
33
- for (i = 0; i < this.elements.length; i += 1) {
34
- elementid = (this.elements[i].id !== '') ? this.elements[i].id : 'element-' + i;
35
-
36
- $clone = $(this.elements[i]).clone();
37
- $inserts = $('.mediumInsert', $clone);
38
- for (j = 0; j < $inserts.length; j++) {
39
- $insert = $($inserts[j]);
40
- $insertData = $('.mediumInsert-placeholder', $insert).children();
41
- if ($insertData.length === 0) {
42
- $insert.remove();
43
- } else {
44
- $insert.removeAttr('contenteditable');
45
- $('img[draggable]', $insert).removeAttr('draggable');
46
- if ($insert.hasClass('small')) {
47
- $insertData.addClass('small');
48
- }
49
- $('.mediumInsert-buttons', $insert).remove();
50
- $insertData.unwrap();
51
- }
52
- }
53
-
54
- html = $clone.html().trim();
55
- content[elementid] = {
56
- value: html
57
- };
58
- }
59
- return content;
60
- };
61
-
62
- /**
63
- * Extend MediumEditor's deactivate function to call $.fn.mediumInsert.insert.disable function
64
- *
65
- * @return {void}
66
- */
67
-
68
- MediumEditor.prototype.deactivate = function () {
69
- var i;
70
- if (!this.isActive) {
71
- return false;
72
- }
73
- this.isActive = false;
74
-
75
- if (this.toolbar !== undefined) {
76
- this.toolbar.style.display = 'none';
77
- }
78
-
79
- document.documentElement.removeEventListener('mouseup', this.checkSelectionWrapper);
80
-
81
- for (i = 0; i < this.elements.length; i += 1) {
82
- this.elements[i].removeEventListener('keyup', this.checkSelectionWrapper);
83
- this.elements[i].removeEventListener('blur', this.checkSelectionWrapper);
84
- this.elements[i].removeAttribute('contentEditable');
85
- }
86
-
87
- if ($.fn.mediumInsert.insert.$el)
88
- $.fn.mediumInsert.insert.$el.mediumInsert('disable');
89
- };
90
-
91
- /**
92
- * Extend MediumEditor's activate function to call $.fn.mediumInsert.insert.enable function
93
- *
94
- * @return {void}
95
- */
96
-
97
- MediumEditor.prototype.activate = function () {
98
- var i;
99
- if (this.isActive) {
100
- return false;
101
- }
102
-
103
- if (this.toolbar !== undefined) {
104
- this.toolbar.style.display = 'block';
105
- }
106
-
107
- this.isActive = true;
108
- for (i = 0; i < this.elements.length; i += 1) {
109
- this.elements[i].setAttribute('contentEditable', true);
110
- }
111
- this.bindSelect();
112
-
113
- if ($.fn.mediumInsert.insert.$el)
114
- $.fn.mediumInsert.insert.$el.mediumInsert('enable');
115
- };
116
- }
117
-
118
- /**
119
- * Medium Editor Insert Plugin
120
- *
121
- * @param {object} options Options for the plugin
122
- * @param {void}
123
- */
124
-
125
- $.fn.mediumInsert = function (options) {
126
-
127
- if (typeof options === 'string' && $.fn.mediumInsert.insert[options]) {
128
- $.fn.mediumInsert.insert[options]();
129
- } else {
130
- $.fn.mediumInsert.settings = $.extend($.fn.mediumInsert.settings, options);
131
-
132
-
133
-
134
- /**
135
- * Initial plugin loop
136
- */
137
-
138
- return this.each(function () {
139
- $(this).addClass('medium-editor-insert-plugin');
140
-
141
- var blocks = 'p, h1, h2, h3, h4, h5, h6, ol, ul, blockquote';
142
- $(this).on('dragover drop', blocks, function (e) {
143
- e.preventDefault();
144
- return false;
145
- });
146
-
147
- $.fn.mediumInsert.insert.init($(this));
148
-
149
- $.each($.fn.mediumInsert.settings.addons, function (i) {
150
- if (typeof addons[i] !== 'undefined') {
151
- var addonOptions = $.fn.mediumInsert.settings.addons[i];
152
- addonOptions.$el = $.fn.mediumInsert.insert.$el;
153
- addons[i].init(addonOptions);
154
- }
155
- });
156
- });
157
- }
158
- };
159
-
160
-
161
- /**
162
- * Settings
163
- */
164
- $.fn.mediumInsert.settings = {
165
- enabled: true,
166
- beginning: false,
167
- addons: {
168
- images: {},
169
- embeds: {}
170
- }
171
- };
172
-
173
- /**
174
- * Register new addon
175
- */
176
- $.fn.mediumInsert.registerAddon = function(name, addon){
177
- addons[name] = addon;
178
- };
179
-
180
- /**
181
- * Get registered addon
182
- */
183
- $.fn.mediumInsert.getAddon = function(name){
184
- return addons[name];
185
- };
186
-
187
-
188
- /**
189
- * Addon Initialization
190
- */
191
-
192
- $.fn.mediumInsert.insert = {
193
-
194
- /**
195
- * Insert initial function
196
- *
197
- * @param {element} el Parent container element
198
- * @return {void}
199
- */
200
-
201
- init: function ($el) {
202
- this.$el = $el;
203
- this.isFirefox = navigator.userAgent.match(/firefox/i);
204
- this.setPlaceholders();
205
- this.setEvents();
206
- },
207
-
208
- /**
209
- * Deselect selected text
210
- *
211
- * @return {void}
212
- */
213
-
214
- deselect: function () {
215
- document.getSelection().removeAllRanges();
216
- },
217
-
218
- /**
219
- * Disable the plugin
220
- *
221
- * @return {void}
222
- */
223
-
224
- disable: function () {
225
- $.fn.mediumInsert.settings.enabled = false;
226
-
227
- $.fn.mediumInsert.insert.$el.find('.mediumInsert-buttons').addClass('hide');
228
- },
229
-
230
- /**
231
- * Enable the plugin
232
- *
233
- * @return {void}
234
- */
235
-
236
- enable: function () {
237
- $.fn.mediumInsert.settings.enabled = true;
238
-
239
- $.fn.mediumInsert.insert.$el.find('.mediumInsert-buttons').removeClass('hide');
240
- },
241
-
242
- /**
243
- * Return max id in #mediumInsert-*
244
- *
245
- * @return {int} max (Max number, -1 if no placeholders exist)
246
- */
247
- getMaxId: function () {
248
- var max = -1;
249
-
250
- $('div[id^="mediumInsert-"]').each(function () {
251
- var id = parseInt($(this).attr('id').split('-')[1], 10);
252
- if (id > max) {
253
- max = id;
254
- }
255
- });
256
-
257
- return max;
258
- },
259
-
260
- /**
261
- * Return insert buttons optionally filtered by addon name
262
- *
263
- * @param {string} addon Addon name of addon to display only
264
- * @return {void}
265
- */
266
- getButtons: function (addon) {
267
- var editor = $.fn.mediumInsert.settings.editor,
268
- buttonLabels = (editor && editor.options) ? editor.options.buttonLabels : '';
269
-
270
- var buttons;
271
- if($.fn.mediumInsert.settings.enabled) {
272
- buttons = '<div class="mediumInsert-buttons">'+
273
- '<a class="mediumInsert-buttonsShow">+</a>'+
274
- '<ul class="mediumInsert-buttonsOptions medium-editor-toolbar medium-editor-toolbar-active">';
275
- } else {
276
- buttons = '<div class="mediumInsert-buttons hide">'+
277
- '<a class="mediumInsert-buttonsShow">+</a>'+
278
- '<ul class="mediumInsert-buttonsOptions medium-editor-toolbar medium-editor-toolbar-active">';
279
- }
280
-
281
- if (Object.keys($.fn.mediumInsert.settings.addons).length === 0) {
282
- return false;
283
- }
284
-
285
- if (typeof addon === 'undefined') {
286
- $.each($.fn.mediumInsert.settings.addons, function (i) {
287
- if (typeof addons[i] === 'undefined') {
288
- console.log('Addon "' + i + '" is not available. Did you forgot to include the related file?');
289
- } else {
290
- buttons += '<li>' + addons[i].insertButton(buttonLabels) + '</li>';
291
- }
292
- });
293
- } else {
294
- buttons += '<li>' + addons[addon].insertButton(buttonLabels) + '</li>';
295
- }
296
-
297
- buttons += '</ul></div>';
298
-
299
- return buttons;
300
- },
301
-
302
- /**
303
- * Method setting placeholders
304
- *
305
- * @return {void}
306
- */
307
-
308
- setPlaceholders: function () {
309
- var that = this,
310
- $el = $.fn.mediumInsert.insert.$el,
311
- insertBlock = this.getButtons(),
312
- $firstEl;
313
-
314
- if (insertBlock === false) {
315
- return false;
316
- }
317
-
318
- insertBlock = '<div class="mediumInsert" contenteditable="false">'+
319
- insertBlock +
320
- '<div class="mediumInsert-placeholder"></div>'+
321
- '</div>';
322
-
323
- if ($el.is(':empty')) {
324
- $el.html('<p><br></p>');
325
- }
326
-
327
- $el.keyup(function () {
328
- var $lastChild = $el.children(':last'),
329
- i;
330
-
331
- // Fix #39
332
- // After deleting all content (ctrl+A and delete) in Firefox, all content is deleted and only <br> appears
333
- // To force placeholder to appear, set <p><br></p> as content of the $el
334
- if ($el.html() === '' || $el.html() === '<br>') {
335
- $el.html('<p><br></p>');
336
- }
337
-
338
- if ($lastChild.hasClass('mediumInsert') && $lastChild.find('.mediumInsert-placeholder').children().length > 0) {
339
- $el.append('<p><br></p>');
340
- }
341
-
342
- // Fix not deleting placeholder in Firefox
343
- // by removing all empty placeholders
344
- if (that.isFirefox){
345
- $('.mediumInsert .mediumInsert-placeholder:empty', $el).each(function () {
346
- $(this).parent().remove();
347
- });
348
- }
349
-
350
- i = that.getMaxId() +1;
351
-
352
- var blocks = 'p, h1, h2, h3, h4, h5, h6, ol, ul, blockquote';
353
-
354
- if ($.fn.mediumInsert.settings.beginning) {
355
- $firstEl = $el.children(blocks).first();
356
- if ($firstEl.prev().hasClass('mediumInsert') === false) {
357
- $firstEl.before(insertBlock);
358
- $firstEl.prev('.mediumInsert').attr('id', 'mediumInsert-'+ i).addClass('mediumInsert-first');
359
- i++;
360
- }
361
- }
362
-
363
- $el.children(blocks).each(function () {
364
- if ($(this).next().hasClass('mediumInsert') === false) {
365
- $(this).after(insertBlock);
366
- $(this).next('.mediumInsert').attr('id', 'mediumInsert-'+ i);
367
- }
368
- i++;
369
- });
370
-
371
- }).keyup();
372
- },
373
-
374
-
375
- /**
376
- * Set events on placeholders
377
- *
378
- * @return {void}
379
- */
380
-
381
- setEvents: function () {
382
- var that = this,
383
- $el = $.fn.mediumInsert.insert.$el;
384
-
385
- $el.on('selectstart mousedown', '.mediumInsert', function (e) {
386
- if ($(e.target).is('img') === false) {
387
- e.preventDefault();
388
- }
389
- });
390
-
391
- $el.on('blur', function () {
392
- var $clone = $(this).clone(),
393
- cloneHtml;
394
-
395
- $clone.find('.mediumInsert').remove();
396
- cloneHtml = $clone.html().replace(/^\s+|\s+$/g, '');
397
-
398
- if (cloneHtml === '' || cloneHtml === '<p><br></p>') {
399
- $(this).addClass('medium-editor-placeholder');
400
- }
401
- });
402
-
403
-
404
- // Fix #29
405
- // Sometimes in Firefox when you hit enter, <br type="_moz"> appears instead of <p><br></p>
406
- // If it happens, force to wrap the <br> into a paragraph
407
- $el.on('keypress', function (e) {
408
- if (that.isFirefox) {
409
- if (e.keyCode === 13) {
410
- //wrap content text in p to avoid firefox problems
411
- $el.contents().each((function() {
412
- return function(index, field) {
413
- if (field.nodeName === '#text' && field.textContent.trim() !== '') {
414
- document.execCommand('insertHTML', false, "<p>" + field.data + "</p>");
415
- return field.remove();
416
- }
417
- };
418
- })(this));
419
- // Removed because of #94 issue
420
- //
421
- // Firefox add extra br tag inside p tag
422
- // var latestPTag = $el.find('p').last();
423
- // if (latestPTag.text().length > 0) {
424
- // latestPTag.find('br').remove();
425
- // }
426
- }
427
- }
428
- });
429
-
430
- // Fix #39
431
- // For some reason Chrome doesn't "select-all", when the last placeholder is visible.
432
- // So it's needed to hide it when the user "selects all", and show it again when they presses any other key.
433
- $el.on('keydown', function (e) {
434
- // Fix Select-all using (ctrl + a) in chrome
435
- if (navigator.userAgent.match(/chrome/i)) {
436
- $el.children().last().removeClass('hide');
437
- if ( (e.ctrlKey || e.metaKey) && e.which === 65) {
438
- e.preventDefault();
439
- if($el.find('p').text().trim().length === 0) {
440
- return false;
441
- }
442
-
443
- $el.children().last().addClass('hide');
444
- return document.execCommand('selectAll', false, null);
445
- }
446
- }
447
- });
448
-
449
- $el.on('click', '.mediumInsert-buttons a.mediumInsert-buttonsShow', function () {
450
- var $options = $(this).siblings('.mediumInsert-buttonsOptions'),
451
- $placeholder = $(this).parent().siblings('.mediumInsert-placeholder');
452
-
453
- if ($(this).hasClass('active')) {
454
- $(this).removeClass('active');
455
- $options.hide();
456
-
457
- $('a', $options).show();
458
- } else {
459
- $(this).addClass('active');
460
- $options.show();
461
-
462
- $('a', $options).each(function () {
463
- var aClass = $(this).attr('class').split('action-')[1],
464
- plugin = aClass.split('-')[0];
465
- if ($('.mediumInsert-'+ plugin, $placeholder).length > 0) {
466
- $('a:not(.action-'+ aClass +')', $options).hide();
467
- }
468
- });
469
- }
470
-
471
- that.deselect();
472
- });
473
-
474
- $el.on('mouseleave', '.mediumInsert', function () {
475
- $('a.mediumInsert-buttonsShow', this).removeClass('active');
476
- $('.mediumInsert-buttonsOptions', this).hide();
477
- });
478
-
479
- $el.on('click', '.mediumInsert-buttons .mediumInsert-action', function (e) {
480
- e.preventDefault();
481
-
482
- var addon = $(this).data('addon'),
483
- action = $(this).data('action'),
484
- $placeholder = $(this).parents('.mediumInsert-buttons').siblings('.mediumInsert-placeholder');
485
-
486
- if (addons[addon] && addons[addon][action]) {
487
- addons[addon][action]($placeholder);
488
- }
489
-
490
- $(this).parents('.mediumInsert').mouseleave();
491
- });
492
- }
493
-
494
- };
495
-
496
- }(jQuery));