;(function (define, undefined) { 'use strict'; define(['jquery', 'underscore', 'annotator_1.2.9'], function ($, _, Annotator) { /** * The CaretNavigation Plugin which allows notes creation when users use * caret navigation to select the text. * Use `Ctrl + SPACE` or `Ctrl + ENTER` to open the editor. **/ Annotator.Plugin.CaretNavigation = function () { // Call the Annotator.Plugin constructor this sets up the element and // options properties. _.bindAll(this, 'onKeyUp'); Annotator.Plugin.apply(this, arguments); }; $.extend(Annotator.Plugin.CaretNavigation.prototype, new Annotator.Plugin(), { pluginInit: function () { $(document).on('keyup', this.onKeyUp); }, destroy: function () { $(document).off('keyup', this.onKeyUp); }, isShortcut: function (event) { // Character ']' has keyCode 221 return event.keyCode === 221 && event.ctrlKey && event.shiftKey; }, hasSelection: function (ranges) { return (ranges || []).length; }, saveSelection: function () { this.savedRange = Annotator.Util.getGlobal().getSelection().getRangeAt(0); }, restoreSelection: function () { if (this.savedRange) { var browserRange = new Annotator.Range.BrowserRange(this.savedRange), normedRange = browserRange.normalize().limit(this.annotator.wrapper[0]); Annotator.Util.readRangeViaSelection(normedRange); this.savedRange = null; } }, onKeyUp: function (event) { var annotator = this.annotator, self = this, isAnnotator, annotation, highlights, position, save, cancel, cleanup; // Do nothing if not a shortcut. if (!this.isShortcut(event)) { return true; } // Get the currently selected ranges. annotator.selectedRanges = annotator.getSelectedRanges(); // Do nothing if there is no selection if (!this.hasSelection(annotator.selectedRanges)) { return true; } isAnnotator = _.some(annotator.selectedRanges, function (range) { return annotator.isAnnotator(range.commonAncestor); }); // Do nothing if we are in Annotator. if (isAnnotator) { return true; } // Show a temporary highlight so the user can see what they selected // Also extract the quotation and serialize the ranges annotation = annotator.setupAnnotation(annotator.createAnnotation()); highlights = $(annotation.highlights).addClass('annotator-hl-temporary'); if (annotator.adder.is(':visible')) { position = annotator.adder.position(); annotator.adder.hide(); } else { position = highlights.last().position(); } // Subscribe to the editor events // Make the highlights permanent if the annotation is saved save = function () { cleanup(); highlights.removeClass('annotator-hl-temporary'); // Fire annotationCreated events so that plugins can react to them annotator.publish('annotationCreated', [annotation]); }; // Remove the highlights if the edit is cancelled cancel = function () { self.restoreSelection(); cleanup(); annotator.deleteAnnotation(annotation); }; // Don't leak handlers at the end cleanup = function () { annotator.unsubscribe('annotationEditorHidden', cancel); annotator.unsubscribe('annotationEditorSubmit', save); self.savedRange = null; }; annotator.subscribe('annotationEditorHidden', cancel); annotator.subscribe('annotationEditorSubmit', save); this.saveSelection(); // Display the editor. annotator.showEditor(annotation, position); event.preventDefault(); } }); }); }).call(this, define || RequireJS.define);