second batch: works, but failing tests - ie blocking span
[fnpeditor.git] / src / editor / modules / documentCanvas / canvas / canvas.js
index c6a7c82..af1ed28 100644 (file)
@@ -3,11 +3,13 @@ define([
 'libs/underscore',
 'libs/backbone',
 'fnpjs/logging/logging',
+'wlxml/wlxml',
 'modules/documentCanvas/canvas/documentElement',
 'modules/documentCanvas/canvas/keyboard',
 'modules/documentCanvas/canvas/utils',
-'modules/documentCanvas/canvas/wlxmlListener'
-], function($, _, Backbone, logging, documentElement, keyboard, utils, wlxmlListener) {
+'modules/documentCanvas/canvas/wlxmlListener',
+'modules/documentCanvas/canvas/genericElement'
+], function($, _, Backbone, logging, wlxml, documentElement, keyboard, utils, wlxmlListener, genericElement) {
     
 'use strict';
 /* global document:false, window:false, Node:false, gettext */
@@ -54,8 +56,49 @@ $.extend(TextHandler.prototype, {
 
 });
 
+var ElementsRegister = function() {
+    this._register = {
+        '': ElementsRegister.createCanvasElementType(genericElement, documentElement.DocumentNodeElement)
+    };
+
+}
+_.extend(ElementsRegister, {
+    createCanvasElementType: function(elementPrototype, inheritFrom) {
+        var Constructor = function() {
+            if(!this.super) {
+                this.super = inheritFrom.prototype;
+            }
+            inheritFrom.apply(this, Array.prototype.slice.call(arguments, 0));
+            
+        };
+        Constructor.prototype = Object.create(inheritFrom.prototype);
+        _.extend(Constructor.prototype, elementPrototype);
+        return Constructor;
+    }
+});
+_.extend(ElementsRegister.prototype, {
+    register: function(klass, elementPrototype) {
+        this._register[klass] = ElementsRegister.createCanvasElementType(elementPrototype, this.getFactoryFor(''));
+    },
+    getFactoryFor: function(klass) {
+        var Factory;
+        wlxml.getClassHierarchy(klass).reverse().some(function(klass) {
+            Factory = this._register[klass];
+            if(Factory) {
+                return true;
+            }
+        }.bind(this));
+        return Factory;
+    }
+});
+
+
 
-var Canvas = function(wlxmlDocument) {
+var Canvas = function(wlxmlDocument, elements) {
+    this.elementsRegister = new ElementsRegister();
+    (elements || []).forEach(function(elementDesc) {
+        this.elementsRegister.register(elementDesc.klass, elementDesc.element);
+    }.bind(this));
     this.eventBus = _.extend({}, Backbone.Events);
     this.wrapper = $('<div>').addClass('canvas-wrapper').attr('contenteditable', true);
     this.wlxmlListener = wlxmlListener.create(this);
@@ -77,7 +120,15 @@ $.extend(Canvas.prototype, Backbone.Events, {
     },
 
     createElement: function(wlxmlNode) {
-        var Factory = wlxmlNode.nodeType === Node.TEXT_NODE ?  documentElement.DocumentTextElement : documentElement.factoryForTag(wlxmlNode.getTagName());
+        var Factory;
+        if(wlxmlNode.nodeType === Node.TEXT_NODE) {
+            Factory = documentElement.DocumentTextElement
+        } else {
+            if(wlxmlNode.getClass() === 'p') {
+               // debugger;
+            }
+            Factory = this.elementsRegister.getFactoryFor(wlxmlNode.getClass());
+        }
         return new Factory(wlxmlNode, this);
     },
 
@@ -558,8 +609,8 @@ $.extend(Cursor.prototype, {
 });
 
 return {
-    fromXMLDocument: function(wlxmlDocument) {
-        return new Canvas(wlxmlDocument);
+    fromXMLDocument: function(wlxmlDocument, elements) {
+        return new Canvas(wlxmlDocument, elements);
     }
 };