Plugin development¶
Getting Started¶
Building a plugin is very simple. Simply attach a function that creates
your plugin to the Annotator.Plugin
namespace. The function will
receive the following arguments.
element
- The DOM element that is currently being annotated.
Additional arguments (such as options) can be passed in by the user when
the plugin is added to the Annotator. These will be passed in after the
element
.
Annotator.Plugin.HelloWorld = function (element) {
var myPlugin = {};
// Create your plugin here. Then return it.
return myPlugin;
};
Using Your Plugin¶
Adding your plugin to the annotator is the same as for all supported plugins. Simply call “addPlugin” on the annotator and pass in the name of the plugin and any options. For example:
// Setup the annotator on the page.
var content = $('#content').annotator();
// Add your plugin.
content.annotator('addPlugin', 'HelloWorld' /*, any other options */);
Setup¶
When the annotator creates your plugin it will take the following steps.
- Call your Plugin function passing in the annotated element plus any
additional arguments. (The Annotator calls the function with
new
allowing you to use a constructor function if you wish). - Attaches the current instance of the Annotator to the
.annotator
property of the plugin. - Calls
.pluginInit()
if the method exists on your plugin.
pluginInit()¶
If your plugin has a pluginInit()
method it will be called after the
annotator has been attached to your plugin. You can use it to set up the
plugin.
In this example we add a field to the viewer that contains the text provided when the plugin was added.
Annotator.Plugin.Message = function (element, message) {
var plugin = {};
plugin.pluginInit = function () {
this.annotator.viewer.addField({
load: function (field, annotation) {
field.innerHTML = message;
}
})
};
return plugin;
}
Usage:
// Setup the annotator on the page.
var content = $('#content').annotator();
// Add your plugin to the annotator and display the message "Hello World"
// in the viewer.
content.annotator('addPlugin', 'Message', 'Hello World');
Extending Annotator.Plugin¶
All supported Annotator plugins use a base “class” that has some useful
features such as event handling. To use this you simply need to extend
the Annotator.Plugin
function.
// This is now a constructor and needs to be called with `new`.
Annotator.Plugin.MyPlugin = function (element, options) {
// Call the Annotator.Plugin constructor this sets up the .element and
// .options properties.
Annotator.Plugin.apply(this, arguments);
// Set up the rest of your plugin.
};
// Set the plugin prototype. This gives us all of the Annotator.Plugin methods.
Annotator.Plugin.MyPlugin.prototype = new Annotator.Plugin();
// Now add your own custom methods.
Annotator.Plugin.MyPlugin.prototype.pluginInit = function () {
// Do something here.
};
If you’re using jQuery you can make this process a lot neater.
Annotator.Plugin.MyPlugin = function (element, options) {
// Same as before.
};
jQuery.extend(Annotator.Plugin.MyPlugin.prototype, new Annotator.Plugin(), {
events: {},
options: {
// Any default options.
}
pluginInit: function () {
},
myCustomMethod: function () {
}
});
Annotator.Plugin API¶
The Annotator.Plugin provides the following methods and properties.
element¶
This is the DOM element currently being annotated wrapped in a jQuery wrapper.
options¶
This is the options object, you can set default options when you create the object and they will be overridden by those provided when the plugin is created.
events¶
These can be either DOM events to be listened for within the
.element
or custom events defined by you. Custom events will not
receive the event
property that is passed to DOM event listeners.
These are bound when the plugin is instantiated.
publish(name, parameters)¶
Publish a custom event to all subscribers.
name
: The event name.parameters
: An array of parameters to pass to the subscriber.
subscribe(name, callback)¶
Subscribe to a custom event. This can be used to subscribe to your own events or those broadcast by the annotator and other plugins.
name
: The event name.callback
: A callback to be fired when the event is published. The callback will receive any arguments sent when the event is published.
unsubscribe(name, callback)¶
Unsubscribe from an event.
name
: The event name.callback
: The callback to be unsubscribed.
Annotator Events¶
The annotator fires the following events at key points in its operation.
You can subscribe to them using the .subscribe()
method. This can be
called on either the .annotator
object or if you’re extending
Annotator.Plugin
the plugin instance itself. The events are as
follows:
beforeAnnotationCreated(annotation)
- called immediately before an annotation is created. If you need to modify the annotation before it is saved use this event.
annotationCreated(annotation)
- called when the annotation is created use this to store the annotations.
beforeAnnotationUpdated(annotation)
- as above, but just before an existing annotation is saved.
annotationUpdated(annotation)
- as above, but for an existing annotation which has just been edited.
annotationDeleted(annotation)
- called when the user deletes an annotation.
annotationEditorShown(editor, annotation)
- called when the annotation editor is presented to the user.
annotationEditorHidden(editor)
- called when the annotation editor is hidden, both when submitted and when editing is cancelled.
annotationEditorSubmit(editor, annotation)
- called when the annotation editor is submitted.
annotationViewerShown(viewer, annotations)
- called when the annotation viewer is shown and provides the annotations being displayed.
annotationViewerTextField(field, annotation)
- called when the text field displaying the annotation comment in the viewer is created.
Example¶
A plugin that logs annotation activity to the console.
Annotator.Plugin.StoreLogger = function (element) {
return {
pluginInit: function () {
this.annotator
.subscribe("annotationCreated", function (annotation) {
console.info("The annotation: %o has just been created!", annotation)
})
.subscribe("annotationUpdated", function (annotation) {
console.info("The annotation: %o has just been updated!", annotation)
})
.subscribe("annotationDeleted", function (annotation) {
console.info("The annotation: %o has just been deleted!", annotation)
});
}
}
};