xmt_froala 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +28 -0
- data/Rakefile +2 -0
- data/app/assets/javascripts/xmt_froala.js +31 -0
- data/app/assets/stylesheets/xmt_froala.css +17 -0
- data/app/controllers/xmt_froala/application_controller.rb +5 -0
- data/app/controllers/xmt_froala/assets_controller.rb +94 -0
- data/app/models/xmt_froala/asset_uploader.rb +107 -0
- data/app/models/xmt_froala/file_uploader.rb +10 -0
- data/app/models/xmt_froala/flash_uploader.rb +10 -0
- data/app/models/xmt_froala/image_uploader.rb +10 -0
- data/app/models/xmt_froala/media_uploader.rb +10 -0
- data/config/routes.rb +6 -0
- data/lib/generators/xmt_froala/install/USAGE +10 -0
- data/lib/generators/xmt_froala/install/install_generator.rb +23 -0
- data/lib/generators/xmt_froala/install/templates/application.js +17 -0
- data/lib/generators/xmt_froala/install/templates/xmt_froala.rb +29 -0
- data/lib/generators/xmt_froala/migration/USAGE +14 -0
- data/lib/generators/xmt_froala/migration/migration_generator.rb +36 -0
- data/lib/generators/xmt_froala/migration/templates/migration/migration.rb +18 -0
- data/lib/generators/xmt_froala/migration/templates/models/active_record/xmt_froala/asset.rb +14 -0
- data/lib/generators/xmt_froala/migration/templates/models/active_record/xmt_froala/file.rb +3 -0
- data/lib/generators/xmt_froala/migration/templates/models/active_record/xmt_froala/flash.rb +3 -0
- data/lib/generators/xmt_froala/migration/templates/models/active_record/xmt_froala/image.rb +3 -0
- data/lib/generators/xmt_froala/migration/templates/models/active_record/xmt_froala/media.rb +3 -0
- data/lib/generators/xmt_froala/migration/templates/models/mongoid/xmt_froala/asset.rb +27 -0
- data/lib/generators/xmt_froala/migration/templates/models/mongoid/xmt_froala/file.rb +3 -0
- data/lib/generators/xmt_froala/migration/templates/models/mongoid/xmt_froala/flash.rb +3 -0
- data/lib/generators/xmt_froala/migration/templates/models/mongoid/xmt_froala/image.rb +3 -0
- data/lib/generators/xmt_froala/migration/templates/models/mongoid/xmt_froala/media.rb +3 -0
- data/lib/tasks/xmt_froala_tasks.rake +9 -0
- data/lib/xmt_froala.rb +65 -0
- data/lib/xmt_froala/active_record.rb +14 -0
- data/lib/xmt_froala/engine.rb +32 -0
- data/lib/xmt_froala/formtastic.rb +12 -0
- data/lib/xmt_froala/helper.rb +105 -0
- data/lib/xmt_froala/simple_form.rb +11 -0
- data/lib/xmt_froala/version.rb +3 -0
- data/vendor/assets/javascripts/xmt_froala/froala_editor.js +0 -0
- data/vendor/assets/javascripts/xmt_froala/languages/ar.js +318 -0
- data/vendor/assets/javascripts/xmt_froala/languages/bs.js +318 -0
- data/vendor/assets/javascripts/xmt_froala/languages/cs.js +318 -0
- data/vendor/assets/javascripts/xmt_froala/languages/da.js +318 -0
- data/vendor/assets/javascripts/xmt_froala/languages/de.js +318 -0
- data/vendor/assets/javascripts/xmt_froala/languages/en_ca.js +262 -0
- data/vendor/assets/javascripts/xmt_froala/languages/en_gb.js +262 -0
- data/vendor/assets/javascripts/xmt_froala/languages/es.js +318 -0
- data/vendor/assets/javascripts/xmt_froala/languages/et.js +318 -0
- data/vendor/assets/javascripts/xmt_froala/languages/fa.js +318 -0
- data/vendor/assets/javascripts/xmt_froala/languages/fi.js +318 -0
- data/vendor/assets/javascripts/xmt_froala/languages/fr.js +318 -0
- data/vendor/assets/javascripts/xmt_froala/languages/he.js +318 -0
- data/vendor/assets/javascripts/xmt_froala/languages/hr.js +318 -0
- data/vendor/assets/javascripts/xmt_froala/languages/hu.js +318 -0
- data/vendor/assets/javascripts/xmt_froala/languages/id.js +319 -0
- data/vendor/assets/javascripts/xmt_froala/languages/it.js +318 -0
- data/vendor/assets/javascripts/xmt_froala/languages/ja.js +318 -0
- data/vendor/assets/javascripts/xmt_froala/languages/ko.js +318 -0
- data/vendor/assets/javascripts/xmt_froala/languages/me.js +318 -0
- data/vendor/assets/javascripts/xmt_froala/languages/nb.js +318 -0
- data/vendor/assets/javascripts/xmt_froala/languages/nl.js +318 -0
- data/vendor/assets/javascripts/xmt_froala/languages/pl.js +318 -0
- data/vendor/assets/javascripts/xmt_froala/languages/pt_br.js +318 -0
- data/vendor/assets/javascripts/xmt_froala/languages/pt_pt.js +318 -0
- data/vendor/assets/javascripts/xmt_froala/languages/ro.js +319 -0
- data/vendor/assets/javascripts/xmt_froala/languages/ru.js +318 -0
- data/vendor/assets/javascripts/xmt_froala/languages/sk.js +318 -0
- data/vendor/assets/javascripts/xmt_froala/languages/sr.js +318 -0
- data/vendor/assets/javascripts/xmt_froala/languages/sv.js +318 -0
- data/vendor/assets/javascripts/xmt_froala/languages/th.js +318 -0
- data/vendor/assets/javascripts/xmt_froala/languages/tr.js +318 -0
- data/vendor/assets/javascripts/xmt_froala/languages/uk.js +318 -0
- data/vendor/assets/javascripts/xmt_froala/languages/vi.js +258 -0
- data/vendor/assets/javascripts/xmt_froala/languages/zh_cn.js +320 -0
- data/vendor/assets/javascripts/xmt_froala/languages/zh_tw.js +318 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/align.js +139 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/align.min.js +7 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/char_counter.js +154 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/char_counter.min.js +7 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/code_beautifier.js +3270 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/code_beautifier.min.js +7 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/code_view.js +393 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/code_view.min.js +7 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/colors.js +492 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/colors.min.js +7 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/draggable.js +459 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/draggable.min.js +7 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/emoticons.js +509 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/emoticons.min.js +7 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/entities.js +121 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/entities.min.js +7 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/file.js +736 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/file.min.js +239 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/font_family.js +182 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/font_family.min.js +7 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/font_size.js +118 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/font_size.min.js +7 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/forms.js +430 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/forms.min.js +7 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/fullscreen.js +274 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/fullscreen.min.js +7 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/help.js +216 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/help.min.js +7 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/image.js +3323 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/image.min.js +7 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/image_manager.js +1056 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/image_manager.min.js +7 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/inline_style.js +94 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/inline_style.min.js +7 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/line_breaker.js +537 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/line_breaker.min.js +7 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/link.js +1157 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/link.min.js +7 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/lists.js +462 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/lists.min.js +7 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/paragraph_format.js +290 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/paragraph_format.min.js +7 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/paragraph_style.js +144 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/paragraph_style.min.js +7 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/plain_paste.js +96 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/print.js +137 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/print.min.js +7 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/quick_format.js +89 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/quick_insert.js +478 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/quick_insert.min.js +7 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/quote.js +141 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/quote.min.js +7 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/save.js +189 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/save.min.js +7 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/special_characters.js +781 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/special_characters.min.js +7 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/table.js +4194 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/table.min.js +7 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/url.js +194 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/url.min.js +7 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/video.js +2342 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/video.min.js +7 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/word_paste.js +1403 -0
- data/vendor/assets/javascripts/xmt_froala/plugins/word_paste.min.js +7 -0
- data/vendor/assets/javascripts/xmt_froala/third_party/embedly.js +543 -0
- data/vendor/assets/javascripts/xmt_froala/third_party/embedly.min.js +7 -0
- data/vendor/assets/javascripts/xmt_froala/third_party/image_aviary.js +163 -0
- data/vendor/assets/javascripts/xmt_froala/third_party/image_aviary.min.js +7 -0
- data/vendor/assets/javascripts/xmt_froala/third_party/spell_checker.js +222 -0
- data/vendor/assets/javascripts/xmt_froala/third_party/spell_checker.min.js +7 -0
- data/vendor/assets/javascripts/xmt_froala/xmt_froala.js +15172 -0
- data/vendor/assets/stylesheets/xmt_froala/css/font-awesome.css +2546 -0
- data/vendor/assets/stylesheets/xmt_froala/css/froala_editor.min.css +7 -0
- data/vendor/assets/stylesheets/xmt_froala/css/froala_editor.pkgd.css +2902 -0
- data/vendor/assets/stylesheets/xmt_froala/css/froala_editor.pkgd.min.css +7 -0
- data/vendor/assets/stylesheets/xmt_froala/css/froala_style.css +413 -0
- data/vendor/assets/stylesheets/xmt_froala/css/froala_style.min.css +7 -0
- data/vendor/assets/stylesheets/xmt_froala/css/plugins/char_counter.css +57 -0
- data/vendor/assets/stylesheets/xmt_froala/css/plugins/char_counter.min.css +7 -0
- data/vendor/assets/stylesheets/xmt_froala/css/plugins/code_view.css +112 -0
- data/vendor/assets/stylesheets/xmt_froala/css/plugins/code_view.min.css +7 -0
- data/vendor/assets/stylesheets/xmt_froala/css/plugins/colors.css +155 -0
- data/vendor/assets/stylesheets/xmt_froala/css/plugins/colors.min.css +7 -0
- data/vendor/assets/stylesheets/xmt_froala/css/plugins/draggable.css +43 -0
- data/vendor/assets/stylesheets/xmt_froala/css/plugins/draggable.min.css +7 -0
- data/vendor/assets/stylesheets/xmt_froala/css/plugins/emoticons.css +42 -0
- data/vendor/assets/stylesheets/xmt_froala/css/plugins/emoticons.min.css +7 -0
- data/vendor/assets/stylesheets/xmt_froala/css/plugins/file.css +146 -0
- data/vendor/assets/stylesheets/xmt_froala/css/plugins/file.min.css +7 -0
- data/vendor/assets/stylesheets/xmt_froala/css/plugins/fullscreen.css +28 -0
- data/vendor/assets/stylesheets/xmt_froala/css/plugins/fullscreen.min.css +7 -0
- data/vendor/assets/stylesheets/xmt_froala/css/plugins/help.css +52 -0
- data/vendor/assets/stylesheets/xmt_froala/css/plugins/help.min.css +7 -0
- data/vendor/assets/stylesheets/xmt_froala/css/plugins/image.css +244 -0
- data/vendor/assets/stylesheets/xmt_froala/css/plugins/image.min.css +7 -0
- data/vendor/assets/stylesheets/xmt_froala/css/plugins/image_manager.css +266 -0
- data/vendor/assets/stylesheets/xmt_froala/css/plugins/image_manager.min.css +7 -0
- data/vendor/assets/stylesheets/xmt_froala/css/plugins/line_breaker.css +37 -0
- data/vendor/assets/stylesheets/xmt_froala/css/plugins/line_breaker.min.css +7 -0
- data/vendor/assets/stylesheets/xmt_froala/css/plugins/quick_insert.css +70 -0
- data/vendor/assets/stylesheets/xmt_froala/css/plugins/quick_insert.min.css +7 -0
- data/vendor/assets/stylesheets/xmt_froala/css/plugins/special_characters.css +51 -0
- data/vendor/assets/stylesheets/xmt_froala/css/plugins/special_characters.min.css +7 -0
- data/vendor/assets/stylesheets/xmt_froala/css/plugins/table.css +181 -0
- data/vendor/assets/stylesheets/xmt_froala/css/plugins/table.min.css +7 -0
- data/vendor/assets/stylesheets/xmt_froala/css/plugins/video.css +231 -0
- data/vendor/assets/stylesheets/xmt_froala/css/plugins/video.min.css +7 -0
- data/vendor/assets/stylesheets/xmt_froala/css/themes/dark.css +1281 -0
- data/vendor/assets/stylesheets/xmt_froala/css/themes/dark.min.css +7 -0
- data/vendor/assets/stylesheets/xmt_froala/css/themes/gray.css +1281 -0
- data/vendor/assets/stylesheets/xmt_froala/css/themes/gray.min.css +7 -0
- data/vendor/assets/stylesheets/xmt_froala/css/themes/red.css +1281 -0
- data/vendor/assets/stylesheets/xmt_froala/css/themes/red.min.css +7 -0
- data/vendor/assets/stylesheets/xmt_froala/css/themes/royal.css +1281 -0
- data/vendor/assets/stylesheets/xmt_froala/css/themes/royal.min.css +7 -0
- data/vendor/assets/stylesheets/xmt_froala/css/third_party/embedly.css +64 -0
- data/vendor/assets/stylesheets/xmt_froala/css/third_party/embedly.min.css +7 -0
- data/vendor/assets/stylesheets/xmt_froala/css/third_party/spell_checker.css +72 -0
- data/vendor/assets/stylesheets/xmt_froala/css/third_party/spell_checker.min.css +7 -0
- data/vendor/assets/stylesheets/xmt_froala/css/xmt_froala.css +1423 -0
- data/vendor/assets/stylesheets/xmt_froala/fonts/FontAwesome.otf +0 -0
- data/vendor/assets/stylesheets/xmt_froala/fonts/fontawesome-webfont.eot +0 -0
- data/vendor/assets/stylesheets/xmt_froala/fonts/fontawesome-webfont.svg +2671 -0
- data/vendor/assets/stylesheets/xmt_froala/fonts/fontawesome-webfont.ttf +0 -0
- data/vendor/assets/stylesheets/xmt_froala/fonts/fontawesome-webfont.woff +0 -0
- data/vendor/assets/stylesheets/xmt_froala/fonts/fontawesome-webfont.woff2 +0 -0
- 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(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&module.exports?module.exports=function(e,a){return a===undefined&&(a="undefined"!=typeof window?require("jquery"):require("jquery")(e)),t(a)}:t(window.jQuery)}(function(O){if(O.extend(O.FE.DEFAULTS,{imageManagerLoadURL:"https://i.froala.com/load-files",imageManagerLoadMethod:"get",imageManagerLoadParams:{},imageManagerPreloader:null,imageManagerDeleteURL:"",imageManagerDeleteMethod:"post",imageManagerDeleteParams:{},imageManagerPageSize:12,imageManagerScrollOffset:20,imageManagerToggleTags:!0}),O.FE.PLUGINS.imageManager=function(o){var g,l,r,i,n,d,s,f,m,u,c,h="image_manager",e=10,p=11,v=12,M=13,w=14,b=15,C=21,L=22,t={};function y(){var e=O(window).outerWidth();return e<768?2:e<1200?3:4}function D(){n.empty();for(var e=0;e<c;e++)n.append('<div class="fr-list-column"></div>')}function I(){if(m<s.length&&(n.outerHeight()<=r.outerHeight()+o.opts.imageManagerScrollOffset||r.scrollTop()+o.opts.imageManagerScrollOffset>n.outerHeight()-r.outerHeight())){f++;for(var e=o.opts.imageManagerPageSize*(f-1);e<Math.min(s.length,o.opts.imageManagerPageSize*f);e++)a(s[e])}}function a(i){var n=new Image,s=O('<div class="fr-image-container fr-empty fr-image-'+u+++'" data-loading="'+o.language.translate("Loading")+'.." data-deleting="'+o.language.translate("Deleting")+'..">');T(!1),n.onload=function(){s.height(Math.floor(s.width()/n.width*n.height));var t=O("<img/>");if(i.thumb)t.attr("src",i.thumb);else{if(U(w,i),!i.url)return U(b,i),!1;t.attr("src",i.url)}if(i.url&&t.attr("data-url",i.url),i.tag)if(l.find(".fr-modal-more.fr-not-available").removeClass("fr-not-available"),l.find(".fr-modal-tags").show(),0<=i.tag.indexOf(",")){for(var e=i.tag.split(","),a=0;a<e.length;a++)e[a]=e[a].trim(),0===d.find('a[title="'+e[a]+'"]').length&&d.append('<a role="button" title="'+e[a]+'">'+e[a]+"</a>");t.attr("data-tag",e.join())}else 0===d.find('a[title="'+i.tag.trim()+'"]').length&&d.append('<a role="button" title="'+i.tag.trim()+'">'+i.tag.trim()+"</a>"),t.attr("data-tag",i.tag.trim());for(var r in i.name&&t.attr("alt",i.name),i)i.hasOwnProperty(r)&&"thumb"!=r&&"url"!=r&&"tag"!=r&&t.attr("data-"+r,i[r]);s.append(t).append(O(o.icon.create("imageManagerDelete")).addClass("fr-delete-img").attr("title",o.language.translate("Delete"))).append(O(o.icon.create("imageManagerInsert")).addClass("fr-insert-img").attr("title",o.language.translate("Insert"))),d.find(".fr-selected-tag").each(function(e,a){k(t,a.text)||s.hide()}),t.on("load",function(){s.removeClass("fr-empty"),s.height("auto"),m++,E(x(parseInt(t.parent().attr("class").match(/fr-image-(\d+)/)[1],10)+1)),T(!1),m%o.opts.imageManagerPageSize==0&&I()}),o.events.trigger("imageManager.imageLoaded",[t])},n.onerror=function(){m++,s.remove(),E(x(parseInt(s.attr("class").match(/fr-image-(\d+)/)[1],10)+1)),U(e,i),m%o.opts.imageManagerPageSize==0&&I()},n.src=i.thumb||i.url,P().append(s)}function P(){var r,i;return n.find(".fr-list-column").each(function(e,a){var t=O(a);0===e?(i=t.outerHeight(),r=t):t.outerHeight()<i&&(i=t.outerHeight(),r=t)}),r}function x(e){e===undefined&&(e=0);for(var a=[],t=u-1;e<=t;t--){var r=n.find(".fr-image-"+t);r.length&&(a.push(r),O('<div id="fr-image-hidden-container">').append(r),n.find(".fr-image-"+t).remove())}return a}function E(e){for(var a=e.length-1;0<=a;a--)P().append(e[a])}function T(e){if(e===undefined&&(e=!0),!g.is(":visible"))return!0;var a=y();if(a!=c){c=a;var t=x();D(),E(t)}o.modals.resize(h),e&&I()}function q(e){var a={},t=e.data();for(var r in t)t.hasOwnProperty(r)&&"url"!=r&&"tag"!=r&&(a[r]=t[r]);return a}function S(e){var a=O(e.currentTarget).siblings("img"),t=g.data("instance")||o,r=g.data("current-image");if(o.modals.hide(h),t.image.showProgressBar(),r)r.data("fr-old-src",r.attr("src")),r.trigger("click");else{t.events.focus(!0),t.selection.restore();var i=t.position.getBoundingRect(),n=i.left+i.width/2+O(o.doc).scrollLeft(),s=i.top+i.height+O(o.doc).scrollTop();t.popups.setContainer("image.insert",o.$sc),t.popups.show("image.insert",n,s)}t.image.insert(a.data("url"),!1,q(a),r)}function R(e){var t=O(e.currentTarget).siblings("img"),a=o.language.translate("Are you sure? Image will be deleted.");confirm(a)&&(o.opts.imageManagerDeleteURL?!1!==o.events.trigger("imageManager.beforeDeleteImage",[t])&&(t.parent().addClass("fr-image-deleting"),O.ajax({method:o.opts.imageManagerDeleteMethod,url:o.opts.imageManagerDeleteURL,data:O.extend(O.extend({src:t.attr("src")},q(t)),o.opts.imageManagerDeleteParams),crossDomain:o.opts.requestWithCORS,xhrFields:{withCredentials:o.opts.requestWithCredentials},headers:o.opts.requestHeaders}).done(function(e){o.events.trigger("imageManager.imageDeleted",[e]);var a=x(parseInt(t.parent().attr("class").match(/fr-image-(\d+)/)[1],10)+1);t.parent().remove(),E(a),g.find("#fr-modal-tags > a").each(function(){0===g.find('#fr-image-list [data-tag*="'+O(this).text()+'"]').length&&O(this).removeClass("fr-selected-tag").hide()}),H(),T(!0)}).fail(function(e){U(C,e.response||e.responseText)})):U(L))}function U(e,a){10<=e&&e<20?i.hide():20<=e&&e<30&&O(".fr-image-deleting").removeClass("fr-image-deleting"),o.events.trigger("imageManager.error",[{code:e,message:t[e]},a])}function F(){var e=l.find(".fr-modal-head-line").outerHeight(),a=d.outerHeight();l.toggleClass("fr-show-tags"),l.hasClass("fr-show-tags")?(l.css("height",e+a),d.find("a").css("opacity",1)):(l.css("height",e),d.find("a").css("opacity",0))}function H(){var e=d.find(".fr-selected-tag");0<e.length?(n.find("img").parent().show(),e.each(function(e,r){n.find("img").each(function(e,a){var t=O(a);k(t,r.text)||t.parent().hide()})})):n.find("img").parent().show(),E(x()),I()}function j(e){e.preventDefault();var a=O(e.currentTarget);a.toggleClass("fr-selected-tag"),o.opts.imageManagerToggleTags&&a.siblings("a").removeClass("fr-selected-tag"),H()}function k(e,a){for(var t=(e.attr("data-tag")||"").split(","),r=0;r<t.length;r++)if(t[r]==a)return!0;return!1}return t[e]="Image cannot be loaded from the passed link.",t[p]="Error during load images request.",t[v]="Missing imageManagerLoadURL option.",t[M]="Parsing load response failed.",t[w]="Missing image thumb.",t[b]="Missing image URL.",t[C]="Error during delete image request.",t[L]="Missing imageManagerDeleteURL option.",{require:["image"],_init:function(){if(!o.$wp&&"IMG"!=o.el.tagName)return!1},show:function(){if(!g){var e,a='<div class="fr-modal-head-line"><i class="fa fa-bars fr-modal-more fr-not-available" id="fr-modal-more-'+o.sid+'" title="'+o.language.translate("Tags")+'"></i><h4 data-text="true">'+o.language.translate("Manage Images")+"</h4></div>";a+='<div class="fr-modal-tags" id="fr-modal-tags"></div>',e=o.opts.imageManagerPreloader?'<img class="fr-preloader" id="fr-preloader" alt="'+o.language.translate("Loading")+'.." src="'+o.opts.imageManagerPreloader+'" style="display: none;">':'<span class="fr-preloader" id="fr-preloader" style="display: none;">'+o.language.translate("Loading")+"</span>",e+='<div class="fr-image-list" id="fr-image-list"></div>';var t=o.modals.create(h,a,e);g=t.$modal,l=t.$head,r=t.$body}g.data("current-image",o.image.get()),o.modals.show(h),i||(i=g.find("#fr-preloader"),n=g.find("#fr-image-list"),d=g.find("#fr-modal-tags"),c=y(),D(),l.css("height",l.find(".fr-modal-head-line").outerHeight()),o.events.$on(O(o.o_win),"resize",function(){T(!!s)}),o.helpers.isMobile()&&(o.events.bindClick(n,"div.fr-image-container",function(e){g.find(".fr-mobile-selected").removeClass("fr-mobile-selected"),O(e.currentTarget).addClass("fr-mobile-selected")}),g.on(o._mousedown,function(){g.find(".fr-mobile-selected").removeClass("fr-mobile-selected")})),o.events.bindClick(n,".fr-insert-img",S),o.events.bindClick(n,".fr-delete-img",R),g.on(o._mousedown+" "+o._mouseup,function(e){e.stopPropagation()}),g.on(o._mousedown,"*",function(){o.events.disableBlur()}),r.on("scroll",I),o.events.bindClick(g,"i#fr-modal-more-"+o.sid,F),o.events.bindClick(d,"a",j)),i.show(),n.find(".fr-list-column").empty(),o.opts.imageManagerLoadURL?O.ajax({url:o.opts.imageManagerLoadURL,method:o.opts.imageManagerLoadMethod,data:o.opts.imageManagerLoadParams,dataType:"json",crossDomain:o.opts.requestWithCORS,xhrFields:{withCredentials:o.opts.requestWithCredentials},headers:o.opts.requestHeaders}).done(function(e,a,t){o.events.trigger("imageManager.imagesLoaded",[e]),function(e,a){try{n.find(".fr-list-column").empty(),u=m=f=0,s=e,I()}catch(t){U(M,a)}}(e,t.response),i.hide()}).fail(function(){var e=this.xhr();U(p,e.response||e.responseText)}):U(v)},hide:function(){o.modals.hide(h)}}},!O.FE.PLUGINS.image)throw new Error("Image manager plugin requires image plugin.");O.FE.DEFAULTS.imageInsertButtons.push("imageManager"),O.FE.RegisterCommand("imageManager",{title:"Browse",undo:!1,focus:!1,modal:!0,callback:function(){this.imageManager.show()},plugin:"imageManager"}),O.FE.DefineIcon("imageManager",{NAME:"folder"}),O.FE.DefineIcon("imageManagerInsert",{NAME:"plus"}),O.FE.DefineIcon("imageManagerDelete",{NAME:"trash"})});
|
|
@@ -0,0 +1,94 @@
|
|
|
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.DEFAULTS, {
|
|
37
|
+
inlineStyles: {
|
|
38
|
+
'Big Red': 'font-size: 20px; color: red;',
|
|
39
|
+
'Small Blue': 'font-size: 14px; color: blue;'
|
|
40
|
+
}
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
$.FE.PLUGINS.inlineStyle = function (editor) {
|
|
44
|
+
function apply (val) {
|
|
45
|
+
if (editor.selection.text() !== '') {
|
|
46
|
+
var splits = val.split(';');
|
|
47
|
+
|
|
48
|
+
for (var i = 0; i < splits.length; i++) {
|
|
49
|
+
var new_split = splits[i].split(':');
|
|
50
|
+
|
|
51
|
+
if (splits[i].length && new_split.length == 2) {
|
|
52
|
+
editor.format.applyStyle(new_split[0].trim(), new_split[1].trim())
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
editor.html.insert('<span style="' + val + '">' + $.FE.INVISIBLE_SPACE + $.FE.MARKERS + '</span>');
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return {
|
|
62
|
+
apply: apply
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Register the inline style command.
|
|
67
|
+
$.FE.RegisterCommand('inlineStyle', {
|
|
68
|
+
type: 'dropdown',
|
|
69
|
+
html: function () {
|
|
70
|
+
var c = '<ul class="fr-dropdown-list" role="presentation">';
|
|
71
|
+
var options = this.opts.inlineStyles;
|
|
72
|
+
|
|
73
|
+
for (var val in options) {
|
|
74
|
+
if (options.hasOwnProperty(val)) {
|
|
75
|
+
c += '<li role="presentation"><span style="' + options[val] + '" role="presentation"><a class="fr-command" tabIndex="-1" role="option" data-cmd="inlineStyle" data-param1="' + options[val] + '" title="' + this.language.translate(val) + '">' + this.language.translate(val) + '</a></span></li>';
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
c += '</ul>';
|
|
79
|
+
|
|
80
|
+
return c;
|
|
81
|
+
},
|
|
82
|
+
title: 'Inline Style',
|
|
83
|
+
callback: function (cmd, val) {
|
|
84
|
+
this.inlineStyle.apply(val);
|
|
85
|
+
},
|
|
86
|
+
plugin: 'inlineStyle'
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
// Add the font size icon.
|
|
90
|
+
$.FE.DefineIcon('inlineStyle', {
|
|
91
|
+
NAME: 'paint-brush'
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
}));
|
|
@@ -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(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&module.exports?module.exports=function(e,n){return n===undefined&&(n="undefined"!=typeof window?require("jquery"):require("jquery")(e)),t(n)}:t(window.jQuery)}(function(r){r.extend(r.FE.DEFAULTS,{inlineStyles:{"Big Red":"font-size: 20px; color: red;","Small Blue":"font-size: 14px; color: blue;"}}),r.FE.PLUGINS.inlineStyle=function(l){return{apply:function(e){if(""!==l.selection.text())for(var n=e.split(";"),t=0;t<n.length;t++){var i=n[t].split(":");n[t].length&&2==i.length&&l.format.applyStyle(i[0].trim(),i[1].trim())}else l.html.insert('<span style="'+e+'">'+r.FE.INVISIBLE_SPACE+r.FE.MARKERS+"</span>")}}},r.FE.RegisterCommand("inlineStyle",{type:"dropdown",html:function(){var e='<ul class="fr-dropdown-list" role="presentation">',n=this.opts.inlineStyles;for(var t in n)n.hasOwnProperty(t)&&(e+='<li role="presentation"><span style="'+n[t]+'" role="presentation"><a class="fr-command" tabIndex="-1" role="option" data-cmd="inlineStyle" data-param1="'+n[t]+'" title="'+this.language.translate(t)+'">'+this.language.translate(t)+"</a></span></li>");return e+="</ul>"},title:"Inline Style",callback:function(e,n){this.inlineStyle.apply(n)},plugin:"inlineStyle"}),r.FE.DefineIcon("inlineStyle",{NAME:"paint-brush"})});
|
|
@@ -0,0 +1,537 @@
|
|
|
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 defaults.
|
|
37
|
+
$.extend($.FE.DEFAULTS, {
|
|
38
|
+
lineBreakerTags: ['table', 'hr', 'form', 'dl', 'span.fr-video', '.fr-embedly'],
|
|
39
|
+
lineBreakerOffset: 15,
|
|
40
|
+
lineBreakerHorizontalOffset: 10
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
$.FE.PLUGINS.lineBreaker = function (editor) {
|
|
44
|
+
var $line_breaker;
|
|
45
|
+
var mouseDownFlag;
|
|
46
|
+
var mouseMoveTimer;
|
|
47
|
+
|
|
48
|
+
/*
|
|
49
|
+
* Show line breaker.
|
|
50
|
+
* Compute top, left, width and show the line breaker.
|
|
51
|
+
* tag1 and tag2 are the tags between which the line breaker must be showed.
|
|
52
|
+
* If tag1 is null then tag2 is the first tag in the editor.
|
|
53
|
+
* If tag2 is null then tag1 is the last tag in the editor.
|
|
54
|
+
*/
|
|
55
|
+
function _show($tag1, $tag2) {
|
|
56
|
+
|
|
57
|
+
// Line breaker's possition and width.
|
|
58
|
+
var breakerTop;
|
|
59
|
+
var breakerLeft;
|
|
60
|
+
var breakerWidth;
|
|
61
|
+
var parent_tag;
|
|
62
|
+
var parent_top;
|
|
63
|
+
var parent_bottom;
|
|
64
|
+
var tag_top;
|
|
65
|
+
var tag_bottom;
|
|
66
|
+
|
|
67
|
+
// Mouse is over the first tag in the editor. Show line breaker above tag2.
|
|
68
|
+
if ($tag1 == null) {
|
|
69
|
+
// Compute line breaker's possition and width.
|
|
70
|
+
parent_tag = $tag2.parent();
|
|
71
|
+
parent_top = parent_tag.offset().top;
|
|
72
|
+
tag_top = $tag2.offset().top;
|
|
73
|
+
|
|
74
|
+
breakerTop = tag_top - Math.min((tag_top - parent_top) / 2, editor.opts.lineBreakerOffset);
|
|
75
|
+
breakerWidth = parent_tag.outerWidth();
|
|
76
|
+
breakerLeft = parent_tag.offset().left;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Mouse is over the last tag in the editor. Show line breaker below tag1.
|
|
80
|
+
else if ($tag2 == null) {
|
|
81
|
+
// Compute line breaker's possition and width.
|
|
82
|
+
parent_tag = $tag1.parent();
|
|
83
|
+
parent_bottom = parent_tag.offset().top + parent_tag.outerHeight();
|
|
84
|
+
tag_bottom = $tag1.offset().top + $tag1.outerHeight();
|
|
85
|
+
|
|
86
|
+
if (parent_bottom < tag_bottom) {
|
|
87
|
+
parent_tag = $(parent_tag).parent();
|
|
88
|
+
parent_bottom = parent_tag.offset().top + parent_tag.outerHeight();
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
breakerTop = tag_bottom + Math.min(Math.abs(parent_bottom - tag_bottom) / 2, editor.opts.lineBreakerOffset);
|
|
92
|
+
breakerWidth = parent_tag.outerWidth();
|
|
93
|
+
breakerLeft = parent_tag.offset().left;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Mouse is between the 2 tags.
|
|
97
|
+
else {
|
|
98
|
+
// Compute line breaker's possition and width.
|
|
99
|
+
parent_tag = $tag1.parent();
|
|
100
|
+
var tag1_bottom = $tag1.offset().top + $tag1.height();
|
|
101
|
+
var tag2_top = $tag2.offset().top;
|
|
102
|
+
|
|
103
|
+
// Tags may be on the same line, so there is no need for line breaker.
|
|
104
|
+
if (tag1_bottom > tag2_top) {
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
breakerTop = (tag1_bottom + tag2_top) / 2;
|
|
109
|
+
breakerWidth = parent_tag.outerWidth();
|
|
110
|
+
breakerLeft = parent_tag.offset().left;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (editor.opts.iframe) {
|
|
114
|
+
breakerLeft += editor.$iframe.offset().left - editor.helpers.scrollLeft();
|
|
115
|
+
breakerTop += editor.$iframe.offset().top - editor.helpers.scrollTop();
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
editor.$box.append($line_breaker);
|
|
119
|
+
|
|
120
|
+
// Set line breaker's top, left and width.
|
|
121
|
+
$line_breaker.css('top', breakerTop - editor.win.pageYOffset);
|
|
122
|
+
$line_breaker.css('left', breakerLeft - editor.win.pageXOffset);
|
|
123
|
+
$line_breaker.css('width', breakerWidth);
|
|
124
|
+
$line_breaker.data('tag1', $tag1);
|
|
125
|
+
$line_breaker.data('tag2', $tag2);
|
|
126
|
+
|
|
127
|
+
// Show the line breaker.
|
|
128
|
+
$line_breaker.addClass('fr-visible').data('instance', editor);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/*
|
|
132
|
+
* Check tag siblings.
|
|
133
|
+
* The line breaker hould appear if there is no sibling or if the sibling is also in the line breaker tags list.
|
|
134
|
+
*/
|
|
135
|
+
function _checkTagSiblings($tag, mouseY) {
|
|
136
|
+
|
|
137
|
+
// Tag's Y top and bottom coordinate.
|
|
138
|
+
var tag_top = $tag.offset().top;
|
|
139
|
+
var tag_bottom = $tag.offset().top + $tag.outerHeight();
|
|
140
|
+
var $sibling;
|
|
141
|
+
var tag;
|
|
142
|
+
|
|
143
|
+
// Only if the mouse is close enough to the bottom or top edges.
|
|
144
|
+
if (Math.abs(tag_bottom - mouseY) <= editor.opts.lineBreakerOffset ||
|
|
145
|
+
Math.abs(mouseY - tag_top) <= editor.opts.lineBreakerOffset) {
|
|
146
|
+
|
|
147
|
+
// Mouse is near bottom check for next sibling.
|
|
148
|
+
if (Math.abs(tag_bottom - mouseY) < Math.abs(mouseY - tag_top)) {
|
|
149
|
+
tag = $tag.get(0);
|
|
150
|
+
var next_node = tag.nextSibling;
|
|
151
|
+
|
|
152
|
+
while (next_node && next_node.nodeType == Node.TEXT_NODE && next_node.textContent.length === 0) {
|
|
153
|
+
next_node = next_node.nextSibling;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Tag has next sibling.
|
|
157
|
+
if (next_node) {
|
|
158
|
+
$sibling = _checkTag(next_node);
|
|
159
|
+
|
|
160
|
+
// Sibling is in the line breaker tags list.
|
|
161
|
+
if ($sibling) {
|
|
162
|
+
|
|
163
|
+
// Show line breaker.
|
|
164
|
+
_show($tag, $sibling);
|
|
165
|
+
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// No next sibling.
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
|
|
173
|
+
// Show line breaker
|
|
174
|
+
_show($tag, null);
|
|
175
|
+
|
|
176
|
+
return true;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// Mouse is near top check for prev sibling.
|
|
181
|
+
else {
|
|
182
|
+
tag = $tag.get(0);
|
|
183
|
+
|
|
184
|
+
// No prev sibling.
|
|
185
|
+
if (!tag.previousSibling) {
|
|
186
|
+
|
|
187
|
+
// Show line breaker
|
|
188
|
+
_show(null, $tag);
|
|
189
|
+
|
|
190
|
+
return true;
|
|
191
|
+
|
|
192
|
+
// Tag has prev sibling.
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
$sibling = _checkTag(tag.previousSibling);
|
|
196
|
+
|
|
197
|
+
// Sibling is in the line breaker tags list.
|
|
198
|
+
if ($sibling) {
|
|
199
|
+
|
|
200
|
+
// Show line breaker.
|
|
201
|
+
_show($sibling, $tag);
|
|
202
|
+
|
|
203
|
+
return true;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
$line_breaker.removeClass('fr-visible').removeData('instance');
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/*
|
|
213
|
+
* Check if tag is in the line breaker list and in the editor as well.
|
|
214
|
+
* Returns the tag from the line breaker list or false if the tag is not in the list.
|
|
215
|
+
*/
|
|
216
|
+
function _checkTag(tag) {
|
|
217
|
+
if (tag) {
|
|
218
|
+
var $tag = $(tag);
|
|
219
|
+
|
|
220
|
+
// Make sure tag is inside the editor.
|
|
221
|
+
if (editor.$el.find($tag).length === 0) return null;
|
|
222
|
+
|
|
223
|
+
// Tag is in the line breaker tags list.
|
|
224
|
+
if (tag.nodeType != Node.TEXT_NODE && $tag.is(editor.opts.lineBreakerTags.join(','))) {
|
|
225
|
+
|
|
226
|
+
return $tag;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// Tag's parent is in the line breaker tags list.
|
|
230
|
+
else if ($tag.parents(editor.opts.lineBreakerTags.join(',')).length > 0) {
|
|
231
|
+
tag = $tag.parents(editor.opts.lineBreakerTags.join(',')).get(0);
|
|
232
|
+
|
|
233
|
+
if (editor.$el.find(tag).length === 0 || !$(tag).is(editor.opts.lineBreakerTags.join(','))) return null;
|
|
234
|
+
|
|
235
|
+
return $(tag);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
return null;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
function _isInWp(tag) {
|
|
243
|
+
if (typeof tag.inFroalaWrapper != 'undefined') return tag.inFroalaWrapper;
|
|
244
|
+
var o_tag = tag;
|
|
245
|
+
|
|
246
|
+
while (tag.parentNode && tag.parentNode !== editor.$wp.get(0)) {
|
|
247
|
+
tag = tag.parentNode;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
o_tag.inFroalaWrapper = (tag.parentNode == editor.$wp.get(0));
|
|
251
|
+
|
|
252
|
+
return o_tag.inFroalaWrapper;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/*
|
|
256
|
+
* Look for tag at the specified coordinates.
|
|
257
|
+
*/
|
|
258
|
+
function _tagAt(x, y) {
|
|
259
|
+
var tag = editor.doc.elementFromPoint(x, y);
|
|
260
|
+
|
|
261
|
+
// We found a tag.
|
|
262
|
+
if (tag && !$(tag).closest('.fr-line-breaker').length && !editor.node.isElement(tag) && tag != editor.$wp.get(0) && _isInWp(tag)) {
|
|
263
|
+
return tag;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// No tag at x, y.
|
|
267
|
+
return null;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/*
|
|
271
|
+
* Look for tags above and bellow the specificed point.
|
|
272
|
+
*/
|
|
273
|
+
function _searchTagVertically(x, y, step) {
|
|
274
|
+
var i = step;
|
|
275
|
+
var tag = null;
|
|
276
|
+
|
|
277
|
+
// Look up and down until a tag is found or the line breaker offset is reached.
|
|
278
|
+
while (i <= editor.opts.lineBreakerOffset && !tag) {
|
|
279
|
+
|
|
280
|
+
// Look for tag above.
|
|
281
|
+
tag = _tagAt(x, y - i);
|
|
282
|
+
|
|
283
|
+
if (!tag) {
|
|
284
|
+
|
|
285
|
+
// Look for tag below.
|
|
286
|
+
tag = _tagAt(x, y + i);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
i += step;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
return tag;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/*
|
|
296
|
+
* Look for tag left and right, up and down for each point.
|
|
297
|
+
*/
|
|
298
|
+
function _searchTagHorizontally(x, y, direction) {
|
|
299
|
+
var tag = null;
|
|
300
|
+
|
|
301
|
+
// Do not check left / right too much.
|
|
302
|
+
var limit = 100;
|
|
303
|
+
|
|
304
|
+
// Look left / right until a tag is found or the editor margins are reached.
|
|
305
|
+
while (!tag && x > editor.$box.offset().left && x < editor.$box.offset().left + editor.$box.outerWidth() && limit > 0) {
|
|
306
|
+
tag = _tagAt(x, y);
|
|
307
|
+
|
|
308
|
+
// There's not tag here, look up and down.
|
|
309
|
+
if (!tag) {
|
|
310
|
+
|
|
311
|
+
// Look 5px up and 5 down.
|
|
312
|
+
tag = _searchTagVertically(x, y, 5);
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// Move left or right.
|
|
316
|
+
if (direction == 'left') x -= editor.opts.lineBreakerHorizontalOffset;
|
|
317
|
+
else x += editor.opts.lineBreakerHorizontalOffset;
|
|
318
|
+
|
|
319
|
+
limit -= editor.opts.lineBreakerHorizontalOffset;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
return tag;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/*
|
|
326
|
+
* Get the tag under the mouse cursor.
|
|
327
|
+
*/
|
|
328
|
+
function _tagUnder(e) {
|
|
329
|
+
mouseMoveTimer = null;
|
|
330
|
+
|
|
331
|
+
// The tag for which the line breaker should be showed.
|
|
332
|
+
var $tag = null;
|
|
333
|
+
var tag = null;
|
|
334
|
+
|
|
335
|
+
// The tag under the mouse cursor.
|
|
336
|
+
var tag_under = editor.doc.elementFromPoint(e.pageX - editor.win.pageXOffset, e.pageY - editor.win.pageYOffset);
|
|
337
|
+
|
|
338
|
+
// Tag is the editor element. Look for closest tag above and bellow, left and right.
|
|
339
|
+
if (tag_under && (tag_under.tagName == 'HTML' || tag_under.tagName == 'BODY' || editor.node.isElement(tag_under) || (tag_under.getAttribute('class') || '').indexOf('fr-line-breaker') >= 0)) {
|
|
340
|
+
|
|
341
|
+
// Look 1px up and 1 down.
|
|
342
|
+
tag = _searchTagVertically(e.pageX - editor.win.pageXOffset, e.pageY - editor.win.pageYOffset, 1);
|
|
343
|
+
|
|
344
|
+
// Stil haven't found a tag, look left.
|
|
345
|
+
if (!tag) {
|
|
346
|
+
tag = _searchTagHorizontally(e.pageX - editor.win.pageXOffset - editor.opts.lineBreakerHorizontalOffset, e.pageY - editor.win.pageYOffset, 'left');
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
// Stil haven't found a tag, look right.
|
|
350
|
+
if (!tag) {
|
|
351
|
+
tag = _searchTagHorizontally(e.pageX - editor.win.pageXOffset + editor.opts.lineBreakerHorizontalOffset, e.pageY - editor.win.pageYOffset, 'right');
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
$tag = _checkTag(tag);
|
|
355
|
+
|
|
356
|
+
// Tag is not the editor element.
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
|
|
360
|
+
// Check if the tag is in the line breaker list.
|
|
361
|
+
$tag = _checkTag(tag_under);
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
// Check tag siblings.
|
|
365
|
+
if ($tag) {
|
|
366
|
+
_checkTagSiblings($tag, e.pageY);
|
|
367
|
+
}
|
|
368
|
+
else if (editor.core.sameInstance($line_breaker)) {
|
|
369
|
+
$line_breaker.removeClass('fr-visible').removeData('instance');
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
/*
|
|
374
|
+
* Set mouse timer to improve performance.
|
|
375
|
+
*/
|
|
376
|
+
function _mouseTimer(e) {
|
|
377
|
+
if ($line_breaker.hasClass('fr-visible') && !editor.core.sameInstance($line_breaker)) return false;
|
|
378
|
+
|
|
379
|
+
if (editor.popups.areVisible() || editor.el.querySelector('.fr-selected-cell')) {
|
|
380
|
+
$line_breaker.removeClass('fr-visible');
|
|
381
|
+
|
|
382
|
+
return true;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
if (mouseDownFlag === false && !editor.edit.isDisabled()) {
|
|
386
|
+
if (mouseMoveTimer) {
|
|
387
|
+
clearTimeout(mouseMoveTimer);
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
mouseMoveTimer = setTimeout(_tagUnder, 30, e);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
/*
|
|
395
|
+
* Hide line breaker and prevent timer from showing it again.
|
|
396
|
+
*/
|
|
397
|
+
function _hide() {
|
|
398
|
+
if (mouseMoveTimer) {
|
|
399
|
+
clearTimeout(mouseMoveTimer);
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
if ($line_breaker.hasClass('fr-visible')) {
|
|
403
|
+
$line_breaker.removeClass('fr-visible').removeData('instance');
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
/*
|
|
408
|
+
* Notify that mouse is down and prevent line breaker from showing.
|
|
409
|
+
* This may happen either for selection or for drag.
|
|
410
|
+
*/
|
|
411
|
+
function _mouseDown() {
|
|
412
|
+
mouseDownFlag = true;
|
|
413
|
+
_hide();
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
/*
|
|
417
|
+
* Notify that mouse is no longer pressed.
|
|
418
|
+
*/
|
|
419
|
+
function _mouseUp() {
|
|
420
|
+
mouseDownFlag = false;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
/*
|
|
424
|
+
* Add new line between the tags.
|
|
425
|
+
*/
|
|
426
|
+
function _doLineBreak(e) {
|
|
427
|
+
e.preventDefault();
|
|
428
|
+
|
|
429
|
+
var instance = $line_breaker.data('instance') || editor;
|
|
430
|
+
|
|
431
|
+
// Hide the line breaker.
|
|
432
|
+
$line_breaker.removeClass('fr-visible').removeData('instance');
|
|
433
|
+
|
|
434
|
+
// Tags between which that line break needs to be done.
|
|
435
|
+
var $tag1 = $line_breaker.data('tag1');
|
|
436
|
+
var $tag2 = $line_breaker.data('tag2');
|
|
437
|
+
|
|
438
|
+
// P, DIV or none.
|
|
439
|
+
var default_tag = editor.html.defaultTag();
|
|
440
|
+
|
|
441
|
+
// The line break needs to be done before the first element in the editor.
|
|
442
|
+
if ($tag1 == null) {
|
|
443
|
+
|
|
444
|
+
// If the tag is in a TD tag then just add <br> no matter what the default_tag is.
|
|
445
|
+
if (default_tag && $tag2.parent().get(0).tagName != 'TD' && $tag2.parents(default_tag).length === 0) {
|
|
446
|
+
$tag2.before('<' + default_tag + '>' + $.FE.MARKERS + '<br></' + default_tag + '>')
|
|
447
|
+
}
|
|
448
|
+
else {
|
|
449
|
+
$tag2.before($.FE.MARKERS + '<br>');
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
// The line break needs to be done either after the last element in the editor or between the 2 tags.
|
|
453
|
+
// Either way the line break is after the first tag.
|
|
454
|
+
}
|
|
455
|
+
else {
|
|
456
|
+
|
|
457
|
+
// If the tag is in a TD tag then just add <br> no matter what the default_tag is.
|
|
458
|
+
if (default_tag && $tag1.parent().get(0).tagName != 'TD' && $tag1.parents(default_tag).length === 0) {
|
|
459
|
+
$tag1.after('<' + default_tag + '>' + $.FE.MARKERS + '<br></' + default_tag + '>')
|
|
460
|
+
}
|
|
461
|
+
else {
|
|
462
|
+
$tag1.after($.FE.MARKERS + '<br>');
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
// Cursor is now at the beginning of the new line.
|
|
467
|
+
instance.selection.restore();
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
/*
|
|
471
|
+
* Initialize the line breaker.
|
|
472
|
+
*/
|
|
473
|
+
function _initLineBreaker() {
|
|
474
|
+
|
|
475
|
+
// Append line breaker HTML to editor wrapper.
|
|
476
|
+
if (!editor.shared.$line_breaker) {
|
|
477
|
+
editor.shared.$line_breaker = $('<div class="fr-line-breaker"><a class="fr-floating-btn" role="button" tabIndex="-1" title="' + editor.language.translate('Break') + '"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><rect x="21" y="11" width="2" height="8"/><rect x="14" y="17" width="7" height="2"/><path d="M14.000,14.000 L14.000,22.013 L9.000,18.031 L14.000,14.000 Z"/></svg></a></div>');
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
$line_breaker = editor.shared.$line_breaker;
|
|
481
|
+
|
|
482
|
+
// Editor shared destroy.
|
|
483
|
+
editor.events.on('shared.destroy', function () {
|
|
484
|
+
$line_breaker.html('').removeData().remove();
|
|
485
|
+
$line_breaker = null;
|
|
486
|
+
}, true);
|
|
487
|
+
|
|
488
|
+
// Editor destroy.
|
|
489
|
+
editor.events.on('destroy', function () {
|
|
490
|
+
$line_breaker.removeData('instance').removeClass('fr-visible').appendTo('body:first');
|
|
491
|
+
clearTimeout(mouseMoveTimer);
|
|
492
|
+
}, true)
|
|
493
|
+
|
|
494
|
+
editor.events.$on($line_breaker, 'mousemove', function (e) {
|
|
495
|
+
e.stopPropagation();
|
|
496
|
+
}, true)
|
|
497
|
+
|
|
498
|
+
// Add new line break.
|
|
499
|
+
editor.events.bindClick($line_breaker, 'a', _doLineBreak);
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
/*
|
|
503
|
+
* Tear up.
|
|
504
|
+
*/
|
|
505
|
+
function _init() {
|
|
506
|
+
if (!editor.$wp) return false;
|
|
507
|
+
|
|
508
|
+
_initLineBreaker();
|
|
509
|
+
|
|
510
|
+
// Remember if mouse is clicked so the line breaker does not appear.
|
|
511
|
+
mouseDownFlag = false;
|
|
512
|
+
|
|
513
|
+
// Check tags under the mouse to see if the line breaker needs to be shown.
|
|
514
|
+
editor.events.$on(editor.$win, 'mousemove', _mouseTimer);
|
|
515
|
+
|
|
516
|
+
// Hide the line breaker if the page is scrolled.
|
|
517
|
+
editor.events.$on($(editor.win), 'scroll', _hide);
|
|
518
|
+
|
|
519
|
+
// Hide the line breaker on cell edit.
|
|
520
|
+
editor.events.on('popups.show.table.edit', _hide);
|
|
521
|
+
|
|
522
|
+
// Hide the line breaker after command is ran.
|
|
523
|
+
editor.events.on('commands.after', _hide);
|
|
524
|
+
|
|
525
|
+
// Prevent line breaker from showing while selecting text or dragging images.
|
|
526
|
+
editor.events.$on($(editor.win), 'mousedown', _mouseDown);
|
|
527
|
+
|
|
528
|
+
// Mouse is not pressed anymore, line breaker may be shown.
|
|
529
|
+
editor.events.$on($(editor.win), 'mouseup', _mouseUp);
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
return {
|
|
533
|
+
_init: _init
|
|
534
|
+
}
|
|
535
|
+
};
|
|
536
|
+
|
|
537
|
+
}));
|