1 define(function(require) {
6 var wlxml = require('wlxml/wlxml'),
7 extension = {documentTransformations: [], classMethods: {}};
10 extension.classMethods['list'] = {
11 itemIndex: function(listItem) {
13 this.contents('.item').some(function(item, index) {
14 if(item.sameNode(listItem)) {
21 getItem: function(index) {
22 return this.contents('.item')[index];
26 extension.documentMethods = {
27 areItemsOfSameList: function(params) {
28 return params.node1.parent().sameNode(params.node2.parent()) && params.node2.parent().is('list');
32 extension.documentTransformations.push({
34 impl: function(params) {
35 var parent = params.node1.parent(),
36 parentContents = parent.contents(),
37 nodeIndexes = [params.node1.getIndex(), params.node2.getIndex()].sort(),
39 listNode = params.node1.document.createDocumentNode({tagName: 'div', attrs: {'class': 'list'}}),
42 for(i = nodeIndexes[0]; i <= nodeIndexes[1]; i++) {
43 node = parentContents[i];
44 if(node.nodeType === Node.TEXT_NODE) {
45 node = node.wrapWith({tagName: 'div', attrs: {'class': 'item'}}); //t
47 node.setClass('item'); //t
49 nodesToWrap.push(node);
53 if(parent.is('list') && parent.object.itemIndex(nodesToWrap[0]) > 0) { // object api
54 // var prevItem = parent.object.getItem(parent.object.itemIndex(nodesToWrap[0])-1); // object api
55 // prevItem.append(listNode); //t
56 toInsert = listNode.wrapWith({tagName: 'div', attrs: {'class': 'item'}});
58 //nodesToWrap[0].before(listNode); //t
62 params.node1.before(toInsert);
64 nodesToWrap.forEach(function(node) {
65 listNode.append(node); //t
68 getChangeRoot: function() {
69 return this.args.node1.parent();
71 isAllowed: function() {
72 return this.args.node1.parent().sameNode(this.args.node2.parent());
76 extension.documentTransformations.push({
78 impl: function(params) {
79 params = _.extend({}, {merge: true}, params);
80 var list = params.item1.parent(),
81 indexes = [params.item1.getIndex(), params.item2.getIndex()].sort(),
85 items = list.contents(), // lub list.object.items()
86 listIsNested = list.parent().is('item'),
89 items.forEach(function(item, idx) {
90 if(idx < indexes[0]) {
91 precedingItems.push(item);
93 else if(idx >= indexes[0] && idx <= indexes[1]) {
94 extractedItems.push(item);
97 succeedingItems.push(item);
101 var reference = listIsNested ? list.parent() : list;
102 if(succeedingItems.length === 0) {
103 var reference_orig = reference;
104 extractedItems.forEach(function(item) {
105 reference.after(item); //t
108 item.setClass(null); //t
111 if(precedingItems.length === 0)
112 reference_orig.detach(); //t
113 } else if(precedingItems.length === 0) {
114 extractedItems.forEach(function(item) {
115 reference.before(item); //t
117 item.setClass(null); //t
121 extractedItems.forEach(function(item) {
122 reference.after(item); //t
124 item.setClass(null); //t
127 var secondList = params.item1.document.createDocumentNode({tagName: 'div', attrs: {'class':'list'}}),
131 toAdd = secondList.wrapWith({tagName: 'div', attrs: {'class':'item'}});
133 succeedingItems.forEach(function(item) {
134 secondList.append(item);
137 reference.after(toAdd);
139 if(!params.merge && listIsNested) {
140 return this.transform('extractItems', {item1: extractedItems[0], item2: extractedItems[extractedItems.length-1]});
144 isAllowed: function() {
145 var parent = this.args.nodel1.parent();
146 return parent.is('list') && parent.sameNode(this.args.node2.parent());
150 wlxml.registerExtension(extension);