xmt_froala 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (203) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +28 -0
  4. data/Rakefile +2 -0
  5. data/app/assets/javascripts/xmt_froala.js +31 -0
  6. data/app/assets/stylesheets/xmt_froala.css +17 -0
  7. data/app/controllers/xmt_froala/application_controller.rb +5 -0
  8. data/app/controllers/xmt_froala/assets_controller.rb +94 -0
  9. data/app/models/xmt_froala/asset_uploader.rb +107 -0
  10. data/app/models/xmt_froala/file_uploader.rb +10 -0
  11. data/app/models/xmt_froala/flash_uploader.rb +10 -0
  12. data/app/models/xmt_froala/image_uploader.rb +10 -0
  13. data/app/models/xmt_froala/media_uploader.rb +10 -0
  14. data/config/routes.rb +6 -0
  15. data/lib/generators/xmt_froala/install/USAGE +10 -0
  16. data/lib/generators/xmt_froala/install/install_generator.rb +23 -0
  17. data/lib/generators/xmt_froala/install/templates/application.js +17 -0
  18. data/lib/generators/xmt_froala/install/templates/xmt_froala.rb +29 -0
  19. data/lib/generators/xmt_froala/migration/USAGE +14 -0
  20. data/lib/generators/xmt_froala/migration/migration_generator.rb +36 -0
  21. data/lib/generators/xmt_froala/migration/templates/migration/migration.rb +18 -0
  22. data/lib/generators/xmt_froala/migration/templates/models/active_record/xmt_froala/asset.rb +14 -0
  23. data/lib/generators/xmt_froala/migration/templates/models/active_record/xmt_froala/file.rb +3 -0
  24. data/lib/generators/xmt_froala/migration/templates/models/active_record/xmt_froala/flash.rb +3 -0
  25. data/lib/generators/xmt_froala/migration/templates/models/active_record/xmt_froala/image.rb +3 -0
  26. data/lib/generators/xmt_froala/migration/templates/models/active_record/xmt_froala/media.rb +3 -0
  27. data/lib/generators/xmt_froala/migration/templates/models/mongoid/xmt_froala/asset.rb +27 -0
  28. data/lib/generators/xmt_froala/migration/templates/models/mongoid/xmt_froala/file.rb +3 -0
  29. data/lib/generators/xmt_froala/migration/templates/models/mongoid/xmt_froala/flash.rb +3 -0
  30. data/lib/generators/xmt_froala/migration/templates/models/mongoid/xmt_froala/image.rb +3 -0
  31. data/lib/generators/xmt_froala/migration/templates/models/mongoid/xmt_froala/media.rb +3 -0
  32. data/lib/tasks/xmt_froala_tasks.rake +9 -0
  33. data/lib/xmt_froala.rb +65 -0
  34. data/lib/xmt_froala/active_record.rb +14 -0
  35. data/lib/xmt_froala/engine.rb +32 -0
  36. data/lib/xmt_froala/formtastic.rb +12 -0
  37. data/lib/xmt_froala/helper.rb +105 -0
  38. data/lib/xmt_froala/simple_form.rb +11 -0
  39. data/lib/xmt_froala/version.rb +3 -0
  40. data/vendor/assets/javascripts/xmt_froala/froala_editor.js +0 -0
  41. data/vendor/assets/javascripts/xmt_froala/languages/ar.js +318 -0
  42. data/vendor/assets/javascripts/xmt_froala/languages/bs.js +318 -0
  43. data/vendor/assets/javascripts/xmt_froala/languages/cs.js +318 -0
  44. data/vendor/assets/javascripts/xmt_froala/languages/da.js +318 -0
  45. data/vendor/assets/javascripts/xmt_froala/languages/de.js +318 -0
  46. data/vendor/assets/javascripts/xmt_froala/languages/en_ca.js +262 -0
  47. data/vendor/assets/javascripts/xmt_froala/languages/en_gb.js +262 -0
  48. data/vendor/assets/javascripts/xmt_froala/languages/es.js +318 -0
  49. data/vendor/assets/javascripts/xmt_froala/languages/et.js +318 -0
  50. data/vendor/assets/javascripts/xmt_froala/languages/fa.js +318 -0
  51. data/vendor/assets/javascripts/xmt_froala/languages/fi.js +318 -0
  52. data/vendor/assets/javascripts/xmt_froala/languages/fr.js +318 -0
  53. data/vendor/assets/javascripts/xmt_froala/languages/he.js +318 -0
  54. data/vendor/assets/javascripts/xmt_froala/languages/hr.js +318 -0
  55. data/vendor/assets/javascripts/xmt_froala/languages/hu.js +318 -0
  56. data/vendor/assets/javascripts/xmt_froala/languages/id.js +319 -0
  57. data/vendor/assets/javascripts/xmt_froala/languages/it.js +318 -0
  58. data/vendor/assets/javascripts/xmt_froala/languages/ja.js +318 -0
  59. data/vendor/assets/javascripts/xmt_froala/languages/ko.js +318 -0
  60. data/vendor/assets/javascripts/xmt_froala/languages/me.js +318 -0
  61. data/vendor/assets/javascripts/xmt_froala/languages/nb.js +318 -0
  62. data/vendor/assets/javascripts/xmt_froala/languages/nl.js +318 -0
  63. data/vendor/assets/javascripts/xmt_froala/languages/pl.js +318 -0
  64. data/vendor/assets/javascripts/xmt_froala/languages/pt_br.js +318 -0
  65. data/vendor/assets/javascripts/xmt_froala/languages/pt_pt.js +318 -0
  66. data/vendor/assets/javascripts/xmt_froala/languages/ro.js +319 -0
  67. data/vendor/assets/javascripts/xmt_froala/languages/ru.js +318 -0
  68. data/vendor/assets/javascripts/xmt_froala/languages/sk.js +318 -0
  69. data/vendor/assets/javascripts/xmt_froala/languages/sr.js +318 -0
  70. data/vendor/assets/javascripts/xmt_froala/languages/sv.js +318 -0
  71. data/vendor/assets/javascripts/xmt_froala/languages/th.js +318 -0
  72. data/vendor/assets/javascripts/xmt_froala/languages/tr.js +318 -0
  73. data/vendor/assets/javascripts/xmt_froala/languages/uk.js +318 -0
  74. data/vendor/assets/javascripts/xmt_froala/languages/vi.js +258 -0
  75. data/vendor/assets/javascripts/xmt_froala/languages/zh_cn.js +320 -0
  76. data/vendor/assets/javascripts/xmt_froala/languages/zh_tw.js +318 -0
  77. data/vendor/assets/javascripts/xmt_froala/plugins/align.js +139 -0
  78. data/vendor/assets/javascripts/xmt_froala/plugins/align.min.js +7 -0
  79. data/vendor/assets/javascripts/xmt_froala/plugins/char_counter.js +154 -0
  80. data/vendor/assets/javascripts/xmt_froala/plugins/char_counter.min.js +7 -0
  81. data/vendor/assets/javascripts/xmt_froala/plugins/code_beautifier.js +3270 -0
  82. data/vendor/assets/javascripts/xmt_froala/plugins/code_beautifier.min.js +7 -0
  83. data/vendor/assets/javascripts/xmt_froala/plugins/code_view.js +393 -0
  84. data/vendor/assets/javascripts/xmt_froala/plugins/code_view.min.js +7 -0
  85. data/vendor/assets/javascripts/xmt_froala/plugins/colors.js +492 -0
  86. data/vendor/assets/javascripts/xmt_froala/plugins/colors.min.js +7 -0
  87. data/vendor/assets/javascripts/xmt_froala/plugins/draggable.js +459 -0
  88. data/vendor/assets/javascripts/xmt_froala/plugins/draggable.min.js +7 -0
  89. data/vendor/assets/javascripts/xmt_froala/plugins/emoticons.js +509 -0
  90. data/vendor/assets/javascripts/xmt_froala/plugins/emoticons.min.js +7 -0
  91. data/vendor/assets/javascripts/xmt_froala/plugins/entities.js +121 -0
  92. data/vendor/assets/javascripts/xmt_froala/plugins/entities.min.js +7 -0
  93. data/vendor/assets/javascripts/xmt_froala/plugins/file.js +736 -0
  94. data/vendor/assets/javascripts/xmt_froala/plugins/file.min.js +239 -0
  95. data/vendor/assets/javascripts/xmt_froala/plugins/font_family.js +182 -0
  96. data/vendor/assets/javascripts/xmt_froala/plugins/font_family.min.js +7 -0
  97. data/vendor/assets/javascripts/xmt_froala/plugins/font_size.js +118 -0
  98. data/vendor/assets/javascripts/xmt_froala/plugins/font_size.min.js +7 -0
  99. data/vendor/assets/javascripts/xmt_froala/plugins/forms.js +430 -0
  100. data/vendor/assets/javascripts/xmt_froala/plugins/forms.min.js +7 -0
  101. data/vendor/assets/javascripts/xmt_froala/plugins/fullscreen.js +274 -0
  102. data/vendor/assets/javascripts/xmt_froala/plugins/fullscreen.min.js +7 -0
  103. data/vendor/assets/javascripts/xmt_froala/plugins/help.js +216 -0
  104. data/vendor/assets/javascripts/xmt_froala/plugins/help.min.js +7 -0
  105. data/vendor/assets/javascripts/xmt_froala/plugins/image.js +3323 -0
  106. data/vendor/assets/javascripts/xmt_froala/plugins/image.min.js +7 -0
  107. data/vendor/assets/javascripts/xmt_froala/plugins/image_manager.js +1056 -0
  108. data/vendor/assets/javascripts/xmt_froala/plugins/image_manager.min.js +7 -0
  109. data/vendor/assets/javascripts/xmt_froala/plugins/inline_style.js +94 -0
  110. data/vendor/assets/javascripts/xmt_froala/plugins/inline_style.min.js +7 -0
  111. data/vendor/assets/javascripts/xmt_froala/plugins/line_breaker.js +537 -0
  112. data/vendor/assets/javascripts/xmt_froala/plugins/line_breaker.min.js +7 -0
  113. data/vendor/assets/javascripts/xmt_froala/plugins/link.js +1157 -0
  114. data/vendor/assets/javascripts/xmt_froala/plugins/link.min.js +7 -0
  115. data/vendor/assets/javascripts/xmt_froala/plugins/lists.js +462 -0
  116. data/vendor/assets/javascripts/xmt_froala/plugins/lists.min.js +7 -0
  117. data/vendor/assets/javascripts/xmt_froala/plugins/paragraph_format.js +290 -0
  118. data/vendor/assets/javascripts/xmt_froala/plugins/paragraph_format.min.js +7 -0
  119. data/vendor/assets/javascripts/xmt_froala/plugins/paragraph_style.js +144 -0
  120. data/vendor/assets/javascripts/xmt_froala/plugins/paragraph_style.min.js +7 -0
  121. data/vendor/assets/javascripts/xmt_froala/plugins/plain_paste.js +96 -0
  122. data/vendor/assets/javascripts/xmt_froala/plugins/print.js +137 -0
  123. data/vendor/assets/javascripts/xmt_froala/plugins/print.min.js +7 -0
  124. data/vendor/assets/javascripts/xmt_froala/plugins/quick_format.js +89 -0
  125. data/vendor/assets/javascripts/xmt_froala/plugins/quick_insert.js +478 -0
  126. data/vendor/assets/javascripts/xmt_froala/plugins/quick_insert.min.js +7 -0
  127. data/vendor/assets/javascripts/xmt_froala/plugins/quote.js +141 -0
  128. data/vendor/assets/javascripts/xmt_froala/plugins/quote.min.js +7 -0
  129. data/vendor/assets/javascripts/xmt_froala/plugins/save.js +189 -0
  130. data/vendor/assets/javascripts/xmt_froala/plugins/save.min.js +7 -0
  131. data/vendor/assets/javascripts/xmt_froala/plugins/special_characters.js +781 -0
  132. data/vendor/assets/javascripts/xmt_froala/plugins/special_characters.min.js +7 -0
  133. data/vendor/assets/javascripts/xmt_froala/plugins/table.js +4194 -0
  134. data/vendor/assets/javascripts/xmt_froala/plugins/table.min.js +7 -0
  135. data/vendor/assets/javascripts/xmt_froala/plugins/url.js +194 -0
  136. data/vendor/assets/javascripts/xmt_froala/plugins/url.min.js +7 -0
  137. data/vendor/assets/javascripts/xmt_froala/plugins/video.js +2342 -0
  138. data/vendor/assets/javascripts/xmt_froala/plugins/video.min.js +7 -0
  139. data/vendor/assets/javascripts/xmt_froala/plugins/word_paste.js +1403 -0
  140. data/vendor/assets/javascripts/xmt_froala/plugins/word_paste.min.js +7 -0
  141. data/vendor/assets/javascripts/xmt_froala/third_party/embedly.js +543 -0
  142. data/vendor/assets/javascripts/xmt_froala/third_party/embedly.min.js +7 -0
  143. data/vendor/assets/javascripts/xmt_froala/third_party/image_aviary.js +163 -0
  144. data/vendor/assets/javascripts/xmt_froala/third_party/image_aviary.min.js +7 -0
  145. data/vendor/assets/javascripts/xmt_froala/third_party/spell_checker.js +222 -0
  146. data/vendor/assets/javascripts/xmt_froala/third_party/spell_checker.min.js +7 -0
  147. data/vendor/assets/javascripts/xmt_froala/xmt_froala.js +15172 -0
  148. data/vendor/assets/stylesheets/xmt_froala/css/font-awesome.css +2546 -0
  149. data/vendor/assets/stylesheets/xmt_froala/css/froala_editor.min.css +7 -0
  150. data/vendor/assets/stylesheets/xmt_froala/css/froala_editor.pkgd.css +2902 -0
  151. data/vendor/assets/stylesheets/xmt_froala/css/froala_editor.pkgd.min.css +7 -0
  152. data/vendor/assets/stylesheets/xmt_froala/css/froala_style.css +413 -0
  153. data/vendor/assets/stylesheets/xmt_froala/css/froala_style.min.css +7 -0
  154. data/vendor/assets/stylesheets/xmt_froala/css/plugins/char_counter.css +57 -0
  155. data/vendor/assets/stylesheets/xmt_froala/css/plugins/char_counter.min.css +7 -0
  156. data/vendor/assets/stylesheets/xmt_froala/css/plugins/code_view.css +112 -0
  157. data/vendor/assets/stylesheets/xmt_froala/css/plugins/code_view.min.css +7 -0
  158. data/vendor/assets/stylesheets/xmt_froala/css/plugins/colors.css +155 -0
  159. data/vendor/assets/stylesheets/xmt_froala/css/plugins/colors.min.css +7 -0
  160. data/vendor/assets/stylesheets/xmt_froala/css/plugins/draggable.css +43 -0
  161. data/vendor/assets/stylesheets/xmt_froala/css/plugins/draggable.min.css +7 -0
  162. data/vendor/assets/stylesheets/xmt_froala/css/plugins/emoticons.css +42 -0
  163. data/vendor/assets/stylesheets/xmt_froala/css/plugins/emoticons.min.css +7 -0
  164. data/vendor/assets/stylesheets/xmt_froala/css/plugins/file.css +146 -0
  165. data/vendor/assets/stylesheets/xmt_froala/css/plugins/file.min.css +7 -0
  166. data/vendor/assets/stylesheets/xmt_froala/css/plugins/fullscreen.css +28 -0
  167. data/vendor/assets/stylesheets/xmt_froala/css/plugins/fullscreen.min.css +7 -0
  168. data/vendor/assets/stylesheets/xmt_froala/css/plugins/help.css +52 -0
  169. data/vendor/assets/stylesheets/xmt_froala/css/plugins/help.min.css +7 -0
  170. data/vendor/assets/stylesheets/xmt_froala/css/plugins/image.css +244 -0
  171. data/vendor/assets/stylesheets/xmt_froala/css/plugins/image.min.css +7 -0
  172. data/vendor/assets/stylesheets/xmt_froala/css/plugins/image_manager.css +266 -0
  173. data/vendor/assets/stylesheets/xmt_froala/css/plugins/image_manager.min.css +7 -0
  174. data/vendor/assets/stylesheets/xmt_froala/css/plugins/line_breaker.css +37 -0
  175. data/vendor/assets/stylesheets/xmt_froala/css/plugins/line_breaker.min.css +7 -0
  176. data/vendor/assets/stylesheets/xmt_froala/css/plugins/quick_insert.css +70 -0
  177. data/vendor/assets/stylesheets/xmt_froala/css/plugins/quick_insert.min.css +7 -0
  178. data/vendor/assets/stylesheets/xmt_froala/css/plugins/special_characters.css +51 -0
  179. data/vendor/assets/stylesheets/xmt_froala/css/plugins/special_characters.min.css +7 -0
  180. data/vendor/assets/stylesheets/xmt_froala/css/plugins/table.css +181 -0
  181. data/vendor/assets/stylesheets/xmt_froala/css/plugins/table.min.css +7 -0
  182. data/vendor/assets/stylesheets/xmt_froala/css/plugins/video.css +231 -0
  183. data/vendor/assets/stylesheets/xmt_froala/css/plugins/video.min.css +7 -0
  184. data/vendor/assets/stylesheets/xmt_froala/css/themes/dark.css +1281 -0
  185. data/vendor/assets/stylesheets/xmt_froala/css/themes/dark.min.css +7 -0
  186. data/vendor/assets/stylesheets/xmt_froala/css/themes/gray.css +1281 -0
  187. data/vendor/assets/stylesheets/xmt_froala/css/themes/gray.min.css +7 -0
  188. data/vendor/assets/stylesheets/xmt_froala/css/themes/red.css +1281 -0
  189. data/vendor/assets/stylesheets/xmt_froala/css/themes/red.min.css +7 -0
  190. data/vendor/assets/stylesheets/xmt_froala/css/themes/royal.css +1281 -0
  191. data/vendor/assets/stylesheets/xmt_froala/css/themes/royal.min.css +7 -0
  192. data/vendor/assets/stylesheets/xmt_froala/css/third_party/embedly.css +64 -0
  193. data/vendor/assets/stylesheets/xmt_froala/css/third_party/embedly.min.css +7 -0
  194. data/vendor/assets/stylesheets/xmt_froala/css/third_party/spell_checker.css +72 -0
  195. data/vendor/assets/stylesheets/xmt_froala/css/third_party/spell_checker.min.css +7 -0
  196. data/vendor/assets/stylesheets/xmt_froala/css/xmt_froala.css +1423 -0
  197. data/vendor/assets/stylesheets/xmt_froala/fonts/FontAwesome.otf +0 -0
  198. data/vendor/assets/stylesheets/xmt_froala/fonts/fontawesome-webfont.eot +0 -0
  199. data/vendor/assets/stylesheets/xmt_froala/fonts/fontawesome-webfont.svg +2671 -0
  200. data/vendor/assets/stylesheets/xmt_froala/fonts/fontawesome-webfont.ttf +0 -0
  201. data/vendor/assets/stylesheets/xmt_froala/fonts/fontawesome-webfont.woff +0 -0
  202. data/vendor/assets/stylesheets/xmt_froala/fonts/fontawesome-webfont.woff2 +0 -0
  203. metadata +273 -0
