271 lines
9.8 KiB
JavaScript
271 lines
9.8 KiB
JavaScript
/*
|
|
Diacritic Annotator Plugin v1.0 (https://github.com/lduarte1991/diacritic-annotator)
|
|
Copyright (C) 2014 Luis F Duarte
|
|
License: https://github.com/lduarte1991/diacritic-annotator/blob/master/LICENSE.rst
|
|
|
|
This program 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 (at your option) any later version.
|
|
|
|
This program 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.
|
|
*/
|
|
|
|
var _ref;
|
|
var __bind = function(fn, me){
|
|
return function(){
|
|
return fn.apply(me, arguments);
|
|
};
|
|
};
|
|
var __hasProp = {}.hasOwnProperty;
|
|
var __extends = function(child, parent) {
|
|
for (var key in parent) {
|
|
if (__hasProp.call(parent, key))
|
|
child[key] = parent[key];
|
|
}
|
|
function ctor() { this.constructor = child; }
|
|
ctor.prototype = parent.prototype;
|
|
child.prototype = new ctor();
|
|
child.__super__ = parent.prototype;
|
|
return child;
|
|
};
|
|
|
|
Annotator.Plugin.Diacritics = (function(_super) {
|
|
__extends(Diacritics, _super);
|
|
|
|
//Options will include diacritic name, picture used, baseline
|
|
Diacritics.prototype.options = null;
|
|
Diacritics.prototype.diacriticmarks = null;
|
|
|
|
/**
|
|
* Declares all the functions and variables that the plugin will need.
|
|
* @constructor
|
|
*/
|
|
function Diacritics(element,options) {
|
|
this.pluginSubmit = __bind(this.pluginSubmit, this);
|
|
this.updateDiacritics = __bind(this.updateDiacritics, this);
|
|
this.updateViewer = __bind(this.updateViewer, this);
|
|
this.getDiacritics = __bind(this.getDiacritics, this);
|
|
this.getPos = __bind(this.getPos, this);
|
|
this.putMarkAtLocation = __bind(this.putMarkAtLocation, this);
|
|
this.updateEditorForDiacritics =
|
|
__bind(this.updateEditorForDiacritics, this);
|
|
|
|
this.options = options;
|
|
this.diacriticmarks = this.getDiacritics();
|
|
_ref = Diacritics.__super__.constructor.apply(this, arguments);
|
|
return _ref;
|
|
}
|
|
|
|
//example variables to be used to receive input in the annotator view
|
|
Diacritics.prototype.field = null;
|
|
Diacritics.prototype.input = null;
|
|
|
|
/**
|
|
* Initalizes the Plug-in for diacritic marks. It adds in the field for the mark
|
|
* and sets up listeners from the Annotator.js file to make changes as needed
|
|
*/
|
|
Diacritics.prototype.pluginInit = function() {
|
|
//Check that annotator is working
|
|
if (!Annotator.supported()) {
|
|
return;
|
|
}
|
|
var di = this.diacriticmarks;
|
|
|
|
//-- Editor
|
|
var self = this;
|
|
if(di != 'undefined'){
|
|
$.each(di,function(item){
|
|
self.field = self.annotator.editor.addField({
|
|
//options (textarea,input,select,checkbox)
|
|
type: 'checkbox',
|
|
label: Annotator._t(item),
|
|
submit: self.pluginSubmit,
|
|
});
|
|
});
|
|
|
|
//-- Viewer
|
|
this.annotator.viewer.addField({
|
|
load: this.updateViewer,
|
|
});
|
|
|
|
this.annotator.subscribe('annotationsLoaded', this.updateDiacritics);
|
|
this.annotator.subscribe('annotationUploaded', this.updateDiacritics);
|
|
this.annotator.subscribe('annotationDeleted', this.updateDiacritics);
|
|
this.annotator.subscribe('annotationUpdated', this.updateDiacritics);
|
|
this.annotator.subscribe('annotationEditorShown', this.updateEditorForDiacritics, this.field);
|
|
|
|
$(window).resize(this.updateDiacritics.bind(this));
|
|
}
|
|
|
|
return this.input = $(this.field).find(':input');
|
|
};
|
|
|
|
/**
|
|
* Adds or removes tag from checked/unchecked boxes of diacritics available
|
|
* @param field {Object} - element which holds editor
|
|
* @param annotation {Object} - object that contains annotation information from database
|
|
*/
|
|
Diacritics.prototype.pluginSubmit = function(field, annotation) {
|
|
var checkedItems = $(this.field).find(':input');
|
|
var self = this;
|
|
$.each(checkedItems, function(item){
|
|
if(typeof annotation.tags != 'undefined'){
|
|
var index = $.inArray(checkedItems[item].placeholder, annotation.tags);
|
|
if(index != -1){
|
|
annotation.tags.splice(index, 1);
|
|
var annotatorWrapper = $('.annotator-wrapper').first();
|
|
var element = annotatorWrapper.find('div.' + annotation.id);
|
|
|
|
if(!element.length){
|
|
element = annotatorWrapper.find('div.undefined');
|
|
}
|
|
|
|
element.remove();
|
|
}
|
|
|
|
if(checkedItems[item].checked === true){
|
|
annotation.tags.unshift(checkedItems[item].placeholder);
|
|
self.putMarkAtLocation(annotation, checkedItems[item].placeholder);
|
|
}
|
|
} else {
|
|
if(checkedItems[item].checked === true){
|
|
annotation.tags = [checkedItems[item].placeholder];
|
|
self.putMarkAtLocation(annotation, checkedItems[item].placeholder);
|
|
}
|
|
}
|
|
});
|
|
|
|
};
|
|
|
|
/**
|
|
* Draws the mark above a specific annotation
|
|
* @param annotation {Object} - location where mark should go
|
|
* @param mark {string}- type of mark that should go above annotation
|
|
*/
|
|
Diacritics.prototype.putMarkAtLocation = function (annotation, mark){
|
|
var loc = this.getPos(annotation.highlights[0]);
|
|
var alignment = this.diacriticmarks[mark][1];
|
|
var imgurl = this.diacriticmarks[mark][0];
|
|
|
|
var top;
|
|
switch(alignment){
|
|
case 'top':
|
|
top = (loc.y-5);
|
|
break;
|
|
case 'bottom':
|
|
top = (loc.y + loc.height-5);
|
|
break;
|
|
default:
|
|
top = loc.y;
|
|
}
|
|
$('<div></div>').addClass('mark ' + annotation.id).css({
|
|
'top': top,
|
|
'left': loc.x + (0.5 * loc.width) - 5,
|
|
'background-image': 'url(' + imgurl +')',
|
|
}).appendTo('.annotator-wrapper');
|
|
};
|
|
|
|
/**
|
|
* Gets the Diacritics from the instantiation in studio
|
|
* @returns An object with the diacritics instantiated
|
|
*/
|
|
Diacritics.prototype.getDiacritics = function(){
|
|
var diacritics = {};
|
|
var diacriticsList;
|
|
if(typeof this.options.diacritics != 'undefined'){
|
|
diacriticsList = this.options.diacritics.split(",");
|
|
$.each(diacriticsList, function(key, item){
|
|
var temp = item.split(";");
|
|
if (temp.length > 2) {
|
|
diacritics[temp[0]] = [temp[1], temp[2]];
|
|
}
|
|
});
|
|
}
|
|
return diacritics;
|
|
};
|
|
|
|
/**
|
|
* Gets the position of a specific element given the wrapper
|
|
* @param el {Object} - element you are trying to get the position of
|
|
*/
|
|
Diacritics.prototype.getPos = function(el) {
|
|
var element = $(el),
|
|
elementOffset = element.offset(),
|
|
annotatorOffset = $('.annotator-wrapper').offset();
|
|
|
|
return {
|
|
x: elementOffset.left - annotatorOffset.left,
|
|
y: elementOffset.top - annotatorOffset.top,
|
|
width: element.width(),
|
|
height: element.height()
|
|
};
|
|
};
|
|
|
|
/**
|
|
* Redraws the marks above annotations by cycling through tags
|
|
*/
|
|
Diacritics.prototype.updateDiacritics = function(){
|
|
$('.mark').remove();
|
|
var annotations = this.annotator.plugins.Store.annotations;
|
|
var self = this;
|
|
$.each(annotations, function(key, annotation){
|
|
$.each(self.diacriticmarks, function(tag){
|
|
if($.inArray(tag, annotation.tags) != -1){
|
|
self.putMarkAtLocation(annotation, tag);
|
|
}
|
|
});
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Removes unnecessary field that Annotator automatically adds to popup
|
|
* @param {Object} field - the html element that represents the popup
|
|
* @param {Object} annotation - the annotation element that holds metadata
|
|
*/
|
|
Diacritics.prototype.updateViewer = function(field, annotation){
|
|
$(field).remove();
|
|
};
|
|
|
|
/**
|
|
* Function for adding Diacritic choices to the annotator popup
|
|
* @param {Object} field - the html element that represents the popup
|
|
* @param {Object} annotation - the annotation element that holds metadata
|
|
*/
|
|
Diacritics.prototype.updateEditorForDiacritics =
|
|
function(field, annotation){
|
|
|
|
// if no tags are present, no need to go through this
|
|
if (typeof annotation.tags == 'undefined'){
|
|
return;
|
|
}
|
|
|
|
var inputItems = $(this.field).find(':input');
|
|
var dictOfItems = {};
|
|
var self = this;
|
|
|
|
// add each diacritic mark to a dictionary and default to off
|
|
$.each(inputItems, function(key,item){
|
|
item.checked = false;
|
|
dictOfItems[item.placeholder] = item;
|
|
});
|
|
|
|
// match tags to diacritics and check off the ones that are true
|
|
$.each(annotation.tags, function(key,tag){
|
|
if(self.diacriticmarks[tag]){
|
|
dictOfItems[tag].checked = true;
|
|
}
|
|
});
|
|
};
|
|
|
|
return Diacritics;
|
|
|
|
})(Annotator.Plugin);
|