/* =================================================== * bootstrap-markdown.js v2.7.0 * http://github.com/toopay/bootstrap-markdown * =================================================== * Copyright 2013-2014 Taufan Aditya * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ========================================================== */ !function ($) { "use strict"; // jshint ;_; /* MARKDOWN CLASS DEFINITION * ========================== */ var Markdown = function (element, options) { // Class Properties this.$ns = 'bootstrap-markdown' this.$element = $(element) this.$editable = {el:null, type:null,attrKeys:[], attrValues:[], content:null} this.$options = $.extend(true, {}, $.fn.markdown.defaults, options, this.$element.data(), this.$element.data('options')) this.$oldContent = null this.$isPreview = false this.$isFullscreen = false this.$editor = null this.$textarea = null this.$handler = [] this.$callback = [] this.$nextTab = [] this.showEditor() } Markdown.prototype = { constructor: Markdown , __alterButtons: function(name,alter) { var handler = this.$handler, isAll = (name == 'all'),that = this $.each(handler,function(k,v) { var halt = true if (isAll) { halt = false } else { halt = v.indexOf(name) < 0 } if (halt == false) { alter(that.$editor.find('button[data-handler="'+v+'"]')) } }) } , __buildButtons: function(buttonsArray, container) { var i, ns = this.$ns, handler = this.$handler, callback = this.$callback for (i=0;i', { 'class': 'btn-group' }) for (z=0;z'); buttonContainer.text(' ' + this.__localize(btnText)).addClass('btn-default btn-sm').addClass(btnClass); if(btnClass.match(/btn\-(primary|success|info|warning|danger|link)/)){ buttonContainer.removeClass('btn-default'); } buttonContainer.attr({ 'type': 'button', 'title': this.__localize(button.title) + hotkeyCaption, 'tabindex': tabIndex, 'data-provider': ns, 'data-handler': buttonHandler, 'data-hotkey': hotkey }); if (button.toggle == true){ buttonContainer.attr('data-toggle', 'button'); } buttonIconContainer = $(''); buttonIconContainer.addClass(buttonIcon); buttonIconContainer.prependTo(buttonContainer); // Attach the button object btnGroupContainer.append(buttonContainer); // Register handler and callback handler.push(buttonHandler); callback.push(button.callback); } // Attach the button group into container dom container.append(btnGroupContainer); } } return container; } , __setListener: function() { // Set size and resizable Properties var hasRows = typeof this.$textarea.attr('rows') != 'undefined', maxRows = this.$textarea.val().split("\n").length > 5 ? this.$textarea.val().split("\n").length : '5', rowsVal = hasRows ? this.$textarea.attr('rows') : maxRows this.$textarea.attr('rows',rowsVal) if (this.$options.resize) { this.$textarea.css('resize',this.$options.resize) } this.$textarea .on('focus', $.proxy(this.focus, this)) .on('keypress', $.proxy(this.keypress, this)) .on('keyup', $.proxy(this.keyup, this)) .on('change', $.proxy(this.change, this)) if (this.eventSupported('keydown')) { this.$textarea.on('keydown', $.proxy(this.keydown, this)) } // Re-attach markdown data this.$textarea.data('markdown',this) } , __handle: function(e) { var target = $(e.currentTarget), handler = this.$handler, callback = this.$callback, handlerName = target.attr('data-handler'), callbackIndex = handler.indexOf(handlerName), callbackHandler = callback[callbackIndex] // Trigger the focusin $(e.currentTarget).focus() callbackHandler(this) // Trigger onChange for each button handle this.change(this); // Unless it was the save handler, // focusin the textarea if (handlerName.indexOf('cmdSave') < 0) { this.$textarea.focus() } e.preventDefault() } , __localize: function(string) { var messages = $.fn.markdown.messages, language = this.$options.language if ( typeof messages !== 'undefined' && typeof messages[language] !== 'undefined' && typeof messages[language][string] !== 'undefined' ) { return messages[language][string]; } return string; } , __getIcon: function(src) { return typeof src == 'object' ? src[this.$options.iconlibrary] : src; } , setFullscreen: function(mode) { var $editor = this.$editor, $textarea = this.$textarea if (mode === true) { $editor.addClass('md-fullscreen-mode') $('body').addClass('md-nooverflow') this.$options.onFullscreen(this) } else { $editor.removeClass('md-fullscreen-mode') $('body').removeClass('md-nooverflow') } this.$isFullscreen = mode; $textarea.focus() } , showEditor: function() { var instance = this, textarea, ns = this.$ns, container = this.$element, originalHeigth = container.css('height'), originalWidth = container.css('width'), editable = this.$editable, handler = this.$handler, callback = this.$callback, options = this.$options, editor = $( '
', { 'class': 'md-editor', click: function() { instance.focus() } }) // Prepare the editor if (this.$editor == null) { // Create the panel var editorHeader = $('
', { 'class': 'md-header btn-toolbar' }) // Merge the main & additional button groups together var allBtnGroups = [] if (options.buttons.length > 0) allBtnGroups = allBtnGroups.concat(options.buttons[0]) if (options.additionalButtons.length > 0) allBtnGroups = allBtnGroups.concat(options.additionalButtons[0]) // Reduce and/or reorder the button groups if (options.reorderButtonGroups.length > 0) { allBtnGroups = allBtnGroups .filter(function(btnGroup) { return options.reorderButtonGroups.indexOf(btnGroup.name) > -1 }) .sort(function(a, b) { if (options.reorderButtonGroups.indexOf(a.name) < options.reorderButtonGroups.indexOf(b.name)) return -1 if (options.reorderButtonGroups.indexOf(a.name) > options.reorderButtonGroups.indexOf(b.name)) return 1 return 0 }) } // Build the buttons if (allBtnGroups.length > 0) { editorHeader = this.__buildButtons([allBtnGroups], editorHeader) } if (options.fullscreen.enable) { editorHeader.append('
').on('click', '.md-control-fullscreen', function(e) { e.preventDefault(); instance.setFullscreen(true) }) } editor.append(editorHeader) // Wrap the textarea if (container.is('textarea')) { container.before(editor) textarea = container textarea.addClass('md-input') editor.append(textarea) } else { var rawContent = (typeof toMarkdown == 'function') ? toMarkdown(container.html()) : container.html(), currentContent = $.trim(rawContent) // This is some arbitrary content that could be edited textarea = $('