/* abbr-plugin.js is part of Aloha Editor project http://aloha-editor.org * * Aloha Editor is a WYSIWYG HTML5 inline editing library and editor. * Copyright (c) 2010-2012 Gentics Software GmbH, Vienna, Austria. * Contributors http://aloha-editor.org/contribution.php * * Aloha Editor 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 2 * of the License, or any later version. * * Aloha Editor 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 this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * * As an additional permission to the GNU GPL version 2, you may distribute * non-source (e.g., minimized or compacted) forms of the Aloha-Editor * source code without the copy of the GNU GPL normally required, * provided you include this license notice and a URL through which * recipients can access the Corresponding Source. */ define([ 'aloha', 'jquery', 'aloha/plugin', 'ui/ui', 'ui/toggleButton', 'ui/button', 'ui/scopes', 'ui/port-helper-attribute-field', 'i18n!abbr/nls/i18n', 'i18n!aloha/nls/i18n' ], function ( Aloha, jQuery, Plugin, Ui, ToggleButton, Button, Scopes, AttributeField, i18n, i18nCore ) { 'use strict'; var GENTICS = window.GENTICS; /** * register the plugin with unique name */ return Plugin.create( 'abbr', { /** * default button configuration */ config: [ 'abbr' ], /** * Initialize the plugin and set initialize flag on true */ init: function () { this.createButtons(); this.subscribeEvents(); this.bindInteractions(); }, /** * Initialize the buttons */ createButtons: function () { var me = this; this._formatAbbrButton = Ui.adopt("formatAbbr", ToggleButton, { tooltip: i18n.t("button.abbr.tooltip"), icon: "aloha-icon aloha-icon-abbr", scope: 'Aloha.continuoustext', click: function(){ me.formatAbbr(); } }); this._insertAbbrButton = Ui.adopt("insertAbbr", Button, { tooltip: i18n.t('button.addabbr.tooltip'), icon: 'aloha-icon aloha-icon-abbr', scope: 'Aloha.continuoustext', click: function(){ me.insertAbbr( false ); } }); Scopes.createScope('abbr', 'Aloha.continuoustext'); this.abbrField = AttributeField({ width: 320, name: 'abbrText', scope: 'abbr' }); this.remAbbrButton = Ui.adopt("removeAbbr", Button, { tooltip: i18n.t('button.remabbr.tooltip'), icon: 'aloha-icon aloha-icon-abbr-rem', scope: 'abbr', click: function () { me.removeAbbr(); } }); }, /** * Parse a all editables for abbreviations * Add the abbr shortcut to all edtiables */ bindInteractions: function () { var me = this; // on blur check if abbr title is empty. If so remove the a tag this.abbrField.addListener( 'blur', function ( obj, event ) { if ( this.getValue() == '' ) { me.removeAbbr(); } } ); // add to all editables the abbr shortcut for ( var i = 0; i < Aloha.editables.length; i++ ) { // CTRL+G Aloha.editables[ i ].obj.keydown( function ( e ) { if ( e.metaKey && e.which == 71 ) { if ( me.findAbbrMarkup() ) { me.abbrField.foreground(); me.abbrField.focus(); } else { me.insertAbbr(); } // prevent from further handling // on a MAC Safari cursor would jump to location bar. Use ESC then META+L e.stopPropagation(); e.preventDefault(); return false; } } ); } }, subscribeEvents: function () { var me = this; var editableConfig = {}; Aloha.bind('aloha-editable-activated', function () { if (!Aloha.activeEditable || !Aloha.activeEditable.obj) { return; } var config = me.getEditableConfig(Aloha.activeEditable.obj); editableConfig[Aloha.activeEditable.getId()] = jQuery.inArray('abbr', config) !== -1; }); Aloha.bind('aloha-editable-destroyed', function () { if (Aloha.activeEditable && Aloha.activeEditable.obj) { delete editableConfig[Aloha.activeEditable.getId()]; } }); Aloha.bind('aloha-selection-changed', function (event, range) { if (!Aloha.activeEditable) { return; } if (editableConfig[Aloha.activeEditable.getId()]) { me._formatAbbrButton.show(); me._insertAbbrButton.show(); } else { me._formatAbbrButton.hide(); me._insertAbbrButton.hide(); return; } var foundMarkup = me.findAbbrMarkup(range); if (foundMarkup) { me._insertAbbrButton.hide(); me._formatAbbrButton.setState(true); Scopes.setScope('abbr'); me.abbrField.setTargetObject(foundMarkup, 'title'); } else { me._formatAbbrButton.setState(false); me.abbrField.setTargetObject(null); } }); }, /** * Check whether inside a abbr tag * @param {GENTICS.Utils.RangeObject} range range where to insert the object (at start or end) * @return markup * @hide */ findAbbrMarkup: function ( range ) { if ( typeof range == 'undefined' ) { var range = Aloha.Selection.getRangeObject(); } if ( Aloha.activeEditable ) { return range.findMarkup( function() { return this.nodeName.toLowerCase() == 'abbr'; }, Aloha.activeEditable.obj ); } else { return null; } }, /** * Format the current selection or if collapsed the current word as abbr. * If inside a abbr tag the abbr is removed. */ formatAbbr: function () { var range = Aloha.Selection.getRangeObject(); if ( Aloha.activeEditable ) { if ( this.findAbbrMarkup( range ) ) { this.removeAbbr(); } else { this.insertAbbr(); } } }, /** * Insert a new abbr at the current selection. When the selection is collapsed, * the abbr will have a default abbr text, otherwise the selected text will be * the abbr text. */ insertAbbr: function ( extendToWord ) { // current selection or cursor position var range = Aloha.Selection.getRangeObject(); // do not insert a abbr in a abbr if ( this.findAbbrMarkup( range ) ) { return; } // if selection is collapsed then extend to the word. if ( range.isCollapsed() && extendToWord != false ) { GENTICS.Utils.Dom.extendToWord( range ); } if ( range.isCollapsed() ) { // insert a abbr with text here var abbrText = i18n.t( 'newabbr.defaulttext' ); var newAbbr = jQuery( '' + abbrText + '' ); GENTICS.Utils.Dom.insertIntoDOM( newAbbr, range, jQuery( Aloha.activeEditable.obj ) ); range.startContainer = range.endContainer = newAbbr.contents().get( 0 ); range.startOffset = 0; range.endOffset = abbrText.length; } else { var newAbbr = jQuery( '' ); GENTICS.Utils.Dom.addMarkup( range, newAbbr, false ); } range.select(); this.abbrField.foreground(); this.abbrField.focus(); }, /** * Remove an a tag. */ removeAbbr: function () { var range = Aloha.Selection.getRangeObject(); var foundMarkup = this.findAbbrMarkup(); if ( foundMarkup ) { // remove the abbr GENTICS.Utils.Dom.removeFromDOM( foundMarkup, range, true ); // select the (possibly modified) range range.select(); } }, /** * Make the given jQuery object (representing an editable) clean for saving * Find all abbrs and remove editing objects * @param obj jQuery object to make clean * @return void */ makeClean: function ( obj ) { // nothing to do... }, /** * toString method * @return string */ toString: function () { return 'abbr'; } } ); } );