From 6435513192b5be363719dcb1559c93b52944800d Mon Sep 17 00:00:00 2001 From: =?utf8?q?Aleksander=20=C5=81ukasz?= Date: Fri, 5 Jul 2013 14:42:48 +0200 Subject: [PATCH 1/1] canvas3 wip - testing simple api, children --- modules/documentCanvas/canvas/canvas.js | 29 ++++++++ modules/documentCanvas/canvas/canvas.test3.js | 69 +++++++++++++++++++ .../documentCanvas/canvas/documentElement.js | 65 +++++++++++++++++ tests/main.js | 4 +- 4 files changed, 165 insertions(+), 2 deletions(-) create mode 100644 modules/documentCanvas/canvas/canvas.js create mode 100644 modules/documentCanvas/canvas/canvas.test3.js create mode 100644 modules/documentCanvas/canvas/documentElement.js diff --git a/modules/documentCanvas/canvas/canvas.js b/modules/documentCanvas/canvas/canvas.js new file mode 100644 index 0000000..ae7a7b2 --- /dev/null +++ b/modules/documentCanvas/canvas/canvas.js @@ -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 index 0000000..f270328 --- /dev/null +++ b/modules/documentCanvas/canvas/canvas.test3.js @@ -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('
'); + expect(c.doc().wlxmlTag).to.equal('section'); + }); + }); + + describe('document api', function() { + describe('document root element', function() { + var c = canvas.fromXML('
'); + 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('
'), + 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('\ +
\ +
Alice
\ +
has
\ +
a cat
\ +
+ '); + 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 index 0000000..50e680d --- /dev/null +++ b/modules/documentCanvas/canvas/documentElement.js @@ -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 diff --git a/tests/main.js b/tests/main.js index eb765ed..cc20549 100644 --- a/tests/main.js +++ b/tests/main.js @@ -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({ -- 2.20.1