123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350 |
- /* jshint expr: true */
- !(function($, wysi) {
- 'use strict';
- var templates = function(key, locale, options) {
- return wysi.tpl[key]({locale: locale, options: options});
- };
- var Wysihtml5 = function(el, options) {
- this.el = el;
- var toolbarOpts = options || defaultOptions;
- for(var t in toolbarOpts.customTemplates) {
- wysi.tpl[t] = toolbarOpts.customTemplates[t];
- }
- this.toolbar = this.createToolbar(el, toolbarOpts);
- this.editor = this.createEditor(options);
- window.editor = this.editor;
- $('iframe.wysihtml5-sandbox').each(function(i, el){
- $(el.contentWindow).off('focus.wysihtml5').on({
- 'focus.wysihtml5' : function(){
- $('li.dropdown').removeClass('open');
- }
- });
- });
- };
- Wysihtml5.prototype = {
- constructor: Wysihtml5,
- createEditor: function(options) {
- options = options || {};
- // Add the toolbar to a clone of the options object so multiple instances
- // of the WYISYWG don't break because 'toolbar' is already defined
- options = $.extend(true, {}, options);
- options.toolbar = this.toolbar[0];
- var editor = new wysi.Editor(this.el[0], options);
- if(options && options.events) {
- for(var eventName in options.events) {
- editor.on(eventName, options.events[eventName]);
- }
- }
- return editor;
- },
- createToolbar: function(el, options) {
- var self = this;
- var toolbar = $('<ul/>', {
- 'class' : 'wysihtml5-toolbar',
- 'style': 'display:none'
- });
- var culture = options.locale || defaultOptions.locale || 'en';
- for(var key in defaultOptions) {
- var value = false;
- if(options[key] !== undefined) {
- if(options[key] === true) {
- value = true;
- }
- } else {
- value = defaultOptions[key];
- }
- if(value === true) {
- toolbar.append(templates(key, locale[culture], options));
- if(key === 'html') {
- this.initHtml(toolbar);
- }
- if(key === 'link') {
- this.initInsertLink(toolbar);
- }
- if(key === 'image') {
- this.initInsertImage(toolbar);
- }
- }
- }
- if(options.toolbar) {
- for(key in options.toolbar) {
- toolbar.append(options.toolbar[key]);
- }
- }
- toolbar.find('a[data-wysihtml5-command="formatBlock"]').click(function(e) {
- var target = e.target || e.srcElement;
- var el = $(target);
- self.toolbar.find('.current-font').text(el.html());
- });
- toolbar.find('a[data-wysihtml5-command="foreColor"]').click(function(e) {
- var target = e.target || e.srcElement;
- var el = $(target);
- self.toolbar.find('.current-color').text(el.html());
- });
- this.el.before(toolbar);
- return toolbar;
- },
- initHtml: function(toolbar) {
- var changeViewSelector = 'a[data-wysihtml5-action="change_view"]';
- toolbar.find(changeViewSelector).click(function(e) {
- toolbar.find('a.btn').not(changeViewSelector).toggleClass('disabled');
- });
- },
- initInsertImage: function(toolbar) {
- var self = this;
- var insertImageModal = toolbar.find('.bootstrap-wysihtml5-insert-image-modal');
- var urlInput = insertImageModal.find('.bootstrap-wysihtml5-insert-image-url');
- var insertButton = insertImageModal.find('a.btn-primary');
- var initialValue = urlInput.val();
- var caretBookmark;
- var insertImage = function() {
- var url = urlInput.val();
- urlInput.val(initialValue);
- self.editor.currentView.element.focus();
- if (caretBookmark) {
- self.editor.composer.selection.setBookmark(caretBookmark);
- caretBookmark = null;
- }
- self.editor.composer.commands.exec('insertImage', url);
- };
- urlInput.keypress(function(e) {
- if(e.which == 13) {
- insertImage();
- insertImageModal.modal('hide');
- }
- });
- insertButton.click(insertImage);
- insertImageModal.on('shown', function() {
- urlInput.focus();
- });
- insertImageModal.on('hide', function() {
- self.editor.currentView.element.focus();
- });
- toolbar.find('a[data-wysihtml5-command=insertImage]').click(function() {
- var activeButton = $(this).hasClass('wysihtml5-command-active');
- if (!activeButton) {
- self.editor.currentView.element.focus(false);
- caretBookmark = self.editor.composer.selection.getBookmark();
- insertImageModal.appendTo('body').modal('show');
- insertImageModal.on('click.dismiss.modal', '[data-dismiss="modal"]', function(e) {
- e.stopPropagation();
- });
- return false;
- }
- else {
- return true;
- }
- });
- },
- initInsertLink: function(toolbar) {
- var self = this;
- var insertLinkModal = toolbar.find('.bootstrap-wysihtml5-insert-link-modal');
- var urlInput = insertLinkModal.find('.bootstrap-wysihtml5-insert-link-url');
- var targetInput = insertLinkModal.find('.bootstrap-wysihtml5-insert-link-target');
- var insertButton = insertLinkModal.find('a.btn-primary');
- var initialValue = urlInput.val();
- var caretBookmark;
- var insertLink = function() {
- var url = urlInput.val();
- urlInput.val(initialValue);
- self.editor.currentView.element.focus();
- if (caretBookmark) {
- self.editor.composer.selection.setBookmark(caretBookmark);
- caretBookmark = null;
- }
- var newWindow = targetInput.prop('checked');
- self.editor.composer.commands.exec('createLink', {
- 'href' : url,
- 'target' : (newWindow ? '_blank' : '_self'),
- 'rel' : (newWindow ? 'nofollow' : '')
- });
- };
- var pressedEnter = false;
- urlInput.keypress(function(e) {
- if(e.which == 13) {
- insertLink();
- insertLinkModal.modal('hide');
- }
- });
- insertButton.click(insertLink);
- insertLinkModal.on('shown', function() {
- urlInput.focus();
- });
- insertLinkModal.on('hide', function() {
- self.editor.currentView.element.focus();
- });
- toolbar.find('a[data-wysihtml5-command=createLink]').click(function() {
- var activeButton = $(this).hasClass('wysihtml5-command-active');
- if (!activeButton) {
- self.editor.currentView.element.focus(false);
- caretBookmark = self.editor.composer.selection.getBookmark();
- insertLinkModal.appendTo('body').modal('show');
- insertLinkModal.on('click.dismiss.modal', '[data-dismiss="modal"]', function(e) {
- e.stopPropagation();
- });
- return false;
- }
- else {
- return true;
- }
- });
- }
- };
- // these define our public api
- var methods = {
- resetDefaults: function() {
- $.fn.wysihtml5.defaultOptions = $.extend(true, {}, $.fn.wysihtml5.defaultOptionsCache);
- },
- bypassDefaults: function(options) {
- return this.each(function () {
- var $this = $(this);
- $this.data('wysihtml5', new Wysihtml5($this, options));
- });
- },
- shallowExtend: function (options) {
- var settings = $.extend({}, $.fn.wysihtml5.defaultOptions, options || {}, $(this).data());
- var that = this;
- return methods.bypassDefaults.apply(that, [settings]);
- },
- deepExtend: function(options) {
- var settings = $.extend(true, {}, $.fn.wysihtml5.defaultOptions, options || {});
- var that = this;
- return methods.bypassDefaults.apply(that, [settings]);
- },
- init: function(options) {
- var that = this;
- return methods.shallowExtend.apply(that, [options]);
- }
- };
- $.fn.wysihtml5 = function ( method ) {
- if ( methods[method] ) {
- return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
- } else if ( typeof method === 'object' || ! method ) {
- return methods.init.apply( this, arguments );
- } else {
- $.error( 'Method ' + method + ' does not exist on jQuery.wysihtml5' );
- }
- };
- $.fn.wysihtml5.Constructor = Wysihtml5;
- var defaultOptions = $.fn.wysihtml5.defaultOptions = {
- 'font-styles': true,
- 'color': false,
- 'emphasis': true,
- 'lists': true,
- 'html': false,
- 'link': true,
- 'image': true,
- events: {},
- parserRules: {
- classes: {
- 'wysiwyg-color-silver' : 1,
- 'wysiwyg-color-gray' : 1,
- 'wysiwyg-color-white' : 1,
- 'wysiwyg-color-maroon' : 1,
- 'wysiwyg-color-red' : 1,
- 'wysiwyg-color-purple' : 1,
- 'wysiwyg-color-fuchsia' : 1,
- 'wysiwyg-color-green' : 1,
- 'wysiwyg-color-lime' : 1,
- 'wysiwyg-color-olive' : 1,
- 'wysiwyg-color-yellow' : 1,
- 'wysiwyg-color-navy' : 1,
- 'wysiwyg-color-blue' : 1,
- 'wysiwyg-color-teal' : 1,
- 'wysiwyg-color-aqua' : 1,
- 'wysiwyg-color-orange' : 1
- },
- tags: {
- 'b': {},
- 'i': {},
- 'strong': {},
- 'em': {},
- 'p': {},
- 'br': {},
- 'ol': {},
- 'ul': {},
- 'li': {},
- 'h1': {},
- 'h2': {},
- 'h3': {},
- 'h4': {},
- 'h5': {},
- 'h6': {},
- 'blockquote': {},
- 'u': 1,
- 'img': {
- 'check_attributes': {
- 'width': 'numbers',
- 'alt': 'alt',
- 'src': 'url',
- 'height': 'numbers'
- }
- },
- 'a': {
- check_attributes: {
- 'href': 'url' // important to avoid XSS
- },
- 'set_attributes': {
- 'target': '_blank',
- 'rel': 'nofollow'
- }
- },
- 'span': 1,
- 'div': 1,
- // to allow save and edit files with code tag hacks
- 'code': 1,
- 'pre': 1
- }
- },
- locale: 'en'
- };
- if (typeof $.fn.wysihtml5.defaultOptionsCache === 'undefined') {
- $.fn.wysihtml5.defaultOptionsCache = $.extend(true, {}, $.fn.wysihtml5.defaultOptions);
- }
- var locale = $.fn.wysihtml5.locale = {};
- })(window.jQuery, window.wysihtml5);
|