@@ -0,0 +1,7 @@
1
+ /*!
2
+ * froala_editor v2.8.1 (https://www.froala.com/wysiwyg-editor)
3
+ * License https://froala.com/wysiwyg-editor/terms/
4
+ * Copyright 2014-2018 Froala Labs
5
+ */
6
+
7
+ !function(n){"function"==typeof define&&define.amd?define(["jquery"],n):"object"==typeof module&&module.exports?module.exports=function(e,t){return t===undefined&&(t="undefined"!=typeof window?require("jquery"):require("jquery")(e)),n(t)}:n(window.jQuery)}(function(v){v.extend(v.FE.DEFAULTS,{dragInline:!0}),v.FE.PLUGINS.draggable=function(f){function e(e){return!(!e.originalEvent||!e.originalEvent.target||e.originalEvent.target.nodeType!=Node.TEXT_NODE)||(e.target&&"A"==e.target.tagName&&1==e.target.childNodes.length&&"IMG"==e.target.childNodes[0].tagName&&(e.target=e.target.childNodes[0]),v(e.target).hasClass("fr-draggable")?(f.undo.canDo()||f.undo.saveStep(),f.opts.dragInline?f.$el.attr("contenteditable",!0):f.$el.attr("contenteditable",!1),f.opts.toolbarInline&&f.toolbar.hide(),v(e.target).addClass("fr-dragging"),f.browser.msie||f.browser.edge||f.selection.clear(),void e.originalEvent.dataTransfer.setData("text","Froala")):(e.preventDefault(),!1))}function g(e){return!(e&&("HTML"==e.tagName||"BODY"==e.tagName||f.node.isElement(e)))}function d(e,t,n){f.opts.iframe&&(e+=f.$iframe.offset().top,t+=f.$iframe.offset().left),p.offset().top!=e&&p.css("top",e),p.offset().left!=t&&p.css("left",t),p.width()!=n&&p.css("width",n)}function t(e){e.originalEvent.dataTransfer.dropEffect="move",f.opts.dragInline?function(){for(var e=null,t=0;t<v.FE.INSTANCES.length;t++)if((e=v.FE.INSTANCES[t].$el.find(".fr-dragging")).length)return e.get(0)}()||!f.browser.msie&&!f.browser.edge||e.preventDefault():(e.preventDefault(),function(e){var t=f.doc.elementFromPoint(e.originalEvent.pageX-f.win.pageXOffset,e.originalEvent.pageY-f.win.pageYOffset);if(!g(t)){for(var n=0,r=t;!g(r)&&r==t&&0<e.originalEvent.pageY-f.win.pageYOffset-n;)n++,r=f.doc.elementFromPoint(e.originalEvent.pageX-f.win.pageXOffset,e.originalEvent.pageY-f.win.pageYOffset-n);(!g(r)||p&&0===f.$el.find(r).length&&r!=p.get(0))&&(r=null);for(var a=0,o=t;!g(o)&&o==t&&e.originalEvent.pageY-f.win.pageYOffset+a<v(f.doc).height();)a++,o=f.doc.elementFromPoint(e.originalEvent.pageX-f.win.pageXOffset,e.originalEvent.pageY-f.win.pageYOffset+a);(!g(o)||p&&0===f.$el.find(o).length&&o!=p.get(0))&&(o=null),t=null==o&&r?r:o&&null==r?o:o&&r?n<a?r:o:null}if(v(t).hasClass("fr-drag-helper"))return;if(t&&!f.node.isBlock(t)&&(t=f.node.blockParent(t)),t&&0<=["TD","TH","TR","THEAD","TBODY"].indexOf(t.tagName)&&(t=v(t).parents("table").get(0)),t&&0<=["LI"].indexOf(t.tagName)&&(t=v(t).parents("UL, OL").get(0)),t&&!v(t).hasClass("fr-drag-helper")){var i;p||(v.FE.$draggable_helper||(v.FE.$draggable_helper=v('<div class="fr-drag-helper"></div>')),p=v.FE.$draggable_helper,f.events.on("shared.destroy",function(){p.html("").removeData().remove(),p=null},!0)),i=e.originalEvent.pageY<v(t).offset().top+v(t).outerHeight()/2;var l=v(t),s=0;i||0!==l.next().length?(i||(l=l.next()),"before"==p.data("fr-position")&&l.is(p.data("fr-tag"))||(0<l.prev().length&&(s=parseFloat(l.prev().css("margin-bottom"))||0),s=Math.max(s,parseFloat(l.css("margin-top"))||0),d(l.offset().top-s/2-f.$box.offset().top,l.offset().left-f.win.pageXOffset-f.$box.offset().left,l.width()),p.data("fr-position","before"))):"after"==p.data("fr-position")&&l.is(p.data("fr-tag"))||(s=parseFloat(l.css("margin-bottom"))||0,d(l.offset().top+v(t).height()+s/2-f.$box.offset().top,l.offset().left-f.win.pageXOffset-f.$box.offset().left,l.width()),p.data("fr-position","after")),p.data("fr-tag",l),p.addClass("fr-visible"),p.appendTo(f.$box)}else p&&0<f.$box.find(p).length&&p.removeClass("fr-visible")}(e))}function n(e){e.originalEvent.dataTransfer.dropEffect="move",f.opts.dragInline||e.preventDefault()}function r(e){f.$el.attr("contenteditable",!0);var t=f.$el.find(".fr-dragging");p&&p.hasClass("fr-visible")&&f.$box.find(p).length?a(e):t.length&&(e.preventDefault(),e.stopPropagation()),p&&f.$box.find(p).length&&p.removeClass("fr-visible"),t.removeClass("fr-dragging")}function a(e){for(var t,n,r=0;r<v.FE.INSTANCES.length;r++)if((t=v.FE.INSTANCES[r].$el.find(".fr-dragging")).length){n=v.FE.INSTANCES[r];break}if(t.length){if(e.preventDefault(),e.stopPropagation(),p&&p.hasClass("fr-visible")&&f.$box.find(p).length)p.data("fr-tag")[p.data("fr-position")]('<span class="fr-marker"></span>'),p.removeClass("fr-visible");else if(!1===f.markers.insertAtPoint(e.originalEvent))return!1;if(t.removeClass("fr-dragging"),!1===(t=f.events.chainTrigger("element.beforeDrop",t)))return!1;var a=t;if(t.parent().is("A")&&1==t.parent().get(0).childNodes.length&&(a=t.parent()),f.core.isEmpty())f.events.focus();else f.$el.find(".fr-marker").replaceWith(v.FE.MARKERS),f.selection.restore();if(n==f||f.undo.canDo()||f.undo.saveStep(),f.core.isEmpty())f.$el.html(a);else{var o=f.markers.insert();0===a.find(o).length?v(o).replaceWith(a):0===t.find(o).length&&v(o).replaceWith(t),t.after(v.FE.MARKERS),f.selection.restore()}return f.popups.hideAll(),f.selection.save(),f.$el.find(f.html.emptyBlockTagsQuery()).not("TD, TH, LI, .fr-inner").not(f.opts.htmlAllowedEmptyTags.join(",")).remove(),f.html.wrap(),f.html.fillEmptyBlocks(),f.selection.restore(),f.undo.saveStep(),f.opts.iframe&&f.size.syncIframe(),n!=f&&(n.popups.hideAll(),n.$el.find(n.html.emptyBlockTagsQuery()).not("TD, TH, LI, .fr-inner").remove(),n.html.wrap(),n.html.fillEmptyBlocks(),n.undo.saveStep(),n.events.trigger("element.dropped"),n.opts.iframe&&n.size.syncIframe()),f.events.trigger("element.dropped",[a]),!1}p&&p.removeClass("fr-visible"),f.undo.canDo()||f.undo.saveStep(),setTimeout(function(){f.undo.saveStep()},0)}function o(e){if(e&&"DIV"==e.tagName&&f.node.hasClass(e,"fr-drag-helper"))e.parentNode.removeChild(e);else if(e&&e.nodeType==Node.ELEMENT_NODE)for(var t=e.querySelectorAll("div.fr-drag-helper"),n=0;n<t.length;n++)t[n].parentNode.removeChild(t[n])}var p;return{_init:function(){f.opts.enter==v.FE.ENTER_BR&&(f.opts.dragInline=!0),f.events.on("dragstart",e,!0),f.events.on("dragover",t,!0),f.events.on("dragenter",n,!0),f.events.on("document.dragend",r,!0),f.events.on("document.drop",r,!0),f.events.on("drop",a,!0),f.events.on("html.processGet",o)}}}});
@@ -0,0 +1,509 @@
1
+ /*!
2
+ * froala_editor v2.8.1 (https://www.froala.com/wysiwyg-editor)
3
+ * License https://froala.com/wysiwyg-editor/terms/
4
+ * Copyright 2014-2018 Froala Labs
5
+ */
6
+
7
+ (function (factory) {
8
+ if (typeof define === 'function' && define.amd) {
9
+ // AMD. Register as an anonymous module.
10
+ define(['jquery'], factory);
11
+ } else if (typeof module === 'object' && module.exports) {
12
+ // Node/CommonJS
13
+ module.exports = function( root, jQuery ) {
14
+ if ( jQuery === undefined ) {
15
+ // require('jQuery') returns a factory that requires window to
16
+ // build a jQuery instance, we normalize how we use modules
17
+ // that require this pattern but the window provided is a noop
18
+ // if it's defined (how jquery works)
19
+ if ( typeof window !== 'undefined' ) {
20
+ jQuery = require('jquery');
21
+ }
22
+ else {
23
+ jQuery = require('jquery')(root);
24
+ }
25
+ }
26
+ return factory(jQuery);
27
+ };
28
+ } else {
29
+ // Browser globals
30
+ factory(window.jQuery);
31
+ }
32
+ }(function ($) {
33
+
34
+
35
+
36
+ $.extend($.FE.POPUP_TEMPLATES, {
37
+ emoticons: '[_BUTTONS_][_EMOTICONS_]'
38
+ })
39
+
40
+ // Extend defaults.
41
+ $.extend($.FE.DEFAULTS, {
42
+ emoticonsStep: 8,
43
+ emoticonsSet: [
44
+ { code: '1f600', desc: 'Grinning face' },
45
+ { code: '1f601', desc: 'Grinning face with smiling eyes' },
46
+ { code: '1f602', desc: 'Face with tears of joy' },
47
+ { code: '1f603', desc: 'Smiling face with open mouth' },
48
+ { code: '1f604', desc: 'Smiling face with open mouth and smiling eyes' },
49
+ { code: '1f605', desc: 'Smiling face with open mouth and cold sweat' },
50
+ { code: '1f606', desc: 'Smiling face with open mouth and tightly-closed eyes' },
51
+ { code: '1f607', desc: 'Smiling face with halo' },
52
+
53
+ { code: '1f608', desc: 'Smiling face with horns' },
54
+ { code: '1f609', desc: 'Winking face' },
55
+ { code: '1f60a', desc: 'Smiling face with smiling eyes' },
56
+ { code: '1f60b', desc: 'Face savoring delicious food' },
57
+ { code: '1f60c', desc: 'Relieved face' },
58
+ { code: '1f60d', desc: 'Smiling face with heart-shaped eyes' },
59
+ { code: '1f60e', desc: 'Smiling face with sunglasses' },
60
+ { code: '1f60f', desc: 'Smirking face' },
61
+
62
+ { code: '1f610', desc: 'Neutral face' },
63
+ { code: '1f611', desc: 'Expressionless face' },
64
+ { code: '1f612', desc: 'Unamused face' },
65
+ { code: '1f613', desc: 'Face with cold sweat' },
66
+ { code: '1f614', desc: 'Pensive face' },
67
+ { code: '1f615', desc: 'Confused face' },
68
+ { code: '1f616', desc: 'Confounded face' },
69
+ { code: '1f617', desc: 'Kissing face' },
70
+
71
+ { code: '1f618', desc: 'Face throwing a kiss' },
72
+ { code: '1f619', desc: 'Kissing face with smiling eyes' },
73
+ { code: '1f61a', desc: 'Kissing face with closed eyes' },
74
+ { code: '1f61b', desc: 'Face with stuck out tongue' },
75
+ { code: '1f61c', desc: 'Face with stuck out tongue and winking eye' },
76
+ { code: '1f61d', desc: 'Face with stuck out tongue and tightly-closed eyes' },
77
+ { code: '1f61e', desc: 'Disappointed face' },
78
+ { code: '1f61f', desc: 'Worried face' },
79
+
80
+ { code: '1f620', desc: 'Angry face' },
81
+ { code: '1f621', desc: 'Pouting face' },
82
+ { code: '1f622', desc: 'Crying face' },
83
+ { code: '1f623', desc: 'Persevering face' },
84
+ { code: '1f624', desc: 'Face with look of triumph' },
85
+ { code: '1f625', desc: 'Disappointed but relieved face' },
86
+ { code: '1f626', desc: 'Frowning face with open mouth' },
87
+ { code: '1f627', desc: 'Anguished face' },
88
+
89
+ { code: '1f628', desc: 'Fearful face' },
90
+ { code: '1f629', desc: 'Weary face' },
91
+ { code: '1f62a', desc: 'Sleepy face' },
92
+ { code: '1f62b', desc: 'Tired face' },
93
+ { code: '1f62c', desc: 'Grimacing face' },
94
+ { code: '1f62d', desc: 'Loudly crying face' },
95
+ { code: '1f62e', desc: 'Face with open mouth' },
96
+ { code: '1f62f', desc: 'Hushed face' },
97
+
98
+ { code: '1f630', desc: 'Face with open mouth and cold sweat' },
99
+ { code: '1f631', desc: 'Face screaming in fear' },
100
+ { code: '1f632', desc: 'Astonished face' },
101
+ { code: '1f633', desc: 'Flushed face' },
102
+ { code: '1f634', desc: 'Sleeping face' },
103
+ { code: '1f635', desc: 'Dizzy face' },
104
+ { code: '1f636', desc: 'Face without mouth' },
105
+ { code: '1f637', desc: 'Face with medical mask' }
106
+ ],
107
+ emoticonsButtons: ['emoticonsBack', '|'],
108
+ emoticonsUseImage: true
109
+ });
110
+
111
+ $.FE.PLUGINS.emoticons = function (editor) {
112
+ /*
113
+ * Show the emoticons popup.
114
+ */
115
+ function _showEmoticonsPopup () {
116
+ var $btn = editor.$tb.find('.fr-command[data-cmd="emoticons"]');
117
+
118
+ var $popup = editor.popups.get('emoticons');
119
+
120
+ if (!$popup) $popup = _initEmoticonsPopup();
121
+
122
+ if (!$popup.hasClass('fr-active')) {
123
+
124
+ // Emoticons popup.
125
+ editor.popups.refresh('emoticons');
126
+ editor.popups.setContainer('emoticons', editor.$tb);
127
+
128
+ // Emoticons popup left and top position.
129
+ var left = $btn.offset().left + $btn.outerWidth() / 2;
130
+ var top = $btn.offset().top + (editor.opts.toolbarBottom ? 10 : $btn.outerHeight() - 10);
131
+
132
+ editor.popups.show('emoticons', left, top, $btn.outerHeight());
133
+ }
134
+ }
135
+
136
+ /*
137
+ * Hide emoticons popup.
138
+ */
139
+ function _hideEmoticonsPopup () {
140
+
141
+ // Hide popup.
142
+ editor.popups.hide('emoticons');
143
+ }
144
+
145
+ /**
146
+ * Init the emoticons popup.
147
+ */
148
+ function _initEmoticonsPopup () {
149
+ var emoticons_buttons = '';
150
+
151
+ if (editor.opts.toolbarInline) {
152
+
153
+ // Emoticons buttons.
154
+ if (editor.opts.emoticonsButtons.length > 0) {
155
+ emoticons_buttons = '<div class="fr-buttons fr-emoticons-buttons">' + editor.button.buildList(editor.opts.emoticonsButtons) + '</div>';
156
+ }
157
+ }
158
+
159
+ var template = {
160
+ buttons: emoticons_buttons,
161
+ emoticons: _emoticonsHTML()
162
+ };
163
+
164
+ // Create popup.
165
+ var $popup = editor.popups.create('emoticons', template);
166
+
167
+ // Assing tooltips to buttons.
168
+ editor.tooltip.bind($popup, '.fr-emoticon');
169
+
170
+ _addAccessibility($popup);
171
+
172
+ return $popup;
173
+ }
174
+
175
+ function _inEmoticon () {
176
+ if (!editor.selection.isCollapsed()) return false;
177
+
178
+ var s_el = editor.selection.element();
179
+ var e_el = editor.selection.endElement();
180
+
181
+ if (s_el && editor.node.hasClass(s_el, 'fr-emoticon')) return s_el;
182
+
183
+ if (e_el && editor.node.hasClass(e_el, 'fr-emoticon')) return e_el;
184
+
185
+ var range = editor.selection.ranges(0);
186
+ var container = range.startContainer;
187
+
188
+ if (container.nodeType == Node.ELEMENT_NODE) {
189
+
190
+ if (container.childNodes.length > 0 && range.startOffset > 0) {
191
+ var node = container.childNodes[range.startOffset - 1];
192
+
193
+ if (editor.node.hasClass(node, 'fr-emoticon')) {
194
+
195
+ return node;
196
+ }
197
+ }
198
+ }
199
+
200
+ return false;
201
+ }
202
+
203
+ /*
204
+ * HTML for the emoticons popup.
205
+ */
206
+ function _emoticonsHTML () {
207
+
208
+ // Create emoticons html.
209
+ var emoticons_html = '<div style="text-align: center">';
210
+
211
+ // Add emoticons.
212
+ for (var i = 0; i < editor.opts.emoticonsSet.length; i++) {
213
+ if (i !== 0 && i % editor.opts.emoticonsStep === 0) {
214
+ emoticons_html += '<br>';
215
+ }
216
+
217
+ emoticons_html += '<span class="fr-command fr-emoticon" tabIndex="-1" data-cmd="insertEmoticon" title="' + editor.language.translate(editor.opts.emoticonsSet[i].desc) + '" role="button" data-param1="' + editor.opts.emoticonsSet[i].code + '">' + (editor.opts.emoticonsUseImage ? '<img src="' + 'https://cdnjs.cloudflare.com/ajax/libs/emojione/2.0.1/assets/svg/' + editor.opts.emoticonsSet[i].code + '.svg' + '"/>' : '&#x' + editor.opts.emoticonsSet[i].code + ';') + '<span class="fr-sr-only">' + editor.language.translate(editor.opts.emoticonsSet[i].desc) + '&nbsp;&nbsp;&nbsp;</span></span>';
218
+ }
219
+
220
+ if (editor.opts.emoticonsUseImage) emoticons_html += '<p style="font-size: 12px; text-align: center; padding: 0 5px;">Emoji free by <a class="fr-link" tabIndex="-1" href="http://emojione.com/" target="_blank" rel="nofollow" role="link" aria-label="Open Emoji One website.">Emoji One</a></p>';
221
+ emoticons_html += '</div>';
222
+
223
+ return emoticons_html;
224
+ }
225
+
226
+ /*
227
+ * Register keyboard events.
228
+ */
229
+ function _addAccessibility ($popup) {
230
+
231
+ // Register popup event.
232
+ editor.events.on('popup.tab', function (e) {
233
+ var $focused_item = $(e.currentTarget);
234
+
235
+ // Skip if popup is not visible or focus is elsewere.
236
+ if (!editor.popups.isVisible('emoticons') || !$focused_item.is('span, a')) {
237
+ return true;
238
+ }
239
+
240
+ var key_code = e.which;
241
+ var status;
242
+ var index;
243
+ var $el;
244
+
245
+ // Tabbing.
246
+ if ($.FE.KEYCODE.TAB == key_code) {
247
+
248
+ // Extremities reached.
249
+ if (($focused_item.is('span.fr-emoticon') && e.shiftKey) || ($focused_item.is('a') && !e.shiftKey)) {
250
+ var $tb = $popup.find('.fr-buttons');
251
+
252
+ // Focus back the popup's toolbar if exists.
253
+ status = !editor.accessibility.focusToolbar($tb, (e.shiftKey ? true : false));
254
+ }
255
+
256
+ if (status !== false) {
257
+
258
+ // Build elements that should be focused next.
259
+ var $tabElements = $popup.find('span.fr-emoticon:focus:first, span.fr-emoticon:visible:first, a');
260
+
261
+ if ($focused_item.is('span.fr-emoticon')) {
262
+ $tabElements = $tabElements.not('span.fr-emoticon:not(:focus)');
263
+ }
264
+
265
+ // Get focused item position.
266
+ index = $tabElements.index($focused_item);
267
+
268
+ // Backwards.
269
+ if (e.shiftKey) {
270
+ index = (((index - 1) % $tabElements.length) + $tabElements.length) % $tabElements.length;
271
+
272
+ // Javascript negative modulo bug.
273
+ // Forward.
274
+ }
275
+ else {
276
+ index = (index + 1) % $tabElements.length;
277
+ }
278
+
279
+ // Find next element to focus.
280
+ $el = $tabElements.get(index);
281
+
282
+ editor.events.disableBlur();
283
+ $el.focus();
284
+ status = false;
285
+ }
286
+ }
287
+
288
+ // Arrows.
289
+ else if ($.FE.KEYCODE.ARROW_UP == key_code || $.FE.KEYCODE.ARROW_DOWN == key_code || $.FE.KEYCODE.ARROW_LEFT == key_code || $.FE.KEYCODE.ARROW_RIGHT == key_code) {
290
+ if ($focused_item.is('span.fr-emoticon')) {
291
+
292
+ // Get all current emoticons.
293
+ var $emoticons = $focused_item.parent().find('span.fr-emoticon');
294
+
295
+ // Get focused item position.
296
+ index = $emoticons.index($focused_item);
297
+
298
+ // Get emoticons matrix dimensions.
299
+ var columns = editor.opts.emoticonsStep;
300
+ var lines = Math.floor($emoticons.length / columns);
301
+
302
+ // Get focused item coordinates.
303
+ var column = index % columns;
304
+ var line = Math.floor(index / columns);
305
+
306
+ var nextIndex = line * columns + column;
307
+ var dimension = lines * columns;
308
+
309
+ // Calculate next index. Go to the other opposite site of the matrix if there is no next adjacent element.
310
+ // Up/Down: Traverse matrix lines.
311
+ // Left/Right: Traverse the matrix as it is a vector.
312
+ if ($.FE.KEYCODE.ARROW_UP == key_code) {
313
+ nextIndex = (((nextIndex - columns) % dimension) + dimension) % dimension; // Javascript negative modulo bug.
314
+ }
315
+ else if ($.FE.KEYCODE.ARROW_DOWN == key_code) {
316
+ nextIndex = (nextIndex + columns) % dimension;
317
+ }
318
+ else if ($.FE.KEYCODE.ARROW_LEFT == key_code) {
319
+ nextIndex = (((nextIndex - 1) % dimension) + dimension) % dimension; // Javascript negative modulo bug.
320
+ }
321
+ else if ($.FE.KEYCODE.ARROW_RIGHT == key_code) {
322
+ nextIndex = (nextIndex + 1) % dimension;
323
+ }
324
+
325
+ // Get the next element based on the new index.
326
+ $el = $($emoticons.get(nextIndex));
327
+
328
+ // Focus.
329
+ editor.events.disableBlur();
330
+ $el.focus();
331
+
332
+ status = false;
333
+ }
334
+ }
335
+
336
+ // ENTER or SPACE.
337
+ else if ($.FE.KEYCODE.ENTER == key_code) {
338
+ if ($focused_item.is('a')) {
339
+ $focused_item[0].click();
340
+ }
341
+ else {
342
+ editor.button.exec($focused_item);
343
+ }
344
+ status = false;
345
+ }
346
+
347
+ // Prevent propagation.
348
+ if (status === false) {
349
+ e.preventDefault();
350
+ e.stopPropagation();
351
+ }
352
+
353
+ return status;
354
+ }, true);
355
+ }
356
+
357
+ /*
358
+ * Insert emoticon.
359
+ */
360
+ function insert (emoticon, img) {
361
+
362
+ // Insert emoticon.
363
+ var el = _inEmoticon();
364
+ var range = editor.selection.ranges(0);
365
+
366
+ if (!el) {
367
+ editor.html.insert('<span class="fr-emoticon fr-deletable' + (img ? ' fr-emoticon-img' : '') + '"' + (img ? ' style="background: url(' + img + ');"' : '') + '>' + (img ? '&nbsp;' : emoticon) + '</span>' + '&nbsp;', true);
368
+
369
+ }
370
+ else {
371
+
372
+ if (range.startOffset === 0 && editor.selection.element() === el) {
373
+ $(el).before($.FE.MARKERS + $.FE.INVISIBLE_SPACE);
374
+ }
375
+ else if (range.startOffset > 0 && editor.selection.element() === el && range.commonAncestorContainer.parentNode.classList.contains('fr-emoticon')) {
376
+
377
+ // Inside emoticon move out side of it.
378
+ $(el).after($.FE.INVISIBLE_SPACE + $.FE.MARKERS);
379
+ }
380
+ editor.selection.restore();
381
+ editor.html.insert('<span class="fr-emoticon fr-deletable' + (img ? ' fr-emoticon-img' : '') + '"' + (img ? ' style="background: url(' + img + ');"' : '') + '>' + (img ? '&nbsp;' : emoticon) + '</span>' + '&nbsp;' + $.FE.MARKERS, true);
382
+ }
383
+ }
384
+
385
+ /*
386
+ * Go back to the inline editor.
387
+ */
388
+ function back () {
389
+ editor.popups.hide('emoticons');
390
+ editor.toolbar.showInline();
391
+ }
392
+
393
+ /*
394
+ * Init emoticons.
395
+ */
396
+ function _init () {
397
+ var setDeletable = function () {
398
+ var emtcs = editor.el.querySelectorAll('.fr-emoticon:not(.fr-deletable)');
399
+
400
+ for (var i = 0; i < emtcs.length; i++) {
401
+ emtcs[i].className += ' fr-deletable';
402
+ }
403
+ }
404
+ setDeletable();
405
+
406
+ editor.events.on('html.set', setDeletable);
407
+
408
+ editor.events.on('keydown', function (e) {
409
+ if (editor.keys.isCharacter(e.which) && editor.selection.inEditor()) {
410
+ var range = editor.selection.ranges(0);
411
+ var el = _inEmoticon();
412
+
413
+ if (editor.node.hasClass(el, 'fr-emoticon-img')) {
414
+
415
+ if (el) {
416
+
417
+ if (range.startOffset === 0 && editor.selection.element() === el) {
418
+ $(el).before($.FE.MARKERS + $.FE.INVISIBLE_SPACE);
419
+ }
420
+ else {
421
+ $(el).after($.FE.INVISIBLE_SPACE + $.FE.MARKERS);
422
+ }
423
+ editor.selection.restore();
424
+ }
425
+ }
426
+ }
427
+ });
428
+
429
+ editor.events.on('keyup', function (e) {
430
+ var emtcs = editor.el.querySelectorAll('.fr-emoticon');
431
+
432
+ for (var i = 0; i < emtcs.length; i++) {
433
+ if (typeof emtcs[i].textContent != 'undefined' && emtcs[i].textContent.replace(/\u200B/gi, '').length === 0) {
434
+ $(emtcs[i]).remove();
435
+ }
436
+ }
437
+
438
+ if (!(e.which >= $.FE.KEYCODE.ARROW_LEFT && e.which <= $.FE.KEYCODE.ARROW_DOWN)) {
439
+ var el = _inEmoticon();
440
+
441
+ if (editor.node.hasClass(el, 'fr-emoticon-img')) {
442
+ $(el).append($.FE.MARKERS);
443
+ editor.selection.restore();
444
+ }
445
+ }
446
+ });
447
+ }
448
+
449
+ return {
450
+ _init: _init,
451
+ insert: insert,
452
+ showEmoticonsPopup: _showEmoticonsPopup,
453
+ hideEmoticonsPopup: _hideEmoticonsPopup,
454
+ back: back
455
+ }
456
+ }
457
+
458
+ // Toolbar emoticons button.
459
+ $.FE.DefineIcon('emoticons', {
460
+ NAME: 'smile-o',
461
+ FA5NAME: 'smile'
462
+ });
463
+ $.FE.RegisterCommand('emoticons', {
464
+ title: 'Emoticons',
465
+ undo: false,
466
+ focus: true,
467
+ refreshOnCallback: false,
468
+ popup: true,
469
+ callback: function () {
470
+ if (!this.popups.isVisible('emoticons')) {
471
+ this.emoticons.showEmoticonsPopup();
472
+ }
473
+ else {
474
+ if (this.$el.find('.fr-marker').length) {
475
+ this.events.disableBlur();
476
+ this.selection.restore();
477
+ }
478
+ this.popups.hide('emoticons');
479
+ }
480
+ },
481
+ plugin: 'emoticons'
482
+ });
483
+
484
+ // Insert emoticon command.
485
+ $.FE.RegisterCommand('insertEmoticon', {
486
+ callback: function (cmd, code) {
487
+
488
+ // Insert emoticon.
489
+ this.emoticons.insert('&#x' + code + ';', this.opts.emoticonsUseImage ? 'https://cdnjs.cloudflare.com/ajax/libs/emojione/2.0.1/assets/svg/' + code + '.svg' : null);
490
+
491
+ // Hide emoticons popup.
492
+ this.emoticons.hideEmoticonsPopup();
493
+ }
494
+ });
495
+
496
+ // Emoticons back.
497
+ $.FE.DefineIcon('emoticonsBack', { NAME: 'arrow-left' });
498
+ $.FE.RegisterCommand('emoticonsBack', {
499
+ title: 'Back',
500
+ undo: false,
501
+ focus: false,
502
+ back: true,
503
+ refreshAfterCallback: false,
504
+ callback: function () {
505
+ this.emoticons.back();
506
+ }
507
+ });
508
+
509
+ }));