X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/3b0a39df2e007f33b027b665f0f42604aecfc8b9..5625717737822065383ef29c6b5709e9984c3508:/src/smartxml/smartxml.test.js diff --git a/src/smartxml/smartxml.test.js b/src/smartxml/smartxml.test.js index b33ef1f..7880017 100644 --- a/src/smartxml/smartxml.test.js +++ b/src/smartxml/smartxml.test.js @@ -166,6 +166,87 @@ describe('smartxml', function() { textNode.setText('Cat'); expect(textNode.getText()).to.equal('Cat'); }); + + it('emits nodeTextChange', function() { + var node = elementNodeFromXML('
Alice
'), + textNode = node.contents()[0], + spy = sinon.spy(); + + textNode.document.on('change', spy); + textNode.setText('Cat'); + + var event = spy.args[0][0]; + expect(event.type).to.equal('nodeTextChange'); + }); + + it('puts NodeElement after itself', function() { + var node = elementNodeFromXML('
Alice
'), + textNode = node.contents()[0], + returned = textNode.after({tagName:'div'}); + expect(returned.sameNode(node.contents()[1])).to.be.true; + }); + + it('puts NodeElement before itself', function() { + var node = elementNodeFromXML('
Alice
'), + textNode = node.contents()[0], + returned = textNode.before({tagName:'div'}); + expect(returned.sameNode(node.contents()[0])).to.be.true; + }); + + describe('Wrapping TextNode contents', function() { + + it('wraps DocumentTextElement', function() { + var node = elementNodeFromXML('
Alice
'), + textNode = node.contents()[0]; + + var returned = textNode.wrapWith({tagName: 'header'}), + parent = textNode.parent(), + parent2 = node.contents()[0]; + + expect(returned.sameNode(parent)).to.be.equal(true, 'wrapper is a parent'); + expect(returned.sameNode(parent2)).to.be.equal(true, 'wrapper has a correct parent'); + expect(returned.getTagName()).to.equal('header'); + }); + + describe('wrapping part of DocumentTextElement', function() { + [{start: 5, end: 12}, {start: 12, end: 5}].forEach(function(offsets) { + it('wraps in the middle ' + offsets.start + '/' + offsets.end, function() { + var node = elementNodeFromXML('
Alice has a cat
'), + textNode = node.contents()[0]; + + var returned = textNode.wrapWith({tagName: 'header', attrs: {'attr1': 'value1'}, start: offsets.start, end: offsets.end}), + contents = node.contents(); + + expect(contents.length).to.equal(3); + + expect(contents[0].nodeType).to.be.equal(Node.TEXT_NODE, 'first node is text node'); + expect(contents[0].getText()).to.equal('Alice'); + + expect(contents[1].sameNode(returned)).to.be.true; + expect(returned.getTagName()).to.equal('header'); + expect(returned.getAttr('attr1')).to.equal('value1'); + expect(contents[1].contents().length).to.equal(1, 'wrapper has one node inside'); + expect(contents[1].contents()[0].getText()).to.equal(' has a '); + + expect(contents[2].nodeType).to.be.equal(Node.TEXT_NODE, 'third node is text node'); + expect(contents[2].getText()).to.equal('cat'); + }); + }); + + it('wraps whole text inside DocumentTextElement if offsets span entire content', function() { + var node = elementNodeFromXML('
Alice has a cat
'), + textNode = node.contents()[0]; + + textNode.wrapWith({tagName: 'header', start: 0, end: 15}); + + var contents = node.contents(); + expect(contents.length).to.equal(1); + expect(contents[0].getTagName()).to.equal('header'); + expect(contents[0].contents()[0].getText()).to.equal('Alice has a cat'); + }); + }); + }); + }); describe('Manipulations', function() { @@ -185,16 +266,6 @@ describe('smartxml', function() { expect(node.parent().sameNode(wrapper)).to.be.true; }); - it('wraps text node with element node', function() { - var node = elementNodeFromXML('
Alice
'), - textNode = node.contents()[0], - wrapper = elementNodeFromXML(''); - - textNode.wrapWith(wrapper); - expect(textNode.parent().sameNode(wrapper)).to.be.true; - expect(node.contents()).to.have.length(1); - }); - it('unwraps element node contents', function() { var node = elementNodeFromXML('
Alice
has propably a cat
!
'), outerDiv = node.contents()[1]; @@ -207,6 +278,32 @@ describe('smartxml', function() { expect(node.contents()[2].getText()).to.equal(' a cat!'); }); + describe('Wrapping text', function() { + it('wraps text spanning multiple sibling TextNodes', function() { + var section = elementNodeFromXML('
Alice has a small cat
'), + wrapper = section.wrapText({ + _with: {tag: 'span', attrs: {'attr1': 'value1'}}, + offsetStart: 6, + offsetEnd: 4, + textNodeIdx: [0,2] + }); + + expect(section.contents().length).to.equal(2); + expect(section.contents()[0].nodeType).to.equal(Node.TEXT_NODE); + expect(section.contents()[0].getText()).to.equal('Alice '); + + var wrapper2 = section.contents()[1]; + expect(wrapper2.sameNode(wrapper)).to.be.true; + + var wrapperContents = wrapper.contents(); + expect(wrapperContents.length).to.equal(3); + expect(wrapperContents[0].getText()).to.equal('has a '); + + expect(wrapperContents[1].nodeType).to.equal(Node.ELEMENT_NODE); + expect(wrapperContents[1].contents().length).to.equal(1); + expect(wrapperContents[1].contents()[0].getText()).to.equal('small'); + }); + }); }); describe('Serializing document to WLXML', function() {