canvas3 wip - testing simple api, children
authorAleksander Łukasz <aleksander.lukasz@nowoczesnapolska.org.pl>
Fri, 5 Jul 2013 12:42:48 +0000 (14:42 +0200)
committerAleksander Łukasz <aleksander.lukasz@nowoczesnapolska.org.pl>
Fri, 5 Jul 2013 12:42:48 +0000 (14:42 +0200)
modules/documentCanvas/canvas/canvas.js [new file with mode: 0644]
modules/documentCanvas/canvas/canvas.test3.js [new file with mode: 0644]
modules/documentCanvas/canvas/documentElement.js [new file with mode: 0644]
tests/main.js

diff --git a/modules/documentCanvas/canvas/canvas.js b/modules/documentCanvas/canvas/canvas.js
new file mode 100644 (file)
index 0000000..ae7a7b2
--- /dev/null
@@ -0,0 +1,29 @@
+define([
+'libs/jquery-1.9.1.min',
+'modules/documentCanvas/canvas/documentElement'
+], function($, documentElement) {
+    
+'use strict';
+
+var Canvas = function(xml) {
+    xml = $.parseXML(xml);
+    this.d = xml !== null ? $(xml.childNodes[0]) : null;
+}
+
+$.extend(Canvas.prototype, {
+
+    doc: function() {
+        if(this.d === null)
+            return null;
+        return documentElement.wrap(this.d.get(0)); //{wlxmlTag: this.d.prop('tagName')};
+    }
+
+});
+
+return {
+    fromXML: function(xml) {
+        return new Canvas(xml);
+    }
+};
+
+});
\ No newline at end of file
diff --git a/modules/documentCanvas/canvas/canvas.test3.js b/modules/documentCanvas/canvas/canvas.test3.js
new file mode 100644 (file)
index 0000000..f270328
--- /dev/null
@@ -0,0 +1,69 @@
+define([
+'libs/chai',
+'modules/documentCanvas/canvas/canvas',
+'modules/documentCanvas/canvas/documentElement'
+], function(chai, canvas, documentElement) {
+    
+'use strict';
+
+var expect = chai.expect;
+
+describe('Canvas', function() {
+    describe('basic properties', function() {
+        it('renders empty document when canvas created from empty XML', function() {
+            var c = canvas.fromXML('');
+            expect(c.doc()).to.equal(null);
+        });
+
+        it('gives access to its document root node', function() {
+            var c = canvas.fromXML('<section></section>');
+            expect(c.doc().wlxmlTag).to.equal('section');
+        });
+    });
+
+    describe('document api', function() {
+        describe('document root element', function() {
+            var c = canvas.fromXML('<section></section>');
+            it('exists', function() {
+                expect(c.doc()).to.be.instanceOf(documentElement.DocumentElement);
+            });
+            it('is of type DocumentNodeElement', function() {
+                expect(c.doc()).to.be.instanceOf(documentElement.DocumentNodeElement);
+            });
+        });
+
+        it('a', function() {
+            var c = canvas.fromXML('<section><div></div></section>'),
+                children = c.doc().children();
+            expect(children.length).to.equal(3);
+            expect(children[0]).to.be.instanceOf(documentElement.DocumentTextElement);
+            expect(children[1]).to.be.instanceOf(documentElement.DocumentNodeElement);
+            expect(children[2]).to.be.instanceOf(documentElement.DocumentTextElement);
+        });
+
+    });
+});
+
+/*describe('Canvas', function() {
+    it('can wrap selected document nodes in a list', function() {
+        var c = canvas.fromXML('\
+            <section>\
+                <div>Alice</div>\
+                <div>has</div>\
+                <div>a cat</div>\
+            </section>
+        ');
+        var div_alice   = c.doc().children({tag: 'div'})[0];
+        var div_cat     = c.doc().children({tag: 'div'})[2];
+        c.doc.wrapInList({start: div_alice, end: div_cat});
+
+        expect(c.doc().children().length === 3)
+
+
+    })
+});*/
+
+
+
+
+});
\ No newline at end of file
diff --git a/modules/documentCanvas/canvas/documentElement.js b/modules/documentCanvas/canvas/documentElement.js
new file mode 100644 (file)
index 0000000..50e680d
--- /dev/null
@@ -0,0 +1,65 @@
+define([
+'libs/jquery-1.9.1.min'
+], function($) {
+    
+'use strict';
+
+// DocumentElement represents a node from WLXML document rendered inside Canvas
+var DocumentElement = function(htmlElement) {
+    if(arguments.length === 0)
+        return;
+    this.$element = $(htmlElement);
+    this.wlxmlTag = this.$element.prop('tagName');
+};
+
+$.extend(DocumentElement.prototype, {
+    children: function() {
+        var toret = [];
+        if(this instanceof DocumentTextElement)
+            return toret;
+
+
+        var elementContent = this.$element.contents();
+        elementContent.each(function(idx) {
+            var element = documentElementFromHTMLElement(this);
+            if(
+                (toret.length === 0 && (element instanceof DocumentNodeElement)) ||
+                (toret.length > 0 && (toret[toret.length -1] instanceof DocumentNodeElement) && (element instanceof DocumentNodeElement))
+            )
+                toret.push(documentElementFromHTMLElement(document.createTextNode()));
+            toret.push(element);
+            if((idx === elementContent.length - 1) && (element instanceof DocumentNodeElement))
+                toret.push(documentElementFromHTMLElement(document.createTextNode()));
+        });
+        return toret;
+    }
+});
+
+var DocumentNodeElement = function(htmlElement) {
+    DocumentElement.call(this, htmlElement);
+};
+
+var DocumentTextElement = function(htmlElement) {
+    DocumentElement.call(this, htmlElement);  
+};
+
+DocumentNodeElement.prototype = new DocumentElement();
+DocumentTextElement.prototype = new DocumentElement();
+
+var documentElementFromHTMLElement = function(htmlElement) {
+    if(htmlElement.nodeType === Node.ELEMENT_NODE)
+        return new DocumentNodeElement(htmlElement);
+    if(htmlElement.nodeType === Node.TEXT_NODE)
+        return new DocumentTextElement(htmlElement);
+}
+
+return {
+    wrap: function(htmlElement) {
+        return documentElementFromHTMLElement(htmlElement);
+    },
+    DocumentElement: DocumentElement,
+    DocumentNodeElement: DocumentNodeElement,
+    DocumentTextElement: DocumentTextElement
+};
+
+});
\ No newline at end of file
index eb765ed..cc20549 100644 (file)
@@ -1,9 +1,9 @@
 (function() {
 
-    mocha.setup('tdd');
+    mocha.setup('bdd');
 
     var tests = Object.keys(window.__karma__.files).filter(function (file) {
-      return /\.test\.js$/.test(file);
+      return /\.test3\.js$/.test(file);
     });
 
     require({