AutorÃa | Ultima modificación | Ver Log |
YUI.add('moodle-atto_html-button', function (Y, NAME) {// This file is part of Moodle - http://moodle.org///// Moodle is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.//// Moodle is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.//// You should have received a copy of the GNU General Public License// along with Moodle. If not, see <http://www.gnu.org/licenses/>./** @package atto_html* @copyright 2013 Damyon Wiese <damyon@moodle.com>* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later*//*** @module moodle-atto_html-button*//*** Atto text editor HTML plugin.** @namespace M.atto_html* @class button* @extends M.editor_atto.EditorPlugin*/Y.namespace('M.atto_html').Button = Y.Base.create('button', Y.M.editor_atto.EditorPlugin, [], {_codeMirror: null,initializer: function() {this.addButton({icon: 'e/source_code',callback: this._toggleHTML});// Attach a submit listener to the form.// This ensures that the codeMirror is converted back to the original text before form submission.var form = this.get('host').textarea.ancestor('form');if (form) {form.on('submit', function() {if (this.get('isHTML')) {this._hideCodeMirror();}}, this);}},/*** Toggle the view between the content editable div, and the textarea,* updating the content as it goes.** @method _toggleHTML* @private*/_toggleHTML: function() {// Toggle the HTML status.this.set('isHTML', !this.get('isHTML'));if (!this.get('isHTML')) {this._hideCodeMirror();} else {this._showCodeMirror();}},/*** Show the code mirror.** @method _showCodeMirror* @private*/_showCodeMirror: function() {var host = this.get('host');// Disable all plugins.host.disablePlugins();// And then re-enable this one.host.enablePlugins(this.name);// Copy the text to the contenteditable div.host.updateOriginal();// Hide the editor, and show the textarea.var dimensions = {width: this.editor.getComputedStyle('width'),height: this.editor.getComputedStyle('height')};// Tidy up the content if possible.var beautified = Y.M.atto_html.beautify.html_beautify(host.textarea.get('value'), {'indent_size': 4,'indent_inner_html': true});host.textarea.set('value', beautified);// Create the codeMirror from the textarea.this._codeMirror = Y.M.atto_html.CodeMirror.fromTextArea(host.textarea.getDOMNode(), {lineNumbers: true,mode: 'htmlmixed',tabSize: 2,lineWrapping: true});this._codeMirror.on('change', function(cm) {cm.save();});// Hide the text area and ensure that the codeMirror is displayed.this.editor.hide();this._codeMirror.setSize(dimensions.width, dimensions.height);// Focus on the codeMirror.this._codeMirror.focus();},/*** Hide the code mirror.** @method _hideCodeMirror* @private*/_hideCodeMirror: function() {var host = this.get('host');// Disable placeholder for empty content.// This will prevent the editor to copy and submit the empty placeholder.host.disablePlaceholderForEmptyContent();// Enable all plugins.host.enablePlugins();// Copy the text to the contenteditable div.host.updateFromTextArea();// Hide the textarea, and show the editor.if (this._codeMirror) {Y.one(this._codeMirror.getWrapperElement()).hide();// Calling toTextArea will remove the editor and all of its handlers.this._codeMirror.toTextArea();// Detach any remaining handlers.Y.Object.each(this._codeMirror._handlers, function(handlers, eventName) {Y.Array.each(handlers, function(handler) {this.off(eventName, handler);}, this);}, this._codeMirror);// Cleanup.delete this._codeMirror;this._codeMirror = null;}host.textarea.hide();this.editor.show();// Focus on the editor.host.focus();// And re-mark everything as updated.this.markUpdated();// Enable placeholder for empty content.host.enablePlaceholderForEmptyContent();}}, {ATTRS: {/*** The current state for the HTML view. If true, the HTML source is* shown in a textarea, otherwise the contenteditable area is* displayed.** @attribute isHTML* @type Boolean* @default false*/isHTML: {value: false}}});}, '@VERSION@', {"requires": ["promise","moodle-editor_atto-plugin","moodle-atto_html-beautify","moodle-atto_html-codemirror","event-valuechange"]});