Commit b83e27fc by lduarte1991

Diacritic Plugin for Annotator Tool: Pull-request Fixes

Making sure extension comes after annotator css
parent 88d88139
...@@ -48,20 +48,20 @@ class AnnotatableFields(object): ...@@ -48,20 +48,20 @@ class AnnotatableFields(object):
default='None', default='None',
) )
annotation_storage_url = String( annotation_storage_url = String(
help="Location of Annotation backend", help=_("Location of Annotation backend"),
scope=Scope.settings, scope=Scope.settings,
default="http://your_annotation_storage.com", default="http://your_annotation_storage.com",
display_name="Url for Annotation Storage" display_name=_("Url for Annotation Storage"),
) )
annotation_token_secret = String( annotation_token_secret = String(
help="Secret string for annotation storage", help=_("Secret string for annotation storage"),
scope=Scope.settings, scope=Scope.settings,
default="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", default="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
display_name="Secret Token String for Annotation" display_name=_("Secret Token String for Annotation"),
) )
diacritics = String( diacritics = String(
display_name="Diacritic Marks", display_name=_("Diacritic Marks"),
help= "Add diacritic marks to be added to a text using the comma-separated form, i.e. markname;urltomark;baseline,markname2;urltomark2;baseline2", help=_("Add diacritic marks to be added to a text using the comma-separated form, i.e. markname;urltomark;baseline,markname2;urltomark2;baseline2"),
scope=Scope.settings, scope=Scope.settings,
default='', default='',
) )
......
...@@ -34,10 +34,29 @@ class AnnotatableFields(object): ...@@ -34,10 +34,29 @@ class AnnotatableFields(object):
scope=Scope.settings, scope=Scope.settings,
default=_('Video Annotation'), default=_('Video Annotation'),
) )
sourceurl = String(help=_("The external source URL for the video."), display_name=_("Source URL"), scope=Scope.settings, default="http://video-js.zencoder.com/oceans-clip.mp4") sourceurl = String(
poster_url = String(help=_("Poster Image URL"), display_name=_("Poster URL"), scope=Scope.settings, default="") help=_("The external source URL for the video."),
annotation_storage_url = String(help=_("Location of Annotation backend"), scope=Scope.settings, default="http://your_annotation_storage.com", display_name=_("Url for Annotation Storage")) display_name=_("Source URL"),
annotation_token_secret = String(help=_("Secret string for annotation storage"), scope=Scope.settings, default="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", display_name=_("Secret Token String for Annotation")) scope=Scope.settings, default="http://video-js.zencoder.com/oceans-clip.mp4"
)
poster_url = String(
help=_("Poster Image URL"),
display_name=_("Poster URL"),
scope=Scope.settings,
default=""
)
annotation_storage_url = String(
help=_("Location of Annotation backend"),
scope=Scope.settings,
default="http://your_annotation_storage.com",
display_name=_("Url for Annotation Storage"),
)
annotation_token_secret = String(
help=_("Secret string for annotation storage"),
scope=Scope.settings,
default="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
display_name=_("Secret Token String for Annotation")
)
class VideoAnnotationModule(AnnotatableFields, XModule): class VideoAnnotationModule(AnnotatableFields, XModule):
'''Video Annotation Module''' '''Video Annotation Module'''
......
...@@ -18,80 +18,101 @@ ...@@ -18,80 +18,101 @@
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/ */
var _ref, var _ref;
__bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, var __bind = function(fn, me){
__hasProp = {}.hasOwnProperty, return function(){
__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; }; 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) { Annotator.Plugin.Diacritics = (function(_super) {
__extends(Diacritics, _super); __extends(Diacritics, _super);
//Options will include diacritic name, picture used, baseline //Options will include diacritic name, picture used, baseline
Diacritics.prototype.options = null; Diacritics.prototype.options = null;
Diacritics.prototype.diacriticmarks = null; Diacritics.prototype.diacriticmarks = null;
//initiate diacritics elements /**
function Diacritics(element,options) { * Declares all the functions and variables that the plugin will need.
this.pluginSubmit = __bind(this.pluginSubmit, this); * @constructor
this.updateDiacritics = __bind(this.updateDiacritics, this); */
function Diacritics(element,options) {
this.pluginSubmit = __bind(this.pluginSubmit, this);
this.updateDiacritics = __bind(this.updateDiacritics, this);
this.updateViewer = __bind(this.updateViewer, this); this.updateViewer = __bind(this.updateViewer, this);
this.getDiacritics = __bind(this.getDiacritics, this); this.getDiacritics = __bind(this.getDiacritics, this);
this.getPos = __bind(this.getPos, this); this.getPos = __bind(this.getPos, this);
this.putMarkatLocation = __bind(this.putMarkatLocation, this); this.putMarkAtLocation = __bind(this.putMarkAtLocation, this);
this.updateEditorForDiacritics = __bind(this.updateEditorForDiacritics, this); this.updateEditorForDiacritics =
__bind(this.updateEditorForDiacritics, this);
this.options = options; this.options = options;
this.diacriticmarks = this.getDiacritics(); this.diacriticmarks = this.getDiacritics();
_ref = Diacritics.__super__.constructor.apply(this, arguments); _ref = Diacritics.__super__.constructor.apply(this, arguments);
return _ref; return _ref;
} }
//example variables to be used to receive input in the annotator view //example variables to be used to receive input in the annotator view
Diacritics.prototype.field = null; Diacritics.prototype.field = null;
Diacritics.prototype.input = null; Diacritics.prototype.input = null;
//this function will initialize the plug in /**
Diacritics.prototype.pluginInit = function() { * Initalizes the Plug-in for diacritic marks. It adds in the field for the mark
console.log("Diacritics-pluginInit"); * and sets up listeners from the Annotator.js file to make changes as needed
*/
Diacritics.prototype.pluginInit = function() {
//Check that annotator is working //Check that annotator is working
if (!Annotator.supported()) { if (!Annotator.supported()) {
return; return;
} }
var di = this.diacriticmarks; var di = this.diacriticmarks;
//-- Editor //-- Editor
var self = this; var self = this;
if(di != 'undefined'){ if(di != 'undefined'){
$.each(di,function(item){ $.each(di,function(item){
self.field = self.annotator.editor.addField({ self.field = self.annotator.editor.addField({
type: 'checkbox', //options (textarea,input,select,checkbox) //options (textarea,input,select,checkbox)
label: Annotator._t(item), type: 'checkbox',
submit: self.pluginSubmit, label: Annotator._t(item),
}); submit: self.pluginSubmit,
});
});
//-- Viewer
this.annotator.viewer.addField({
load: this.updateViewer,
}); });
//-- Viewer
var newview = this.annotator.viewer.addField({
load: this.updateViewer,
});
this.annotator.subscribe('annotationsLoaded', this.updateDiacritics); this.annotator.subscribe('annotationsLoaded', this.updateDiacritics);
this.annotator.subscribe('annotationUploaded', this.updateDiacritics); this.annotator.subscribe('annotationUploaded', this.updateDiacritics);
this.annotator.subscribe('annotationDeleted', this.updateDiacritics); this.annotator.subscribe('annotationDeleted', this.updateDiacritics);
this.annotator.subscribe('annotationUpdated', this.updateDiacritics); this.annotator.subscribe('annotationUpdated', this.updateDiacritics);
this.annotator.subscribe('annotationEditorShown', this.updateEditorForDiacritics, this.field); this.annotator.subscribe('annotationEditorShown', this.updateEditorForDiacritics, this.field);
var self = this; $(window).resize(this.updateDiacritics.bind(this));
$(window).resize(function() {
self.updateDiacritics();
});
} }
return this.input = $(this.field).find(':input'); return this.input = $(this.field).find(':input');
}; };
//The following function is run when a person hits submit. /**
* 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) { Diacritics.prototype.pluginSubmit = function(field, annotation) {
var checkedItems = $(this.field).find(':input'); var checkedItems = $(this.field).find(':input');
var self = this; var self = this;
...@@ -100,105 +121,150 @@ Annotator.Plugin.Diacritics = (function(_super) { ...@@ -100,105 +121,150 @@ Annotator.Plugin.Diacritics = (function(_super) {
var index = $.inArray(checkedItems[item].placeholder, annotation.tags); var index = $.inArray(checkedItems[item].placeholder, annotation.tags);
if(index != -1){ if(index != -1){
annotation.tags.splice(index, 1); annotation.tags.splice(index, 1);
if (typeof $($('.annotator-wrapper')[0]).find('div.'+annotation.id)[0] != 'undefined'){ var annotatorWrapper = $('.annotator-wrapper').first();
$($('.annotator-wrapper')[0]).find('div.'+annotation.id)[0].remove(); var element = annotatorWrapper.find('div.' + annotation.id);
} else {
$($('.annotator-wrapper')[0]).find('div.undefined')[0].remove(); if(!element.length){
element = annotatorWrapper.find('div.undefined');
} }
element.remove();
} }
if(checkedItems[item].checked == true){ if(checkedItems[item].checked === true){
annotation.tags.unshift(checkedItems[item].placeholder); annotation.tags.unshift(checkedItems[item].placeholder);
self.putMarkatLocation(annotation, checkedItems[item].placeholder); self.putMarkAtLocation(annotation, checkedItems[item].placeholder);
} }
} else { } else {
if(checkedItems[item].checked == true){ if(checkedItems[item].checked === true){
annotation['tags'] = [checkedItems[item].placeholder]; annotation.tags = [checkedItems[item].placeholder];
self.putMarkatLocation(annotation, checkedItems[item].placeholder); self.putMarkAtLocation(annotation, checkedItems[item].placeholder);
} }
} }
}); });
} };
Diacritics.prototype.putMarkatLocation = function (annotation, mark){ /**
* 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 loc = this.getPos(annotation.highlights[0]);
var alignment = this.diacriticmarks[mark][1]; var alignment = this.diacriticmarks[mark][1];
var imgurl = this.diacriticmarks[mark][0]; var imgurl = this.diacriticmarks[mark][0];
var newdiv = document.createElement('div'); var top;
var className = 'mark ' + annotation.id; switch(alignment){
newdiv.setAttribute('class',className); case 'top':
if(alignment == 'top'){ top = (loc.y-5);
$(newdiv).css('top',""+(loc.y-5)+"px"); break;
} else if(alignment == 'bottom'){ case 'bottom':
$(newdiv).css('top',""+(loc.y+loc.height-5)+"px"); top = (loc.y + loc.height-5);
} else{ break;
$(newdiv).css('top',""+loc.y+"px"); default:
top = loc.y;
} }
$(newdiv).css('left',""+(loc.x+(loc.width/2.0)-5)+"px"); $('<div></div>').addClass('mark ' + annotation.id).css({
$(newdiv).css('background-image', 'url('+imgurl+')'); 'top': top,
$('.annotator-wrapper')[0].appendChild(newdiv); '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(){ Diacritics.prototype.getDiacritics = function(){
var diacritics = {};
var diacriticsList;
if(typeof this.options.diacritics != 'undefined'){ if(typeof this.options.diacritics != 'undefined'){
var self = this; diacriticsList = this.options.diacritics.split(",");
var final = new Object(), prelim = this.options.diacritics.split(","); $.each(diacriticsList, function(key, item){
prelim.forEach(function(item){
var temp = item.split(";"); var temp = item.split(";");
if (temp.length <3) {return undefined;} if (temp.length > 2) {
final[temp[0]] = [temp[1],temp[2]]; diacritics[temp[0]] = [temp[1], temp[2]];
}
}); });
return final;
} }
console.log("Was undefined"); return diacritics;
return undefined; };
}
/**
* 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) { Diacritics.prototype.getPos = function(el) {
var off = $(el).offset(); var element = $(el),
return {x: off.left-$($('.annotator-wrapper')[0]).offset().left, y: off.top-$($('.annotator-wrapper')[0]).offset().top, width:$(el).width(), height:$(el).height()}; 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(){ Diacritics.prototype.updateDiacritics = function(){
$('.mark').remove(); $('.mark').remove();
var annotations = this.annotator.plugins['Store'].annotations; var annotations = this.annotator.plugins.Store.annotations;
var self = this; var self = this;
annotations.forEach(function(ann){ $.each(annotations, function(key, annotation){
$.each(self.diacriticmarks, function(item){ $.each(self.diacriticmarks, function(tag){
if($.inArray(item, ann.tags) != -1){ if($.inArray(tag, annotation.tags) != -1){
self.putMarkatLocation(ann, item); self.putMarkAtLocation(annotation, tag);
} }
}); });
}); });
} };
Diacritics.prototype.updateViewer = function(field,annotation){ /**
* 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(); $(field).remove();
} };
Diacritics.prototype.updateEditorForDiacritics = function(field, annotation){ /**
* 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'){ if (typeof annotation.tags == 'undefined'){
return; return;
} }
var self = this;
var inputItems = $(this.field).find(':input'); var inputItems = $(this.field).find(':input');
var dictOfItems = {} var dictOfItems = {};
$.each(inputItems, function(item){ var self = this;
inputItems[item].checked = false;
dictOfItems[inputItems[item].placeholder] = inputItems[item]; // add each diacritic mark to a dictionary and default to off
$.each(inputItems, function(key,item){
item.checked = false;
dictOfItems[item.placeholder] = item;
}); });
annotation.tags.forEach(function(tag){
if(typeof self.diacriticmarks[tag] != 'undefined'){ // 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; dictOfItems[tag].checked = true;
} }
}); });
} };
return Diacritics; return Diacritics;
})(Annotator.Plugin); })(Annotator.Plugin);
\ No newline at end of file
...@@ -871,8 +871,8 @@ PIPELINE_CSS = { ...@@ -871,8 +871,8 @@ PIPELINE_CSS = {
'css/vendor/jquery.qtip.min.css', 'css/vendor/jquery.qtip.min.css',
'css/vendor/responsive-carousel/responsive-carousel.css', 'css/vendor/responsive-carousel/responsive-carousel.css',
'css/vendor/responsive-carousel/responsive-carousel.slide.css', 'css/vendor/responsive-carousel/responsive-carousel.slide.css',
'css/vendor/ova/edx-annotator.css',
'css/vendor/ova/annotator.css', 'css/vendor/ova/annotator.css',
'css/vendor/ova/edx-annotator.css',
'css/vendor/ova/video-js.min.css', 'css/vendor/ova/video-js.min.css',
'css/vendor/ova/rangeslider.css', 'css/vendor/ova/rangeslider.css',
'css/vendor/ova/share-annotator.css', 'css/vendor/ova/share-annotator.css',
......
...@@ -148,6 +148,9 @@ ${static.css(group='style-vendor-tinymce-skin', raw=True)} ...@@ -148,6 +148,9 @@ ${static.css(group='style-vendor-tinymce-skin', raw=True)}
highlightTags:{ highlightTags:{
tag: "${tag}", tag: "${tag}",
}, },
diacriticMarks:{
diacritics: "${diacritic_marks}"
}
}, },
optionsVideoJS: {techOrder: ["html5","flash","youtube"]}, optionsVideoJS: {techOrder: ["html5","flash","youtube"]},
optionsRS: {}, optionsRS: {},
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment