wlxml: fixing bug in a list extension
authorAleksander Łukasz <aleksander.lukasz@nowoczesnapolska.org.pl>
Tue, 11 Feb 2014 10:13:04 +0000 (11:13 +0100)
committerAleksander Łukasz <aleksander.lukasz@nowoczesnapolska.org.pl>
Tue, 11 Feb 2014 10:13:04 +0000 (11:13 +0100)
Pointing a text node as a starting point for a new list caused DOM
manipulation error in the document as it was trying to insert list
node into the wrapping node of said text node.

src/wlxml/extensions/list/list.js
src/wlxml/extensions/list/list.test.js

index 99cacb1..107743a 100644 (file)
@@ -38,12 +38,16 @@ extension.document.transformations.createList = {
             nodeIndexes = [params.node1.getIndex(), params.node2.getIndex()].sort(function(a,b) { return a-b; }),
             nodesToWrap = [],
             listNode = params.node1.document.createDocumentNode({tagName: 'div', attrs: {'class': 'list'}}),
+            listPlacePtr = params.node1,
             node, i;
-
+        
         for(i = nodeIndexes[0]; i <= nodeIndexes[1]; i++) {
             node = parentContents[i];
             if(node.nodeType === Node.TEXT_NODE) {
                 node = node.wrapWith({tagName: 'div', attrs: {'class': 'item'}});
+                if(i === nodeIndexes[0]) {
+                    listPlacePtr = node;
+                }
             } else {
                 node.setClass('item');
             }
@@ -60,7 +64,7 @@ extension.document.transformations.createList = {
             toInsert = listNode;
         }
 
-        params.node1.before(toInsert);
+        listPlacePtr.before(toInsert);
 
         nodesToWrap.forEach(function(node) {
             listNode.append(node);
index 87c47c7..396600b 100644 (file)
@@ -60,6 +60,15 @@ describe('Lists extension', function() {
             expect(child3.contents()[0].getText()).to.equal('cat');
         });
 
+        it('Handles text nodes on the boundries', function() {
+            var doc = getDocumentFromXML('<section>Alice<span>has</span>a cat</section>'),
+                textNode1 = doc.root.contents()[0],
+                textNode2 = doc.root.contents()[2];
+            doc.createList({node1: textNode1, node2: textNode2});
+            expect(doc.root.contents().length).to.equal(1);
+            expect(doc.root.contents()[0].is('list')).to.equal(true);
+        });
+
         it('allows creating nested list from existing sibling list items', function() {
             var doc = getDocumentFromXML('\
                 <section>\