+ var children = c.doc().children();
+ expect(children.length === 2);
+ [0,1].forEach(function(idx) {
+ expect(children[idx]).to.be.instanceOf(documentElement.DocumentNodeElement);
+ });
+ });
+
+ it('trims white space from the beginning and the end of the block elements', function() {
+ var c = canvas.fromXML('<section> Alice <span>has</span> a cat </section>');
+ expect(c.doc().children()[0].getText()).to.equal('Alice ');
+ expect(c.doc().children()[2].getText()).to.equal(' a cat');
+ });
+
+ it('normalizes string of white characters to one space at the inline element boundries', function() {
+ var c = canvas.fromXML('<span> Alice has a cat </span>');
+ expect(c.doc().children()[0].getText()).to.equal(' Alice has a cat ');
+ });
+
+ it('normalizes string of white characters to one space before inline element', function() {
+ var c = canvas.fromXML('<div>Alice has <span>a cat</span></div>');
+ expect(c.doc().children()[0].getText()).to.equal('Alice has ');
+ });
+
+ it('normalizes string of white characters to one space after inline element', function() {
+ var c = canvas.fromXML('<div>Alice has <span>a</span> cat</div>');
+ expect(c.doc().children()[2].getText()).to.equal(' cat');
+ });
+ });
+ });
+
+ describe('manipulation api', function() {
+
+ describe('Basic Element inserting', function() {
+ it('can put new NodeElement at the end', function() {
+ var c = canvas.fromXML('<section></section>'),
+ appended = c.doc().append({tag: 'header', klass: 'some.class'}),
+ children = c.doc().children();
+
+ expect(children.length).to.equal(1);
+ expect(children[0].sameNode(appended));
+ });
+
+ it('can put new TextElement at the end', function() {
+ var c = canvas.fromXML('<section></section>'),
+ appended = c.doc().append({text: 'Alice'}),
+ children = c.doc().children();
+
+ expect(children.length).to.equal(1);
+ expect(children[0].sameNode(appended));
+ expect(children[0].getText()).to.equal('Alice');
+ });
+
+ it('can put new NodeElement after another NodeElement', function() {
+ var c = canvas.fromXML('<section><div></div></section>'),
+ div = c.doc().children()[0],
+ added = div.after({tag: 'header', klass: 'some.class'}),
+ children = c.doc().children();
+ expect(children.length).to.equal(2);
+ expect(children[1].sameNode(added));
+ });
+
+ it('can put new Nodeelement before another element', function() {
+ var c = canvas.fromXML('<section><div></div></section>'),
+ div = c.doc().children()[0],
+ added = div.before({tag: 'header', klass: 'some.class'}),
+ children = c.doc().children();
+ expect(children.length).to.equal(2);
+ expect(children[0].sameNode(added));
+ });
+
+ it('can put new DocumentNodeElement after DocumentTextElement', function() {
+ var c = canvas.fromXML('<section>Alice</section>'),
+ text = c.doc().children()[0],
+ added = text.after({tag: 'p'}),
+ children = c.doc().children();
+
+ expect(children.length).to.equal(2);
+ expect(children[0]).to.be.instanceOf(documentElement.DocumentTextElement);
+ expect(children[0].getText()).to.equal('Alice');
+ expect(children[1]).to.be.instanceOf(documentElement.DocumentNodeElement);
+ expect(children[1].sameNode(added)).to.be.true;
+ });
+ it('can put new DocumentNodeElement before DocumentTextElement', function() {
+ var c = canvas.fromXML('<section>Alice</section>'),
+ text = c.doc().children()[0],
+ added = text.before({tag: 'p'}),
+ children = c.doc().children();
+
+ expect(children.length).to.equal(2);
+ expect(children[0]).to.be.instanceOf(documentElement.DocumentNodeElement);
+ expect(children[0].sameNode(added)).to.be.true;
+ expect(children[1]).to.be.instanceOf(documentElement.DocumentTextElement);
+ expect(children[1].getText()).to.equal('Alice');
+ });
+ });
+
+ describe('Splitting text', function() {
+
+ it('splits DocumentTextElement\'s parent into two DocumentNodeElements of the same type', function() {
+ var c = canvas.fromXML('<section><header>Some header</header></section>'),
+ section = c.doc(),
+ text = section.children()[0].children()[0];
+
+ text.split({offset: 5});
+ expect(section.children().length).to.equal(2, 'section has two children');
+
+ var header1 = section.children()[0];
+ var header2 = section.children()[1];
+
+ expect(header1.wlxmlTag).to.equal('header', 'first section child represents wlxml header');
+ expect(header1.children().length).to.equal(1, 'first header has one text child');
+ expect(header1.children()[0].getText()).to.equal('Some ', 'first header has correct content');
+ expect(header2.wlxmlTag).to.equal('header', 'second section child represents wlxml header');
+ expect(header2.children().length).to.equal(1, 'second header has one text child');
+ expect(header2.children()[0].getText()).to.equal('header', 'second header has correct content');
+ });
+
+ it('keeps DocumentTextElement\'s parent\'s children elements intact', function() {
+ var c = canvas.fromXML('\
+ <section>\
+ <header>\
+ A <span>fancy</span> and <span>nice</span> header\
+ </header>\
+ </section>'),
+ section = c.doc(),
+ header = section.children()[0],
+ textAnd = header.children()[2];
+
+ textAnd.split({offset: 2});
+
+ var sectionChildren = section.children();
+ expect(sectionChildren.length).to.equal(2, 'Section has two children');
+ expect(sectionChildren[0].wlxmlTag).to.equal('header', 'First section element is a wlxml header');
+ expect(sectionChildren[1].wlxmlTag).to.equal('header', 'Second section element is a wlxml header');
+
+ var firstHeaderChildren = sectionChildren[0].children();
+ expect(firstHeaderChildren.length).to.equal(3, 'First header has three children');
+ expect(firstHeaderChildren[0].getText()).to.equal('A ', 'First header starts with a text');
+ expect(firstHeaderChildren[1].wlxmlTag).to.equal('span', 'First header has span in the middle');
+ expect(firstHeaderChildren[2].getText()).to.equal(' a', 'First header ends with text');
+
+ var secondHeaderChildren = sectionChildren[1].children();
+ expect(secondHeaderChildren.length).to.equal(3, 'Second header has three children');
+ expect(secondHeaderChildren[0].getText()).to.equal('nd ', 'Second header starts with text');
+ expect(secondHeaderChildren[1].wlxmlTag).to.equal('span', 'Second header has span in the middle');
+ expect(secondHeaderChildren[2].getText()).to.equal(' header', 'Second header ends with text');
+ });
+ });
+
+ describe('wrapping', function() {
+ it('wraps DocumentNodeElement', function() {
+ var c = canvas.fromXML('<section><div></div></section>'),
+ div = c.doc().children()[0];
+
+ var returned = div.wrapWithNodeElement({tag: 'header', klass: 'some.class'}),
+ parent = div.parent(),
+ parent2 = c.doc().children()[0];
+
+ expect(returned.sameNode(parent)).to.be.true;
+ expect(returned.sameNode(parent2)).to.be.true;
+ });
+ it('wraps DocumentTextElement', function() {
+ var c = canvas.fromXML('<section>Alice</section>'),
+ text = c.doc().children()[0];
+
+ var returned = text.wrapWithNodeElement({tag: 'header', klass: 'some.class'}),
+ parent = text.parent(),
+ parent2 = c.doc().children()[0];
+
+ expect(returned.sameNode(parent)).to.be.true;
+ expect(returned.sameNode(parent2)).to.be.true;
+ });
+
+ it('wraps part of DocumentTextElement', function() {
+ var c = canvas.fromXML('<section>Alice has a cat</section>'),
+ text = c.doc().children()[0];
+
+ var returned = text.wrapWithNodeElement({tag: 'header', klass: 'some.class', start: 5, end: 12}),
+ children = c.doc().children();
+
+ expect(children.length).to.equal(3);
+
+ expect(children[0]).to.be.instanceOf(documentElement.DocumentTextElement);
+ expect(children[0].getText()).to.equal('Alice');
+
+ expect(children[1].sameNode(returned)).to.be.true;
+ expect(children[1].children().length).to.equal(1);
+ expect(children[1].children()[0].getText()).to.equal(' has a ');
+
+ expect(children[2]).to.be.instanceOf(documentElement.DocumentTextElement);
+ expect(children[2].getText()).to.equal('cat');
+ });
+
+ it('wraps text spanning multiple sibling DocumentTextNodes', function() {
+ var c = canvas.fromXML('<section>Alice has a <span>small</span> cat</section>'),
+ section = c.doc(),
+ wrapper = c.wrapText({
+ inside: section,
+ _with: {tag: 'span', klass: 'some.class'},
+ offsetStart: 6,
+ offsetEnd: 4,
+ textNodeIdx: [0,2]